diff --git a/.env.example b/.env.example
index b1bacb0..2fbf9c7 100644
--- a/.env.example
+++ b/.env.example
@@ -4,6 +4,38 @@ DASHSCOPE_API_KEY=replace-me
EMBEDDING_MODEL=text-embedding-v4
EMBEDDING_DIMENSION=1024
LLM_MODEL=qwen-plus
+OCR_MODEL=qwen3.5-ocr
+OCR_MAX_IMAGE_BYTES=6291456
+OCR_MAX_OUTPUT_TOKENS=4096
+VISION_MODEL=qwen3-vl-flash
+VISION_MAX_IMAGE_BYTES=6291456
+VISION_MAX_OUTPUT_TOKENS=1536
+
+# Background ingestion and token-aware chunking
+INGESTION_JOB_MAX_ATTEMPTS=3
+WORKER_POLL_INTERVAL_SECONDS=1
+WORKER_LEASE_SECONDS=900
+WORKER_HEARTBEAT_SECONDS=30
+WORKER_RETRY_DELAY_SECONDS=10
+CHUNK_MAX_TOKENS=512
+CHUNK_OVERLAP_TOKENS=64
+CHUNK_TOKENIZER=cl100k_base
+
+# Local Docling PDF layout/table inference; artifacts path is optional.
+PDF_NATIVE_TEXT_THRESHOLD=20
+# 低文字页还需满足大图覆盖率才判定为扫描页,避免图片/题注页误走纯 OCR。
+PDF_SCAN_IMAGE_COVERAGE_THRESHOLD=0.65
+# 扫描页 OCR 少于该字符数时追加 Vision,以保留图形和箭头关系;设为 0 可关闭。
+PDF_SCAN_VISION_TEXT_THRESHOLD=300
+PDF_RENDER_SCALE=2.0
+PDF_VISION_CONCURRENCY=2
+PDF_MAX_PICTURES=20
+PDF_MIN_PICTURE_PIXELS=10000
+DOCLING_DEVICE=cpu
+DOCLING_NUM_THREADS=4
+DOCLING_TIMEOUT_SECONDS=600
+DOCLING_IMAGES_SCALE=2.0
+# DOCLING_ARTIFACTS_PATH=/models/docling
# Local Docker Compose defaults
DATABASE_URL=postgresql+asyncpg://ultimate_rag:ultimate_rag@localhost:5432/ultimate_rag
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
new file mode 100644
index 0000000..9d31d8d
--- /dev/null
+++ b/.github/workflows/deploy-docs.yml
@@ -0,0 +1,56 @@
+# 构建 VitePress 文档站点并发布到 GitHub Pages。
+#
+# 触发条件:
+# - push 到 V2 分支且涉及 apps/docs/ 下文件变化
+# - 手动 workflow_dispatch(兜底,可在任意分支构建当前内容)
+#
+# 站点地址:https://leonyangdev.github.io/UltimateRAG/
+name: Deploy Docs to GitHub Pages
+
+on:
+ push:
+ branches: [V2]
+ paths: ['apps/docs/**']
+ workflow_dispatch:
+
+# 发布到 Pages 需要 id-token 与 pages 写权限;GitHub Actions 是 Pages 的唯一构建源。
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# 同一时间只保留一次发布,避免多次提交时并发部署互相覆盖。
+concurrency:
+ group: pages
+ cancel-in-progress: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm
+ cache-dependency-path: apps/docs/package-lock.json
+ - name: Install dependencies
+ working-directory: apps/docs
+ run: npm ci
+ - name: Build VitePress site
+ working-directory: apps/docs
+ run: npm run docs:build
+ - uses: actions/configure-pages@v5
+ - uses: actions/upload-pages-artifact@v3
+ with:
+ path: apps/docs/.vitepress/dist
+
+ deploy:
+ needs: build
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index a11e145..85188ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,7 +11,11 @@ htmlcov/
apps/web/.next/
apps/web/node_modules/
apps/docs/node_modules/
+apps/docs/.vitepress/cache/
+apps/docs/.vitepress/dist/
apps/web/out/
*.tsbuildinfo
.idea/
.vscode/
+
+.DS_Store
diff --git a/Dockerfile.api b/Dockerfile.api
index c2216b1..61b2221 100644
--- a/Dockerfile.api
+++ b/Dockerfile.api
@@ -4,12 +4,20 @@ FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
WORKDIR /app
ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy PATH="/app/.venv/bin:$PATH"
+# Docling 的 OpenCV 运行时需要基础图形/线程动态库;它们只用于后台 PDF 推理,不启动 GUI。
+RUN apt-get update \
+ && apt-get install -y --no-install-recommends libgl1 libglib2.0-0 \
+ && rm -rf /var/lib/apt/lists/*
+
COPY pyproject.toml uv.lock README.md ./
+# 依赖层不安装本项目本身,因此普通源码修改可以复用包含 Docling/Torch 的大体积缓存层。
+RUN --mount=type=cache,target=/root/.cache/uv uv sync --frozen --no-dev --no-install-project
+
COPY src ./src
COPY apps/api ./apps/api
COPY alembic ./alembic
COPY alembic.ini ./
-# BuildKit 缓存 uv 下载目录;源码变化仍会重装本项目,但不会反复下载大型二进制依赖。
+# 第二次同步只构建当前项目;锁文件依赖已在上一层安装,源码迭代无需重复编译整个 venv。
RUN --mount=type=cache,target=/root/.cache/uv uv sync --frozen --no-dev
EXPOSE 8000
diff --git a/README.md b/README.md
index dc2d76d..9154045 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,25 @@
# UltimateRAG
-一个从最小可用 RAG 持续演进为企业级知识平台的学习型工程。当前仓库实现 **V1.0 · Naive RAG**:
-它既能作为 RAG 全链路学习项目,也保留了真实企业系统需要的数据边界、失败状态、可替换端口和可测试性。
+一个从最小可用 RAG 持续演进为企业级知识平台的学习型工程。当前仓库实现
+**V2.0 · Document Intelligence**:在保留 V1 可运行 RAG 闭环的基础上,把多种原始格式统一为
+可追溯的文档领域模型,使新增 Parser 不需要修改 RAG 主流程。
-## V1 能做什么
+## V2 能做什么
用户可以在 Web 中完成以下闭环:
1. 创建知识库
-2. 上传 UTF-8 Markdown
-3. 查看文档从 `PENDING` 到 `READY` 的处理结果
-4. 使用 Milvus Dense Retrieval 独立调试召回内容和分数
-5. 使用阿里云百炼模型进行知识库问答
-6. 查看答案引用的文档、章节和 Chunk
-7. 删除文档或知识库,并同步清理三类存储
-
-V1 明确不包含 PDF、OCR、混合检索、Reranker、Agent、ACL、异步任务和 RAGOps;这些属于后续版本。
+2. 上传 Markdown、PDF、DOCX、XLSX、PPTX、HTML 或常见图片
+3. 上传在文件与任务可靠落库后立即返回,由独立 Worker 后台处理
+4. 使用本地 Docling 恢复 PDF 分栏顺序、标题、表格、图片区域和 BBox,扫描页融合百炼 OCR/Vision
+5. 对独立图片融合精确文字与箭头、流程、嵌套关系,并清理 OCR 伪表格噪声
+6. 前端自动刷新文档从 `PENDING` 到 `READY/FAILED` 的状态和实际 Parser
+7. 使用 Milvus Dense Retrieval 独立调试召回内容和分数
+8. 使用阿里云百炼模型进行知识库问答
+9. 查看答案引用的章节、PDF 页码/BBox、Excel 区域或 PPT 幻灯片
+10. 删除文档或知识库,并同步清理三类存储
+
+V2 明确不包含混合检索、Reranker、Agent、ACL、DLQ 控制台和 RAGOps;这些属于后续版本。
## 架构
@@ -24,16 +28,19 @@ Next.js Web
│
▼
FastAPI Interface
- │
- ▼
-Application Services
- ├── Ingestion: Parse → Chunk → Embed → Index
- └── RAG: Query Embed → Retrieve → Context → Generate → Citation
+ ├── Upload → MinIO + PostgreSQL Job → 202
+ └── RAG Application → Retrieve → Context → Generate → Citation
+
+PostgreSQL Job
+ ↓
+Background Worker → Parse → Chunk → Embed → Index
│
▼
Domain Ports
- ├── DocumentParser → MarkdownParser
- ├── Chunker → StructureAwareMarkdownChunker
+ ├── DocumentParser → Markdown / PDF / Office / HTML / Image Intelligence
+ ├── OCRClient → BailianOCRClient(扫描页/图片文字)
+ ├── VisionClient → BailianVisionClient(图表/架构图语义)
+ ├── Chunker → StructureAwareChunker(结构 + Token + 类型)
├── Embedder → BailianEmbedder
├── VectorStore → MilvusVectorStore
├── ObjectStorage → MinioObjectStorage
@@ -47,21 +54,26 @@ Domain Ports
- Domain 不依赖 FastAPI、SQLAlchemy、Milvus、OpenAI SDK 或 LangChain
- PostgreSQL 保存知识库、文档状态和 Chunk 元数据
-- MinIO 保存原始 Markdown,且对象键由系统生成
+- MinIO 保存所有原始文件,且对象键由系统生成
- Milvus 只保存可重建向量索引,不作为业务事实数据源
- 文档仅在 Parse、Chunk、Embedding、Index 全部成功后进入 `READY`
+- Worker 使用 PostgreSQL 租约、心跳和有限重试,进程重启不会丢失上传任务
- 知识库内容按不可信输入处理,不能覆盖系统 Prompt
-详细设计见 [V1 实现说明](docs/3.v1_implementation.md)。
+详细设计见 [V2 实现说明](docs/4.v2_implementation.md),V1 的基础闭环见
+[V1 实现说明](docs/3.v1_implementation.md)。
## 技术栈
- Python 3.12、FastAPI、Pydantic v2
+- Docling Layout/TableFormer、PDFium、tiktoken
- SQLAlchemy 2、Alembic、PostgreSQL 16
- MinIO、Milvus 2.5、Attu
- 阿里云百炼 OpenAI 兼容 API
- Embedding 默认 `text-embedding-v4`,1024 维
- LLM 默认 `qwen-plus`
+ - OCR 默认 `qwen3.5-ocr`
+ - PDF/独立图片理解默认 `qwen3-vl-flash`
- Next.js 16、React 19、TypeScript、Tailwind CSS 4、shadcn/ui、AI SDK
- uv、pytest、Ruff、Mypy
@@ -79,6 +91,12 @@ DASHSCOPE_API_KEY=你的API-Key
EMBEDDING_MODEL=text-embedding-v4
EMBEDDING_DIMENSION=1024
LLM_MODEL=qwen-plus
+OCR_MODEL=qwen3.5-ocr
+OCR_MAX_IMAGE_BYTES=6291456
+OCR_MAX_OUTPUT_TOKENS=4096
+VISION_MODEL=qwen3-vl-flash
+VISION_MAX_IMAGE_BYTES=6291456
+VISION_MAX_OUTPUT_TOKENS=1536
# 可选;留空时浏览器自动访问当前页面主机的 8000 端口
NEXT_PUBLIC_API_URL=
@@ -98,8 +116,31 @@ docker compose up -d --build
```bash
docker compose ps
docker compose logs -f api
+docker compose logs -f worker
+```
+
+第一次处理文字型 PDF 时,Worker 会把 Docling Layout/TableFormer 模型下载到持久化
+`docling_cache` Volume。希望在离线验收前预热模型时可执行:
+
+```bash
+docker compose run --rm worker docling-tools models download layout tableformer
```
+扫描 PDF 不依赖 Docling OCR,而是按页调用 `.env` 中的百炼 OCR;低文字页还必须存在覆盖大部分
+页面的栅格图才判为扫描页,避免图文页错误退化。稀疏 OCR 页会补充 Vision 关系理解。文字型 PDF
+的版面与表格推理在 Worker 本地完成。默认锁文件从 PyTorch 官方 CPU Index 安装 `torch/torchvision`,避免本地 Docker
+镜像误装数 GB CUDA 依赖。GPU 部署应维护独立的 CUDA 镜像/锁定策略,而不是直接修改运行时设备名。
+生产环境应为 Worker 单独配置 CPU/内存与副本数。
+
+仓库 `data/` 中的真实图片与论文 PDF 可执行专项验收(会真实产生少量百炼用量):
+
+```bash
+uv run python scripts/smoke_v2_data.py --api-url http://localhost:8000
+```
+
+脚本断言上传立即返回、后台最终 `READY`、图片关系可召回、PDF Table 2 续块带完整多级表头,
+并校验页码/BBox;默认只删除脚本自己创建的临时知识库。
+
### 3. 打开服务
| 服务 | 地址 | 用途 |
@@ -196,12 +237,16 @@ POST /api/chat/stream
## 文档处理状态
+上传接口返回 `202 Accepted` 和 `PENDING` 文档,不等待解析。Worker 使用以下状态推进:
+
```text
PENDING → PARSING → CHUNKING → EMBEDDING → INDEXING → READY
- └→ FAILED(任一处理阶段失败)
+ ↑
+ └── 临时故障有限重试 任一终态错误 → FAILED
```
-失败文档保留原文件与错误状态,方便定位问题和未来重建。V1 是同步管线,因此上传请求会等待处理完成。
+前端仅在存在非终态文档时每两秒自动刷新。失败文档保留原文件、Chunk 事实与可操作错误;Milvus
+半成品会清理,检索还会按 PostgreSQL `READY` 状态二次过滤。
## 验证
@@ -218,7 +263,8 @@ npm run build
npm audit
```
-固定 Smoke Test 文档位于 `tests/fixtures/rag.md`,推荐问题是“BGE-M3 是什么?”。
+单元测试会在内存中生成各类格式,避免提交二进制 Fixture。固定 Markdown Smoke Test 文档位于
+`tests/fixtures/rag.md`,推荐问题是“BGE-M3 是什么?”。
启动 Docker 全栈后,执行真实 PostgreSQL、MinIO、Milvus 和百炼闭环验收:
@@ -226,8 +272,14 @@ npm audit
uv run python scripts/smoke_v1.py --api-url http://localhost:8000
```
-脚本会创建临时知识库、上传 Fixture、验证文档 `READY`、检索命中、流式答案和 Citation,
-最后删除临时知识库及其跨存储资源。
+V1 脚本保留用于回归。V2 全格式验收使用:
+
+```bash
+uv run python scripts/smoke_v2.py --api-url http://localhost:8000
+```
+
+V2 脚本会动态生成全部支持格式,先验证上传立即返回 `202/PENDING`,再轮询 Worker 到 `READY`,
+最后验证来源位置、检索、流式答案和 Citation,并删除临时知识库及其跨存储资源。
## 目录
@@ -236,7 +288,11 @@ apps/web/ Next.js Web
apps/api/ FastAPI 应用
src/ultimate_rag/domain/ 领域模型与端口
src/ultimate_rag/application/ 显式业务工作流
-src/ultimate_rag/parsers/ Markdown 解析与注册表
+src/ultimate_rag/parsers/ Markdown / PDF / Office / HTML / Image 解析与注册表
+src/ultimate_rag/worker.py PostgreSQL 持久化任务 Worker
+src/ultimate_rag/runtime.py API/Worker 共用依赖装配
+src/ultimate_rag/vision/ 百炼图片语义理解适配器
+src/ultimate_rag/ocr/ 百炼 OCR 适配器
src/ultimate_rag/chunkers/ 结构感知切块
src/ultimate_rag/embeddings/ 百炼向量适配器
src/ultimate_rag/vectorstores/ Milvus 适配器
@@ -250,9 +306,10 @@ docs/ 产品、架构与实现文档
## 安全提醒
-- 上传文件必须是 UTF-8 Markdown,最大 10 MB
+- 上传文件最大 10 MB;Markdown/HTML 必须使用 UTF-8,Office 会检查 ZIP Bomb 风险
+- 图片提交模型前会验证/压缩;PDF 最多 500 页,扫描页按页 OCR,附图数量和并发均有界
- 用户文件名不参与本地路径或对象键构造
- `.env`、API Key 和生产凭据禁止提交
- 默认 Docker 密码只适合本地开发
- 检索内容和 LLM 输出都视为不可信数据
-- 对公网部署前仍需要认证、ACL、限流与审计;这些不属于 V1 范围
+- 对公网部署前仍需要认证、ACL、限流与审计;这些不属于 V2 范围
diff --git a/alembic/versions/0002_v2_async_ingestion.py b/alembic/versions/0002_v2_async_ingestion.py
new file mode 100644
index 0000000..5975278
--- /dev/null
+++ b/alembic/versions/0002_v2_async_ingestion.py
@@ -0,0 +1,79 @@
+"""Add the durable V2 background-ingestion queue.
+
+Revision ID: 0002_v2_async_ingestion
+Revises: 0001_v1_schema
+"""
+
+from collections.abc import Sequence
+
+import sqlalchemy as sa
+
+from alembic import op
+
+revision: str = "0002_v2_async_ingestion"
+down_revision: str | None = "0001_v1_schema"
+branch_labels: str | Sequence[str] | None = None
+depends_on: str | Sequence[str] | None = None
+
+
+def upgrade() -> None:
+ """创建持久化任务表,并恢复旧版本中断后遗留的非终态文档。"""
+
+ op.create_table(
+ "ingestion_jobs",
+ sa.Column("id", sa.String(length=36), nullable=False),
+ sa.Column("document_id", sa.String(length=36), nullable=False),
+ sa.Column("status", sa.String(length=20), nullable=False),
+ sa.Column("attempts", sa.Integer(), nullable=False),
+ sa.Column("max_attempts", sa.Integer(), nullable=False),
+ sa.Column("available_at", sa.DateTime(timezone=True), nullable=False),
+ sa.Column("locked_at", sa.DateTime(timezone=True), nullable=True),
+ sa.Column("worker_id", sa.String(length=200), nullable=True),
+ sa.Column("error_message", sa.Text(), nullable=True),
+ sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
+ sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
+ sa.ForeignKeyConstraint(["document_id"], ["documents.id"], ondelete="CASCADE"),
+ sa.PrimaryKeyConstraint("id"),
+ sa.UniqueConstraint("document_id"),
+ )
+ op.create_index(
+ "ix_ingestion_jobs_claim",
+ "ingestion_jobs",
+ ["status", "available_at"],
+ )
+
+ # V1/V2 旧同步进程若在处理中退出,文档可能永久停在 PARSING 等状态。任务 ID 直接复用
+ # document_id,既无需数据库扩展生成 UUID,也能保证这次迁移可重复理解和追踪。
+ op.execute(
+ sa.text(
+ """
+ INSERT INTO ingestion_jobs (
+ id, document_id, status, attempts, max_attempts,
+ available_at, locked_at, worker_id, error_message, created_at, updated_at
+ )
+ SELECT
+ id, id, 'PENDING', 0, 3,
+ CURRENT_TIMESTAMP, NULL, NULL, NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
+ FROM documents
+ WHERE status IN ('PENDING', 'PARSING', 'CHUNKING', 'EMBEDDING', 'INDEXING')
+ """
+ )
+ )
+ op.execute(
+ sa.text(
+ """
+ UPDATE documents
+ SET status = 'PENDING',
+ error_message = '服务升级后已恢复后台处理任务',
+ updated_at = CURRENT_TIMESTAMP
+ WHERE status IN ('PARSING', 'CHUNKING', 'EMBEDDING', 'INDEXING')
+ """
+ )
+ )
+
+
+def downgrade() -> None:
+ """删除任务表;文档与 Chunk 事实保持不变。"""
+
+ op.drop_index("ix_ingestion_jobs_claim", table_name="ingestion_jobs")
+ op.drop_table("ingestion_jobs")
diff --git a/apps/api/app.py b/apps/api/app.py
index 155de9e..f3a86e9 100644
--- a/apps/api/app.py
+++ b/apps/api/app.py
@@ -9,7 +9,7 @@
业务顺序由 Application Service 编排,外部协议细节由 Infrastructure Adapter 负责。
设计背景:
- V1 使用一个显式 Container 保存进程内共享依赖。相比在每个 Route 中临时创建客户端,
+ V2 使用一个显式 Container 保存进程内共享依赖。相比在每个 Route 中临时创建客户端,
这种方式可以复用连接池并让对象生命周期可见;当前依赖数量有限,因此不引入 DI 框架。
典型使用场景:
@@ -17,7 +17,7 @@
注意事项 / 已知限制:
数据库 Schema 只能通过 Alembic Migration 管理,启动过程不会自动建表。MinIO Bucket
- 或 Milvus Collection 初始化失败时应用不会进入请求服务阶段。V1 关闭时显式释放数据库
+ 或 Milvus Collection 初始化失败时应用不会进入请求服务阶段。V2 关闭时显式释放数据库
Engine;其他 Adapter 当前没有统一的异步关闭端口。
"""
@@ -34,23 +34,18 @@
from ultimate_rag.application import (
ContextBuilder,
DocumentLifecycleService,
- IngestionService,
RAGService,
RetrievalService,
)
-from ultimate_rag.chunkers import StructureAwareMarkdownChunker
from ultimate_rag.config import get_settings
from ultimate_rag.domain.exceptions import (
+ DocumentBusyError,
InvalidDocumentError,
ResourceNotFoundError,
UltimateRAGError,
)
-from ultimate_rag.embeddings import BailianEmbedder
from ultimate_rag.generation import BailianLLMClient
-from ultimate_rag.infrastructure.database import create_database
-from ultimate_rag.infrastructure.storage import MinioObjectStorage
-from ultimate_rag.parsers import MarkdownParser, ParserRegistry
-from ultimate_rag.vectorstores import MilvusVectorStore
+from ultimate_rag.runtime import create_processing_runtime
settings = get_settings()
logging.basicConfig(
@@ -61,7 +56,7 @@
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[None]:
- """在 FastAPI 进程生命周期内创建、校验并暴露 V1 所需依赖。
+ """在 FastAPI 进程生命周期内创建、校验并暴露 V2 所需依赖。
Lifespan 的启动部分严格先于 ``yield`` 执行。只有 MinIO Bucket 和 Milvus Collection
均准备完成后,FastAPI 才开始接收请求;因此 Route 不需要处理“依赖尚未初始化”的状态。
@@ -80,89 +75,50 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
并在正常关闭阶段释放 SQLAlchemy Engine 的连接池。
"""
- # 阶段 1:创建事实数据库和原文件存储适配器。
- # create_database 只构造 Engine、Session Factory 和 Repository,不在启动时隐式建表;
- # PostgreSQL Schema 必须事先通过 Alembic 升级,避免应用启动悄悄修改生产数据库。
- engine, repository = create_database(settings.database_url)
- storage = MinioObjectStorage(
- settings.minio_endpoint,
- settings.minio_access_key,
- settings.minio_secret_key,
- settings.minio_bucket,
- settings.minio_secure,
- )
-
- # 阶段 2:创建会被所有请求复用的模型与向量存储客户端。
- # Embedder 与 Milvus 必须使用同一向量维度,否则 Embedding 即使生成成功也无法写入
- # Collection;两者都读取同一个 Settings 字段,避免分别配置后产生隐蔽的不一致。
- embedder = BailianEmbedder(
- api_key=settings.dashscope_api_key,
- base_url=settings.dashscope_base_url,
- model=settings.embedding_model,
- dimension=settings.embedding_dimension,
- batch_size=settings.embedding_batch_size,
- timeout=settings.model_timeout_seconds,
- )
- vector_store = MilvusVectorStore(
- uri=settings.milvus_uri,
- token=settings.milvus_token,
- collection=settings.milvus_collection,
- dimension=settings.embedding_dimension,
- )
+ # API 与 Worker 从同一 Composition Root 装配 Parser、Chunker 和事实存储,防止上传校验
+ # 支持某格式、后台进程却没有对应 Parser。API 只使用其中轻量的提交服务,不执行解析。
+ runtime = create_processing_runtime(settings)
- # LLM 与 Embedder 共享百炼的 OpenAI-Compatible Endpoint 和 API Key,但模型职责不同:
- # Embedder 只生成检索向量,LLMClient 只根据构造后的知识上下文生成最终答案。
+ # LLM 只属于 HTTP 问答进程;后台 Worker 不需要创建生成模型客户端。
llm = BailianLLMClient(
api_key=settings.dashscope_api_key,
base_url=settings.dashscope_base_url,
model=settings.llm_model,
timeout=settings.model_timeout_seconds,
)
-
- # 阶段 3:装配不直接拥有外部资源的领域策略和应用服务。
- # Registry 隔离源格式与 Parser 选择,Chunker 负责统一 ParsedDocument 之后的切块;
- # RetrievalService 复用同一个 Embedder,保证查询向量与文档向量处于相同向量空间。
- registry = ParserRegistry([MarkdownParser()])
- chunker = StructureAwareMarkdownChunker(settings.chunk_max_chars, settings.chunk_overlap_chars)
- retrieval = RetrievalService(embedder, vector_store)
+ retrieval = RetrievalService(runtime.embedder, runtime.vector_store, runtime.repository)
# 阶段 4:把已经装配好的对象集中放入进程级 Container。
# Route 只从 app.state 取应用服务,不自行读取配置或创建客户端,从而保持 HTTP 层轻量,
# 也确保摄取、检索和删除流程使用的是同一组 Repository、Storage 与 VectorStore 实例。
app.state.container = Container(
- engine=engine,
+ engine=runtime.engine,
max_upload_bytes=settings.max_upload_bytes,
- repository=repository,
- ingestion=IngestionService(
- repository=repository,
- storage=storage,
- parser_registry=registry,
- chunker=chunker,
- embedder=embedder,
- vector_store=vector_store,
- max_upload_bytes=settings.max_upload_bytes,
- ),
+ repository=runtime.repository,
+ ingestion=runtime.ingestion,
retrieval=retrieval,
rag=RAGService(retrieval, ContextBuilder(settings.context_max_chars), llm),
- lifecycle=DocumentLifecycleService(repository, storage, vector_store),
+ lifecycle=DocumentLifecycleService(
+ runtime.repository,
+ runtime.storage,
+ runtime.vector_store,
+ ),
)
# 阶段 5:在开放 HTTP 服务之前完成外部资源的幂等准备。
# Bucket/Collection 不存在时创建,存在时复用;任一步抛出异常都会阻止执行 yield,
# FastAPI 因而不会在依赖不可用或向量 Schema 未准备好时对外宣称启动成功。
- await storage.ensure_bucket()
- await vector_store.ensure_collection()
-
- # 生命周期分界点:yield 之前属于启动阶段,yield 期间由 FastAPI 处理请求,
- # 恢复执行后进入关闭阶段。所有 Route 此时都可以读取上方写入的 Container。
- yield
+ try:
+ await runtime.initialize()
- # 阶段 6:正常关闭时释放 SQLAlchemy Engine 管理的连接池。
- # 当前其他 Adapter 没有统一的 close() 端口,因此这里只清理明确由本模块持有的异步资源。
- await engine.dispose()
+ # 生命周期分界点:yield 之前属于启动阶段,yield 期间由 FastAPI 处理请求。
+ yield
+ finally:
+ # 初始化中途失败也必须释放已经创建的数据库连接池。
+ await runtime.close()
-app = FastAPI(title=settings.app_name, version="1.0.0", lifespan=lifespan)
+app = FastAPI(title=settings.app_name, version="2.0.0", lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
allow_origins=settings.cors_origins,
@@ -188,6 +144,13 @@ async def invalid_document_handler(_request: Request, exc: InvalidDocumentError)
return JSONResponse(status_code=status.HTTP_400_BAD_REQUEST, content={"detail": str(exc)})
+@app.exception_handler(DocumentBusyError)
+async def document_busy_handler(_request: Request, exc: DocumentBusyError) -> JSONResponse:
+ """处理中的文档存在并发写入风险,使用 409 提示客户端稍后重试。"""
+
+ return JSONResponse(status_code=status.HTTP_409_CONFLICT, content={"detail": str(exc)})
+
+
@app.exception_handler(UltimateRAGError)
async def application_error_handler(_request: Request, exc: UltimateRAGError) -> JSONResponse:
"""把已知处理故障转换为 502,且不向客户端暴露 Stack Trace。"""
diff --git a/apps/api/routes.py b/apps/api/routes.py
index 473d081..3a5a257 100644
--- a/apps/api/routes.py
+++ b/apps/api/routes.py
@@ -1,4 +1,4 @@
-"""UltimateRAG V1 HTTP 路由。
+"""UltimateRAG V2 HTTP 路由。
模块职责:
验证 HTTP 输入、调用应用服务,并把领域结果映射为普通 JSON 或 AI SDK UI Message Stream。
@@ -126,20 +126,20 @@ async def delete_knowledge_base(knowledge_base_id: str, request: Request) -> Res
@router.post(
"/knowledge-bases/{knowledge_base_id}/documents",
response_model=DocumentResponse,
- status_code=status.HTTP_201_CREATED,
+ status_code=status.HTTP_202_ACCEPTED,
)
async def upload_document(
knowledge_base_id: str,
request: Request,
file: Annotated[UploadFile, File()],
) -> DocumentResponse:
- """上传并同步完成 Markdown 的解析、切块、向量化和索引。"""
+ """可靠保存文件并提交后台任务;不等待解析、模型调用或索引完成。"""
dependencies = container(request)
content = await _read_bounded_upload(file, dependencies.max_upload_bytes)
- value = await dependencies.ingestion.ingest(
+ value = await dependencies.ingestion.submit(
knowledge_base_id,
- file.filename or "document.md",
- file.content_type or "text/markdown",
+ file.filename or "document.bin",
+ file.content_type or "application/octet-stream",
content,
)
return DocumentResponse.from_domain(value)
diff --git a/apps/api/schemas.py b/apps/api/schemas.py
index 833bd43..2a940aa 100644
--- a/apps/api/schemas.py
+++ b/apps/api/schemas.py
@@ -7,7 +7,39 @@
from pydantic import BaseModel, ConfigDict, Field
-from ultimate_rag.domain.models import Citation, Document, KnowledgeBase, RetrievalResult
+from ultimate_rag.domain.models import (
+ Citation,
+ Document,
+ KnowledgeBase,
+ RetrievalResult,
+ SourceLocator,
+)
+
+
+class SourceLocatorResponse(BaseModel):
+ """跨格式原文位置;不同文档类型只填写适用字段。"""
+
+ heading_path: list[str] = Field(default_factory=list)
+ page: int | None = None
+ bbox: list[float] | None = None
+ sheet: str | None = None
+ cell_range: str | None = None
+ slide: int | None = None
+
+ @classmethod
+ def from_domain(cls, value: SourceLocator | None) -> "SourceLocatorResponse | None":
+ """把不可变 Locator 映射为 JSON 友好的 API 结构。"""
+
+ if value is None:
+ return None
+ return cls(
+ heading_path=list(value.heading_path),
+ page=value.page,
+ bbox=list(value.bbox) if value.bbox else None,
+ sheet=value.sheet,
+ cell_range=value.cell_range,
+ slide=value.slide,
+ )
class KnowledgeBaseCreate(BaseModel):
@@ -93,6 +125,7 @@ class RetrievalResultResponse(BaseModel):
filename: str
content: str
heading_path: list[str]
+ locator: SourceLocatorResponse | None
score: float
@classmethod
@@ -104,6 +137,7 @@ def from_domain(cls, value: RetrievalResult) -> "RetrievalResultResponse":
filename=value.filename,
content=value.content,
heading_path=list(value.heading_path),
+ locator=SourceLocatorResponse.from_domain(value.locator),
score=value.score,
)
@@ -122,6 +156,7 @@ class CitationResponse(BaseModel):
filename: str
chunk_id: str
heading_path: list[str]
+ locator: SourceLocatorResponse | None
@classmethod
def from_domain(cls, value: Citation) -> "CitationResponse":
@@ -131,11 +166,12 @@ def from_domain(cls, value: Citation) -> "CitationResponse":
filename=value.filename,
chunk_id=value.chunk_id,
heading_path=list(value.heading_path),
+ locator=SourceLocatorResponse.from_domain(value.locator),
)
class ChatResponse(BaseModel):
- """答案、引用和基础检索调试信息的完整 V1 响应。"""
+ """答案、跨格式引用和基础检索调试信息的完整 V2 响应。"""
answer: str
citations: list[CitationResponse]
diff --git a/apps/docs/.vitepress/cache/deps/_metadata.json b/apps/docs/.vitepress/cache/deps/_metadata.json
deleted file mode 100644
index 8dee3d3..0000000
--- a/apps/docs/.vitepress/cache/deps/_metadata.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "hash": "fb3e2aa3",
- "configHash": "340a6d2f",
- "lockfileHash": "01973ade",
- "browserHash": "65c5aabd",
- "optimized": {
- "vitepress > @vue/devtools-api": {
- "src": "../../../node_modules/@vue/devtools-api/dist/index.js",
- "file": "vitepress_n_@vue_devtools-api.js",
- "fileHash": "a90a3145",
- "needsInterop": false
- },
- "vitepress > @vueuse/core": {
- "src": "../../../node_modules/@vueuse/core/dist/index.js",
- "file": "vitepress_n_@vueuse_core.js",
- "fileHash": "c26e9a6b",
- "needsInterop": false
- },
- "vue": {
- "src": "../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
- "file": "vue.js",
- "fileHash": "4b4d761e",
- "needsInterop": false
- }
- },
- "chunks": {
- "vue.runtime.esm-bundler-D4M2X7UN": {
- "file": "vue.runtime.esm-bundler-D4M2X7UN.js",
- "isDynamicEntry": false
- }
- }
-}
\ No newline at end of file
diff --git a/apps/docs/.vitepress/cache/deps/package.json b/apps/docs/.vitepress/cache/deps/package.json
deleted file mode 100644
index 3dbc1ca..0000000
--- a/apps/docs/.vitepress/cache/deps/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "type": "module"
-}
diff --git a/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js b/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js
deleted file mode 100644
index 0ea6f92..0000000
--- a/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js
+++ /dev/null
@@ -1,3808 +0,0 @@
-//#region node_modules/@vue/devtools-shared/dist/index.js
-var __create$1 = Object.create;
-var __defProp$1 = Object.defineProperty;
-var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
-var __getOwnPropNames$1 = Object.getOwnPropertyNames;
-var __getProtoOf$1 = Object.getPrototypeOf;
-var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
-var __commonJSMin$1 = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __copyProps$1 = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames$1(from), i = 0, n = keys.length, key; i < n; i++) {
- key = keys[i];
- if (!__hasOwnProp$1.call(to, key) && key !== except) __defProp$1(to, key, {
- get: ((k) => from[k]).bind(null, key),
- enumerable: !(desc = __getOwnPropDesc$1(from, key)) || desc.enumerable
- });
- }
- return to;
-};
-var __toESM$1 = (mod, isNodeMode, target) => (target = mod != null ? __create$1(__getProtoOf$1(mod)) : {}, __copyProps$1(isNodeMode || !mod || !mod.__esModule ? __defProp$1(target, "default", {
- value: mod,
- enumerable: true
-}) : target, mod));
-var isBrowser = typeof navigator !== "undefined";
-var target = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : typeof global !== "undefined" ? global : {};
-typeof target.chrome !== "undefined" && target.chrome.devtools;
-isBrowser && (target.self, target.top);
-typeof navigator !== "undefined" && navigator.userAgent?.toLowerCase().includes("electron");
-typeof window !== "undefined" && window.__NUXT__;
-var import_rfdc = /* @__PURE__ */ __toESM$1((/* @__PURE__ */ __commonJSMin$1(((exports, module) => {
- module.exports = rfdc;
- function copyBuffer(cur) {
- if (cur instanceof Buffer) return Buffer.from(cur);
- return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length);
- }
- function rfdc(opts) {
- opts = opts || {};
- if (opts.circles) return rfdcCircles(opts);
- const constructorHandlers = /* @__PURE__ */ new Map();
- constructorHandlers.set(Date, (o) => new Date(o));
- constructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn)));
- constructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn)));
- if (opts.constructorHandlers) for (const handler of opts.constructorHandlers) constructorHandlers.set(handler[0], handler[1]);
- let handler = null;
- return opts.proto ? cloneProto : clone;
- function cloneArray(a, fn) {
- const keys = Object.keys(a);
- const a2 = new Array(keys.length);
- for (let i = 0; i < keys.length; i++) {
- const k = keys[i];
- const cur = a[k];
- if (typeof cur !== "object" || cur === null) a2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) a2[k] = handler(cur, fn);
- else if (ArrayBuffer.isView(cur)) a2[k] = copyBuffer(cur);
- else a2[k] = fn(cur);
- }
- return a2;
- }
- function clone(o) {
- if (typeof o !== "object" || o === null) return o;
- if (Array.isArray(o)) return cloneArray(o, clone);
- if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, clone);
- const o2 = {};
- for (const k in o) {
- if (Object.hasOwnProperty.call(o, k) === false) continue;
- const cur = o[k];
- if (typeof cur !== "object" || cur === null) o2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, clone);
- else if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);
- else o2[k] = clone(cur);
- }
- return o2;
- }
- function cloneProto(o) {
- if (typeof o !== "object" || o === null) return o;
- if (Array.isArray(o)) return cloneArray(o, cloneProto);
- if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, cloneProto);
- const o2 = {};
- for (const k in o) {
- const cur = o[k];
- if (typeof cur !== "object" || cur === null) o2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, cloneProto);
- else if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);
- else o2[k] = cloneProto(cur);
- }
- return o2;
- }
- }
- function rfdcCircles(opts) {
- const refs = [];
- const refsNew = [];
- const constructorHandlers = /* @__PURE__ */ new Map();
- constructorHandlers.set(Date, (o) => new Date(o));
- constructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn)));
- constructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn)));
- if (opts.constructorHandlers) for (const handler of opts.constructorHandlers) constructorHandlers.set(handler[0], handler[1]);
- let handler = null;
- return opts.proto ? cloneProto : clone;
- function cloneArray(a, fn) {
- const keys = Object.keys(a);
- const a2 = new Array(keys.length);
- for (let i = 0; i < keys.length; i++) {
- const k = keys[i];
- const cur = a[k];
- if (typeof cur !== "object" || cur === null) a2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) a2[k] = handler(cur, fn);
- else if (ArrayBuffer.isView(cur)) a2[k] = copyBuffer(cur);
- else {
- const index = refs.indexOf(cur);
- if (index !== -1) a2[k] = refsNew[index];
- else a2[k] = fn(cur);
- }
- }
- return a2;
- }
- function clone(o) {
- if (typeof o !== "object" || o === null) return o;
- if (Array.isArray(o)) return cloneArray(o, clone);
- if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, clone);
- const o2 = {};
- refs.push(o);
- refsNew.push(o2);
- for (const k in o) {
- if (Object.hasOwnProperty.call(o, k) === false) continue;
- const cur = o[k];
- if (typeof cur !== "object" || cur === null) o2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, clone);
- else if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);
- else {
- const i = refs.indexOf(cur);
- if (i !== -1) o2[k] = refsNew[i];
- else o2[k] = clone(cur);
- }
- }
- refs.pop();
- refsNew.pop();
- return o2;
- }
- function cloneProto(o) {
- if (typeof o !== "object" || o === null) return o;
- if (Array.isArray(o)) return cloneArray(o, cloneProto);
- if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, cloneProto);
- const o2 = {};
- refs.push(o);
- refsNew.push(o2);
- for (const k in o) {
- const cur = o[k];
- if (typeof cur !== "object" || cur === null) o2[k] = cur;
- else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, cloneProto);
- else if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);
- else {
- const i = refs.indexOf(cur);
- if (i !== -1) o2[k] = refsNew[i];
- else o2[k] = cloneProto(cur);
- }
- }
- refs.pop();
- refsNew.pop();
- return o2;
- }
- }
-})))(), 1);
-var classifyRE = /(?:^|[-_/])(\w)/g;
-function toUpper(_, c) {
- return c ? c.toUpperCase() : "";
-}
-function classify(str) {
- return str && `${str}`.replace(classifyRE, toUpper);
-}
-function basename(filename, ext) {
- let normalizedFilename = filename.replace(/^[a-z]:/i, "").replace(/\\/g, "/");
- if (normalizedFilename.endsWith(`index${ext}`)) normalizedFilename = normalizedFilename.replace(`/index${ext}`, ext);
- const lastSlashIndex = normalizedFilename.lastIndexOf("/");
- const baseNameWithExt = normalizedFilename.substring(lastSlashIndex + 1);
- if (ext) {
- const extIndex = baseNameWithExt.lastIndexOf(ext);
- return baseNameWithExt.substring(0, extIndex);
- }
- return "";
-}
-var HTTP_URL_RE = /^https?:\/\//;
-/**
-* Check a string is start with `/` or a valid http url
-*/
-function isUrlString(str) {
- return str.startsWith("/") || HTTP_URL_RE.test(str);
-}
-/**
-* @copyright [rfdc](https://github.com/davidmarkclements/rfdc)
-* @description A really fast deep clone alternative
-*/
-var deepClone = (0, import_rfdc.default)({ circles: true });
-//#endregion
-//#region node_modules/perfect-debounce/dist/index.mjs
-var DEBOUNCE_DEFAULTS = { trailing: true };
-/**
-Debounce functions
-@param fn - Promise-returning/async function to debounce.
-@param wait - Milliseconds to wait before calling `fn`. Default value is 25ms
-@returns A function that delays calling `fn` until after `wait` milliseconds have elapsed since the last time it was called.
-@example
-```
-import { debounce } from 'perfect-debounce';
-const expensiveCall = async input => input;
-const debouncedFn = debounce(expensiveCall, 200);
-for (const number of [1, 2, 3]) {
-console.log(await debouncedFn(number));
-}
-//=> 1
-//=> 2
-//=> 3
-```
-*/
-function debounce(fn, wait = 25, options = {}) {
- options = {
- ...DEBOUNCE_DEFAULTS,
- ...options
- };
- if (!Number.isFinite(wait)) throw new TypeError("Expected `wait` to be a finite number");
- let leadingValue;
- let timeout;
- let resolveList = [];
- let currentPromise;
- let trailingArgs;
- const applyFn = (_this, args) => {
- currentPromise = _applyPromised(fn, _this, args);
- currentPromise.finally(() => {
- currentPromise = null;
- if (options.trailing && trailingArgs && !timeout) {
- const promise = applyFn(_this, trailingArgs);
- trailingArgs = null;
- return promise;
- }
- });
- return currentPromise;
- };
- const debounced = function(...args) {
- if (options.trailing) trailingArgs = args;
- if (currentPromise) return currentPromise;
- return new Promise((resolve) => {
- const shouldCallNow = !timeout && options.leading;
- clearTimeout(timeout);
- timeout = setTimeout(() => {
- timeout = null;
- const promise = options.leading ? leadingValue : applyFn(this, args);
- trailingArgs = null;
- for (const _resolve of resolveList) _resolve(promise);
- resolveList = [];
- }, wait);
- if (shouldCallNow) {
- leadingValue = applyFn(this, args);
- resolve(leadingValue);
- } else resolveList.push(resolve);
- });
- };
- const _clearTimeout = (timer) => {
- if (timer) {
- clearTimeout(timer);
- timeout = null;
- }
- };
- debounced.isPending = () => !!timeout;
- debounced.cancel = () => {
- _clearTimeout(timeout);
- resolveList = [];
- trailingArgs = null;
- };
- debounced.flush = () => {
- _clearTimeout(timeout);
- if (!trailingArgs || currentPromise) return;
- const args = trailingArgs;
- trailingArgs = null;
- return applyFn(this, args);
- };
- return debounced;
-}
-async function _applyPromised(fn, _this, args) {
- return await fn.apply(_this, args);
-}
-//#endregion
-//#region node_modules/hookable/dist/index.mjs
-function flatHooks(configHooks, hooks = {}, parentName) {
- for (const key in configHooks) {
- const subHook = configHooks[key];
- const name = parentName ? `${parentName}:${key}` : key;
- if (typeof subHook === "object" && subHook !== null) flatHooks(subHook, hooks, name);
- else if (typeof subHook === "function") hooks[name] = subHook;
- }
- return hooks;
-}
-var defaultTask = { run: (function_) => function_() };
-var _createTask = () => defaultTask;
-var createTask = typeof console.createTask !== "undefined" ? console.createTask : _createTask;
-function serialTaskCaller(hooks, args) {
- const task = createTask(args.shift());
- return hooks.reduce((promise, hookFunction) => promise.then(() => task.run(() => hookFunction(...args))), Promise.resolve());
-}
-function parallelTaskCaller(hooks, args) {
- const task = createTask(args.shift());
- return Promise.all(hooks.map((hook) => task.run(() => hook(...args))));
-}
-function callEachWith(callbacks, arg0) {
- for (const callback of [...callbacks]) callback(arg0);
-}
-var Hookable = class {
- constructor() {
- this._hooks = {};
- this._before = void 0;
- this._after = void 0;
- this._deprecatedMessages = void 0;
- this._deprecatedHooks = {};
- this.hook = this.hook.bind(this);
- this.callHook = this.callHook.bind(this);
- this.callHookWith = this.callHookWith.bind(this);
- }
- hook(name, function_, options = {}) {
- if (!name || typeof function_ !== "function") return () => {};
- const originalName = name;
- let dep;
- while (this._deprecatedHooks[name]) {
- dep = this._deprecatedHooks[name];
- name = dep.to;
- }
- if (dep && !options.allowDeprecated) {
- let message = dep.message;
- if (!message) message = `${originalName} hook has been deprecated` + (dep.to ? `, please use ${dep.to}` : "");
- if (!this._deprecatedMessages) this._deprecatedMessages = /* @__PURE__ */ new Set();
- if (!this._deprecatedMessages.has(message)) {
- console.warn(message);
- this._deprecatedMessages.add(message);
- }
- }
- if (!function_.name) try {
- Object.defineProperty(function_, "name", {
- get: () => "_" + name.replace(/\W+/g, "_") + "_hook_cb",
- configurable: true
- });
- } catch {}
- this._hooks[name] = this._hooks[name] || [];
- this._hooks[name].push(function_);
- return () => {
- if (function_) {
- this.removeHook(name, function_);
- function_ = void 0;
- }
- };
- }
- hookOnce(name, function_) {
- let _unreg;
- let _function = (...arguments_) => {
- if (typeof _unreg === "function") _unreg();
- _unreg = void 0;
- _function = void 0;
- return function_(...arguments_);
- };
- _unreg = this.hook(name, _function);
- return _unreg;
- }
- removeHook(name, function_) {
- if (this._hooks[name]) {
- const index = this._hooks[name].indexOf(function_);
- if (index !== -1) this._hooks[name].splice(index, 1);
- if (this._hooks[name].length === 0) delete this._hooks[name];
- }
- }
- deprecateHook(name, deprecated) {
- this._deprecatedHooks[name] = typeof deprecated === "string" ? { to: deprecated } : deprecated;
- const _hooks = this._hooks[name] || [];
- delete this._hooks[name];
- for (const hook of _hooks) this.hook(name, hook);
- }
- deprecateHooks(deprecatedHooks) {
- Object.assign(this._deprecatedHooks, deprecatedHooks);
- for (const name in deprecatedHooks) this.deprecateHook(name, deprecatedHooks[name]);
- }
- addHooks(configHooks) {
- const hooks = flatHooks(configHooks);
- const removeFns = Object.keys(hooks).map((key) => this.hook(key, hooks[key]));
- return () => {
- for (const unreg of removeFns.splice(0, removeFns.length)) unreg();
- };
- }
- removeHooks(configHooks) {
- const hooks = flatHooks(configHooks);
- for (const key in hooks) this.removeHook(key, hooks[key]);
- }
- removeAllHooks() {
- for (const key in this._hooks) delete this._hooks[key];
- }
- callHook(name, ...arguments_) {
- arguments_.unshift(name);
- return this.callHookWith(serialTaskCaller, name, ...arguments_);
- }
- callHookParallel(name, ...arguments_) {
- arguments_.unshift(name);
- return this.callHookWith(parallelTaskCaller, name, ...arguments_);
- }
- callHookWith(caller, name, ...arguments_) {
- const event = this._before || this._after ? {
- name,
- args: arguments_,
- context: {}
- } : void 0;
- if (this._before) callEachWith(this._before, event);
- const result = caller(name in this._hooks ? [...this._hooks[name]] : [], arguments_);
- if (result instanceof Promise) return result.finally(() => {
- if (this._after && event) callEachWith(this._after, event);
- });
- if (this._after && event) callEachWith(this._after, event);
- return result;
- }
- beforeEach(function_) {
- this._before = this._before || [];
- this._before.push(function_);
- return () => {
- if (this._before !== void 0) {
- const index = this._before.indexOf(function_);
- if (index !== -1) this._before.splice(index, 1);
- }
- };
- }
- afterEach(function_) {
- this._after = this._after || [];
- this._after.push(function_);
- return () => {
- if (this._after !== void 0) {
- const index = this._after.indexOf(function_);
- if (index !== -1) this._after.splice(index, 1);
- }
- };
- }
-};
-function createHooks() {
- return new Hookable();
-}
-//#endregion
-//#region node_modules/birpc/dist/index.mjs
-var { clearTimeout: clearTimeout$1, setTimeout: setTimeout$1 } = globalThis;
-Math.random.bind(Math);
-var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-function getComponentTypeName(options) {
- if (typeof options === "function") return options.displayName || options.name || options.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ || "";
- const name = options.name || options._componentTag || options.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ || options.__name;
- if (name === "index" && options.__file?.endsWith("index.vue")) return "";
- return name;
-}
-function getComponentFileName(options) {
- const file = options.__file;
- if (file) return classify(basename(file, ".vue"));
-}
-function saveComponentGussedName(instance, name) {
- instance.type.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ = name;
- return name;
-}
-function getAppRecord(instance) {
- if (instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__) return instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
- else if (instance.root) return instance.appContext.app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
-}
-function isFragment(instance) {
- const subTreeType = instance.subTree?.type;
- const appRecord = getAppRecord(instance);
- if (appRecord) return appRecord?.types?.Fragment === subTreeType;
- return false;
-}
-/**
-* Get the appropriate display name for an instance.
-*
-* @param {Vue} instance
-* @return {string}
-*/
-function getInstanceName(instance) {
- const name = getComponentTypeName(instance?.type || {});
- if (name) return name;
- if (instance?.root === instance) return "Root";
- for (const key in instance.parent?.type?.components) if (instance.parent.type.components[key] === instance?.type) return saveComponentGussedName(instance, key);
- for (const key in instance.appContext?.components) if (instance.appContext.components[key] === instance?.type) return saveComponentGussedName(instance, key);
- const fileName = getComponentFileName(instance?.type || {});
- if (fileName) return fileName;
- return "Anonymous Component";
-}
-/**
-* Returns a devtools unique id for instance.
-* @param {Vue} instance
-*/
-function getUniqueComponentId(instance) {
- return `${instance?.appContext?.app?.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ ?? 0}:${instance === instance?.root ? "root" : instance.uid}`;
-}
-function getComponentInstance(appRecord, instanceId) {
- instanceId = instanceId || `${appRecord.id}:root`;
- return appRecord.instanceMap.get(instanceId) || appRecord.instanceMap.get(":root");
-}
-function createRect() {
- const rect = {
- top: 0,
- bottom: 0,
- left: 0,
- right: 0,
- get width() {
- return rect.right - rect.left;
- },
- get height() {
- return rect.bottom - rect.top;
- }
- };
- return rect;
-}
-var range;
-function getTextRect(node) {
- if (!range) range = document.createRange();
- range.selectNode(node);
- return range.getBoundingClientRect();
-}
-function getFragmentRect(vnode) {
- const rect = createRect();
- if (!vnode.children) return rect;
- for (let i = 0, l = vnode.children.length; i < l; i++) {
- const childVnode = vnode.children[i];
- let childRect;
- if (childVnode.component) childRect = getComponentBoundingRect(childVnode.component);
- else if (childVnode.el) {
- const el = childVnode.el;
- if (el.nodeType === 1 || el.getBoundingClientRect) childRect = el.getBoundingClientRect();
- else if (el.nodeType === 3 && el.data.trim()) childRect = getTextRect(el);
- }
- if (childRect) mergeRects(rect, childRect);
- }
- return rect;
-}
-function mergeRects(a, b) {
- if (!a.top || b.top < a.top) a.top = b.top;
- if (!a.bottom || b.bottom > a.bottom) a.bottom = b.bottom;
- if (!a.left || b.left < a.left) a.left = b.left;
- if (!a.right || b.right > a.right) a.right = b.right;
- return a;
-}
-var DEFAULT_RECT = {
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- width: 0,
- height: 0
-};
-function getComponentBoundingRect(instance) {
- const el = instance.subTree.el;
- if (typeof window === "undefined") return DEFAULT_RECT;
- if (isFragment(instance)) return getFragmentRect(instance.subTree);
- else if (el?.nodeType === 1) return el?.getBoundingClientRect();
- else if (instance.subTree.component) return getComponentBoundingRect(instance.subTree.component);
- else return DEFAULT_RECT;
-}
-function getRootElementsFromComponentInstance(instance) {
- if (isFragment(instance)) return getFragmentRootElements(instance.subTree);
- if (!instance.subTree) return [];
- return [instance.subTree.el];
-}
-function getFragmentRootElements(vnode) {
- if (!vnode.children) return [];
- const list = [];
- vnode.children.forEach((childVnode) => {
- if (childVnode.component) list.push(...getRootElementsFromComponentInstance(childVnode.component));
- else if (childVnode?.el) list.push(childVnode.el);
- });
- return list;
-}
-var CONTAINER_ELEMENT_ID = "__vue-devtools-component-inspector__";
-var CARD_ELEMENT_ID = "__vue-devtools-component-inspector__card__";
-var COMPONENT_NAME_ELEMENT_ID = "__vue-devtools-component-inspector__name__";
-var INDICATOR_ELEMENT_ID = "__vue-devtools-component-inspector__indicator__";
-var containerStyles = {
- display: "block",
- zIndex: 2147483640,
- position: "fixed",
- backgroundColor: "#42b88325",
- border: "1px solid #42b88350",
- borderRadius: "5px",
- transition: "all 0.1s ease-in",
- pointerEvents: "none"
-};
-var cardStyles = {
- fontFamily: "Arial, Helvetica, sans-serif",
- padding: "5px 8px",
- borderRadius: "4px",
- textAlign: "left",
- position: "absolute",
- left: 0,
- color: "#e9e9e9",
- fontSize: "14px",
- fontWeight: 600,
- lineHeight: "24px",
- backgroundColor: "#42b883",
- boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)"
-};
-var indicatorStyles = {
- display: "inline-block",
- fontWeight: 400,
- fontStyle: "normal",
- fontSize: "12px",
- opacity: .7
-};
-function getContainerElement() {
- return document.getElementById(CONTAINER_ELEMENT_ID);
-}
-function getCardElement() {
- return document.getElementById(CARD_ELEMENT_ID);
-}
-function getIndicatorElement() {
- return document.getElementById(INDICATOR_ELEMENT_ID);
-}
-function getNameElement() {
- return document.getElementById(COMPONENT_NAME_ELEMENT_ID);
-}
-function getStyles(bounds) {
- return {
- left: `${Math.round(bounds.left * 100) / 100}px`,
- top: `${Math.round(bounds.top * 100) / 100}px`,
- width: `${Math.round(bounds.width * 100) / 100}px`,
- height: `${Math.round(bounds.height * 100) / 100}px`
- };
-}
-function create(options) {
- const containerEl = document.createElement("div");
- containerEl.id = options.elementId ?? CONTAINER_ELEMENT_ID;
- Object.assign(containerEl.style, {
- ...containerStyles,
- ...getStyles(options.bounds),
- ...options.style
- });
- const cardEl = document.createElement("span");
- cardEl.id = CARD_ELEMENT_ID;
- Object.assign(cardEl.style, {
- ...cardStyles,
- top: options.bounds.top < 35 ? 0 : "-35px"
- });
- const nameEl = document.createElement("span");
- nameEl.id = COMPONENT_NAME_ELEMENT_ID;
- nameEl.innerHTML = `<${options.name}> `;
- const indicatorEl = document.createElement("i");
- indicatorEl.id = INDICATOR_ELEMENT_ID;
- indicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;
- Object.assign(indicatorEl.style, indicatorStyles);
- cardEl.appendChild(nameEl);
- cardEl.appendChild(indicatorEl);
- containerEl.appendChild(cardEl);
- document.body.appendChild(containerEl);
- return containerEl;
-}
-function update(options) {
- const containerEl = getContainerElement();
- const cardEl = getCardElement();
- const nameEl = getNameElement();
- const indicatorEl = getIndicatorElement();
- if (containerEl) {
- Object.assign(containerEl.style, {
- ...containerStyles,
- ...getStyles(options.bounds)
- });
- Object.assign(cardEl.style, { top: options.bounds.top < 35 ? 0 : "-35px" });
- nameEl.innerHTML = `<${options.name}> `;
- indicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;
- }
-}
-function highlight(instance) {
- const bounds = getComponentBoundingRect(instance);
- if (!bounds.width && !bounds.height) return;
- const name = getInstanceName(instance);
- getContainerElement() ? update({
- bounds,
- name
- }) : create({
- bounds,
- name
- });
-}
-function unhighlight() {
- const el = getContainerElement();
- if (el) el.style.display = "none";
-}
-var inspectInstance = null;
-function inspectFn(e) {
- const target = e.target;
- if (target) {
- const instance = target.__vueParentComponent;
- if (instance) {
- inspectInstance = instance;
- if (instance.vnode.el) {
- const bounds = getComponentBoundingRect(instance);
- const name = getInstanceName(instance);
- getContainerElement() ? update({
- bounds,
- name
- }) : create({
- bounds,
- name
- });
- }
- }
- }
-}
-function selectComponentFn(e, cb) {
- e.preventDefault();
- e.stopPropagation();
- if (inspectInstance) cb(getUniqueComponentId(inspectInstance));
-}
-var inspectComponentHighLighterSelectFn = null;
-function cancelInspectComponentHighLighter() {
- unhighlight();
- window.removeEventListener("mouseover", inspectFn);
- window.removeEventListener("click", inspectComponentHighLighterSelectFn, true);
- inspectComponentHighLighterSelectFn = null;
-}
-function inspectComponentHighLighter() {
- window.addEventListener("mouseover", inspectFn);
- return new Promise((resolve) => {
- function onSelect(e) {
- e.preventDefault();
- e.stopPropagation();
- selectComponentFn(e, (id) => {
- window.removeEventListener("click", onSelect, true);
- inspectComponentHighLighterSelectFn = null;
- window.removeEventListener("mouseover", inspectFn);
- const el = getContainerElement();
- if (el) el.style.display = "none";
- resolve(JSON.stringify({ id }));
- });
- }
- inspectComponentHighLighterSelectFn = onSelect;
- window.addEventListener("click", onSelect, true);
- });
-}
-function scrollToComponent(options) {
- const instance = getComponentInstance(activeAppRecord.value, options.id);
- if (instance) {
- const [el] = getRootElementsFromComponentInstance(instance);
- if (typeof el.scrollIntoView === "function") el.scrollIntoView({ behavior: "smooth" });
- else {
- const bounds = getComponentBoundingRect(instance);
- const scrollTarget = document.createElement("div");
- const styles = {
- ...getStyles(bounds),
- position: "absolute"
- };
- Object.assign(scrollTarget.style, styles);
- document.body.appendChild(scrollTarget);
- scrollTarget.scrollIntoView({ behavior: "smooth" });
- setTimeout(() => {
- document.body.removeChild(scrollTarget);
- }, 2e3);
- }
- setTimeout(() => {
- const bounds = getComponentBoundingRect(instance);
- if (bounds.width || bounds.height) {
- const name = getInstanceName(instance);
- const el = getContainerElement();
- el ? update({
- ...options,
- name,
- bounds
- }) : create({
- ...options,
- name,
- bounds
- });
- setTimeout(() => {
- if (el) el.style.display = "none";
- }, 1500);
- }
- }, 1200);
- }
-}
-target.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__ ??= true;
-function waitForInspectorInit(cb) {
- let total = 0;
- const timer = setInterval(() => {
- if (target.__VUE_INSPECTOR__) {
- clearInterval(timer);
- total += 30;
- cb();
- }
- if (total >= 5e3) clearInterval(timer);
- }, 30);
-}
-function setupInspector() {
- const inspector = target.__VUE_INSPECTOR__;
- const _openInEditor = inspector.openInEditor;
- inspector.openInEditor = async (...params) => {
- inspector.disable();
- _openInEditor(...params);
- };
-}
-function getComponentInspector() {
- return new Promise((resolve) => {
- function setup() {
- setupInspector();
- resolve(target.__VUE_INSPECTOR__);
- }
- if (!target.__VUE_INSPECTOR__) waitForInspectorInit(() => {
- setup();
- });
- else setup();
- });
-}
-/**
-* To prevent include a **HUGE** vue package in the final bundle of chrome ext / electron
-* we stub the necessary vue module.
-* This implementation is based on the 1c3327a0fa5983aa9078e3f7bb2330f572435425 commit
-*/
-/**
-* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/constants.ts#L17-L23)
-*/
-var ReactiveFlags = /* @__PURE__ */ function(ReactiveFlags) {
- ReactiveFlags["SKIP"] = "__v_skip";
- ReactiveFlags["IS_REACTIVE"] = "__v_isReactive";
- ReactiveFlags["IS_READONLY"] = "__v_isReadonly";
- ReactiveFlags["IS_SHALLOW"] = "__v_isShallow";
- ReactiveFlags["RAW"] = "__v_raw";
- return ReactiveFlags;
-}({});
-/**
-* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L330-L332)
-*/
-function isReadonly(value) {
- return !!(value && value[ReactiveFlags.IS_READONLY]);
-}
-/**
-* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L312-L317)
-*/
-function isReactive$1(value) {
- if (isReadonly(value)) return isReactive$1(value[ReactiveFlags.RAW]);
- return !!(value && value[ReactiveFlags.IS_REACTIVE]);
-}
-function isRef$1(r) {
- return !!(r && r.__v_isRef === true);
-}
-/**
-* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L372-L375)
-*/
-function toRaw$1(observed) {
- const raw = observed && observed[ReactiveFlags.RAW];
- return raw ? toRaw$1(raw) : observed;
-}
-var StateEditor = class {
- constructor() {
- this.refEditor = new RefStateEditor();
- }
- set(object, path, value, cb) {
- const sections = Array.isArray(path) ? path : path.split(".");
- while (sections.length > 1) {
- const section = sections.shift();
- if (object instanceof Map) object = object.get(section);
- else if (object instanceof Set) object = Array.from(object.values())[section];
- else object = object[section];
- if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
- }
- const field = sections[0];
- const item = this.refEditor.get(object)[field];
- if (cb) cb(object, field, value);
- else if (this.refEditor.isRef(item)) this.refEditor.set(item, value);
- else object[field] = value;
- }
- get(object, path) {
- const sections = Array.isArray(path) ? path : path.split(".");
- for (let i = 0; i < sections.length; i++) {
- if (object instanceof Map) object = object.get(sections[i]);
- else object = object[sections[i]];
- if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
- if (!object) return void 0;
- }
- return object;
- }
- has(object, path, parent = false) {
- if (typeof object === "undefined") return false;
- const sections = Array.isArray(path) ? path.slice() : path.split(".");
- const size = !parent ? 1 : 2;
- while (object && sections.length > size) {
- const section = sections.shift();
- object = object[section];
- if (this.refEditor.isRef(object)) object = this.refEditor.get(object);
- }
- return object != null && Object.prototype.hasOwnProperty.call(object, sections[0]);
- }
- createDefaultSetCallback(state) {
- return (object, field, value) => {
- if (state.remove || state.newKey) if (Array.isArray(object)) object.splice(field, 1);
- else if (toRaw$1(object) instanceof Map) object.delete(field);
- else if (toRaw$1(object) instanceof Set) object.delete(Array.from(object.values())[field]);
- else Reflect.deleteProperty(object, field);
- if (!state.remove) {
- const target = object[state.newKey || field];
- if (this.refEditor.isRef(target)) this.refEditor.set(target, value);
- else if (toRaw$1(object) instanceof Map) object.set(state.newKey || field, value);
- else if (toRaw$1(object) instanceof Set) object.add(value);
- else object[state.newKey || field] = value;
- }
- };
- }
-};
-var RefStateEditor = class {
- set(ref, value) {
- if (isRef$1(ref)) ref.value = value;
- else {
- if (ref instanceof Set && Array.isArray(value)) {
- ref.clear();
- value.forEach((v) => ref.add(v));
- return;
- }
- const currentKeys = Object.keys(value);
- if (ref instanceof Map) {
- const previousKeysSet = new Set(ref.keys());
- currentKeys.forEach((key) => {
- ref.set(key, Reflect.get(value, key));
- previousKeysSet.delete(key);
- });
- previousKeysSet.forEach((key) => ref.delete(key));
- return;
- }
- const previousKeysSet = new Set(Object.keys(ref));
- currentKeys.forEach((key) => {
- Reflect.set(ref, key, Reflect.get(value, key));
- previousKeysSet.delete(key);
- });
- previousKeysSet.forEach((key) => Reflect.deleteProperty(ref, key));
- }
- }
- get(ref) {
- return isRef$1(ref) ? ref.value : ref;
- }
- isRef(ref) {
- return isRef$1(ref) || isReactive$1(ref);
- }
-};
-new StateEditor();
-var TIMELINE_LAYERS_STATE_STORAGE_ID = "__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS_STATE__";
-function getTimelineLayersStateFromStorage() {
- if (typeof window === "undefined" || !isBrowser || typeof localStorage === "undefined" || localStorage === null) return {
- recordingState: false,
- mouseEventEnabled: false,
- keyboardEventEnabled: false,
- componentEventEnabled: false,
- performanceEventEnabled: false,
- selected: ""
- };
- const state = typeof localStorage.getItem !== "undefined" ? localStorage.getItem(TIMELINE_LAYERS_STATE_STORAGE_ID) : null;
- return state ? JSON.parse(state) : {
- recordingState: false,
- mouseEventEnabled: false,
- keyboardEventEnabled: false,
- componentEventEnabled: false,
- performanceEventEnabled: false,
- selected: ""
- };
-}
-target.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS ??= [];
-var devtoolsTimelineLayers = new Proxy(target.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS, { get(target, prop, receiver) {
- return Reflect.get(target, prop, receiver);
-} });
-function addTimelineLayer(options, descriptor) {
- devtoolsState.timelineLayersState[descriptor.id] = false;
- devtoolsTimelineLayers.push({
- ...options,
- descriptorId: descriptor.id,
- appRecord: getAppRecord(descriptor.app)
- });
-}
-target.__VUE_DEVTOOLS_KIT_INSPECTOR__ ??= [];
-var devtoolsInspector = new Proxy(target.__VUE_DEVTOOLS_KIT_INSPECTOR__, { get(target, prop, receiver) {
- return Reflect.get(target, prop, receiver);
-} });
-var callInspectorUpdatedHook = debounce(() => {
- devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.SEND_INSPECTOR_TO_CLIENT, getActiveInspectors());
-});
-function addInspector(inspector, descriptor) {
- devtoolsInspector.push({
- options: inspector,
- descriptor,
- treeFilterPlaceholder: inspector.treeFilterPlaceholder ?? "Search tree...",
- stateFilterPlaceholder: inspector.stateFilterPlaceholder ?? "Search state...",
- treeFilter: "",
- selectedNodeId: "",
- appRecord: getAppRecord(descriptor.app)
- });
- callInspectorUpdatedHook();
-}
-function getActiveInspectors() {
- return devtoolsInspector.filter((inspector) => inspector.descriptor.app === activeAppRecord.value.app).filter((inspector) => inspector.descriptor.id !== "components").map((inspector) => {
- const descriptor = inspector.descriptor;
- const options = inspector.options;
- return {
- id: options.id,
- label: options.label,
- logo: descriptor.logo,
- icon: `custom-ic-baseline-${options?.icon?.replace(/_/g, "-")}`,
- packageName: descriptor.packageName,
- homepage: descriptor.homepage,
- pluginId: descriptor.id
- };
- });
-}
-function getInspector(id, app) {
- return devtoolsInspector.find((inspector) => inspector.options.id === id && (app ? inspector.descriptor.app === app : true));
-}
-var DevToolsV6PluginAPIHookKeys = /* @__PURE__ */ function(DevToolsV6PluginAPIHookKeys) {
- DevToolsV6PluginAPIHookKeys["VISIT_COMPONENT_TREE"] = "visitComponentTree";
- DevToolsV6PluginAPIHookKeys["INSPECT_COMPONENT"] = "inspectComponent";
- DevToolsV6PluginAPIHookKeys["EDIT_COMPONENT_STATE"] = "editComponentState";
- DevToolsV6PluginAPIHookKeys["GET_INSPECTOR_TREE"] = "getInspectorTree";
- DevToolsV6PluginAPIHookKeys["GET_INSPECTOR_STATE"] = "getInspectorState";
- DevToolsV6PluginAPIHookKeys["EDIT_INSPECTOR_STATE"] = "editInspectorState";
- DevToolsV6PluginAPIHookKeys["INSPECT_TIMELINE_EVENT"] = "inspectTimelineEvent";
- DevToolsV6PluginAPIHookKeys["TIMELINE_CLEARED"] = "timelineCleared";
- DevToolsV6PluginAPIHookKeys["SET_PLUGIN_SETTINGS"] = "setPluginSettings";
- return DevToolsV6PluginAPIHookKeys;
-}({});
-var DevToolsContextHookKeys = /* @__PURE__ */ function(DevToolsContextHookKeys) {
- DevToolsContextHookKeys["ADD_INSPECTOR"] = "addInspector";
- DevToolsContextHookKeys["SEND_INSPECTOR_TREE"] = "sendInspectorTree";
- DevToolsContextHookKeys["SEND_INSPECTOR_STATE"] = "sendInspectorState";
- DevToolsContextHookKeys["CUSTOM_INSPECTOR_SELECT_NODE"] = "customInspectorSelectNode";
- DevToolsContextHookKeys["TIMELINE_LAYER_ADDED"] = "timelineLayerAdded";
- DevToolsContextHookKeys["TIMELINE_EVENT_ADDED"] = "timelineEventAdded";
- DevToolsContextHookKeys["GET_COMPONENT_INSTANCES"] = "getComponentInstances";
- DevToolsContextHookKeys["GET_COMPONENT_BOUNDS"] = "getComponentBounds";
- DevToolsContextHookKeys["GET_COMPONENT_NAME"] = "getComponentName";
- DevToolsContextHookKeys["COMPONENT_HIGHLIGHT"] = "componentHighlight";
- DevToolsContextHookKeys["COMPONENT_UNHIGHLIGHT"] = "componentUnhighlight";
- return DevToolsContextHookKeys;
-}({});
-var DevToolsMessagingHookKeys = /* @__PURE__ */ function(DevToolsMessagingHookKeys) {
- DevToolsMessagingHookKeys["SEND_INSPECTOR_TREE_TO_CLIENT"] = "sendInspectorTreeToClient";
- DevToolsMessagingHookKeys["SEND_INSPECTOR_STATE_TO_CLIENT"] = "sendInspectorStateToClient";
- DevToolsMessagingHookKeys["SEND_TIMELINE_EVENT_TO_CLIENT"] = "sendTimelineEventToClient";
- DevToolsMessagingHookKeys["SEND_INSPECTOR_TO_CLIENT"] = "sendInspectorToClient";
- DevToolsMessagingHookKeys["SEND_ACTIVE_APP_UNMOUNTED_TO_CLIENT"] = "sendActiveAppUpdatedToClient";
- DevToolsMessagingHookKeys["DEVTOOLS_STATE_UPDATED"] = "devtoolsStateUpdated";
- DevToolsMessagingHookKeys["DEVTOOLS_CONNECTED_UPDATED"] = "devtoolsConnectedUpdated";
- DevToolsMessagingHookKeys["ROUTER_INFO_UPDATED"] = "routerInfoUpdated";
- return DevToolsMessagingHookKeys;
-}({});
-function createDevToolsCtxHooks() {
- const hooks = createHooks();
- hooks.hook(DevToolsContextHookKeys.ADD_INSPECTOR, ({ inspector, plugin }) => {
- addInspector(inspector, plugin.descriptor);
- });
- const debounceSendInspectorTree = debounce(async ({ inspectorId, plugin }) => {
- if (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;
- const inspector = getInspector(inspectorId, plugin.descriptor.app);
- const _payload = {
- app: plugin.descriptor.app,
- inspectorId,
- filter: inspector?.treeFilter || "",
- rootNodes: []
- };
- await new Promise((resolve) => {
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb(_payload)));
- resolve();
- }, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);
- });
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb({
- inspectorId,
- rootNodes: _payload.rootNodes
- })));
- }, DevToolsMessagingHookKeys.SEND_INSPECTOR_TREE_TO_CLIENT);
- }, 120);
- hooks.hook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, debounceSendInspectorTree);
- const debounceSendInspectorState = debounce(async ({ inspectorId, plugin }) => {
- if (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;
- const inspector = getInspector(inspectorId, plugin.descriptor.app);
- const _payload = {
- app: plugin.descriptor.app,
- inspectorId,
- nodeId: inspector?.selectedNodeId || "",
- state: null
- };
- const ctx = { currentTab: `custom-inspector:${inspectorId}` };
- if (_payload.nodeId) await new Promise((resolve) => {
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb(_payload, ctx)));
- resolve();
- }, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);
- });
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb({
- inspectorId,
- nodeId: _payload.nodeId,
- state: _payload.state
- })));
- }, DevToolsMessagingHookKeys.SEND_INSPECTOR_STATE_TO_CLIENT);
- }, 120);
- hooks.hook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, debounceSendInspectorState);
- hooks.hook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, ({ inspectorId, nodeId, plugin }) => {
- const inspector = getInspector(inspectorId, plugin.descriptor.app);
- if (!inspector) return;
- inspector.selectedNodeId = nodeId;
- });
- hooks.hook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, ({ options, plugin }) => {
- addTimelineLayer(options, plugin.descriptor);
- });
- hooks.hook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, ({ options, plugin }) => {
- if (devtoolsState.highPerfModeEnabled || !devtoolsState.timelineLayersState?.[plugin.descriptor.id] && ![
- "performance",
- "component-event",
- "keyboard",
- "mouse"
- ].includes(options.layerId)) return;
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb(options)));
- }, DevToolsMessagingHookKeys.SEND_TIMELINE_EVENT_TO_CLIENT);
- });
- hooks.hook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, async ({ app }) => {
- const appRecord = app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;
- if (!appRecord) return null;
- const appId = appRecord.id.toString();
- return [...appRecord.instanceMap].filter(([key]) => key.split(":")[0] === appId).map(([, instance]) => instance);
- });
- hooks.hook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, async ({ instance }) => {
- return getComponentBoundingRect(instance);
- });
- hooks.hook(DevToolsContextHookKeys.GET_COMPONENT_NAME, ({ instance }) => {
- return getInstanceName(instance);
- });
- hooks.hook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, ({ uid }) => {
- const instance = activeAppRecord.value.instanceMap.get(uid);
- if (instance) highlight(instance);
- });
- hooks.hook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT, () => {
- unhighlight();
- });
- return hooks;
-}
-target.__VUE_DEVTOOLS_KIT_APP_RECORDS__ ??= [];
-target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ ??= {};
-target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ ??= "";
-target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__ ??= [];
-target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__ ??= [];
-var STATE_KEY = "__VUE_DEVTOOLS_KIT_GLOBAL_STATE__";
-function initStateFactory() {
- return {
- connected: false,
- clientConnected: false,
- vitePluginDetected: true,
- appRecords: [],
- activeAppRecordId: "",
- tabs: [],
- commands: [],
- highPerfModeEnabled: true,
- devtoolsClientDetected: {},
- perfUniqueGroupId: 0,
- timelineLayersState: getTimelineLayersStateFromStorage()
- };
-}
-target[STATE_KEY] ??= initStateFactory();
-var callStateUpdatedHook = debounce((state) => {
- devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_STATE_UPDATED, { state });
-});
-debounce((state, oldState) => {
- devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, {
- state,
- oldState
- });
-});
-var devtoolsAppRecords = new Proxy(target.__VUE_DEVTOOLS_KIT_APP_RECORDS__, { get(_target, prop, receiver) {
- if (prop === "value") return target.__VUE_DEVTOOLS_KIT_APP_RECORDS__;
- return target.__VUE_DEVTOOLS_KIT_APP_RECORDS__[prop];
-} });
-var activeAppRecord = new Proxy(target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__, { get(_target, prop, receiver) {
- if (prop === "value") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__;
- else if (prop === "id") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__;
- return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__[prop];
-} });
-function updateAllStates() {
- callStateUpdatedHook({
- ...target[STATE_KEY],
- appRecords: devtoolsAppRecords.value,
- activeAppRecordId: activeAppRecord.id,
- tabs: target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__,
- commands: target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__
- });
-}
-function setActiveAppRecord(app) {
- target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ = app;
- updateAllStates();
-}
-function setActiveAppRecordId(id) {
- target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ = id;
- updateAllStates();
-}
-var devtoolsState = new Proxy(target[STATE_KEY], {
- get(target$3, property) {
- if (property === "appRecords") return devtoolsAppRecords;
- else if (property === "activeAppRecordId") return activeAppRecord.id;
- else if (property === "tabs") return target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;
- else if (property === "commands") return target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
- return target[STATE_KEY][property];
- },
- deleteProperty(target, property) {
- delete target[property];
- return true;
- },
- set(target$4, property, value) {
- target$4[property] = value;
- target[STATE_KEY][property] = value;
- return true;
- }
-});
-function onDevToolsConnected(fn) {
- return new Promise((resolve) => {
- if (devtoolsState.connected) {
- fn();
- resolve();
- }
- devtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {
- if (state.connected) {
- fn();
- resolve();
- }
- });
- });
-}
-var resolveIcon = (icon) => {
- if (!icon) return;
- if (icon.startsWith("baseline-")) return `custom-ic-${icon}`;
- if (icon.startsWith("i-") || isUrlString(icon)) return icon;
- return `custom-ic-baseline-${icon}`;
-};
-function addCustomTab(tab) {
- const tabs = target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;
- if (tabs.some((t) => t.name === tab.name)) return;
- tabs.push({
- ...tab,
- icon: resolveIcon(tab.icon)
- });
- updateAllStates();
-}
-function addCustomCommand(action) {
- const commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
- if (commands.some((t) => t.id === action.id)) return;
- commands.push({
- ...action,
- icon: resolveIcon(action.icon),
- children: action.children ? action.children.map((child) => ({
- ...child,
- icon: resolveIcon(child.icon)
- })) : void 0
- });
- updateAllStates();
-}
-function removeCustomCommand(actionId) {
- const commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;
- const index = commands.findIndex((t) => t.id === actionId);
- if (index === -1) return;
- commands.splice(index, 1);
- updateAllStates();
-}
-function openInEditor(options = {}) {
- const { file, host, baseUrl = window.location.origin, line = 0, column = 0 } = options;
- if (file) {
- if (host === "chrome-extension") {
- const fileName = file.replace(/\\/g, "\\\\");
- const _baseUrl = window.VUE_DEVTOOLS_CONFIG?.openInEditorHost ?? "/";
- fetch(`${_baseUrl}__open-in-editor?file=${encodeURI(file)}`).then((response) => {
- if (!response.ok) {
- const msg = `Opening component ${fileName} failed`;
- console.log(`%c${msg}`, "color:red");
- }
- });
- } else if (devtoolsState.vitePluginDetected) {
- const _baseUrl = target.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__ ?? baseUrl;
- target.__VUE_INSPECTOR__.openInEditor(_baseUrl, file, line, column);
- }
- }
-}
-target.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__ ??= [];
-var devtoolsPluginBuffer = new Proxy(target.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__, { get(target, prop, receiver) {
- return Reflect.get(target, prop, receiver);
-} });
-function _getSettings(settings) {
- const _settings = {};
- Object.keys(settings).forEach((key) => {
- _settings[key] = settings[key].defaultValue;
- });
- return _settings;
-}
-function getPluginLocalKey(pluginId) {
- return `__VUE_DEVTOOLS_NEXT_PLUGIN_SETTINGS__${pluginId}__`;
-}
-function getPluginSettingsOptions(pluginId) {
- return (devtoolsPluginBuffer.find((item) => item[0].id === pluginId && !!item[0]?.settings)?.[0] ?? null)?.settings ?? null;
-}
-function getPluginSettings(pluginId, fallbackValue) {
- const localKey = getPluginLocalKey(pluginId);
- if (localKey) {
- const localSettings = localStorage.getItem(localKey);
- if (localSettings) return JSON.parse(localSettings);
- }
- if (pluginId) return _getSettings((devtoolsPluginBuffer.find((item) => item[0].id === pluginId)?.[0] ?? null)?.settings ?? {});
- return _getSettings(fallbackValue);
-}
-function initPluginSettings(pluginId, settings) {
- const localKey = getPluginLocalKey(pluginId);
- if (!localStorage.getItem(localKey)) localStorage.setItem(localKey, JSON.stringify(_getSettings(settings)));
-}
-function setPluginSettings(pluginId, key, value) {
- const localKey = getPluginLocalKey(pluginId);
- const localSettings = localStorage.getItem(localKey);
- const parsedLocalSettings = JSON.parse(localSettings || "{}");
- const updated = {
- ...parsedLocalSettings,
- [key]: value
- };
- localStorage.setItem(localKey, JSON.stringify(updated));
- devtoolsContext.hooks.callHookWith((callbacks) => {
- callbacks.forEach((cb) => cb({
- pluginId,
- key,
- oldValue: parsedLocalSettings[key],
- newValue: value,
- settings: updated
- }));
- }, DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS);
-}
-var DevToolsHooks = /* @__PURE__ */ function(DevToolsHooks) {
- DevToolsHooks["APP_INIT"] = "app:init";
- DevToolsHooks["APP_UNMOUNT"] = "app:unmount";
- DevToolsHooks["COMPONENT_UPDATED"] = "component:updated";
- DevToolsHooks["COMPONENT_ADDED"] = "component:added";
- DevToolsHooks["COMPONENT_REMOVED"] = "component:removed";
- DevToolsHooks["COMPONENT_EMIT"] = "component:emit";
- DevToolsHooks["PERFORMANCE_START"] = "perf:start";
- DevToolsHooks["PERFORMANCE_END"] = "perf:end";
- DevToolsHooks["ADD_ROUTE"] = "router:add-route";
- DevToolsHooks["REMOVE_ROUTE"] = "router:remove-route";
- DevToolsHooks["RENDER_TRACKED"] = "render:tracked";
- DevToolsHooks["RENDER_TRIGGERED"] = "render:triggered";
- DevToolsHooks["APP_CONNECTED"] = "app:connected";
- DevToolsHooks["SETUP_DEVTOOLS_PLUGIN"] = "devtools-plugin:setup";
- return DevToolsHooks;
-}({});
-var devtoolsHooks = target.__VUE_DEVTOOLS_HOOK ??= createHooks();
-var hook = {
- on: {
- vueAppInit(fn) {
- devtoolsHooks.hook(DevToolsHooks.APP_INIT, fn);
- },
- vueAppUnmount(fn) {
- devtoolsHooks.hook(DevToolsHooks.APP_UNMOUNT, fn);
- },
- vueAppConnected(fn) {
- devtoolsHooks.hook(DevToolsHooks.APP_CONNECTED, fn);
- },
- componentAdded(fn) {
- return devtoolsHooks.hook(DevToolsHooks.COMPONENT_ADDED, fn);
- },
- componentEmit(fn) {
- return devtoolsHooks.hook(DevToolsHooks.COMPONENT_EMIT, fn);
- },
- componentUpdated(fn) {
- return devtoolsHooks.hook(DevToolsHooks.COMPONENT_UPDATED, fn);
- },
- componentRemoved(fn) {
- return devtoolsHooks.hook(DevToolsHooks.COMPONENT_REMOVED, fn);
- },
- setupDevtoolsPlugin(fn) {
- devtoolsHooks.hook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, fn);
- },
- perfStart(fn) {
- return devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_START, fn);
- },
- perfEnd(fn) {
- return devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_END, fn);
- }
- },
- setupDevToolsPlugin(pluginDescriptor, setupFn) {
- return devtoolsHooks.callHook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn);
- }
-};
-var DevToolsV6PluginAPI = class {
- constructor({ plugin, ctx }) {
- this.hooks = ctx.hooks;
- this.plugin = plugin;
- }
- get on() {
- return {
- visitComponentTree: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, handler);
- },
- inspectComponent: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_COMPONENT, handler);
- },
- editComponentState: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_COMPONENT_STATE, handler);
- },
- getInspectorTree: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE, handler);
- },
- getInspectorState: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE, handler);
- },
- editInspectorState: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE, handler);
- },
- inspectTimelineEvent: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_TIMELINE_EVENT, handler);
- },
- timelineCleared: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.TIMELINE_CLEARED, handler);
- },
- setPluginSettings: (handler) => {
- this.hooks.hook(DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS, handler);
- }
- };
- }
- notifyComponentUpdate(instance) {
- if (devtoolsState.highPerfModeEnabled) return;
- const inspector = getActiveInspectors().find((i) => i.packageName === this.plugin.descriptor.packageName);
- if (inspector?.id) {
- if (instance) {
- const args = [
- instance.appContext.app,
- instance.uid,
- instance.parent?.uid,
- instance
- ];
- devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED, ...args);
- } else devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED);
- this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
- inspectorId: inspector.id,
- plugin: this.plugin
- });
- }
- }
- addInspector(options) {
- this.hooks.callHook(DevToolsContextHookKeys.ADD_INSPECTOR, {
- inspector: options,
- plugin: this.plugin
- });
- if (this.plugin.descriptor.settings) initPluginSettings(options.id, this.plugin.descriptor.settings);
- }
- sendInspectorTree(inspectorId) {
- if (devtoolsState.highPerfModeEnabled) return;
- this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, {
- inspectorId,
- plugin: this.plugin
- });
- }
- sendInspectorState(inspectorId) {
- if (devtoolsState.highPerfModeEnabled) return;
- this.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
- inspectorId,
- plugin: this.plugin
- });
- }
- selectInspectorNode(inspectorId, nodeId) {
- this.hooks.callHook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, {
- inspectorId,
- nodeId,
- plugin: this.plugin
- });
- }
- visitComponentTree(payload) {
- return this.hooks.callHook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, payload);
- }
- now() {
- if (devtoolsState.highPerfModeEnabled) return 0;
- return Date.now();
- }
- addTimelineLayer(options) {
- this.hooks.callHook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, {
- options,
- plugin: this.plugin
- });
- }
- addTimelineEvent(options) {
- if (devtoolsState.highPerfModeEnabled) return;
- this.hooks.callHook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, {
- options,
- plugin: this.plugin
- });
- }
- getSettings(pluginId) {
- return getPluginSettings(pluginId ?? this.plugin.descriptor.id, this.plugin.descriptor.settings);
- }
- getComponentInstances(app) {
- return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, { app });
- }
- getComponentBounds(instance) {
- return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, { instance });
- }
- getComponentName(instance) {
- return this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_NAME, { instance });
- }
- highlightElement(instance) {
- const uid = instance.__VUE_DEVTOOLS_NEXT_UID__;
- return this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, { uid });
- }
- unhighlightElement() {
- return this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT);
- }
-};
-var DevToolsPluginAPI = DevToolsV6PluginAPI;
-var UNDEFINED = "__vue_devtool_undefined__";
-var INFINITY = "__vue_devtool_infinity__";
-var NEGATIVE_INFINITY = "__vue_devtool_negative_infinity__";
-var NAN = "__vue_devtool_nan__";
-Object.entries({
- [UNDEFINED]: "undefined",
- [NAN]: "NaN",
- [INFINITY]: "Infinity",
- [NEGATIVE_INFINITY]: "-Infinity"
-}).reduce((acc, [key, value]) => {
- acc[value] = key;
- return acc;
-}, {});
-target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__ ??= /* @__PURE__ */ new Set();
-function setupDevToolsPlugin(pluginDescriptor, setupFn) {
- return hook.setupDevToolsPlugin(pluginDescriptor, setupFn);
-}
-function callDevToolsPluginSetupFn(plugin, app) {
- const [pluginDescriptor, setupFn] = plugin;
- if (pluginDescriptor.app !== app) return;
- const api = new DevToolsPluginAPI({
- plugin: {
- setupFn,
- descriptor: pluginDescriptor
- },
- ctx: devtoolsContext
- });
- if (pluginDescriptor.packageName === "vuex") api.on.editInspectorState((payload) => {
- api.sendInspectorState(payload.inspectorId);
- });
- setupFn(api);
-}
-function registerDevToolsPlugin(app, options) {
- if (target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.has(app)) return;
- if (devtoolsState.highPerfModeEnabled && !options?.inspectingComponent) return;
- target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.add(app);
- devtoolsPluginBuffer.forEach((plugin) => {
- callDevToolsPluginSetupFn(plugin, app);
- });
-}
-var ROUTER_KEY = "__VUE_DEVTOOLS_ROUTER__";
-var ROUTER_INFO_KEY = "__VUE_DEVTOOLS_ROUTER_INFO__";
-target[ROUTER_INFO_KEY] ??= {
- currentRoute: null,
- routes: []
-};
-target[ROUTER_KEY] ??= {};
-new Proxy(target[ROUTER_INFO_KEY], { get(target$1, property) {
- return target[ROUTER_INFO_KEY][property];
-} });
-new Proxy(target[ROUTER_KEY], { get(target$2, property) {
- if (property === "value") return target[ROUTER_KEY];
-} });
-function getRoutes(router) {
- const routesMap = /* @__PURE__ */ new Map();
- return (router?.getRoutes() || []).filter((i) => !routesMap.has(i.path) && routesMap.set(i.path, 1));
-}
-function filterRoutes(routes) {
- return routes.map((item) => {
- let { path, name, children, meta } = item;
- if (children?.length) children = filterRoutes(children);
- return {
- path,
- name,
- children,
- meta
- };
- });
-}
-function filterCurrentRoute(route) {
- if (route) {
- const { fullPath, hash, href, path, name, matched, params, query } = route;
- return {
- fullPath,
- hash,
- href,
- path,
- name,
- params,
- query,
- matched: filterRoutes(matched)
- };
- }
- return route;
-}
-function normalizeRouterInfo(appRecord, activeAppRecord) {
- function init() {
- const router = appRecord.app?.config.globalProperties.$router;
- const currentRoute = filterCurrentRoute(router?.currentRoute.value);
- const routes = filterRoutes(getRoutes(router));
- const c = console.warn;
- console.warn = () => {};
- target[ROUTER_INFO_KEY] = {
- currentRoute: currentRoute ? deepClone(currentRoute) : {},
- routes: deepClone(routes)
- };
- target[ROUTER_KEY] = router;
- console.warn = c;
- }
- init();
- hook.on.componentUpdated(debounce(() => {
- if (activeAppRecord.value?.app !== appRecord.app) return;
- init();
- if (devtoolsState.highPerfModeEnabled) return;
- devtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.ROUTER_INFO_UPDATED, { state: target[ROUTER_INFO_KEY] });
- }, 200));
-}
-function createDevToolsApi(hooks) {
- return {
- async getInspectorTree(payload) {
- const _payload = {
- ...payload,
- app: activeAppRecord.value.app,
- rootNodes: []
- };
- await new Promise((resolve) => {
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb(_payload)));
- resolve();
- }, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);
- });
- return _payload.rootNodes;
- },
- async getInspectorState(payload) {
- const _payload = {
- ...payload,
- app: activeAppRecord.value.app,
- state: null
- };
- const ctx = { currentTab: `custom-inspector:${payload.inspectorId}` };
- await new Promise((resolve) => {
- hooks.callHookWith(async (callbacks) => {
- await Promise.all(callbacks.map((cb) => cb(_payload, ctx)));
- resolve();
- }, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);
- });
- return _payload.state;
- },
- editInspectorState(payload) {
- const stateEditor = new StateEditor();
- const _payload = {
- ...payload,
- app: activeAppRecord.value.app,
- set: (obj, path = payload.path, value = payload.state.value, cb) => {
- stateEditor.set(obj, path, value, cb || stateEditor.createDefaultSetCallback(payload.state));
- }
- };
- hooks.callHookWith((callbacks) => {
- callbacks.forEach((cb) => cb(_payload));
- }, DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE);
- },
- sendInspectorState(inspectorId) {
- const inspector = getInspector(inspectorId);
- hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {
- inspectorId,
- plugin: {
- descriptor: inspector.descriptor,
- setupFn: () => ({})
- }
- });
- },
- inspectComponentInspector() {
- return inspectComponentHighLighter();
- },
- cancelInspectComponentInspector() {
- return cancelInspectComponentHighLighter();
- },
- getComponentRenderCode(id) {
- const instance = getComponentInstance(activeAppRecord.value, id);
- if (instance) return !(typeof instance?.type === "function") ? instance.render.toString() : instance.type.toString();
- },
- scrollToComponent(id) {
- return scrollToComponent({ id });
- },
- openInEditor,
- getVueInspector: getComponentInspector,
- toggleApp(id, options) {
- const appRecord = devtoolsAppRecords.value.find((record) => record.id === id);
- if (appRecord) {
- setActiveAppRecordId(id);
- setActiveAppRecord(appRecord);
- normalizeRouterInfo(appRecord, activeAppRecord);
- callInspectorUpdatedHook();
- registerDevToolsPlugin(appRecord.app, options);
- }
- },
- inspectDOM(instanceId) {
- const instance = getComponentInstance(activeAppRecord.value, instanceId);
- if (instance) {
- const [el] = getRootElementsFromComponentInstance(instance);
- if (el) target.__VUE_DEVTOOLS_INSPECT_DOM_TARGET__ = el;
- }
- },
- updatePluginSettings(pluginId, key, value) {
- setPluginSettings(pluginId, key, value);
- },
- getPluginSettings(pluginId) {
- return {
- options: getPluginSettingsOptions(pluginId),
- values: getPluginSettings(pluginId)
- };
- }
- };
-}
-target.__VUE_DEVTOOLS_ENV__ ??= { vitePluginDetected: false };
-var hooks = createDevToolsCtxHooks();
-target.__VUE_DEVTOOLS_KIT_CONTEXT__ ??= {
- hooks,
- get state() {
- return {
- ...devtoolsState,
- activeAppRecordId: activeAppRecord.id,
- activeAppRecord: activeAppRecord.value,
- appRecords: devtoolsAppRecords.value
- };
- },
- api: createDevToolsApi(hooks)
-};
-var devtoolsContext = target.__VUE_DEVTOOLS_KIT_CONTEXT__;
-var require_speakingurl$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
- (function(root) {
- "use strict";
- /**
- * charMap
- * @type {Object}
- */
- var charMap = {
- "À": "A",
- "Á": "A",
- "Â": "A",
- "Ã": "A",
- "Ä": "Ae",
- "Å": "A",
- "Æ": "AE",
- "Ç": "C",
- "È": "E",
- "É": "E",
- "Ê": "E",
- "Ë": "E",
- "Ì": "I",
- "Í": "I",
- "Î": "I",
- "Ï": "I",
- "Ð": "D",
- "Ñ": "N",
- "Ò": "O",
- "Ó": "O",
- "Ô": "O",
- "Õ": "O",
- "Ö": "Oe",
- "Ő": "O",
- "Ø": "O",
- "Ù": "U",
- "Ú": "U",
- "Û": "U",
- "Ü": "Ue",
- "Ű": "U",
- "Ý": "Y",
- "Þ": "TH",
- "ß": "ss",
- "à": "a",
- "á": "a",
- "â": "a",
- "ã": "a",
- "ä": "ae",
- "å": "a",
- "æ": "ae",
- "ç": "c",
- "è": "e",
- "é": "e",
- "ê": "e",
- "ë": "e",
- "ì": "i",
- "í": "i",
- "î": "i",
- "ï": "i",
- "ð": "d",
- "ñ": "n",
- "ò": "o",
- "ó": "o",
- "ô": "o",
- "õ": "o",
- "ö": "oe",
- "ő": "o",
- "ø": "o",
- "ù": "u",
- "ú": "u",
- "û": "u",
- "ü": "ue",
- "ű": "u",
- "ý": "y",
- "þ": "th",
- "ÿ": "y",
- "ẞ": "SS",
- "ا": "a",
- "أ": "a",
- "إ": "i",
- "آ": "aa",
- "ؤ": "u",
- "ئ": "e",
- "ء": "a",
- "ب": "b",
- "ت": "t",
- "ث": "th",
- "ج": "j",
- "ح": "h",
- "خ": "kh",
- "د": "d",
- "ذ": "th",
- "ر": "r",
- "ز": "z",
- "س": "s",
- "ش": "sh",
- "ص": "s",
- "ض": "dh",
- "ط": "t",
- "ظ": "z",
- "ع": "a",
- "غ": "gh",
- "ف": "f",
- "ق": "q",
- "ك": "k",
- "ل": "l",
- "م": "m",
- "ن": "n",
- "ه": "h",
- "و": "w",
- "ي": "y",
- "ى": "a",
- "ة": "h",
- "ﻻ": "la",
- "ﻷ": "laa",
- "ﻹ": "lai",
- "ﻵ": "laa",
- "گ": "g",
- "چ": "ch",
- "پ": "p",
- "ژ": "zh",
- "ک": "k",
- "ی": "y",
- "َ": "a",
- "ً": "an",
- "ِ": "e",
- "ٍ": "en",
- "ُ": "u",
- "ٌ": "on",
- "ْ": "",
- "٠": "0",
- "١": "1",
- "٢": "2",
- "٣": "3",
- "٤": "4",
- "٥": "5",
- "٦": "6",
- "٧": "7",
- "٨": "8",
- "٩": "9",
- "۰": "0",
- "۱": "1",
- "۲": "2",
- "۳": "3",
- "۴": "4",
- "۵": "5",
- "۶": "6",
- "۷": "7",
- "۸": "8",
- "۹": "9",
- "က": "k",
- "ခ": "kh",
- "ဂ": "g",
- "ဃ": "ga",
- "င": "ng",
- "စ": "s",
- "ဆ": "sa",
- "ဇ": "z",
- "စျ": "za",
- "ည": "ny",
- "ဋ": "t",
- "ဌ": "ta",
- "ဍ": "d",
- "ဎ": "da",
- "ဏ": "na",
- "တ": "t",
- "ထ": "ta",
- "ဒ": "d",
- "ဓ": "da",
- "န": "n",
- "ပ": "p",
- "ဖ": "pa",
- "ဗ": "b",
- "ဘ": "ba",
- "မ": "m",
- "ယ": "y",
- "ရ": "ya",
- "လ": "l",
- "ဝ": "w",
- "သ": "th",
- "ဟ": "h",
- "ဠ": "la",
- "အ": "a",
- "ြ": "y",
- "ျ": "ya",
- "ွ": "w",
- "ြွ": "yw",
- "ျွ": "ywa",
- "ှ": "h",
- "ဧ": "e",
- "၏": "-e",
- "ဣ": "i",
- "ဤ": "-i",
- "ဉ": "u",
- "ဦ": "-u",
- "ဩ": "aw",
- "သြော": "aw",
- "ဪ": "aw",
- "၀": "0",
- "၁": "1",
- "၂": "2",
- "၃": "3",
- "၄": "4",
- "၅": "5",
- "၆": "6",
- "၇": "7",
- "၈": "8",
- "၉": "9",
- "္": "",
- "့": "",
- "း": "",
- "č": "c",
- "ď": "d",
- "ě": "e",
- "ň": "n",
- "ř": "r",
- "š": "s",
- "ť": "t",
- "ů": "u",
- "ž": "z",
- "Č": "C",
- "Ď": "D",
- "Ě": "E",
- "Ň": "N",
- "Ř": "R",
- "Š": "S",
- "Ť": "T",
- "Ů": "U",
- "Ž": "Z",
- "ހ": "h",
- "ށ": "sh",
- "ނ": "n",
- "ރ": "r",
- "ބ": "b",
- "ޅ": "lh",
- "ކ": "k",
- "އ": "a",
- "ވ": "v",
- "މ": "m",
- "ފ": "f",
- "ދ": "dh",
- "ތ": "th",
- "ލ": "l",
- "ގ": "g",
- "ޏ": "gn",
- "ސ": "s",
- "ޑ": "d",
- "ޒ": "z",
- "ޓ": "t",
- "ޔ": "y",
- "ޕ": "p",
- "ޖ": "j",
- "ޗ": "ch",
- "ޘ": "tt",
- "ޙ": "hh",
- "ޚ": "kh",
- "ޛ": "th",
- "ޜ": "z",
- "ޝ": "sh",
- "ޞ": "s",
- "ޟ": "d",
- "ޠ": "t",
- "ޡ": "z",
- "ޢ": "a",
- "ޣ": "gh",
- "ޤ": "q",
- "ޥ": "w",
- "ަ": "a",
- "ާ": "aa",
- "ި": "i",
- "ީ": "ee",
- "ު": "u",
- "ޫ": "oo",
- "ެ": "e",
- "ޭ": "ey",
- "ޮ": "o",
- "ޯ": "oa",
- "ް": "",
- "ა": "a",
- "ბ": "b",
- "გ": "g",
- "დ": "d",
- "ე": "e",
- "ვ": "v",
- "ზ": "z",
- "თ": "t",
- "ი": "i",
- "კ": "k",
- "ლ": "l",
- "მ": "m",
- "ნ": "n",
- "ო": "o",
- "პ": "p",
- "ჟ": "zh",
- "რ": "r",
- "ს": "s",
- "ტ": "t",
- "უ": "u",
- "ფ": "p",
- "ქ": "k",
- "ღ": "gh",
- "ყ": "q",
- "შ": "sh",
- "ჩ": "ch",
- "ც": "ts",
- "ძ": "dz",
- "წ": "ts",
- "ჭ": "ch",
- "ხ": "kh",
- "ჯ": "j",
- "ჰ": "h",
- "α": "a",
- "β": "v",
- "γ": "g",
- "δ": "d",
- "ε": "e",
- "ζ": "z",
- "η": "i",
- "θ": "th",
- "ι": "i",
- "κ": "k",
- "λ": "l",
- "μ": "m",
- "ν": "n",
- "ξ": "ks",
- "ο": "o",
- "π": "p",
- "ρ": "r",
- "σ": "s",
- "τ": "t",
- "υ": "y",
- "φ": "f",
- "χ": "x",
- "ψ": "ps",
- "ω": "o",
- "ά": "a",
- "έ": "e",
- "ί": "i",
- "ό": "o",
- "ύ": "y",
- "ή": "i",
- "ώ": "o",
- "ς": "s",
- "ϊ": "i",
- "ΰ": "y",
- "ϋ": "y",
- "ΐ": "i",
- "Α": "A",
- "Β": "B",
- "Γ": "G",
- "Δ": "D",
- "Ε": "E",
- "Ζ": "Z",
- "Η": "I",
- "Θ": "TH",
- "Ι": "I",
- "Κ": "K",
- "Λ": "L",
- "Μ": "M",
- "Ν": "N",
- "Ξ": "KS",
- "Ο": "O",
- "Π": "P",
- "Ρ": "R",
- "Σ": "S",
- "Τ": "T",
- "Υ": "Y",
- "Φ": "F",
- "Χ": "X",
- "Ψ": "PS",
- "Ω": "O",
- "Ά": "A",
- "Έ": "E",
- "Ί": "I",
- "Ό": "O",
- "Ύ": "Y",
- "Ή": "I",
- "Ώ": "O",
- "Ϊ": "I",
- "Ϋ": "Y",
- "ā": "a",
- "ē": "e",
- "ģ": "g",
- "ī": "i",
- "ķ": "k",
- "ļ": "l",
- "ņ": "n",
- "ū": "u",
- "Ā": "A",
- "Ē": "E",
- "Ģ": "G",
- "Ī": "I",
- "Ķ": "k",
- "Ļ": "L",
- "Ņ": "N",
- "Ū": "U",
- "Ќ": "Kj",
- "ќ": "kj",
- "Љ": "Lj",
- "љ": "lj",
- "Њ": "Nj",
- "њ": "nj",
- "Тс": "Ts",
- "тс": "ts",
- "ą": "a",
- "ć": "c",
- "ę": "e",
- "ł": "l",
- "ń": "n",
- "ś": "s",
- "ź": "z",
- "ż": "z",
- "Ą": "A",
- "Ć": "C",
- "Ę": "E",
- "Ł": "L",
- "Ń": "N",
- "Ś": "S",
- "Ź": "Z",
- "Ż": "Z",
- "Є": "Ye",
- "І": "I",
- "Ї": "Yi",
- "Ґ": "G",
- "є": "ye",
- "і": "i",
- "ї": "yi",
- "ґ": "g",
- "ă": "a",
- "Ă": "A",
- "ș": "s",
- "Ș": "S",
- "ț": "t",
- "Ț": "T",
- "ţ": "t",
- "Ţ": "T",
- "а": "a",
- "б": "b",
- "в": "v",
- "г": "g",
- "д": "d",
- "е": "e",
- "ё": "yo",
- "ж": "zh",
- "з": "z",
- "и": "i",
- "й": "i",
- "к": "k",
- "л": "l",
- "м": "m",
- "н": "n",
- "о": "o",
- "п": "p",
- "р": "r",
- "с": "s",
- "т": "t",
- "у": "u",
- "ф": "f",
- "х": "kh",
- "ц": "c",
- "ч": "ch",
- "ш": "sh",
- "щ": "sh",
- "ъ": "",
- "ы": "y",
- "ь": "",
- "э": "e",
- "ю": "yu",
- "я": "ya",
- "А": "A",
- "Б": "B",
- "В": "V",
- "Г": "G",
- "Д": "D",
- "Е": "E",
- "Ё": "Yo",
- "Ж": "Zh",
- "З": "Z",
- "И": "I",
- "Й": "I",
- "К": "K",
- "Л": "L",
- "М": "M",
- "Н": "N",
- "О": "O",
- "П": "P",
- "Р": "R",
- "С": "S",
- "Т": "T",
- "У": "U",
- "Ф": "F",
- "Х": "Kh",
- "Ц": "C",
- "Ч": "Ch",
- "Ш": "Sh",
- "Щ": "Sh",
- "Ъ": "",
- "Ы": "Y",
- "Ь": "",
- "Э": "E",
- "Ю": "Yu",
- "Я": "Ya",
- "ђ": "dj",
- "ј": "j",
- "ћ": "c",
- "џ": "dz",
- "Ђ": "Dj",
- "Ј": "j",
- "Ћ": "C",
- "Џ": "Dz",
- "ľ": "l",
- "ĺ": "l",
- "ŕ": "r",
- "Ľ": "L",
- "Ĺ": "L",
- "Ŕ": "R",
- "ş": "s",
- "Ş": "S",
- "ı": "i",
- "İ": "I",
- "ğ": "g",
- "Ğ": "G",
- "ả": "a",
- "Ả": "A",
- "ẳ": "a",
- "Ẳ": "A",
- "ẩ": "a",
- "Ẩ": "A",
- "đ": "d",
- "Đ": "D",
- "ẹ": "e",
- "Ẹ": "E",
- "ẽ": "e",
- "Ẽ": "E",
- "ẻ": "e",
- "Ẻ": "E",
- "ế": "e",
- "Ế": "E",
- "ề": "e",
- "Ề": "E",
- "ệ": "e",
- "Ệ": "E",
- "ễ": "e",
- "Ễ": "E",
- "ể": "e",
- "Ể": "E",
- "ỏ": "o",
- "ọ": "o",
- "Ọ": "o",
- "ố": "o",
- "Ố": "O",
- "ồ": "o",
- "Ồ": "O",
- "ổ": "o",
- "Ổ": "O",
- "ộ": "o",
- "Ộ": "O",
- "ỗ": "o",
- "Ỗ": "O",
- "ơ": "o",
- "Ơ": "O",
- "ớ": "o",
- "Ớ": "O",
- "ờ": "o",
- "Ờ": "O",
- "ợ": "o",
- "Ợ": "O",
- "ỡ": "o",
- "Ỡ": "O",
- "Ở": "o",
- "ở": "o",
- "ị": "i",
- "Ị": "I",
- "ĩ": "i",
- "Ĩ": "I",
- "ỉ": "i",
- "Ỉ": "i",
- "ủ": "u",
- "Ủ": "U",
- "ụ": "u",
- "Ụ": "U",
- "ũ": "u",
- "Ũ": "U",
- "ư": "u",
- "Ư": "U",
- "ứ": "u",
- "Ứ": "U",
- "ừ": "u",
- "Ừ": "U",
- "ự": "u",
- "Ự": "U",
- "ữ": "u",
- "Ữ": "U",
- "ử": "u",
- "Ử": "ư",
- "ỷ": "y",
- "Ỷ": "y",
- "ỳ": "y",
- "Ỳ": "Y",
- "ỵ": "y",
- "Ỵ": "Y",
- "ỹ": "y",
- "Ỹ": "Y",
- "ạ": "a",
- "Ạ": "A",
- "ấ": "a",
- "Ấ": "A",
- "ầ": "a",
- "Ầ": "A",
- "ậ": "a",
- "Ậ": "A",
- "ẫ": "a",
- "Ẫ": "A",
- "ắ": "a",
- "Ắ": "A",
- "ằ": "a",
- "Ằ": "A",
- "ặ": "a",
- "Ặ": "A",
- "ẵ": "a",
- "Ẵ": "A",
- "⓪": "0",
- "①": "1",
- "②": "2",
- "③": "3",
- "④": "4",
- "⑤": "5",
- "⑥": "6",
- "⑦": "7",
- "⑧": "8",
- "⑨": "9",
- "⑩": "10",
- "⑪": "11",
- "⑫": "12",
- "⑬": "13",
- "⑭": "14",
- "⑮": "15",
- "⑯": "16",
- "⑰": "17",
- "⑱": "18",
- "⑲": "18",
- "⑳": "18",
- "⓵": "1",
- "⓶": "2",
- "⓷": "3",
- "⓸": "4",
- "⓹": "5",
- "⓺": "6",
- "⓻": "7",
- "⓼": "8",
- "⓽": "9",
- "⓾": "10",
- "⓿": "0",
- "⓫": "11",
- "⓬": "12",
- "⓭": "13",
- "⓮": "14",
- "⓯": "15",
- "⓰": "16",
- "⓱": "17",
- "⓲": "18",
- "⓳": "19",
- "⓴": "20",
- "Ⓐ": "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",
- "ⓐ": "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",
- "“": "\"",
- "”": "\"",
- "‘": "'",
- "’": "'",
- "∂": "d",
- "ƒ": "f",
- "™": "(TM)",
- "©": "(C)",
- "œ": "oe",
- "Œ": "OE",
- "®": "(R)",
- "†": "+",
- "℠": "(SM)",
- "…": "...",
- "˚": "o",
- "º": "o",
- "ª": "a",
- "•": "*",
- "၊": ",",
- "။": ".",
- "$": "USD",
- "€": "EUR",
- "₢": "BRN",
- "₣": "FRF",
- "£": "GBP",
- "₤": "ITL",
- "₦": "NGN",
- "₧": "ESP",
- "₩": "KRW",
- "₪": "ILS",
- "₫": "VND",
- "₭": "LAK",
- "₮": "MNT",
- "₯": "GRD",
- "₱": "ARS",
- "₲": "PYG",
- "₳": "ARA",
- "₴": "UAH",
- "₵": "GHS",
- "¢": "cent",
- "¥": "CNY",
- "元": "CNY",
- "円": "YEN",
- "﷼": "IRR",
- "₠": "EWE",
- "฿": "THB",
- "₨": "INR",
- "₹": "INR",
- "₰": "PF",
- "₺": "TRY",
- "؋": "AFN",
- "₼": "AZN",
- "лв": "BGN",
- "៛": "KHR",
- "₡": "CRC",
- "₸": "KZT",
- "ден": "MKD",
- "zł": "PLN",
- "₽": "RUB",
- "₾": "GEL"
- };
- /**
- * special look ahead character array
- * These characters form with consonants to become 'single'/consonant combo
- * @type [Array]
- */
- var lookAheadCharArray = ["်", "ް"];
- /**
- * diatricMap for languages where transliteration changes entirely as more diatrics are added
- * @type {Object}
- */
- var diatricMap = {
- "ာ": "a",
- "ါ": "a",
- "ေ": "e",
- "ဲ": "e",
- "ိ": "i",
- "ီ": "i",
- "ို": "o",
- "ု": "u",
- "ူ": "u",
- "ေါင်": "aung",
- "ော": "aw",
- "ော်": "aw",
- "ေါ": "aw",
- "ေါ်": "aw",
- "်": "်",
- "က်": "et",
- "ိုက်": "aik",
- "ောက်": "auk",
- "င်": "in",
- "ိုင်": "aing",
- "ောင်": "aung",
- "စ်": "it",
- "ည်": "i",
- "တ်": "at",
- "ိတ်": "eik",
- "ုတ်": "ok",
- "ွတ်": "ut",
- "ေတ်": "it",
- "ဒ်": "d",
- "ိုဒ်": "ok",
- "ုဒ်": "ait",
- "န်": "an",
- "ာန်": "an",
- "ိန်": "ein",
- "ုန်": "on",
- "ွန်": "un",
- "ပ်": "at",
- "ိပ်": "eik",
- "ုပ်": "ok",
- "ွပ်": "ut",
- "န်ုပ်": "nub",
- "မ်": "an",
- "ိမ်": "ein",
- "ုမ်": "on",
- "ွမ်": "un",
- "ယ်": "e",
- "ိုလ်": "ol",
- "ဉ်": "in",
- "ံ": "an",
- "ိံ": "ein",
- "ုံ": "on",
- "ައް": "ah",
- "ަށް": "ah"
- };
- /**
- * langCharMap language specific characters translations
- * @type {Object}
- */
- var langCharMap = {
- "en": {},
- "az": {
- "ç": "c",
- "ə": "e",
- "ğ": "g",
- "ı": "i",
- "ö": "o",
- "ş": "s",
- "ü": "u",
- "Ç": "C",
- "Ə": "E",
- "Ğ": "G",
- "İ": "I",
- "Ö": "O",
- "Ş": "S",
- "Ü": "U"
- },
- "cs": {
- "č": "c",
- "ď": "d",
- "ě": "e",
- "ň": "n",
- "ř": "r",
- "š": "s",
- "ť": "t",
- "ů": "u",
- "ž": "z",
- "Č": "C",
- "Ď": "D",
- "Ě": "E",
- "Ň": "N",
- "Ř": "R",
- "Š": "S",
- "Ť": "T",
- "Ů": "U",
- "Ž": "Z"
- },
- "fi": {
- "ä": "a",
- "Ä": "A",
- "ö": "o",
- "Ö": "O"
- },
- "hu": {
- "ä": "a",
- "Ä": "A",
- "ö": "o",
- "Ö": "O",
- "ü": "u",
- "Ü": "U",
- "ű": "u",
- "Ű": "U"
- },
- "lt": {
- "ą": "a",
- "č": "c",
- "ę": "e",
- "ė": "e",
- "į": "i",
- "š": "s",
- "ų": "u",
- "ū": "u",
- "ž": "z",
- "Ą": "A",
- "Č": "C",
- "Ę": "E",
- "Ė": "E",
- "Į": "I",
- "Š": "S",
- "Ų": "U",
- "Ū": "U"
- },
- "lv": {
- "ā": "a",
- "č": "c",
- "ē": "e",
- "ģ": "g",
- "ī": "i",
- "ķ": "k",
- "ļ": "l",
- "ņ": "n",
- "š": "s",
- "ū": "u",
- "ž": "z",
- "Ā": "A",
- "Č": "C",
- "Ē": "E",
- "Ģ": "G",
- "Ī": "i",
- "Ķ": "k",
- "Ļ": "L",
- "Ņ": "N",
- "Š": "S",
- "Ū": "u",
- "Ž": "Z"
- },
- "pl": {
- "ą": "a",
- "ć": "c",
- "ę": "e",
- "ł": "l",
- "ń": "n",
- "ó": "o",
- "ś": "s",
- "ź": "z",
- "ż": "z",
- "Ą": "A",
- "Ć": "C",
- "Ę": "e",
- "Ł": "L",
- "Ń": "N",
- "Ó": "O",
- "Ś": "S",
- "Ź": "Z",
- "Ż": "Z"
- },
- "sv": {
- "ä": "a",
- "Ä": "A",
- "ö": "o",
- "Ö": "O"
- },
- "sk": {
- "ä": "a",
- "Ä": "A"
- },
- "sr": {
- "љ": "lj",
- "њ": "nj",
- "Љ": "Lj",
- "Њ": "Nj",
- "đ": "dj",
- "Đ": "Dj"
- },
- "tr": {
- "Ü": "U",
- "Ö": "O",
- "ü": "u",
- "ö": "o"
- }
- };
- /**
- * symbolMap language specific symbol translations
- * translations must be transliterated already
- * @type {Object}
- */
- var symbolMap = {
- "ar": {
- "∆": "delta",
- "∞": "la-nihaya",
- "♥": "hob",
- "&": "wa",
- "|": "aw",
- "<": "aqal-men",
- ">": "akbar-men",
- "∑": "majmou",
- "¤": "omla"
- },
- "az": {},
- "ca": {
- "∆": "delta",
- "∞": "infinit",
- "♥": "amor",
- "&": "i",
- "|": "o",
- "<": "menys que",
- ">": "mes que",
- "∑": "suma dels",
- "¤": "moneda"
- },
- "cs": {
- "∆": "delta",
- "∞": "nekonecno",
- "♥": "laska",
- "&": "a",
- "|": "nebo",
- "<": "mensi nez",
- ">": "vetsi nez",
- "∑": "soucet",
- "¤": "mena"
- },
- "de": {
- "∆": "delta",
- "∞": "unendlich",
- "♥": "Liebe",
- "&": "und",
- "|": "oder",
- "<": "kleiner als",
- ">": "groesser als",
- "∑": "Summe von",
- "¤": "Waehrung"
- },
- "dv": {
- "∆": "delta",
- "∞": "kolunulaa",
- "♥": "loabi",
- "&": "aai",
- "|": "noonee",
- "<": "ah vure kuda",
- ">": "ah vure bodu",
- "∑": "jumula",
- "¤": "faisaa"
- },
- "en": {
- "∆": "delta",
- "∞": "infinity",
- "♥": "love",
- "&": "and",
- "|": "or",
- "<": "less than",
- ">": "greater than",
- "∑": "sum",
- "¤": "currency"
- },
- "es": {
- "∆": "delta",
- "∞": "infinito",
- "♥": "amor",
- "&": "y",
- "|": "u",
- "<": "menos que",
- ">": "mas que",
- "∑": "suma de los",
- "¤": "moneda"
- },
- "fa": {
- "∆": "delta",
- "∞": "bi-nahayat",
- "♥": "eshgh",
- "&": "va",
- "|": "ya",
- "<": "kamtar-az",
- ">": "bishtar-az",
- "∑": "majmooe",
- "¤": "vahed"
- },
- "fi": {
- "∆": "delta",
- "∞": "aarettomyys",
- "♥": "rakkaus",
- "&": "ja",
- "|": "tai",
- "<": "pienempi kuin",
- ">": "suurempi kuin",
- "∑": "summa",
- "¤": "valuutta"
- },
- "fr": {
- "∆": "delta",
- "∞": "infiniment",
- "♥": "Amour",
- "&": "et",
- "|": "ou",
- "<": "moins que",
- ">": "superieure a",
- "∑": "somme des",
- "¤": "monnaie"
- },
- "ge": {
- "∆": "delta",
- "∞": "usasruloba",
- "♥": "siqvaruli",
- "&": "da",
- "|": "an",
- "<": "naklebi",
- ">": "meti",
- "∑": "jami",
- "¤": "valuta"
- },
- "gr": {},
- "hu": {
- "∆": "delta",
- "∞": "vegtelen",
- "♥": "szerelem",
- "&": "es",
- "|": "vagy",
- "<": "kisebb mint",
- ">": "nagyobb mint",
- "∑": "szumma",
- "¤": "penznem"
- },
- "it": {
- "∆": "delta",
- "∞": "infinito",
- "♥": "amore",
- "&": "e",
- "|": "o",
- "<": "minore di",
- ">": "maggiore di",
- "∑": "somma",
- "¤": "moneta"
- },
- "lt": {
- "∆": "delta",
- "∞": "begalybe",
- "♥": "meile",
- "&": "ir",
- "|": "ar",
- "<": "maziau nei",
- ">": "daugiau nei",
- "∑": "suma",
- "¤": "valiuta"
- },
- "lv": {
- "∆": "delta",
- "∞": "bezgaliba",
- "♥": "milestiba",
- "&": "un",
- "|": "vai",
- "<": "mazak neka",
- ">": "lielaks neka",
- "∑": "summa",
- "¤": "valuta"
- },
- "my": {
- "∆": "kwahkhyaet",
- "∞": "asaonasme",
- "♥": "akhyait",
- "&": "nhin",
- "|": "tho",
- "<": "ngethaw",
- ">": "kyithaw",
- "∑": "paungld",
- "¤": "ngwekye"
- },
- "mk": {},
- "nl": {
- "∆": "delta",
- "∞": "oneindig",
- "♥": "liefde",
- "&": "en",
- "|": "of",
- "<": "kleiner dan",
- ">": "groter dan",
- "∑": "som",
- "¤": "valuta"
- },
- "pl": {
- "∆": "delta",
- "∞": "nieskonczonosc",
- "♥": "milosc",
- "&": "i",
- "|": "lub",
- "<": "mniejsze niz",
- ">": "wieksze niz",
- "∑": "suma",
- "¤": "waluta"
- },
- "pt": {
- "∆": "delta",
- "∞": "infinito",
- "♥": "amor",
- "&": "e",
- "|": "ou",
- "<": "menor que",
- ">": "maior que",
- "∑": "soma",
- "¤": "moeda"
- },
- "ro": {
- "∆": "delta",
- "∞": "infinit",
- "♥": "dragoste",
- "&": "si",
- "|": "sau",
- "<": "mai mic ca",
- ">": "mai mare ca",
- "∑": "suma",
- "¤": "valuta"
- },
- "ru": {
- "∆": "delta",
- "∞": "beskonechno",
- "♥": "lubov",
- "&": "i",
- "|": "ili",
- "<": "menshe",
- ">": "bolshe",
- "∑": "summa",
- "¤": "valjuta"
- },
- "sk": {
- "∆": "delta",
- "∞": "nekonecno",
- "♥": "laska",
- "&": "a",
- "|": "alebo",
- "<": "menej ako",
- ">": "viac ako",
- "∑": "sucet",
- "¤": "mena"
- },
- "sr": {},
- "tr": {
- "∆": "delta",
- "∞": "sonsuzluk",
- "♥": "ask",
- "&": "ve",
- "|": "veya",
- "<": "kucuktur",
- ">": "buyuktur",
- "∑": "toplam",
- "¤": "para birimi"
- },
- "uk": {
- "∆": "delta",
- "∞": "bezkinechnist",
- "♥": "lubov",
- "&": "i",
- "|": "abo",
- "<": "menshe",
- ">": "bilshe",
- "∑": "suma",
- "¤": "valjuta"
- },
- "vn": {
- "∆": "delta",
- "∞": "vo cuc",
- "♥": "yeu",
- "&": "va",
- "|": "hoac",
- "<": "nho hon",
- ">": "lon hon",
- "∑": "tong",
- "¤": "tien te"
- }
- };
- var uricChars = [
- ";",
- "?",
- ":",
- "@",
- "&",
- "=",
- "+",
- "$",
- ",",
- "/"
- ].join("");
- var uricNoSlashChars = [
- ";",
- "?",
- ":",
- "@",
- "&",
- "=",
- "+",
- "$",
- ","
- ].join("");
- var markChars = [
- ".",
- "!",
- "~",
- "*",
- "'",
- "(",
- ")"
- ].join("");
- /**
- * getSlug
- * @param {string} input input string
- * @param {object|string} opts config object or separator string/char
- * @api public
- * @return {string} sluggified string
- */
- var getSlug = function getSlug(input, opts) {
- var separator = "-";
- var result = "";
- var diatricString = "";
- var convertSymbols = true;
- var customReplacements = {};
- var maintainCase;
- var titleCase;
- var truncate;
- var uricFlag;
- var uricNoSlashFlag;
- var markFlag;
- var symbol;
- var langChar;
- var lucky;
- var i;
- var ch;
- var l;
- var lastCharWasSymbol;
- var lastCharWasDiatric;
- var allowedChars = "";
- if (typeof input !== "string") return "";
- if (typeof opts === "string") separator = opts;
- symbol = symbolMap.en;
- langChar = langCharMap.en;
- if (typeof opts === "object") {
- maintainCase = opts.maintainCase || false;
- customReplacements = opts.custom && typeof opts.custom === "object" ? opts.custom : customReplacements;
- truncate = +opts.truncate > 1 && opts.truncate || false;
- uricFlag = opts.uric || false;
- uricNoSlashFlag = opts.uricNoSlash || false;
- markFlag = opts.mark || false;
- convertSymbols = opts.symbols === false || opts.lang === false ? false : true;
- separator = opts.separator || separator;
- if (uricFlag) allowedChars += uricChars;
- if (uricNoSlashFlag) allowedChars += uricNoSlashChars;
- if (markFlag) allowedChars += markChars;
- symbol = opts.lang && symbolMap[opts.lang] && convertSymbols ? symbolMap[opts.lang] : convertSymbols ? symbolMap.en : {};
- langChar = opts.lang && langCharMap[opts.lang] ? langCharMap[opts.lang] : opts.lang === false || opts.lang === true ? {} : langCharMap.en;
- if (opts.titleCase && typeof opts.titleCase.length === "number" && Array.prototype.toString.call(opts.titleCase)) {
- opts.titleCase.forEach(function(v) {
- customReplacements[v + ""] = v + "";
- });
- titleCase = true;
- } else titleCase = !!opts.titleCase;
- if (opts.custom && typeof opts.custom.length === "number" && Array.prototype.toString.call(opts.custom)) opts.custom.forEach(function(v) {
- customReplacements[v + ""] = v + "";
- });
- Object.keys(customReplacements).forEach(function(v) {
- var r;
- if (v.length > 1) r = new RegExp("\\b" + escapeChars(v) + "\\b", "gi");
- else r = new RegExp(escapeChars(v), "gi");
- input = input.replace(r, customReplacements[v]);
- });
- for (ch in customReplacements) allowedChars += ch;
- }
- allowedChars += separator;
- allowedChars = escapeChars(allowedChars);
- input = input.replace(/(^\s+|\s+$)/g, "");
- lastCharWasSymbol = false;
- lastCharWasDiatric = false;
- for (i = 0, l = input.length; i < l; i++) {
- ch = input[i];
- if (isReplacedCustomChar(ch, customReplacements)) lastCharWasSymbol = false;
- else if (langChar[ch]) {
- ch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? " " + langChar[ch] : langChar[ch];
- lastCharWasSymbol = false;
- } else if (ch in charMap) {
- if (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {
- diatricString += ch;
- ch = "";
- } else if (lastCharWasDiatric === true) {
- ch = diatricMap[diatricString] + charMap[ch];
- diatricString = "";
- } else ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? " " + charMap[ch] : charMap[ch];
- lastCharWasSymbol = false;
- lastCharWasDiatric = false;
- } else if (ch in diatricMap) {
- diatricString += ch;
- ch = "";
- if (i === l - 1) ch = diatricMap[diatricString];
- lastCharWasDiatric = true;
- } else if (symbol[ch] && !(uricFlag && uricChars.indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars.indexOf(ch) !== -1)) {
- ch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];
- ch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : "";
- lastCharWasSymbol = true;
- } else {
- if (lastCharWasDiatric === true) {
- ch = diatricMap[diatricString] + ch;
- diatricString = "";
- lastCharWasDiatric = false;
- } else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) ch = " " + ch;
- lastCharWasSymbol = false;
- }
- result += ch.replace(new RegExp("[^\\w\\s" + allowedChars + "_-]", "g"), separator);
- }
- if (titleCase) result = result.replace(/(\w)(\S*)/g, function(_, i, r) {
- var j = i.toUpperCase() + (r !== null ? r : "");
- return Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0 ? j : j.toLowerCase();
- });
- result = result.replace(/\s+/g, separator).replace(new RegExp("\\" + separator + "+", "g"), separator).replace(new RegExp("(^\\" + separator + "+|\\" + separator + "+$)", "g"), "");
- if (truncate && result.length > truncate) {
- lucky = result.charAt(truncate) === separator;
- result = result.slice(0, truncate);
- if (!lucky) result = result.slice(0, result.lastIndexOf(separator));
- }
- if (!maintainCase && !titleCase) result = result.toLowerCase();
- return result;
- };
- /**
- * createSlug curried(opts)(input)
- * @param {object|string} opts config object or input string
- * @return {Function} function getSlugWithConfig()
- **/
- var createSlug = function createSlug(opts) {
- /**
- * getSlugWithConfig
- * @param {string} input string
- * @return {string} slug string
- */
- return function getSlugWithConfig(input) {
- return getSlug(input, opts);
- };
- };
- /**
- * escape Chars
- * @param {string} input string
- */
- var escapeChars = function escapeChars(input) {
- return input.replace(/[-\\^$*+?.()|[\]{}\/]/g, "\\$&");
- };
- /**
- * check if the char is an already converted char from custom list
- * @param {char} ch character to check
- * @param {object} customReplacements custom translation map
- */
- var isReplacedCustomChar = function(ch, customReplacements) {
- for (var c in customReplacements) if (customReplacements[c] === ch) return true;
- };
- if (typeof module !== "undefined" && module.exports) {
- module.exports = getSlug;
- module.exports.createSlug = createSlug;
- } else if (typeof define !== "undefined" && define.amd) define([], function() {
- return getSlug;
- });
- else try {
- if (root.getSlug || root.createSlug) throw "speakingurl: globals exists /(getSlug|createSlug)/";
- else {
- root.getSlug = getSlug;
- root.createSlug = createSlug;
- }
- } catch (e) {}
- })(exports);
-}));
-(/* @__PURE__ */ __commonJSMin(((exports, module) => {
- module.exports = require_speakingurl$1();
-})))();
-target.__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__ ??= {
- id: 0,
- appIds: /* @__PURE__ */ new Set()
-};
-function onDevToolsClientConnected(fn) {
- return new Promise((resolve) => {
- if (devtoolsState.connected && devtoolsState.clientConnected) {
- fn();
- resolve();
- return;
- }
- devtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {
- if (state.connected && state.clientConnected) {
- fn();
- resolve();
- }
- });
- });
-}
-function toggleHighPerfMode(state) {
- devtoolsState.highPerfModeEnabled = state ?? !devtoolsState.highPerfModeEnabled;
- if (!state && activeAppRecord.value) registerDevToolsPlugin(activeAppRecord.value.app);
-}
-function updateDevToolsClientDetected(params) {
- devtoolsState.devtoolsClientDetected = {
- ...devtoolsState.devtoolsClientDetected,
- ...params
- };
- toggleHighPerfMode(!Object.values(devtoolsState.devtoolsClientDetected).some(Boolean));
-}
-target.__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__ ??= updateDevToolsClientDetected;
-var DoubleIndexedKV = class {
- constructor() {
- this.keyToValue = /* @__PURE__ */ new Map();
- this.valueToKey = /* @__PURE__ */ new Map();
- }
- set(key, value) {
- this.keyToValue.set(key, value);
- this.valueToKey.set(value, key);
- }
- getByKey(key) {
- return this.keyToValue.get(key);
- }
- getByValue(value) {
- return this.valueToKey.get(value);
- }
- clear() {
- this.keyToValue.clear();
- this.valueToKey.clear();
- }
-};
-var Registry = class {
- constructor(generateIdentifier) {
- this.generateIdentifier = generateIdentifier;
- this.kv = new DoubleIndexedKV();
- }
- register(value, identifier) {
- if (this.kv.getByValue(value)) return;
- if (!identifier) identifier = this.generateIdentifier(value);
- this.kv.set(identifier, value);
- }
- clear() {
- this.kv.clear();
- }
- getIdentifier(value) {
- return this.kv.getByValue(value);
- }
- getValue(identifier) {
- return this.kv.getByKey(identifier);
- }
-};
-var ClassRegistry = class extends Registry {
- constructor() {
- super((c) => c.name);
- this.classToAllowedProps = /* @__PURE__ */ new Map();
- }
- register(value, options) {
- if (typeof options === "object") {
- if (options.allowProps) this.classToAllowedProps.set(value, options.allowProps);
- super.register(value, options.identifier);
- } else super.register(value, options);
- }
- getAllowedProps(value) {
- return this.classToAllowedProps.get(value);
- }
-};
-function valuesOfObj(record) {
- if ("values" in Object) return Object.values(record);
- const values = [];
- for (const key in record) if (record.hasOwnProperty(key)) values.push(record[key]);
- return values;
-}
-function find(record, predicate) {
- const values = valuesOfObj(record);
- if ("find" in values) return values.find(predicate);
- const valuesNotNever = values;
- for (let i = 0; i < valuesNotNever.length; i++) {
- const value = valuesNotNever[i];
- if (predicate(value)) return value;
- }
-}
-function forEach(record, run) {
- Object.entries(record).forEach(([key, value]) => run(value, key));
-}
-function includes(arr, value) {
- return arr.indexOf(value) !== -1;
-}
-function findArr(record, predicate) {
- for (let i = 0; i < record.length; i++) {
- const value = record[i];
- if (predicate(value)) return value;
- }
-}
-var CustomTransformerRegistry = class {
- constructor() {
- this.transfomers = {};
- }
- register(transformer) {
- this.transfomers[transformer.name] = transformer;
- }
- findApplicable(v) {
- return find(this.transfomers, (transformer) => transformer.isApplicable(v));
- }
- findByName(name) {
- return this.transfomers[name];
- }
-};
-var getType$1 = (payload) => Object.prototype.toString.call(payload).slice(8, -1);
-var isUndefined$1 = (payload) => typeof payload === "undefined";
-var isNull$1 = (payload) => payload === null;
-var isPlainObject$2 = (payload) => {
- if (typeof payload !== "object" || payload === null) return false;
- if (payload === Object.prototype) return false;
- if (Object.getPrototypeOf(payload) === null) return true;
- return Object.getPrototypeOf(payload) === Object.prototype;
-};
-var isEmptyObject = (payload) => isPlainObject$2(payload) && Object.keys(payload).length === 0;
-var isArray$2 = (payload) => Array.isArray(payload);
-var isString = (payload) => typeof payload === "string";
-var isNumber = (payload) => typeof payload === "number" && !isNaN(payload);
-var isBoolean = (payload) => typeof payload === "boolean";
-var isRegExp = (payload) => payload instanceof RegExp;
-var isMap = (payload) => payload instanceof Map;
-var isSet = (payload) => payload instanceof Set;
-var isSymbol = (payload) => getType$1(payload) === "Symbol";
-var isDate = (payload) => payload instanceof Date && !isNaN(payload.valueOf());
-var isError = (payload) => payload instanceof Error;
-var isNaNValue = (payload) => typeof payload === "number" && isNaN(payload);
-var isPrimitive = (payload) => isBoolean(payload) || isNull$1(payload) || isUndefined$1(payload) || isNumber(payload) || isString(payload) || isSymbol(payload);
-var isBigint = (payload) => typeof payload === "bigint";
-var isInfinite = (payload) => payload === Infinity || payload === -Infinity;
-var isTypedArray = (payload) => ArrayBuffer.isView(payload) && !(payload instanceof DataView);
-var isURL = (payload) => payload instanceof URL;
-var escapeKey = (key) => key.replace(/\./g, "\\.");
-var stringifyPath = (path) => path.map(String).map(escapeKey).join(".");
-var parsePath = (string) => {
- const result = [];
- let segment = "";
- for (let i = 0; i < string.length; i++) {
- let char = string.charAt(i);
- if (char === "\\" && string.charAt(i + 1) === ".") {
- segment += ".";
- i++;
- continue;
- }
- if (char === ".") {
- result.push(segment);
- segment = "";
- continue;
- }
- segment += char;
- }
- const lastSegment = segment;
- result.push(lastSegment);
- return result;
-};
-function simpleTransformation(isApplicable, annotation, transform, untransform) {
- return {
- isApplicable,
- annotation,
- transform,
- untransform
- };
-}
-var simpleRules = [
- simpleTransformation(isUndefined$1, "undefined", () => null, () => void 0),
- simpleTransformation(isBigint, "bigint", (v) => v.toString(), (v) => {
- if (typeof BigInt !== "undefined") return BigInt(v);
- console.error("Please add a BigInt polyfill.");
- return v;
- }),
- simpleTransformation(isDate, "Date", (v) => v.toISOString(), (v) => new Date(v)),
- simpleTransformation(isError, "Error", (v, superJson) => {
- const baseError = {
- name: v.name,
- message: v.message
- };
- superJson.allowedErrorProps.forEach((prop) => {
- baseError[prop] = v[prop];
- });
- return baseError;
- }, (v, superJson) => {
- const e = new Error(v.message);
- e.name = v.name;
- e.stack = v.stack;
- superJson.allowedErrorProps.forEach((prop) => {
- e[prop] = v[prop];
- });
- return e;
- }),
- simpleTransformation(isRegExp, "regexp", (v) => "" + v, (regex) => {
- const body = regex.slice(1, regex.lastIndexOf("/"));
- const flags = regex.slice(regex.lastIndexOf("/") + 1);
- return new RegExp(body, flags);
- }),
- simpleTransformation(isSet, "set", (v) => [...v.values()], (v) => new Set(v)),
- simpleTransformation(isMap, "map", (v) => [...v.entries()], (v) => new Map(v)),
- simpleTransformation((v) => isNaNValue(v) || isInfinite(v), "number", (v) => {
- if (isNaNValue(v)) return "NaN";
- if (v > 0) return "Infinity";
- else return "-Infinity";
- }, Number),
- simpleTransformation((v) => v === 0 && 1 / v === -Infinity, "number", () => {
- return "-0";
- }, Number),
- simpleTransformation(isURL, "URL", (v) => v.toString(), (v) => new URL(v))
-];
-function compositeTransformation(isApplicable, annotation, transform, untransform) {
- return {
- isApplicable,
- annotation,
- transform,
- untransform
- };
-}
-var symbolRule = compositeTransformation((s, superJson) => {
- if (isSymbol(s)) return !!superJson.symbolRegistry.getIdentifier(s);
- return false;
-}, (s, superJson) => {
- return ["symbol", superJson.symbolRegistry.getIdentifier(s)];
-}, (v) => v.description, (_, a, superJson) => {
- const value = superJson.symbolRegistry.getValue(a[1]);
- if (!value) throw new Error("Trying to deserialize unknown symbol");
- return value;
-});
-var constructorToName = [
- Int8Array,
- Uint8Array,
- Int16Array,
- Uint16Array,
- Int32Array,
- Uint32Array,
- Float32Array,
- Float64Array,
- Uint8ClampedArray
-].reduce((obj, ctor) => {
- obj[ctor.name] = ctor;
- return obj;
-}, {});
-var typedArrayRule = compositeTransformation(isTypedArray, (v) => ["typed-array", v.constructor.name], (v) => [...v], (v, a) => {
- const ctor = constructorToName[a[1]];
- if (!ctor) throw new Error("Trying to deserialize unknown typed array");
- return new ctor(v);
-});
-function isInstanceOfRegisteredClass(potentialClass, superJson) {
- if (potentialClass?.constructor) return !!superJson.classRegistry.getIdentifier(potentialClass.constructor);
- return false;
-}
-var classRule = compositeTransformation(isInstanceOfRegisteredClass, (clazz, superJson) => {
- return ["class", superJson.classRegistry.getIdentifier(clazz.constructor)];
-}, (clazz, superJson) => {
- const allowedProps = superJson.classRegistry.getAllowedProps(clazz.constructor);
- if (!allowedProps) return { ...clazz };
- const result = {};
- allowedProps.forEach((prop) => {
- result[prop] = clazz[prop];
- });
- return result;
-}, (v, a, superJson) => {
- const clazz = superJson.classRegistry.getValue(a[1]);
- if (!clazz) throw new Error(`Trying to deserialize unknown class '${a[1]}' - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564`);
- return Object.assign(Object.create(clazz.prototype), v);
-});
-var customRule = compositeTransformation((value, superJson) => {
- return !!superJson.customTransformerRegistry.findApplicable(value);
-}, (value, superJson) => {
- return ["custom", superJson.customTransformerRegistry.findApplicable(value).name];
-}, (value, superJson) => {
- return superJson.customTransformerRegistry.findApplicable(value).serialize(value);
-}, (v, a, superJson) => {
- const transformer = superJson.customTransformerRegistry.findByName(a[1]);
- if (!transformer) throw new Error("Trying to deserialize unknown custom value");
- return transformer.deserialize(v);
-});
-var compositeRules = [
- classRule,
- symbolRule,
- customRule,
- typedArrayRule
-];
-var transformValue = (value, superJson) => {
- const applicableCompositeRule = findArr(compositeRules, (rule) => rule.isApplicable(value, superJson));
- if (applicableCompositeRule) return {
- value: applicableCompositeRule.transform(value, superJson),
- type: applicableCompositeRule.annotation(value, superJson)
- };
- const applicableSimpleRule = findArr(simpleRules, (rule) => rule.isApplicable(value, superJson));
- if (applicableSimpleRule) return {
- value: applicableSimpleRule.transform(value, superJson),
- type: applicableSimpleRule.annotation
- };
-};
-var simpleRulesByAnnotation = {};
-simpleRules.forEach((rule) => {
- simpleRulesByAnnotation[rule.annotation] = rule;
-});
-var untransformValue = (json, type, superJson) => {
- if (isArray$2(type)) switch (type[0]) {
- case "symbol": return symbolRule.untransform(json, type, superJson);
- case "class": return classRule.untransform(json, type, superJson);
- case "custom": return customRule.untransform(json, type, superJson);
- case "typed-array": return typedArrayRule.untransform(json, type, superJson);
- default: throw new Error("Unknown transformation: " + type);
- }
- else {
- const transformation = simpleRulesByAnnotation[type];
- if (!transformation) throw new Error("Unknown transformation: " + type);
- return transformation.untransform(json, superJson);
- }
-};
-var getNthKey = (value, n) => {
- if (n > value.size) throw new Error("index out of bounds");
- const keys = value.keys();
- while (n > 0) {
- keys.next();
- n--;
- }
- return keys.next().value;
-};
-function validatePath(path) {
- if (includes(path, "__proto__")) throw new Error("__proto__ is not allowed as a property");
- if (includes(path, "prototype")) throw new Error("prototype is not allowed as a property");
- if (includes(path, "constructor")) throw new Error("constructor is not allowed as a property");
-}
-var getDeep = (object, path) => {
- validatePath(path);
- for (let i = 0; i < path.length; i++) {
- const key = path[i];
- if (isSet(object)) object = getNthKey(object, +key);
- else if (isMap(object)) {
- const row = +key;
- const type = +path[++i] === 0 ? "key" : "value";
- const keyOfRow = getNthKey(object, row);
- switch (type) {
- case "key":
- object = keyOfRow;
- break;
- case "value": object = object.get(keyOfRow);
- }
- } else object = object[key];
- }
- return object;
-};
-var setDeep = (object, path, mapper) => {
- validatePath(path);
- if (path.length === 0) return mapper(object);
- let parent = object;
- for (let i = 0; i < path.length - 1; i++) {
- const key = path[i];
- if (isArray$2(parent)) {
- const index = +key;
- parent = parent[index];
- } else if (isPlainObject$2(parent)) parent = parent[key];
- else if (isSet(parent)) {
- const row = +key;
- parent = getNthKey(parent, row);
- } else if (isMap(parent)) {
- if (i === path.length - 2) break;
- const row = +key;
- const type = +path[++i] === 0 ? "key" : "value";
- const keyOfRow = getNthKey(parent, row);
- switch (type) {
- case "key":
- parent = keyOfRow;
- break;
- case "value": parent = parent.get(keyOfRow);
- }
- }
- }
- const lastKey = path[path.length - 1];
- if (isArray$2(parent)) parent[+lastKey] = mapper(parent[+lastKey]);
- else if (isPlainObject$2(parent)) parent[lastKey] = mapper(parent[lastKey]);
- if (isSet(parent)) {
- const oldValue = getNthKey(parent, +lastKey);
- const newValue = mapper(oldValue);
- if (oldValue !== newValue) {
- parent.delete(oldValue);
- parent.add(newValue);
- }
- }
- if (isMap(parent)) {
- const row = +path[path.length - 2];
- const keyToRow = getNthKey(parent, row);
- switch (+lastKey === 0 ? "key" : "value") {
- case "key": {
- const newKey = mapper(keyToRow);
- parent.set(newKey, parent.get(keyToRow));
- if (newKey !== keyToRow) parent.delete(keyToRow);
- break;
- }
- case "value": parent.set(keyToRow, mapper(parent.get(keyToRow)));
- }
- }
- return object;
-};
-function traverse(tree, walker, origin = []) {
- if (!tree) return;
- if (!isArray$2(tree)) {
- forEach(tree, (subtree, key) => traverse(subtree, walker, [...origin, ...parsePath(key)]));
- return;
- }
- const [nodeValue, children] = tree;
- if (children) forEach(children, (child, key) => {
- traverse(child, walker, [...origin, ...parsePath(key)]);
- });
- walker(nodeValue, origin);
-}
-function applyValueAnnotations(plain, annotations, superJson) {
- traverse(annotations, (type, path) => {
- plain = setDeep(plain, path, (v) => untransformValue(v, type, superJson));
- });
- return plain;
-}
-function applyReferentialEqualityAnnotations(plain, annotations) {
- function apply(identicalPaths, path) {
- const object = getDeep(plain, parsePath(path));
- identicalPaths.map(parsePath).forEach((identicalObjectPath) => {
- plain = setDeep(plain, identicalObjectPath, () => object);
- });
- }
- if (isArray$2(annotations)) {
- const [root, other] = annotations;
- root.forEach((identicalPath) => {
- plain = setDeep(plain, parsePath(identicalPath), () => plain);
- });
- if (other) forEach(other, apply);
- } else forEach(annotations, apply);
- return plain;
-}
-var isDeep = (object, superJson) => isPlainObject$2(object) || isArray$2(object) || isMap(object) || isSet(object) || isInstanceOfRegisteredClass(object, superJson);
-function addIdentity(object, path, identities) {
- const existingSet = identities.get(object);
- if (existingSet) existingSet.push(path);
- else identities.set(object, [path]);
-}
-function generateReferentialEqualityAnnotations(identitites, dedupe) {
- const result = {};
- let rootEqualityPaths = void 0;
- identitites.forEach((paths) => {
- if (paths.length <= 1) return;
- if (!dedupe) paths = paths.map((path) => path.map(String)).sort((a, b) => a.length - b.length);
- const [representativePath, ...identicalPaths] = paths;
- if (representativePath.length === 0) rootEqualityPaths = identicalPaths.map(stringifyPath);
- else result[stringifyPath(representativePath)] = identicalPaths.map(stringifyPath);
- });
- if (rootEqualityPaths) if (isEmptyObject(result)) return [rootEqualityPaths];
- else return [rootEqualityPaths, result];
- else return isEmptyObject(result) ? void 0 : result;
-}
-var walker = (object, identities, superJson, dedupe, path = [], objectsInThisPath = [], seenObjects = /* @__PURE__ */ new Map()) => {
- const primitive = isPrimitive(object);
- if (!primitive) {
- addIdentity(object, path, identities);
- const seen = seenObjects.get(object);
- if (seen) return dedupe ? { transformedValue: null } : seen;
- }
- if (!isDeep(object, superJson)) {
- const transformed = transformValue(object, superJson);
- const result = transformed ? {
- transformedValue: transformed.value,
- annotations: [transformed.type]
- } : { transformedValue: object };
- if (!primitive) seenObjects.set(object, result);
- return result;
- }
- if (includes(objectsInThisPath, object)) return { transformedValue: null };
- const transformationResult = transformValue(object, superJson);
- const transformed = transformationResult?.value ?? object;
- const transformedValue = isArray$2(transformed) ? [] : {};
- const innerAnnotations = {};
- forEach(transformed, (value, index) => {
- if (index === "__proto__" || index === "constructor" || index === "prototype") throw new Error(`Detected property ${index}. This is a prototype pollution risk, please remove it from your object.`);
- const recursiveResult = walker(value, identities, superJson, dedupe, [...path, index], [...objectsInThisPath, object], seenObjects);
- transformedValue[index] = recursiveResult.transformedValue;
- if (isArray$2(recursiveResult.annotations)) innerAnnotations[index] = recursiveResult.annotations;
- else if (isPlainObject$2(recursiveResult.annotations)) forEach(recursiveResult.annotations, (tree, key) => {
- innerAnnotations[escapeKey(index) + "." + key] = tree;
- });
- });
- const result = isEmptyObject(innerAnnotations) ? {
- transformedValue,
- annotations: !!transformationResult ? [transformationResult.type] : void 0
- } : {
- transformedValue,
- annotations: !!transformationResult ? [transformationResult.type, innerAnnotations] : innerAnnotations
- };
- if (!primitive) seenObjects.set(object, result);
- return result;
-};
-function getType(payload) {
- return Object.prototype.toString.call(payload).slice(8, -1);
-}
-function isArray$1(payload) {
- return getType(payload) === "Array";
-}
-function isPlainObject$1(payload) {
- if (getType(payload) !== "Object") return false;
- const prototype = Object.getPrototypeOf(payload);
- return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
-}
-function assignProp(carry, key, newVal, originalObject, includeNonenumerable) {
- const propType = {}.propertyIsEnumerable.call(originalObject, key) ? "enumerable" : "nonenumerable";
- if (propType === "enumerable") carry[key] = newVal;
- if (includeNonenumerable && propType === "nonenumerable") Object.defineProperty(carry, key, {
- value: newVal,
- enumerable: false,
- writable: true,
- configurable: true
- });
-}
-function copy(target, options = {}) {
- if (isArray$1(target)) return target.map((item) => copy(item, options));
- if (!isPlainObject$1(target)) return target;
- const props = Object.getOwnPropertyNames(target);
- const symbols = Object.getOwnPropertySymbols(target);
- return [...props, ...symbols].reduce((carry, key) => {
- if (isArray$1(options.props) && !options.props.includes(key)) return carry;
- const val = target[key];
- assignProp(carry, key, copy(val, options), target, options.nonenumerable);
- return carry;
- }, {});
-}
-var SuperJSON = class {
- /**
- * @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`.
- */
- constructor({ dedupe = false } = {}) {
- this.classRegistry = new ClassRegistry();
- this.symbolRegistry = new Registry((s) => s.description ?? "");
- this.customTransformerRegistry = new CustomTransformerRegistry();
- this.allowedErrorProps = [];
- this.dedupe = dedupe;
- }
- serialize(object) {
- const identities = /* @__PURE__ */ new Map();
- const output = walker(object, identities, this, this.dedupe);
- const res = { json: output.transformedValue };
- if (output.annotations) res.meta = {
- ...res.meta,
- values: output.annotations
- };
- const equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe);
- if (equalityAnnotations) res.meta = {
- ...res.meta,
- referentialEqualities: equalityAnnotations
- };
- return res;
- }
- deserialize(payload) {
- const { json, meta } = payload;
- let result = copy(json);
- if (meta?.values) result = applyValueAnnotations(result, meta.values, this);
- if (meta?.referentialEqualities) result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities);
- return result;
- }
- stringify(object) {
- return JSON.stringify(this.serialize(object));
- }
- parse(string) {
- return this.deserialize(JSON.parse(string));
- }
- registerClass(v, options) {
- this.classRegistry.register(v, options);
- }
- registerSymbol(v, identifier) {
- this.symbolRegistry.register(v, identifier);
- }
- registerCustom(transformer, name) {
- this.customTransformerRegistry.register({
- name,
- ...transformer
- });
- }
- allowErrorProps(...props) {
- this.allowedErrorProps.push(...props);
- }
-};
-SuperJSON.defaultInstance = new SuperJSON();
-SuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance);
-SuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance);
-SuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance);
-SuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance);
-SuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance);
-SuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance);
-SuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance);
-SuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance);
-SuperJSON.serialize;
-SuperJSON.deserialize;
-SuperJSON.stringify;
-SuperJSON.parse;
-SuperJSON.registerClass;
-SuperJSON.registerCustom;
-SuperJSON.registerSymbol;
-SuperJSON.allowErrorProps;
-target.__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__ ??= [];
-target.__VUE_DEVTOOLS_KIT_RPC_CLIENT__ ??= null;
-target.__VUE_DEVTOOLS_KIT_RPC_SERVER__ ??= null;
-target.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__ ??= null;
-target.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__ ??= null;
-target.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__ ??= null;
-//#endregion
-export { addCustomCommand, addCustomTab, onDevToolsClientConnected, onDevToolsConnected, removeCustomCommand, setupDevToolsPlugin, setupDevToolsPlugin as setupDevtoolsPlugin };
diff --git a/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js.map b/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js.map
deleted file mode 100644
index 4693ed9..0000000
--- a/apps/docs/.vitepress/cache/deps/vitepress_n_@vue_devtools-api.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"vitepress_n_@vue_devtools-api.js","names":["__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__commonJSMin","__copyProps","__toESM"],"sources":["../../../node_modules/@vue/devtools-shared/dist/index.js","../../../node_modules/perfect-debounce/dist/index.mjs","../../../node_modules/hookable/dist/index.mjs","../../../node_modules/birpc/dist/index.mjs","../../../node_modules/@vue/devtools-kit/dist/index.js"],"sourcesContent":["//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n//#endregion\n//#region src/constants.ts\nconst VIEW_MODE_STORAGE_KEY = \"__vue-devtools-view-mode__\";\nconst VITE_PLUGIN_DETECTED_STORAGE_KEY = \"__vue-devtools-vite-plugin-detected__\";\nconst VITE_PLUGIN_CLIENT_URL_STORAGE_KEY = \"__vue-devtools-vite-plugin-client-url__\";\nconst BROADCAST_CHANNEL_NAME = \"__vue-devtools-broadcast-channel__\";\n//#endregion\n//#region src/env.ts\nconst isBrowser = typeof navigator !== \"undefined\";\nconst target = typeof window !== \"undefined\" ? window : typeof globalThis !== \"undefined\" ? globalThis : typeof global !== \"undefined\" ? global : {};\nconst isInChromePanel = typeof target.chrome !== \"undefined\" && !!target.chrome.devtools;\nconst isInIframe = isBrowser && target.self !== target.top;\nconst isInElectron = typeof navigator !== \"undefined\" && navigator.userAgent?.toLowerCase().includes(\"electron\");\nconst isNuxtApp = typeof window !== \"undefined\" && !!window.__NUXT__;\nconst isInSeparateWindow = !isInIframe && !isInChromePanel && !isInElectron;\n//#endregion\n//#region src/general.ts\nvar import_rfdc = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {\n\tmodule.exports = rfdc;\n\tfunction copyBuffer(cur) {\n\t\tif (cur instanceof Buffer) return Buffer.from(cur);\n\t\treturn new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length);\n\t}\n\tfunction rfdc(opts) {\n\t\topts = opts || {};\n\t\tif (opts.circles) return rfdcCircles(opts);\n\t\tconst constructorHandlers = /* @__PURE__ */ new Map();\n\t\tconstructorHandlers.set(Date, (o) => new Date(o));\n\t\tconstructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn)));\n\t\tconstructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn)));\n\t\tif (opts.constructorHandlers) for (const handler of opts.constructorHandlers) constructorHandlers.set(handler[0], handler[1]);\n\t\tlet handler = null;\n\t\treturn opts.proto ? cloneProto : clone;\n\t\tfunction cloneArray(a, fn) {\n\t\t\tconst keys = Object.keys(a);\n\t\t\tconst a2 = new Array(keys.length);\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\tconst k = keys[i];\n\t\t\t\tconst cur = a[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) a2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) a2[k] = handler(cur, fn);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) a2[k] = copyBuffer(cur);\n\t\t\t\telse a2[k] = fn(cur);\n\t\t\t}\n\t\t\treturn a2;\n\t\t}\n\t\tfunction clone(o) {\n\t\t\tif (typeof o !== \"object\" || o === null) return o;\n\t\t\tif (Array.isArray(o)) return cloneArray(o, clone);\n\t\t\tif (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, clone);\n\t\t\tconst o2 = {};\n\t\t\tfor (const k in o) {\n\t\t\t\tif (Object.hasOwnProperty.call(o, k) === false) continue;\n\t\t\t\tconst cur = o[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) o2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, clone);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);\n\t\t\t\telse o2[k] = clone(cur);\n\t\t\t}\n\t\t\treturn o2;\n\t\t}\n\t\tfunction cloneProto(o) {\n\t\t\tif (typeof o !== \"object\" || o === null) return o;\n\t\t\tif (Array.isArray(o)) return cloneArray(o, cloneProto);\n\t\t\tif (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, cloneProto);\n\t\t\tconst o2 = {};\n\t\t\tfor (const k in o) {\n\t\t\t\tconst cur = o[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) o2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, cloneProto);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);\n\t\t\t\telse o2[k] = cloneProto(cur);\n\t\t\t}\n\t\t\treturn o2;\n\t\t}\n\t}\n\tfunction rfdcCircles(opts) {\n\t\tconst refs = [];\n\t\tconst refsNew = [];\n\t\tconst constructorHandlers = /* @__PURE__ */ new Map();\n\t\tconstructorHandlers.set(Date, (o) => new Date(o));\n\t\tconstructorHandlers.set(Map, (o, fn) => new Map(cloneArray(Array.from(o), fn)));\n\t\tconstructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn)));\n\t\tif (opts.constructorHandlers) for (const handler of opts.constructorHandlers) constructorHandlers.set(handler[0], handler[1]);\n\t\tlet handler = null;\n\t\treturn opts.proto ? cloneProto : clone;\n\t\tfunction cloneArray(a, fn) {\n\t\t\tconst keys = Object.keys(a);\n\t\t\tconst a2 = new Array(keys.length);\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\tconst k = keys[i];\n\t\t\t\tconst cur = a[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) a2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) a2[k] = handler(cur, fn);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) a2[k] = copyBuffer(cur);\n\t\t\t\telse {\n\t\t\t\t\tconst index = refs.indexOf(cur);\n\t\t\t\t\tif (index !== -1) a2[k] = refsNew[index];\n\t\t\t\t\telse a2[k] = fn(cur);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn a2;\n\t\t}\n\t\tfunction clone(o) {\n\t\t\tif (typeof o !== \"object\" || o === null) return o;\n\t\t\tif (Array.isArray(o)) return cloneArray(o, clone);\n\t\t\tif (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, clone);\n\t\t\tconst o2 = {};\n\t\t\trefs.push(o);\n\t\t\trefsNew.push(o2);\n\t\t\tfor (const k in o) {\n\t\t\t\tif (Object.hasOwnProperty.call(o, k) === false) continue;\n\t\t\t\tconst cur = o[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) o2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, clone);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);\n\t\t\t\telse {\n\t\t\t\t\tconst i = refs.indexOf(cur);\n\t\t\t\t\tif (i !== -1) o2[k] = refsNew[i];\n\t\t\t\t\telse o2[k] = clone(cur);\n\t\t\t\t}\n\t\t\t}\n\t\t\trefs.pop();\n\t\t\trefsNew.pop();\n\t\t\treturn o2;\n\t\t}\n\t\tfunction cloneProto(o) {\n\t\t\tif (typeof o !== \"object\" || o === null) return o;\n\t\t\tif (Array.isArray(o)) return cloneArray(o, cloneProto);\n\t\t\tif (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) return handler(o, cloneProto);\n\t\t\tconst o2 = {};\n\t\t\trefs.push(o);\n\t\t\trefsNew.push(o2);\n\t\t\tfor (const k in o) {\n\t\t\t\tconst cur = o[k];\n\t\t\t\tif (typeof cur !== \"object\" || cur === null) o2[k] = cur;\n\t\t\t\telse if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) o2[k] = handler(cur, cloneProto);\n\t\t\t\telse if (ArrayBuffer.isView(cur)) o2[k] = copyBuffer(cur);\n\t\t\t\telse {\n\t\t\t\t\tconst i = refs.indexOf(cur);\n\t\t\t\t\tif (i !== -1) o2[k] = refsNew[i];\n\t\t\t\t\telse o2[k] = cloneProto(cur);\n\t\t\t\t}\n\t\t\t}\n\t\t\trefs.pop();\n\t\t\trefsNew.pop();\n\t\t\treturn o2;\n\t\t}\n\t}\n})))(), 1);\nfunction NOOP() {}\nconst isNumeric = (str) => `${+str}` === str;\nconst isMacOS = () => navigator?.platform ? navigator?.platform.toLowerCase().includes(\"mac\") : /Macintosh/.test(navigator.userAgent);\nconst classifyRE = /(?:^|[-_/])(\\w)/g;\nconst camelizeRE = /-(\\w)/g;\nconst kebabizeRE = /([a-z0-9])([A-Z])/g;\nfunction toUpper(_, c) {\n\treturn c ? c.toUpperCase() : \"\";\n}\nfunction classify(str) {\n\treturn str && `${str}`.replace(classifyRE, toUpper);\n}\nfunction camelize(str) {\n\treturn str && str.replace(camelizeRE, toUpper);\n}\nfunction kebabize(str) {\n\treturn str && str.replace(kebabizeRE, (_, lowerCaseCharacter, upperCaseLetter) => {\n\t\treturn `${lowerCaseCharacter}-${upperCaseLetter}`;\n\t}).toLowerCase();\n}\nfunction basename(filename, ext) {\n\tlet normalizedFilename = filename.replace(/^[a-z]:/i, \"\").replace(/\\\\/g, \"/\");\n\tif (normalizedFilename.endsWith(`index${ext}`)) normalizedFilename = normalizedFilename.replace(`/index${ext}`, ext);\n\tconst lastSlashIndex = normalizedFilename.lastIndexOf(\"/\");\n\tconst baseNameWithExt = normalizedFilename.substring(lastSlashIndex + 1);\n\tif (ext) {\n\t\tconst extIndex = baseNameWithExt.lastIndexOf(ext);\n\t\treturn baseNameWithExt.substring(0, extIndex);\n\t}\n\treturn \"\";\n}\nfunction sortByKey(state) {\n\treturn state && state.slice().sort((a, b) => {\n\t\tif (a.key < b.key) return -1;\n\t\tif (a.key > b.key) return 1;\n\t\treturn 0;\n\t});\n}\nconst HTTP_URL_RE = /^https?:\\/\\//;\n/**\n* Check a string is start with `/` or a valid http url\n*/\nfunction isUrlString(str) {\n\treturn str.startsWith(\"/\") || HTTP_URL_RE.test(str);\n}\n/**\n* @copyright [rfdc](https://github.com/davidmarkclements/rfdc)\n* @description A really fast deep clone alternative\n*/\nconst deepClone = (0, import_rfdc.default)({ circles: true });\nfunction randomStr() {\n\treturn Math.random().toString(36).slice(2);\n}\nfunction isObject(value) {\n\treturn typeof value === \"object\" && !Array.isArray(value) && value !== null;\n}\nfunction isArray(value) {\n\treturn Array.isArray(value);\n}\nfunction isSet(value) {\n\treturn value instanceof Set;\n}\nfunction isMap(value) {\n\treturn value instanceof Map;\n}\n//#endregion\nexport { BROADCAST_CHANNEL_NAME, NOOP, VIEW_MODE_STORAGE_KEY, VITE_PLUGIN_CLIENT_URL_STORAGE_KEY, VITE_PLUGIN_DETECTED_STORAGE_KEY, basename, camelize, classify, deepClone, isArray, isBrowser, isInChromePanel, isInElectron, isInIframe, isInSeparateWindow, isMacOS, isMap, isNumeric, isNuxtApp, isObject, isSet, isUrlString, kebabize, randomStr, sortByKey, target };\n","//#region src/index.ts\nconst DEBOUNCE_DEFAULTS = { trailing: true };\n/**\nDebounce functions\n@param fn - Promise-returning/async function to debounce.\n@param wait - Milliseconds to wait before calling `fn`. Default value is 25ms\n@returns A function that delays calling `fn` until after `wait` milliseconds have elapsed since the last time it was called.\n@example\n```\nimport { debounce } from 'perfect-debounce';\nconst expensiveCall = async input => input;\nconst debouncedFn = debounce(expensiveCall, 200);\nfor (const number of [1, 2, 3]) {\nconsole.log(await debouncedFn(number));\n}\n//=> 1\n//=> 2\n//=> 3\n```\n*/\nfunction debounce(fn, wait = 25, options = {}) {\n\toptions = {\n\t\t...DEBOUNCE_DEFAULTS,\n\t\t...options\n\t};\n\tif (!Number.isFinite(wait)) throw new TypeError(\"Expected `wait` to be a finite number\");\n\tlet leadingValue;\n\tlet timeout;\n\tlet resolveList = [];\n\tlet currentPromise;\n\tlet trailingArgs;\n\tconst applyFn = (_this, args) => {\n\t\tcurrentPromise = _applyPromised(fn, _this, args);\n\t\tcurrentPromise.finally(() => {\n\t\t\tcurrentPromise = null;\n\t\t\tif (options.trailing && trailingArgs && !timeout) {\n\t\t\t\tconst promise = applyFn(_this, trailingArgs);\n\t\t\t\ttrailingArgs = null;\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t});\n\t\treturn currentPromise;\n\t};\n\tconst debounced = function(...args) {\n\t\tif (options.trailing) trailingArgs = args;\n\t\tif (currentPromise) return currentPromise;\n\t\treturn new Promise((resolve) => {\n\t\t\tconst shouldCallNow = !timeout && options.leading;\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\ttimeout = null;\n\t\t\t\tconst promise = options.leading ? leadingValue : applyFn(this, args);\n\t\t\t\ttrailingArgs = null;\n\t\t\t\tfor (const _resolve of resolveList) _resolve(promise);\n\t\t\t\tresolveList = [];\n\t\t\t}, wait);\n\t\t\tif (shouldCallNow) {\n\t\t\t\tleadingValue = applyFn(this, args);\n\t\t\t\tresolve(leadingValue);\n\t\t\t} else resolveList.push(resolve);\n\t\t});\n\t};\n\tconst _clearTimeout = (timer) => {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimeout = null;\n\t\t}\n\t};\n\tdebounced.isPending = () => !!timeout;\n\tdebounced.cancel = () => {\n\t\t_clearTimeout(timeout);\n\t\tresolveList = [];\n\t\ttrailingArgs = null;\n\t};\n\tdebounced.flush = () => {\n\t\t_clearTimeout(timeout);\n\t\tif (!trailingArgs || currentPromise) return;\n\t\tconst args = trailingArgs;\n\t\ttrailingArgs = null;\n\t\treturn applyFn(this, args);\n\t};\n\treturn debounced;\n}\nasync function _applyPromised(fn, _this, args) {\n\treturn await fn.apply(_this, args);\n}\n\n//#endregion\nexport { debounce };","function flatHooks(configHooks, hooks = {}, parentName) {\n for (const key in configHooks) {\n const subHook = configHooks[key];\n const name = parentName ? `${parentName}:${key}` : key;\n if (typeof subHook === \"object\" && subHook !== null) {\n flatHooks(subHook, hooks, name);\n } else if (typeof subHook === \"function\") {\n hooks[name] = subHook;\n }\n }\n return hooks;\n}\nfunction mergeHooks(...hooks) {\n const finalHooks = {};\n for (const hook of hooks) {\n const flatenHook = flatHooks(hook);\n for (const key in flatenHook) {\n if (finalHooks[key]) {\n finalHooks[key].push(flatenHook[key]);\n } else {\n finalHooks[key] = [flatenHook[key]];\n }\n }\n }\n for (const key in finalHooks) {\n if (finalHooks[key].length > 1) {\n const array = finalHooks[key];\n finalHooks[key] = (...arguments_) => serial(array, (function_) => function_(...arguments_));\n } else {\n finalHooks[key] = finalHooks[key][0];\n }\n }\n return finalHooks;\n}\nfunction serial(tasks, function_) {\n return tasks.reduce(\n (promise, task) => promise.then(() => function_(task)),\n Promise.resolve()\n );\n}\nconst defaultTask = { run: (function_) => function_() };\nconst _createTask = () => defaultTask;\nconst createTask = typeof console.createTask !== \"undefined\" ? console.createTask : _createTask;\nfunction serialTaskCaller(hooks, args) {\n const name = args.shift();\n const task = createTask(name);\n return hooks.reduce(\n (promise, hookFunction) => promise.then(() => task.run(() => hookFunction(...args))),\n Promise.resolve()\n );\n}\nfunction parallelTaskCaller(hooks, args) {\n const name = args.shift();\n const task = createTask(name);\n return Promise.all(hooks.map((hook) => task.run(() => hook(...args))));\n}\nfunction serialCaller(hooks, arguments_) {\n return hooks.reduce(\n (promise, hookFunction) => promise.then(() => hookFunction(...arguments_ || [])),\n Promise.resolve()\n );\n}\nfunction parallelCaller(hooks, args) {\n return Promise.all(hooks.map((hook) => hook(...args || [])));\n}\nfunction callEachWith(callbacks, arg0) {\n for (const callback of [...callbacks]) {\n callback(arg0);\n }\n}\n\nclass Hookable {\n constructor() {\n this._hooks = {};\n this._before = void 0;\n this._after = void 0;\n this._deprecatedMessages = void 0;\n this._deprecatedHooks = {};\n this.hook = this.hook.bind(this);\n this.callHook = this.callHook.bind(this);\n this.callHookWith = this.callHookWith.bind(this);\n }\n hook(name, function_, options = {}) {\n if (!name || typeof function_ !== \"function\") {\n return () => {\n };\n }\n const originalName = name;\n let dep;\n while (this._deprecatedHooks[name]) {\n dep = this._deprecatedHooks[name];\n name = dep.to;\n }\n if (dep && !options.allowDeprecated) {\n let message = dep.message;\n if (!message) {\n message = `${originalName} hook has been deprecated` + (dep.to ? `, please use ${dep.to}` : \"\");\n }\n if (!this._deprecatedMessages) {\n this._deprecatedMessages = /* @__PURE__ */ new Set();\n }\n if (!this._deprecatedMessages.has(message)) {\n console.warn(message);\n this._deprecatedMessages.add(message);\n }\n }\n if (!function_.name) {\n try {\n Object.defineProperty(function_, \"name\", {\n get: () => \"_\" + name.replace(/\\W+/g, \"_\") + \"_hook_cb\",\n configurable: true\n });\n } catch {\n }\n }\n this._hooks[name] = this._hooks[name] || [];\n this._hooks[name].push(function_);\n return () => {\n if (function_) {\n this.removeHook(name, function_);\n function_ = void 0;\n }\n };\n }\n hookOnce(name, function_) {\n let _unreg;\n let _function = (...arguments_) => {\n if (typeof _unreg === \"function\") {\n _unreg();\n }\n _unreg = void 0;\n _function = void 0;\n return function_(...arguments_);\n };\n _unreg = this.hook(name, _function);\n return _unreg;\n }\n removeHook(name, function_) {\n if (this._hooks[name]) {\n const index = this._hooks[name].indexOf(function_);\n if (index !== -1) {\n this._hooks[name].splice(index, 1);\n }\n if (this._hooks[name].length === 0) {\n delete this._hooks[name];\n }\n }\n }\n deprecateHook(name, deprecated) {\n this._deprecatedHooks[name] = typeof deprecated === \"string\" ? { to: deprecated } : deprecated;\n const _hooks = this._hooks[name] || [];\n delete this._hooks[name];\n for (const hook of _hooks) {\n this.hook(name, hook);\n }\n }\n deprecateHooks(deprecatedHooks) {\n Object.assign(this._deprecatedHooks, deprecatedHooks);\n for (const name in deprecatedHooks) {\n this.deprecateHook(name, deprecatedHooks[name]);\n }\n }\n addHooks(configHooks) {\n const hooks = flatHooks(configHooks);\n const removeFns = Object.keys(hooks).map(\n (key) => this.hook(key, hooks[key])\n );\n return () => {\n for (const unreg of removeFns.splice(0, removeFns.length)) {\n unreg();\n }\n };\n }\n removeHooks(configHooks) {\n const hooks = flatHooks(configHooks);\n for (const key in hooks) {\n this.removeHook(key, hooks[key]);\n }\n }\n removeAllHooks() {\n for (const key in this._hooks) {\n delete this._hooks[key];\n }\n }\n callHook(name, ...arguments_) {\n arguments_.unshift(name);\n return this.callHookWith(serialTaskCaller, name, ...arguments_);\n }\n callHookParallel(name, ...arguments_) {\n arguments_.unshift(name);\n return this.callHookWith(parallelTaskCaller, name, ...arguments_);\n }\n callHookWith(caller, name, ...arguments_) {\n const event = this._before || this._after ? { name, args: arguments_, context: {} } : void 0;\n if (this._before) {\n callEachWith(this._before, event);\n }\n const result = caller(\n name in this._hooks ? [...this._hooks[name]] : [],\n arguments_\n );\n if (result instanceof Promise) {\n return result.finally(() => {\n if (this._after && event) {\n callEachWith(this._after, event);\n }\n });\n }\n if (this._after && event) {\n callEachWith(this._after, event);\n }\n return result;\n }\n beforeEach(function_) {\n this._before = this._before || [];\n this._before.push(function_);\n return () => {\n if (this._before !== void 0) {\n const index = this._before.indexOf(function_);\n if (index !== -1) {\n this._before.splice(index, 1);\n }\n }\n };\n }\n afterEach(function_) {\n this._after = this._after || [];\n this._after.push(function_);\n return () => {\n if (this._after !== void 0) {\n const index = this._after.indexOf(function_);\n if (index !== -1) {\n this._after.splice(index, 1);\n }\n }\n };\n }\n}\nfunction createHooks() {\n return new Hookable();\n}\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction createDebugger(hooks, _options = {}) {\n const options = {\n inspect: isBrowser,\n group: isBrowser,\n filter: () => true,\n ..._options\n };\n const _filter = options.filter;\n const filter = typeof _filter === \"string\" ? (name) => name.startsWith(_filter) : _filter;\n const _tag = options.tag ? `[${options.tag}] ` : \"\";\n const logPrefix = (event) => _tag + event.name + \"\".padEnd(event._id, \"\\0\");\n const _idCtr = {};\n const unsubscribeBefore = hooks.beforeEach((event) => {\n if (filter !== void 0 && !filter(event.name)) {\n return;\n }\n _idCtr[event.name] = _idCtr[event.name] || 0;\n event._id = _idCtr[event.name]++;\n console.time(logPrefix(event));\n });\n const unsubscribeAfter = hooks.afterEach((event) => {\n if (filter !== void 0 && !filter(event.name)) {\n return;\n }\n if (options.group) {\n console.groupCollapsed(event.name);\n }\n if (options.inspect) {\n console.timeLog(logPrefix(event), event.args);\n } else {\n console.timeEnd(logPrefix(event));\n }\n if (options.group) {\n console.groupEnd();\n }\n _idCtr[event.name]--;\n });\n return {\n /** Stop debugging and remove listeners */\n close: () => {\n unsubscribeBefore();\n unsubscribeAfter();\n }\n };\n}\n\nexport { Hookable, createDebugger, createHooks, flatHooks, mergeHooks, parallelCaller, serial, serialCaller };\n","const TYPE_REQUEST = \"q\";\nconst TYPE_RESPONSE = \"s\";\nconst DEFAULT_TIMEOUT = 6e4;\nfunction defaultSerialize(i) {\n return i;\n}\nconst defaultDeserialize = defaultSerialize;\nconst { clearTimeout, setTimeout } = globalThis;\nconst random = Math.random.bind(Math);\nfunction createBirpc($functions, options) {\n const {\n post,\n on,\n off = () => {\n },\n eventNames = [],\n serialize = defaultSerialize,\n deserialize = defaultDeserialize,\n resolver,\n bind = \"rpc\",\n timeout = DEFAULT_TIMEOUT\n } = options;\n let $closed = false;\n const _rpcPromiseMap = /* @__PURE__ */ new Map();\n let _promiseInit;\n let rpc;\n async function _call(method, args, event, optional) {\n if ($closed)\n throw new Error(`[birpc] rpc is closed, cannot call \"${method}\"`);\n const req = { m: method, a: args, t: TYPE_REQUEST };\n if (optional)\n req.o = true;\n const send = async (_req) => post(serialize(_req));\n if (event) {\n await send(req);\n return;\n }\n if (_promiseInit) {\n try {\n await _promiseInit;\n } finally {\n _promiseInit = void 0;\n }\n }\n let { promise, resolve, reject } = createPromiseWithResolvers();\n const id = nanoid();\n req.i = id;\n let timeoutId;\n async function handler(newReq = req) {\n if (timeout >= 0) {\n timeoutId = setTimeout(() => {\n try {\n const handleResult = options.onTimeoutError?.call(rpc, method, args);\n if (handleResult !== true)\n throw new Error(`[birpc] timeout on calling \"${method}\"`);\n } catch (e) {\n reject(e);\n }\n _rpcPromiseMap.delete(id);\n }, timeout);\n if (typeof timeoutId === \"object\")\n timeoutId = timeoutId.unref?.();\n }\n _rpcPromiseMap.set(id, { resolve, reject, timeoutId, method });\n await send(newReq);\n return promise;\n }\n try {\n if (options.onRequest)\n await options.onRequest.call(rpc, req, handler, resolve);\n else\n await handler();\n } catch (e) {\n if (options.onGeneralError?.call(rpc, e) !== true)\n throw e;\n return;\n } finally {\n clearTimeout(timeoutId);\n _rpcPromiseMap.delete(id);\n }\n return promise;\n }\n const $call = (method, ...args) => _call(method, args, false);\n const $callOptional = (method, ...args) => _call(method, args, false, true);\n const $callEvent = (method, ...args) => _call(method, args, true);\n const $callRaw = (options2) => _call(options2.method, options2.args, options2.event, options2.optional);\n const builtinMethods = {\n $call,\n $callOptional,\n $callEvent,\n $callRaw,\n $rejectPendingCalls,\n get $closed() {\n return $closed;\n },\n get $meta() {\n return options.meta;\n },\n $close,\n $functions\n };\n rpc = new Proxy({}, {\n get(_, method) {\n if (Object.prototype.hasOwnProperty.call(builtinMethods, method))\n return builtinMethods[method];\n if (method === \"then\" && !eventNames.includes(\"then\") && !(\"then\" in $functions))\n return void 0;\n const sendEvent = (...args) => _call(method, args, true);\n if (eventNames.includes(method)) {\n sendEvent.asEvent = sendEvent;\n return sendEvent;\n }\n const sendCall = (...args) => _call(method, args, false);\n sendCall.asEvent = sendEvent;\n return sendCall;\n }\n });\n function $close(customError) {\n $closed = true;\n _rpcPromiseMap.forEach(({ reject, method }) => {\n const error = new Error(`[birpc] rpc is closed, cannot call \"${method}\"`);\n if (customError) {\n customError.cause ??= error;\n return reject(customError);\n }\n reject(error);\n });\n _rpcPromiseMap.clear();\n off(onMessage);\n }\n function $rejectPendingCalls(handler) {\n const entries = Array.from(_rpcPromiseMap.values());\n const handlerResults = entries.map(({ method, reject }) => {\n if (!handler) {\n return reject(new Error(`[birpc]: rejected pending call \"${method}\".`));\n }\n return handler({ method, reject });\n });\n _rpcPromiseMap.clear();\n return handlerResults;\n }\n async function onMessage(data, ...extra) {\n let msg;\n try {\n msg = deserialize(data);\n } catch (e) {\n if (options.onGeneralError?.call(rpc, e) !== true)\n throw e;\n return;\n }\n if (msg.t === TYPE_REQUEST) {\n const { m: method, a: args, o: optional } = msg;\n let result, error;\n let fn = await (resolver ? resolver.call(rpc, method, $functions[method]) : $functions[method]);\n if (optional)\n fn ||= () => void 0;\n if (!fn) {\n error = new Error(`[birpc] function \"${method}\" not found`);\n } else {\n try {\n result = await fn.apply(bind === \"rpc\" ? rpc : $functions, args);\n } catch (e) {\n error = e;\n }\n }\n if (msg.i) {\n if (error && options.onError)\n options.onError.call(rpc, error, method, args);\n if (error && options.onFunctionError) {\n if (options.onFunctionError.call(rpc, error, method, args) === true)\n return;\n }\n if (!error) {\n try {\n await post(serialize({ t: TYPE_RESPONSE, i: msg.i, r: result }), ...extra);\n return;\n } catch (e) {\n error = e;\n if (options.onGeneralError?.call(rpc, e, method, args) !== true)\n throw e;\n }\n }\n try {\n await post(serialize({ t: TYPE_RESPONSE, i: msg.i, e: error }), ...extra);\n } catch (e) {\n if (options.onGeneralError?.call(rpc, e, method, args) !== true)\n throw e;\n }\n }\n } else {\n const { i: ack, r: result, e: error } = msg;\n const promise = _rpcPromiseMap.get(ack);\n if (promise) {\n clearTimeout(promise.timeoutId);\n if (error)\n promise.reject(error);\n else\n promise.resolve(result);\n }\n _rpcPromiseMap.delete(ack);\n }\n }\n _promiseInit = on(onMessage);\n return rpc;\n}\nconst cacheMap = /* @__PURE__ */ new WeakMap();\nfunction cachedMap(items, fn) {\n return items.map((i) => {\n let r = cacheMap.get(i);\n if (!r) {\n r = fn(i);\n cacheMap.set(i, r);\n }\n return r;\n });\n}\nfunction createBirpcGroup(functions, channels, options = {}) {\n const getChannels = () => typeof channels === \"function\" ? channels() : channels;\n const getClients = (channels2 = getChannels()) => cachedMap(channels2, (s) => createBirpc(functions, { ...options, ...s }));\n function _boardcast(method, args, event, optional) {\n const clients = getClients();\n return Promise.all(clients.map((c) => c.$callRaw({ method, args, event, optional })));\n }\n function $call(method, ...args) {\n return _boardcast(method, args, false);\n }\n function $callOptional(method, ...args) {\n return _boardcast(method, args, false, true);\n }\n function $callEvent(method, ...args) {\n return _boardcast(method, args, true);\n }\n const broadcastBuiltin = {\n $call,\n $callOptional,\n $callEvent\n };\n const broadcastProxy = new Proxy({}, {\n get(_, method) {\n if (Object.prototype.hasOwnProperty.call(broadcastBuiltin, method))\n return broadcastBuiltin[method];\n const client = getClients();\n const callbacks = client.map((c) => c[method]);\n const sendCall = (...args) => {\n return Promise.all(callbacks.map((i) => i(...args)));\n };\n sendCall.asEvent = async (...args) => {\n await Promise.all(callbacks.map((i) => i.asEvent(...args)));\n };\n return sendCall;\n }\n });\n function updateChannels(fn) {\n const channels2 = getChannels();\n fn?.(channels2);\n return getClients(channels2);\n }\n getClients();\n return {\n get clients() {\n return getClients();\n },\n functions,\n updateChannels,\n broadcast: broadcastProxy,\n /**\n * @deprecated use `broadcast`\n */\n // @ts-expect-error deprecated\n boardcast: broadcastProxy\n };\n}\nfunction createPromiseWithResolvers() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction nanoid(size = 21) {\n let id = \"\";\n let i = size;\n while (i--)\n id += urlAlphabet[random() * 64 | 0];\n return id;\n}\n\nexport { DEFAULT_TIMEOUT, cachedMap, createBirpc, createBirpcGroup };\n","import { basename, camelize, classify, deepClone, isBrowser, isNuxtApp, isUrlString, kebabize, target } from \"@vue/devtools-shared\";\nimport { debounce } from \"perfect-debounce\";\nimport { createHooks } from \"hookable\";\nimport { createBirpc, createBirpcGroup } from \"birpc\";\n//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\n//#endregion\n//#region src/compat/index.ts\nfunction onLegacyDevToolsPluginApiAvailable(cb) {\n\tif (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__) {\n\t\tcb();\n\t\treturn;\n\t}\n\tObject.defineProperty(target, \"__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__\", {\n\t\tset(value) {\n\t\t\tif (value) cb();\n\t\t},\n\t\tconfigurable: true\n\t});\n}\n//#endregion\n//#region src/core/component/utils/index.ts\nfunction getComponentTypeName(options) {\n\tif (typeof options === \"function\") return options.displayName || options.name || options.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ || \"\";\n\tconst name = options.name || options._componentTag || options.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ || options.__name;\n\tif (name === \"index\" && options.__file?.endsWith(\"index.vue\")) return \"\";\n\treturn name;\n}\nfunction getComponentFileName(options) {\n\tconst file = options.__file;\n\tif (file) return classify(basename(file, \".vue\"));\n}\nfunction getComponentName(options) {\n\tconst name = options.displayName || options.name || options._componentTag;\n\tif (name) return name;\n\treturn getComponentFileName(options);\n}\nfunction saveComponentGussedName(instance, name) {\n\tinstance.type.__VUE_DEVTOOLS_COMPONENT_GUSSED_NAME__ = name;\n\treturn name;\n}\nfunction getAppRecord(instance) {\n\tif (instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__) return instance.__VUE_DEVTOOLS_NEXT_APP_RECORD__;\n\telse if (instance.root) return instance.appContext.app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;\n}\nasync function getComponentId(options) {\n\tconst { app, uid, instance } = options;\n\ttry {\n\t\tif (instance.__VUE_DEVTOOLS_NEXT_UID__) return instance.__VUE_DEVTOOLS_NEXT_UID__;\n\t\tconst appRecord = await getAppRecord(app);\n\t\tif (!appRecord) return null;\n\t\tconst isRoot = appRecord.rootInstance === instance;\n\t\treturn `${appRecord.id}:${isRoot ? \"root\" : uid}`;\n\t} catch (e) {}\n}\nfunction isFragment(instance) {\n\tconst subTreeType = instance.subTree?.type;\n\tconst appRecord = getAppRecord(instance);\n\tif (appRecord) return appRecord?.types?.Fragment === subTreeType;\n\treturn false;\n}\nfunction isBeingDestroyed(instance) {\n\treturn instance._isBeingDestroyed || instance.isUnmounted;\n}\n/**\n* Get the appropriate display name for an instance.\n*\n* @param {Vue} instance\n* @return {string}\n*/\nfunction getInstanceName(instance) {\n\tconst name = getComponentTypeName(instance?.type || {});\n\tif (name) return name;\n\tif (instance?.root === instance) return \"Root\";\n\tfor (const key in instance.parent?.type?.components) if (instance.parent.type.components[key] === instance?.type) return saveComponentGussedName(instance, key);\n\tfor (const key in instance.appContext?.components) if (instance.appContext.components[key] === instance?.type) return saveComponentGussedName(instance, key);\n\tconst fileName = getComponentFileName(instance?.type || {});\n\tif (fileName) return fileName;\n\treturn \"Anonymous Component\";\n}\n/**\n* Returns a devtools unique id for instance.\n* @param {Vue} instance\n*/\nfunction getUniqueComponentId(instance) {\n\treturn `${instance?.appContext?.app?.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ ?? 0}:${instance === instance?.root ? \"root\" : instance.uid}`;\n}\nfunction getRenderKey(value) {\n\tif (value == null) return \"\";\n\tif (typeof value === \"number\") return value;\n\telse if (typeof value === \"string\") return `'${value}'`;\n\telse if (Array.isArray(value)) return \"Array\";\n\telse return \"Object\";\n}\nfunction returnError(cb) {\n\ttry {\n\t\treturn cb();\n\t} catch (e) {\n\t\treturn e;\n\t}\n}\nfunction getComponentInstance(appRecord, instanceId) {\n\tinstanceId = instanceId || `${appRecord.id}:root`;\n\treturn appRecord.instanceMap.get(instanceId) || appRecord.instanceMap.get(\":root\");\n}\nfunction ensurePropertyExists(obj, key, skipObjCheck = false) {\n\treturn skipObjCheck ? key in obj : typeof obj === \"object\" && obj !== null ? key in obj : false;\n}\n//#endregion\n//#region src/core/component/state/bounding-rect.ts\nfunction createRect() {\n\tconst rect = {\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\tright: 0,\n\t\tget width() {\n\t\t\treturn rect.right - rect.left;\n\t\t},\n\t\tget height() {\n\t\t\treturn rect.bottom - rect.top;\n\t\t}\n\t};\n\treturn rect;\n}\nlet range;\nfunction getTextRect(node) {\n\tif (!range) range = document.createRange();\n\trange.selectNode(node);\n\treturn range.getBoundingClientRect();\n}\nfunction getFragmentRect(vnode) {\n\tconst rect = createRect();\n\tif (!vnode.children) return rect;\n\tfor (let i = 0, l = vnode.children.length; i < l; i++) {\n\t\tconst childVnode = vnode.children[i];\n\t\tlet childRect;\n\t\tif (childVnode.component) childRect = getComponentBoundingRect(childVnode.component);\n\t\telse if (childVnode.el) {\n\t\t\tconst el = childVnode.el;\n\t\t\tif (el.nodeType === 1 || el.getBoundingClientRect) childRect = el.getBoundingClientRect();\n\t\t\telse if (el.nodeType === 3 && el.data.trim()) childRect = getTextRect(el);\n\t\t}\n\t\tif (childRect) mergeRects(rect, childRect);\n\t}\n\treturn rect;\n}\nfunction mergeRects(a, b) {\n\tif (!a.top || b.top < a.top) a.top = b.top;\n\tif (!a.bottom || b.bottom > a.bottom) a.bottom = b.bottom;\n\tif (!a.left || b.left < a.left) a.left = b.left;\n\tif (!a.right || b.right > a.right) a.right = b.right;\n\treturn a;\n}\nconst DEFAULT_RECT = {\n\ttop: 0,\n\tleft: 0,\n\tright: 0,\n\tbottom: 0,\n\twidth: 0,\n\theight: 0\n};\nfunction getComponentBoundingRect(instance) {\n\tconst el = instance.subTree.el;\n\tif (typeof window === \"undefined\") return DEFAULT_RECT;\n\tif (isFragment(instance)) return getFragmentRect(instance.subTree);\n\telse if (el?.nodeType === 1) return el?.getBoundingClientRect();\n\telse if (instance.subTree.component) return getComponentBoundingRect(instance.subTree.component);\n\telse return DEFAULT_RECT;\n}\n//#endregion\n//#region src/core/component/tree/el.ts\nfunction getRootElementsFromComponentInstance(instance) {\n\tif (isFragment(instance)) return getFragmentRootElements(instance.subTree);\n\tif (!instance.subTree) return [];\n\treturn [instance.subTree.el];\n}\nfunction getFragmentRootElements(vnode) {\n\tif (!vnode.children) return [];\n\tconst list = [];\n\tvnode.children.forEach((childVnode) => {\n\t\tif (childVnode.component) list.push(...getRootElementsFromComponentInstance(childVnode.component));\n\t\telse if (childVnode?.el) list.push(childVnode.el);\n\t});\n\treturn list;\n}\n//#endregion\n//#region src/core/component-highlighter/index.ts\nconst CONTAINER_ELEMENT_ID = \"__vue-devtools-component-inspector__\";\nconst CARD_ELEMENT_ID = \"__vue-devtools-component-inspector__card__\";\nconst COMPONENT_NAME_ELEMENT_ID = \"__vue-devtools-component-inspector__name__\";\nconst INDICATOR_ELEMENT_ID = \"__vue-devtools-component-inspector__indicator__\";\nconst containerStyles = {\n\tdisplay: \"block\",\n\tzIndex: 2147483640,\n\tposition: \"fixed\",\n\tbackgroundColor: \"#42b88325\",\n\tborder: \"1px solid #42b88350\",\n\tborderRadius: \"5px\",\n\ttransition: \"all 0.1s ease-in\",\n\tpointerEvents: \"none\"\n};\nconst cardStyles = {\n\tfontFamily: \"Arial, Helvetica, sans-serif\",\n\tpadding: \"5px 8px\",\n\tborderRadius: \"4px\",\n\ttextAlign: \"left\",\n\tposition: \"absolute\",\n\tleft: 0,\n\tcolor: \"#e9e9e9\",\n\tfontSize: \"14px\",\n\tfontWeight: 600,\n\tlineHeight: \"24px\",\n\tbackgroundColor: \"#42b883\",\n\tboxShadow: \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)\"\n};\nconst indicatorStyles = {\n\tdisplay: \"inline-block\",\n\tfontWeight: 400,\n\tfontStyle: \"normal\",\n\tfontSize: \"12px\",\n\topacity: .7\n};\nfunction getContainerElement() {\n\treturn document.getElementById(CONTAINER_ELEMENT_ID);\n}\nfunction getCardElement() {\n\treturn document.getElementById(CARD_ELEMENT_ID);\n}\nfunction getIndicatorElement() {\n\treturn document.getElementById(INDICATOR_ELEMENT_ID);\n}\nfunction getNameElement() {\n\treturn document.getElementById(COMPONENT_NAME_ELEMENT_ID);\n}\nfunction getStyles(bounds) {\n\treturn {\n\t\tleft: `${Math.round(bounds.left * 100) / 100}px`,\n\t\ttop: `${Math.round(bounds.top * 100) / 100}px`,\n\t\twidth: `${Math.round(bounds.width * 100) / 100}px`,\n\t\theight: `${Math.round(bounds.height * 100) / 100}px`\n\t};\n}\nfunction create(options) {\n\tconst containerEl = document.createElement(\"div\");\n\tcontainerEl.id = options.elementId ?? CONTAINER_ELEMENT_ID;\n\tObject.assign(containerEl.style, {\n\t\t...containerStyles,\n\t\t...getStyles(options.bounds),\n\t\t...options.style\n\t});\n\tconst cardEl = document.createElement(\"span\");\n\tcardEl.id = CARD_ELEMENT_ID;\n\tObject.assign(cardEl.style, {\n\t\t...cardStyles,\n\t\ttop: options.bounds.top < 35 ? 0 : \"-35px\"\n\t});\n\tconst nameEl = document.createElement(\"span\");\n\tnameEl.id = COMPONENT_NAME_ELEMENT_ID;\n\tnameEl.innerHTML = `<${options.name}> `;\n\tconst indicatorEl = document.createElement(\"i\");\n\tindicatorEl.id = INDICATOR_ELEMENT_ID;\n\tindicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;\n\tObject.assign(indicatorEl.style, indicatorStyles);\n\tcardEl.appendChild(nameEl);\n\tcardEl.appendChild(indicatorEl);\n\tcontainerEl.appendChild(cardEl);\n\tdocument.body.appendChild(containerEl);\n\treturn containerEl;\n}\nfunction update(options) {\n\tconst containerEl = getContainerElement();\n\tconst cardEl = getCardElement();\n\tconst nameEl = getNameElement();\n\tconst indicatorEl = getIndicatorElement();\n\tif (containerEl) {\n\t\tObject.assign(containerEl.style, {\n\t\t\t...containerStyles,\n\t\t\t...getStyles(options.bounds)\n\t\t});\n\t\tObject.assign(cardEl.style, { top: options.bounds.top < 35 ? 0 : \"-35px\" });\n\t\tnameEl.innerHTML = `<${options.name}> `;\n\t\tindicatorEl.innerHTML = `${Math.round(options.bounds.width * 100) / 100} x ${Math.round(options.bounds.height * 100) / 100}`;\n\t}\n}\nfunction highlight(instance) {\n\tconst bounds = getComponentBoundingRect(instance);\n\tif (!bounds.width && !bounds.height) return;\n\tconst name = getInstanceName(instance);\n\tgetContainerElement() ? update({\n\t\tbounds,\n\t\tname\n\t}) : create({\n\t\tbounds,\n\t\tname\n\t});\n}\nfunction unhighlight() {\n\tconst el = getContainerElement();\n\tif (el) el.style.display = \"none\";\n}\nlet inspectInstance = null;\nfunction inspectFn(e) {\n\tconst target = e.target;\n\tif (target) {\n\t\tconst instance = target.__vueParentComponent;\n\t\tif (instance) {\n\t\t\tinspectInstance = instance;\n\t\t\tif (instance.vnode.el) {\n\t\t\t\tconst bounds = getComponentBoundingRect(instance);\n\t\t\t\tconst name = getInstanceName(instance);\n\t\t\t\tgetContainerElement() ? update({\n\t\t\t\t\tbounds,\n\t\t\t\t\tname\n\t\t\t\t}) : create({\n\t\t\t\t\tbounds,\n\t\t\t\t\tname\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\nfunction selectComponentFn(e, cb) {\n\te.preventDefault();\n\te.stopPropagation();\n\tif (inspectInstance) cb(getUniqueComponentId(inspectInstance));\n}\nlet inspectComponentHighLighterSelectFn = null;\nfunction cancelInspectComponentHighLighter() {\n\tunhighlight();\n\twindow.removeEventListener(\"mouseover\", inspectFn);\n\twindow.removeEventListener(\"click\", inspectComponentHighLighterSelectFn, true);\n\tinspectComponentHighLighterSelectFn = null;\n}\nfunction inspectComponentHighLighter() {\n\twindow.addEventListener(\"mouseover\", inspectFn);\n\treturn new Promise((resolve) => {\n\t\tfunction onSelect(e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tselectComponentFn(e, (id) => {\n\t\t\t\twindow.removeEventListener(\"click\", onSelect, true);\n\t\t\t\tinspectComponentHighLighterSelectFn = null;\n\t\t\t\twindow.removeEventListener(\"mouseover\", inspectFn);\n\t\t\t\tconst el = getContainerElement();\n\t\t\t\tif (el) el.style.display = \"none\";\n\t\t\t\tresolve(JSON.stringify({ id }));\n\t\t\t});\n\t\t}\n\t\tinspectComponentHighLighterSelectFn = onSelect;\n\t\twindow.addEventListener(\"click\", onSelect, true);\n\t});\n}\nfunction scrollToComponent(options) {\n\tconst instance = getComponentInstance(activeAppRecord.value, options.id);\n\tif (instance) {\n\t\tconst [el] = getRootElementsFromComponentInstance(instance);\n\t\tif (typeof el.scrollIntoView === \"function\") el.scrollIntoView({ behavior: \"smooth\" });\n\t\telse {\n\t\t\tconst bounds = getComponentBoundingRect(instance);\n\t\t\tconst scrollTarget = document.createElement(\"div\");\n\t\t\tconst styles = {\n\t\t\t\t...getStyles(bounds),\n\t\t\t\tposition: \"absolute\"\n\t\t\t};\n\t\t\tObject.assign(scrollTarget.style, styles);\n\t\t\tdocument.body.appendChild(scrollTarget);\n\t\t\tscrollTarget.scrollIntoView({ behavior: \"smooth\" });\n\t\t\tsetTimeout(() => {\n\t\t\t\tdocument.body.removeChild(scrollTarget);\n\t\t\t}, 2e3);\n\t\t}\n\t\tsetTimeout(() => {\n\t\t\tconst bounds = getComponentBoundingRect(instance);\n\t\t\tif (bounds.width || bounds.height) {\n\t\t\t\tconst name = getInstanceName(instance);\n\t\t\t\tconst el = getContainerElement();\n\t\t\t\tel ? update({\n\t\t\t\t\t...options,\n\t\t\t\t\tname,\n\t\t\t\t\tbounds\n\t\t\t\t}) : create({\n\t\t\t\t\t...options,\n\t\t\t\t\tname,\n\t\t\t\t\tbounds\n\t\t\t\t});\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (el) el.style.display = \"none\";\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t}, 1200);\n\t}\n}\n//#endregion\n//#region src/core/component-inspector/index.ts\ntarget.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__ ??= true;\nfunction toggleComponentInspectorEnabled(enabled) {\n\ttarget.__VUE_DEVTOOLS_COMPONENT_INSPECTOR_ENABLED__ = enabled;\n}\nfunction waitForInspectorInit(cb) {\n\tlet total = 0;\n\tconst timer = setInterval(() => {\n\t\tif (target.__VUE_INSPECTOR__) {\n\t\t\tclearInterval(timer);\n\t\t\ttotal += 30;\n\t\t\tcb();\n\t\t}\n\t\tif (total >= 5e3) clearInterval(timer);\n\t}, 30);\n}\nfunction setupInspector() {\n\tconst inspector = target.__VUE_INSPECTOR__;\n\tconst _openInEditor = inspector.openInEditor;\n\tinspector.openInEditor = async (...params) => {\n\t\tinspector.disable();\n\t\t_openInEditor(...params);\n\t};\n}\nfunction getComponentInspector() {\n\treturn new Promise((resolve) => {\n\t\tfunction setup() {\n\t\t\tsetupInspector();\n\t\t\tresolve(target.__VUE_INSPECTOR__);\n\t\t}\n\t\tif (!target.__VUE_INSPECTOR__) waitForInspectorInit(() => {\n\t\t\tsetup();\n\t\t});\n\t\telse setup();\n\t});\n}\n//#endregion\n//#region src/shared/stub-vue.ts\n/**\n* To prevent include a **HUGE** vue package in the final bundle of chrome ext / electron\n* we stub the necessary vue module.\n* This implementation is based on the 1c3327a0fa5983aa9078e3f7bb2330f572435425 commit\n*/\n/**\n* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/constants.ts#L17-L23)\n*/\nlet ReactiveFlags = /* @__PURE__ */ function(ReactiveFlags) {\n\tReactiveFlags[\"SKIP\"] = \"__v_skip\";\n\tReactiveFlags[\"IS_REACTIVE\"] = \"__v_isReactive\";\n\tReactiveFlags[\"IS_READONLY\"] = \"__v_isReadonly\";\n\tReactiveFlags[\"IS_SHALLOW\"] = \"__v_isShallow\";\n\tReactiveFlags[\"RAW\"] = \"__v_raw\";\n\treturn ReactiveFlags;\n}({});\n/**\n* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L330-L332)\n*/\nfunction isReadonly(value) {\n\treturn !!(value && value[ReactiveFlags.IS_READONLY]);\n}\n/**\n* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L312-L317)\n*/\nfunction isReactive$1(value) {\n\tif (isReadonly(value)) return isReactive$1(value[ReactiveFlags.RAW]);\n\treturn !!(value && value[ReactiveFlags.IS_REACTIVE]);\n}\nfunction isRef$1(r) {\n\treturn !!(r && r.__v_isRef === true);\n}\n/**\n* @from [@vue/reactivity](https://github.com/vuejs/core/blob/1c3327a0fa5983aa9078e3f7bb2330f572435425/packages/reactivity/src/reactive.ts#L372-L375)\n*/\nfunction toRaw$1(observed) {\n\tconst raw = observed && observed[ReactiveFlags.RAW];\n\treturn raw ? toRaw$1(raw) : observed;\n}\n//#endregion\n//#region src/core/component/state/editor.ts\nvar StateEditor = class {\n\tconstructor() {\n\t\tthis.refEditor = new RefStateEditor();\n\t}\n\tset(object, path, value, cb) {\n\t\tconst sections = Array.isArray(path) ? path : path.split(\".\");\n\t\twhile (sections.length > 1) {\n\t\t\tconst section = sections.shift();\n\t\t\tif (object instanceof Map) object = object.get(section);\n\t\t\telse if (object instanceof Set) object = Array.from(object.values())[section];\n\t\t\telse object = object[section];\n\t\t\tif (this.refEditor.isRef(object)) object = this.refEditor.get(object);\n\t\t}\n\t\tconst field = sections[0];\n\t\tconst item = this.refEditor.get(object)[field];\n\t\tif (cb) cb(object, field, value);\n\t\telse if (this.refEditor.isRef(item)) this.refEditor.set(item, value);\n\t\telse object[field] = value;\n\t}\n\tget(object, path) {\n\t\tconst sections = Array.isArray(path) ? path : path.split(\".\");\n\t\tfor (let i = 0; i < sections.length; i++) {\n\t\t\tif (object instanceof Map) object = object.get(sections[i]);\n\t\t\telse object = object[sections[i]];\n\t\t\tif (this.refEditor.isRef(object)) object = this.refEditor.get(object);\n\t\t\tif (!object) return void 0;\n\t\t}\n\t\treturn object;\n\t}\n\thas(object, path, parent = false) {\n\t\tif (typeof object === \"undefined\") return false;\n\t\tconst sections = Array.isArray(path) ? path.slice() : path.split(\".\");\n\t\tconst size = !parent ? 1 : 2;\n\t\twhile (object && sections.length > size) {\n\t\t\tconst section = sections.shift();\n\t\t\tobject = object[section];\n\t\t\tif (this.refEditor.isRef(object)) object = this.refEditor.get(object);\n\t\t}\n\t\treturn object != null && Object.prototype.hasOwnProperty.call(object, sections[0]);\n\t}\n\tcreateDefaultSetCallback(state) {\n\t\treturn (object, field, value) => {\n\t\t\tif (state.remove || state.newKey) if (Array.isArray(object)) object.splice(field, 1);\n\t\t\telse if (toRaw$1(object) instanceof Map) object.delete(field);\n\t\t\telse if (toRaw$1(object) instanceof Set) object.delete(Array.from(object.values())[field]);\n\t\t\telse Reflect.deleteProperty(object, field);\n\t\t\tif (!state.remove) {\n\t\t\t\tconst target = object[state.newKey || field];\n\t\t\t\tif (this.refEditor.isRef(target)) this.refEditor.set(target, value);\n\t\t\t\telse if (toRaw$1(object) instanceof Map) object.set(state.newKey || field, value);\n\t\t\t\telse if (toRaw$1(object) instanceof Set) object.add(value);\n\t\t\t\telse object[state.newKey || field] = value;\n\t\t\t}\n\t\t};\n\t}\n};\nvar RefStateEditor = class {\n\tset(ref, value) {\n\t\tif (isRef$1(ref)) ref.value = value;\n\t\telse {\n\t\t\tif (ref instanceof Set && Array.isArray(value)) {\n\t\t\t\tref.clear();\n\t\t\t\tvalue.forEach((v) => ref.add(v));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst currentKeys = Object.keys(value);\n\t\t\tif (ref instanceof Map) {\n\t\t\t\tconst previousKeysSet = new Set(ref.keys());\n\t\t\t\tcurrentKeys.forEach((key) => {\n\t\t\t\t\tref.set(key, Reflect.get(value, key));\n\t\t\t\t\tpreviousKeysSet.delete(key);\n\t\t\t\t});\n\t\t\t\tpreviousKeysSet.forEach((key) => ref.delete(key));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst previousKeysSet = new Set(Object.keys(ref));\n\t\t\tcurrentKeys.forEach((key) => {\n\t\t\t\tReflect.set(ref, key, Reflect.get(value, key));\n\t\t\t\tpreviousKeysSet.delete(key);\n\t\t\t});\n\t\t\tpreviousKeysSet.forEach((key) => Reflect.deleteProperty(ref, key));\n\t\t}\n\t}\n\tget(ref) {\n\t\treturn isRef$1(ref) ? ref.value : ref;\n\t}\n\tisRef(ref) {\n\t\treturn isRef$1(ref) || isReactive$1(ref);\n\t}\n};\nasync function editComponentState(payload, stateEditor) {\n\tconst { path, nodeId, state, type } = payload;\n\tconst instance = getComponentInstance(activeAppRecord.value, nodeId);\n\tif (!instance) return;\n\tconst targetPath = path.slice();\n\tlet target;\n\tif (Object.keys(instance.props).includes(path[0])) target = instance.props;\n\telse if (instance.devtoolsRawSetupState && Object.keys(instance.devtoolsRawSetupState).includes(path[0])) target = instance.devtoolsRawSetupState;\n\telse if (instance.data && Object.keys(instance.data).includes(path[0])) target = instance.data;\n\telse target = instance.proxy;\n\tif (target && targetPath) {\n\t\tif (state.type === \"object\" && type === \"reactive\") {}\n\t\tstateEditor.set(target, targetPath, state.value, stateEditor.createDefaultSetCallback(state));\n\t}\n}\nconst stateEditor = new StateEditor();\nasync function editState(payload) {\n\teditComponentState(payload, stateEditor);\n}\n//#endregion\n//#region src/core/timeline/storage.ts\nconst TIMELINE_LAYERS_STATE_STORAGE_ID = \"__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS_STATE__\";\nfunction addTimelineLayersStateToStorage(state) {\n\tif (!isBrowser || typeof localStorage === \"undefined\" || localStorage === null) return;\n\tlocalStorage.setItem(TIMELINE_LAYERS_STATE_STORAGE_ID, JSON.stringify(state));\n}\nfunction getTimelineLayersStateFromStorage() {\n\tif (typeof window === \"undefined\" || !isBrowser || typeof localStorage === \"undefined\" || localStorage === null) return {\n\t\trecordingState: false,\n\t\tmouseEventEnabled: false,\n\t\tkeyboardEventEnabled: false,\n\t\tcomponentEventEnabled: false,\n\t\tperformanceEventEnabled: false,\n\t\tselected: \"\"\n\t};\n\tconst state = typeof localStorage.getItem !== \"undefined\" ? localStorage.getItem(TIMELINE_LAYERS_STATE_STORAGE_ID) : null;\n\treturn state ? JSON.parse(state) : {\n\t\trecordingState: false,\n\t\tmouseEventEnabled: false,\n\t\tkeyboardEventEnabled: false,\n\t\tcomponentEventEnabled: false,\n\t\tperformanceEventEnabled: false,\n\t\tselected: \"\"\n\t};\n}\n//#endregion\n//#region src/ctx/timeline.ts\ntarget.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS ??= [];\nconst devtoolsTimelineLayers = new Proxy(target.__VUE_DEVTOOLS_KIT_TIMELINE_LAYERS, { get(target, prop, receiver) {\n\treturn Reflect.get(target, prop, receiver);\n} });\nfunction addTimelineLayer(options, descriptor) {\n\tdevtoolsState.timelineLayersState[descriptor.id] = false;\n\tdevtoolsTimelineLayers.push({\n\t\t...options,\n\t\tdescriptorId: descriptor.id,\n\t\tappRecord: getAppRecord(descriptor.app)\n\t});\n}\nfunction updateTimelineLayersState(state) {\n\tconst updatedState = {\n\t\t...devtoolsState.timelineLayersState,\n\t\t...state\n\t};\n\taddTimelineLayersStateToStorage(updatedState);\n\tupdateDevToolsState({ timelineLayersState: updatedState });\n}\n//#endregion\n//#region src/ctx/inspector.ts\ntarget.__VUE_DEVTOOLS_KIT_INSPECTOR__ ??= [];\nconst devtoolsInspector = new Proxy(target.__VUE_DEVTOOLS_KIT_INSPECTOR__, { get(target, prop, receiver) {\n\treturn Reflect.get(target, prop, receiver);\n} });\nconst callInspectorUpdatedHook = debounce(() => {\n\tdevtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.SEND_INSPECTOR_TO_CLIENT, getActiveInspectors());\n});\nfunction addInspector(inspector, descriptor) {\n\tdevtoolsInspector.push({\n\t\toptions: inspector,\n\t\tdescriptor,\n\t\ttreeFilterPlaceholder: inspector.treeFilterPlaceholder ?? \"Search tree...\",\n\t\tstateFilterPlaceholder: inspector.stateFilterPlaceholder ?? \"Search state...\",\n\t\ttreeFilter: \"\",\n\t\tselectedNodeId: \"\",\n\t\tappRecord: getAppRecord(descriptor.app)\n\t});\n\tcallInspectorUpdatedHook();\n}\nfunction getActiveInspectors() {\n\treturn devtoolsInspector.filter((inspector) => inspector.descriptor.app === activeAppRecord.value.app).filter((inspector) => inspector.descriptor.id !== \"components\").map((inspector) => {\n\t\tconst descriptor = inspector.descriptor;\n\t\tconst options = inspector.options;\n\t\treturn {\n\t\t\tid: options.id,\n\t\t\tlabel: options.label,\n\t\t\tlogo: descriptor.logo,\n\t\t\ticon: `custom-ic-baseline-${options?.icon?.replace(/_/g, \"-\")}`,\n\t\t\tpackageName: descriptor.packageName,\n\t\t\thomepage: descriptor.homepage,\n\t\t\tpluginId: descriptor.id\n\t\t};\n\t});\n}\nfunction getInspectorInfo(id) {\n\tconst inspector = getInspector(id, activeAppRecord.value.app);\n\tif (!inspector) return;\n\tconst descriptor = inspector.descriptor;\n\tconst options = inspector.options;\n\tconst timelineLayers = devtoolsTimelineLayers.filter((layer) => layer.descriptorId === descriptor.id).map((item) => ({\n\t\tid: item.id,\n\t\tlabel: item.label,\n\t\tcolor: item.color\n\t}));\n\treturn {\n\t\tid: options.id,\n\t\tlabel: options.label,\n\t\tlogo: descriptor.logo,\n\t\tpackageName: descriptor.packageName,\n\t\thomepage: descriptor.homepage,\n\t\ttimelineLayers,\n\t\ttreeFilterPlaceholder: inspector.treeFilterPlaceholder,\n\t\tstateFilterPlaceholder: inspector.stateFilterPlaceholder\n\t};\n}\nfunction getInspector(id, app) {\n\treturn devtoolsInspector.find((inspector) => inspector.options.id === id && (app ? inspector.descriptor.app === app : true));\n}\nfunction getInspectorActions(id) {\n\treturn getInspector(id)?.options.actions;\n}\nfunction getInspectorNodeActions(id) {\n\treturn getInspector(id)?.options.nodeActions;\n}\n//#endregion\n//#region src/ctx/hook.ts\nlet DevToolsV6PluginAPIHookKeys = /* @__PURE__ */ function(DevToolsV6PluginAPIHookKeys) {\n\tDevToolsV6PluginAPIHookKeys[\"VISIT_COMPONENT_TREE\"] = \"visitComponentTree\";\n\tDevToolsV6PluginAPIHookKeys[\"INSPECT_COMPONENT\"] = \"inspectComponent\";\n\tDevToolsV6PluginAPIHookKeys[\"EDIT_COMPONENT_STATE\"] = \"editComponentState\";\n\tDevToolsV6PluginAPIHookKeys[\"GET_INSPECTOR_TREE\"] = \"getInspectorTree\";\n\tDevToolsV6PluginAPIHookKeys[\"GET_INSPECTOR_STATE\"] = \"getInspectorState\";\n\tDevToolsV6PluginAPIHookKeys[\"EDIT_INSPECTOR_STATE\"] = \"editInspectorState\";\n\tDevToolsV6PluginAPIHookKeys[\"INSPECT_TIMELINE_EVENT\"] = \"inspectTimelineEvent\";\n\tDevToolsV6PluginAPIHookKeys[\"TIMELINE_CLEARED\"] = \"timelineCleared\";\n\tDevToolsV6PluginAPIHookKeys[\"SET_PLUGIN_SETTINGS\"] = \"setPluginSettings\";\n\treturn DevToolsV6PluginAPIHookKeys;\n}({});\nlet DevToolsContextHookKeys = /* @__PURE__ */ function(DevToolsContextHookKeys) {\n\tDevToolsContextHookKeys[\"ADD_INSPECTOR\"] = \"addInspector\";\n\tDevToolsContextHookKeys[\"SEND_INSPECTOR_TREE\"] = \"sendInspectorTree\";\n\tDevToolsContextHookKeys[\"SEND_INSPECTOR_STATE\"] = \"sendInspectorState\";\n\tDevToolsContextHookKeys[\"CUSTOM_INSPECTOR_SELECT_NODE\"] = \"customInspectorSelectNode\";\n\tDevToolsContextHookKeys[\"TIMELINE_LAYER_ADDED\"] = \"timelineLayerAdded\";\n\tDevToolsContextHookKeys[\"TIMELINE_EVENT_ADDED\"] = \"timelineEventAdded\";\n\tDevToolsContextHookKeys[\"GET_COMPONENT_INSTANCES\"] = \"getComponentInstances\";\n\tDevToolsContextHookKeys[\"GET_COMPONENT_BOUNDS\"] = \"getComponentBounds\";\n\tDevToolsContextHookKeys[\"GET_COMPONENT_NAME\"] = \"getComponentName\";\n\tDevToolsContextHookKeys[\"COMPONENT_HIGHLIGHT\"] = \"componentHighlight\";\n\tDevToolsContextHookKeys[\"COMPONENT_UNHIGHLIGHT\"] = \"componentUnhighlight\";\n\treturn DevToolsContextHookKeys;\n}({});\nlet DevToolsMessagingHookKeys = /* @__PURE__ */ function(DevToolsMessagingHookKeys) {\n\tDevToolsMessagingHookKeys[\"SEND_INSPECTOR_TREE_TO_CLIENT\"] = \"sendInspectorTreeToClient\";\n\tDevToolsMessagingHookKeys[\"SEND_INSPECTOR_STATE_TO_CLIENT\"] = \"sendInspectorStateToClient\";\n\tDevToolsMessagingHookKeys[\"SEND_TIMELINE_EVENT_TO_CLIENT\"] = \"sendTimelineEventToClient\";\n\tDevToolsMessagingHookKeys[\"SEND_INSPECTOR_TO_CLIENT\"] = \"sendInspectorToClient\";\n\tDevToolsMessagingHookKeys[\"SEND_ACTIVE_APP_UNMOUNTED_TO_CLIENT\"] = \"sendActiveAppUpdatedToClient\";\n\tDevToolsMessagingHookKeys[\"DEVTOOLS_STATE_UPDATED\"] = \"devtoolsStateUpdated\";\n\tDevToolsMessagingHookKeys[\"DEVTOOLS_CONNECTED_UPDATED\"] = \"devtoolsConnectedUpdated\";\n\tDevToolsMessagingHookKeys[\"ROUTER_INFO_UPDATED\"] = \"routerInfoUpdated\";\n\treturn DevToolsMessagingHookKeys;\n}({});\nfunction createDevToolsCtxHooks() {\n\tconst hooks = createHooks();\n\thooks.hook(DevToolsContextHookKeys.ADD_INSPECTOR, ({ inspector, plugin }) => {\n\t\taddInspector(inspector, plugin.descriptor);\n\t});\n\tconst debounceSendInspectorTree = debounce(async ({ inspectorId, plugin }) => {\n\t\tif (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;\n\t\tconst inspector = getInspector(inspectorId, plugin.descriptor.app);\n\t\tconst _payload = {\n\t\t\tapp: plugin.descriptor.app,\n\t\t\tinspectorId,\n\t\t\tfilter: inspector?.treeFilter || \"\",\n\t\t\trootNodes: []\n\t\t};\n\t\tawait new Promise((resolve) => {\n\t\t\thooks.callHookWith(async (callbacks) => {\n\t\t\t\tawait Promise.all(callbacks.map((cb) => cb(_payload)));\n\t\t\t\tresolve();\n\t\t\t}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);\n\t\t});\n\t\thooks.callHookWith(async (callbacks) => {\n\t\t\tawait Promise.all(callbacks.map((cb) => cb({\n\t\t\t\tinspectorId,\n\t\t\t\trootNodes: _payload.rootNodes\n\t\t\t})));\n\t\t}, DevToolsMessagingHookKeys.SEND_INSPECTOR_TREE_TO_CLIENT);\n\t}, 120);\n\thooks.hook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, debounceSendInspectorTree);\n\tconst debounceSendInspectorState = debounce(async ({ inspectorId, plugin }) => {\n\t\tif (!inspectorId || !plugin?.descriptor?.app || devtoolsState.highPerfModeEnabled) return;\n\t\tconst inspector = getInspector(inspectorId, plugin.descriptor.app);\n\t\tconst _payload = {\n\t\t\tapp: plugin.descriptor.app,\n\t\t\tinspectorId,\n\t\t\tnodeId: inspector?.selectedNodeId || \"\",\n\t\t\tstate: null\n\t\t};\n\t\tconst ctx = { currentTab: `custom-inspector:${inspectorId}` };\n\t\tif (_payload.nodeId) await new Promise((resolve) => {\n\t\t\thooks.callHookWith(async (callbacks) => {\n\t\t\t\tawait Promise.all(callbacks.map((cb) => cb(_payload, ctx)));\n\t\t\t\tresolve();\n\t\t\t}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);\n\t\t});\n\t\thooks.callHookWith(async (callbacks) => {\n\t\t\tawait Promise.all(callbacks.map((cb) => cb({\n\t\t\t\tinspectorId,\n\t\t\t\tnodeId: _payload.nodeId,\n\t\t\t\tstate: _payload.state\n\t\t\t})));\n\t\t}, DevToolsMessagingHookKeys.SEND_INSPECTOR_STATE_TO_CLIENT);\n\t}, 120);\n\thooks.hook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, debounceSendInspectorState);\n\thooks.hook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, ({ inspectorId, nodeId, plugin }) => {\n\t\tconst inspector = getInspector(inspectorId, plugin.descriptor.app);\n\t\tif (!inspector) return;\n\t\tinspector.selectedNodeId = nodeId;\n\t});\n\thooks.hook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, ({ options, plugin }) => {\n\t\taddTimelineLayer(options, plugin.descriptor);\n\t});\n\thooks.hook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, ({ options, plugin }) => {\n\t\tif (devtoolsState.highPerfModeEnabled || !devtoolsState.timelineLayersState?.[plugin.descriptor.id] && ![\n\t\t\t\"performance\",\n\t\t\t\"component-event\",\n\t\t\t\"keyboard\",\n\t\t\t\"mouse\"\n\t\t].includes(options.layerId)) return;\n\t\thooks.callHookWith(async (callbacks) => {\n\t\t\tawait Promise.all(callbacks.map((cb) => cb(options)));\n\t\t}, DevToolsMessagingHookKeys.SEND_TIMELINE_EVENT_TO_CLIENT);\n\t});\n\thooks.hook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, async ({ app }) => {\n\t\tconst appRecord = app.__VUE_DEVTOOLS_NEXT_APP_RECORD__;\n\t\tif (!appRecord) return null;\n\t\tconst appId = appRecord.id.toString();\n\t\treturn [...appRecord.instanceMap].filter(([key]) => key.split(\":\")[0] === appId).map(([, instance]) => instance);\n\t});\n\thooks.hook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, async ({ instance }) => {\n\t\treturn getComponentBoundingRect(instance);\n\t});\n\thooks.hook(DevToolsContextHookKeys.GET_COMPONENT_NAME, ({ instance }) => {\n\t\treturn getInstanceName(instance);\n\t});\n\thooks.hook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, ({ uid }) => {\n\t\tconst instance = activeAppRecord.value.instanceMap.get(uid);\n\t\tif (instance) highlight(instance);\n\t});\n\thooks.hook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT, () => {\n\t\tunhighlight();\n\t});\n\treturn hooks;\n}\n//#endregion\n//#region src/ctx/state.ts\ntarget.__VUE_DEVTOOLS_KIT_APP_RECORDS__ ??= [];\ntarget.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ ??= {};\ntarget.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ ??= \"\";\ntarget.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__ ??= [];\ntarget.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__ ??= [];\nconst STATE_KEY = \"__VUE_DEVTOOLS_KIT_GLOBAL_STATE__\";\nfunction initStateFactory() {\n\treturn {\n\t\tconnected: false,\n\t\tclientConnected: false,\n\t\tvitePluginDetected: true,\n\t\tappRecords: [],\n\t\tactiveAppRecordId: \"\",\n\t\ttabs: [],\n\t\tcommands: [],\n\t\thighPerfModeEnabled: true,\n\t\tdevtoolsClientDetected: {},\n\t\tperfUniqueGroupId: 0,\n\t\ttimelineLayersState: getTimelineLayersStateFromStorage()\n\t};\n}\ntarget[STATE_KEY] ??= initStateFactory();\nconst callStateUpdatedHook = debounce((state) => {\n\tdevtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_STATE_UPDATED, { state });\n});\nconst callConnectedUpdatedHook = debounce((state, oldState) => {\n\tdevtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, {\n\t\tstate,\n\t\toldState\n\t});\n});\nconst devtoolsAppRecords = new Proxy(target.__VUE_DEVTOOLS_KIT_APP_RECORDS__, { get(_target, prop, receiver) {\n\tif (prop === \"value\") return target.__VUE_DEVTOOLS_KIT_APP_RECORDS__;\n\treturn target.__VUE_DEVTOOLS_KIT_APP_RECORDS__[prop];\n} });\nconst addDevToolsAppRecord = (app) => {\n\ttarget.__VUE_DEVTOOLS_KIT_APP_RECORDS__ = [...target.__VUE_DEVTOOLS_KIT_APP_RECORDS__, app];\n};\nconst removeDevToolsAppRecord = (app) => {\n\ttarget.__VUE_DEVTOOLS_KIT_APP_RECORDS__ = devtoolsAppRecords.value.filter((record) => record.app !== app);\n};\nconst activeAppRecord = new Proxy(target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__, { get(_target, prop, receiver) {\n\tif (prop === \"value\") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__;\n\telse if (prop === \"id\") return target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__;\n\treturn target.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__[prop];\n} });\nfunction updateAllStates() {\n\tcallStateUpdatedHook({\n\t\t...target[STATE_KEY],\n\t\tappRecords: devtoolsAppRecords.value,\n\t\tactiveAppRecordId: activeAppRecord.id,\n\t\ttabs: target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__,\n\t\tcommands: target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__\n\t});\n}\nfunction setActiveAppRecord(app) {\n\ttarget.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD__ = app;\n\tupdateAllStates();\n}\nfunction setActiveAppRecordId(id) {\n\ttarget.__VUE_DEVTOOLS_KIT_ACTIVE_APP_RECORD_ID__ = id;\n\tupdateAllStates();\n}\nconst devtoolsState = new Proxy(target[STATE_KEY], {\n\tget(target$3, property) {\n\t\tif (property === \"appRecords\") return devtoolsAppRecords;\n\t\telse if (property === \"activeAppRecordId\") return activeAppRecord.id;\n\t\telse if (property === \"tabs\") return target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;\n\t\telse if (property === \"commands\") return target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;\n\t\treturn target[STATE_KEY][property];\n\t},\n\tdeleteProperty(target, property) {\n\t\tdelete target[property];\n\t\treturn true;\n\t},\n\tset(target$4, property, value) {\n\t\ttarget$4[property] = value;\n\t\ttarget[STATE_KEY][property] = value;\n\t\treturn true;\n\t}\n});\nfunction resetDevToolsState() {\n\tObject.assign(target[STATE_KEY], initStateFactory());\n}\nfunction updateDevToolsState(state) {\n\tconst oldState = {\n\t\t...target[STATE_KEY],\n\t\tappRecords: devtoolsAppRecords.value,\n\t\tactiveAppRecordId: activeAppRecord.id\n\t};\n\tif (oldState.connected !== state.connected && state.connected || oldState.clientConnected !== state.clientConnected && state.clientConnected) callConnectedUpdatedHook(target[STATE_KEY], oldState);\n\tObject.assign(target[STATE_KEY], state);\n\tupdateAllStates();\n}\nfunction onDevToolsConnected(fn) {\n\treturn new Promise((resolve) => {\n\t\tif (devtoolsState.connected) {\n\t\t\tfn();\n\t\t\tresolve();\n\t\t}\n\t\tdevtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {\n\t\t\tif (state.connected) {\n\t\t\t\tfn();\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t});\n}\nconst resolveIcon = (icon) => {\n\tif (!icon) return;\n\tif (icon.startsWith(\"baseline-\")) return `custom-ic-${icon}`;\n\tif (icon.startsWith(\"i-\") || isUrlString(icon)) return icon;\n\treturn `custom-ic-baseline-${icon}`;\n};\nfunction addCustomTab(tab) {\n\tconst tabs = target.__VUE_DEVTOOLS_KIT_CUSTOM_TABS__;\n\tif (tabs.some((t) => t.name === tab.name)) return;\n\ttabs.push({\n\t\t...tab,\n\t\ticon: resolveIcon(tab.icon)\n\t});\n\tupdateAllStates();\n}\nfunction addCustomCommand(action) {\n\tconst commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;\n\tif (commands.some((t) => t.id === action.id)) return;\n\tcommands.push({\n\t\t...action,\n\t\ticon: resolveIcon(action.icon),\n\t\tchildren: action.children ? action.children.map((child) => ({\n\t\t\t...child,\n\t\t\ticon: resolveIcon(child.icon)\n\t\t})) : void 0\n\t});\n\tupdateAllStates();\n}\nfunction removeCustomCommand(actionId) {\n\tconst commands = target.__VUE_DEVTOOLS_KIT_CUSTOM_COMMANDS__;\n\tconst index = commands.findIndex((t) => t.id === actionId);\n\tif (index === -1) return;\n\tcommands.splice(index, 1);\n\tupdateAllStates();\n}\nfunction toggleClientConnected(state) {\n\tupdateDevToolsState({ clientConnected: state });\n}\n//#endregion\n//#region src/core/open-in-editor/index.ts\nfunction setOpenInEditorBaseUrl(url) {\n\ttarget.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__ = url;\n}\nfunction openInEditor(options = {}) {\n\tconst { file, host, baseUrl = window.location.origin, line = 0, column = 0 } = options;\n\tif (file) {\n\t\tif (host === \"chrome-extension\") {\n\t\t\tconst fileName = file.replace(/\\\\/g, \"\\\\\\\\\");\n\t\t\tconst _baseUrl = window.VUE_DEVTOOLS_CONFIG?.openInEditorHost ?? \"/\";\n\t\t\tfetch(`${_baseUrl}__open-in-editor?file=${encodeURI(file)}`).then((response) => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tconst msg = `Opening component ${fileName} failed`;\n\t\t\t\t\tconsole.log(`%c${msg}`, \"color:red\");\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (devtoolsState.vitePluginDetected) {\n\t\t\tconst _baseUrl = target.__VUE_DEVTOOLS_OPEN_IN_EDITOR_BASE_URL__ ?? baseUrl;\n\t\t\ttarget.__VUE_INSPECTOR__.openInEditor(_baseUrl, file, line, column);\n\t\t}\n\t}\n}\n//#endregion\n//#region src/ctx/plugin.ts\ntarget.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__ ??= [];\nconst devtoolsPluginBuffer = new Proxy(target.__VUE_DEVTOOLS_KIT_PLUGIN_BUFFER__, { get(target, prop, receiver) {\n\treturn Reflect.get(target, prop, receiver);\n} });\nfunction addDevToolsPluginToBuffer(pluginDescriptor, setupFn) {\n\tdevtoolsPluginBuffer.push([pluginDescriptor, setupFn]);\n}\n//#endregion\n//#region src/core/plugin/plugin-settings.ts\nfunction _getSettings(settings) {\n\tconst _settings = {};\n\tObject.keys(settings).forEach((key) => {\n\t\t_settings[key] = settings[key].defaultValue;\n\t});\n\treturn _settings;\n}\nfunction getPluginLocalKey(pluginId) {\n\treturn `__VUE_DEVTOOLS_NEXT_PLUGIN_SETTINGS__${pluginId}__`;\n}\nfunction getPluginSettingsOptions(pluginId) {\n\treturn (devtoolsPluginBuffer.find((item) => item[0].id === pluginId && !!item[0]?.settings)?.[0] ?? null)?.settings ?? null;\n}\nfunction getPluginSettings(pluginId, fallbackValue) {\n\tconst localKey = getPluginLocalKey(pluginId);\n\tif (localKey) {\n\t\tconst localSettings = localStorage.getItem(localKey);\n\t\tif (localSettings) return JSON.parse(localSettings);\n\t}\n\tif (pluginId) return _getSettings((devtoolsPluginBuffer.find((item) => item[0].id === pluginId)?.[0] ?? null)?.settings ?? {});\n\treturn _getSettings(fallbackValue);\n}\nfunction initPluginSettings(pluginId, settings) {\n\tconst localKey = getPluginLocalKey(pluginId);\n\tif (!localStorage.getItem(localKey)) localStorage.setItem(localKey, JSON.stringify(_getSettings(settings)));\n}\nfunction setPluginSettings(pluginId, key, value) {\n\tconst localKey = getPluginLocalKey(pluginId);\n\tconst localSettings = localStorage.getItem(localKey);\n\tconst parsedLocalSettings = JSON.parse(localSettings || \"{}\");\n\tconst updated = {\n\t\t...parsedLocalSettings,\n\t\t[key]: value\n\t};\n\tlocalStorage.setItem(localKey, JSON.stringify(updated));\n\tdevtoolsContext.hooks.callHookWith((callbacks) => {\n\t\tcallbacks.forEach((cb) => cb({\n\t\t\tpluginId,\n\t\t\tkey,\n\t\t\toldValue: parsedLocalSettings[key],\n\t\t\tnewValue: value,\n\t\t\tsettings: updated\n\t\t}));\n\t}, DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS);\n}\n//#endregion\n//#region src/types/hook.ts\nlet DevToolsHooks = /* @__PURE__ */ function(DevToolsHooks) {\n\tDevToolsHooks[\"APP_INIT\"] = \"app:init\";\n\tDevToolsHooks[\"APP_UNMOUNT\"] = \"app:unmount\";\n\tDevToolsHooks[\"COMPONENT_UPDATED\"] = \"component:updated\";\n\tDevToolsHooks[\"COMPONENT_ADDED\"] = \"component:added\";\n\tDevToolsHooks[\"COMPONENT_REMOVED\"] = \"component:removed\";\n\tDevToolsHooks[\"COMPONENT_EMIT\"] = \"component:emit\";\n\tDevToolsHooks[\"PERFORMANCE_START\"] = \"perf:start\";\n\tDevToolsHooks[\"PERFORMANCE_END\"] = \"perf:end\";\n\tDevToolsHooks[\"ADD_ROUTE\"] = \"router:add-route\";\n\tDevToolsHooks[\"REMOVE_ROUTE\"] = \"router:remove-route\";\n\tDevToolsHooks[\"RENDER_TRACKED\"] = \"render:tracked\";\n\tDevToolsHooks[\"RENDER_TRIGGERED\"] = \"render:triggered\";\n\tDevToolsHooks[\"APP_CONNECTED\"] = \"app:connected\";\n\tDevToolsHooks[\"SETUP_DEVTOOLS_PLUGIN\"] = \"devtools-plugin:setup\";\n\treturn DevToolsHooks;\n}({});\n//#endregion\n//#region src/hook/index.ts\nconst devtoolsHooks = target.__VUE_DEVTOOLS_HOOK ??= createHooks();\nconst on = {\n\tvueAppInit(fn) {\n\t\tdevtoolsHooks.hook(DevToolsHooks.APP_INIT, fn);\n\t},\n\tvueAppUnmount(fn) {\n\t\tdevtoolsHooks.hook(DevToolsHooks.APP_UNMOUNT, fn);\n\t},\n\tvueAppConnected(fn) {\n\t\tdevtoolsHooks.hook(DevToolsHooks.APP_CONNECTED, fn);\n\t},\n\tcomponentAdded(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.COMPONENT_ADDED, fn);\n\t},\n\tcomponentEmit(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.COMPONENT_EMIT, fn);\n\t},\n\tcomponentUpdated(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.COMPONENT_UPDATED, fn);\n\t},\n\tcomponentRemoved(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.COMPONENT_REMOVED, fn);\n\t},\n\tsetupDevtoolsPlugin(fn) {\n\t\tdevtoolsHooks.hook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, fn);\n\t},\n\tperfStart(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_START, fn);\n\t},\n\tperfEnd(fn) {\n\t\treturn devtoolsHooks.hook(DevToolsHooks.PERFORMANCE_END, fn);\n\t}\n};\nfunction createDevToolsHook() {\n\treturn {\n\t\tid: \"vue-devtools-next\",\n\t\tdevtoolsVersion: \"7.0\",\n\t\tenabled: false,\n\t\tappRecords: [],\n\t\tapps: [],\n\t\tevents: /* @__PURE__ */ new Map(),\n\t\ton(event, fn) {\n\t\t\tif (!this.events.has(event)) this.events.set(event, []);\n\t\t\tthis.events.get(event)?.push(fn);\n\t\t\treturn () => this.off(event, fn);\n\t\t},\n\t\tonce(event, fn) {\n\t\t\tconst onceFn = (...args) => {\n\t\t\t\tthis.off(event, onceFn);\n\t\t\t\tfn(...args);\n\t\t\t};\n\t\t\tthis.on(event, onceFn);\n\t\t\treturn [event, onceFn];\n\t\t},\n\t\toff(event, fn) {\n\t\t\tif (this.events.has(event)) {\n\t\t\t\tconst eventCallbacks = this.events.get(event);\n\t\t\t\tconst index = eventCallbacks.indexOf(fn);\n\t\t\t\tif (index !== -1) eventCallbacks.splice(index, 1);\n\t\t\t}\n\t\t},\n\t\temit(event, ...payload) {\n\t\t\tif (this.events.has(event)) this.events.get(event).forEach((fn) => fn(...payload));\n\t\t}\n\t};\n}\nfunction subscribeDevToolsHook(hook) {\n\thook.on(DevToolsHooks.APP_INIT, (app, version, types) => {\n\t\tif (app?._instance?.type?.devtools?.hide) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.APP_INIT, app, version, types);\n\t});\n\thook.on(DevToolsHooks.APP_UNMOUNT, (app) => {\n\t\tdevtoolsHooks.callHook(DevToolsHooks.APP_UNMOUNT, app);\n\t});\n\thook.on(DevToolsHooks.COMPONENT_ADDED, async (app, uid, parentUid, component) => {\n\t\tif (app?._instance?.type?.devtools?.hide || devtoolsState.highPerfModeEnabled) return;\n\t\tif (!app || typeof uid !== \"number\" && !uid || !component) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.COMPONENT_ADDED, app, uid, parentUid, component);\n\t});\n\thook.on(DevToolsHooks.COMPONENT_UPDATED, (app, uid, parentUid, component) => {\n\t\tif (!app || typeof uid !== \"number\" && !uid || !component || devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED, app, uid, parentUid, component);\n\t});\n\thook.on(DevToolsHooks.COMPONENT_REMOVED, async (app, uid, parentUid, component) => {\n\t\tif (!app || typeof uid !== \"number\" && !uid || !component || devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.COMPONENT_REMOVED, app, uid, parentUid, component);\n\t});\n\thook.on(DevToolsHooks.COMPONENT_EMIT, async (app, instance, event, params) => {\n\t\tif (!app || !instance || devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.COMPONENT_EMIT, app, instance, event, params);\n\t});\n\thook.on(DevToolsHooks.PERFORMANCE_START, (app, uid, vm, type, time) => {\n\t\tif (!app || devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.PERFORMANCE_START, app, uid, vm, type, time);\n\t});\n\thook.on(DevToolsHooks.PERFORMANCE_END, (app, uid, vm, type, time) => {\n\t\tif (!app || devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.PERFORMANCE_END, app, uid, vm, type, time);\n\t});\n\thook.on(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, (pluginDescriptor, setupFn, options) => {\n\t\tif (options?.target === \"legacy\") return;\n\t\tdevtoolsHooks.callHook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn);\n\t});\n}\nconst hook = {\n\ton,\n\tsetupDevToolsPlugin(pluginDescriptor, setupFn) {\n\t\treturn devtoolsHooks.callHook(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn);\n\t}\n};\n//#endregion\n//#region src/api/v6/index.ts\nvar DevToolsV6PluginAPI = class {\n\tconstructor({ plugin, ctx }) {\n\t\tthis.hooks = ctx.hooks;\n\t\tthis.plugin = plugin;\n\t}\n\tget on() {\n\t\treturn {\n\t\t\tvisitComponentTree: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, handler);\n\t\t\t},\n\t\t\tinspectComponent: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_COMPONENT, handler);\n\t\t\t},\n\t\t\teditComponentState: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_COMPONENT_STATE, handler);\n\t\t\t},\n\t\t\tgetInspectorTree: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE, handler);\n\t\t\t},\n\t\t\tgetInspectorState: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE, handler);\n\t\t\t},\n\t\t\teditInspectorState: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE, handler);\n\t\t\t},\n\t\t\tinspectTimelineEvent: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.INSPECT_TIMELINE_EVENT, handler);\n\t\t\t},\n\t\t\ttimelineCleared: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.TIMELINE_CLEARED, handler);\n\t\t\t},\n\t\t\tsetPluginSettings: (handler) => {\n\t\t\t\tthis.hooks.hook(DevToolsV6PluginAPIHookKeys.SET_PLUGIN_SETTINGS, handler);\n\t\t\t}\n\t\t};\n\t}\n\tnotifyComponentUpdate(instance) {\n\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\tconst inspector = getActiveInspectors().find((i) => i.packageName === this.plugin.descriptor.packageName);\n\t\tif (inspector?.id) {\n\t\t\tif (instance) {\n\t\t\t\tconst args = [\n\t\t\t\t\tinstance.appContext.app,\n\t\t\t\t\tinstance.uid,\n\t\t\t\t\tinstance.parent?.uid,\n\t\t\t\t\tinstance\n\t\t\t\t];\n\t\t\t\tdevtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED, ...args);\n\t\t\t} else devtoolsHooks.callHook(DevToolsHooks.COMPONENT_UPDATED);\n\t\t\tthis.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {\n\t\t\t\tinspectorId: inspector.id,\n\t\t\t\tplugin: this.plugin\n\t\t\t});\n\t\t}\n\t}\n\taddInspector(options) {\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.ADD_INSPECTOR, {\n\t\t\tinspector: options,\n\t\t\tplugin: this.plugin\n\t\t});\n\t\tif (this.plugin.descriptor.settings) initPluginSettings(options.id, this.plugin.descriptor.settings);\n\t}\n\tsendInspectorTree(inspectorId) {\n\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_TREE, {\n\t\t\tinspectorId,\n\t\t\tplugin: this.plugin\n\t\t});\n\t}\n\tsendInspectorState(inspectorId) {\n\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {\n\t\t\tinspectorId,\n\t\t\tplugin: this.plugin\n\t\t});\n\t}\n\tselectInspectorNode(inspectorId, nodeId) {\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.CUSTOM_INSPECTOR_SELECT_NODE, {\n\t\t\tinspectorId,\n\t\t\tnodeId,\n\t\t\tplugin: this.plugin\n\t\t});\n\t}\n\tvisitComponentTree(payload) {\n\t\treturn this.hooks.callHook(DevToolsV6PluginAPIHookKeys.VISIT_COMPONENT_TREE, payload);\n\t}\n\tnow() {\n\t\tif (devtoolsState.highPerfModeEnabled) return 0;\n\t\treturn Date.now();\n\t}\n\taddTimelineLayer(options) {\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.TIMELINE_LAYER_ADDED, {\n\t\t\toptions,\n\t\t\tplugin: this.plugin\n\t\t});\n\t}\n\taddTimelineEvent(options) {\n\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\tthis.hooks.callHook(DevToolsContextHookKeys.TIMELINE_EVENT_ADDED, {\n\t\t\toptions,\n\t\t\tplugin: this.plugin\n\t\t});\n\t}\n\tgetSettings(pluginId) {\n\t\treturn getPluginSettings(pluginId ?? this.plugin.descriptor.id, this.plugin.descriptor.settings);\n\t}\n\tgetComponentInstances(app) {\n\t\treturn this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_INSTANCES, { app });\n\t}\n\tgetComponentBounds(instance) {\n\t\treturn this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_BOUNDS, { instance });\n\t}\n\tgetComponentName(instance) {\n\t\treturn this.hooks.callHook(DevToolsContextHookKeys.GET_COMPONENT_NAME, { instance });\n\t}\n\thighlightElement(instance) {\n\t\tconst uid = instance.__VUE_DEVTOOLS_NEXT_UID__;\n\t\treturn this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_HIGHLIGHT, { uid });\n\t}\n\tunhighlightElement() {\n\t\treturn this.hooks.callHook(DevToolsContextHookKeys.COMPONENT_UNHIGHLIGHT);\n\t}\n};\n//#endregion\n//#region src/api/index.ts\nconst DevToolsPluginAPI = DevToolsV6PluginAPI;\n//#endregion\n//#region src/core/component/state/constants.ts\nconst vueBuiltins = new Set([\n\t\"nextTick\",\n\t\"defineComponent\",\n\t\"defineAsyncComponent\",\n\t\"defineCustomElement\",\n\t\"ref\",\n\t\"computed\",\n\t\"reactive\",\n\t\"readonly\",\n\t\"watchEffect\",\n\t\"watchPostEffect\",\n\t\"watchSyncEffect\",\n\t\"watch\",\n\t\"isRef\",\n\t\"unref\",\n\t\"toRef\",\n\t\"toRefs\",\n\t\"isProxy\",\n\t\"isReactive\",\n\t\"isReadonly\",\n\t\"shallowRef\",\n\t\"triggerRef\",\n\t\"customRef\",\n\t\"shallowReactive\",\n\t\"shallowReadonly\",\n\t\"toRaw\",\n\t\"markRaw\",\n\t\"effectScope\",\n\t\"getCurrentScope\",\n\t\"onScopeDispose\",\n\t\"onMounted\",\n\t\"onUpdated\",\n\t\"onUnmounted\",\n\t\"onBeforeMount\",\n\t\"onBeforeUpdate\",\n\t\"onBeforeUnmount\",\n\t\"onErrorCaptured\",\n\t\"onRenderTracked\",\n\t\"onRenderTriggered\",\n\t\"onActivated\",\n\t\"onDeactivated\",\n\t\"onServerPrefetch\",\n\t\"provide\",\n\t\"inject\",\n\t\"h\",\n\t\"mergeProps\",\n\t\"cloneVNode\",\n\t\"isVNode\",\n\t\"resolveComponent\",\n\t\"resolveDirective\",\n\t\"withDirectives\",\n\t\"withModifiers\"\n]);\nconst symbolRE = /^\\[native Symbol Symbol\\((.*)\\)\\]$/;\nconst rawTypeRE = /^\\[object (\\w+)\\]$/;\nconst specialTypeRE = /^\\[native (\\w+) (.*?)(<>(([\\s\\S])*))?\\]$/;\nconst fnTypeRE = /^(?:function|class) (\\w+)/;\nconst MAX_STRING_SIZE = 1e4;\nconst MAX_ARRAY_SIZE = 5e3;\nconst UNDEFINED = \"__vue_devtool_undefined__\";\nconst INFINITY = \"__vue_devtool_infinity__\";\nconst NEGATIVE_INFINITY = \"__vue_devtool_negative_infinity__\";\nconst NAN = \"__vue_devtool_nan__\";\nconst ESC = {\n\t\"<\": \"<\",\n\t\">\": \">\",\n\t\"\\\"\": \""\",\n\t\"&\": \"&\"\n};\n//#endregion\n//#region src/core/component/state/is.ts\nfunction isVueInstance(value) {\n\tif (!ensurePropertyExists(value, \"_\")) return false;\n\tif (!isPlainObject(value._)) return false;\n\treturn Object.keys(value._).includes(\"vnode\");\n}\nfunction isPlainObject(obj) {\n\treturn Object.prototype.toString.call(obj) === \"[object Object]\";\n}\nfunction isPrimitive$1(data) {\n\tif (data == null) return true;\n\tconst type = typeof data;\n\treturn type === \"string\" || type === \"number\" || type === \"boolean\";\n}\nfunction isRef(raw) {\n\treturn !!raw.__v_isRef;\n}\nfunction isComputed(raw) {\n\treturn isRef(raw) && !!raw.effect;\n}\nfunction isReactive(raw) {\n\treturn !!raw.__v_isReactive;\n}\nfunction isReadOnly(raw) {\n\treturn !!raw.__v_isReadonly;\n}\n//#endregion\n//#region src/core/component/state/util.ts\nconst tokenMap = {\n\t[UNDEFINED]: \"undefined\",\n\t[NAN]: \"NaN\",\n\t[INFINITY]: \"Infinity\",\n\t[NEGATIVE_INFINITY]: \"-Infinity\"\n};\nconst reversedTokenMap = Object.entries(tokenMap).reduce((acc, [key, value]) => {\n\tacc[value] = key;\n\treturn acc;\n}, {});\nfunction internalStateTokenToString(value) {\n\tif (value === null) return \"null\";\n\treturn typeof value === \"string\" && tokenMap[value] || false;\n}\nfunction replaceTokenToString(value) {\n\tconst replaceRegex = new RegExp(`\"(${Object.keys(tokenMap).join(\"|\")})\"`, \"g\");\n\treturn value.replace(replaceRegex, (_, g1) => tokenMap[g1]);\n}\nfunction replaceStringToToken(value) {\n\tconst literalValue = reversedTokenMap[value.trim()];\n\tif (literalValue) return `\"${literalValue}\"`;\n\tconst replaceRegex = new RegExp(`:\\\\s*(${Object.keys(reversedTokenMap).join(\"|\")})`, \"g\");\n\treturn value.replace(replaceRegex, (_, g1) => `:\"${reversedTokenMap[g1]}\"`);\n}\n/**\n* Convert prop type constructor to string.\n*/\nfunction getPropType(type) {\n\tif (Array.isArray(type)) return type.map((t) => getPropType(t)).join(\" or \");\n\tif (type == null) return \"null\";\n\tconst match = type.toString().match(fnTypeRE);\n\treturn typeof type === \"function\" ? match && match[1] || \"any\" : \"any\";\n}\n/**\n* Sanitize data to be posted to the other side.\n* Since the message posted is sent with structured clone,\n* we need to filter out any types that might cause an error.\n*/\nfunction sanitize(data) {\n\tif (!isPrimitive$1(data) && !Array.isArray(data) && !isPlainObject(data)) return Object.prototype.toString.call(data);\n\telse return data;\n}\nfunction getSetupStateType(raw) {\n\ttry {\n\t\treturn {\n\t\t\tref: isRef(raw),\n\t\t\tcomputed: isComputed(raw),\n\t\t\treactive: isReactive(raw),\n\t\t\treadonly: isReadOnly(raw)\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tref: false,\n\t\t\tcomputed: false,\n\t\t\treactive: false,\n\t\t\treadonly: false\n\t\t};\n\t}\n}\nfunction toRaw(value) {\n\tif (value?.__v_raw) return value.__v_raw;\n\treturn value;\n}\nfunction escape(s) {\n\treturn s.replace(/[<>\"&]/g, (s) => {\n\t\treturn ESC[s] || s;\n\t});\n}\n//#endregion\n//#region src/core/component/state/process.ts\nfunction mergeOptions(to, from, instance) {\n\tif (typeof from === \"function\") from = from.options;\n\tif (!from) return to;\n\tconst { mixins, extends: extendsOptions } = from;\n\textendsOptions && mergeOptions(to, extendsOptions, instance);\n\tmixins && mixins.forEach((m) => mergeOptions(to, m, instance));\n\tfor (const key of [\"computed\", \"inject\"]) if (Object.prototype.hasOwnProperty.call(from, key)) {\n\t\tto[key] ??= {};\n\t\tObject.assign(to[key], from[key]);\n\t}\n\treturn to;\n}\nfunction resolveMergedOptions(instance) {\n\tconst raw = instance?.type;\n\tif (!raw) return {};\n\tconst { mixins, extends: extendsOptions } = raw;\n\tconst globalMixins = instance.appContext.mixins;\n\tif (!globalMixins.length && !mixins && !extendsOptions) return raw;\n\tconst options = {};\n\tglobalMixins.forEach((m) => mergeOptions(options, m, instance));\n\tmergeOptions(options, raw, instance);\n\treturn options;\n}\n/**\n* Process the props of an instance.\n* Make sure return a plain object because window.postMessage()\n* will throw an Error if the passed object contains Functions.\n*\n*/\nfunction processProps(instance) {\n\tconst props = [];\n\tconst propDefinitions = instance?.type?.props;\n\tfor (const key in instance?.props) {\n\t\tconst propDefinition = propDefinitions ? propDefinitions[key] : null;\n\t\tconst camelizeKey = camelize(key);\n\t\tprops.push({\n\t\t\ttype: \"props\",\n\t\t\tkey: camelizeKey,\n\t\t\tvalue: returnError(() => instance.props[key]),\n\t\t\teditable: true,\n\t\t\tmeta: propDefinition ? {\n\t\t\t\ttype: propDefinition.type ? getPropType(propDefinition.type) : \"any\",\n\t\t\t\trequired: !!propDefinition.required,\n\t\t\t\t...propDefinition.default ? { default: propDefinition.default.toString() } : {}\n\t\t\t} : { type: \"invalid\" }\n\t\t});\n\t}\n\treturn props;\n}\n/**\n* Process state, filtering out props and \"clean\" the result\n* with a JSON dance. This removes functions which can cause\n* errors during structured clone used by window.postMessage.\n*\n*/\nfunction processState(instance) {\n\tconst type = instance.type;\n\tconst props = type?.props;\n\tconst getters = type.vuex && type.vuex.getters;\n\tconst computedDefs = type.computed;\n\tconst data = {\n\t\t...instance.data,\n\t\t...instance.renderContext\n\t};\n\treturn Object.keys(data).filter((key) => !(props && key in props) && !(getters && key in getters) && !(computedDefs && key in computedDefs)).map((key) => ({\n\t\tkey,\n\t\ttype: \"data\",\n\t\tvalue: returnError(() => data[key]),\n\t\teditable: true\n\t}));\n}\nfunction getStateTypeAndName(info) {\n\tconst stateType = info.computed ? \"computed\" : info.ref ? \"ref\" : info.reactive ? \"reactive\" : null;\n\treturn {\n\t\tstateType,\n\t\tstateTypeName: stateType ? `${stateType.charAt(0).toUpperCase()}${stateType.slice(1)}` : null\n\t};\n}\nfunction processSetupState(instance) {\n\tconst raw = instance.devtoolsRawSetupState || {};\n\treturn Object.keys(instance.setupState).filter((key) => !vueBuiltins.has(key) && key.split(/(?=[A-Z])/)[0] !== \"use\").map((key) => {\n\t\tconst value = returnError(() => toRaw(instance.setupState[key]));\n\t\tconst accessError = value instanceof Error;\n\t\tconst rawData = raw[key];\n\t\tlet result;\n\t\tlet isOtherType = accessError || typeof value === \"function\" || ensurePropertyExists(value, \"render\") && typeof value.render === \"function\" || ensurePropertyExists(value, \"__asyncLoader\") && typeof value.__asyncLoader === \"function\" || typeof value === \"object\" && value && (\"setup\" in value || \"props\" in value) || /^v[A-Z]/.test(key);\n\t\tif (rawData && !accessError) {\n\t\t\tconst info = getSetupStateType(rawData);\n\t\t\tconst { stateType, stateTypeName } = getStateTypeAndName(info);\n\t\t\tconst isState = info.ref || info.computed || info.reactive;\n\t\t\tconst raw = ensurePropertyExists(rawData, \"effect\") ? rawData.effect?.raw?.toString() || rawData.effect?.fn?.toString() : null;\n\t\t\tif (stateType) isOtherType = false;\n\t\t\tresult = {\n\t\t\t\t...stateType ? {\n\t\t\t\t\tstateType,\n\t\t\t\t\tstateTypeName\n\t\t\t\t} : {},\n\t\t\t\t...raw ? { raw } : {},\n\t\t\t\teditable: isState && !info.readonly\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\ttype: isOtherType ? \"setup (other)\" : \"setup\",\n\t\t\t...result\n\t\t};\n\t});\n}\n/**\n* Process the computed properties of an instance.\n*/\nfunction processComputed(instance, mergedType) {\n\tconst type = mergedType;\n\tconst computed = [];\n\tconst defs = type.computed || {};\n\tfor (const key in defs) {\n\t\tconst def = defs[key];\n\t\tconst type = typeof def === \"function\" && def.vuex ? \"vuex bindings\" : \"computed\";\n\t\tcomputed.push({\n\t\t\ttype,\n\t\t\tkey,\n\t\t\tvalue: returnError(() => instance?.proxy?.[key]),\n\t\t\teditable: typeof def.set === \"function\"\n\t\t});\n\t}\n\treturn computed;\n}\nfunction processAttrs(instance) {\n\treturn Object.keys(instance.attrs).map((key) => ({\n\t\ttype: \"attrs\",\n\t\tkey,\n\t\tvalue: returnError(() => instance.attrs[key])\n\t}));\n}\nfunction processProvide(instance) {\n\treturn Reflect.ownKeys(instance.provides).map((key) => ({\n\t\ttype: \"provided\",\n\t\tkey: key.toString(),\n\t\tvalue: returnError(() => instance.provides[key])\n\t}));\n}\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nfunction processInject(instance, mergedType) {\n\tif (!mergedType?.inject) return [];\n\tlet keys;\n\tif (Array.isArray(mergedType.inject)) keys = mergedType.inject.map((key) => ({\n\t\tkey,\n\t\toriginalKey: key\n\t}));\n\telse keys = Reflect.ownKeys(mergedType.inject).map((key) => {\n\t\tconst value = mergedType.inject[key];\n\t\tlet originalKey;\n\t\tif (typeof value === \"string\" || typeof value === \"symbol\") originalKey = value;\n\t\telse originalKey = value.from ?? key;\n\t\treturn {\n\t\t\tkey,\n\t\t\toriginalKey\n\t\t};\n\t});\n\treturn keys.map(({ key, originalKey }) => ({\n\t\ttype: \"injected\",\n\t\tkey: key !== originalKey ? `${String(originalKey)} ➞ ${String(key)}` : String(key),\n\t\tvalue: returnError(() => hasOwn(instance.ctx, key) ? instance.ctx[key] : void 0)\n\t}));\n}\nfunction processRefs(instance) {\n\treturn Object.keys(instance.refs).map((key) => ({\n\t\ttype: \"template refs\",\n\t\tkey,\n\t\tvalue: returnError(() => instance.refs[key])\n\t}));\n}\nconst vnodeEvents = new Set([\n\t\"vnode-before-mount\",\n\t\"vnode-mounted\",\n\t\"vnode-before-update\",\n\t\"vnode-updated\",\n\t\"vnode-before-unmount\",\n\t\"vnode-unmounted\"\n]);\nfunction processEventListeners(instance) {\n\tconst emitsDefinition = instance.type.emits;\n\tconst declaredEmits = Array.isArray(emitsDefinition) ? emitsDefinition : Object.keys(emitsDefinition ?? {});\n\tconst keys = Object.keys(instance?.vnode?.props ?? {});\n\tconst result = [];\n\tfor (const key of keys) {\n\t\tconst [prefix, ...eventNameParts] = key.split(/(?=[A-Z])/);\n\t\tif (prefix === \"on\") {\n\t\t\tconst eventName = eventNameParts.join(\"-\").toLowerCase();\n\t\t\tconst isBuiltIn = vnodeEvents.has(eventName);\n\t\t\tconst isDeclared = declaredEmits.includes(eventName) || declaredEmits.includes(camelize(eventName));\n\t\t\tconst text = isBuiltIn ? \"✅ Built-in\" : isDeclared ? \"✅ Declared\" : \"⚠️ Not declared\";\n\t\t\tresult.push({\n\t\t\t\ttype: \"event listeners\",\n\t\t\t\tkey: eventName,\n\t\t\t\tvalue: { _custom: {\n\t\t\t\t\tdisplayText: text,\n\t\t\t\t\tkey: text,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\ttooltipText: isBuiltIn ? `The event ${escape(eventName)} is part of Vue and doesn't need to be declared by the component` : !isDeclared ? `The event ${escape(eventName)} is not declared in the emits option. It will leak into the component's attributes ($attrs).` : null\n\t\t\t\t} }\n\t\t\t});\n\t\t}\n\t}\n\treturn result;\n}\nfunction processInstanceState(instance) {\n\tconst mergedType = resolveMergedOptions(instance);\n\treturn processProps(instance).concat(processState(instance), processSetupState(instance), processComputed(instance, mergedType), processAttrs(instance), processProvide(instance), processInject(instance, mergedType), processRefs(instance), processEventListeners(instance));\n}\n//#endregion\n//#region src/core/component/state/index.ts\nfunction getInstanceState(params) {\n\tconst instance = getComponentInstance(activeAppRecord.value, params.instanceId);\n\treturn {\n\t\tid: getUniqueComponentId(instance),\n\t\tname: getInstanceName(instance),\n\t\tfile: instance?.type?.__file,\n\t\tstate: processInstanceState(instance),\n\t\tinstance\n\t};\n}\n//#endregion\n//#region src/core/component/tree/filter.ts\nvar ComponentFilter = class {\n\tconstructor(filter) {\n\t\tthis.filter = filter || \"\";\n\t}\n\t/**\n\t* Check if an instance is qualified.\n\t*\n\t* @param {Vue|Vnode} instance\n\t* @return {boolean}\n\t*/\n\tisQualified(instance) {\n\t\tconst name = getInstanceName(instance);\n\t\treturn classify(name).toLowerCase().includes(this.filter) || kebabize(name).toLowerCase().includes(this.filter);\n\t}\n};\nfunction createComponentFilter(filterText) {\n\treturn new ComponentFilter(filterText);\n}\n//#endregion\n//#region src/core/component/tree/walker.ts\nvar ComponentWalker = class {\n\tconstructor(options) {\n\t\tthis.captureIds = /* @__PURE__ */ new Map();\n\t\tconst { filterText = \"\", maxDepth, recursively, api } = options;\n\t\tthis.componentFilter = createComponentFilter(filterText);\n\t\tthis.maxDepth = maxDepth;\n\t\tthis.recursively = recursively;\n\t\tthis.api = api;\n\t}\n\tgetComponentTree(instance) {\n\t\tthis.captureIds = /* @__PURE__ */ new Map();\n\t\treturn this.findQualifiedChildren(instance, 0);\n\t}\n\tgetComponentParents(instance) {\n\t\tthis.captureIds = /* @__PURE__ */ new Map();\n\t\tconst parents = [];\n\t\tthis.captureId(instance);\n\t\tlet parent = instance;\n\t\twhile (parent = parent.parent) {\n\t\t\tthis.captureId(parent);\n\t\t\tparents.push(parent);\n\t\t}\n\t\treturn parents;\n\t}\n\tcaptureId(instance) {\n\t\tif (!instance) return null;\n\t\tconst id = instance.__VUE_DEVTOOLS_NEXT_UID__ != null ? instance.__VUE_DEVTOOLS_NEXT_UID__ : getUniqueComponentId(instance);\n\t\tinstance.__VUE_DEVTOOLS_NEXT_UID__ = id;\n\t\tif (this.captureIds.has(id)) return null;\n\t\telse this.captureIds.set(id, void 0);\n\t\tthis.mark(instance);\n\t\treturn id;\n\t}\n\t/**\n\t* Capture the meta information of an instance. (recursive)\n\t*\n\t* @param {Vue} instance\n\t* @return {object}\n\t*/\n\tasync capture(instance, depth) {\n\t\tif (!instance) return null;\n\t\tconst id = this.captureId(instance);\n\t\tconst name = getInstanceName(instance);\n\t\tconst children = this.getInternalInstanceChildren(instance.subTree).filter((child) => !isBeingDestroyed(child));\n\t\tconst parents = this.getComponentParents(instance) || [];\n\t\tconst inactive = !!instance.isDeactivated || parents.some((parent) => parent.isDeactivated);\n\t\tconst treeNode = {\n\t\t\tuid: instance.uid,\n\t\t\tid,\n\t\t\tname,\n\t\t\trenderKey: getRenderKey(instance.vnode ? instance.vnode.key : null),\n\t\t\tinactive,\n\t\t\tchildren: [],\n\t\t\thasChildren: !!children.length,\n\t\t\tisFragment: isFragment(instance),\n\t\t\ttags: typeof instance.type !== \"function\" ? [] : [{\n\t\t\t\tlabel: \"functional\",\n\t\t\t\ttextColor: 5592405,\n\t\t\t\tbackgroundColor: 15658734\n\t\t\t}],\n\t\t\tautoOpen: this.recursively,\n\t\t\tfile: instance.type.__file || \"\"\n\t\t};\n\t\tif (depth < this.maxDepth || instance.type.__isKeepAlive || parents.some((parent) => parent.type.__isKeepAlive)) treeNode.children = await Promise.all(children.map((child) => this.capture(child, depth + 1)).filter(Boolean));\n\t\tif (this.isKeepAlive(instance)) {\n\t\t\tconst cachedComponents = this.getKeepAliveCachedInstances(instance);\n\t\t\tconst childrenIds = children.map((child) => child.__VUE_DEVTOOLS_NEXT_UID__);\n\t\t\tfor (const cachedChild of cachedComponents) if (!childrenIds.includes(cachedChild.__VUE_DEVTOOLS_NEXT_UID__)) {\n\t\t\t\tconst node = await this.capture({\n\t\t\t\t\t...cachedChild,\n\t\t\t\t\tisDeactivated: true\n\t\t\t\t}, depth + 1);\n\t\t\t\tif (node) treeNode.children.push(node);\n\t\t\t}\n\t\t}\n\t\tconst firstElement = getRootElementsFromComponentInstance(instance)[0];\n\t\tif (firstElement?.parentElement) {\n\t\t\tconst parentInstance = instance.parent;\n\t\t\tconst parentRootElements = parentInstance ? getRootElementsFromComponentInstance(parentInstance) : [];\n\t\t\tlet el = firstElement;\n\t\t\tconst indexList = [];\n\t\t\tdo {\n\t\t\t\tindexList.push(Array.from(el.parentElement.childNodes).indexOf(el));\n\t\t\t\tel = el.parentElement;\n\t\t\t} while (el.parentElement && parentRootElements.length && !parentRootElements.includes(el));\n\t\t\ttreeNode.domOrder = indexList.reverse();\n\t\t} else treeNode.domOrder = [-1];\n\t\tif (instance.suspense?.suspenseKey) {\n\t\t\ttreeNode.tags.push({\n\t\t\t\tlabel: instance.suspense.suspenseKey,\n\t\t\t\tbackgroundColor: 14979812,\n\t\t\t\ttextColor: 16777215\n\t\t\t});\n\t\t\tthis.mark(instance, true);\n\t\t}\n\t\tthis.api.visitComponentTree({\n\t\t\ttreeNode,\n\t\t\tcomponentInstance: instance,\n\t\t\tapp: instance.appContext.app,\n\t\t\tfilter: this.componentFilter.filter\n\t\t});\n\t\treturn treeNode;\n\t}\n\t/**\n\t* Find qualified children from a single instance.\n\t* If the instance itself is qualified, just return itself.\n\t* This is ok because [].concat works in both cases.\n\t*\n\t* @param {Vue|Vnode} instance\n\t* @return {Vue|Array}\n\t*/\n\tasync findQualifiedChildren(instance, depth) {\n\t\tif (this.componentFilter.isQualified(instance) && !instance.type.devtools?.hide) return [await this.capture(instance, depth)];\n\t\telse if (instance.subTree) {\n\t\t\tconst list = this.isKeepAlive(instance) ? this.getKeepAliveCachedInstances(instance) : this.getInternalInstanceChildren(instance.subTree);\n\t\t\treturn this.findQualifiedChildrenFromList(list, depth);\n\t\t} else return [];\n\t}\n\t/**\n\t* Iterate through an array of instances and flatten it into\n\t* an array of qualified instances. This is a depth-first\n\t* traversal - e.g. if an instance is not matched, we will\n\t* recursively go deeper until a qualified child is found.\n\t*\n\t* @param {Array} instances\n\t* @return {Array}\n\t*/\n\tasync findQualifiedChildrenFromList(instances, depth) {\n\t\tinstances = instances.filter((child) => !isBeingDestroyed(child) && !child.type.devtools?.hide);\n\t\tif (!this.componentFilter.filter) return Promise.all(instances.map((child) => this.capture(child, depth)));\n\t\telse return Array.prototype.concat.apply([], await Promise.all(instances.map((i) => this.findQualifiedChildren(i, depth))));\n\t}\n\t/**\n\t* Get children from a component instance.\n\t*/\n\tgetInternalInstanceChildren(subTree, suspense = null) {\n\t\tconst list = [];\n\t\tif (subTree) {\n\t\t\tif (subTree.component) !suspense ? list.push(subTree.component) : list.push({\n\t\t\t\t...subTree.component,\n\t\t\t\tsuspense\n\t\t\t});\n\t\t\telse if (subTree.suspense) {\n\t\t\t\tconst suspenseKey = !subTree.suspense.isInFallback ? \"suspense default\" : \"suspense fallback\";\n\t\t\t\tlist.push(...this.getInternalInstanceChildren(subTree.suspense.activeBranch, {\n\t\t\t\t\t...subTree.suspense,\n\t\t\t\t\tsuspenseKey\n\t\t\t\t}));\n\t\t\t} else if (Array.isArray(subTree.children)) subTree.children.forEach((childSubTree) => {\n\t\t\t\tif (childSubTree.component) !suspense ? list.push(childSubTree.component) : list.push({\n\t\t\t\t\t...childSubTree.component,\n\t\t\t\t\tsuspense\n\t\t\t\t});\n\t\t\t\telse list.push(...this.getInternalInstanceChildren(childSubTree, suspense));\n\t\t\t});\n\t\t}\n\t\treturn list.filter((child) => !isBeingDestroyed(child) && !child.type.devtools?.hide);\n\t}\n\t/**\n\t* Mark an instance as captured and store it in the instance map.\n\t*\n\t* @param {Vue} instance\n\t*/\n\tmark(instance, force = false) {\n\t\tconst instanceMap = getAppRecord(instance).instanceMap;\n\t\tif (force || !instanceMap.has(instance.__VUE_DEVTOOLS_NEXT_UID__)) {\n\t\t\tinstanceMap.set(instance.__VUE_DEVTOOLS_NEXT_UID__, instance);\n\t\t\tactiveAppRecord.value.instanceMap = instanceMap;\n\t\t}\n\t}\n\tisKeepAlive(instance) {\n\t\treturn instance.type.__isKeepAlive && instance.__v_cache;\n\t}\n\tgetKeepAliveCachedInstances(instance) {\n\t\treturn Array.from(instance.__v_cache.values()).map((vnode) => vnode.component).filter(Boolean);\n\t}\n};\n//#endregion\n//#region src/core/timeline/perf.ts\nconst markEndQueue = /* @__PURE__ */ new Map();\nconst PERFORMANCE_EVENT_LAYER_ID = \"performance\";\nasync function performanceMarkStart(api, app, uid, vm, type, time) {\n\tconst appRecord = await getAppRecord(app);\n\tif (!appRecord) return;\n\tconst componentName = getInstanceName(vm) || \"Unknown Component\";\n\tconst groupId = devtoolsState.perfUniqueGroupId++;\n\tconst groupKey = `${uid}-${type}`;\n\tappRecord.perfGroupIds.set(groupKey, {\n\t\tgroupId,\n\t\ttime\n\t});\n\tawait api.addTimelineEvent({\n\t\tlayerId: PERFORMANCE_EVENT_LAYER_ID,\n\t\tevent: {\n\t\t\ttime: Date.now(),\n\t\t\tdata: {\n\t\t\t\tcomponent: componentName,\n\t\t\t\ttype,\n\t\t\t\tmeasure: \"start\"\n\t\t\t},\n\t\t\ttitle: componentName,\n\t\t\tsubtitle: type,\n\t\t\tgroupId\n\t\t}\n\t});\n\tif (markEndQueue.has(groupKey)) {\n\t\tconst { app, uid, instance, type, time } = markEndQueue.get(groupKey);\n\t\tmarkEndQueue.delete(groupKey);\n\t\tawait performanceMarkEnd(api, app, uid, instance, type, time);\n\t}\n}\nfunction performanceMarkEnd(api, app, uid, vm, type, time) {\n\tconst appRecord = getAppRecord(app);\n\tif (!appRecord) return;\n\tconst componentName = getInstanceName(vm) || \"Unknown Component\";\n\tconst groupKey = `${uid}-${type}`;\n\tconst groupInfo = appRecord.perfGroupIds.get(groupKey);\n\tif (groupInfo) {\n\t\tconst groupId = groupInfo.groupId;\n\t\tconst duration = time - groupInfo.time;\n\t\tapi.addTimelineEvent({\n\t\t\tlayerId: PERFORMANCE_EVENT_LAYER_ID,\n\t\t\tevent: {\n\t\t\t\ttime: Date.now(),\n\t\t\t\tdata: {\n\t\t\t\t\tcomponent: componentName,\n\t\t\t\t\ttype,\n\t\t\t\t\tmeasure: \"end\",\n\t\t\t\t\tduration: { _custom: {\n\t\t\t\t\t\ttype: \"Duration\",\n\t\t\t\t\t\tvalue: duration,\n\t\t\t\t\t\tdisplay: `${duration} ms`\n\t\t\t\t\t} }\n\t\t\t\t},\n\t\t\t\ttitle: componentName,\n\t\t\t\tsubtitle: type,\n\t\t\t\tgroupId\n\t\t\t}\n\t\t});\n\t} else markEndQueue.set(groupKey, {\n\t\tapp,\n\t\tuid,\n\t\tinstance: vm,\n\t\ttype,\n\t\ttime\n\t});\n}\n//#endregion\n//#region src/core/timeline/index.ts\nconst COMPONENT_EVENT_LAYER_ID = \"component-event\";\nfunction setupBuiltinTimelineLayers(api) {\n\tif (!isBrowser) return;\n\tapi.addTimelineLayer({\n\t\tid: \"mouse\",\n\t\tlabel: \"Mouse\",\n\t\tcolor: 10768815\n\t});\n\t[\n\t\t\"mousedown\",\n\t\t\"mouseup\",\n\t\t\"click\",\n\t\t\"dblclick\"\n\t].forEach((eventType) => {\n\t\tif (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.mouseEventEnabled) return;\n\t\twindow.addEventListener(eventType, async (event) => {\n\t\t\tawait api.addTimelineEvent({\n\t\t\t\tlayerId: \"mouse\",\n\t\t\t\tevent: {\n\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttype: eventType,\n\t\t\t\t\t\tx: event.clientX,\n\t\t\t\t\t\ty: event.clientY\n\t\t\t\t\t},\n\t\t\t\t\ttitle: eventType\n\t\t\t\t}\n\t\t\t});\n\t\t}, {\n\t\t\tcapture: true,\n\t\t\tpassive: true\n\t\t});\n\t});\n\tapi.addTimelineLayer({\n\t\tid: \"keyboard\",\n\t\tlabel: \"Keyboard\",\n\t\tcolor: 8475055\n\t});\n\t[\n\t\t\"keyup\",\n\t\t\"keydown\",\n\t\t\"keypress\"\n\t].forEach((eventType) => {\n\t\twindow.addEventListener(eventType, async (event) => {\n\t\t\tif (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.keyboardEventEnabled) return;\n\t\t\tawait api.addTimelineEvent({\n\t\t\t\tlayerId: \"keyboard\",\n\t\t\t\tevent: {\n\t\t\t\t\ttime: Date.now(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttype: eventType,\n\t\t\t\t\t\tkey: event.key,\n\t\t\t\t\t\tctrlKey: event.ctrlKey,\n\t\t\t\t\t\tshiftKey: event.shiftKey,\n\t\t\t\t\t\taltKey: event.altKey,\n\t\t\t\t\t\tmetaKey: event.metaKey\n\t\t\t\t\t},\n\t\t\t\t\ttitle: event.key\n\t\t\t\t}\n\t\t\t});\n\t\t}, {\n\t\t\tcapture: true,\n\t\t\tpassive: true\n\t\t});\n\t});\n\tapi.addTimelineLayer({\n\t\tid: COMPONENT_EVENT_LAYER_ID,\n\t\tlabel: \"Component events\",\n\t\tcolor: 5226637\n\t});\n\thook.on.componentEmit(async (app, instance, event, params) => {\n\t\tif (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.componentEventEnabled) return;\n\t\tconst appRecord = await getAppRecord(app);\n\t\tif (!appRecord) return;\n\t\tconst componentId = `${appRecord.id}:${instance.uid}`;\n\t\tconst componentName = getInstanceName(instance) || \"Unknown Component\";\n\t\tapi.addTimelineEvent({\n\t\t\tlayerId: COMPONENT_EVENT_LAYER_ID,\n\t\t\tevent: {\n\t\t\t\ttime: Date.now(),\n\t\t\t\tdata: {\n\t\t\t\t\tcomponent: { _custom: {\n\t\t\t\t\t\ttype: \"component-definition\",\n\t\t\t\t\t\tdisplay: componentName\n\t\t\t\t\t} },\n\t\t\t\t\tevent,\n\t\t\t\t\tparams\n\t\t\t\t},\n\t\t\t\ttitle: event,\n\t\t\t\tsubtitle: `by ${componentName}`,\n\t\t\t\tmeta: { componentId }\n\t\t\t}\n\t\t});\n\t});\n\tapi.addTimelineLayer({\n\t\tid: \"performance\",\n\t\tlabel: PERFORMANCE_EVENT_LAYER_ID,\n\t\tcolor: 4307050\n\t});\n\thook.on.perfStart((app, uid, vm, type, time) => {\n\t\tif (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.performanceEventEnabled) return;\n\t\tperformanceMarkStart(api, app, uid, vm, type, time);\n\t});\n\thook.on.perfEnd((app, uid, vm, type, time) => {\n\t\tif (!devtoolsState.timelineLayersState.recordingState || !devtoolsState.timelineLayersState.performanceEventEnabled) return;\n\t\tperformanceMarkEnd(api, app, uid, vm, type, time);\n\t});\n}\n//#endregion\n//#region src/core/vm/index.ts\nconst MAX_$VM = 10;\nconst $vmQueue = [];\nfunction exposeInstanceToWindow(componentInstance) {\n\tif (typeof window === \"undefined\") return;\n\tconst win = window;\n\tif (!componentInstance) return;\n\twin.$vm = componentInstance;\n\tif ($vmQueue[0] !== componentInstance) {\n\t\tif ($vmQueue.length >= MAX_$VM) $vmQueue.pop();\n\t\tfor (let i = $vmQueue.length; i > 0; i--) win[`$vm${i}`] = $vmQueue[i] = $vmQueue[i - 1];\n\t\twin.$vm0 = $vmQueue[0] = componentInstance;\n\t}\n}\n//#endregion\n//#region src/core/plugin/components.ts\nconst INSPECTOR_ID = \"components\";\nfunction createComponentsDevToolsPlugin(app) {\n\tconst descriptor = {\n\t\tid: INSPECTOR_ID,\n\t\tlabel: \"Components\",\n\t\tapp\n\t};\n\tconst setupFn = (api) => {\n\t\tapi.addInspector({\n\t\t\tid: INSPECTOR_ID,\n\t\t\tlabel: \"Components\",\n\t\t\ttreeFilterPlaceholder: \"Search components\"\n\t\t});\n\t\tsetupBuiltinTimelineLayers(api);\n\t\tapi.on.getInspectorTree(async (payload) => {\n\t\t\tif (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n\t\t\t\tconst instance = getComponentInstance(activeAppRecord.value, payload.instanceId);\n\t\t\t\tif (instance) payload.rootNodes = await new ComponentWalker({\n\t\t\t\t\tfilterText: payload.filter,\n\t\t\t\t\tmaxDepth: 100,\n\t\t\t\t\trecursively: false,\n\t\t\t\t\tapi\n\t\t\t\t}).getComponentTree(instance);\n\t\t\t}\n\t\t});\n\t\tapi.on.getInspectorState(async (payload) => {\n\t\t\tif (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n\t\t\t\tconst result = getInstanceState({ instanceId: payload.nodeId });\n\t\t\t\tconst componentInstance = result.instance;\n\t\t\t\tconst _payload = {\n\t\t\t\t\tcomponentInstance,\n\t\t\t\t\tapp: result.instance?.appContext.app,\n\t\t\t\t\tinstanceData: result\n\t\t\t\t};\n\t\t\t\tdevtoolsContext.hooks.callHookWith((callbacks) => {\n\t\t\t\t\tcallbacks.forEach((cb) => cb(_payload));\n\t\t\t\t}, DevToolsV6PluginAPIHookKeys.INSPECT_COMPONENT);\n\t\t\t\tpayload.state = result;\n\t\t\t\texposeInstanceToWindow(componentInstance);\n\t\t\t}\n\t\t});\n\t\tapi.on.editInspectorState(async (payload) => {\n\t\t\tif (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n\t\t\t\teditState(payload);\n\t\t\t\tawait api.sendInspectorState(\"components\");\n\t\t\t}\n\t\t});\n\t\tconst debounceSendInspectorTree = debounce(() => {\n\t\t\tapi.sendInspectorTree(INSPECTOR_ID);\n\t\t}, 120);\n\t\tconst debounceSendInspectorState = debounce(() => {\n\t\t\tapi.sendInspectorState(INSPECTOR_ID);\n\t\t}, 120);\n\t\thook.on.componentAdded(async (app, uid, parentUid, component) => {\n\t\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\t\tif (app?._instance?.type?.devtools?.hide) return;\n\t\t\tif (!app || typeof uid !== \"number\" && !uid || !component) return;\n\t\t\tconst id = await getComponentId({\n\t\t\t\tapp,\n\t\t\t\tuid,\n\t\t\t\tinstance: component\n\t\t\t});\n\t\t\tconst appRecord = await getAppRecord(app);\n\t\t\tif (component) {\n\t\t\t\tif (component.__VUE_DEVTOOLS_NEXT_UID__ == null) component.__VUE_DEVTOOLS_NEXT_UID__ = id;\n\t\t\t\tif (!appRecord?.instanceMap.has(id)) {\n\t\t\t\t\tappRecord?.instanceMap.set(id, component);\n\t\t\t\t\tif (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!appRecord) return;\n\t\t\tdebounceSendInspectorTree();\n\t\t});\n\t\thook.on.componentUpdated(async (app, uid, parentUid, component) => {\n\t\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\t\tif (app?._instance?.type?.devtools?.hide) return;\n\t\t\tif (!app || typeof uid !== \"number\" && !uid || !component) return;\n\t\t\tconst id = await getComponentId({\n\t\t\t\tapp,\n\t\t\t\tuid,\n\t\t\t\tinstance: component\n\t\t\t});\n\t\t\tconst appRecord = await getAppRecord(app);\n\t\t\tif (component) {\n\t\t\t\tif (component.__VUE_DEVTOOLS_NEXT_UID__ == null) component.__VUE_DEVTOOLS_NEXT_UID__ = id;\n\t\t\t\tif (!appRecord?.instanceMap.has(id)) {\n\t\t\t\t\tappRecord?.instanceMap.set(id, component);\n\t\t\t\t\tif (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!appRecord) return;\n\t\t\tdebounceSendInspectorTree();\n\t\t\tdebounceSendInspectorState();\n\t\t});\n\t\thook.on.componentRemoved(async (app, uid, parentUid, component) => {\n\t\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\t\tif (app?._instance?.type?.devtools?.hide) return;\n\t\t\tif (!app || typeof uid !== \"number\" && !uid || !component) return;\n\t\t\tconst appRecord = await getAppRecord(app);\n\t\t\tif (!appRecord) return;\n\t\t\tconst id = await getComponentId({\n\t\t\t\tapp,\n\t\t\t\tuid,\n\t\t\t\tinstance: component\n\t\t\t});\n\t\t\tappRecord?.instanceMap.delete(id);\n\t\t\tif (activeAppRecord.value.id === appRecord?.id) activeAppRecord.value.instanceMap = appRecord.instanceMap;\n\t\t\tdebounceSendInspectorTree();\n\t\t});\n\t};\n\treturn [descriptor, setupFn];\n}\n//#endregion\n//#region src/core/plugin/index.ts\ntarget.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__ ??= /* @__PURE__ */ new Set();\nfunction setupDevToolsPlugin(pluginDescriptor, setupFn) {\n\treturn hook.setupDevToolsPlugin(pluginDescriptor, setupFn);\n}\nfunction callDevToolsPluginSetupFn(plugin, app) {\n\tconst [pluginDescriptor, setupFn] = plugin;\n\tif (pluginDescriptor.app !== app) return;\n\tconst api = new DevToolsPluginAPI({\n\t\tplugin: {\n\t\t\tsetupFn,\n\t\t\tdescriptor: pluginDescriptor\n\t\t},\n\t\tctx: devtoolsContext\n\t});\n\tif (pluginDescriptor.packageName === \"vuex\") api.on.editInspectorState((payload) => {\n\t\tapi.sendInspectorState(payload.inspectorId);\n\t});\n\tsetupFn(api);\n}\nfunction removeRegisteredPluginApp(app) {\n\ttarget.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.delete(app);\n}\nfunction registerDevToolsPlugin(app, options) {\n\tif (target.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.has(app)) return;\n\tif (devtoolsState.highPerfModeEnabled && !options?.inspectingComponent) return;\n\ttarget.__VUE_DEVTOOLS_KIT__REGISTERED_PLUGIN_APPS__.add(app);\n\tdevtoolsPluginBuffer.forEach((plugin) => {\n\t\tcallDevToolsPluginSetupFn(plugin, app);\n\t});\n}\n//#endregion\n//#region src/ctx/router.ts\nconst ROUTER_KEY = \"__VUE_DEVTOOLS_ROUTER__\";\nconst ROUTER_INFO_KEY = \"__VUE_DEVTOOLS_ROUTER_INFO__\";\ntarget[ROUTER_INFO_KEY] ??= {\n\tcurrentRoute: null,\n\troutes: []\n};\ntarget[ROUTER_KEY] ??= {};\nconst devtoolsRouterInfo = new Proxy(target[ROUTER_INFO_KEY], { get(target$1, property) {\n\treturn target[ROUTER_INFO_KEY][property];\n} });\nconst devtoolsRouter = new Proxy(target[ROUTER_KEY], { get(target$2, property) {\n\tif (property === \"value\") return target[ROUTER_KEY];\n} });\n//#endregion\n//#region src/core/router/index.ts\nfunction getRoutes(router) {\n\tconst routesMap = /* @__PURE__ */ new Map();\n\treturn (router?.getRoutes() || []).filter((i) => !routesMap.has(i.path) && routesMap.set(i.path, 1));\n}\nfunction filterRoutes(routes) {\n\treturn routes.map((item) => {\n\t\tlet { path, name, children, meta } = item;\n\t\tif (children?.length) children = filterRoutes(children);\n\t\treturn {\n\t\t\tpath,\n\t\t\tname,\n\t\t\tchildren,\n\t\t\tmeta\n\t\t};\n\t});\n}\nfunction filterCurrentRoute(route) {\n\tif (route) {\n\t\tconst { fullPath, hash, href, path, name, matched, params, query } = route;\n\t\treturn {\n\t\t\tfullPath,\n\t\t\thash,\n\t\t\thref,\n\t\t\tpath,\n\t\t\tname,\n\t\t\tparams,\n\t\t\tquery,\n\t\t\tmatched: filterRoutes(matched)\n\t\t};\n\t}\n\treturn route;\n}\nfunction normalizeRouterInfo(appRecord, activeAppRecord) {\n\tfunction init() {\n\t\tconst router = appRecord.app?.config.globalProperties.$router;\n\t\tconst currentRoute = filterCurrentRoute(router?.currentRoute.value);\n\t\tconst routes = filterRoutes(getRoutes(router));\n\t\tconst c = console.warn;\n\t\tconsole.warn = () => {};\n\t\ttarget[ROUTER_INFO_KEY] = {\n\t\t\tcurrentRoute: currentRoute ? deepClone(currentRoute) : {},\n\t\t\troutes: deepClone(routes)\n\t\t};\n\t\ttarget[ROUTER_KEY] = router;\n\t\tconsole.warn = c;\n\t}\n\tinit();\n\thook.on.componentUpdated(debounce(() => {\n\t\tif (activeAppRecord.value?.app !== appRecord.app) return;\n\t\tinit();\n\t\tif (devtoolsState.highPerfModeEnabled) return;\n\t\tdevtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.ROUTER_INFO_UPDATED, { state: target[ROUTER_INFO_KEY] });\n\t}, 200));\n}\n//#endregion\n//#region src/ctx/api.ts\nfunction createDevToolsApi(hooks) {\n\treturn {\n\t\tasync getInspectorTree(payload) {\n\t\t\tconst _payload = {\n\t\t\t\t...payload,\n\t\t\t\tapp: activeAppRecord.value.app,\n\t\t\t\trootNodes: []\n\t\t\t};\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\thooks.callHookWith(async (callbacks) => {\n\t\t\t\t\tawait Promise.all(callbacks.map((cb) => cb(_payload)));\n\t\t\t\t\tresolve();\n\t\t\t\t}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_TREE);\n\t\t\t});\n\t\t\treturn _payload.rootNodes;\n\t\t},\n\t\tasync getInspectorState(payload) {\n\t\t\tconst _payload = {\n\t\t\t\t...payload,\n\t\t\t\tapp: activeAppRecord.value.app,\n\t\t\t\tstate: null\n\t\t\t};\n\t\t\tconst ctx = { currentTab: `custom-inspector:${payload.inspectorId}` };\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\thooks.callHookWith(async (callbacks) => {\n\t\t\t\t\tawait Promise.all(callbacks.map((cb) => cb(_payload, ctx)));\n\t\t\t\t\tresolve();\n\t\t\t\t}, DevToolsV6PluginAPIHookKeys.GET_INSPECTOR_STATE);\n\t\t\t});\n\t\t\treturn _payload.state;\n\t\t},\n\t\teditInspectorState(payload) {\n\t\t\tconst stateEditor = new StateEditor();\n\t\t\tconst _payload = {\n\t\t\t\t...payload,\n\t\t\t\tapp: activeAppRecord.value.app,\n\t\t\t\tset: (obj, path = payload.path, value = payload.state.value, cb) => {\n\t\t\t\t\tstateEditor.set(obj, path, value, cb || stateEditor.createDefaultSetCallback(payload.state));\n\t\t\t\t}\n\t\t\t};\n\t\t\thooks.callHookWith((callbacks) => {\n\t\t\t\tcallbacks.forEach((cb) => cb(_payload));\n\t\t\t}, DevToolsV6PluginAPIHookKeys.EDIT_INSPECTOR_STATE);\n\t\t},\n\t\tsendInspectorState(inspectorId) {\n\t\t\tconst inspector = getInspector(inspectorId);\n\t\t\thooks.callHook(DevToolsContextHookKeys.SEND_INSPECTOR_STATE, {\n\t\t\t\tinspectorId,\n\t\t\t\tplugin: {\n\t\t\t\t\tdescriptor: inspector.descriptor,\n\t\t\t\t\tsetupFn: () => ({})\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tinspectComponentInspector() {\n\t\t\treturn inspectComponentHighLighter();\n\t\t},\n\t\tcancelInspectComponentInspector() {\n\t\t\treturn cancelInspectComponentHighLighter();\n\t\t},\n\t\tgetComponentRenderCode(id) {\n\t\t\tconst instance = getComponentInstance(activeAppRecord.value, id);\n\t\t\tif (instance) return !(typeof instance?.type === \"function\") ? instance.render.toString() : instance.type.toString();\n\t\t},\n\t\tscrollToComponent(id) {\n\t\t\treturn scrollToComponent({ id });\n\t\t},\n\t\topenInEditor,\n\t\tgetVueInspector: getComponentInspector,\n\t\ttoggleApp(id, options) {\n\t\t\tconst appRecord = devtoolsAppRecords.value.find((record) => record.id === id);\n\t\t\tif (appRecord) {\n\t\t\t\tsetActiveAppRecordId(id);\n\t\t\t\tsetActiveAppRecord(appRecord);\n\t\t\t\tnormalizeRouterInfo(appRecord, activeAppRecord);\n\t\t\t\tcallInspectorUpdatedHook();\n\t\t\t\tregisterDevToolsPlugin(appRecord.app, options);\n\t\t\t}\n\t\t},\n\t\tinspectDOM(instanceId) {\n\t\t\tconst instance = getComponentInstance(activeAppRecord.value, instanceId);\n\t\t\tif (instance) {\n\t\t\t\tconst [el] = getRootElementsFromComponentInstance(instance);\n\t\t\t\tif (el) target.__VUE_DEVTOOLS_INSPECT_DOM_TARGET__ = el;\n\t\t\t}\n\t\t},\n\t\tupdatePluginSettings(pluginId, key, value) {\n\t\t\tsetPluginSettings(pluginId, key, value);\n\t\t},\n\t\tgetPluginSettings(pluginId) {\n\t\t\treturn {\n\t\t\t\toptions: getPluginSettingsOptions(pluginId),\n\t\t\t\tvalues: getPluginSettings(pluginId)\n\t\t\t};\n\t\t}\n\t};\n}\n//#endregion\n//#region src/ctx/env.ts\ntarget.__VUE_DEVTOOLS_ENV__ ??= { vitePluginDetected: false };\nfunction getDevToolsEnv() {\n\treturn target.__VUE_DEVTOOLS_ENV__;\n}\nfunction setDevToolsEnv(env) {\n\ttarget.__VUE_DEVTOOLS_ENV__ = {\n\t\t...target.__VUE_DEVTOOLS_ENV__,\n\t\t...env\n\t};\n}\n//#endregion\n//#region src/ctx/index.ts\nconst hooks = createDevToolsCtxHooks();\ntarget.__VUE_DEVTOOLS_KIT_CONTEXT__ ??= {\n\thooks,\n\tget state() {\n\t\treturn {\n\t\t\t...devtoolsState,\n\t\t\tactiveAppRecordId: activeAppRecord.id,\n\t\t\tactiveAppRecord: activeAppRecord.value,\n\t\t\tappRecords: devtoolsAppRecords.value\n\t\t};\n\t},\n\tapi: createDevToolsApi(hooks)\n};\nconst devtoolsContext = target.__VUE_DEVTOOLS_KIT_CONTEXT__;\n//#endregion\n//#region ../../node_modules/.pnpm/speakingurl@14.0.1/node_modules/speakingurl/lib/speakingurl.js\nvar require_speakingurl$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {\n\t(function(root) {\n\t\t\"use strict\";\n\t\t/**\n\t\t* charMap\n\t\t* @type {Object}\n\t\t*/\n\t\tvar charMap = {\n\t\t\t\"À\": \"A\",\n\t\t\t\"Á\": \"A\",\n\t\t\t\"Â\": \"A\",\n\t\t\t\"Ã\": \"A\",\n\t\t\t\"Ä\": \"Ae\",\n\t\t\t\"Å\": \"A\",\n\t\t\t\"Æ\": \"AE\",\n\t\t\t\"Ç\": \"C\",\n\t\t\t\"È\": \"E\",\n\t\t\t\"É\": \"E\",\n\t\t\t\"Ê\": \"E\",\n\t\t\t\"Ë\": \"E\",\n\t\t\t\"Ì\": \"I\",\n\t\t\t\"Í\": \"I\",\n\t\t\t\"Î\": \"I\",\n\t\t\t\"Ï\": \"I\",\n\t\t\t\"Ð\": \"D\",\n\t\t\t\"Ñ\": \"N\",\n\t\t\t\"Ò\": \"O\",\n\t\t\t\"Ó\": \"O\",\n\t\t\t\"Ô\": \"O\",\n\t\t\t\"Õ\": \"O\",\n\t\t\t\"Ö\": \"Oe\",\n\t\t\t\"Ő\": \"O\",\n\t\t\t\"Ø\": \"O\",\n\t\t\t\"Ù\": \"U\",\n\t\t\t\"Ú\": \"U\",\n\t\t\t\"Û\": \"U\",\n\t\t\t\"Ü\": \"Ue\",\n\t\t\t\"Ű\": \"U\",\n\t\t\t\"Ý\": \"Y\",\n\t\t\t\"Þ\": \"TH\",\n\t\t\t\"ß\": \"ss\",\n\t\t\t\"à\": \"a\",\n\t\t\t\"á\": \"a\",\n\t\t\t\"â\": \"a\",\n\t\t\t\"ã\": \"a\",\n\t\t\t\"ä\": \"ae\",\n\t\t\t\"å\": \"a\",\n\t\t\t\"æ\": \"ae\",\n\t\t\t\"ç\": \"c\",\n\t\t\t\"è\": \"e\",\n\t\t\t\"é\": \"e\",\n\t\t\t\"ê\": \"e\",\n\t\t\t\"ë\": \"e\",\n\t\t\t\"ì\": \"i\",\n\t\t\t\"í\": \"i\",\n\t\t\t\"î\": \"i\",\n\t\t\t\"ï\": \"i\",\n\t\t\t\"ð\": \"d\",\n\t\t\t\"ñ\": \"n\",\n\t\t\t\"ò\": \"o\",\n\t\t\t\"ó\": \"o\",\n\t\t\t\"ô\": \"o\",\n\t\t\t\"õ\": \"o\",\n\t\t\t\"ö\": \"oe\",\n\t\t\t\"ő\": \"o\",\n\t\t\t\"ø\": \"o\",\n\t\t\t\"ù\": \"u\",\n\t\t\t\"ú\": \"u\",\n\t\t\t\"û\": \"u\",\n\t\t\t\"ü\": \"ue\",\n\t\t\t\"ű\": \"u\",\n\t\t\t\"ý\": \"y\",\n\t\t\t\"þ\": \"th\",\n\t\t\t\"ÿ\": \"y\",\n\t\t\t\"ẞ\": \"SS\",\n\t\t\t\"ا\": \"a\",\n\t\t\t\"أ\": \"a\",\n\t\t\t\"إ\": \"i\",\n\t\t\t\"آ\": \"aa\",\n\t\t\t\"ؤ\": \"u\",\n\t\t\t\"ئ\": \"e\",\n\t\t\t\"ء\": \"a\",\n\t\t\t\"ب\": \"b\",\n\t\t\t\"ت\": \"t\",\n\t\t\t\"ث\": \"th\",\n\t\t\t\"ج\": \"j\",\n\t\t\t\"ح\": \"h\",\n\t\t\t\"خ\": \"kh\",\n\t\t\t\"د\": \"d\",\n\t\t\t\"ذ\": \"th\",\n\t\t\t\"ر\": \"r\",\n\t\t\t\"ز\": \"z\",\n\t\t\t\"س\": \"s\",\n\t\t\t\"ش\": \"sh\",\n\t\t\t\"ص\": \"s\",\n\t\t\t\"ض\": \"dh\",\n\t\t\t\"ط\": \"t\",\n\t\t\t\"ظ\": \"z\",\n\t\t\t\"ع\": \"a\",\n\t\t\t\"غ\": \"gh\",\n\t\t\t\"ف\": \"f\",\n\t\t\t\"ق\": \"q\",\n\t\t\t\"ك\": \"k\",\n\t\t\t\"ل\": \"l\",\n\t\t\t\"م\": \"m\",\n\t\t\t\"ن\": \"n\",\n\t\t\t\"ه\": \"h\",\n\t\t\t\"و\": \"w\",\n\t\t\t\"ي\": \"y\",\n\t\t\t\"ى\": \"a\",\n\t\t\t\"ة\": \"h\",\n\t\t\t\"ﻻ\": \"la\",\n\t\t\t\"ﻷ\": \"laa\",\n\t\t\t\"ﻹ\": \"lai\",\n\t\t\t\"ﻵ\": \"laa\",\n\t\t\t\"گ\": \"g\",\n\t\t\t\"چ\": \"ch\",\n\t\t\t\"پ\": \"p\",\n\t\t\t\"ژ\": \"zh\",\n\t\t\t\"ک\": \"k\",\n\t\t\t\"ی\": \"y\",\n\t\t\t\"َ\": \"a\",\n\t\t\t\"ً\": \"an\",\n\t\t\t\"ِ\": \"e\",\n\t\t\t\"ٍ\": \"en\",\n\t\t\t\"ُ\": \"u\",\n\t\t\t\"ٌ\": \"on\",\n\t\t\t\"ْ\": \"\",\n\t\t\t\"٠\": \"0\",\n\t\t\t\"١\": \"1\",\n\t\t\t\"٢\": \"2\",\n\t\t\t\"٣\": \"3\",\n\t\t\t\"٤\": \"4\",\n\t\t\t\"٥\": \"5\",\n\t\t\t\"٦\": \"6\",\n\t\t\t\"٧\": \"7\",\n\t\t\t\"٨\": \"8\",\n\t\t\t\"٩\": \"9\",\n\t\t\t\"۰\": \"0\",\n\t\t\t\"۱\": \"1\",\n\t\t\t\"۲\": \"2\",\n\t\t\t\"۳\": \"3\",\n\t\t\t\"۴\": \"4\",\n\t\t\t\"۵\": \"5\",\n\t\t\t\"۶\": \"6\",\n\t\t\t\"۷\": \"7\",\n\t\t\t\"۸\": \"8\",\n\t\t\t\"۹\": \"9\",\n\t\t\t\"က\": \"k\",\n\t\t\t\"ခ\": \"kh\",\n\t\t\t\"ဂ\": \"g\",\n\t\t\t\"ဃ\": \"ga\",\n\t\t\t\"င\": \"ng\",\n\t\t\t\"စ\": \"s\",\n\t\t\t\"ဆ\": \"sa\",\n\t\t\t\"ဇ\": \"z\",\n\t\t\t\"စျ\": \"za\",\n\t\t\t\"ည\": \"ny\",\n\t\t\t\"ဋ\": \"t\",\n\t\t\t\"ဌ\": \"ta\",\n\t\t\t\"ဍ\": \"d\",\n\t\t\t\"ဎ\": \"da\",\n\t\t\t\"ဏ\": \"na\",\n\t\t\t\"တ\": \"t\",\n\t\t\t\"ထ\": \"ta\",\n\t\t\t\"ဒ\": \"d\",\n\t\t\t\"ဓ\": \"da\",\n\t\t\t\"န\": \"n\",\n\t\t\t\"ပ\": \"p\",\n\t\t\t\"ဖ\": \"pa\",\n\t\t\t\"ဗ\": \"b\",\n\t\t\t\"ဘ\": \"ba\",\n\t\t\t\"မ\": \"m\",\n\t\t\t\"ယ\": \"y\",\n\t\t\t\"ရ\": \"ya\",\n\t\t\t\"လ\": \"l\",\n\t\t\t\"ဝ\": \"w\",\n\t\t\t\"သ\": \"th\",\n\t\t\t\"ဟ\": \"h\",\n\t\t\t\"ဠ\": \"la\",\n\t\t\t\"အ\": \"a\",\n\t\t\t\"ြ\": \"y\",\n\t\t\t\"ျ\": \"ya\",\n\t\t\t\"ွ\": \"w\",\n\t\t\t\"ြွ\": \"yw\",\n\t\t\t\"ျွ\": \"ywa\",\n\t\t\t\"ှ\": \"h\",\n\t\t\t\"ဧ\": \"e\",\n\t\t\t\"၏\": \"-e\",\n\t\t\t\"ဣ\": \"i\",\n\t\t\t\"ဤ\": \"-i\",\n\t\t\t\"ဉ\": \"u\",\n\t\t\t\"ဦ\": \"-u\",\n\t\t\t\"ဩ\": \"aw\",\n\t\t\t\"သြော\": \"aw\",\n\t\t\t\"ဪ\": \"aw\",\n\t\t\t\"၀\": \"0\",\n\t\t\t\"၁\": \"1\",\n\t\t\t\"၂\": \"2\",\n\t\t\t\"၃\": \"3\",\n\t\t\t\"၄\": \"4\",\n\t\t\t\"၅\": \"5\",\n\t\t\t\"၆\": \"6\",\n\t\t\t\"၇\": \"7\",\n\t\t\t\"၈\": \"8\",\n\t\t\t\"၉\": \"9\",\n\t\t\t\"္\": \"\",\n\t\t\t\"့\": \"\",\n\t\t\t\"း\": \"\",\n\t\t\t\"č\": \"c\",\n\t\t\t\"ď\": \"d\",\n\t\t\t\"ě\": \"e\",\n\t\t\t\"ň\": \"n\",\n\t\t\t\"ř\": \"r\",\n\t\t\t\"š\": \"s\",\n\t\t\t\"ť\": \"t\",\n\t\t\t\"ů\": \"u\",\n\t\t\t\"ž\": \"z\",\n\t\t\t\"Č\": \"C\",\n\t\t\t\"Ď\": \"D\",\n\t\t\t\"Ě\": \"E\",\n\t\t\t\"Ň\": \"N\",\n\t\t\t\"Ř\": \"R\",\n\t\t\t\"Š\": \"S\",\n\t\t\t\"Ť\": \"T\",\n\t\t\t\"Ů\": \"U\",\n\t\t\t\"Ž\": \"Z\",\n\t\t\t\"ހ\": \"h\",\n\t\t\t\"ށ\": \"sh\",\n\t\t\t\"ނ\": \"n\",\n\t\t\t\"ރ\": \"r\",\n\t\t\t\"ބ\": \"b\",\n\t\t\t\"ޅ\": \"lh\",\n\t\t\t\"ކ\": \"k\",\n\t\t\t\"އ\": \"a\",\n\t\t\t\"ވ\": \"v\",\n\t\t\t\"މ\": \"m\",\n\t\t\t\"ފ\": \"f\",\n\t\t\t\"ދ\": \"dh\",\n\t\t\t\"ތ\": \"th\",\n\t\t\t\"ލ\": \"l\",\n\t\t\t\"ގ\": \"g\",\n\t\t\t\"ޏ\": \"gn\",\n\t\t\t\"ސ\": \"s\",\n\t\t\t\"ޑ\": \"d\",\n\t\t\t\"ޒ\": \"z\",\n\t\t\t\"ޓ\": \"t\",\n\t\t\t\"ޔ\": \"y\",\n\t\t\t\"ޕ\": \"p\",\n\t\t\t\"ޖ\": \"j\",\n\t\t\t\"ޗ\": \"ch\",\n\t\t\t\"ޘ\": \"tt\",\n\t\t\t\"ޙ\": \"hh\",\n\t\t\t\"ޚ\": \"kh\",\n\t\t\t\"ޛ\": \"th\",\n\t\t\t\"ޜ\": \"z\",\n\t\t\t\"ޝ\": \"sh\",\n\t\t\t\"ޞ\": \"s\",\n\t\t\t\"ޟ\": \"d\",\n\t\t\t\"ޠ\": \"t\",\n\t\t\t\"ޡ\": \"z\",\n\t\t\t\"ޢ\": \"a\",\n\t\t\t\"ޣ\": \"gh\",\n\t\t\t\"ޤ\": \"q\",\n\t\t\t\"ޥ\": \"w\",\n\t\t\t\"ަ\": \"a\",\n\t\t\t\"ާ\": \"aa\",\n\t\t\t\"ި\": \"i\",\n\t\t\t\"ީ\": \"ee\",\n\t\t\t\"ު\": \"u\",\n\t\t\t\"ޫ\": \"oo\",\n\t\t\t\"ެ\": \"e\",\n\t\t\t\"ޭ\": \"ey\",\n\t\t\t\"ޮ\": \"o\",\n\t\t\t\"ޯ\": \"oa\",\n\t\t\t\"ް\": \"\",\n\t\t\t\"ა\": \"a\",\n\t\t\t\"ბ\": \"b\",\n\t\t\t\"გ\": \"g\",\n\t\t\t\"დ\": \"d\",\n\t\t\t\"ე\": \"e\",\n\t\t\t\"ვ\": \"v\",\n\t\t\t\"ზ\": \"z\",\n\t\t\t\"თ\": \"t\",\n\t\t\t\"ი\": \"i\",\n\t\t\t\"კ\": \"k\",\n\t\t\t\"ლ\": \"l\",\n\t\t\t\"მ\": \"m\",\n\t\t\t\"ნ\": \"n\",\n\t\t\t\"ო\": \"o\",\n\t\t\t\"პ\": \"p\",\n\t\t\t\"ჟ\": \"zh\",\n\t\t\t\"რ\": \"r\",\n\t\t\t\"ს\": \"s\",\n\t\t\t\"ტ\": \"t\",\n\t\t\t\"უ\": \"u\",\n\t\t\t\"ფ\": \"p\",\n\t\t\t\"ქ\": \"k\",\n\t\t\t\"ღ\": \"gh\",\n\t\t\t\"ყ\": \"q\",\n\t\t\t\"შ\": \"sh\",\n\t\t\t\"ჩ\": \"ch\",\n\t\t\t\"ც\": \"ts\",\n\t\t\t\"ძ\": \"dz\",\n\t\t\t\"წ\": \"ts\",\n\t\t\t\"ჭ\": \"ch\",\n\t\t\t\"ხ\": \"kh\",\n\t\t\t\"ჯ\": \"j\",\n\t\t\t\"ჰ\": \"h\",\n\t\t\t\"α\": \"a\",\n\t\t\t\"β\": \"v\",\n\t\t\t\"γ\": \"g\",\n\t\t\t\"δ\": \"d\",\n\t\t\t\"ε\": \"e\",\n\t\t\t\"ζ\": \"z\",\n\t\t\t\"η\": \"i\",\n\t\t\t\"θ\": \"th\",\n\t\t\t\"ι\": \"i\",\n\t\t\t\"κ\": \"k\",\n\t\t\t\"λ\": \"l\",\n\t\t\t\"μ\": \"m\",\n\t\t\t\"ν\": \"n\",\n\t\t\t\"ξ\": \"ks\",\n\t\t\t\"ο\": \"o\",\n\t\t\t\"π\": \"p\",\n\t\t\t\"ρ\": \"r\",\n\t\t\t\"σ\": \"s\",\n\t\t\t\"τ\": \"t\",\n\t\t\t\"υ\": \"y\",\n\t\t\t\"φ\": \"f\",\n\t\t\t\"χ\": \"x\",\n\t\t\t\"ψ\": \"ps\",\n\t\t\t\"ω\": \"o\",\n\t\t\t\"ά\": \"a\",\n\t\t\t\"έ\": \"e\",\n\t\t\t\"ί\": \"i\",\n\t\t\t\"ό\": \"o\",\n\t\t\t\"ύ\": \"y\",\n\t\t\t\"ή\": \"i\",\n\t\t\t\"ώ\": \"o\",\n\t\t\t\"ς\": \"s\",\n\t\t\t\"ϊ\": \"i\",\n\t\t\t\"ΰ\": \"y\",\n\t\t\t\"ϋ\": \"y\",\n\t\t\t\"ΐ\": \"i\",\n\t\t\t\"Α\": \"A\",\n\t\t\t\"Β\": \"B\",\n\t\t\t\"Γ\": \"G\",\n\t\t\t\"Δ\": \"D\",\n\t\t\t\"Ε\": \"E\",\n\t\t\t\"Ζ\": \"Z\",\n\t\t\t\"Η\": \"I\",\n\t\t\t\"Θ\": \"TH\",\n\t\t\t\"Ι\": \"I\",\n\t\t\t\"Κ\": \"K\",\n\t\t\t\"Λ\": \"L\",\n\t\t\t\"Μ\": \"M\",\n\t\t\t\"Ν\": \"N\",\n\t\t\t\"Ξ\": \"KS\",\n\t\t\t\"Ο\": \"O\",\n\t\t\t\"Π\": \"P\",\n\t\t\t\"Ρ\": \"R\",\n\t\t\t\"Σ\": \"S\",\n\t\t\t\"Τ\": \"T\",\n\t\t\t\"Υ\": \"Y\",\n\t\t\t\"Φ\": \"F\",\n\t\t\t\"Χ\": \"X\",\n\t\t\t\"Ψ\": \"PS\",\n\t\t\t\"Ω\": \"O\",\n\t\t\t\"Ά\": \"A\",\n\t\t\t\"Έ\": \"E\",\n\t\t\t\"Ί\": \"I\",\n\t\t\t\"Ό\": \"O\",\n\t\t\t\"Ύ\": \"Y\",\n\t\t\t\"Ή\": \"I\",\n\t\t\t\"Ώ\": \"O\",\n\t\t\t\"Ϊ\": \"I\",\n\t\t\t\"Ϋ\": \"Y\",\n\t\t\t\"ā\": \"a\",\n\t\t\t\"ē\": \"e\",\n\t\t\t\"ģ\": \"g\",\n\t\t\t\"ī\": \"i\",\n\t\t\t\"ķ\": \"k\",\n\t\t\t\"ļ\": \"l\",\n\t\t\t\"ņ\": \"n\",\n\t\t\t\"ū\": \"u\",\n\t\t\t\"Ā\": \"A\",\n\t\t\t\"Ē\": \"E\",\n\t\t\t\"Ģ\": \"G\",\n\t\t\t\"Ī\": \"I\",\n\t\t\t\"Ķ\": \"k\",\n\t\t\t\"Ļ\": \"L\",\n\t\t\t\"Ņ\": \"N\",\n\t\t\t\"Ū\": \"U\",\n\t\t\t\"Ќ\": \"Kj\",\n\t\t\t\"ќ\": \"kj\",\n\t\t\t\"Љ\": \"Lj\",\n\t\t\t\"љ\": \"lj\",\n\t\t\t\"Њ\": \"Nj\",\n\t\t\t\"њ\": \"nj\",\n\t\t\t\"Тс\": \"Ts\",\n\t\t\t\"тс\": \"ts\",\n\t\t\t\"ą\": \"a\",\n\t\t\t\"ć\": \"c\",\n\t\t\t\"ę\": \"e\",\n\t\t\t\"ł\": \"l\",\n\t\t\t\"ń\": \"n\",\n\t\t\t\"ś\": \"s\",\n\t\t\t\"ź\": \"z\",\n\t\t\t\"ż\": \"z\",\n\t\t\t\"Ą\": \"A\",\n\t\t\t\"Ć\": \"C\",\n\t\t\t\"Ę\": \"E\",\n\t\t\t\"Ł\": \"L\",\n\t\t\t\"Ń\": \"N\",\n\t\t\t\"Ś\": \"S\",\n\t\t\t\"Ź\": \"Z\",\n\t\t\t\"Ż\": \"Z\",\n\t\t\t\"Є\": \"Ye\",\n\t\t\t\"І\": \"I\",\n\t\t\t\"Ї\": \"Yi\",\n\t\t\t\"Ґ\": \"G\",\n\t\t\t\"є\": \"ye\",\n\t\t\t\"і\": \"i\",\n\t\t\t\"ї\": \"yi\",\n\t\t\t\"ґ\": \"g\",\n\t\t\t\"ă\": \"a\",\n\t\t\t\"Ă\": \"A\",\n\t\t\t\"ș\": \"s\",\n\t\t\t\"Ș\": \"S\",\n\t\t\t\"ț\": \"t\",\n\t\t\t\"Ț\": \"T\",\n\t\t\t\"ţ\": \"t\",\n\t\t\t\"Ţ\": \"T\",\n\t\t\t\"а\": \"a\",\n\t\t\t\"б\": \"b\",\n\t\t\t\"в\": \"v\",\n\t\t\t\"г\": \"g\",\n\t\t\t\"д\": \"d\",\n\t\t\t\"е\": \"e\",\n\t\t\t\"ё\": \"yo\",\n\t\t\t\"ж\": \"zh\",\n\t\t\t\"з\": \"z\",\n\t\t\t\"и\": \"i\",\n\t\t\t\"й\": \"i\",\n\t\t\t\"к\": \"k\",\n\t\t\t\"л\": \"l\",\n\t\t\t\"м\": \"m\",\n\t\t\t\"н\": \"n\",\n\t\t\t\"о\": \"o\",\n\t\t\t\"п\": \"p\",\n\t\t\t\"р\": \"r\",\n\t\t\t\"с\": \"s\",\n\t\t\t\"т\": \"t\",\n\t\t\t\"у\": \"u\",\n\t\t\t\"ф\": \"f\",\n\t\t\t\"х\": \"kh\",\n\t\t\t\"ц\": \"c\",\n\t\t\t\"ч\": \"ch\",\n\t\t\t\"ш\": \"sh\",\n\t\t\t\"щ\": \"sh\",\n\t\t\t\"ъ\": \"\",\n\t\t\t\"ы\": \"y\",\n\t\t\t\"ь\": \"\",\n\t\t\t\"э\": \"e\",\n\t\t\t\"ю\": \"yu\",\n\t\t\t\"я\": \"ya\",\n\t\t\t\"А\": \"A\",\n\t\t\t\"Б\": \"B\",\n\t\t\t\"В\": \"V\",\n\t\t\t\"Г\": \"G\",\n\t\t\t\"Д\": \"D\",\n\t\t\t\"Е\": \"E\",\n\t\t\t\"Ё\": \"Yo\",\n\t\t\t\"Ж\": \"Zh\",\n\t\t\t\"З\": \"Z\",\n\t\t\t\"И\": \"I\",\n\t\t\t\"Й\": \"I\",\n\t\t\t\"К\": \"K\",\n\t\t\t\"Л\": \"L\",\n\t\t\t\"М\": \"M\",\n\t\t\t\"Н\": \"N\",\n\t\t\t\"О\": \"O\",\n\t\t\t\"П\": \"P\",\n\t\t\t\"Р\": \"R\",\n\t\t\t\"С\": \"S\",\n\t\t\t\"Т\": \"T\",\n\t\t\t\"У\": \"U\",\n\t\t\t\"Ф\": \"F\",\n\t\t\t\"Х\": \"Kh\",\n\t\t\t\"Ц\": \"C\",\n\t\t\t\"Ч\": \"Ch\",\n\t\t\t\"Ш\": \"Sh\",\n\t\t\t\"Щ\": \"Sh\",\n\t\t\t\"Ъ\": \"\",\n\t\t\t\"Ы\": \"Y\",\n\t\t\t\"Ь\": \"\",\n\t\t\t\"Э\": \"E\",\n\t\t\t\"Ю\": \"Yu\",\n\t\t\t\"Я\": \"Ya\",\n\t\t\t\"ђ\": \"dj\",\n\t\t\t\"ј\": \"j\",\n\t\t\t\"ћ\": \"c\",\n\t\t\t\"џ\": \"dz\",\n\t\t\t\"Ђ\": \"Dj\",\n\t\t\t\"Ј\": \"j\",\n\t\t\t\"Ћ\": \"C\",\n\t\t\t\"Џ\": \"Dz\",\n\t\t\t\"ľ\": \"l\",\n\t\t\t\"ĺ\": \"l\",\n\t\t\t\"ŕ\": \"r\",\n\t\t\t\"Ľ\": \"L\",\n\t\t\t\"Ĺ\": \"L\",\n\t\t\t\"Ŕ\": \"R\",\n\t\t\t\"ş\": \"s\",\n\t\t\t\"Ş\": \"S\",\n\t\t\t\"ı\": \"i\",\n\t\t\t\"İ\": \"I\",\n\t\t\t\"ğ\": \"g\",\n\t\t\t\"Ğ\": \"G\",\n\t\t\t\"ả\": \"a\",\n\t\t\t\"Ả\": \"A\",\n\t\t\t\"ẳ\": \"a\",\n\t\t\t\"Ẳ\": \"A\",\n\t\t\t\"ẩ\": \"a\",\n\t\t\t\"Ẩ\": \"A\",\n\t\t\t\"đ\": \"d\",\n\t\t\t\"Đ\": \"D\",\n\t\t\t\"ẹ\": \"e\",\n\t\t\t\"Ẹ\": \"E\",\n\t\t\t\"ẽ\": \"e\",\n\t\t\t\"Ẽ\": \"E\",\n\t\t\t\"ẻ\": \"e\",\n\t\t\t\"Ẻ\": \"E\",\n\t\t\t\"ế\": \"e\",\n\t\t\t\"Ế\": \"E\",\n\t\t\t\"ề\": \"e\",\n\t\t\t\"Ề\": \"E\",\n\t\t\t\"ệ\": \"e\",\n\t\t\t\"Ệ\": \"E\",\n\t\t\t\"ễ\": \"e\",\n\t\t\t\"Ễ\": \"E\",\n\t\t\t\"ể\": \"e\",\n\t\t\t\"Ể\": \"E\",\n\t\t\t\"ỏ\": \"o\",\n\t\t\t\"ọ\": \"o\",\n\t\t\t\"Ọ\": \"o\",\n\t\t\t\"ố\": \"o\",\n\t\t\t\"Ố\": \"O\",\n\t\t\t\"ồ\": \"o\",\n\t\t\t\"Ồ\": \"O\",\n\t\t\t\"ổ\": \"o\",\n\t\t\t\"Ổ\": \"O\",\n\t\t\t\"ộ\": \"o\",\n\t\t\t\"Ộ\": \"O\",\n\t\t\t\"ỗ\": \"o\",\n\t\t\t\"Ỗ\": \"O\",\n\t\t\t\"ơ\": \"o\",\n\t\t\t\"Ơ\": \"O\",\n\t\t\t\"ớ\": \"o\",\n\t\t\t\"Ớ\": \"O\",\n\t\t\t\"ờ\": \"o\",\n\t\t\t\"Ờ\": \"O\",\n\t\t\t\"ợ\": \"o\",\n\t\t\t\"Ợ\": \"O\",\n\t\t\t\"ỡ\": \"o\",\n\t\t\t\"Ỡ\": \"O\",\n\t\t\t\"Ở\": \"o\",\n\t\t\t\"ở\": \"o\",\n\t\t\t\"ị\": \"i\",\n\t\t\t\"Ị\": \"I\",\n\t\t\t\"ĩ\": \"i\",\n\t\t\t\"Ĩ\": \"I\",\n\t\t\t\"ỉ\": \"i\",\n\t\t\t\"Ỉ\": \"i\",\n\t\t\t\"ủ\": \"u\",\n\t\t\t\"Ủ\": \"U\",\n\t\t\t\"ụ\": \"u\",\n\t\t\t\"Ụ\": \"U\",\n\t\t\t\"ũ\": \"u\",\n\t\t\t\"Ũ\": \"U\",\n\t\t\t\"ư\": \"u\",\n\t\t\t\"Ư\": \"U\",\n\t\t\t\"ứ\": \"u\",\n\t\t\t\"Ứ\": \"U\",\n\t\t\t\"ừ\": \"u\",\n\t\t\t\"Ừ\": \"U\",\n\t\t\t\"ự\": \"u\",\n\t\t\t\"Ự\": \"U\",\n\t\t\t\"ữ\": \"u\",\n\t\t\t\"Ữ\": \"U\",\n\t\t\t\"ử\": \"u\",\n\t\t\t\"Ử\": \"ư\",\n\t\t\t\"ỷ\": \"y\",\n\t\t\t\"Ỷ\": \"y\",\n\t\t\t\"ỳ\": \"y\",\n\t\t\t\"Ỳ\": \"Y\",\n\t\t\t\"ỵ\": \"y\",\n\t\t\t\"Ỵ\": \"Y\",\n\t\t\t\"ỹ\": \"y\",\n\t\t\t\"Ỹ\": \"Y\",\n\t\t\t\"ạ\": \"a\",\n\t\t\t\"Ạ\": \"A\",\n\t\t\t\"ấ\": \"a\",\n\t\t\t\"Ấ\": \"A\",\n\t\t\t\"ầ\": \"a\",\n\t\t\t\"Ầ\": \"A\",\n\t\t\t\"ậ\": \"a\",\n\t\t\t\"Ậ\": \"A\",\n\t\t\t\"ẫ\": \"a\",\n\t\t\t\"Ẫ\": \"A\",\n\t\t\t\"ắ\": \"a\",\n\t\t\t\"Ắ\": \"A\",\n\t\t\t\"ằ\": \"a\",\n\t\t\t\"Ằ\": \"A\",\n\t\t\t\"ặ\": \"a\",\n\t\t\t\"Ặ\": \"A\",\n\t\t\t\"ẵ\": \"a\",\n\t\t\t\"Ẵ\": \"A\",\n\t\t\t\"⓪\": \"0\",\n\t\t\t\"①\": \"1\",\n\t\t\t\"②\": \"2\",\n\t\t\t\"③\": \"3\",\n\t\t\t\"④\": \"4\",\n\t\t\t\"⑤\": \"5\",\n\t\t\t\"⑥\": \"6\",\n\t\t\t\"⑦\": \"7\",\n\t\t\t\"⑧\": \"8\",\n\t\t\t\"⑨\": \"9\",\n\t\t\t\"⑩\": \"10\",\n\t\t\t\"⑪\": \"11\",\n\t\t\t\"⑫\": \"12\",\n\t\t\t\"⑬\": \"13\",\n\t\t\t\"⑭\": \"14\",\n\t\t\t\"⑮\": \"15\",\n\t\t\t\"⑯\": \"16\",\n\t\t\t\"⑰\": \"17\",\n\t\t\t\"⑱\": \"18\",\n\t\t\t\"⑲\": \"18\",\n\t\t\t\"⑳\": \"18\",\n\t\t\t\"⓵\": \"1\",\n\t\t\t\"⓶\": \"2\",\n\t\t\t\"⓷\": \"3\",\n\t\t\t\"⓸\": \"4\",\n\t\t\t\"⓹\": \"5\",\n\t\t\t\"⓺\": \"6\",\n\t\t\t\"⓻\": \"7\",\n\t\t\t\"⓼\": \"8\",\n\t\t\t\"⓽\": \"9\",\n\t\t\t\"⓾\": \"10\",\n\t\t\t\"⓿\": \"0\",\n\t\t\t\"⓫\": \"11\",\n\t\t\t\"⓬\": \"12\",\n\t\t\t\"⓭\": \"13\",\n\t\t\t\"⓮\": \"14\",\n\t\t\t\"⓯\": \"15\",\n\t\t\t\"⓰\": \"16\",\n\t\t\t\"⓱\": \"17\",\n\t\t\t\"⓲\": \"18\",\n\t\t\t\"⓳\": \"19\",\n\t\t\t\"⓴\": \"20\",\n\t\t\t\"Ⓐ\": \"A\",\n\t\t\t\"Ⓑ\": \"B\",\n\t\t\t\"Ⓒ\": \"C\",\n\t\t\t\"Ⓓ\": \"D\",\n\t\t\t\"Ⓔ\": \"E\",\n\t\t\t\"Ⓕ\": \"F\",\n\t\t\t\"Ⓖ\": \"G\",\n\t\t\t\"Ⓗ\": \"H\",\n\t\t\t\"Ⓘ\": \"I\",\n\t\t\t\"Ⓙ\": \"J\",\n\t\t\t\"Ⓚ\": \"K\",\n\t\t\t\"Ⓛ\": \"L\",\n\t\t\t\"Ⓜ\": \"M\",\n\t\t\t\"Ⓝ\": \"N\",\n\t\t\t\"Ⓞ\": \"O\",\n\t\t\t\"Ⓟ\": \"P\",\n\t\t\t\"Ⓠ\": \"Q\",\n\t\t\t\"Ⓡ\": \"R\",\n\t\t\t\"Ⓢ\": \"S\",\n\t\t\t\"Ⓣ\": \"T\",\n\t\t\t\"Ⓤ\": \"U\",\n\t\t\t\"Ⓥ\": \"V\",\n\t\t\t\"Ⓦ\": \"W\",\n\t\t\t\"Ⓧ\": \"X\",\n\t\t\t\"Ⓨ\": \"Y\",\n\t\t\t\"Ⓩ\": \"Z\",\n\t\t\t\"ⓐ\": \"a\",\n\t\t\t\"ⓑ\": \"b\",\n\t\t\t\"ⓒ\": \"c\",\n\t\t\t\"ⓓ\": \"d\",\n\t\t\t\"ⓔ\": \"e\",\n\t\t\t\"ⓕ\": \"f\",\n\t\t\t\"ⓖ\": \"g\",\n\t\t\t\"ⓗ\": \"h\",\n\t\t\t\"ⓘ\": \"i\",\n\t\t\t\"ⓙ\": \"j\",\n\t\t\t\"ⓚ\": \"k\",\n\t\t\t\"ⓛ\": \"l\",\n\t\t\t\"ⓜ\": \"m\",\n\t\t\t\"ⓝ\": \"n\",\n\t\t\t\"ⓞ\": \"o\",\n\t\t\t\"ⓟ\": \"p\",\n\t\t\t\"ⓠ\": \"q\",\n\t\t\t\"ⓡ\": \"r\",\n\t\t\t\"ⓢ\": \"s\",\n\t\t\t\"ⓣ\": \"t\",\n\t\t\t\"ⓤ\": \"u\",\n\t\t\t\"ⓦ\": \"v\",\n\t\t\t\"ⓥ\": \"w\",\n\t\t\t\"ⓧ\": \"x\",\n\t\t\t\"ⓨ\": \"y\",\n\t\t\t\"ⓩ\": \"z\",\n\t\t\t\"“\": \"\\\"\",\n\t\t\t\"”\": \"\\\"\",\n\t\t\t\"‘\": \"'\",\n\t\t\t\"’\": \"'\",\n\t\t\t\"∂\": \"d\",\n\t\t\t\"ƒ\": \"f\",\n\t\t\t\"™\": \"(TM)\",\n\t\t\t\"©\": \"(C)\",\n\t\t\t\"œ\": \"oe\",\n\t\t\t\"Œ\": \"OE\",\n\t\t\t\"®\": \"(R)\",\n\t\t\t\"†\": \"+\",\n\t\t\t\"℠\": \"(SM)\",\n\t\t\t\"…\": \"...\",\n\t\t\t\"˚\": \"o\",\n\t\t\t\"º\": \"o\",\n\t\t\t\"ª\": \"a\",\n\t\t\t\"•\": \"*\",\n\t\t\t\"၊\": \",\",\n\t\t\t\"။\": \".\",\n\t\t\t\"$\": \"USD\",\n\t\t\t\"€\": \"EUR\",\n\t\t\t\"₢\": \"BRN\",\n\t\t\t\"₣\": \"FRF\",\n\t\t\t\"£\": \"GBP\",\n\t\t\t\"₤\": \"ITL\",\n\t\t\t\"₦\": \"NGN\",\n\t\t\t\"₧\": \"ESP\",\n\t\t\t\"₩\": \"KRW\",\n\t\t\t\"₪\": \"ILS\",\n\t\t\t\"₫\": \"VND\",\n\t\t\t\"₭\": \"LAK\",\n\t\t\t\"₮\": \"MNT\",\n\t\t\t\"₯\": \"GRD\",\n\t\t\t\"₱\": \"ARS\",\n\t\t\t\"₲\": \"PYG\",\n\t\t\t\"₳\": \"ARA\",\n\t\t\t\"₴\": \"UAH\",\n\t\t\t\"₵\": \"GHS\",\n\t\t\t\"¢\": \"cent\",\n\t\t\t\"¥\": \"CNY\",\n\t\t\t\"元\": \"CNY\",\n\t\t\t\"円\": \"YEN\",\n\t\t\t\"﷼\": \"IRR\",\n\t\t\t\"₠\": \"EWE\",\n\t\t\t\"฿\": \"THB\",\n\t\t\t\"₨\": \"INR\",\n\t\t\t\"₹\": \"INR\",\n\t\t\t\"₰\": \"PF\",\n\t\t\t\"₺\": \"TRY\",\n\t\t\t\"؋\": \"AFN\",\n\t\t\t\"₼\": \"AZN\",\n\t\t\t\"лв\": \"BGN\",\n\t\t\t\"៛\": \"KHR\",\n\t\t\t\"₡\": \"CRC\",\n\t\t\t\"₸\": \"KZT\",\n\t\t\t\"ден\": \"MKD\",\n\t\t\t\"zł\": \"PLN\",\n\t\t\t\"₽\": \"RUB\",\n\t\t\t\"₾\": \"GEL\"\n\t\t};\n\t\t/**\n\t\t* special look ahead character array\n\t\t* These characters form with consonants to become 'single'/consonant combo\n\t\t* @type [Array]\n\t\t*/\n\t\tvar lookAheadCharArray = [\"်\", \"ް\"];\n\t\t/**\n\t\t* diatricMap for languages where transliteration changes entirely as more diatrics are added\n\t\t* @type {Object}\n\t\t*/\n\t\tvar diatricMap = {\n\t\t\t\"ာ\": \"a\",\n\t\t\t\"ါ\": \"a\",\n\t\t\t\"ေ\": \"e\",\n\t\t\t\"ဲ\": \"e\",\n\t\t\t\"ိ\": \"i\",\n\t\t\t\"ီ\": \"i\",\n\t\t\t\"ို\": \"o\",\n\t\t\t\"ု\": \"u\",\n\t\t\t\"ူ\": \"u\",\n\t\t\t\"ေါင်\": \"aung\",\n\t\t\t\"ော\": \"aw\",\n\t\t\t\"ော်\": \"aw\",\n\t\t\t\"ေါ\": \"aw\",\n\t\t\t\"ေါ်\": \"aw\",\n\t\t\t\"်\": \"်\",\n\t\t\t\"က်\": \"et\",\n\t\t\t\"ိုက်\": \"aik\",\n\t\t\t\"ောက်\": \"auk\",\n\t\t\t\"င်\": \"in\",\n\t\t\t\"ိုင်\": \"aing\",\n\t\t\t\"ောင်\": \"aung\",\n\t\t\t\"စ်\": \"it\",\n\t\t\t\"ည်\": \"i\",\n\t\t\t\"တ်\": \"at\",\n\t\t\t\"ိတ်\": \"eik\",\n\t\t\t\"ုတ်\": \"ok\",\n\t\t\t\"ွတ်\": \"ut\",\n\t\t\t\"ေတ်\": \"it\",\n\t\t\t\"ဒ်\": \"d\",\n\t\t\t\"ိုဒ်\": \"ok\",\n\t\t\t\"ုဒ်\": \"ait\",\n\t\t\t\"န်\": \"an\",\n\t\t\t\"ာန်\": \"an\",\n\t\t\t\"ိန်\": \"ein\",\n\t\t\t\"ုန်\": \"on\",\n\t\t\t\"ွန်\": \"un\",\n\t\t\t\"ပ်\": \"at\",\n\t\t\t\"ိပ်\": \"eik\",\n\t\t\t\"ုပ်\": \"ok\",\n\t\t\t\"ွပ်\": \"ut\",\n\t\t\t\"န်ုပ်\": \"nub\",\n\t\t\t\"မ်\": \"an\",\n\t\t\t\"ိမ်\": \"ein\",\n\t\t\t\"ုမ်\": \"on\",\n\t\t\t\"ွမ်\": \"un\",\n\t\t\t\"ယ်\": \"e\",\n\t\t\t\"ိုလ်\": \"ol\",\n\t\t\t\"ဉ်\": \"in\",\n\t\t\t\"ံ\": \"an\",\n\t\t\t\"ိံ\": \"ein\",\n\t\t\t\"ုံ\": \"on\",\n\t\t\t\"ައް\": \"ah\",\n\t\t\t\"ަށް\": \"ah\"\n\t\t};\n\t\t/**\n\t\t* langCharMap language specific characters translations\n\t\t* @type {Object}\n\t\t*/\n\t\tvar langCharMap = {\n\t\t\t\"en\": {},\n\t\t\t\"az\": {\n\t\t\t\t\"ç\": \"c\",\n\t\t\t\t\"ə\": \"e\",\n\t\t\t\t\"ğ\": \"g\",\n\t\t\t\t\"ı\": \"i\",\n\t\t\t\t\"ö\": \"o\",\n\t\t\t\t\"ş\": \"s\",\n\t\t\t\t\"ü\": \"u\",\n\t\t\t\t\"Ç\": \"C\",\n\t\t\t\t\"Ə\": \"E\",\n\t\t\t\t\"Ğ\": \"G\",\n\t\t\t\t\"İ\": \"I\",\n\t\t\t\t\"Ö\": \"O\",\n\t\t\t\t\"Ş\": \"S\",\n\t\t\t\t\"Ü\": \"U\"\n\t\t\t},\n\t\t\t\"cs\": {\n\t\t\t\t\"č\": \"c\",\n\t\t\t\t\"ď\": \"d\",\n\t\t\t\t\"ě\": \"e\",\n\t\t\t\t\"ň\": \"n\",\n\t\t\t\t\"ř\": \"r\",\n\t\t\t\t\"š\": \"s\",\n\t\t\t\t\"ť\": \"t\",\n\t\t\t\t\"ů\": \"u\",\n\t\t\t\t\"ž\": \"z\",\n\t\t\t\t\"Č\": \"C\",\n\t\t\t\t\"Ď\": \"D\",\n\t\t\t\t\"Ě\": \"E\",\n\t\t\t\t\"Ň\": \"N\",\n\t\t\t\t\"Ř\": \"R\",\n\t\t\t\t\"Š\": \"S\",\n\t\t\t\t\"Ť\": \"T\",\n\t\t\t\t\"Ů\": \"U\",\n\t\t\t\t\"Ž\": \"Z\"\n\t\t\t},\n\t\t\t\"fi\": {\n\t\t\t\t\"ä\": \"a\",\n\t\t\t\t\"Ä\": \"A\",\n\t\t\t\t\"ö\": \"o\",\n\t\t\t\t\"Ö\": \"O\"\n\t\t\t},\n\t\t\t\"hu\": {\n\t\t\t\t\"ä\": \"a\",\n\t\t\t\t\"Ä\": \"A\",\n\t\t\t\t\"ö\": \"o\",\n\t\t\t\t\"Ö\": \"O\",\n\t\t\t\t\"ü\": \"u\",\n\t\t\t\t\"Ü\": \"U\",\n\t\t\t\t\"ű\": \"u\",\n\t\t\t\t\"Ű\": \"U\"\n\t\t\t},\n\t\t\t\"lt\": {\n\t\t\t\t\"ą\": \"a\",\n\t\t\t\t\"č\": \"c\",\n\t\t\t\t\"ę\": \"e\",\n\t\t\t\t\"ė\": \"e\",\n\t\t\t\t\"į\": \"i\",\n\t\t\t\t\"š\": \"s\",\n\t\t\t\t\"ų\": \"u\",\n\t\t\t\t\"ū\": \"u\",\n\t\t\t\t\"ž\": \"z\",\n\t\t\t\t\"Ą\": \"A\",\n\t\t\t\t\"Č\": \"C\",\n\t\t\t\t\"Ę\": \"E\",\n\t\t\t\t\"Ė\": \"E\",\n\t\t\t\t\"Į\": \"I\",\n\t\t\t\t\"Š\": \"S\",\n\t\t\t\t\"Ų\": \"U\",\n\t\t\t\t\"Ū\": \"U\"\n\t\t\t},\n\t\t\t\"lv\": {\n\t\t\t\t\"ā\": \"a\",\n\t\t\t\t\"č\": \"c\",\n\t\t\t\t\"ē\": \"e\",\n\t\t\t\t\"ģ\": \"g\",\n\t\t\t\t\"ī\": \"i\",\n\t\t\t\t\"ķ\": \"k\",\n\t\t\t\t\"ļ\": \"l\",\n\t\t\t\t\"ņ\": \"n\",\n\t\t\t\t\"š\": \"s\",\n\t\t\t\t\"ū\": \"u\",\n\t\t\t\t\"ž\": \"z\",\n\t\t\t\t\"Ā\": \"A\",\n\t\t\t\t\"Č\": \"C\",\n\t\t\t\t\"Ē\": \"E\",\n\t\t\t\t\"Ģ\": \"G\",\n\t\t\t\t\"Ī\": \"i\",\n\t\t\t\t\"Ķ\": \"k\",\n\t\t\t\t\"Ļ\": \"L\",\n\t\t\t\t\"Ņ\": \"N\",\n\t\t\t\t\"Š\": \"S\",\n\t\t\t\t\"Ū\": \"u\",\n\t\t\t\t\"Ž\": \"Z\"\n\t\t\t},\n\t\t\t\"pl\": {\n\t\t\t\t\"ą\": \"a\",\n\t\t\t\t\"ć\": \"c\",\n\t\t\t\t\"ę\": \"e\",\n\t\t\t\t\"ł\": \"l\",\n\t\t\t\t\"ń\": \"n\",\n\t\t\t\t\"ó\": \"o\",\n\t\t\t\t\"ś\": \"s\",\n\t\t\t\t\"ź\": \"z\",\n\t\t\t\t\"ż\": \"z\",\n\t\t\t\t\"Ą\": \"A\",\n\t\t\t\t\"Ć\": \"C\",\n\t\t\t\t\"Ę\": \"e\",\n\t\t\t\t\"Ł\": \"L\",\n\t\t\t\t\"Ń\": \"N\",\n\t\t\t\t\"Ó\": \"O\",\n\t\t\t\t\"Ś\": \"S\",\n\t\t\t\t\"Ź\": \"Z\",\n\t\t\t\t\"Ż\": \"Z\"\n\t\t\t},\n\t\t\t\"sv\": {\n\t\t\t\t\"ä\": \"a\",\n\t\t\t\t\"Ä\": \"A\",\n\t\t\t\t\"ö\": \"o\",\n\t\t\t\t\"Ö\": \"O\"\n\t\t\t},\n\t\t\t\"sk\": {\n\t\t\t\t\"ä\": \"a\",\n\t\t\t\t\"Ä\": \"A\"\n\t\t\t},\n\t\t\t\"sr\": {\n\t\t\t\t\"љ\": \"lj\",\n\t\t\t\t\"њ\": \"nj\",\n\t\t\t\t\"Љ\": \"Lj\",\n\t\t\t\t\"Њ\": \"Nj\",\n\t\t\t\t\"đ\": \"dj\",\n\t\t\t\t\"Đ\": \"Dj\"\n\t\t\t},\n\t\t\t\"tr\": {\n\t\t\t\t\"Ü\": \"U\",\n\t\t\t\t\"Ö\": \"O\",\n\t\t\t\t\"ü\": \"u\",\n\t\t\t\t\"ö\": \"o\"\n\t\t\t}\n\t\t};\n\t\t/**\n\t\t* symbolMap language specific symbol translations\n\t\t* translations must be transliterated already\n\t\t* @type {Object}\n\t\t*/\n\t\tvar symbolMap = {\n\t\t\t\"ar\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"la-nihaya\",\n\t\t\t\t\"♥\": \"hob\",\n\t\t\t\t\"&\": \"wa\",\n\t\t\t\t\"|\": \"aw\",\n\t\t\t\t\"<\": \"aqal-men\",\n\t\t\t\t\">\": \"akbar-men\",\n\t\t\t\t\"∑\": \"majmou\",\n\t\t\t\t\"¤\": \"omla\"\n\t\t\t},\n\t\t\t\"az\": {},\n\t\t\t\"ca\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinit\",\n\t\t\t\t\"♥\": \"amor\",\n\t\t\t\t\"&\": \"i\",\n\t\t\t\t\"|\": \"o\",\n\t\t\t\t\"<\": \"menys que\",\n\t\t\t\t\">\": \"mes que\",\n\t\t\t\t\"∑\": \"suma dels\",\n\t\t\t\t\"¤\": \"moneda\"\n\t\t\t},\n\t\t\t\"cs\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"nekonecno\",\n\t\t\t\t\"♥\": \"laska\",\n\t\t\t\t\"&\": \"a\",\n\t\t\t\t\"|\": \"nebo\",\n\t\t\t\t\"<\": \"mensi nez\",\n\t\t\t\t\">\": \"vetsi nez\",\n\t\t\t\t\"∑\": \"soucet\",\n\t\t\t\t\"¤\": \"mena\"\n\t\t\t},\n\t\t\t\"de\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"unendlich\",\n\t\t\t\t\"♥\": \"Liebe\",\n\t\t\t\t\"&\": \"und\",\n\t\t\t\t\"|\": \"oder\",\n\t\t\t\t\"<\": \"kleiner als\",\n\t\t\t\t\">\": \"groesser als\",\n\t\t\t\t\"∑\": \"Summe von\",\n\t\t\t\t\"¤\": \"Waehrung\"\n\t\t\t},\n\t\t\t\"dv\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"kolunulaa\",\n\t\t\t\t\"♥\": \"loabi\",\n\t\t\t\t\"&\": \"aai\",\n\t\t\t\t\"|\": \"noonee\",\n\t\t\t\t\"<\": \"ah vure kuda\",\n\t\t\t\t\">\": \"ah vure bodu\",\n\t\t\t\t\"∑\": \"jumula\",\n\t\t\t\t\"¤\": \"faisaa\"\n\t\t\t},\n\t\t\t\"en\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinity\",\n\t\t\t\t\"♥\": \"love\",\n\t\t\t\t\"&\": \"and\",\n\t\t\t\t\"|\": \"or\",\n\t\t\t\t\"<\": \"less than\",\n\t\t\t\t\">\": \"greater than\",\n\t\t\t\t\"∑\": \"sum\",\n\t\t\t\t\"¤\": \"currency\"\n\t\t\t},\n\t\t\t\"es\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinito\",\n\t\t\t\t\"♥\": \"amor\",\n\t\t\t\t\"&\": \"y\",\n\t\t\t\t\"|\": \"u\",\n\t\t\t\t\"<\": \"menos que\",\n\t\t\t\t\">\": \"mas que\",\n\t\t\t\t\"∑\": \"suma de los\",\n\t\t\t\t\"¤\": \"moneda\"\n\t\t\t},\n\t\t\t\"fa\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"bi-nahayat\",\n\t\t\t\t\"♥\": \"eshgh\",\n\t\t\t\t\"&\": \"va\",\n\t\t\t\t\"|\": \"ya\",\n\t\t\t\t\"<\": \"kamtar-az\",\n\t\t\t\t\">\": \"bishtar-az\",\n\t\t\t\t\"∑\": \"majmooe\",\n\t\t\t\t\"¤\": \"vahed\"\n\t\t\t},\n\t\t\t\"fi\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"aarettomyys\",\n\t\t\t\t\"♥\": \"rakkaus\",\n\t\t\t\t\"&\": \"ja\",\n\t\t\t\t\"|\": \"tai\",\n\t\t\t\t\"<\": \"pienempi kuin\",\n\t\t\t\t\">\": \"suurempi kuin\",\n\t\t\t\t\"∑\": \"summa\",\n\t\t\t\t\"¤\": \"valuutta\"\n\t\t\t},\n\t\t\t\"fr\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infiniment\",\n\t\t\t\t\"♥\": \"Amour\",\n\t\t\t\t\"&\": \"et\",\n\t\t\t\t\"|\": \"ou\",\n\t\t\t\t\"<\": \"moins que\",\n\t\t\t\t\">\": \"superieure a\",\n\t\t\t\t\"∑\": \"somme des\",\n\t\t\t\t\"¤\": \"monnaie\"\n\t\t\t},\n\t\t\t\"ge\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"usasruloba\",\n\t\t\t\t\"♥\": \"siqvaruli\",\n\t\t\t\t\"&\": \"da\",\n\t\t\t\t\"|\": \"an\",\n\t\t\t\t\"<\": \"naklebi\",\n\t\t\t\t\">\": \"meti\",\n\t\t\t\t\"∑\": \"jami\",\n\t\t\t\t\"¤\": \"valuta\"\n\t\t\t},\n\t\t\t\"gr\": {},\n\t\t\t\"hu\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"vegtelen\",\n\t\t\t\t\"♥\": \"szerelem\",\n\t\t\t\t\"&\": \"es\",\n\t\t\t\t\"|\": \"vagy\",\n\t\t\t\t\"<\": \"kisebb mint\",\n\t\t\t\t\">\": \"nagyobb mint\",\n\t\t\t\t\"∑\": \"szumma\",\n\t\t\t\t\"¤\": \"penznem\"\n\t\t\t},\n\t\t\t\"it\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinito\",\n\t\t\t\t\"♥\": \"amore\",\n\t\t\t\t\"&\": \"e\",\n\t\t\t\t\"|\": \"o\",\n\t\t\t\t\"<\": \"minore di\",\n\t\t\t\t\">\": \"maggiore di\",\n\t\t\t\t\"∑\": \"somma\",\n\t\t\t\t\"¤\": \"moneta\"\n\t\t\t},\n\t\t\t\"lt\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"begalybe\",\n\t\t\t\t\"♥\": \"meile\",\n\t\t\t\t\"&\": \"ir\",\n\t\t\t\t\"|\": \"ar\",\n\t\t\t\t\"<\": \"maziau nei\",\n\t\t\t\t\">\": \"daugiau nei\",\n\t\t\t\t\"∑\": \"suma\",\n\t\t\t\t\"¤\": \"valiuta\"\n\t\t\t},\n\t\t\t\"lv\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"bezgaliba\",\n\t\t\t\t\"♥\": \"milestiba\",\n\t\t\t\t\"&\": \"un\",\n\t\t\t\t\"|\": \"vai\",\n\t\t\t\t\"<\": \"mazak neka\",\n\t\t\t\t\">\": \"lielaks neka\",\n\t\t\t\t\"∑\": \"summa\",\n\t\t\t\t\"¤\": \"valuta\"\n\t\t\t},\n\t\t\t\"my\": {\n\t\t\t\t\"∆\": \"kwahkhyaet\",\n\t\t\t\t\"∞\": \"asaonasme\",\n\t\t\t\t\"♥\": \"akhyait\",\n\t\t\t\t\"&\": \"nhin\",\n\t\t\t\t\"|\": \"tho\",\n\t\t\t\t\"<\": \"ngethaw\",\n\t\t\t\t\">\": \"kyithaw\",\n\t\t\t\t\"∑\": \"paungld\",\n\t\t\t\t\"¤\": \"ngwekye\"\n\t\t\t},\n\t\t\t\"mk\": {},\n\t\t\t\"nl\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"oneindig\",\n\t\t\t\t\"♥\": \"liefde\",\n\t\t\t\t\"&\": \"en\",\n\t\t\t\t\"|\": \"of\",\n\t\t\t\t\"<\": \"kleiner dan\",\n\t\t\t\t\">\": \"groter dan\",\n\t\t\t\t\"∑\": \"som\",\n\t\t\t\t\"¤\": \"valuta\"\n\t\t\t},\n\t\t\t\"pl\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"nieskonczonosc\",\n\t\t\t\t\"♥\": \"milosc\",\n\t\t\t\t\"&\": \"i\",\n\t\t\t\t\"|\": \"lub\",\n\t\t\t\t\"<\": \"mniejsze niz\",\n\t\t\t\t\">\": \"wieksze niz\",\n\t\t\t\t\"∑\": \"suma\",\n\t\t\t\t\"¤\": \"waluta\"\n\t\t\t},\n\t\t\t\"pt\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinito\",\n\t\t\t\t\"♥\": \"amor\",\n\t\t\t\t\"&\": \"e\",\n\t\t\t\t\"|\": \"ou\",\n\t\t\t\t\"<\": \"menor que\",\n\t\t\t\t\">\": \"maior que\",\n\t\t\t\t\"∑\": \"soma\",\n\t\t\t\t\"¤\": \"moeda\"\n\t\t\t},\n\t\t\t\"ro\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"infinit\",\n\t\t\t\t\"♥\": \"dragoste\",\n\t\t\t\t\"&\": \"si\",\n\t\t\t\t\"|\": \"sau\",\n\t\t\t\t\"<\": \"mai mic ca\",\n\t\t\t\t\">\": \"mai mare ca\",\n\t\t\t\t\"∑\": \"suma\",\n\t\t\t\t\"¤\": \"valuta\"\n\t\t\t},\n\t\t\t\"ru\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"beskonechno\",\n\t\t\t\t\"♥\": \"lubov\",\n\t\t\t\t\"&\": \"i\",\n\t\t\t\t\"|\": \"ili\",\n\t\t\t\t\"<\": \"menshe\",\n\t\t\t\t\">\": \"bolshe\",\n\t\t\t\t\"∑\": \"summa\",\n\t\t\t\t\"¤\": \"valjuta\"\n\t\t\t},\n\t\t\t\"sk\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"nekonecno\",\n\t\t\t\t\"♥\": \"laska\",\n\t\t\t\t\"&\": \"a\",\n\t\t\t\t\"|\": \"alebo\",\n\t\t\t\t\"<\": \"menej ako\",\n\t\t\t\t\">\": \"viac ako\",\n\t\t\t\t\"∑\": \"sucet\",\n\t\t\t\t\"¤\": \"mena\"\n\t\t\t},\n\t\t\t\"sr\": {},\n\t\t\t\"tr\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"sonsuzluk\",\n\t\t\t\t\"♥\": \"ask\",\n\t\t\t\t\"&\": \"ve\",\n\t\t\t\t\"|\": \"veya\",\n\t\t\t\t\"<\": \"kucuktur\",\n\t\t\t\t\">\": \"buyuktur\",\n\t\t\t\t\"∑\": \"toplam\",\n\t\t\t\t\"¤\": \"para birimi\"\n\t\t\t},\n\t\t\t\"uk\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"bezkinechnist\",\n\t\t\t\t\"♥\": \"lubov\",\n\t\t\t\t\"&\": \"i\",\n\t\t\t\t\"|\": \"abo\",\n\t\t\t\t\"<\": \"menshe\",\n\t\t\t\t\">\": \"bilshe\",\n\t\t\t\t\"∑\": \"suma\",\n\t\t\t\t\"¤\": \"valjuta\"\n\t\t\t},\n\t\t\t\"vn\": {\n\t\t\t\t\"∆\": \"delta\",\n\t\t\t\t\"∞\": \"vo cuc\",\n\t\t\t\t\"♥\": \"yeu\",\n\t\t\t\t\"&\": \"va\",\n\t\t\t\t\"|\": \"hoac\",\n\t\t\t\t\"<\": \"nho hon\",\n\t\t\t\t\">\": \"lon hon\",\n\t\t\t\t\"∑\": \"tong\",\n\t\t\t\t\"¤\": \"tien te\"\n\t\t\t}\n\t\t};\n\t\tvar uricChars = [\n\t\t\t\";\",\n\t\t\t\"?\",\n\t\t\t\":\",\n\t\t\t\"@\",\n\t\t\t\"&\",\n\t\t\t\"=\",\n\t\t\t\"+\",\n\t\t\t\"$\",\n\t\t\t\",\",\n\t\t\t\"/\"\n\t\t].join(\"\");\n\t\tvar uricNoSlashChars = [\n\t\t\t\";\",\n\t\t\t\"?\",\n\t\t\t\":\",\n\t\t\t\"@\",\n\t\t\t\"&\",\n\t\t\t\"=\",\n\t\t\t\"+\",\n\t\t\t\"$\",\n\t\t\t\",\"\n\t\t].join(\"\");\n\t\tvar markChars = [\n\t\t\t\".\",\n\t\t\t\"!\",\n\t\t\t\"~\",\n\t\t\t\"*\",\n\t\t\t\"'\",\n\t\t\t\"(\",\n\t\t\t\")\"\n\t\t].join(\"\");\n\t\t/**\n\t\t* getSlug\n\t\t* @param {string} input input string\n\t\t* @param {object|string} opts config object or separator string/char\n\t\t* @api public\n\t\t* @return {string} sluggified string\n\t\t*/\n\t\tvar getSlug = function getSlug(input, opts) {\n\t\t\tvar separator = \"-\";\n\t\t\tvar result = \"\";\n\t\t\tvar diatricString = \"\";\n\t\t\tvar convertSymbols = true;\n\t\t\tvar customReplacements = {};\n\t\t\tvar maintainCase;\n\t\t\tvar titleCase;\n\t\t\tvar truncate;\n\t\t\tvar uricFlag;\n\t\t\tvar uricNoSlashFlag;\n\t\t\tvar markFlag;\n\t\t\tvar symbol;\n\t\t\tvar langChar;\n\t\t\tvar lucky;\n\t\t\tvar i;\n\t\t\tvar ch;\n\t\t\tvar l;\n\t\t\tvar lastCharWasSymbol;\n\t\t\tvar lastCharWasDiatric;\n\t\t\tvar allowedChars = \"\";\n\t\t\tif (typeof input !== \"string\") return \"\";\n\t\t\tif (typeof opts === \"string\") separator = opts;\n\t\t\tsymbol = symbolMap.en;\n\t\t\tlangChar = langCharMap.en;\n\t\t\tif (typeof opts === \"object\") {\n\t\t\t\tmaintainCase = opts.maintainCase || false;\n\t\t\t\tcustomReplacements = opts.custom && typeof opts.custom === \"object\" ? opts.custom : customReplacements;\n\t\t\t\ttruncate = +opts.truncate > 1 && opts.truncate || false;\n\t\t\t\turicFlag = opts.uric || false;\n\t\t\t\turicNoSlashFlag = opts.uricNoSlash || false;\n\t\t\t\tmarkFlag = opts.mark || false;\n\t\t\t\tconvertSymbols = opts.symbols === false || opts.lang === false ? false : true;\n\t\t\t\tseparator = opts.separator || separator;\n\t\t\t\tif (uricFlag) allowedChars += uricChars;\n\t\t\t\tif (uricNoSlashFlag) allowedChars += uricNoSlashChars;\n\t\t\t\tif (markFlag) allowedChars += markChars;\n\t\t\t\tsymbol = opts.lang && symbolMap[opts.lang] && convertSymbols ? symbolMap[opts.lang] : convertSymbols ? symbolMap.en : {};\n\t\t\t\tlangChar = opts.lang && langCharMap[opts.lang] ? langCharMap[opts.lang] : opts.lang === false || opts.lang === true ? {} : langCharMap.en;\n\t\t\t\tif (opts.titleCase && typeof opts.titleCase.length === \"number\" && Array.prototype.toString.call(opts.titleCase)) {\n\t\t\t\t\topts.titleCase.forEach(function(v) {\n\t\t\t\t\t\tcustomReplacements[v + \"\"] = v + \"\";\n\t\t\t\t\t});\n\t\t\t\t\ttitleCase = true;\n\t\t\t\t} else titleCase = !!opts.titleCase;\n\t\t\t\tif (opts.custom && typeof opts.custom.length === \"number\" && Array.prototype.toString.call(opts.custom)) opts.custom.forEach(function(v) {\n\t\t\t\t\tcustomReplacements[v + \"\"] = v + \"\";\n\t\t\t\t});\n\t\t\t\tObject.keys(customReplacements).forEach(function(v) {\n\t\t\t\t\tvar r;\n\t\t\t\t\tif (v.length > 1) r = new RegExp(\"\\\\b\" + escapeChars(v) + \"\\\\b\", \"gi\");\n\t\t\t\t\telse r = new RegExp(escapeChars(v), \"gi\");\n\t\t\t\t\tinput = input.replace(r, customReplacements[v]);\n\t\t\t\t});\n\t\t\t\tfor (ch in customReplacements) allowedChars += ch;\n\t\t\t}\n\t\t\tallowedChars += separator;\n\t\t\tallowedChars = escapeChars(allowedChars);\n\t\t\tinput = input.replace(/(^\\s+|\\s+$)/g, \"\");\n\t\t\tlastCharWasSymbol = false;\n\t\t\tlastCharWasDiatric = false;\n\t\t\tfor (i = 0, l = input.length; i < l; i++) {\n\t\t\t\tch = input[i];\n\t\t\t\tif (isReplacedCustomChar(ch, customReplacements)) lastCharWasSymbol = false;\n\t\t\t\telse if (langChar[ch]) {\n\t\t\t\t\tch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? \" \" + langChar[ch] : langChar[ch];\n\t\t\t\t\tlastCharWasSymbol = false;\n\t\t\t\t} else if (ch in charMap) {\n\t\t\t\t\tif (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {\n\t\t\t\t\t\tdiatricString += ch;\n\t\t\t\t\t\tch = \"\";\n\t\t\t\t\t} else if (lastCharWasDiatric === true) {\n\t\t\t\t\t\tch = diatricMap[diatricString] + charMap[ch];\n\t\t\t\t\t\tdiatricString = \"\";\n\t\t\t\t\t} else ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? \" \" + charMap[ch] : charMap[ch];\n\t\t\t\t\tlastCharWasSymbol = false;\n\t\t\t\t\tlastCharWasDiatric = false;\n\t\t\t\t} else if (ch in diatricMap) {\n\t\t\t\t\tdiatricString += ch;\n\t\t\t\t\tch = \"\";\n\t\t\t\t\tif (i === l - 1) ch = diatricMap[diatricString];\n\t\t\t\t\tlastCharWasDiatric = true;\n\t\t\t\t} else if (symbol[ch] && !(uricFlag && uricChars.indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars.indexOf(ch) !== -1)) {\n\t\t\t\t\tch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];\n\t\t\t\t\tch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : \"\";\n\t\t\t\t\tlastCharWasSymbol = true;\n\t\t\t\t} else {\n\t\t\t\t\tif (lastCharWasDiatric === true) {\n\t\t\t\t\t\tch = diatricMap[diatricString] + ch;\n\t\t\t\t\t\tdiatricString = \"\";\n\t\t\t\t\t\tlastCharWasDiatric = false;\n\t\t\t\t\t} else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) ch = \" \" + ch;\n\t\t\t\t\tlastCharWasSymbol = false;\n\t\t\t\t}\n\t\t\t\tresult += ch.replace(new RegExp(\"[^\\\\w\\\\s\" + allowedChars + \"_-]\", \"g\"), separator);\n\t\t\t}\n\t\t\tif (titleCase) result = result.replace(/(\\w)(\\S*)/g, function(_, i, r) {\n\t\t\t\tvar j = i.toUpperCase() + (r !== null ? r : \"\");\n\t\t\t\treturn Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0 ? j : j.toLowerCase();\n\t\t\t});\n\t\t\tresult = result.replace(/\\s+/g, separator).replace(new RegExp(\"\\\\\" + separator + \"+\", \"g\"), separator).replace(new RegExp(\"(^\\\\\" + separator + \"+|\\\\\" + separator + \"+$)\", \"g\"), \"\");\n\t\t\tif (truncate && result.length > truncate) {\n\t\t\t\tlucky = result.charAt(truncate) === separator;\n\t\t\t\tresult = result.slice(0, truncate);\n\t\t\t\tif (!lucky) result = result.slice(0, result.lastIndexOf(separator));\n\t\t\t}\n\t\t\tif (!maintainCase && !titleCase) result = result.toLowerCase();\n\t\t\treturn result;\n\t\t};\n\t\t/**\n\t\t* createSlug curried(opts)(input)\n\t\t* @param {object|string} opts config object or input string\n\t\t* @return {Function} function getSlugWithConfig()\n\t\t**/\n\t\tvar createSlug = function createSlug(opts) {\n\t\t\t/**\n\t\t\t* getSlugWithConfig\n\t\t\t* @param {string} input string\n\t\t\t* @return {string} slug string\n\t\t\t*/\n\t\t\treturn function getSlugWithConfig(input) {\n\t\t\t\treturn getSlug(input, opts);\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t* escape Chars\n\t\t* @param {string} input string\n\t\t*/\n\t\tvar escapeChars = function escapeChars(input) {\n\t\t\treturn input.replace(/[-\\\\^$*+?.()|[\\]{}\\/]/g, \"\\\\$&\");\n\t\t};\n\t\t/**\n\t\t* check if the char is an already converted char from custom list\n\t\t* @param {char} ch character to check\n\t\t* @param {object} customReplacements custom translation map\n\t\t*/\n\t\tvar isReplacedCustomChar = function(ch, customReplacements) {\n\t\t\tfor (var c in customReplacements) if (customReplacements[c] === ch) return true;\n\t\t};\n\t\tif (typeof module !== \"undefined\" && module.exports) {\n\t\t\tmodule.exports = getSlug;\n\t\t\tmodule.exports.createSlug = createSlug;\n\t\t} else if (typeof define !== \"undefined\" && define.amd) define([], function() {\n\t\t\treturn getSlug;\n\t\t});\n\t\telse try {\n\t\t\tif (root.getSlug || root.createSlug) throw \"speakingurl: globals exists /(getSlug|createSlug)/\";\n\t\t\telse {\n\t\t\t\troot.getSlug = getSlug;\n\t\t\t\troot.createSlug = createSlug;\n\t\t\t}\n\t\t} catch (e) {}\n\t})(exports);\n}));\n//#endregion\n//#region src/core/app/index.ts\nvar import_speakingurl = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {\n\tmodule.exports = require_speakingurl$1();\n})))(), 1);\nconst appRecordInfo = target.__VUE_DEVTOOLS_NEXT_APP_RECORD_INFO__ ??= {\n\tid: 0,\n\tappIds: /* @__PURE__ */ new Set()\n};\nfunction getAppRecordName(app, fallbackName) {\n\treturn app?._component?.name || `App ${fallbackName}`;\n}\nfunction getAppRootInstance(app) {\n\tif (app._instance) return app._instance;\n\telse if (app._container?._vnode?.component) return app._container?._vnode?.component;\n}\nfunction removeAppRecordId(app) {\n\tconst id = app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__;\n\tif (id != null) {\n\t\tappRecordInfo.appIds.delete(id);\n\t\tappRecordInfo.id--;\n\t}\n}\nfunction getAppRecordId(app, defaultId) {\n\tif (app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ != null) return app.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__;\n\tlet id = defaultId ?? (appRecordInfo.id++).toString();\n\tif (defaultId && appRecordInfo.appIds.has(id)) {\n\t\tlet count = 1;\n\t\twhile (appRecordInfo.appIds.has(`${defaultId}_${count}`)) count++;\n\t\tid = `${defaultId}_${count}`;\n\t}\n\tappRecordInfo.appIds.add(id);\n\tapp.__VUE_DEVTOOLS_NEXT_APP_RECORD_ID__ = id;\n\treturn id;\n}\nfunction createAppRecord(app, types) {\n\tconst rootInstance = getAppRootInstance(app);\n\tif (rootInstance) {\n\t\tappRecordInfo.id++;\n\t\tconst name = getAppRecordName(app, appRecordInfo.id.toString());\n\t\tconst id = getAppRecordId(app, (0, import_speakingurl.default)(name));\n\t\tconst [el] = getRootElementsFromComponentInstance(rootInstance);\n\t\tconst record = {\n\t\t\tid,\n\t\t\tname,\n\t\t\ttypes,\n\t\t\tinstanceMap: /* @__PURE__ */ new Map(),\n\t\t\tperfGroupIds: /* @__PURE__ */ new Map(),\n\t\t\trootInstance,\n\t\t\tiframe: isBrowser && document !== el?.ownerDocument ? el?.ownerDocument?.location?.pathname : void 0\n\t\t};\n\t\tapp.__VUE_DEVTOOLS_NEXT_APP_RECORD__ = record;\n\t\tconst rootId = `${record.id}:root`;\n\t\trecord.instanceMap.set(rootId, record.rootInstance);\n\t\trecord.rootInstance.__VUE_DEVTOOLS_NEXT_UID__ = rootId;\n\t\treturn record;\n\t} else return {};\n}\n//#endregion\n//#region src/core/iframe/index.ts\nfunction detectIframeApp(target, inIframe = false) {\n\tif (inIframe) {\n\t\tfunction sendEventToParent(cb) {\n\t\t\ttry {\n\t\t\t\tconst hook = window.parent.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\t\t\t\tif (hook) cb(hook);\n\t\t\t} catch (e) {}\n\t\t}\n\t\tconst hook = {\n\t\t\tid: \"vue-devtools-next\",\n\t\t\tdevtoolsVersion: \"7.0\",\n\t\t\ton: (event, cb) => {\n\t\t\t\tsendEventToParent((hook) => {\n\t\t\t\t\thook.on(event, cb);\n\t\t\t\t});\n\t\t\t},\n\t\t\tonce: (event, cb) => {\n\t\t\t\tsendEventToParent((hook) => {\n\t\t\t\t\thook.once(event, cb);\n\t\t\t\t});\n\t\t\t},\n\t\t\toff: (event, cb) => {\n\t\t\t\tsendEventToParent((hook) => {\n\t\t\t\t\thook.off(event, cb);\n\t\t\t\t});\n\t\t\t},\n\t\t\temit: (event, ...payload) => {\n\t\t\t\tsendEventToParent((hook) => {\n\t\t\t\t\thook.emit(event, ...payload);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tObject.defineProperty(target, \"__VUE_DEVTOOLS_GLOBAL_HOOK__\", {\n\t\t\tget() {\n\t\t\t\treturn hook;\n\t\t\t},\n\t\t\tconfigurable: true\n\t\t});\n\t}\n\tfunction injectVueHookToIframe(iframe) {\n\t\tif (iframe.__vdevtools__injected) return;\n\t\ttry {\n\t\t\tiframe.__vdevtools__injected = true;\n\t\t\tconst inject = () => {\n\t\t\t\ttry {\n\t\t\t\t\tiframe.contentWindow.__VUE_DEVTOOLS_IFRAME__ = iframe;\n\t\t\t\t\tconst script = iframe.contentDocument.createElement(\"script\");\n\t\t\t\t\tscript.textContent = `;(${detectIframeApp.toString()})(window, true)`;\n\t\t\t\t\tiframe.contentDocument.documentElement.appendChild(script);\n\t\t\t\t\tscript.parentNode.removeChild(script);\n\t\t\t\t} catch (e) {}\n\t\t\t};\n\t\t\tinject();\n\t\t\tiframe.addEventListener(\"load\", () => inject());\n\t\t} catch (e) {}\n\t}\n\tfunction injectVueHookToIframes() {\n\t\tif (typeof window === \"undefined\") return;\n\t\tconst iframes = Array.from(document.querySelectorAll(\"iframe:not([data-vue-devtools-ignore])\"));\n\t\tfor (const iframe of iframes) injectVueHookToIframe(iframe);\n\t}\n\tinjectVueHookToIframes();\n\tlet iframeAppChecks = 0;\n\tconst iframeAppCheckTimer = setInterval(() => {\n\t\tinjectVueHookToIframes();\n\t\tiframeAppChecks++;\n\t\tif (iframeAppChecks >= 5) clearInterval(iframeAppCheckTimer);\n\t}, 1e3);\n}\n//#endregion\n//#region src/core/index.ts\nfunction initDevTools() {\n\tdetectIframeApp(target);\n\tupdateDevToolsState({ vitePluginDetected: getDevToolsEnv().vitePluginDetected });\n\tconst isDevToolsNext = target.__VUE_DEVTOOLS_GLOBAL_HOOK__?.id === \"vue-devtools-next\";\n\tif (target.__VUE_DEVTOOLS_GLOBAL_HOOK__ && isDevToolsNext) return;\n\tconst _devtoolsHook = createDevToolsHook();\n\tif (target.__VUE_DEVTOOLS_HOOK_REPLAY__) try {\n\t\ttarget.__VUE_DEVTOOLS_HOOK_REPLAY__.forEach((cb) => cb(_devtoolsHook));\n\t\ttarget.__VUE_DEVTOOLS_HOOK_REPLAY__ = [];\n\t} catch (e) {\n\t\tconsole.error(\"[vue-devtools] Error during hook replay\", e);\n\t}\n\t_devtoolsHook.once(\"init\", (Vue) => {\n\t\ttarget.__VUE_DEVTOOLS_VUE2_APP_DETECTED__ = true;\n\t\tconsole.log(\"%c[_____Vue DevTools v7 log_____]\", \"color: red; font-bold: 600; font-size: 16px;\");\n\t\tconsole.log(\"%cVue DevTools v7 detected in your Vue2 project. v7 only supports Vue3 and will not work.\", \"font-bold: 500; font-size: 14px;\");\n\t\tconst legacyChromeUrl = \"https://chromewebstore.google.com/detail/vuejs-devtools/iaajmlceplecbljialhhkmedjlpdblhp\";\n\t\tconst legacyFirefoxUrl = \"https://addons.mozilla.org/firefox/addon/vue-js-devtools-v6-legacy\";\n\t\tconsole.log(`%cThe legacy version of chrome extension that supports both Vue 2 and Vue 3 has been moved to %c ${legacyChromeUrl}`, \"font-size: 14px;\", \"text-decoration: underline; cursor: pointer;font-size: 14px;\");\n\t\tconsole.log(`%cThe legacy version of firefox extension that supports both Vue 2 and Vue 3 has been moved to %c ${legacyFirefoxUrl}`, \"font-size: 14px;\", \"text-decoration: underline; cursor: pointer;font-size: 14px;\");\n\t\tconsole.log(\"%cPlease install and enable only the legacy version for your Vue2 app.\", \"font-bold: 500; font-size: 14px;\");\n\t\tconsole.log(\"%c[_____Vue DevTools v7 log_____]\", \"color: red; font-bold: 600; font-size: 16px;\");\n\t});\n\thook.on.setupDevtoolsPlugin((pluginDescriptor, setupFn) => {\n\t\taddDevToolsPluginToBuffer(pluginDescriptor, setupFn);\n\t\tconst { app } = activeAppRecord ?? {};\n\t\tif (pluginDescriptor.settings) initPluginSettings(pluginDescriptor.id, pluginDescriptor.settings);\n\t\tif (!app) return;\n\t\tcallDevToolsPluginSetupFn([pluginDescriptor, setupFn], app);\n\t});\n\tonLegacyDevToolsPluginApiAvailable(() => {\n\t\tdevtoolsPluginBuffer.filter(([item]) => item.id !== \"components\").forEach(([pluginDescriptor, setupFn]) => {\n\t\t\t_devtoolsHook.emit(DevToolsHooks.SETUP_DEVTOOLS_PLUGIN, pluginDescriptor, setupFn, { target: \"legacy\" });\n\t\t});\n\t});\n\thook.on.vueAppInit(async (app, version, types) => {\n\t\tconst normalizedAppRecord = {\n\t\t\t...createAppRecord(app, types),\n\t\t\tapp,\n\t\t\tversion\n\t\t};\n\t\taddDevToolsAppRecord(normalizedAppRecord);\n\t\tif (devtoolsAppRecords.value.length === 1) {\n\t\t\tsetActiveAppRecord(normalizedAppRecord);\n\t\t\tsetActiveAppRecordId(normalizedAppRecord.id);\n\t\t\tnormalizeRouterInfo(normalizedAppRecord, activeAppRecord);\n\t\t\tregisterDevToolsPlugin(normalizedAppRecord.app);\n\t\t}\n\t\tsetupDevToolsPlugin(...createComponentsDevToolsPlugin(normalizedAppRecord.app));\n\t\tupdateDevToolsState({ connected: true });\n\t\t_devtoolsHook.apps.push(app);\n\t});\n\thook.on.vueAppUnmount(async (app) => {\n\t\tconst activeRecords = devtoolsAppRecords.value.filter((appRecord) => appRecord.app !== app);\n\t\tif (activeRecords.length === 0) updateDevToolsState({ connected: false });\n\t\tremoveDevToolsAppRecord(app);\n\t\tremoveAppRecordId(app);\n\t\tif (activeAppRecord.value.app === app) {\n\t\t\tsetActiveAppRecord(activeRecords[0]);\n\t\t\tdevtoolsContext.hooks.callHook(DevToolsMessagingHookKeys.SEND_ACTIVE_APP_UNMOUNTED_TO_CLIENT);\n\t\t}\n\t\ttarget.__VUE_DEVTOOLS_GLOBAL_HOOK__.apps.splice(target.__VUE_DEVTOOLS_GLOBAL_HOOK__.apps.indexOf(app), 1);\n\t\tremoveRegisteredPluginApp(app);\n\t});\n\tsubscribeDevToolsHook(_devtoolsHook);\n\tif (!target.__VUE_DEVTOOLS_GLOBAL_HOOK__) Object.defineProperty(target, \"__VUE_DEVTOOLS_GLOBAL_HOOK__\", {\n\t\tget() {\n\t\t\treturn _devtoolsHook;\n\t\t},\n\t\tconfigurable: true\n\t});\n\telse if (!isNuxtApp) Object.assign(__VUE_DEVTOOLS_GLOBAL_HOOK__, _devtoolsHook);\n}\nfunction onDevToolsClientConnected(fn) {\n\treturn new Promise((resolve) => {\n\t\tif (devtoolsState.connected && devtoolsState.clientConnected) {\n\t\t\tfn();\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tdevtoolsContext.hooks.hook(DevToolsMessagingHookKeys.DEVTOOLS_CONNECTED_UPDATED, ({ state }) => {\n\t\t\tif (state.connected && state.clientConnected) {\n\t\t\t\tfn();\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t});\n}\n//#endregion\n//#region src/core/high-perf-mode/index.ts\nfunction toggleHighPerfMode(state) {\n\tdevtoolsState.highPerfModeEnabled = state ?? !devtoolsState.highPerfModeEnabled;\n\tif (!state && activeAppRecord.value) registerDevToolsPlugin(activeAppRecord.value.app);\n}\n//#endregion\n//#region src/core/component/state/reviver.ts\nfunction reviveSet(val) {\n\tconst result = /* @__PURE__ */ new Set();\n\tconst list = val._custom.value;\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst value = list[i];\n\t\tresult.add(revive(value));\n\t}\n\treturn result;\n}\nfunction reviveMap(val) {\n\tconst result = /* @__PURE__ */ new Map();\n\tconst list = val._custom.value;\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst { key, value } = list[i];\n\t\tresult.set(key, revive(value));\n\t}\n\treturn result;\n}\nfunction revive(val) {\n\tif (val === \"__vue_devtool_undefined__\") return;\n\telse if (val === \"__vue_devtool_infinity__\") return Number.POSITIVE_INFINITY;\n\telse if (val === \"__vue_devtool_negative_infinity__\") return Number.NEGATIVE_INFINITY;\n\telse if (val === \"__vue_devtool_nan__\") return NaN;\n\telse if (val && val._custom) {\n\t\tconst { _custom: custom } = val;\n\t\tif (custom.type === \"component\") return activeAppRecord.value.instanceMap.get(custom.id);\n\t\telse if (custom.type === \"map\") return reviveMap(val);\n\t\telse if (custom.type === \"set\") return reviveSet(val);\n\t\telse if (custom.type === \"bigint\") return BigInt(custom.value);\n\t\telse return revive(custom.value);\n\t} else if (symbolRE.test(val)) {\n\t\tconst [, string] = symbolRE.exec(val);\n\t\treturn Symbol.for(string);\n\t} else if (specialTypeRE.test(val)) {\n\t\tconst [, type, string, , details] = specialTypeRE.exec(val);\n\t\tconst result = new target[type](string);\n\t\tif (type === \"Error\" && details) result.stack = details;\n\t\treturn result;\n\t} else return val;\n}\nfunction reviver(key, value) {\n\treturn revive(value);\n}\n//#endregion\n//#region src/core/component/state/format.ts\nfunction getInspectorStateValueType(value, raw = true) {\n\tconst type = typeof value;\n\tif (value == null || value === \"__vue_devtool_undefined__\" || value === \"undefined\") return \"null\";\n\telse if (type === \"boolean\" || type === \"number\" || value === \"__vue_devtool_infinity__\" || value === \"__vue_devtool_negative_infinity__\" || value === \"__vue_devtool_nan__\") return \"literal\";\n\telse if (value?._custom) if (raw || value._custom.display != null || value._custom.displayText != null) return \"custom\";\n\telse return getInspectorStateValueType(value._custom.value);\n\telse if (typeof value === \"string\") {\n\t\tconst typeMatch = specialTypeRE.exec(value);\n\t\tif (typeMatch) {\n\t\t\tconst [, type] = typeMatch;\n\t\t\treturn `native ${type}`;\n\t\t} else return \"string\";\n\t} else if (Array.isArray(value) || value?._isArray) return \"array\";\n\telse if (isPlainObject(value)) return \"plain-object\";\n\telse return \"unknown\";\n}\nfunction formatInspectorStateValue(value, quotes = false, options) {\n\tconst { customClass } = options ?? {};\n\tlet result;\n\tconst type = getInspectorStateValueType(value, false);\n\tif (type !== \"custom\" && value?._custom) value = value._custom.value;\n\tif (result = internalStateTokenToString(value)) return result;\n\telse if (type === \"custom\") return value._custom.value?._custom && formatInspectorStateValue(value._custom.value, quotes, options) || value._custom.displayText || value._custom.display;\n\telse if (type === \"array\") return `Array[${value.length}]`;\n\telse if (type === \"plain-object\") return `Object${Object.keys(value).length ? \"\" : \" (empty)\"}`;\n\telse if (type?.includes(\"native\")) return escape(specialTypeRE.exec(value)?.[2]);\n\telse if (typeof value === \"string\") {\n\t\tconst typeMatch = value.match(rawTypeRE);\n\t\tif (typeMatch) value = escapeString(typeMatch[1]);\n\t\telse if (quotes) value = `\"${customClass?.string ? `${escapeString(value)}` : escapeString(value)}\"`;\n\t\telse value = customClass?.string ? `${escapeString(value)}` : escapeString(value);\n\t}\n\treturn value;\n}\nfunction escapeString(value) {\n\treturn escape(value).replace(/ /g, \" \").replace(/\\n/g, \"\\\\n\");\n}\nfunction getRaw(value) {\n\tlet customType;\n\tconst isCustom = getInspectorStateValueType(value) === \"custom\";\n\tlet inherit = {};\n\tif (isCustom) {\n\t\tconst data = value;\n\t\tconst customValue = data._custom?.value;\n\t\tconst currentCustomType = data._custom?.type;\n\t\tconst nestedCustom = typeof customValue === \"object\" && customValue !== null && \"_custom\" in customValue ? getRaw(customValue) : {\n\t\t\tinherit: void 0,\n\t\t\tvalue: void 0,\n\t\t\tcustomType: void 0\n\t\t};\n\t\tinherit = nestedCustom.inherit || data._custom?.fields || {};\n\t\tvalue = nestedCustom.value || customValue;\n\t\tcustomType = nestedCustom.customType || currentCustomType;\n\t}\n\tif (value && value._isArray) value = value.items;\n\treturn {\n\t\tvalue,\n\t\tinherit,\n\t\tcustomType\n\t};\n}\nfunction toEdit(value, customType) {\n\tif (customType === \"bigint\") return value;\n\tif (customType === \"date\") return value;\n\treturn replaceTokenToString(JSON.stringify(value));\n}\nfunction toSubmit(value, customType) {\n\tif (customType === \"bigint\") return BigInt(value);\n\tif (customType === \"date\") return new Date(value);\n\treturn JSON.parse(replaceStringToToken(value), reviver);\n}\n//#endregion\n//#region src/core/devtools-client/detected.ts\nfunction updateDevToolsClientDetected(params) {\n\tdevtoolsState.devtoolsClientDetected = {\n\t\t...devtoolsState.devtoolsClientDetected,\n\t\t...params\n\t};\n\ttoggleHighPerfMode(!Object.values(devtoolsState.devtoolsClientDetected).some(Boolean));\n}\ntarget.__VUE_DEVTOOLS_UPDATE_CLIENT_DETECTED__ ??= updateDevToolsClientDetected;\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/double-indexed-kv.js\nvar DoubleIndexedKV = class {\n\tconstructor() {\n\t\tthis.keyToValue = /* @__PURE__ */ new Map();\n\t\tthis.valueToKey = /* @__PURE__ */ new Map();\n\t}\n\tset(key, value) {\n\t\tthis.keyToValue.set(key, value);\n\t\tthis.valueToKey.set(value, key);\n\t}\n\tgetByKey(key) {\n\t\treturn this.keyToValue.get(key);\n\t}\n\tgetByValue(value) {\n\t\treturn this.valueToKey.get(value);\n\t}\n\tclear() {\n\t\tthis.keyToValue.clear();\n\t\tthis.valueToKey.clear();\n\t}\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/registry.js\nvar Registry = class {\n\tconstructor(generateIdentifier) {\n\t\tthis.generateIdentifier = generateIdentifier;\n\t\tthis.kv = new DoubleIndexedKV();\n\t}\n\tregister(value, identifier) {\n\t\tif (this.kv.getByValue(value)) return;\n\t\tif (!identifier) identifier = this.generateIdentifier(value);\n\t\tthis.kv.set(identifier, value);\n\t}\n\tclear() {\n\t\tthis.kv.clear();\n\t}\n\tgetIdentifier(value) {\n\t\treturn this.kv.getByValue(value);\n\t}\n\tgetValue(identifier) {\n\t\treturn this.kv.getByKey(identifier);\n\t}\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/class-registry.js\nvar ClassRegistry = class extends Registry {\n\tconstructor() {\n\t\tsuper((c) => c.name);\n\t\tthis.classToAllowedProps = /* @__PURE__ */ new Map();\n\t}\n\tregister(value, options) {\n\t\tif (typeof options === \"object\") {\n\t\t\tif (options.allowProps) this.classToAllowedProps.set(value, options.allowProps);\n\t\t\tsuper.register(value, options.identifier);\n\t\t} else super.register(value, options);\n\t}\n\tgetAllowedProps(value) {\n\t\treturn this.classToAllowedProps.get(value);\n\t}\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/util.js\nfunction valuesOfObj(record) {\n\tif (\"values\" in Object) return Object.values(record);\n\tconst values = [];\n\tfor (const key in record) if (record.hasOwnProperty(key)) values.push(record[key]);\n\treturn values;\n}\nfunction find(record, predicate) {\n\tconst values = valuesOfObj(record);\n\tif (\"find\" in values) return values.find(predicate);\n\tconst valuesNotNever = values;\n\tfor (let i = 0; i < valuesNotNever.length; i++) {\n\t\tconst value = valuesNotNever[i];\n\t\tif (predicate(value)) return value;\n\t}\n}\nfunction forEach(record, run) {\n\tObject.entries(record).forEach(([key, value]) => run(value, key));\n}\nfunction includes(arr, value) {\n\treturn arr.indexOf(value) !== -1;\n}\nfunction findArr(record, predicate) {\n\tfor (let i = 0; i < record.length; i++) {\n\t\tconst value = record[i];\n\t\tif (predicate(value)) return value;\n\t}\n}\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/custom-transformer-registry.js\nvar CustomTransformerRegistry = class {\n\tconstructor() {\n\t\tthis.transfomers = {};\n\t}\n\tregister(transformer) {\n\t\tthis.transfomers[transformer.name] = transformer;\n\t}\n\tfindApplicable(v) {\n\t\treturn find(this.transfomers, (transformer) => transformer.isApplicable(v));\n\t}\n\tfindByName(name) {\n\t\treturn this.transfomers[name];\n\t}\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/is.js\nconst getType$1 = (payload) => Object.prototype.toString.call(payload).slice(8, -1);\nconst isUndefined$1 = (payload) => typeof payload === \"undefined\";\nconst isNull$1 = (payload) => payload === null;\nconst isPlainObject$2 = (payload) => {\n\tif (typeof payload !== \"object\" || payload === null) return false;\n\tif (payload === Object.prototype) return false;\n\tif (Object.getPrototypeOf(payload) === null) return true;\n\treturn Object.getPrototypeOf(payload) === Object.prototype;\n};\nconst isEmptyObject = (payload) => isPlainObject$2(payload) && Object.keys(payload).length === 0;\nconst isArray$2 = (payload) => Array.isArray(payload);\nconst isString = (payload) => typeof payload === \"string\";\nconst isNumber = (payload) => typeof payload === \"number\" && !isNaN(payload);\nconst isBoolean = (payload) => typeof payload === \"boolean\";\nconst isRegExp = (payload) => payload instanceof RegExp;\nconst isMap = (payload) => payload instanceof Map;\nconst isSet = (payload) => payload instanceof Set;\nconst isSymbol = (payload) => getType$1(payload) === \"Symbol\";\nconst isDate = (payload) => payload instanceof Date && !isNaN(payload.valueOf());\nconst isError = (payload) => payload instanceof Error;\nconst isNaNValue = (payload) => typeof payload === \"number\" && isNaN(payload);\nconst isPrimitive = (payload) => isBoolean(payload) || isNull$1(payload) || isUndefined$1(payload) || isNumber(payload) || isString(payload) || isSymbol(payload);\nconst isBigint = (payload) => typeof payload === \"bigint\";\nconst isInfinite = (payload) => payload === Infinity || payload === -Infinity;\nconst isTypedArray = (payload) => ArrayBuffer.isView(payload) && !(payload instanceof DataView);\nconst isURL = (payload) => payload instanceof URL;\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/pathstringifier.js\nconst escapeKey = (key) => key.replace(/\\./g, \"\\\\.\");\nconst stringifyPath = (path) => path.map(String).map(escapeKey).join(\".\");\nconst parsePath = (string) => {\n\tconst result = [];\n\tlet segment = \"\";\n\tfor (let i = 0; i < string.length; i++) {\n\t\tlet char = string.charAt(i);\n\t\tif (char === \"\\\\\" && string.charAt(i + 1) === \".\") {\n\t\t\tsegment += \".\";\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \".\") {\n\t\t\tresult.push(segment);\n\t\t\tsegment = \"\";\n\t\t\tcontinue;\n\t\t}\n\t\tsegment += char;\n\t}\n\tconst lastSegment = segment;\n\tresult.push(lastSegment);\n\treturn result;\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/transformer.js\nfunction simpleTransformation(isApplicable, annotation, transform, untransform) {\n\treturn {\n\t\tisApplicable,\n\t\tannotation,\n\t\ttransform,\n\t\tuntransform\n\t};\n}\nconst simpleRules = [\n\tsimpleTransformation(isUndefined$1, \"undefined\", () => null, () => void 0),\n\tsimpleTransformation(isBigint, \"bigint\", (v) => v.toString(), (v) => {\n\t\tif (typeof BigInt !== \"undefined\") return BigInt(v);\n\t\tconsole.error(\"Please add a BigInt polyfill.\");\n\t\treturn v;\n\t}),\n\tsimpleTransformation(isDate, \"Date\", (v) => v.toISOString(), (v) => new Date(v)),\n\tsimpleTransformation(isError, \"Error\", (v, superJson) => {\n\t\tconst baseError = {\n\t\t\tname: v.name,\n\t\t\tmessage: v.message\n\t\t};\n\t\tsuperJson.allowedErrorProps.forEach((prop) => {\n\t\t\tbaseError[prop] = v[prop];\n\t\t});\n\t\treturn baseError;\n\t}, (v, superJson) => {\n\t\tconst e = new Error(v.message);\n\t\te.name = v.name;\n\t\te.stack = v.stack;\n\t\tsuperJson.allowedErrorProps.forEach((prop) => {\n\t\t\te[prop] = v[prop];\n\t\t});\n\t\treturn e;\n\t}),\n\tsimpleTransformation(isRegExp, \"regexp\", (v) => \"\" + v, (regex) => {\n\t\tconst body = regex.slice(1, regex.lastIndexOf(\"/\"));\n\t\tconst flags = regex.slice(regex.lastIndexOf(\"/\") + 1);\n\t\treturn new RegExp(body, flags);\n\t}),\n\tsimpleTransformation(isSet, \"set\", (v) => [...v.values()], (v) => new Set(v)),\n\tsimpleTransformation(isMap, \"map\", (v) => [...v.entries()], (v) => new Map(v)),\n\tsimpleTransformation((v) => isNaNValue(v) || isInfinite(v), \"number\", (v) => {\n\t\tif (isNaNValue(v)) return \"NaN\";\n\t\tif (v > 0) return \"Infinity\";\n\t\telse return \"-Infinity\";\n\t}, Number),\n\tsimpleTransformation((v) => v === 0 && 1 / v === -Infinity, \"number\", () => {\n\t\treturn \"-0\";\n\t}, Number),\n\tsimpleTransformation(isURL, \"URL\", (v) => v.toString(), (v) => new URL(v))\n];\nfunction compositeTransformation(isApplicable, annotation, transform, untransform) {\n\treturn {\n\t\tisApplicable,\n\t\tannotation,\n\t\ttransform,\n\t\tuntransform\n\t};\n}\nconst symbolRule = compositeTransformation((s, superJson) => {\n\tif (isSymbol(s)) return !!superJson.symbolRegistry.getIdentifier(s);\n\treturn false;\n}, (s, superJson) => {\n\treturn [\"symbol\", superJson.symbolRegistry.getIdentifier(s)];\n}, (v) => v.description, (_, a, superJson) => {\n\tconst value = superJson.symbolRegistry.getValue(a[1]);\n\tif (!value) throw new Error(\"Trying to deserialize unknown symbol\");\n\treturn value;\n});\nconst constructorToName = [\n\tInt8Array,\n\tUint8Array,\n\tInt16Array,\n\tUint16Array,\n\tInt32Array,\n\tUint32Array,\n\tFloat32Array,\n\tFloat64Array,\n\tUint8ClampedArray\n].reduce((obj, ctor) => {\n\tobj[ctor.name] = ctor;\n\treturn obj;\n}, {});\nconst typedArrayRule = compositeTransformation(isTypedArray, (v) => [\"typed-array\", v.constructor.name], (v) => [...v], (v, a) => {\n\tconst ctor = constructorToName[a[1]];\n\tif (!ctor) throw new Error(\"Trying to deserialize unknown typed array\");\n\treturn new ctor(v);\n});\nfunction isInstanceOfRegisteredClass(potentialClass, superJson) {\n\tif (potentialClass?.constructor) return !!superJson.classRegistry.getIdentifier(potentialClass.constructor);\n\treturn false;\n}\nconst classRule = compositeTransformation(isInstanceOfRegisteredClass, (clazz, superJson) => {\n\treturn [\"class\", superJson.classRegistry.getIdentifier(clazz.constructor)];\n}, (clazz, superJson) => {\n\tconst allowedProps = superJson.classRegistry.getAllowedProps(clazz.constructor);\n\tif (!allowedProps) return { ...clazz };\n\tconst result = {};\n\tallowedProps.forEach((prop) => {\n\t\tresult[prop] = clazz[prop];\n\t});\n\treturn result;\n}, (v, a, superJson) => {\n\tconst clazz = superJson.classRegistry.getValue(a[1]);\n\tif (!clazz) throw new Error(`Trying to deserialize unknown class '${a[1]}' - check https://github.com/blitz-js/superjson/issues/116#issuecomment-773996564`);\n\treturn Object.assign(Object.create(clazz.prototype), v);\n});\nconst customRule = compositeTransformation((value, superJson) => {\n\treturn !!superJson.customTransformerRegistry.findApplicable(value);\n}, (value, superJson) => {\n\treturn [\"custom\", superJson.customTransformerRegistry.findApplicable(value).name];\n}, (value, superJson) => {\n\treturn superJson.customTransformerRegistry.findApplicable(value).serialize(value);\n}, (v, a, superJson) => {\n\tconst transformer = superJson.customTransformerRegistry.findByName(a[1]);\n\tif (!transformer) throw new Error(\"Trying to deserialize unknown custom value\");\n\treturn transformer.deserialize(v);\n});\nconst compositeRules = [\n\tclassRule,\n\tsymbolRule,\n\tcustomRule,\n\ttypedArrayRule\n];\nconst transformValue = (value, superJson) => {\n\tconst applicableCompositeRule = findArr(compositeRules, (rule) => rule.isApplicable(value, superJson));\n\tif (applicableCompositeRule) return {\n\t\tvalue: applicableCompositeRule.transform(value, superJson),\n\t\ttype: applicableCompositeRule.annotation(value, superJson)\n\t};\n\tconst applicableSimpleRule = findArr(simpleRules, (rule) => rule.isApplicable(value, superJson));\n\tif (applicableSimpleRule) return {\n\t\tvalue: applicableSimpleRule.transform(value, superJson),\n\t\ttype: applicableSimpleRule.annotation\n\t};\n};\nconst simpleRulesByAnnotation = {};\nsimpleRules.forEach((rule) => {\n\tsimpleRulesByAnnotation[rule.annotation] = rule;\n});\nconst untransformValue = (json, type, superJson) => {\n\tif (isArray$2(type)) switch (type[0]) {\n\t\tcase \"symbol\": return symbolRule.untransform(json, type, superJson);\n\t\tcase \"class\": return classRule.untransform(json, type, superJson);\n\t\tcase \"custom\": return customRule.untransform(json, type, superJson);\n\t\tcase \"typed-array\": return typedArrayRule.untransform(json, type, superJson);\n\t\tdefault: throw new Error(\"Unknown transformation: \" + type);\n\t}\n\telse {\n\t\tconst transformation = simpleRulesByAnnotation[type];\n\t\tif (!transformation) throw new Error(\"Unknown transformation: \" + type);\n\t\treturn transformation.untransform(json, superJson);\n\t}\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/accessDeep.js\nconst getNthKey = (value, n) => {\n\tif (n > value.size) throw new Error(\"index out of bounds\");\n\tconst keys = value.keys();\n\twhile (n > 0) {\n\t\tkeys.next();\n\t\tn--;\n\t}\n\treturn keys.next().value;\n};\nfunction validatePath(path) {\n\tif (includes(path, \"__proto__\")) throw new Error(\"__proto__ is not allowed as a property\");\n\tif (includes(path, \"prototype\")) throw new Error(\"prototype is not allowed as a property\");\n\tif (includes(path, \"constructor\")) throw new Error(\"constructor is not allowed as a property\");\n}\nconst getDeep = (object, path) => {\n\tvalidatePath(path);\n\tfor (let i = 0; i < path.length; i++) {\n\t\tconst key = path[i];\n\t\tif (isSet(object)) object = getNthKey(object, +key);\n\t\telse if (isMap(object)) {\n\t\t\tconst row = +key;\n\t\t\tconst type = +path[++i] === 0 ? \"key\" : \"value\";\n\t\t\tconst keyOfRow = getNthKey(object, row);\n\t\t\tswitch (type) {\n\t\t\t\tcase \"key\":\n\t\t\t\t\tobject = keyOfRow;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"value\":\n\t\t\t\t\tobject = object.get(keyOfRow);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else object = object[key];\n\t}\n\treturn object;\n};\nconst setDeep = (object, path, mapper) => {\n\tvalidatePath(path);\n\tif (path.length === 0) return mapper(object);\n\tlet parent = object;\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst key = path[i];\n\t\tif (isArray$2(parent)) {\n\t\t\tconst index = +key;\n\t\t\tparent = parent[index];\n\t\t} else if (isPlainObject$2(parent)) parent = parent[key];\n\t\telse if (isSet(parent)) {\n\t\t\tconst row = +key;\n\t\t\tparent = getNthKey(parent, row);\n\t\t} else if (isMap(parent)) {\n\t\t\tif (i === path.length - 2) break;\n\t\t\tconst row = +key;\n\t\t\tconst type = +path[++i] === 0 ? \"key\" : \"value\";\n\t\t\tconst keyOfRow = getNthKey(parent, row);\n\t\t\tswitch (type) {\n\t\t\t\tcase \"key\":\n\t\t\t\t\tparent = keyOfRow;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"value\":\n\t\t\t\t\tparent = parent.get(keyOfRow);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tconst lastKey = path[path.length - 1];\n\tif (isArray$2(parent)) parent[+lastKey] = mapper(parent[+lastKey]);\n\telse if (isPlainObject$2(parent)) parent[lastKey] = mapper(parent[lastKey]);\n\tif (isSet(parent)) {\n\t\tconst oldValue = getNthKey(parent, +lastKey);\n\t\tconst newValue = mapper(oldValue);\n\t\tif (oldValue !== newValue) {\n\t\t\tparent.delete(oldValue);\n\t\t\tparent.add(newValue);\n\t\t}\n\t}\n\tif (isMap(parent)) {\n\t\tconst row = +path[path.length - 2];\n\t\tconst keyToRow = getNthKey(parent, row);\n\t\tswitch (+lastKey === 0 ? \"key\" : \"value\") {\n\t\t\tcase \"key\": {\n\t\t\t\tconst newKey = mapper(keyToRow);\n\t\t\t\tparent.set(newKey, parent.get(keyToRow));\n\t\t\t\tif (newKey !== keyToRow) parent.delete(keyToRow);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"value\":\n\t\t\t\tparent.set(keyToRow, mapper(parent.get(keyToRow)));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn object;\n};\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/plainer.js\nfunction traverse(tree, walker, origin = []) {\n\tif (!tree) return;\n\tif (!isArray$2(tree)) {\n\t\tforEach(tree, (subtree, key) => traverse(subtree, walker, [...origin, ...parsePath(key)]));\n\t\treturn;\n\t}\n\tconst [nodeValue, children] = tree;\n\tif (children) forEach(children, (child, key) => {\n\t\ttraverse(child, walker, [...origin, ...parsePath(key)]);\n\t});\n\twalker(nodeValue, origin);\n}\nfunction applyValueAnnotations(plain, annotations, superJson) {\n\ttraverse(annotations, (type, path) => {\n\t\tplain = setDeep(plain, path, (v) => untransformValue(v, type, superJson));\n\t});\n\treturn plain;\n}\nfunction applyReferentialEqualityAnnotations(plain, annotations) {\n\tfunction apply(identicalPaths, path) {\n\t\tconst object = getDeep(plain, parsePath(path));\n\t\tidenticalPaths.map(parsePath).forEach((identicalObjectPath) => {\n\t\t\tplain = setDeep(plain, identicalObjectPath, () => object);\n\t\t});\n\t}\n\tif (isArray$2(annotations)) {\n\t\tconst [root, other] = annotations;\n\t\troot.forEach((identicalPath) => {\n\t\t\tplain = setDeep(plain, parsePath(identicalPath), () => plain);\n\t\t});\n\t\tif (other) forEach(other, apply);\n\t} else forEach(annotations, apply);\n\treturn plain;\n}\nconst isDeep = (object, superJson) => isPlainObject$2(object) || isArray$2(object) || isMap(object) || isSet(object) || isInstanceOfRegisteredClass(object, superJson);\nfunction addIdentity(object, path, identities) {\n\tconst existingSet = identities.get(object);\n\tif (existingSet) existingSet.push(path);\n\telse identities.set(object, [path]);\n}\nfunction generateReferentialEqualityAnnotations(identitites, dedupe) {\n\tconst result = {};\n\tlet rootEqualityPaths = void 0;\n\tidentitites.forEach((paths) => {\n\t\tif (paths.length <= 1) return;\n\t\tif (!dedupe) paths = paths.map((path) => path.map(String)).sort((a, b) => a.length - b.length);\n\t\tconst [representativePath, ...identicalPaths] = paths;\n\t\tif (representativePath.length === 0) rootEqualityPaths = identicalPaths.map(stringifyPath);\n\t\telse result[stringifyPath(representativePath)] = identicalPaths.map(stringifyPath);\n\t});\n\tif (rootEqualityPaths) if (isEmptyObject(result)) return [rootEqualityPaths];\n\telse return [rootEqualityPaths, result];\n\telse return isEmptyObject(result) ? void 0 : result;\n}\nconst walker = (object, identities, superJson, dedupe, path = [], objectsInThisPath = [], seenObjects = /* @__PURE__ */ new Map()) => {\n\tconst primitive = isPrimitive(object);\n\tif (!primitive) {\n\t\taddIdentity(object, path, identities);\n\t\tconst seen = seenObjects.get(object);\n\t\tif (seen) return dedupe ? { transformedValue: null } : seen;\n\t}\n\tif (!isDeep(object, superJson)) {\n\t\tconst transformed = transformValue(object, superJson);\n\t\tconst result = transformed ? {\n\t\t\ttransformedValue: transformed.value,\n\t\t\tannotations: [transformed.type]\n\t\t} : { transformedValue: object };\n\t\tif (!primitive) seenObjects.set(object, result);\n\t\treturn result;\n\t}\n\tif (includes(objectsInThisPath, object)) return { transformedValue: null };\n\tconst transformationResult = transformValue(object, superJson);\n\tconst transformed = transformationResult?.value ?? object;\n\tconst transformedValue = isArray$2(transformed) ? [] : {};\n\tconst innerAnnotations = {};\n\tforEach(transformed, (value, index) => {\n\t\tif (index === \"__proto__\" || index === \"constructor\" || index === \"prototype\") throw new Error(`Detected property ${index}. This is a prototype pollution risk, please remove it from your object.`);\n\t\tconst recursiveResult = walker(value, identities, superJson, dedupe, [...path, index], [...objectsInThisPath, object], seenObjects);\n\t\ttransformedValue[index] = recursiveResult.transformedValue;\n\t\tif (isArray$2(recursiveResult.annotations)) innerAnnotations[index] = recursiveResult.annotations;\n\t\telse if (isPlainObject$2(recursiveResult.annotations)) forEach(recursiveResult.annotations, (tree, key) => {\n\t\t\tinnerAnnotations[escapeKey(index) + \".\" + key] = tree;\n\t\t});\n\t});\n\tconst result = isEmptyObject(innerAnnotations) ? {\n\t\ttransformedValue,\n\t\tannotations: !!transformationResult ? [transformationResult.type] : void 0\n\t} : {\n\t\ttransformedValue,\n\t\tannotations: !!transformationResult ? [transformationResult.type, innerAnnotations] : innerAnnotations\n\t};\n\tif (!primitive) seenObjects.set(object, result);\n\treturn result;\n};\n//#endregion\n//#region ../../node_modules/.pnpm/is-what@4.1.16/node_modules/is-what/dist/index.js\nfunction getType(payload) {\n\treturn Object.prototype.toString.call(payload).slice(8, -1);\n}\nfunction isArray$1(payload) {\n\treturn getType(payload) === \"Array\";\n}\nfunction isPlainObject$1(payload) {\n\tif (getType(payload) !== \"Object\") return false;\n\tconst prototype = Object.getPrototypeOf(payload);\n\treturn !!prototype && prototype.constructor === Object && prototype === Object.prototype;\n}\nfunction isNull(payload) {\n\treturn getType(payload) === \"Null\";\n}\nfunction isOneOf(a, b, c, d, e) {\n\treturn (value) => a(value) || b(value) || !!c && c(value) || !!d && d(value) || !!e && e(value);\n}\nfunction isUndefined(payload) {\n\treturn getType(payload) === \"Undefined\";\n}\nisOneOf(isNull, isUndefined);\n//#endregion\n//#region ../../node_modules/.pnpm/copy-anything@3.0.5/node_modules/copy-anything/dist/index.js\nfunction assignProp(carry, key, newVal, originalObject, includeNonenumerable) {\n\tconst propType = {}.propertyIsEnumerable.call(originalObject, key) ? \"enumerable\" : \"nonenumerable\";\n\tif (propType === \"enumerable\") carry[key] = newVal;\n\tif (includeNonenumerable && propType === \"nonenumerable\") Object.defineProperty(carry, key, {\n\t\tvalue: newVal,\n\t\tenumerable: false,\n\t\twritable: true,\n\t\tconfigurable: true\n\t});\n}\nfunction copy(target, options = {}) {\n\tif (isArray$1(target)) return target.map((item) => copy(item, options));\n\tif (!isPlainObject$1(target)) return target;\n\tconst props = Object.getOwnPropertyNames(target);\n\tconst symbols = Object.getOwnPropertySymbols(target);\n\treturn [...props, ...symbols].reduce((carry, key) => {\n\t\tif (isArray$1(options.props) && !options.props.includes(key)) return carry;\n\t\tconst val = target[key];\n\t\tassignProp(carry, key, copy(val, options), target, options.nonenumerable);\n\t\treturn carry;\n\t}, {});\n}\n//#endregion\n//#region ../../node_modules/.pnpm/superjson@2.2.2/node_modules/superjson/dist/index.js\nvar SuperJSON = class {\n\t/**\n\t* @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`.\n\t*/\n\tconstructor({ dedupe = false } = {}) {\n\t\tthis.classRegistry = new ClassRegistry();\n\t\tthis.symbolRegistry = new Registry((s) => s.description ?? \"\");\n\t\tthis.customTransformerRegistry = new CustomTransformerRegistry();\n\t\tthis.allowedErrorProps = [];\n\t\tthis.dedupe = dedupe;\n\t}\n\tserialize(object) {\n\t\tconst identities = /* @__PURE__ */ new Map();\n\t\tconst output = walker(object, identities, this, this.dedupe);\n\t\tconst res = { json: output.transformedValue };\n\t\tif (output.annotations) res.meta = {\n\t\t\t...res.meta,\n\t\t\tvalues: output.annotations\n\t\t};\n\t\tconst equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe);\n\t\tif (equalityAnnotations) res.meta = {\n\t\t\t...res.meta,\n\t\t\treferentialEqualities: equalityAnnotations\n\t\t};\n\t\treturn res;\n\t}\n\tdeserialize(payload) {\n\t\tconst { json, meta } = payload;\n\t\tlet result = copy(json);\n\t\tif (meta?.values) result = applyValueAnnotations(result, meta.values, this);\n\t\tif (meta?.referentialEqualities) result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities);\n\t\treturn result;\n\t}\n\tstringify(object) {\n\t\treturn JSON.stringify(this.serialize(object));\n\t}\n\tparse(string) {\n\t\treturn this.deserialize(JSON.parse(string));\n\t}\n\tregisterClass(v, options) {\n\t\tthis.classRegistry.register(v, options);\n\t}\n\tregisterSymbol(v, identifier) {\n\t\tthis.symbolRegistry.register(v, identifier);\n\t}\n\tregisterCustom(transformer, name) {\n\t\tthis.customTransformerRegistry.register({\n\t\t\tname,\n\t\t\t...transformer\n\t\t});\n\t}\n\tallowErrorProps(...props) {\n\t\tthis.allowedErrorProps.push(...props);\n\t}\n};\nSuperJSON.defaultInstance = new SuperJSON();\nSuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance);\nSuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance);\nSuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance);\nSuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance);\nSuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance);\nSuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance);\nSuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance);\nSuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance);\nSuperJSON.serialize;\nSuperJSON.deserialize;\nSuperJSON.stringify;\nSuperJSON.parse;\nSuperJSON.registerClass;\nSuperJSON.registerCustom;\nSuperJSON.registerSymbol;\nSuperJSON.allowErrorProps;\n//#endregion\n//#region src/messaging/presets/broadcast-channel/context.ts\nconst __DEVTOOLS_KIT_BROADCAST_MESSAGING_EVENT_KEY = \"__devtools-kit-broadcast-messaging-event-key__\";\n//#endregion\n//#region src/messaging/presets/broadcast-channel/index.ts\nconst BROADCAST_CHANNEL_NAME = \"__devtools-kit:broadcast-channel__\";\nfunction createBroadcastChannel() {\n\tconst channel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);\n\treturn {\n\t\tpost: (data) => {\n\t\t\tchannel.postMessage(SuperJSON.stringify({\n\t\t\t\tevent: __DEVTOOLS_KIT_BROADCAST_MESSAGING_EVENT_KEY,\n\t\t\t\tdata\n\t\t\t}));\n\t\t},\n\t\ton: (handler) => {\n\t\t\tchannel.onmessage = (event) => {\n\t\t\t\tconst parsed = SuperJSON.parse(event.data);\n\t\t\t\tif (parsed.event === \"__devtools-kit-broadcast-messaging-event-key__\") handler(parsed.data);\n\t\t\t};\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/electron/context.ts\nconst __ELECTRON_CLIENT_CONTEXT__ = \"electron:client-context\";\nconst __ELECTRON_RPOXY_CONTEXT__ = \"electron:proxy-context\";\nconst __ELECTRON_SERVER_CONTEXT__ = \"electron:server-context\";\nconst __DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__ = {\n\tCLIENT_TO_PROXY: \"client->proxy\",\n\tPROXY_TO_CLIENT: \"proxy->client\",\n\tPROXY_TO_SERVER: \"proxy->server\",\n\tSERVER_TO_PROXY: \"server->proxy\"\n};\nfunction getElectronClientContext() {\n\treturn target[__ELECTRON_CLIENT_CONTEXT__];\n}\nfunction setElectronClientContext(context) {\n\ttarget[__ELECTRON_CLIENT_CONTEXT__] = context;\n}\nfunction getElectronProxyContext() {\n\treturn target[__ELECTRON_RPOXY_CONTEXT__];\n}\nfunction setElectronProxyContext(context) {\n\ttarget[__ELECTRON_RPOXY_CONTEXT__] = context;\n}\nfunction getElectronServerContext() {\n\treturn target[__ELECTRON_SERVER_CONTEXT__];\n}\nfunction setElectronServerContext(context) {\n\ttarget[__ELECTRON_SERVER_CONTEXT__] = context;\n}\n//#endregion\n//#region src/messaging/presets/electron/client.ts\nfunction createElectronClientChannel() {\n\tconst socket = getElectronClientContext();\n\treturn {\n\t\tpost: (data) => {\n\t\t\tsocket.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.CLIENT_TO_PROXY, SuperJSON.stringify(data));\n\t\t},\n\t\ton: (handler) => {\n\t\t\tsocket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_CLIENT, (e) => {\n\t\t\t\thandler(SuperJSON.parse(e));\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/electron/proxy.ts\nfunction createElectronProxyChannel() {\n\tconst socket = getElectronProxyContext();\n\treturn {\n\t\tpost: (data) => {},\n\t\ton: (handler) => {\n\t\t\tsocket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY, (data) => {\n\t\t\t\tsocket.broadcast.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_CLIENT, data);\n\t\t\t});\n\t\t\tsocket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.CLIENT_TO_PROXY, (data) => {\n\t\t\t\tsocket.broadcast.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER, data);\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/electron/server.ts\nfunction createElectronServerChannel() {\n\tconst socket = getElectronServerContext();\n\treturn {\n\t\tpost: (data) => {\n\t\t\tsocket.emit(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY, SuperJSON.stringify(data));\n\t\t},\n\t\ton: (handler) => {\n\t\t\tsocket.on(__DEVTOOLS_KIT_ELECTRON_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER, (data) => {\n\t\t\t\thandler(SuperJSON.parse(data));\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/extension/context.ts\nconst __EXTENSION_CLIENT_CONTEXT__ = \"electron:client-context\";\nconst __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__ = {\n\tCLIENT_TO_PROXY: \"client->proxy\",\n\tPROXY_TO_CLIENT: \"proxy->client\",\n\tPROXY_TO_SERVER: \"proxy->server\",\n\tSERVER_TO_PROXY: \"server->proxy\"\n};\nfunction getExtensionClientContext() {\n\treturn target[__EXTENSION_CLIENT_CONTEXT__];\n}\nfunction setExtensionClientContext(context) {\n\ttarget[__EXTENSION_CLIENT_CONTEXT__] = context;\n}\n//#endregion\n//#region src/messaging/presets/extension/client.ts\nfunction createExtensionClientChannel() {\n\tlet disconnected = false;\n\tlet port = null;\n\tlet reconnectTimer = null;\n\tlet onMessageHandler = null;\n\tfunction connect() {\n\t\ttry {\n\t\t\tclearTimeout(reconnectTimer);\n\t\t\tport = chrome.runtime.connect({ name: `${chrome.devtools.inspectedWindow.tabId}` });\n\t\t\tsetExtensionClientContext(port);\n\t\t\tdisconnected = false;\n\t\t\tport?.onMessage.addListener(onMessageHandler);\n\t\t\tport.onDisconnect.addListener(() => {\n\t\t\t\tdisconnected = true;\n\t\t\t\tport?.onMessage.removeListener(onMessageHandler);\n\t\t\t\treconnectTimer = setTimeout(connect, 1e3);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tdisconnected = true;\n\t\t}\n\t}\n\tconnect();\n\treturn {\n\t\tpost: (data) => {\n\t\t\tif (disconnected) return;\n\t\t\tport?.postMessage(SuperJSON.stringify(data));\n\t\t},\n\t\ton: (handler) => {\n\t\t\tonMessageHandler = (data) => {\n\t\t\t\tif (disconnected) return;\n\t\t\t\thandler(SuperJSON.parse(data));\n\t\t\t};\n\t\t\tport?.onMessage.addListener(onMessageHandler);\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/extension/proxy.ts\nfunction createExtensionProxyChannel() {\n\tconst port = chrome.runtime.connect({ name: \"content-script\" });\n\tfunction sendMessageToUserApp(payload) {\n\t\twindow.postMessage({\n\t\t\tsource: __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER,\n\t\t\tpayload\n\t\t}, \"*\");\n\t}\n\tfunction sendMessageToDevToolsClient(e) {\n\t\tif (e.data && e.data.source === __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY) try {\n\t\t\tport.postMessage(e.data.payload);\n\t\t} catch (e) {}\n\t}\n\tport.onMessage.addListener(sendMessageToUserApp);\n\twindow.addEventListener(\"message\", sendMessageToDevToolsClient);\n\tport.onDisconnect.addListener(() => {\n\t\twindow.removeEventListener(\"message\", sendMessageToDevToolsClient);\n\t\tsendMessageToUserApp(SuperJSON.stringify({ event: \"shutdown\" }));\n\t});\n\tsendMessageToUserApp(SuperJSON.stringify({ event: \"init\" }));\n\treturn {\n\t\tpost: (data) => {},\n\t\ton: (handler) => {}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/extension/server.ts\nfunction createExtensionServerChannel() {\n\treturn {\n\t\tpost: (data) => {\n\t\t\twindow.postMessage({\n\t\t\t\tsource: __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.SERVER_TO_PROXY,\n\t\t\t\tpayload: SuperJSON.stringify(data)\n\t\t\t}, \"*\");\n\t\t},\n\t\ton: (handler) => {\n\t\t\tconst listener = (event) => {\n\t\t\t\tif (event.data.source === __DEVTOOLS_KIT_EXTENSION_MESSAGING_EVENT_KEY__.PROXY_TO_SERVER && event.data.payload) handler(SuperJSON.parse(event.data.payload));\n\t\t\t};\n\t\t\twindow.addEventListener(\"message\", listener);\n\t\t\treturn () => {\n\t\t\t\twindow.removeEventListener(\"message\", listener);\n\t\t\t};\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/iframe/context.ts\nconst __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY = \"__devtools-kit-iframe-messaging-event-key__\";\nconst __IFRAME_SERVER_CONTEXT__ = \"iframe:server-context\";\nfunction getIframeServerContext() {\n\treturn target[__IFRAME_SERVER_CONTEXT__];\n}\nfunction setIframeServerContext(context) {\n\ttarget[__IFRAME_SERVER_CONTEXT__] = context;\n}\n//#endregion\n//#region src/messaging/presets/iframe/client.ts\nfunction createIframeClientChannel() {\n\tif (!isBrowser) return {\n\t\tpost: (data) => {},\n\t\ton: (handler) => {}\n\t};\n\treturn {\n\t\tpost: (data) => window.parent.postMessage(SuperJSON.stringify({\n\t\t\tevent: __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY,\n\t\t\tdata\n\t\t}), \"*\"),\n\t\ton: (handler) => window.addEventListener(\"message\", (event) => {\n\t\t\ttry {\n\t\t\t\tconst parsed = SuperJSON.parse(event.data);\n\t\t\t\tif (event.source === window.parent && parsed.event === \"__devtools-kit-iframe-messaging-event-key__\") handler(parsed.data);\n\t\t\t} catch (e) {}\n\t\t})\n\t};\n}\n//#endregion\n//#region src/messaging/presets/iframe/server.ts\nfunction createIframeServerChannel() {\n\tif (!isBrowser) return {\n\t\tpost: (data) => {},\n\t\ton: (handler) => {}\n\t};\n\treturn {\n\t\tpost: (data) => {\n\t\t\tgetIframeServerContext()?.contentWindow?.postMessage(SuperJSON.stringify({\n\t\t\t\tevent: __DEVTOOLS_KIT_IFRAME_MESSAGING_EVENT_KEY,\n\t\t\t\tdata\n\t\t\t}), \"*\");\n\t\t},\n\t\ton: (handler) => {\n\t\t\twindow.addEventListener(\"message\", (event) => {\n\t\t\t\tconst iframe = getIframeServerContext();\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = SuperJSON.parse(event.data);\n\t\t\t\t\tif (event.source === iframe?.contentWindow && parsed.event === \"__devtools-kit-iframe-messaging-event-key__\") handler(parsed.data);\n\t\t\t\t} catch (e) {}\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/vite/context.ts\nconst __DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY = \"__devtools-kit-vite-messaging-event-key__\";\nconst __VITE_CLIENT_CONTEXT__ = \"vite:client-context\";\nconst __VITE_SERVER_CONTEXT__ = \"vite:server-context\";\nfunction getViteClientContext() {\n\treturn target[__VITE_CLIENT_CONTEXT__];\n}\nfunction setViteClientContext(context) {\n\ttarget[__VITE_CLIENT_CONTEXT__] = context;\n}\nfunction getViteServerContext() {\n\treturn target[__VITE_SERVER_CONTEXT__];\n}\nfunction setViteServerContext(context) {\n\ttarget[__VITE_SERVER_CONTEXT__] = context;\n}\n//#endregion\n//#region src/messaging/presets/vite/client.ts\nfunction createViteClientChannel() {\n\tconst client = getViteClientContext();\n\treturn {\n\t\tpost: (data) => {\n\t\t\tclient?.send(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, SuperJSON.stringify(data));\n\t\t},\n\t\ton: (handler) => {\n\t\t\tclient?.on(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, (event) => {\n\t\t\t\thandler(SuperJSON.parse(event));\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/messaging/presets/vite/server.ts\nfunction createViteServerChannel() {\n\tconst viteServer = getViteServerContext();\n\tconst ws = viteServer.hot ?? viteServer.ws;\n\treturn {\n\t\tpost: (data) => ws?.send(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, SuperJSON.stringify(data)),\n\t\ton: (handler) => ws?.on(__DEVTOOLS_KIT_VITE_MESSAGING_EVENT_KEY, (event) => {\n\t\t\thandler(SuperJSON.parse(event));\n\t\t})\n\t};\n}\n//#endregion\n//#region src/messaging/index.ts\ntarget.__VUE_DEVTOOLS_KIT_MESSAGE_CHANNELS__ ??= [];\ntarget.__VUE_DEVTOOLS_KIT_RPC_CLIENT__ ??= null;\ntarget.__VUE_DEVTOOLS_KIT_RPC_SERVER__ ??= null;\ntarget.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__ ??= null;\ntarget.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__ ??= null;\ntarget.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__ ??= null;\nfunction setRpcClientToGlobal(rpc) {\n\ttarget.__VUE_DEVTOOLS_KIT_RPC_CLIENT__ = rpc;\n}\nfunction setRpcServerToGlobal(rpc) {\n\ttarget.__VUE_DEVTOOLS_KIT_RPC_SERVER__ = rpc;\n}\nfunction getRpcClient() {\n\treturn target.__VUE_DEVTOOLS_KIT_RPC_CLIENT__;\n}\nfunction getRpcServer() {\n\treturn target.__VUE_DEVTOOLS_KIT_RPC_SERVER__;\n}\nfunction setViteRpcClientToGlobal(rpc) {\n\ttarget.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__ = rpc;\n}\nfunction setViteRpcServerToGlobal(rpc) {\n\ttarget.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__ = rpc;\n}\nfunction getViteRpcClient() {\n\treturn target.__VUE_DEVTOOLS_KIT_VITE_RPC_CLIENT__;\n}\nfunction getViteRpcServer() {\n\treturn target.__VUE_DEVTOOLS_KIT_VITE_RPC_SERVER__;\n}\nfunction getChannel(preset, host = \"client\") {\n\tconst channel = {\n\t\tiframe: {\n\t\t\tclient: createIframeClientChannel,\n\t\t\tserver: createIframeServerChannel\n\t\t}[host],\n\t\telectron: {\n\t\t\tclient: createElectronClientChannel,\n\t\t\tproxy: createElectronProxyChannel,\n\t\t\tserver: createElectronServerChannel\n\t\t}[host],\n\t\tvite: {\n\t\t\tclient: createViteClientChannel,\n\t\t\tserver: createViteServerChannel\n\t\t}[host],\n\t\tbroadcast: {\n\t\t\tclient: createBroadcastChannel,\n\t\t\tserver: createBroadcastChannel\n\t\t}[host],\n\t\textension: {\n\t\t\tclient: createExtensionClientChannel,\n\t\t\tproxy: createExtensionProxyChannel,\n\t\t\tserver: createExtensionServerChannel\n\t\t}[host]\n\t}[preset];\n\treturn channel();\n}\nfunction createRpcClient(functions, options = {}) {\n\tconst { channel: _channel, options: _options, preset } = options;\n\tconst channel = preset ? getChannel(preset) : _channel;\n\tconst rpc = createBirpc(functions, {\n\t\t..._options,\n\t\t...channel,\n\t\ttimeout: -1\n\t});\n\tif (preset === \"vite\") {\n\t\tsetViteRpcClientToGlobal(rpc);\n\t\treturn;\n\t}\n\tsetRpcClientToGlobal(rpc);\n\treturn rpc;\n}\nfunction createRpcServer(functions, options = {}) {\n\tconst { channel: _channel, options: _options, preset } = options;\n\tconst channel = preset ? getChannel(preset, \"server\") : _channel;\n\tconst rpcServer = getRpcServer();\n\tif (!rpcServer) {\n\t\tconst group = createBirpcGroup(functions, [channel], {\n\t\t\t..._options,\n\t\t\ttimeout: -1\n\t\t});\n\t\tif (preset === \"vite\") {\n\t\t\tsetViteRpcServerToGlobal(group);\n\t\t\treturn;\n\t\t}\n\t\tsetRpcServerToGlobal(group);\n\t} else rpcServer.updateChannels((channels) => {\n\t\tchannels.push(channel);\n\t});\n}\nfunction createRpcProxy(options = {}) {\n\tconst { channel: _channel, options: _options, preset } = options;\n\tconst channel = preset ? getChannel(preset, \"proxy\") : _channel;\n\treturn createBirpc({}, {\n\t\t..._options,\n\t\t...channel,\n\t\ttimeout: -1\n\t});\n}\n//#endregion\n//#region src/core/component/state/custom.ts\nfunction getFunctionDetails(func) {\n\tlet string = \"\";\n\tlet matches = null;\n\ttry {\n\t\tstring = Function.prototype.toString.call(func);\n\t\tmatches = String.prototype.match.call(string, /\\([\\s\\S]*?\\)/);\n\t} catch (e) {}\n\tconst match = matches && matches[0];\n\tconst args = typeof match === \"string\" ? match : \"(?)\";\n\treturn { _custom: {\n\t\ttype: \"function\",\n\t\tdisplayText: `function ${escape(typeof func.name === \"string\" ? func.name : \"\")}${args}`,\n\t\ttooltipText: string.trim() ? `
${escape(string)}` : null\n\t} };\n}\nfunction getBigIntDetails(val) {\n\tconst stringifiedBigInt = BigInt.prototype.toString.call(val);\n\treturn { _custom: {\n\t\ttype: \"bigint\",\n\t\tdisplayText: `BigInt(${stringifiedBigInt})`,\n\t\tvalue: stringifiedBigInt\n\t} };\n}\nfunction getDateDetails(val) {\n\tconst date = new Date(val.getTime());\n\tdate.setMinutes(date.getMinutes() - date.getTimezoneOffset());\n\treturn { _custom: {\n\t\ttype: \"date\",\n\t\tdisplayText: Date.prototype.toString.call(val),\n\t\tvalue: date.toISOString().slice(0, -1)\n\t} };\n}\nfunction getMapDetails(val) {\n\treturn { _custom: {\n\t\ttype: \"map\",\n\t\tdisplayText: \"Map\",\n\t\tvalue: Object.fromEntries(val),\n\t\treadOnly: true,\n\t\tfields: { abstract: true }\n\t} };\n}\nfunction getSetDetails(val) {\n\tconst list = Array.from(val);\n\treturn { _custom: {\n\t\ttype: \"set\",\n\t\tdisplayText: `Set[${list.length}]`,\n\t\tvalue: list,\n\t\treadOnly: true\n\t} };\n}\nfunction getCaughtGetters(store) {\n\tconst getters = {};\n\tconst origGetters = store.getters || {};\n\tconst keys = Object.keys(origGetters);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tObject.defineProperty(getters, key, {\n\t\t\tenumerable: true,\n\t\t\tget: () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn origGetters[key];\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn e;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn getters;\n}\nfunction reduceStateList(list) {\n\tif (!list.length) return void 0;\n\treturn list.reduce((map, item) => {\n\t\tconst key = item.type || \"data\";\n\t\tconst obj = map[key] = map[key] || {};\n\t\tobj[item.key] = item.value;\n\t\treturn map;\n\t}, {});\n}\nfunction namedNodeMapToObject(map) {\n\tconst result = {};\n\tconst l = map.length;\n\tfor (let i = 0; i < l; i++) {\n\t\tconst node = map.item(i);\n\t\tresult[node.name] = node.value;\n\t}\n\treturn result;\n}\nfunction getStoreDetails(store) {\n\treturn { _custom: {\n\t\ttype: \"store\",\n\t\tdisplayText: \"Store\",\n\t\tvalue: {\n\t\t\tstate: store.state,\n\t\t\tgetters: getCaughtGetters(store)\n\t\t},\n\t\tfields: { abstract: true }\n\t} };\n}\nfunction getInstanceDetails(instance) {\n\tif (instance._) instance = instance._;\n\tconst state = processInstanceState(instance);\n\treturn { _custom: {\n\t\ttype: \"component\",\n\t\tid: instance.__VUE_DEVTOOLS_NEXT_UID__,\n\t\tdisplayText: getInstanceName(instance),\n\t\ttooltipText: \"Component instance\",\n\t\tvalue: reduceStateList(state),\n\t\tfields: { abstract: true }\n\t} };\n}\nfunction getComponentDefinitionDetails(definition) {\n\tlet display = getComponentName(definition);\n\tif (display) {\n\t\tif (definition.name && definition.__file) display += ` (${definition.__file})`;\n\t} else display = \"Unknown Component\";\n\treturn { _custom: {\n\t\ttype: \"component-definition\",\n\t\tdisplayText: display,\n\t\ttooltipText: \"Component definition\",\n\t\t...definition.__file ? { file: definition.__file } : {}\n\t} };\n}\nfunction getHTMLElementDetails(value) {\n\ttry {\n\t\treturn { _custom: {\n\t\t\ttype: \"HTMLElement\",\n\t\t\tdisplayText: `<${value.tagName.toLowerCase()}>`,\n\t\t\tvalue: namedNodeMapToObject(value.attributes)\n\t\t} };\n\t} catch (e) {\n\t\treturn { _custom: {\n\t\t\ttype: \"HTMLElement\",\n\t\t\tdisplayText: `${String(value)}`\n\t\t} };\n\t}\n}\n/**\n* - ObjectRefImpl, toRef({ foo: 'foo' }, 'foo'), `_value` is the actual value, (since 3.5.0)\n* - GetterRefImpl, toRef(() => state.foo), `_value` is the actual value, (since 3.5.0)\n* - RefImpl, ref('foo') / computed(() => 'foo'), `_value` is the actual value\n*/\nfunction tryGetRefValue(ref) {\n\tif (ensurePropertyExists(ref, \"_value\", true)) return ref._value;\n\tif (ensurePropertyExists(ref, \"value\", true)) return ref.value;\n}\nfunction getObjectDetails(object) {\n\tconst info = getSetupStateType(object);\n\tif (info.ref || info.computed || info.reactive) {\n\t\tconst stateTypeName = info.computed ? \"Computed\" : info.ref ? \"Ref\" : info.reactive ? \"Reactive\" : null;\n\t\tconst value = toRaw(info.reactive ? object : tryGetRefValue(object));\n\t\tconst raw = ensurePropertyExists(object, \"effect\") ? object.effect?.raw?.toString() || object.effect?.fn?.toString() : null;\n\t\treturn { _custom: {\n\t\t\ttype: stateTypeName?.toLowerCase(),\n\t\t\tstateTypeName,\n\t\t\tvalue,\n\t\t\t...raw ? { tooltipText: `${escape(raw)}` } : {}\n\t\t} };\n\t}\n\tif (ensurePropertyExists(object, \"__asyncLoader\") && typeof object.__asyncLoader === \"function\") return { _custom: {\n\t\ttype: \"component-definition\",\n\t\tdisplay: \"Async component definition\"\n\t} };\n}\n//#endregion\n//#region src/core/component/state/replacer.ts\nfunction stringifyReplacer(key, _value, depth, seenInstance) {\n\tif (key === \"compilerOptions\") return;\n\tconst val = this[key];\n\tconst type = typeof val;\n\tif (Array.isArray(val)) {\n\t\tconst l = val.length;\n\t\tif (l > 5e3) return {\n\t\t\t_isArray: true,\n\t\t\tlength: l,\n\t\t\titems: val.slice(0, MAX_ARRAY_SIZE)\n\t\t};\n\t\treturn val;\n\t} else if (typeof val === \"string\") if (val.length > 1e4) return `${val.substring(0, MAX_STRING_SIZE)}... (${val.length} total length)`;\n\telse return val;\n\telse if (type === \"undefined\") return UNDEFINED;\n\telse if (val === Number.POSITIVE_INFINITY) return INFINITY;\n\telse if (val === Number.NEGATIVE_INFINITY) return NEGATIVE_INFINITY;\n\telse if (typeof val === \"function\") return getFunctionDetails(val);\n\telse if (type === \"symbol\") return `[native Symbol ${Symbol.prototype.toString.call(val)}]`;\n\telse if (typeof val === \"bigint\") return getBigIntDetails(val);\n\telse if (val !== null && typeof val === \"object\") {\n\t\tconst proto = Object.prototype.toString.call(val);\n\t\tif (proto === \"[object Map]\") return getMapDetails(val);\n\t\telse if (proto === \"[object Set]\") return getSetDetails(val);\n\t\telse if (proto === \"[object RegExp]\") return `[native RegExp ${RegExp.prototype.toString.call(val)}]`;\n\t\telse if (proto === \"[object Date]\") return getDateDetails(val);\n\t\telse if (proto === \"[object Error]\") return `[native Error ${val.message}<>${val.stack}]`;\n\t\telse if (ensurePropertyExists(val, \"state\", true) && ensurePropertyExists(val, \"_vm\", true)) return getStoreDetails(val);\n\t\telse if (isVueInstance(val)) {\n\t\t\tconst componentVal = getInstanceDetails(val);\n\t\t\tconst parentInstanceDepth = seenInstance?.get(val);\n\t\t\tif (parentInstanceDepth && parentInstanceDepth < depth) return `[[CircularRef]] <${componentVal._custom.displayText}>`;\n\t\t\tseenInstance?.set(val, depth);\n\t\t\treturn componentVal;\n\t\t} else if (ensurePropertyExists(val, \"render\", true) && typeof val.render === \"function\") return getComponentDefinitionDetails(val);\n\t\telse if (val.constructor && val.constructor.name === \"VNode\") return `[native VNode <${val.tag}>]`;\n\t\telse if (typeof HTMLElement !== \"undefined\" && val instanceof HTMLElement) return getHTMLElementDetails(val);\n\t\telse if (val.constructor?.name === \"Store\" && \"_wrappedGetters\" in val) return \"[object Store]\";\n\t\tconst customDetails = getObjectDetails(val);\n\t\tif (customDetails != null) return customDetails;\n\t} else if (Number.isNaN(val)) return NAN;\n\treturn sanitize(val);\n}\n//#endregion\n//#region src/shared/transfer.ts\nconst MAX_SERIALIZED_SIZE = 2 * 1024 * 1024;\nfunction isObject(_data, proto) {\n\treturn proto === \"[object Object]\";\n}\nfunction isArray(_data, proto) {\n\treturn proto === \"[object Array]\";\n}\nfunction isVueReactiveLinkNode(node) {\n\tconst constructorName = node?.constructor?.name;\n\treturn constructorName === \"Dep\" && \"activeLink\" in node || constructorName === \"Link\" && \"dep\" in node;\n}\n/**\n* This function is used to serialize object with handling circular references.\n*\n* ```ts\n* const obj = { a: 1, b: { c: 2 }, d: obj }\n* const result = stringifyCircularAutoChunks(obj) // call `encode` inside\n* console.log(result) // [{\"a\":1,\"b\":2,\"d\":0},1,{\"c\":4},2]\n* ```\n*\n* Each object is stored in a list and the index is used to reference the object.\n* With seen map, we can check if the object is already stored in the list to avoid circular references.\n*\n* Note: here we have a special case for Vue instance.\n* We check if a vue instance includes itself in its properties and skip it\n* by using `seenVueInstance` and `depth` to avoid infinite loop.\n*/\nfunction encode(data, replacer, list, seen, depth = 0, seenVueInstance = /* @__PURE__ */ new Map()) {\n\tlet stored;\n\tlet key;\n\tlet value;\n\tlet i;\n\tlet l;\n\tconst seenIndex = seen.get(data);\n\tif (seenIndex != null) return seenIndex;\n\tconst index = list.length;\n\tconst proto = Object.prototype.toString.call(data);\n\tif (isObject(data, proto)) {\n\t\tif (isVueReactiveLinkNode(data)) return index;\n\t\tstored = {};\n\t\tseen.set(data, index);\n\t\tlist.push(stored);\n\t\tconst keys = Object.keys(data);\n\t\tfor (i = 0, l = keys.length; i < l; i++) {\n\t\t\tkey = keys[i];\n\t\t\tif (key === \"compilerOptions\") return index;\n\t\t\tvalue = data[key];\n\t\t\tconst isVm = value != null && isObject(value, Object.prototype.toString.call(data)) && isVueInstance(value);\n\t\t\ttry {\n\t\t\t\tif (replacer) value = replacer.call(data, key, value, depth, seenVueInstance);\n\t\t\t} catch (e) {\n\t\t\t\tvalue = e;\n\t\t\t}\n\t\t\tstored[key] = encode(value, replacer, list, seen, depth + 1, seenVueInstance);\n\t\t\tif (isVm) seenVueInstance.delete(value);\n\t\t}\n\t} else if (isArray(data, proto)) {\n\t\tstored = [];\n\t\tseen.set(data, index);\n\t\tlist.push(stored);\n\t\tfor (i = 0, l = data.length; i < l; i++) {\n\t\t\ttry {\n\t\t\t\tvalue = data[i];\n\t\t\t\tif (replacer) value = replacer.call(data, i, value, depth, seenVueInstance);\n\t\t\t} catch (e) {\n\t\t\t\tvalue = e;\n\t\t\t}\n\t\t\tstored[i] = encode(value, replacer, list, seen, depth + 1, seenVueInstance);\n\t\t}\n\t} else list.push(data);\n\treturn index;\n}\nfunction decode(list, reviver = null) {\n\tlet i = list.length;\n\tlet j, k, data, key, value, proto;\n\twhile (i--) {\n\t\tdata = list[i];\n\t\tproto = Object.prototype.toString.call(data);\n\t\tif (proto === \"[object Object]\") {\n\t\t\tconst keys = Object.keys(data);\n\t\t\tfor (j = 0, k = keys.length; j < k; j++) {\n\t\t\t\tkey = keys[j];\n\t\t\t\tvalue = list[data[key]];\n\t\t\t\tif (reviver) value = reviver.call(data, key, value);\n\t\t\t\tdata[key] = value;\n\t\t\t}\n\t\t} else if (proto === \"[object Array]\") for (j = 0, k = data.length; j < k; j++) {\n\t\t\tvalue = list[data[j]];\n\t\t\tif (reviver) value = reviver.call(data, j, value);\n\t\t\tdata[j] = value;\n\t\t}\n\t}\n}\nfunction stringifyCircularAutoChunks(data, replacer = null, space = null) {\n\tlet result;\n\ttry {\n\t\tresult = arguments.length === 1 ? JSON.stringify(data) : JSON.stringify(data, (k, v) => replacer?.(k, v)?.call(this), space);\n\t} catch (e) {\n\t\tresult = stringifyStrictCircularAutoChunks(data, replacer, space);\n\t}\n\tif (result.length > MAX_SERIALIZED_SIZE) {\n\t\tconst chunkCount = Math.ceil(result.length / MAX_SERIALIZED_SIZE);\n\t\tconst chunks = [];\n\t\tfor (let i = 0; i < chunkCount; i++) chunks.push(result.slice(i * MAX_SERIALIZED_SIZE, (i + 1) * MAX_SERIALIZED_SIZE));\n\t\treturn chunks;\n\t}\n\treturn result;\n}\nfunction stringifyStrictCircularAutoChunks(data, replacer = null, space = null) {\n\tconst list = [];\n\tencode(data, replacer, list, /* @__PURE__ */ new Map());\n\treturn space ? ` ${JSON.stringify(list, null, space)}` : ` ${JSON.stringify(list)}`;\n}\nfunction parseCircularAutoChunks(data, reviver = null) {\n\tif (Array.isArray(data)) data = data.join(\"\");\n\tif (!/^\\s/.test(data)) return arguments.length === 1 ? JSON.parse(data) : JSON.parse(data, reviver);\n\telse {\n\t\tconst list = JSON.parse(data);\n\t\tdecode(list, reviver);\n\t\treturn list[0];\n\t}\n}\n//#endregion\n//#region src/shared/util.ts\nfunction stringify(data) {\n\treturn stringifyCircularAutoChunks(data, stringifyReplacer);\n}\nfunction parse(data, revive = false) {\n\tif (data == void 0) return {};\n\treturn revive ? parseCircularAutoChunks(data, reviver) : parseCircularAutoChunks(data);\n}\n//#endregion\n//#region src/index.ts\nconst devtools = {\n\thook,\n\tinit: () => {\n\t\tinitDevTools();\n\t},\n\tget ctx() {\n\t\treturn devtoolsContext;\n\t},\n\tget api() {\n\t\treturn devtoolsContext.api;\n\t}\n};\n//#endregion\nexport { DevToolsContextHookKeys, DevToolsMessagingHookKeys, DevToolsV6PluginAPIHookKeys, INFINITY, NAN, NEGATIVE_INFINITY, ROUTER_INFO_KEY, ROUTER_KEY, UNDEFINED, activeAppRecord, addCustomCommand, addCustomTab, addDevToolsAppRecord, addDevToolsPluginToBuffer, addInspector, callConnectedUpdatedHook, callDevToolsPluginSetupFn, callInspectorUpdatedHook, callStateUpdatedHook, createComponentsDevToolsPlugin, createDevToolsApi, createDevToolsCtxHooks, createRpcClient, createRpcProxy, createRpcServer, devtools, devtoolsAppRecords, devtoolsContext, devtoolsInspector, devtoolsPluginBuffer, devtoolsRouter, devtoolsRouterInfo, devtoolsState, escape, formatInspectorStateValue, getActiveInspectors, getDevToolsEnv, getExtensionClientContext, getInspector, getInspectorActions, getInspectorInfo, getInspectorNodeActions, getInspectorStateValueType, getRaw, getRpcClient, getRpcServer, getViteRpcClient, getViteRpcServer, initDevTools, isPlainObject, onDevToolsClientConnected, onDevToolsConnected, parse, registerDevToolsPlugin, removeCustomCommand, removeDevToolsAppRecord, removeRegisteredPluginApp, resetDevToolsState, setActiveAppRecord, setActiveAppRecordId, setDevToolsEnv, setElectronClientContext, setElectronProxyContext, setElectronServerContext, setExtensionClientContext, setIframeServerContext, setOpenInEditorBaseUrl, setRpcServerToGlobal, setViteClientContext, setViteRpcClientToGlobal, setViteRpcServerToGlobal, setViteServerContext, setupDevToolsPlugin, stringify, toEdit, toSubmit, toggleClientConnected, toggleComponentInspectorEnabled, toggleHighPerfMode, updateDevToolsClientDetected, updateDevToolsState, updateTimelineLayersState };\n"],"x_google_ignoreList":[0,1,2,3,4],"mappings":"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AAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,QAAQ;GACR,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,MAAM;GACN,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,KAAK;GACL,OAAO;GACP,MAAM;GACN,KAAK;GACL,KAAK;EACN;;;;;;EAMA,IAAI,qBAAqB,CAAC,KAAK,GAAG;;;;;EAKlC,IAAI,aAAa;GAChB,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,MAAM;GACN,KAAK;GACL,KAAK;GACL,QAAQ;GACR,MAAM;GACN,OAAO;GACP,MAAM;GACN,OAAO;GACP,KAAK;GACL,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,MAAM;GACN,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;GACR,OAAO;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,OAAO;GACP,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,SAAS;GACT,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,MAAM;GACN,QAAQ;GACR,MAAM;GACN,KAAK;GACL,MAAM;GACN,MAAM;GACN,OAAO;GACP,OAAO;EACR;;;;;EAKA,IAAI,cAAc;GACjB,MAAM,CAAC;GACP,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;EACD;;;;;;EAMA,IAAI,YAAY;GACf,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM,CAAC;GACP,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM,CAAC;GACP,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM,CAAC;GACP,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM,CAAC;GACP,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;GACA,MAAM;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;GACN;EACD;EACA,IAAI,YAAY;GACf;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD,CAAC,CAAC,KAAK,EAAE;EACT,IAAI,mBAAmB;GACtB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD,CAAC,CAAC,KAAK,EAAE;EACT,IAAI,YAAY;GACf;GACA;GACA;GACA;GACA;GACA;GACA;EACD,CAAC,CAAC,KAAK,EAAE;;;;;;;;EAQT,IAAI,UAAU,SAAS,QAAQ,OAAO,MAAM;GAC3C,IAAI,YAAY;GAChB,IAAI,SAAS;GACb,IAAI,gBAAgB;GACpB,IAAI,iBAAiB;GACrB,IAAI,qBAAqB,CAAC;GAC1B,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,eAAe;GACnB,IAAI,OAAO,UAAU,UAAU,OAAO;GACtC,IAAI,OAAO,SAAS,UAAU,YAAY;GAC1C,SAAS,UAAU;GACnB,WAAW,YAAY;GACvB,IAAI,OAAO,SAAS,UAAU;IAC7B,eAAe,KAAK,gBAAgB;IACpC,qBAAqB,KAAK,UAAU,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;IACpF,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK,YAAY;IAClD,WAAW,KAAK,QAAQ;IACxB,kBAAkB,KAAK,eAAe;IACtC,WAAW,KAAK,QAAQ;IACxB,iBAAiB,KAAK,YAAY,SAAS,KAAK,SAAS,QAAQ,QAAQ;IACzE,YAAY,KAAK,aAAa;IAC9B,IAAI,UAAU,gBAAgB;IAC9B,IAAI,iBAAiB,gBAAgB;IACrC,IAAI,UAAU,gBAAgB;IAC9B,SAAS,KAAK,QAAQ,UAAU,KAAK,SAAS,iBAAiB,UAAU,KAAK,QAAQ,iBAAiB,UAAU,KAAK,CAAC;IACvH,WAAW,KAAK,QAAQ,YAAY,KAAK,QAAQ,YAAY,KAAK,QAAQ,KAAK,SAAS,SAAS,KAAK,SAAS,OAAO,CAAC,IAAI,YAAY;IACvI,IAAI,KAAK,aAAa,OAAO,KAAK,UAAU,WAAW,YAAY,MAAM,UAAU,SAAS,KAAK,KAAK,SAAS,GAAG;KACjH,KAAK,UAAU,QAAQ,SAAS,GAAG;MAClC,mBAAmB,IAAI,MAAM,IAAI;KAClC,CAAC;KACD,YAAY;IACb,OAAO,YAAY,CAAC,CAAC,KAAK;IAC1B,IAAI,KAAK,UAAU,OAAO,KAAK,OAAO,WAAW,YAAY,MAAM,UAAU,SAAS,KAAK,KAAK,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;KACxI,mBAAmB,IAAI,MAAM,IAAI;IAClC,CAAC;IACD,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,SAAS,GAAG;KACnD,IAAI;KACJ,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,OAAO,IAAI;UAChE,IAAI,IAAI,OAAO,YAAY,CAAC,GAAG,IAAI;KACxC,QAAQ,MAAM,QAAQ,GAAG,mBAAmB,EAAE;IAC/C,CAAC;IACD,KAAK,MAAM,oBAAoB,gBAAgB;GAChD;GACA,gBAAgB;GAChB,eAAe,YAAY,YAAY;GACvC,QAAQ,MAAM,QAAQ,gBAAgB,EAAE;GACxC,oBAAoB;GACpB,qBAAqB;GACrB,KAAK,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK;IACzC,KAAK,MAAM;IACX,IAAI,qBAAqB,IAAI,kBAAkB,GAAG,oBAAoB;SACjE,IAAI,SAAS,KAAK;KACtB,KAAK,qBAAqB,SAAS,GAAG,CAAC,MAAM,aAAa,IAAI,MAAM,SAAS,MAAM,SAAS;KAC5F,oBAAoB;IACrB,OAAO,IAAI,MAAM,SAAS;KACzB,IAAI,IAAI,IAAI,KAAK,mBAAmB,QAAQ,MAAM,IAAI,EAAE,KAAK,GAAG;MAC/D,iBAAiB;MACjB,KAAK;KACN,OAAO,IAAI,uBAAuB,MAAM;MACvC,KAAK,WAAW,iBAAiB,QAAQ;MACzC,gBAAgB;KACjB,OAAO,KAAK,qBAAqB,QAAQ,GAAG,CAAC,MAAM,aAAa,IAAI,MAAM,QAAQ,MAAM,QAAQ;KAChG,oBAAoB;KACpB,qBAAqB;IACtB,OAAO,IAAI,MAAM,YAAY;KAC5B,iBAAiB;KACjB,KAAK;KACL,IAAI,MAAM,IAAI,GAAG,KAAK,WAAW;KACjC,qBAAqB;IACtB,OAAO,IAAI,OAAO,OAAO,EAAE,YAAY,UAAU,QAAQ,EAAE,MAAM,OAAO,EAAE,mBAAmB,iBAAiB,QAAQ,EAAE,MAAM,KAAK;KAClI,KAAK,qBAAqB,OAAO,OAAO,EAAE,CAAC,CAAC,MAAM,aAAa,IAAI,YAAY,OAAO,MAAM,OAAO;KACnG,MAAM,MAAM,IAAI,OAAO,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,aAAa,IAAI,YAAY;KACjF,oBAAoB;IACrB,OAAO;KACN,IAAI,uBAAuB,MAAM;MAChC,KAAK,WAAW,iBAAiB;MACjC,gBAAgB;MAChB,qBAAqB;KACtB,OAAO,IAAI,sBAAsB,cAAc,KAAK,EAAE,KAAK,OAAO,OAAO,EAAE,CAAC,CAAC,MAAM,YAAY,IAAI,KAAK,MAAM;KAC9G,oBAAoB;IACrB;IACA,UAAU,GAAG,QAAQ,IAAI,OAAO,aAAa,eAAe,OAAO,GAAG,GAAG,SAAS;GACnF;GACA,IAAI,WAAW,SAAS,OAAO,QAAQ,cAAc,SAAS,GAAG,GAAG,GAAG;IACtE,IAAI,IAAI,EAAE,YAAY,KAAK,MAAM,OAAO,IAAI;IAC5C,OAAO,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE,YAAY;GACzF,CAAC;GACD,SAAS,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,QAAQ,IAAI,OAAO,OAAO,YAAY,KAAK,GAAG,GAAG,SAAS,CAAC,CAAC,QAAQ,IAAI,OAAO,SAAS,YAAY,SAAS,YAAY,OAAO,GAAG,GAAG,EAAE;GACnL,IAAI,YAAY,OAAO,SAAS,UAAU;IACzC,QAAQ,OAAO,OAAO,QAAQ,MAAM;IACpC,SAAS,OAAO,MAAM,GAAG,QAAQ;IACjC,IAAI,CAAC,OAAO,SAAS,OAAO,MAAM,GAAG,OAAO,YAAY,SAAS,CAAC;GACnE;GACA,IAAI,CAAC,gBAAgB,CAAC,WAAW,SAAS,OAAO,YAAY;GAC7D,OAAO;EACR;;;;;;EAMA,IAAI,aAAa,SAAS,WAAW,MAAM;;;;;;GAM1C,OAAO,SAAS,kBAAkB,OAAO;IACxC,OAAO,QAAQ,OAAO,IAAI;GAC3B;EACD;;;;;EAKA,IAAI,cAAc,SAAS,YAAY,OAAO;GAC7C,OAAO,MAAM,QAAQ,0BAA0B,MAAM;EACtD;;;;;;EAMA,IAAI,uBAAuB,SAAS,IAAI,oBAAoB;GAC3D,KAAK,IAAI,KAAK,oBAAoB,IAAI,mBAAmB,OAAO,IAAI,OAAO;EAC5E;EACA,IAAI,OAAO,WAAW,eAAe,OAAO,SAAS;GACpD,OAAO,UAAU;GACjB,OAAO,QAAQ,aAAa;EAC7B,OAAO,IAAI,OAAO,WAAW,eAAe,OAAO,KAAK,OAAO,CAAC,GAAG,WAAW;GAC7E,OAAO;EACR,CAAC;OACI,IAAI;GACR,IAAI,KAAK,WAAW,KAAK,YAAY,MAAM;QACtC;IACJ,KAAK,UAAU;IACf,KAAK,aAAa;GACnB;EACD,SAAS,GAAG,CAAC;CACd,EAAA,CAAG,OAAO;AACX,EAAE;CAGgE,gCAAgB,SAAS,WAAW;CACrG,OAAO,UAAU,sBAAsB;AACxC,EAAE,EAAA,CAAG;AACiB,OAAO,0CAA0C;CACtE,IAAI;CACJ,wBAAwB,IAAI,IAAI;AACjC;AAoMA,SAAS,0BAA0B,IAAI;CACtC,OAAO,IAAI,SAAS,YAAY;EAC/B,IAAI,cAAc,aAAa,cAAc,iBAAiB;GAC7D,GAAG;GACH,QAAQ;GACR;EACD;EACA,gBAAgB,MAAM,KAAK,0BAA0B,6BAA6B,EAAE,YAAY;GAC/F,IAAI,MAAM,aAAa,MAAM,iBAAiB;IAC7C,GAAG;IACH,QAAQ;GACT;EACD,CAAC;CACF,CAAC;AACF;AAGA,SAAS,mBAAmB,OAAO;CAClC,cAAc,sBAAsB,SAAS,CAAC,cAAc;CAC5D,IAAI,CAAC,SAAS,gBAAgB,OAAO,uBAAuB,gBAAgB,MAAM,GAAG;AACtF;AAyHA,SAAS,6BAA6B,QAAQ;CAC7C,cAAc,yBAAyB;EACtC,GAAG,cAAc;EACjB,GAAG;CACJ;CACA,mBAAmB,CAAC,OAAO,OAAO,cAAc,sBAAsB,CAAC,CAAC,KAAK,OAAO,CAAC;AACtF;AACA,OAAO,4CAA4C;AAGnD,IAAI,kBAAkB,MAAM;CAC3B,cAAc;EACb,KAAK,6BAA6B,IAAI,IAAI;EAC1C,KAAK,6BAA6B,IAAI,IAAI;CAC3C;CACA,IAAI,KAAK,OAAO;EACf,KAAK,WAAW,IAAI,KAAK,KAAK;EAC9B,KAAK,WAAW,IAAI,OAAO,GAAG;CAC/B;CACA,SAAS,KAAK;EACb,OAAO,KAAK,WAAW,IAAI,GAAG;CAC/B;CACA,WAAW,OAAO;EACjB,OAAO,KAAK,WAAW,IAAI,KAAK;CACjC;CACA,QAAQ;EACP,KAAK,WAAW,MAAM;EACtB,KAAK,WAAW,MAAM;CACvB;AACD;AAGA,IAAI,WAAW,MAAM;CACpB,YAAY,oBAAoB;EAC/B,KAAK,qBAAqB;EAC1B,KAAK,KAAK,IAAI,gBAAgB;CAC/B;CACA,SAAS,OAAO,YAAY;EAC3B,IAAI,KAAK,GAAG,WAAW,KAAK,GAAG;EAC/B,IAAI,CAAC,YAAY,aAAa,KAAK,mBAAmB,KAAK;EAC3D,KAAK,GAAG,IAAI,YAAY,KAAK;CAC9B;CACA,QAAQ;EACP,KAAK,GAAG,MAAM;CACf;CACA,cAAc,OAAO;EACpB,OAAO,KAAK,GAAG,WAAW,KAAK;CAChC;CACA,SAAS,YAAY;EACpB,OAAO,KAAK,GAAG,SAAS,UAAU;CACnC;AACD;AAGA,IAAI,gBAAgB,cAAc,SAAS;CAC1C,cAAc;EACb,OAAO,MAAM,EAAE,IAAI;EACnB,KAAK,sCAAsC,IAAI,IAAI;CACpD;CACA,SAAS,OAAO,SAAS;EACxB,IAAI,OAAO,YAAY,UAAU;GAChC,IAAI,QAAQ,YAAY,KAAK,oBAAoB,IAAI,OAAO,QAAQ,UAAU;GAC9E,MAAM,SAAS,OAAO,QAAQ,UAAU;EACzC,OAAO,MAAM,SAAS,OAAO,OAAO;CACrC;CACA,gBAAgB,OAAO;EACtB,OAAO,KAAK,oBAAoB,IAAI,KAAK;CAC1C;AACD;AAGA,SAAS,YAAY,QAAQ;CAC5B,IAAI,YAAY,QAAQ,OAAO,OAAO,OAAO,MAAM;CACnD,MAAM,SAAS,CAAC;CAChB,KAAK,MAAM,OAAO,QAAQ,IAAI,OAAO,eAAe,GAAG,GAAG,OAAO,KAAK,OAAO,IAAI;CACjF,OAAO;AACR;AACA,SAAS,KAAK,QAAQ,WAAW;CAChC,MAAM,SAAS,YAAY,MAAM;CACjC,IAAI,UAAU,QAAQ,OAAO,OAAO,KAAK,SAAS;CAClD,MAAM,iBAAiB;CACvB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;EAC/C,MAAM,QAAQ,eAAe;EAC7B,IAAI,UAAU,KAAK,GAAG,OAAO;CAC9B;AACD;AACA,SAAS,QAAQ,QAAQ,KAAK;CAC7B,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,WAAW,IAAI,OAAO,GAAG,CAAC;AACjE;AACA,SAAS,SAAS,KAAK,OAAO;CAC7B,OAAO,IAAI,QAAQ,KAAK,MAAM;AAC/B;AACA,SAAS,QAAQ,QAAQ,WAAW;CACnC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACvC,MAAM,QAAQ,OAAO;EACrB,IAAI,UAAU,KAAK,GAAG,OAAO;CAC9B;AACD;AAGA,IAAI,4BAA4B,MAAM;CACrC,cAAc;EACb,KAAK,cAAc,CAAC;CACrB;CACA,SAAS,aAAa;EACrB,KAAK,YAAY,YAAY,QAAQ;CACtC;CACA,eAAe,GAAG;EACjB,OAAO,KAAK,KAAK,cAAc,gBAAgB,YAAY,aAAa,CAAC,CAAC;CAC3E;CACA,WAAW,MAAM;EAChB,OAAO,KAAK,YAAY;CACzB;AACD;AAGA,IAAM,aAAa,YAAY,OAAO,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE;AAClF,IAAM,iBAAiB,YAAY,OAAO,YAAY;AACtD,IAAM,YAAY,YAAY,YAAY;AAC1C,IAAM,mBAAmB,YAAY;CACpC,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,OAAO;CAC5D,IAAI,YAAY,OAAO,WAAW,OAAO;CACzC,IAAI,OAAO,eAAe,OAAO,MAAM,MAAM,OAAO;CACpD,OAAO,OAAO,eAAe,OAAO,MAAM,OAAO;AAClD;AACA,IAAM,iBAAiB,YAAY,gBAAgB,OAAO,KAAK,OAAO,KAAK,OAAO,CAAC,CAAC,WAAW;AAC/F,IAAM,aAAa,YAAY,MAAM,QAAQ,OAAO;AACpD,IAAM,YAAY,YAAY,OAAO,YAAY;AACjD,IAAM,YAAY,YAAY,OAAO,YAAY,YAAY,CAAC,MAAM,OAAO;AAC3E,IAAM,aAAa,YAAY,OAAO,YAAY;AAClD,IAAM,YAAY,YAAY,mBAAmB;AACjD,IAAM,SAAS,YAAY,mBAAmB;AAC9C,IAAM,SAAS,YAAY,mBAAmB;AAC9C,IAAM,YAAY,YAAY,UAAU,OAAO,MAAM;AACrD,IAAM,UAAU,YAAY,mBAAmB,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAC/E,IAAM,WAAW,YAAY,mBAAmB;AAChD,IAAM,cAAc,YAAY,OAAO,YAAY,YAAY,MAAM,OAAO;AAC5E,IAAM,eAAe,YAAY,UAAU,OAAO,KAAK,SAAS,OAAO,KAAK,cAAc,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,OAAO;AAChK,IAAM,YAAY,YAAY,OAAO,YAAY;AACjD,IAAM,cAAc,YAAY,YAAY,YAAY,YAAY;AACpE,IAAM,gBAAgB,YAAY,YAAY,OAAO,OAAO,KAAK,EAAE,mBAAmB;AACtF,IAAM,SAAS,YAAY,mBAAmB;AAG9C,IAAM,aAAa,QAAQ,IAAI,QAAQ,OAAO,KAAK;AACnD,IAAM,iBAAiB,SAAS,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,GAAG;AACxE,IAAM,aAAa,WAAW;CAC7B,MAAM,SAAS,CAAC;CAChB,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACvC,IAAI,OAAO,OAAO,OAAO,CAAC;EAC1B,IAAI,SAAS,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK;GAClD,WAAW;GACX;GACA;EACD;EACA,IAAI,SAAS,KAAK;GACjB,OAAO,KAAK,OAAO;GACnB,UAAU;GACV;EACD;EACA,WAAW;CACZ;CACA,MAAM,cAAc;CACpB,OAAO,KAAK,WAAW;CACvB,OAAO;AACR;AAGA,SAAS,qBAAqB,cAAc,YAAY,WAAW,aAAa;CAC/E,OAAO;EACN;EACA;EACA;EACA;CACD;AACD;AACA,IAAM,cAAc;CACnB,qBAAqB,eAAe,mBAAmB,YAAY,KAAK,CAAC;CACzE,qBAAqB,UAAU,WAAW,MAAM,EAAE,SAAS,IAAI,MAAM;EACpE,IAAI,OAAO,WAAW,aAAa,OAAO,OAAO,CAAC;EAClD,QAAQ,MAAM,+BAA+B;EAC7C,OAAO;CACR,CAAC;CACD,qBAAqB,QAAQ,SAAS,MAAM,EAAE,YAAY,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC;CAC/E,qBAAqB,SAAS,UAAU,GAAG,cAAc;EACxD,MAAM,YAAY;GACjB,MAAM,EAAE;GACR,SAAS,EAAE;EACZ;EACA,UAAU,kBAAkB,SAAS,SAAS;GAC7C,UAAU,QAAQ,EAAE;EACrB,CAAC;EACD,OAAO;CACR,IAAI,GAAG,cAAc;EACpB,MAAM,IAAI,IAAI,MAAM,EAAE,OAAO;EAC7B,EAAE,OAAO,EAAE;EACX,EAAE,QAAQ,EAAE;EACZ,UAAU,kBAAkB,SAAS,SAAS;GAC7C,EAAE,QAAQ,EAAE;EACb,CAAC;EACD,OAAO;CACR,CAAC;CACD,qBAAqB,UAAU,WAAW,MAAM,KAAK,IAAI,UAAU;EAClE,MAAM,OAAO,MAAM,MAAM,GAAG,MAAM,YAAY,GAAG,CAAC;EAClD,MAAM,QAAQ,MAAM,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;EACpD,OAAO,IAAI,OAAO,MAAM,KAAK;CAC9B,CAAC;CACD,qBAAqB,OAAO,QAAQ,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC;CAC5E,qBAAqB,OAAO,QAAQ,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC;CAC7E,sBAAsB,MAAM,WAAW,CAAC,KAAK,WAAW,CAAC,GAAG,WAAW,MAAM;EAC5E,IAAI,WAAW,CAAC,GAAG,OAAO;EAC1B,IAAI,IAAI,GAAG,OAAO;OACb,OAAO;CACb,GAAG,MAAM;CACT,sBAAsB,MAAM,MAAM,KAAK,IAAI,MAAM,WAAW,gBAAgB;EAC3E,OAAO;CACR,GAAG,MAAM;CACT,qBAAqB,OAAO,QAAQ,MAAM,EAAE,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC;AAC1E;AACA,SAAS,wBAAwB,cAAc,YAAY,WAAW,aAAa;CAClF,OAAO;EACN;EACA;EACA;EACA;CACD;AACD;AACA,IAAM,aAAa,yBAAyB,GAAG,cAAc;CAC5D,IAAI,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,UAAU,eAAe,cAAc,CAAC;CAClE,OAAO;AACR,IAAI,GAAG,cAAc;CACpB,OAAO,CAAC,UAAU,UAAU,eAAe,cAAc,CAAC,CAAC;AAC5D,IAAI,MAAM,EAAE,cAAc,GAAG,GAAG,cAAc;CAC7C,MAAM,QAAQ,UAAU,eAAe,SAAS,EAAE,EAAE;CACpD,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,sCAAsC;CAClE,OAAO;AACR,CAAC;AACD,IAAM,oBAAoB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC,CAAC,QAAQ,KAAK,SAAS;CACvB,IAAI,KAAK,QAAQ;CACjB,OAAO;AACR,GAAG,CAAC,CAAC;AACL,IAAM,iBAAiB,wBAAwB,eAAe,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM;CACjI,MAAM,OAAO,kBAAkB,EAAE;CACjC,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,2CAA2C;CACtE,OAAO,IAAI,KAAK,CAAC;AAClB,CAAC;AACD,SAAS,4BAA4B,gBAAgB,WAAW;CAC/D,IAAI,gBAAgB,aAAa,OAAO,CAAC,CAAC,UAAU,cAAc,cAAc,eAAe,WAAW;CAC1G,OAAO;AACR;AACA,IAAM,YAAY,wBAAwB,8BAA8B,OAAO,cAAc;CAC5F,OAAO,CAAC,SAAS,UAAU,cAAc,cAAc,MAAM,WAAW,CAAC;AAC1E,IAAI,OAAO,cAAc;CACxB,MAAM,eAAe,UAAU,cAAc,gBAAgB,MAAM,WAAW;CAC9E,IAAI,CAAC,cAAc,OAAO,EAAE,GAAG,MAAM;CACrC,MAAM,SAAS,CAAC;CAChB,aAAa,SAAS,SAAS;EAC9B,OAAO,QAAQ,MAAM;CACtB,CAAC;CACD,OAAO;AACR,IAAI,GAAG,GAAG,cAAc;CACvB,MAAM,QAAQ,UAAU,cAAc,SAAS,EAAE,EAAE;CACnD,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,wCAAwC,EAAE,GAAG,kFAAkF;CAC3J,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,SAAS,GAAG,CAAC;AACvD,CAAC;AACD,IAAM,aAAa,yBAAyB,OAAO,cAAc;CAChE,OAAO,CAAC,CAAC,UAAU,0BAA0B,eAAe,KAAK;AAClE,IAAI,OAAO,cAAc;CACxB,OAAO,CAAC,UAAU,UAAU,0BAA0B,eAAe,KAAK,CAAC,CAAC,IAAI;AACjF,IAAI,OAAO,cAAc;CACxB,OAAO,UAAU,0BAA0B,eAAe,KAAK,CAAC,CAAC,UAAU,KAAK;AACjF,IAAI,GAAG,GAAG,cAAc;CACvB,MAAM,cAAc,UAAU,0BAA0B,WAAW,EAAE,EAAE;CACvE,IAAI,CAAC,aAAa,MAAM,IAAI,MAAM,4CAA4C;CAC9E,OAAO,YAAY,YAAY,CAAC;AACjC,CAAC;AACD,IAAM,iBAAiB;CACtB;CACA;CACA;CACA;AACD;AACA,IAAM,kBAAkB,OAAO,cAAc;CAC5C,MAAM,0BAA0B,QAAQ,iBAAiB,SAAS,KAAK,aAAa,OAAO,SAAS,CAAC;CACrG,IAAI,yBAAyB,OAAO;EACnC,OAAO,wBAAwB,UAAU,OAAO,SAAS;EACzD,MAAM,wBAAwB,WAAW,OAAO,SAAS;CAC1D;CACA,MAAM,uBAAuB,QAAQ,cAAc,SAAS,KAAK,aAAa,OAAO,SAAS,CAAC;CAC/F,IAAI,sBAAsB,OAAO;EAChC,OAAO,qBAAqB,UAAU,OAAO,SAAS;EACtD,MAAM,qBAAqB;CAC5B;AACD;AACA,IAAM,0BAA0B,CAAC;AACjC,YAAY,SAAS,SAAS;CAC7B,wBAAwB,KAAK,cAAc;AAC5C,CAAC;AACD,IAAM,oBAAoB,MAAM,MAAM,cAAc;CACnD,IAAI,UAAU,IAAI,GAAG,QAAQ,KAAK,IAAb;EACpB,KAAK,UAAU,OAAO,WAAW,YAAY,MAAM,MAAM,SAAS;EAClE,KAAK,SAAS,OAAO,UAAU,YAAY,MAAM,MAAM,SAAS;EAChE,KAAK,UAAU,OAAO,WAAW,YAAY,MAAM,MAAM,SAAS;EAClE,KAAK,eAAe,OAAO,eAAe,YAAY,MAAM,MAAM,SAAS;EAC3E,SAAS,MAAM,IAAI,MAAM,6BAA6B,IAAI;CAC3D;MACK;EACJ,MAAM,iBAAiB,wBAAwB;EAC/C,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,6BAA6B,IAAI;EACtE,OAAO,eAAe,YAAY,MAAM,SAAS;CAClD;AACD;AAGA,IAAM,aAAa,OAAO,MAAM;CAC/B,IAAI,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,qBAAqB;CACzD,MAAM,OAAO,MAAM,KAAK;CACxB,OAAO,IAAI,GAAG;EACb,KAAK,KAAK;EACV;CACD;CACA,OAAO,KAAK,KAAK,CAAC,CAAC;AACpB;AACA,SAAS,aAAa,MAAM;CAC3B,IAAI,SAAS,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,wCAAwC;CACzF,IAAI,SAAS,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,wCAAwC;CACzF,IAAI,SAAS,MAAM,aAAa,GAAG,MAAM,IAAI,MAAM,0CAA0C;AAC9F;AACA,IAAM,WAAW,QAAQ,SAAS;CACjC,aAAa,IAAI;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACrC,MAAM,MAAM,KAAK;EACjB,IAAI,MAAM,MAAM,GAAG,SAAS,UAAU,QAAQ,CAAC,GAAG;OAC7C,IAAI,MAAM,MAAM,GAAG;GACvB,MAAM,MAAM,CAAC;GACb,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ;GACxC,MAAM,WAAW,UAAU,QAAQ,GAAG;GACtC,QAAQ,MAAR;IACC,KAAK;KACJ,SAAS;KACT;IACD,KAAK,SACJ,SAAS,OAAO,IAAI,QAAQ;GAE9B;EACD,OAAO,SAAS,OAAO;CACxB;CACA,OAAO;AACR;AACA,IAAM,WAAW,QAAQ,MAAM,WAAW;CACzC,aAAa,IAAI;CACjB,IAAI,KAAK,WAAW,GAAG,OAAO,OAAO,MAAM;CAC3C,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;EACzC,MAAM,MAAM,KAAK;EACjB,IAAI,UAAU,MAAM,GAAG;GACtB,MAAM,QAAQ,CAAC;GACf,SAAS,OAAO;EACjB,OAAO,IAAI,gBAAgB,MAAM,GAAG,SAAS,OAAO;OAC/C,IAAI,MAAM,MAAM,GAAG;GACvB,MAAM,MAAM,CAAC;GACb,SAAS,UAAU,QAAQ,GAAG;EAC/B,OAAO,IAAI,MAAM,MAAM,GAAG;GACzB,IAAI,MAAM,KAAK,SAAS,GAAG;GAC3B,MAAM,MAAM,CAAC;GACb,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ;GACxC,MAAM,WAAW,UAAU,QAAQ,GAAG;GACtC,QAAQ,MAAR;IACC,KAAK;KACJ,SAAS;KACT;IACD,KAAK,SACJ,SAAS,OAAO,IAAI,QAAQ;GAE9B;EACD;CACD;CACA,MAAM,UAAU,KAAK,KAAK,SAAS;CACnC,IAAI,UAAU,MAAM,GAAG,OAAO,CAAC,WAAW,OAAO,OAAO,CAAC,QAAQ;MAC5D,IAAI,gBAAgB,MAAM,GAAG,OAAO,WAAW,OAAO,OAAO,QAAQ;CAC1E,IAAI,MAAM,MAAM,GAAG;EAClB,MAAM,WAAW,UAAU,QAAQ,CAAC,OAAO;EAC3C,MAAM,WAAW,OAAO,QAAQ;EAChC,IAAI,aAAa,UAAU;GAC1B,OAAO,OAAO,QAAQ;GACtB,OAAO,IAAI,QAAQ;EACpB;CACD;CACA,IAAI,MAAM,MAAM,GAAG;EAClB,MAAM,MAAM,CAAC,KAAK,KAAK,SAAS;EAChC,MAAM,WAAW,UAAU,QAAQ,GAAG;EACtC,QAAQ,CAAC,YAAY,IAAI,QAAQ,SAAjC;GACC,KAAK,OAAO;IACX,MAAM,SAAS,OAAO,QAAQ;IAC9B,OAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ,CAAC;IACvC,IAAI,WAAW,UAAU,OAAO,OAAO,QAAQ;IAC/C;GACD;GACA,KAAK,SACJ,OAAO,IAAI,UAAU,OAAO,OAAO,IAAI,QAAQ,CAAC,CAAC;EAEnD;CACD;CACA,OAAO;AACR;AAGA,SAAS,SAAS,MAAM,QAAQ,SAAS,CAAC,GAAG;CAC5C,IAAI,CAAC,MAAM;CACX,IAAI,CAAC,UAAU,IAAI,GAAG;EACrB,QAAQ,OAAO,SAAS,QAAQ,SAAS,SAAS,QAAQ,CAAC,GAAG,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;EACzF;CACD;CACA,MAAM,CAAC,WAAW,YAAY;CAC9B,IAAI,UAAU,QAAQ,WAAW,OAAO,QAAQ;EAC/C,SAAS,OAAO,QAAQ,CAAC,GAAG,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC;CACvD,CAAC;CACD,OAAO,WAAW,MAAM;AACzB;AACA,SAAS,sBAAsB,OAAO,aAAa,WAAW;CAC7D,SAAS,cAAc,MAAM,SAAS;EACrC,QAAQ,QAAQ,OAAO,OAAO,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC;CACzE,CAAC;CACD,OAAO;AACR;AACA,SAAS,oCAAoC,OAAO,aAAa;CAChE,SAAS,MAAM,gBAAgB,MAAM;EACpC,MAAM,SAAS,QAAQ,OAAO,UAAU,IAAI,CAAC;EAC7C,eAAe,IAAI,SAAS,CAAC,CAAC,SAAS,wBAAwB;GAC9D,QAAQ,QAAQ,OAAO,2BAA2B,MAAM;EACzD,CAAC;CACF;CACA,IAAI,UAAU,WAAW,GAAG;EAC3B,MAAM,CAAC,MAAM,SAAS;EACtB,KAAK,SAAS,kBAAkB;GAC/B,QAAQ,QAAQ,OAAO,UAAU,aAAa,SAAS,KAAK;EAC7D,CAAC;EACD,IAAI,OAAO,QAAQ,OAAO,KAAK;CAChC,OAAO,QAAQ,aAAa,KAAK;CACjC,OAAO;AACR;AACA,IAAM,UAAU,QAAQ,cAAc,gBAAgB,MAAM,KAAK,UAAU,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,4BAA4B,QAAQ,SAAS;AACrK,SAAS,YAAY,QAAQ,MAAM,YAAY;CAC9C,MAAM,cAAc,WAAW,IAAI,MAAM;CACzC,IAAI,aAAa,YAAY,KAAK,IAAI;MACjC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC;AACnC;AACA,SAAS,uCAAuC,aAAa,QAAQ;CACpE,MAAM,SAAS,CAAC;CAChB,IAAI,oBAAoB,KAAK;CAC7B,YAAY,SAAS,UAAU;EAC9B,IAAI,MAAM,UAAU,GAAG;EACvB,IAAI,CAAC,QAAQ,QAAQ,MAAM,KAAK,SAAS,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;EAC7F,MAAM,CAAC,oBAAoB,GAAG,kBAAkB;EAChD,IAAI,mBAAmB,WAAW,GAAG,oBAAoB,eAAe,IAAI,aAAa;OACpF,OAAO,cAAc,kBAAkB,KAAK,eAAe,IAAI,aAAa;CAClF,CAAC;CACD,IAAI,mBAAmB,IAAI,cAAc,MAAM,GAAG,OAAO,CAAC,iBAAiB;MACtE,OAAO,CAAC,mBAAmB,MAAM;MACjC,OAAO,cAAc,MAAM,IAAI,KAAK,IAAI;AAC9C;AACA,IAAM,UAAU,QAAQ,YAAY,WAAW,QAAQ,OAAO,CAAC,GAAG,oBAAoB,CAAC,GAAG,8BAA8B,IAAI,IAAI,MAAM;CACrI,MAAM,YAAY,YAAY,MAAM;CACpC,IAAI,CAAC,WAAW;EACf,YAAY,QAAQ,MAAM,UAAU;EACpC,MAAM,OAAO,YAAY,IAAI,MAAM;EACnC,IAAI,MAAM,OAAO,SAAS,EAAE,kBAAkB,KAAK,IAAI;CACxD;CACA,IAAI,CAAC,OAAO,QAAQ,SAAS,GAAG;EAC/B,MAAM,cAAc,eAAe,QAAQ,SAAS;EACpD,MAAM,SAAS,cAAc;GAC5B,kBAAkB,YAAY;GAC9B,aAAa,CAAC,YAAY,IAAI;EAC/B,IAAI,EAAE,kBAAkB,OAAO;EAC/B,IAAI,CAAC,WAAW,YAAY,IAAI,QAAQ,MAAM;EAC9C,OAAO;CACR;CACA,IAAI,SAAS,mBAAmB,MAAM,GAAG,OAAO,EAAE,kBAAkB,KAAK;CACzE,MAAM,uBAAuB,eAAe,QAAQ,SAAS;CAC7D,MAAM,cAAc,sBAAsB,SAAS;CACnD,MAAM,mBAAmB,UAAU,WAAW,IAAI,CAAC,IAAI,CAAC;CACxD,MAAM,mBAAmB,CAAC;CAC1B,QAAQ,cAAc,OAAO,UAAU;EACtC,IAAI,UAAU,eAAe,UAAU,iBAAiB,UAAU,aAAa,MAAM,IAAI,MAAM,qBAAqB,MAAM,yEAAyE;EACnM,MAAM,kBAAkB,OAAO,OAAO,YAAY,WAAW,QAAQ,CAAC,GAAG,MAAM,KAAK,GAAG,CAAC,GAAG,mBAAmB,MAAM,GAAG,WAAW;EAClI,iBAAiB,SAAS,gBAAgB;EAC1C,IAAI,UAAU,gBAAgB,WAAW,GAAG,iBAAiB,SAAS,gBAAgB;OACjF,IAAI,gBAAgB,gBAAgB,WAAW,GAAG,QAAQ,gBAAgB,cAAc,MAAM,QAAQ;GAC1G,iBAAiB,UAAU,KAAK,IAAI,MAAM,OAAO;EAClD,CAAC;CACF,CAAC;CACD,MAAM,SAAS,cAAc,gBAAgB,IAAI;EAChD;EACA,aAAa,CAAC,CAAC,uBAAuB,CAAC,qBAAqB,IAAI,IAAI,KAAK;CAC1E,IAAI;EACH;EACA,aAAa,CAAC,CAAC,uBAAuB,CAAC,qBAAqB,MAAM,gBAAgB,IAAI;CACvF;CACA,IAAI,CAAC,WAAW,YAAY,IAAI,QAAQ,MAAM;CAC9C,OAAO;AACR;AAGA,SAAS,QAAQ,SAAS;CACzB,OAAO,OAAO,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE;AAC3D;AACA,SAAS,UAAU,SAAS;CAC3B,OAAO,QAAQ,OAAO,MAAM;AAC7B;AACA,SAAS,gBAAgB,SAAS;CACjC,IAAI,QAAQ,OAAO,MAAM,UAAU,OAAO;CAC1C,MAAM,YAAY,OAAO,eAAe,OAAO;CAC/C,OAAO,CAAC,CAAC,aAAa,UAAU,gBAAgB,UAAU,cAAc,OAAO;AAChF;AAaA,SAAS,WAAW,OAAO,KAAK,QAAQ,gBAAgB,sBAAsB;CAC7E,MAAM,WAAW,CAAC,EAAE,qBAAqB,KAAK,gBAAgB,GAAG,IAAI,eAAe;CACpF,IAAI,aAAa,cAAc,MAAM,OAAO;CAC5C,IAAI,wBAAwB,aAAa,iBAAiB,OAAO,eAAe,OAAO,KAAK;EAC3F,OAAO;EACP,YAAY;EACZ,UAAU;EACV,cAAc;CACf,CAAC;AACF;AACA,SAAS,KAAK,QAAQ,UAAU,CAAC,GAAG;CACnC,IAAI,UAAU,MAAM,GAAG,OAAO,OAAO,KAAK,SAAS,KAAK,MAAM,OAAO,CAAC;CACtE,IAAI,CAAC,gBAAgB,MAAM,GAAG,OAAO;CACrC,MAAM,QAAQ,OAAO,oBAAoB,MAAM;CAC/C,MAAM,UAAU,OAAO,sBAAsB,MAAM;CACnD,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,QAAQ,OAAO,QAAQ;EACpD,IAAI,UAAU,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,GAAG,OAAO;EACrE,MAAM,MAAM,OAAO;EACnB,WAAW,OAAO,KAAK,KAAK,KAAK,OAAO,GAAG,QAAQ,QAAQ,aAAa;EACxE,OAAO;CACR,GAAG,CAAC,CAAC;AACN;AAGA,IAAI,YAAY,MAAM;;;;CAIrB,YAAY,EAAE,SAAS,UAAU,CAAC,GAAG;EACpC,KAAK,gBAAgB,IAAI,cAAc;EACvC,KAAK,iBAAiB,IAAI,UAAU,MAAM,EAAE,eAAe,EAAE;EAC7D,KAAK,4BAA4B,IAAI,0BAA0B;EAC/D,KAAK,oBAAoB,CAAC;EAC1B,KAAK,SAAS;CACf;CACA,UAAU,QAAQ;EACjB,MAAM,6BAA6B,IAAI,IAAI;EAC3C,MAAM,SAAS,OAAO,QAAQ,YAAY,MAAM,KAAK,MAAM;EAC3D,MAAM,MAAM,EAAE,MAAM,OAAO,iBAAiB;EAC5C,IAAI,OAAO,aAAa,IAAI,OAAO;GAClC,GAAG,IAAI;GACP,QAAQ,OAAO;EAChB;EACA,MAAM,sBAAsB,uCAAuC,YAAY,KAAK,MAAM;EAC1F,IAAI,qBAAqB,IAAI,OAAO;GACnC,GAAG,IAAI;GACP,uBAAuB;EACxB;EACA,OAAO;CACR;CACA,YAAY,SAAS;EACpB,MAAM,EAAE,MAAM,SAAS;EACvB,IAAI,SAAS,KAAK,IAAI;EACtB,IAAI,MAAM,QAAQ,SAAS,sBAAsB,QAAQ,KAAK,QAAQ,IAAI;EAC1E,IAAI,MAAM,uBAAuB,SAAS,oCAAoC,QAAQ,KAAK,qBAAqB;EAChH,OAAO;CACR;CACA,UAAU,QAAQ;EACjB,OAAO,KAAK,UAAU,KAAK,UAAU,MAAM,CAAC;CAC7C;CACA,MAAM,QAAQ;EACb,OAAO,KAAK,YAAY,KAAK,MAAM,MAAM,CAAC;CAC3C;CACA,cAAc,GAAG,SAAS;EACzB,KAAK,cAAc,SAAS,GAAG,OAAO;CACvC;CACA,eAAe,GAAG,YAAY;EAC7B,KAAK,eAAe,SAAS,GAAG,UAAU;CAC3C;CACA,eAAe,aAAa,MAAM;EACjC,KAAK,0BAA0B,SAAS;GACvC;GACA,GAAG;EACJ,CAAC;CACF;CACA,gBAAgB,GAAG,OAAO;EACzB,KAAK,kBAAkB,KAAK,GAAG,KAAK;CACrC;AACD;AACA,UAAU,kBAAkB,IAAI,UAAU;AAC1C,UAAU,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,eAAe;AACxF,UAAU,cAAc,UAAU,gBAAgB,YAAY,KAAK,UAAU,eAAe;AAC5F,UAAU,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,eAAe;AACxF,UAAU,QAAQ,UAAU,gBAAgB,MAAM,KAAK,UAAU,eAAe;AAChF,UAAU,gBAAgB,UAAU,gBAAgB,cAAc,KAAK,UAAU,eAAe;AAChG,UAAU,iBAAiB,UAAU,gBAAgB,eAAe,KAAK,UAAU,eAAe;AAClG,UAAU,iBAAiB,UAAU,gBAAgB,eAAe,KAAK,UAAU,eAAe;AAClG,UAAU,kBAAkB,UAAU,gBAAgB,gBAAgB,KAAK,UAAU,eAAe;AACpG,UAAU;AACV,UAAU;AACV,UAAU;AACV,UAAU;AACV,UAAU;AACV,UAAU;AACV,UAAU;AACV,UAAU;AA6SV,OAAO,0CAA0C,CAAC;AAClD,OAAO,oCAAoC;AAC3C,OAAO,oCAAoC;AAC3C,OAAO,yCAAyC;AAChD,OAAO,yCAAyC;AAChD,OAAO,8CAA8C"}
\ No newline at end of file
diff --git a/apps/docs/.vitepress/cache/deps/vitepress_n_@vueuse_core.js b/apps/docs/.vitepress/cache/deps/vitepress_n_@vueuse_core.js
deleted file mode 100644
index d131ffb..0000000
--- a/apps/docs/.vitepress/cache/deps/vitepress_n_@vueuse_core.js
+++ /dev/null
@@ -1,10171 +0,0 @@
-import { $n as toRefs$1, An as customRef, At as onBeforeMount, Bn as markRaw, Bt as onUpdated, Ft as onMounted, Gn as readonly, In as isReactive, Jn as shallowReadonly, Kn as ref, Ln as isReadonly, M as Fragment, Mn as effectScope, Mt as onBeforeUpdate, Nn as getCurrentScope, Ot as nextTick, Qn as toRef$1, Rn as isRef, U as computed, Ut as provide, Vn as onScopeDispose, Wn as reactive, Yn as shallowRef, Zn as toRaw, _n as watchEffect, er as toValue, gn as watch, ht as hasInjectionContext, jt as onBeforeUnmount, nr as unref, nt as defineComponent, pt as h, qn as shallowReactive, r as TransitionGroup, ut as getCurrentInstance, xt as inject, zt as onUnmounted } from "./vue.runtime.esm-bundler-D4M2X7UN.js";
-//#region node_modules/@vueuse/shared/dist/index.js
-/**
-*
-* @deprecated This function will be removed in future version.
-*
-* Note: If you are using Vue 3.4+, you can straight use computed instead.
-* Because in Vue 3.4+, if computed new value does not change,
-* computed, effect, watch, watchEffect, render dependencies will not be triggered.
-* refer: https://github.com/vuejs/core/pull/5912
-*
-* @param fn effect function
-* @param options WatchOptionsBase
-* @returns readonly shallowRef
-*/
-function computedEager(fn, options) {
- var _options$flush;
- const result = shallowRef();
- watchEffect(() => {
- result.value = fn();
- }, {
- ...options,
- flush: (_options$flush = options === null || options === void 0 ? void 0 : options.flush) !== null && _options$flush !== void 0 ? _options$flush : "sync"
- });
- return readonly(result);
-}
-/** @deprecated use `computedEager` instead */
-var eagerComputed = computedEager;
-/**
-* Explicitly define the deps of computed.
-*
-* @param source
-* @param fn
-*/
-function computedWithControl(source, fn, options = {}) {
- let v = void 0;
- let track;
- let trigger;
- let dirty = true;
- const update = () => {
- dirty = true;
- trigger();
- };
- watch(source, update, {
- flush: "sync",
- ...options
- });
- const get = typeof fn === "function" ? fn : fn.get;
- const set = typeof fn === "function" ? void 0 : fn.set;
- const result = customRef((_track, _trigger) => {
- track = _track;
- trigger = _trigger;
- return {
- get() {
- if (dirty) {
- v = get(v);
- dirty = false;
- }
- track();
- return v;
- },
- set(v) {
- set === null || set === void 0 || set(v);
- }
- };
- });
- result.trigger = update;
- return result;
-}
-/** @deprecated use `computedWithControl` instead */
-var controlledComputed = computedWithControl;
-/**
-* Utility for authoring disposable directives. Reactive effects created within `mounted` directive hook will be tracked and automatically disposed when directive is unmounted.
-*
-* @see https://vueuse.org/createDisposableDirective
-*
-* @__NO_SIDE_EFFECTS__
-*/
-function createDisposableDirective(origin = {}) {
- function isFunc(fn) {
- return typeof fn === "function";
- }
- const normalisedOrigin = isFunc(origin) ? {
- mounted: origin,
- updated: origin
- } : origin;
- const { mounted, unmounted } = normalisedOrigin;
- if (!isFunc(mounted)) return origin;
- const scopeWeakMap = /* @__PURE__ */ new WeakMap();
- return {
- ...normalisedOrigin,
- mounted(el, binding, vNode, prevNode) {
- var _scopeWeakMap$get;
- const scope = (_scopeWeakMap$get = scopeWeakMap.get(el)) !== null && _scopeWeakMap$get !== void 0 ? _scopeWeakMap$get : effectScope();
- scopeWeakMap.set(el, scope);
- scope.run(() => {
- mounted === null || mounted === void 0 || mounted(el, binding, vNode, prevNode);
- });
- },
- unmounted(el, binding, vNode, prevNode) {
- var _scopeWeakMap$get2;
- (_scopeWeakMap$get2 = scopeWeakMap.get(el)) === null || _scopeWeakMap$get2 === void 0 || _scopeWeakMap$get2.stop();
- scopeWeakMap.delete(el);
- if (isFunc(unmounted)) unmounted(el, binding, vNode, prevNode);
- }
- };
-}
-/**
-* Call onScopeDispose() if it's inside an effect scope lifecycle, if not, do nothing
-*
-* @param fn
-*/
-function tryOnScopeDispose(fn, failSilently) {
- if (getCurrentScope()) {
- onScopeDispose(fn, failSilently);
- return true;
- }
- return false;
-}
-/**
-* Utility for creating event hooks
-*
-* @see https://vueuse.org/createEventHook
-*
-* @__NO_SIDE_EFFECTS__
-*/
-function createEventHook() {
- const fns = /* @__PURE__ */ new Set();
- const off = (fn) => {
- fns.delete(fn);
- };
- const clear = () => {
- fns.clear();
- };
- const on = (fn) => {
- fns.add(fn);
- const offFn = () => off(fn);
- tryOnScopeDispose(offFn);
- return { off: offFn };
- };
- const trigger = (...args) => {
- return Promise.all(Array.from(fns).map((fn) => fn(...args)));
- };
- return {
- on,
- off,
- trigger,
- clear
- };
-}
-/**
-* Keep states in the global scope to be reusable across Vue instances.
-*
-* @see https://vueuse.org/createGlobalState
-* @param stateFactory A factory function to create the state
-*
-* @__NO_SIDE_EFFECTS__
-*/
-function createGlobalState(stateFactory) {
- let initialized = false;
- let state;
- const scope = effectScope(true);
- return ((...args) => {
- if (!initialized) {
- state = scope.run(() => stateFactory(...args));
- initialized = true;
- }
- return state;
- });
-}
-var localProvidedStateMap = /* @__PURE__ */ new WeakMap();
-/**
-* On the basis of `inject`, it is allowed to directly call inject to obtain the value after call provide in the same component.
-*
-* @example
-* ```ts
-* injectLocal('MyInjectionKey', 1)
-* const injectedValue = injectLocal('MyInjectionKey') // injectedValue === 1
-* ```
-*
-* @__NO_SIDE_EFFECTS__
-*/
-var injectLocal = (...args) => {
- var _getCurrentInstance;
- const key = args[0];
- const instance = (_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy;
- const owner = instance !== null && instance !== void 0 ? instance : getCurrentScope();
- if (owner == null && !hasInjectionContext()) throw new Error("injectLocal must be called in setup");
- if (owner && localProvidedStateMap.has(owner) && key in localProvidedStateMap.get(owner)) return localProvidedStateMap.get(owner)[key];
- return inject(...args);
-};
-/**
-* On the basis of `provide`, it is allowed to directly call inject to obtain the value after call provide in the same component.
-*
-* @example
-* ```ts
-* provideLocal('MyInjectionKey', 1)
-* const injectedValue = injectLocal('MyInjectionKey') // injectedValue === 1
-* ```
-*/
-function provideLocal(key, value) {
- var _getCurrentInstance;
- const instance = (_getCurrentInstance = getCurrentInstance()) === null || _getCurrentInstance === void 0 ? void 0 : _getCurrentInstance.proxy;
- const owner = instance !== null && instance !== void 0 ? instance : getCurrentScope();
- if (owner == null) throw new Error("provideLocal must be called in setup");
- if (!localProvidedStateMap.has(owner)) localProvidedStateMap.set(owner, Object.create(null));
- const localProvidedState = localProvidedStateMap.get(owner);
- localProvidedState[key] = value;
- return provide(key, value);
-}
-function createInjectionState(composable, options) {
- const key = (options === null || options === void 0 ? void 0 : options.injectionKey) || Symbol(composable.name || "InjectionState");
- const defaultValue = options === null || options === void 0 ? void 0 : options.defaultValue;
- const useProvidingState = (...args) => {
- const state = composable(...args);
- provideLocal(key, state);
- return state;
- };
- const useInjectedState = () => injectLocal(key, defaultValue);
- return [useProvidingState, useInjectedState];
-}
-/**
-* Returns a `deepRef` or `shallowRef` depending on the `deep` param.
-*
-* @example createRef(1) // ShallowRef{{ theme }}
-
-### Page Data
-{{ page }}
-
-### Page Frontmatter
-{{ frontmatter }}
-```
-
-
-
-## Results
-
-### Theme Data
-{{ theme }}
-
-### Page Data
-{{ page }}
-
-### Page Frontmatter
-{{ frontmatter }}
-
-## More
-
-Check out the documentation for the [full list of runtime APIs](https://vitepress.dev/reference/runtime-api#usedata).
diff --git a/apps/docs/architecture/config.md b/apps/docs/architecture/config.md
new file mode 100644
index 0000000..ad48c3c
--- /dev/null
+++ b/apps/docs/architecture/config.md
@@ -0,0 +1,132 @@
+# 配置系统
+
+UltimateRAG 使用 **Pydantic Settings** 集中管理配置,所有配置从**环境变量或 `.env` 文件**读取。
+
+代码位置:`src/ultimate_rag/config.py`
+
+## 1. 设计要点
+
+- **类型安全**:所有配置都有 Python 类型和默认值,错误配置在启动时就能被发现
+- **进程级只读**:`get_settings()` 使用 `@lru_cache`,整个进程只解析一次环境变量
+- **统一装配**:API 和 Worker 从同一个 `Settings` 装配依赖,保证两套进程配置一致
+- **敏感值不落库**:API Key 只从 `.env` 注入,`.env.example` 只含占位值
+
+```python
+from ultimate_rag.config import get_settings
+
+settings = get_settings() # 进程内单例,只解析一次
+```
+
+## 2. 配置分组
+
+配置按用途分为几组,下面按组列出(默认值面向本地 Docker Compose 环境):
+
+### 基础
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `APP_NAME` | `UltimateRAG` | 应用名 |
+| `ENVIRONMENT` | `development` | 运行环境 |
+| `LOG_LEVEL` | `INFO` | 日志级别 |
+| `CORS_ORIGINS` | `["http://localhost:3000", ...]` | 跨域白名单 |
+
+### 数据库与存储
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `DATABASE_URL` | `postgresql+asyncpg://...localhost:5432/ultimate_rag` | PostgreSQL 连接串 |
+| `MINIO_ENDPOINT` | `localhost:9000` | MinIO 地址 |
+| `MINIO_ACCESS_KEY` / `MINIO_SECRET_KEY` | 本地开发账号 | MinIO 凭据(生产必须更换) |
+| `MINIO_BUCKET` | `documents` | 原始文件桶 |
+| `MILVUS_URI` | `http://localhost:19530` | Milvus 地址 |
+| `MILVUS_COLLECTION` | `knowledge_chunks` | 向量 Collection |
+
+### 模型(阿里云百炼)
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `DASHSCOPE_BASE_URL` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | 百炼 OpenAI 兼容端点 |
+| `DASHSCOPE_API_KEY` | **必填** | API Key,只从 `.env` 提供 |
+| `EMBEDDING_MODEL` | `text-embedding-v4` | Embedding 模型 |
+| `EMBEDDING_DIMENSION` | `1024` | 向量维度(必须与 Milvus 一致) |
+| `EMBEDDING_BATCH_SIZE` | `10` | 每批向量化数量 |
+| `LLM_MODEL` | `qwen-plus` | 问答模型 |
+| `OCR_MODEL` | `qwen3.5-ocr` | OCR 模型 |
+| `VISION_MODEL` | `qwen3-vl-flash` | 图片语义理解模型 |
+| `OCR_MAX_IMAGE_BYTES` | `6MB` | OCR 单图上限(百炼 Base64 限制约 7MB) |
+| `VISION_MAX_IMAGE_BYTES` | `6MB` | 视觉单图上限 |
+| `OCR_MAX_OUTPUT_TOKENS` | `4096` | OCR 有界输出,防止伪表格无限膨胀 |
+| `VISION_MAX_OUTPUT_TOKENS` | `1536` | 视觉语义描述输出上限 |
+| `MODEL_TIMEOUT_SECONDS` | `60` | 模型请求超时 |
+
+### 切块与检索
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `MAX_UPLOAD_BYTES` | `10MB` | 上传文件上限 |
+| `CHUNK_MAX_TOKENS` | `512` | Chunk Token 预算(64–8192) |
+| `CHUNK_OVERLAP_TOKENS` | `64` | Chunk 重叠 Token |
+| `CHUNK_TOKENIZER` | `cl100k_base` | 本地 Token 预算近似器 |
+| `RETRIEVAL_TOP_K` | `5` | 默认召回数 |
+| `CONTEXT_MAX_CHARS` | `12000` | LLM 上下文最大字符数 |
+
+### Worker 任务
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `INGESTION_JOB_MAX_ATTEMPTS` | `3` | 最大尝试次数(1–10) |
+| `WORKER_POLL_INTERVAL_SECONDS` | `1.0` | 空队列轮询间隔 |
+| `WORKER_LEASE_SECONDS` | `900` | 任务租约时长 |
+| `WORKER_HEARTBEAT_SECONDS` | `30` | 心跳续租间隔 |
+| `WORKER_RETRY_DELAY_SECONDS` | `10` | 重试基础延迟 |
+
+### PDF 解析
+
+| 环境变量 | 默认值 | 说明 |
+|---|---|---|
+| `PDF_NATIVE_TEXT_THRESHOLD` | `20` | 扫描候选页原生文字阈值 |
+| `PDF_SCAN_IMAGE_COVERAGE_THRESHOLD` | `0.65` | 扫描候选页最大栅格图覆盖率阈值 |
+| `PDF_SCAN_VISION_TEXT_THRESHOLD` | `300` | OCR 低于该字符数时补视觉理解,0 为关闭 |
+| `PDF_RENDER_SCALE` | `2.0` | 扫描页渲染缩放 |
+| `PDF_VISION_CONCURRENCY` | `2` | 图片理解并发 |
+| `PDF_MAX_PICTURES` | `20` | 单 PDF 最大附图数 |
+| `PDF_MIN_PICTURE_PIXELS` | `10000` | 附图最小像素 |
+| `DOCLING_DEVICE` | `cpu` | Docling 推理设备 |
+| `DOCLING_NUM_THREADS` | `4` | Docling 线程数 |
+| `DOCLING_TIMEOUT_SECONDS` | `600` | Docling 超时 |
+
+## 3. 校验规则
+
+配置里有两个跨字段校验(`validate_cross_field_limits`):
+
+- `chunk_overlap_tokens` 必须小于 `chunk_max_tokens`
+- `worker_heartbeat_seconds` 必须小于 `worker_lease_seconds`
+
+违反会在启动时报错,而不是在运行时才暴露。
+
+## 4. 完整配置示例
+
+参考仓库根目录 `.env.example`:
+
+```dotenv
+# 必填:百炼地址与密钥
+DASHSCOPE_BASE_URL=https://你的百炼工作空间地址/compatible-mode/v1
+DASHSCOPE_API_KEY=你的API-Key
+
+# 可选覆盖(省略时用默认值)
+EMBEDDING_MODEL=text-embedding-v4
+LLM_MODEL=qwen-plus
+OCR_MODEL=qwen3.5-ocr
+VISION_MODEL=qwen3-vl-flash
+
+# 前端
+NEXT_PUBLIC_API_URL=
+```
+
+::: warning 安全提醒
+`.env`、真实 API Key、生产凭据**禁止提交到 Git**。`.env.example` 只能包含安全占位值。
+:::
+
+## 下一步
+
+- 想知道这些配置怎么被装配成真实对象 → [模块总览](/modules/index) 或 [整体架构与分层](/architecture/overview)
diff --git a/apps/docs/architecture/data-model.md b/apps/docs/architecture/data-model.md
new file mode 100644
index 0000000..9d35107
--- /dev/null
+++ b/apps/docs/architecture/data-model.md
@@ -0,0 +1,198 @@
+# 核心领域模型
+
+这一页介绍 `domain/models.py` 里定义的核心领域对象。**这些 dataclass 是整个系统传递业务语义的「货币」**,它们在应用层、适配器、API 之间流动,且不绑定任何框架。
+
+代码位置:`src/ultimate_rag/domain/models.py`
+
+## 1. 领域模型全家福
+
+```text
+KnowledgeBase(知识库)
+ └── Document(文档)
+ ├── 状态:DocumentStatus
+ ├── 原文件:MinIO ObjectKey
+ └── 后台任务:IngestionJob
+ ├── Chunk[](文本片段,存 PostgreSQL)
+ │ └── 每个 Chunk 带 SourceLocator(来源定位)
+ └── Milvus 向量(派生)
+```
+
+## 2. 状态枚举
+
+### DocumentStatus(文档状态,面向用户)
+
+```text
+PENDING → PARSING → CHUNKING → EMBEDDING → INDEXING → READY
+ 任一环节失败 → FAILED
+```
+
+`README` 之前所有状态都代表「尚未完成处理」,绝不能被检索。
+
+### IngestionJobStatus(任务状态,面向调度)
+
+```text
+PENDING → RUNNING → SUCCEEDED / FAILED
+```
+
+::: tip 为什么有两种状态
+文档状态表达「处理到哪一步」,面向用户展示;
+任务状态表达「Worker 的领取/重试/完成语义」,面向调度。
+二者刻意分开,避免把队列实现细节暴露到 API。
+:::
+
+### BlockType(语义块类型)
+
+```text
+HEADING(标题) / TEXT(正文) / CODE(代码)
+LIST(列表) / QUOTE(引用) / TABLE(表格) / IMAGE(图片)
+```
+
+## 3. 核心对象逐个说明
+
+### KnowledgeBase —— 知识库
+
+文档和检索范围的**顶层容器**。字段:`id`、`name`、`description`、`created_at`、`updated_at`。
+
+### Document —— 文档元数据
+
+描述一份上传的原始文档及其处理状态:
+
+| 字段 | 含义 |
+|---|---|
+| `id` | 系统生成的 UUID |
+| `knowledge_base_id` | 所属知识库 |
+| `filename` | 展示用文件名(已净化 basename) |
+| `mime_type` / `extension` | 客户端声明,用于 Parser 路由 |
+| `object_key` | MinIO 对象键(系统生成) |
+| `sha256` | 内容指纹 |
+| `status` | 当前处理状态 |
+| `parser_name` / `parser_version` | 实际使用的解析器 |
+| `error_message` | 失败原因(可操作) |
+
+### SourceLocator —— 来源定位器(★ 关键设计)
+
+记录「一段内容来自原始文件的哪里」。字段全部可选,因为不同格式定位精度不同:
+
+| 字段 | 使用场景 |
+|---|---|
+| `heading_path` | Markdown / Word / PPT / HTML / PDF:章节路径 |
+| `page` | PDF:页码 |
+| `bbox` | PDF:坐标框(左上角原点) |
+| `sheet` / `cell_range` | Excel:工作表 + 单元格区域 |
+| `slide` | PPT:幻灯片序号 |
+
+它贯穿整个链路,最终形成 Citation:
+
+```text
+Block → Chunk → PostgreSQL/Milvus → RetrievalResult → Citation → 前端展示
+```
+
+### Block —— 解析后的最小语义块
+
+Parser 的输出单元:`id`(稳定 UUID5)、`type`(BlockType)、`content`、`locator`、`metadata`。
+
+### ParsedDocument —— 统一解析结果
+
+`document_id + blocks[] + metadata`。**这是所有 Parser 的统一出口**,下游不再感知原始格式。
+
+### Chunk —— 可检索文本单元
+
+真正被向量化、检索、引用的单元:
+
+| 字段 | 含义 |
+|---|---|
+| `id` | 稳定 ID(由文档ID+序号+内容生成,幂等) |
+| `knowledge_base_id` / `document_id` | 归属 |
+| `index` | 在文档中的顺序 |
+| `content` | 文本内容(含标题前缀) |
+| `heading_path` | 章节路径(用于检索展示与 Citation) |
+| `token_count` | Token 数(与实际切分同一 Tokenizer) |
+| `locator` | 来源定位 |
+| `metadata` | 切块策略、来源标签、文件名等 |
+
+### EmbeddedChunk —— Chunk + 向量
+
+`chunk + embedding`。写入 Milvus 前的组合。
+
+### RetrievalResult —— 检索命中
+
+召回结果:`chunk_id / knowledge_base_id / document_id / filename / content / heading_path / score / locator`。
+
+保留完整来源信息,**检索结果可以直接构造 Citation,无需再查库**(避免 N+1)。
+
+### Citation —— 面向 API 的引用
+
+`document_id / filename / chunk_id / heading_path / locator`。不暴露向量库内部字段。
+
+### IngestionJob —— 后台任务快照
+
+Worker 处理的任务:`id / document_id / status / attempts / max_attempts / available_at / locked_at / worker_id / error_message`。
+
+## 4. 数据在哪些层如何变化
+
+```text
+原始文件字节
+ ↓ Parser
+ParsedDocument + Block[] (Domain 模型)
+ ↓ Chunker
+Chunk[] (Domain 模型)
+ ↓ Embedder
+EmbeddedChunk[] (Domain 模型)
+ ↓ Milvus
+检索 → RetrievalResult[] (Domain 模型)
+ ↓ ContextBuilder
+上下文文本 (普通字符串)
+ ↓ LLM
+答案 + Citation[] (Domain 模型)
+```
+
+> 注意到没有?从 ParsedDocument 到 RetrievalResult,全程都是**不可变 dataclass**(`frozen=True`)。这保证了数据在跨层传递时的安全性,也让测试非常方便。
+
+## 5. 端口(Protocol)—— 可替换能力的契约
+
+`domain/ports.py` 定义了 8 个端口,它们是「可替换性」的根基。下面是最核心的几个:
+
+```python
+class DocumentParser(Protocol):
+ name: str
+ version: str
+ def supports(self, source: DocumentSource) -> bool: ...
+ async def parse(self, source: DocumentSource) -> ParsedDocument: ...
+
+class Embedder(Protocol):
+ async def embed_documents(self, texts: Sequence[str]) -> list[list[float]]: ...
+ async def embed_query(self, query: str) -> list[float]: ...
+
+class VectorStore(Protocol):
+ async def ensure_collection(self) -> None: ...
+ async def upsert(self, chunks: Sequence[EmbeddedChunk]) -> None: ...
+ async def search(self, query_vector, knowledge_base_id, top_k) -> list[RetrievalResult]: ...
+ async def delete_by_document(self, document_id: str) -> None: ...
+ async def delete_by_knowledge_base(self, knowledge_base_id: str) -> None: ...
+
+class LLMClient(Protocol):
+ async def generate(self, system_prompt: str, user_prompt: str) -> str: ...
+ def stream(self, system_prompt: str, user_prompt: str) -> AsyncIterator[str]: ...
+```
+
+### DocumentSource —— Parser 的输入
+
+交给 Parser 的「原始文档快照」:`document_id / filename / mime_type / content`。不包含任何基础设施句柄。
+
+## 6. 业务异常
+
+`domain/exceptions.py` 定义了可预期的业务异常,接口层依据它们生成稳定的 HTTP 状态码:
+
+| 异常 | HTTP | 场景 |
+|---|---|---|
+| `ResourceNotFoundError` | 404 | 知识库/文档不存在 |
+| `InvalidDocumentError` | 400 | 上传文件不合法 |
+| `UnsupportedDocumentTypeError` | 400 | 没有可用的 Parser |
+| `DocumentBusyError` | 409 | 文档正在后台处理,暂不能删除 |
+| `DocumentProcessingError` | 502 | 解析/切块/向量化/索引失败 |
+| `ExternalServiceError` | 502 | 外部服务故障 |
+
+## 下一步
+
+- 想理解三大存储各自保存什么 → [三大存储职责](/architecture/data-stores)
+- 想深入某个模块的实现 → [模块总览](/modules/index)
diff --git a/apps/docs/architecture/data-stores.md b/apps/docs/architecture/data-stores.md
new file mode 100644
index 0000000..8cf910a
--- /dev/null
+++ b/apps/docs/architecture/data-stores.md
@@ -0,0 +1,136 @@
+# 三大存储职责
+
+这是 UltimateRAG 最重要、也最容易理解错的数据边界。**PostgreSQL、MinIO、Milvus 各自保存不同的东西,职责绝不混淆。**
+
+## 1. 一句话职责划分
+
+| 存储 | 保存什么 | 角色定位 |
+|---|---|---|
+| **PostgreSQL** | 业务**事实**数据 | 事实来源(Source of Truth) |
+| **MinIO** | **原始文件** | 对象存储 |
+| **Milvus** | **向量索引** | 派生索引(Derived Index) |
+
+```text
+事实数据 + 原文件
+ = 可以重建一切(包括向量索引)
+```
+
+> 核心推论:**理论上 MinIO + PostgreSQL 就可以重建 Milvus 索引**。Milvus 丢了,重新跑一遍摄取即可;业务状态绝不能只保存在 Milvus。
+
+## 2. PostgreSQL —— 业务事实
+
+保存**业务事实数据和元数据**:
+
+```text
+knowledge_bases 知识库
+documents 文档元数据 + 处理状态(PENDING/READY/FAILED)
+ingestion_jobs 后台任务(领取/重试/完成)
+chunks Chunk 事实(文本 + 元数据 + 来源定位)
+```
+
+**为什么 Chunk 文本也放 PostgreSQL?**
+
+因为 Chunk 是「业务事实」,而向量只是它的「派生索引」。当 Milvus 需要重建时,可以从 PostgreSQL 的 Chunk 重新向量化。同时,检索结果可以用 PostgreSQL 的 `READY` 状态做**二次过滤**,防止半成品向量进入答案。
+
+数据库 Schema 只通过 **Alembic Migration** 修改,应用启动不会自动建表。
+
+## 3. MinIO —— 原始文件
+
+保存**原始文件**(Markdown / PDF / DOCX / XLSX / PPTX / 图片…)。
+
+关键规则:
+
+- **对象键由系统生成**,不直接用用户文件名(防路径穿越、防覆盖)
+- 键格式:`{知识库ID}/{文档UUID}/source{扩展名}`
+- 先存原文件再建业务记录:即使处理失败,也能用原文件排查或重建
+- 用户文件名只用于展示和扩展名判断
+
+## 4. Milvus —— 派生向量索引
+
+只保存**可重建的向量索引和检索数据**,不保存业务状态。
+
+Collection:`knowledge_chunks`,核心字段:
+
+```text
+id 主键(Chunk 稳定 ID,幂等写入)
+knowledge_base_id 检索隔离边界
+document_id / chunk_id
+filename / content / heading_path 检索展示与 Citation
+embedding 1024 维 FloatVector(COSINE 距离)
+```
+
+索引策略:`AUTOINDEX` + `COSINE`,`Strong` 一致性(保证 READY 后立即可检索、删除后立即不可见)。
+
+## 5. 写路径与读路径
+
+### 写入时(Ingestion)
+
+```text
+MinIO 先存原文件
+ ↓
+PostgreSQL 建 Document + Job(同一事务)
+ ↓
+Worker 处理:
+ Parse → Chunk
+ ↓
+PostgreSQL 写 Chunk 事实(事务)
+ ↓
+Milvus 写向量(delete_by_document + upsert + flush)
+ ↓
+PostgreSQL 标记 READY(最后一步)
+```
+
+### 读取时(Query)
+
+```text
+用户提问 → 向量化
+ ↓
+Milvus 检索候选(限定知识库)
+ ↓
+PostgreSQL 二次过滤(只留 READY 文档)
+ ↓
+拼上下文 → LLM → 答案
+```
+
+## 6. 删除时的顺序(跨存储一致性)
+
+删除文档/知识库时,按「**派生 → 原文件 → 事实**」的顺序:
+
+```text
+1. 先删 Milvus 向量(派生索引)
+2. 再删 MinIO 原文件
+3. 最后删 PostgreSQL 事实
+```
+
+为什么最后删 PostgreSQL?因为前两步失败时,PostgreSQL 事实记录仍然存在,运维可以根据它知道**还要清理哪些外部资源**。这是「明确失败状态 + 补偿操作」思想的体现,V2 不做跨存储事务。
+
+## 7. 为什么不让 Milvus 当事实来源
+
+如果只把业务状态存在 Milvus,会面临:
+
+- Milvus 是**可替换组件**,换向量库 = 丢业务状态
+- Milvus 删除后物理行数可能短暂包含 Tombstone(等待 Compaction),不可靠
+- 检索之外的业务(状态查询、任务调度)需要关系型查询能力
+
+因此:**业务事实放 PostgreSQL,派生索引放 Milvus。**
+
+## 8. 一张图总结
+
+```text
+┌─────────────────────────────┐
+│ MinIO │
+│ 原始文件(不可变) │
+└───────────┬─────────────────┘
+ │ 上传时先保存
+ ▼
+┌─────────────────────────────┐ 重建
+│ PostgreSQL │ ──────────────────► ┌──────────────┐
+│ 事实:知识库/文档/Chunk/任务 │ │ Milvus │
+│ (业务状态 + 文本) │ ◄────────────────── │ 向量索引 │
+└─────────────────────────────┘ 重新向量化 └──────────────┘
+```
+
+## 下一步
+
+- 想知道数据库表长什么样 → [Infrastructure 基础设施](/modules/infrastructure)
+- 想知道检索怎么用 PostgreSQL 过滤 → [检索问答全流程](/workflows/query)
diff --git a/apps/docs/architecture/directory.md b/apps/docs/architecture/directory.md
new file mode 100644
index 0000000..b1968d4
--- /dev/null
+++ b/apps/docs/architecture/directory.md
@@ -0,0 +1,154 @@
+# 项目目录结构
+
+## 1. 顶层总览
+
+```text
+UltimateRAG/
+├── apps/ # 可独立运行的应用
+│ ├── api/ # FastAPI 接口应用(Interface 层)
+│ ├── web/ # Next.js 前端
+│ └── docs/ # VitePress 文档网站(就是本网站)
+├── src/ultimate_rag/ # RAG 核心库(Domain / Application / Infrastructure)
+├── alembic/ # 数据库迁移(唯一 Schema 变更入口)
+├── docs/ # 产品 / 架构 / ADR 文档(源文档)
+├── scripts/ # 可重复执行的发布验收脚本
+├── tests/ # 单元测试与固定文档
+├── data/ # 本地调试用样例文件
+├── pyproject.toml # Python 依赖与工具配置(uv)
+├── uv.lock # 锁文件
+├── docker-compose.yml # 一键启动全部服务
+├── Dockerfile.api # API 容器镜像
+├── .env.example # 配置模板(不含真实密钥)
+└── README.md
+```
+
+## 2. apps/ —— 三个应用
+
+```text
+apps/
+├── api/ # FastAPI 后端
+│ ├── app.py # FastAPI 应用 + Lifespan 依赖装配 + 全局异常映射
+│ ├── routes.py # HTTP 路由(薄,只做校验/映射)
+│ ├── schemas.py # Pydantic 请求/响应模型
+│ └── container.py # 进程级依赖容器
+│
+├── web/ # Next.js 前端
+│ ├── app/ # App Router 页面
+│ │ ├── chat/ # 问答聊天页
+│ │ └── knowledge-bases/ # 知识库列表 + 文档详情页
+│ ├── components/ # React 组件(rag-message、retrieval-evidence、ui/)
+│ └── lib/ # 前端 API 封装、类型定义
+│
+└── docs/ # VitePress 文档网站
+ ├── .vitepress/config.mts
+ ├── guide/ # RAG 入门 + 项目概览
+ ├── architecture/ # 架构与设计
+ ├── modules/ # 模块详解
+ ├── workflows/ # 核心流程
+ └── reference/ # API 参考
+```
+
+## 3. src/ultimate_rag/ —— RAG 核心库
+
+这是项目的核心,按职责组织:
+
+```text
+src/ultimate_rag/
+├── domain/ # ★ 领域层:不依赖任何框架
+│ ├── models.py # 领域模型(dataclass):Document/Block/Chunk/...
+│ ├── ports.py # 端口(Protocol):Parser/Embedder/VectorStore/...
+│ └── exceptions.py # 业务异常
+│
+├── application/ # ★ 应用层:显式业务工作流
+│ ├── services.py # 五大服务:Ingestion/Processing/Retrieval/RAG/Lifecycle
+│ └── context.py # ContextBuilder(拼上下文)
+│
+├── infrastructure/ # ★ 基础设施实现
+│ ├── database/ # SQLAlchemy 模型 + Repository
+│ │ ├── models.py # 表结构:knowledge_bases/documents/chunks/ingestion_jobs
+│ │ └── repository.py # 面向业务语义的数据访问
+│ └── storage/
+│ └── minio.py # MinIO 对象存储适配器
+│
+├── parsers/ # 解析器(格式 → 统一模型)
+│ ├── registry.py # ParserRegistry:按来源选择 Parser
+│ ├── _shared.py # 公共校验与工具
+│ ├── _model_output.py # OCR/Vision Markdown 与伪表格清理
+│ ├── markdown.py # MarkdownParser
+│ ├── pdf.py # PDFParser(Docling + PDFium + 百炼)
+│ ├── html.py # HtmlParser
+│ ├── office.py # WordParser / ExcelParser / PowerPointParser
+│ └── image.py # ImageOCRParser
+│
+├── chunkers/
+│ └── markdown.py # StructureAwareChunker(结构+Token+类型切块)
+│
+├── embeddings/
+│ └── bailian.py # BailianEmbedder(百炼 text-embedding-v4)
+│
+├── vectorstores/
+│ └── milvus.py # MilvusVectorStore
+│
+├── generation/
+│ └── bailian.py # BailianLLMClient(百炼 qwen-plus)
+│
+├── ocr/
+│ └── bailian.py # BailianOCRClient(百炼 qwen3.5-ocr)
+│
+├── vision/
+│ └── bailian.py # BailianVisionClient(百炼 qwen3-vl-flash)
+│
+├── config.py # Pydantic Settings 集中配置
+├── runtime.py # Composition Root:装配 API 与 Worker 共用的依赖
+└── worker.py # IngestionWorker:后台任务进程
+```
+
+## 4. 其它目录
+
+```text
+alembic/
+├── env.py
+└── versions/
+ ├── 0001_v1_schema.py # V1 基础表
+ └── 0002_v2_async_ingestion.py # V2 新增 ingestion_jobs 表 + 旧状态恢复
+
+docs/
+├── 1.product_description.md # 产品描述
+├── 2.technical_architecture.md # 技术架构
+├── 3.v1_implementation.md # V1 实现说明
+├── 4.v2_implementation.md # V2 实现说明
+└── adr/ADR-001-...md # 架构决策记录
+
+scripts/
+├── smoke_v1.py # V1 全栈验收脚本
+└── smoke_v2.py # V2 全格式验收脚本
+
+tests/
+├── unit/ # 单元测试
+└── fixtures/rag.md # 固定 Smoke Test 文档
+```
+
+## 5. 代码在哪个目录,该怎么找
+
+| 你想找什么 | 去哪里 |
+|---|---|
+| 「上传文档」的业务逻辑 | `application/services.py` → `IngestionService.submit` |
+| 「后台处理文档」的逻辑 | `application/services.py` → `DocumentProcessingService.process` |
+| 「解析 Markdown」 | `parsers/markdown.py` |
+| 「解析 PDF(含扫描页)」 | `parsers/pdf.py` |
+| 「切块策略」 | `chunkers/markdown.py` |
+| 「向量化」 | `embeddings/bailian.py` |
+| 「写/查向量库」 | `vectorstores/milvus.py` |
+| 「组装答案」 | `application/services.py` → `RAGService` |
+| 「拼 LLM 上下文」 | `application/context.py` → `ContextBuilder` |
+| 「数据库表结构」 | `infrastructure/database/models.py` |
+| 「数据库操作」 | `infrastructure/database/repository.py` |
+| 「Worker 领取任务」 | `worker.py` + `repository.claim_ingestion_job` |
+| 「HTTP 接口」 | `apps/api/routes.py` |
+| 「配置项」 | `src/ultimate_rag/config.py` |
+| 「依赖装配」 | `src/ultimate_rag/runtime.py` + `apps/api/app.py` |
+
+## 下一步
+
+- 想深入每个数据模型 → [核心领域模型](/architecture/data-model)
+- 想逐个模块理解 → [模块总览](/modules/index)
diff --git a/apps/docs/architecture/overview.md b/apps/docs/architecture/overview.md
new file mode 100644
index 0000000..c95fa5d
--- /dev/null
+++ b/apps/docs/architecture/overview.md
@@ -0,0 +1,154 @@
+# 整体架构与分层
+
+## 1. 一句话全景
+
+UltimateRAG 是一个 **Monorepo 前后端分离**的项目:
+
+```text
+浏览器(Next.js Web)
+ │ HTTP / SSE
+ ▼
+FastAPI(apps/api)
+ │ 调用应用服务
+ ▼
+RAG 核心库(src/ultimate_rag)
+ │ 通过「端口」调用外部能力
+ ▼
+PostgreSQL(事实) · MinIO(原始文件) · Milvus(向量索引) · 百炼模型(Embedding/LLM/OCR/Vision)
+```
+
+## 2. 分层架构
+
+核心库采用 **Interface → Application → Domain ← Infrastructure** 的四层依赖方向:
+
+```text
+Interface(接口层) apps/api:FastAPI 路由、请求/响应 Schema、依赖容器
+ ↓ 调用
+Application(应用层) application/services.py:显式业务工作流编排
+ ↓ 依赖
+Domain(领域层) domain/:领域模型(dataclass)+ 端口(Protocol)
+ ↑ 实现
+Infrastructure(基础设施) infrastructure/、parsers/、embeddings/、vectorstores/ 等外部适配器
+```
+
+::: tip 依赖方向是关键
+箭头代表依赖方向:**上层依赖下层,下层绝不反向依赖上层**。
+Domain 是最底层,谁都不依赖;Infrastructure 实现 Domain 定义的端口。
+:::
+
+### 2.1 各层职责
+
+| 层 | 目录 | 职责 | 典型内容 |
+|---|---|---|---|
+| **Interface** | `apps/api` | HTTP 边界:校验输入、映射响应、错误码 | `routes.py`、`schemas.py`、`container.py`、`app.py` |
+| **Application** | `src/ultimate_rag/application` | 业务工作流:把端口串成业务步骤 | `IngestionService`、`DocumentProcessingService`、`RetrievalService`、`RAGService` |
+| **Domain** | `src/ultimate_rag/domain` | 业务事实:模型 + 可替换能力的接口 | `models.py`(Document/Block/Chunk…)、`ports.py`(Protocol)、`exceptions.py` |
+| **Infrastructure** | `src/ultimate_rag/infrastructure` 等 | 外部能力的具体实现 | PostgreSQL Repository、MinIO、Milvus、百炼、各种 Parser |
+
+## 3. 两个进程,共用一套核心库
+
+V2 的关键设计是**把「上传」和「处理」拆到两个进程**,但二者共用同一个 Composition Root 装配:
+
+```text
+进程 1:FastAPI(apps/api)
+ ├── 处理上传:校验 → 存 MinIO → 建 Document+Job → 返回 202
+ └── 处理问答:检索 → 拼上下文 → LLM → 答案
+
+进程 2:Worker(src/ultimate_rag/worker.py)
+ └── 后台领取任务:解析 → 切块 → 向量化 → 索引 → READY
+```
+
+- 两个进程通过 `src/ultimate_rag/runtime.py` 的 `create_processing_runtime()` 装配**同一套** Parser、Chunker、存储、向量库。
+- 好处:API 校验「支持什么格式」,Worker 就「一定能解析什么格式」,两套进程不会配置不一致。
+
+```text
+runtime.py(Composition Root)
+ ├── Repository(PostgreSQL)
+ ├── MinioObjectStorage(MinIO)
+ ├── ParserRegistry(7 种 Parser)
+ ├── StructureAwareChunker
+ ├── BailianEmbedder
+ ├── MilvusVectorStore
+ └── 注入 → IngestionService / DocumentProcessingService
+```
+
+## 4. 核心架构图(含数据流向)
+
+```text
+┌───────────────────────────┐
+│ Next.js Web │
+└────────────┬──────────────┘
+ │ HTTP / SSE
+ ▼
+┌───────────────────────────────────────────────┐
+│ FastAPI (apps/api) │
+│ │
+│ POST /documents ────► IngestionService │
+│ │ 校验 + 存 MinIO │
+│ ▼ │
+│ PostgreSQL: Document + Job │
+│ 返回 202 / PENDING │
+│ │
+│ POST /chat ───────────► RAGService │
+│ ├─ RetrievalService │
+│ ├─ ContextBuilder │
+│ └─ LLMClient │
+│ └─ 答案 + Citation │
+└────────────┬──────────────────┬───────────────┘
+ │ │
+ ▼ ▼
+ PostgreSQL(事实) Milvus(向量)
+ ▲
+ │
+┌────────────┴──────────────┐
+│ IngestionWorker │
+│ (src/ultimate_rag/worker)│
+│ │
+│ 领取 Job → Process: │
+│ Parse → Chunk → Embed │
+│ → Index → READY │
+└────────────┬──────────────┘
+ │
+ ▼
+ MinIO(原始文件)
+```
+
+## 5. 核心可替换能力(端口)
+
+领域层定义了一系列 **Protocol(端口)**,由不同的基础设施实现。这是「可替换」的根基:
+
+| 端口 | 职责 | V2 实现 |
+|---|---|---|
+| `DocumentParser` | 解析原始文件为统一模型 | Markdown / Word / Excel / PPT / HTML / PDF / Image |
+| `Chunker` | 切块 | `StructureAwareChunker` |
+| `Embedder` | 文本 → 向量 | `BailianEmbedder` |
+| `VectorStore` | 向量写入与检索 | `MilvusVectorStore` |
+| `ObjectStorage` | 原始文件存储 | `MinioObjectStorage` |
+| `LLMClient` | 文本生成 | `BailianLLMClient` |
+| `OCRClient` | 图片 → 文字 | `BailianOCRClient` |
+| `VisionClient` | 图片 → 语义描述 | `BailianVisionClient` |
+
+> 想替换某个能力(例如换向量库),就实现对应的 Protocol,并在 `runtime.py` 里替换装配,其余代码不用改。
+
+## 6. 为什么不用 LangChain / LangGraph
+
+这是一个常被问到的问题,项目的答案是:
+
+- **LangChain**:可以作为 Tool / Adapter,但**不能作为领域核心**。项目拥有自己的领域模型(`Document`、`Block`、`Chunk`…),不直接复用 LangChain 的 `Document` 数据结构。核心检索/生成不依赖 LangChain 的 Retriever/VectorStore。
+- **LangGraph**:V2 的处理流程是**确定性顺序工作流**(Parse → Chunk → Embed → Index,Retrieve → Generate),用普通 Python Service 编排已经足够。只有当未来出现条件路由、循环、Agent 决策等真实复杂度时,才考虑引入。
+
+## 7. 关键设计原则速览
+
+- Domain 不依赖 FastAPI、SQLAlchemy、Milvus、百炼 SDK、LangChain
+- PostgreSQL 保存**业务事实**,Milvus 保存**可重建派生索引**
+- 文档仅在全部处理步骤成功后进入 `READY`
+- 上传的文件、LLM 输出都视为**不可信输入**
+- 每个抽象都必须证明自己的价值,避免过度设计
+
+各原则的展开见 [核心设计原则](/architecture/principles)。
+
+## 下一步
+
+- 想理解这些原则背后的取舍 → [核心设计原则](/architecture/principles)
+- 想对照目录理解 → [项目目录结构](/architecture/directory)
+- 想深入数据模型 → [核心领域模型](/architecture/data-model)
diff --git a/apps/docs/architecture/principles.md b/apps/docs/architecture/principles.md
new file mode 100644
index 0000000..0333faa
--- /dev/null
+++ b/apps/docs/architecture/principles.md
@@ -0,0 +1,170 @@
+# 核心设计原则
+
+这一页汇总 UltimateRAG 反复强调的设计原则。**理解这些原则,比记住某个具体类更重要**——它们解释了代码里每一个「为什么这么写」。
+
+## 1. 简单优先,拒绝炫技
+
+项目最核心的价值观:
+
+> **简单优于复杂,明确优于隐式,可维护优于炫技,解决当前问题优于预测未来。**
+
+- 能用普通 `if` 就不用设计模式
+- 能用普通 Python Service 编排流程,就不引入 LangGraph / Event Bus / DI 框架
+- 不为了「代码看起来高级」而引入复杂抽象
+
+```python
+# 好的写法:直接、可读
+if document.status == DocumentStatus.READY:
+ return document
+
+# 坏的写法:为缩短代码而写晦涩表达式
+# return next((d for d in [document] if d.status == DocumentStatus.READY), None)
+```
+
+## 2. 每个抽象必须证明自己的价值
+
+新增 `Interface / Adapter / Factory / Manager / Service / Repository` 之前,先问:
+
+> 它到底解决了什么实际问题?
+
+合理的抽象:
+
+- `DocumentParser`——因为格式确实有多种(Markdown/PDF/Office…)
+- `Embedder`、`VectorStore`、`LLMClient`——因为这些能力明确存在多实现
+
+不合理的抽象:只为了「分层完整」套一层没有逻辑的 Wrapper。
+
+## 3. 领域层保持独立(不绑定框架)
+
+**核心领域模型必须是项目自有的,不能绑定任何框架。**
+
+```text
+❌ from langchain_core.documents import Document ← 作为核心数据结构
+✅ 自己的 Document / ParsedDocument / Block / Chunk / RetrievalResult
+```
+
+如果需要 LangChain,方向是:
+
+```text
+UltimateRAG 领域模型 → LangChain Adapter → LangChain
+```
+
+而不是把项目变成 LangChain 的数据模型。
+
+## 4. 数据职责必须清晰
+
+**三类存储各司其职,这是整个项目最重要的数据边界:**
+
+| 存储 | 保存什么 | 角色 |
+|---|---|---|
+| **PostgreSQL** | 业务事实:知识库、文档、状态、Chunk 元数据 | 事实来源(Source of Truth) |
+| **MinIO** | 原始文件(PDF/Markdown/Office/图片…) | 对象存储 |
+| **Milvus** | 向量索引 | **派生索引**(可重建) |
+
+推论:理论上 `MinIO + PostgreSQL` 可以重建 Milvus 索引;业务状态绝不能只存在 Milvus。
+
+## 5. 统一文档模型(RAG Core 不感知格式)
+
+RAG 核心不应该关心原始格式。所有格式都先转成统一模型:
+
+```text
+任何格式 → DocumentParser → ParsedDocument → Block[]
+```
+
+后续 Chunk / Embedding / Index / Retrieval 只依赖统一模型。
+
+禁止在业务代码里到处写:
+
+```python
+if extension == ".pdf":
+ ...
+elif extension == ".docx":
+ ...
+```
+
+而应该:
+
+```python
+parser = parser_registry.resolve(source)
+parsed_document = await parser.parse(source)
+```
+
+## 6. 状态一致性:未完成的文档绝不可用
+
+文档只有 **Parse → Chunk → Embed → Index 全部成功**后,才进入 `READY`:
+
+```text
+PENDING → PARSING → CHUNKING → EMBEDDING → INDEXING → READY
+ 任一环节失败 → FAILED
+```
+
+- 失败时保留**可理解的状态**和原文件,便于排查与重建
+- 不做复杂分布式事务,而是「明确失败状态 + 补偿操作」
+
+## 7. 幂等性
+
+可能被重试的操作都要尽量幂等:
+
+- 稳定 ID(Chunk ID 由内容生成,重试结果一致)
+- 向量 Upsert 按稳定 ID 覆盖,不产生重复
+- 删除文档按 document_id 幂等
+
+## 8. 外部服务默认不可靠
+
+PostgreSQL、MinIO、Milvus、Embedding、LLM、OCR 都可能失败。处理原则:
+
+- 设置超时
+- 有限重试(只重试「很可能是临时故障」的问题,如网络超时)
+- 禁止无限重试
+- 失败留下可追踪状态
+
+```text
+✅ 重试:Network Timeout、Temporary Service Unavailable
+❌ 不重试:参数错误、文件损坏、不支持格式
+```
+
+## 9. 安全边界
+
+- 所有上传文件视为**不可信**:校验扩展名、大小、MIME、文件名;不执行上传内容
+- 原始文件用**系统生成的 Object Key**保存,不用用户文件名拼路径(防路径穿越)
+- 知识库文档内容和 LLM 输出都视为**不可信输入**:文档中的文字不能覆盖系统 Prompt
+- 不提交 API Key / Secret;`.env.example` 只放占位值
+
+## 10. 性能:先正确,后优化
+
+优先级:
+
+```text
+正确性 > 清晰度 > 可维护性 > 健壮性 > 可测试性 > 性能
+```
+
+但避免明显问题:
+
+- 不产生 N+1 查询(检索命中后直接带文件名,不再逐条查库)
+- 不做「每个 Chunk 单独发一次 Embedding 请求」(按 Batch 批量)
+- 不在每次请求时重新加载模型(复用客户端)
+- 大文件不无脑全部读入内存(有界读取、流式处理)
+
+## 11. 版本纪律
+
+开发时必须遵守当前版本范围,**不要因为未来可能需要就提前实现未来功能**。
+
+例如 V2 已经实现了异步 Worker(因为产品明确要求上传立即返回),但**不**引入:
+
+```text
+Kafka / 分布式调度器 / ACL / Reranker / LangGraph
+```
+
+因为这些没有当前真实需求。
+
+## 12. 每一个重要行为都应该可测试
+
+- 重要模块必须有单元测试
+- 测试验证**行为**,而不是为了覆盖率
+- Retrieval 必须能不依赖 LLM 单独测试
+
+## 小结
+
+如果只记一句话,记住这句:
+
+> **使用能够正确解决当前问题的最简单架构,同时保留项目已经明确需要的长期扩展能力。**
diff --git a/apps/docs/guide/project-overview.md b/apps/docs/guide/project-overview.md
new file mode 100644
index 0000000..b2be60b
--- /dev/null
+++ b/apps/docs/guide/project-overview.md
@@ -0,0 +1,115 @@
+# 项目定位与版本演进
+
+## 1. 项目是什么
+
+**UltimateRAG** 是一个「从最小可用 RAG 持续演进为企业级知识平台」的**学习型工程**,同时追求企业级可落地。
+
+它有两个身份:
+
+- **教学 / 面试项目**:帮助你系统学习 RAG 原理和企业工程实践,代码注释承担「教材」职责
+- **企业级平台**:架构分层清晰、数据边界明确、可替换能力强,可以作为真实系统的参考架构
+
+### 项目的长期技术目标
+
+```text
+Parser 可插拔 → 新增文档格式不影响主流程
+Chunk 策略可替换
+Embedding 可替换
+向量数据库可替换
+Retriever 可组合
+Reranker 可插拔
+LLM 可替换
+Workflow 可演进
+```
+
+这些目标不是「现在就全实现」,而是**架构边界合理、未来能平滑接入**。
+
+## 2. 版本演进路线
+
+项目按大版本逐步演进,每个版本必须独立可运行、可演示:
+
+```text
+V1.0 Naive RAG 基础 RAG 闭环:上传 → 解析 → 切块 → 向量化 → 检索 → 生成
+V2.0 Document Intelligence 文档智能:多格式解析、异步可靠摄取、来源定位
+V3.0 Advanced Retrieval 高级检索:Hybrid、Reranker、Query Rewrite
+V4.0 Enterprise RAG 企业化:ACL、审计、任务平台、大规模调度
+V5.0 RAGOps 评估与运营:Golden Dataset、指标、回归报告
+V6.0 Intelligent RAG 智能 RAG:Agent、Tool Calling、工作流
+```
+
+::: warning 版本纪律
+开发时必须遵守当前版本的范围,**不要因为未来可能需要某项能力,就提前实现未来版本的功能**。
+例如 V1 不应提前引入 Kafka、Kubernetes、GraphRAG 等。
+:::
+
+## 3. 当前版本:V2.0 Document Intelligence
+
+仓库当前实现 **V2.0**。它在 V1 可运行的 RAG 闭环之上,重点解决两个问题:
+
+1. **多格式统一**:把 Markdown / PDF / DOCX / XLSX / PPTX / HTML / 图片统一为可追溯的文档领域模型
+2. **异步可靠摄取**:上传立即返回,由独立 Worker 后台处理,进程重启不丢任务
+
+### V2 能做什么(用户视角)
+
+1. 创建知识库
+2. 上传 Markdown、PDF、DOCX、XLSX、PPTX、HTML 或常见图片
+3. 上传在「文件与任务可靠落库」后立即返回(HTTP 202),由独立 Worker 后台处理
+4. 文字型 PDF 用本地 Docling 恢复分栏、表格、图片和 BBox;扫描页及独立图片融合百炼 OCR/Vision
+5. 前端自动刷新文档从 `PENDING` 到 `READY/FAILED` 的状态和实际使用的 Parser
+6. 用 Milvus Dense Retrieval 独立调试召回内容和分数(不依赖 LLM)
+7. 用阿里云百炼模型进行知识库问答
+8. 查看答案引用的章节、PDF 页码/BBox、Excel 区域或 PPT 幻灯片
+9. 删除文档或知识库,并同步清理三类存储(Milvus 向量、MinIO 原文件、PostgreSQL 事实)
+
+### V2 明确不包含(属于后续版本)
+
+```text
+混合检索 / Reranker / Query Rewrite → V3
+ACL / 审计 / DLQ 控制台 / 认证 → V4
+评估体系 / RAGOps → V5
+Agent / Tool Calling / LangGraph → V6
+```
+
+## 4. 技术栈速览
+
+| 层 | 技术 |
+|---|---|
+| 前端 | Next.js 16、React 19、TypeScript、Tailwind CSS 4、shadcn/ui、AI SDK |
+| 接口 | FastAPI、Pydantic v2 |
+| 核心库 | Python 3.12、SQLAlchemy 2(async)、Alembic、tiktoken |
+| 文档解析 | Docling(PDF 版面/表格)、PDFium、python-docx、openpyxl、python-pptx、BeautifulSoup、markdown-it-py、Pillow |
+| 数据存储 | PostgreSQL 16(事实)、MinIO(原始文件)、Milvus 2.5(向量索引)、Attu(调试) |
+| 模型(阿里云百炼) | Embedding `text-embedding-v4`(1024维) / LLM `qwen-plus` / OCR `qwen3.5-ocr` / 视觉 `qwen3-vl-flash` |
+| 工程 | uv、pytest、Ruff、Mypy、Docker Compose |
+
+## 5. 架构一句话总结
+
+```text
+Next.js Web → FastAPI Interface → Application Service
+ ├── 入库:提交任务 → MinIO + PostgreSQL → Worker 后台解析/切块/向量化/索引
+ └── 问答:检索 → 拼上下文 → LLM → 答案 + 引用
+
+PostgreSQL(事实) + MinIO(原文件) ← 可重建来源
+Milvus(派生索引) ← 可重建产物
+```
+
+## 6. 快速上手
+
+```bash
+# 1. 在仓库根目录准备 .env(参考 .env.example,填入百炼 API Key)
+# 2. 一键启动全部服务
+docker compose up -d --build
+
+# 3. 打开服务
+# Web: http://localhost:3000
+# API 文档: http://localhost:8000/docs
+# MinIO: http://localhost:9001
+# Attu: http://localhost:8001
+```
+
+详细的启动说明见仓库根目录 `README.md`。
+
+## 下一步
+
+- 想知道 V2 具体支持哪些格式、有什么限制 → [V2 能力与限制](/guide/v2-capabilities)
+- 想从架构分层看起 → [整体架构与分层](/architecture/overview)
diff --git a/apps/docs/guide/rag-pipeline.md b/apps/docs/guide/rag-pipeline.md
new file mode 100644
index 0000000..ca2868d
--- /dev/null
+++ b/apps/docs/guide/rag-pipeline.md
@@ -0,0 +1,129 @@
+# RAG 的核心环节
+
+这一页把 RAG 的两条链路展开,逐环节讲清楚「在做什么、为什么这么做、容易在哪里出错」。
+读完这一页,你会对后面所有模块代码建立直觉。
+
+---
+
+## 一、入库链路(Ingestion)
+
+入库链路负责把**不可信的原始文件**变成**可信、可追溯、可检索的索引**。
+
+### 1. 上传与校验
+
+- 用户在界面上传文件(Markdown / PDF / Word / Excel / PPT / HTML / 图片)。
+- 系统先做**输入安全校验**:文件大小、扩展名、MIME 类型、内容是否为空。
+- 关键点:上传文件是**不可信输入**,文件名不能用来拼路径(防路径穿越),扩展名不能当作内容真相(后面 Parser 会再校验真实结构)。
+
+### 2. 保存原始文件
+
+- 原始文件存入 **MinIO**(对象存储),对象键由系统生成(如 `知识库ID/文档UUID/source.pdf`),不用用户文件名。
+- 先保存原文件再建记录:即使后续处理失败,也能用原文件排查或重建索引。
+
+### 3. 解析(Parsing)
+
+这是 V2 的核心能力。把各种格式统一成**一种**内部模型:
+
+```text
+Markdown / PDF / DOCX / XLSX / PPTX / HTML / 图片
+ ↓ Parser(翻译官)
+ ParsedDocument(统一文档模型)
+ ↓
+ Block[](标题 / 正文 / 表格 / 代码 / 图片…)
+```
+
+每个 Block 还带一个 **SourceLocator(来源定位器)**,记录「这段内容来自哪里」:
+
+- Markdown → 标题路径(如 `["RAG", "Embedding"]`)
+- PDF → 页码 + 坐标框(BBox)
+- Excel → 工作表 + 单元格区域
+- PPT → 幻灯片序号
+
+> 这一层是关键设计:**RAG 主流程永远不判断文件后缀**,只认统一的 `ParsedDocument`。新增一种文件格式,只需要新增一个 Parser,主流程不动。
+
+### 4. 切块(Chunking)
+
+解析完的文档可能很长,不能整篇送去向量化,所以要**切成小片段(Chunk)**。
+
+切块策略直接决定检索质量,要点是:
+
+- 按**结构边界**切(标题、表格、代码块),而不是机械地按字符数切
+- 每个 Chunk 保留**来源信息**(标题路径、页码),方便日后引用
+- 控制 Chunk 大小(本项目默认 **512 tokens**),并留少量重叠(overlap,默认 64)避免切断语义
+- 表格重复表头、代码保持围栏、正文优先按段落/句子切
+
+### 5. 向量化(Embedding)
+
+把文本 Chunk 变成**向量**(如 1024 维浮点数组)。向量化的意义是:**语义相近的文本,向量距离也近**。
+
+关键要求:**文档向量化与问题向量化必须用同一个模型**,否则两者的向量不在同一个语义空间,检索没有意义。
+
+### 6. 索引(Indexing)
+
+把「文本 + 向量 + 来源信息」写入向量数据库(本项目用 **Milvus**),并保持「主键稳定、可重复写入」,保证重试不会产生重复数据。
+
+---
+
+## 二、问答链路(Query)
+
+### 1. 问题向量化
+
+用**同一个 Embedding 模型**把用户问题转成向量。
+
+### 2. 检索(Retrieval)
+
+在向量库里找出与问题向量最相似的 K 个 Chunk,同时**限定知识库范围**(不能跨库召回)。
+
+### 3. 构建上下文(Context Building)
+
+把召回的 Chunk 按相似度排序,每个标上 `[来源 1] [来源 2]…`,在**字符预算内**拼成一段知识上下文。
+
+> 上下文预算(本项目默认 12000 字符)决定 LLM 每次最多「看」多少证据。超出的低排名 Chunk 会被丢弃。
+
+### 4. 生成(Generation)
+
+把「知识上下文 + 用户问题」一起发给 LLM,要求它**只依据上下文回答**,不能编造,并输出时标注 `[来源 N]`。
+
+### 5. 引用(Citation)
+
+系统在**返回答案的同时**返回结构化引用(文档名、章节、页码),让用户能回到原文验证。
+
+---
+
+## 三、两条链路如何衔接
+
+```text
+ 入库链路(做一次)
+上传 → 校验 → 存MinIO → 解析 → 切块 → 向量化 → 索引
+ │
+ ▼
+ PostgreSQL(事实) + Milvus(向量)
+ ▲
+ 问答链路(做多次) │
+用户提问 → 向量化 → 检索 ←────────────────────────────┘
+ → 拼上下文 → LLM → 答案 + 引用
+```
+
+**核心要点:入库产生「事实数据 + 派生索引」,问答只消费它们。**
+
+- PostgreSQL 保存**事实**(文档状态、Chunk 文本与元数据)
+- MinIO 保存**原始文件**
+- Milvus 保存**可重建的派生索引**(丢了可以用事实数据重新生成)
+
+---
+
+## 四、两条容易出错的地方
+
+| 易错点 | 正确做法 |
+|---|---|
+| 用字符数切块,导致语义被切断 | 用 Token 预算 + 结构边界 |
+| 文档向量和问题向量用了不同模型 | 全程共用同一个 Embedder |
+| 把「未处理完的文档」放进检索结果 | 只有状态 `READY` 的文档才参与检索 |
+| 把外部服务当作永不出错 | 设计超时、有界重试、失败状态 |
+
+这些原则正是 UltimateRAG 代码里反复出现的注释主题。
+
+## 下一步
+
+- 看这个项目怎么落地这些环节 → [项目定位与版本演进](/guide/project-overview)
+- 看整体分层 → [整体架构与分层](/architecture/overview)
diff --git a/apps/docs/guide/v2-capabilities.md b/apps/docs/guide/v2-capabilities.md
new file mode 100644
index 0000000..dfe1fd4
--- /dev/null
+++ b/apps/docs/guide/v2-capabilities.md
@@ -0,0 +1,135 @@
+# V2 能力与限制
+
+这一页回答两个问题:**V2 支持什么**、**V2 不支持什么**。理解边界,才不会对项目产生错误预期。
+
+## 1. 支持的文档格式
+
+| 类型 | 扩展名 | 使用的 Parser | 主要来源定位 |
+|---|---|---|---|
+| Markdown | `.md`、`.markdown` | `MarkdownParser` | 标题路径 |
+| PDF | `.pdf` | `PDFParser`(Docling + PDFium + 百炼) | 标题路径、页码、BBox |
+| Word | `.docx` | `WordParser` | 标题路径 |
+| Excel | `.xlsx` | `ExcelParser` | 工作表、单元格区域 |
+| PowerPoint | `.pptx` | `PowerPointParser` | 幻灯片序号、标题路径 |
+| HTML | `.html`、`.htm` | `HtmlParser` | 标题路径 |
+| 图片 | PNG / JPEG / WEBP / TIFF / BMP | `ImageOCRParser`(OCR + Vision) | 文档级定位 |
+
+所有格式最终都转换为**同一种内部模型**(`ParsedDocument` → `Block[]`),下游切块、向量化、检索完全不感知原始格式。
+
+## 2. PDF 的特殊处理:双路径
+
+PDF 是最复杂的格式,V2 采用「按页判定」的两条路径:
+
+```text
+打开 PDF → 逐页探测文字量与最大栅格图覆盖率
+ ├── 低文字量 + 大图覆盖(扫描页)→ JPEG → 百炼 OCR;稀疏结果补 Vision
+ └── 文字型页 → 本地 Docling 版面分析(Layout + TableFormer)
+ ├── 恢复分栏阅读顺序
+ ├── 识别标题层级、正文、列表、代码
+ ├── 恢复表格单元格结构 → Markdown 表格
+ ├── 记录页码 + BBox(坐标框)
+ └── 图表/图片裁剪 → 百炼视觉模型理解语义
+```
+
+这样**同一份 PDF 可以混合**:前几页是文字版、后几页是扫描版,都能正确处理。
+
+独立图片并发融合 OCR 精确文字与 Vision 的结构关系。模型返回的空表格、重复正文伪表格和
+`NO_RETRIEVABLE_CONTENT` 装饰图会在进入 Chunk 前清理。
+
+相关限制:
+
+- 单份 PDF 最多 500 页
+- 加密、损坏、空页 PDF 直接返回明确错误
+- 重复的页眉页脚会被过滤,不进入索引
+
+## 3. 异步摄取机制
+
+V2 最大的结构变化是**上传与处理分离**:
+
+```text
+上传请求
+ ↓
+校验 → 存 MinIO → 在一个事务里建 Document + IngestionJob
+ ↓
+立即返回 202 + PENDING 状态(不等解析)
+ ↓
+独立 Worker 进程:领取任务 → 解析 → 切块 → 向量化 → 索引 → READY
+```
+
+要点:
+
+- 文档与任务在**同一数据库事务**创建,杜绝「有文档没任务」的丢任务窗口
+- Worker 用 PostgreSQL `FOR UPDATE SKIP LOCKED` 领取任务,支持多副本互不阻塞
+- 任务带**租约 + 心跳**:Worker 崩溃后,其他 Worker 能回收任务继续处理
+- 只对**临时故障**有限重试(指数退避,默认最多 3 次);损坏文件直接 FAILED
+- 文档只有全部步骤成功后才进入 `READY`,否则停在明确阶段或 `FAILED`
+
+## 4. 检索与问答
+
+- **Dense Retrieval**:Milvus COSINE 相似度检索,限定知识库范围
+- **独立检索调试**:`POST /api/retrieval/search` 不依赖 LLM,可直接查看召回内容与分数
+- **问答**:`POST /api/chat`(非流式)和 `POST /api/chat/stream`(流式)
+- **引用**:答案附带 `citations`(文档、章节、页码/区域/幻灯片)
+- **防幻觉**:没有召回结果时**不调用 LLM**,直接返回「根据当前知识库无法确定」
+
+## 5. 明确的边界(V2 不做)
+
+```text
+❌ 混合检索(Dense + Sparse)、Reranker、Query Rewrite → 属于 V3
+❌ 认证、ACL、多租户、审计 → 属于 V4
+❌ DLQ 控制台、任务优先级、任务取消 → 属于 V4
+❌ 网页爬取(Html Parser 只解析上传的静态 HTML,不访问外网)
+❌ Office 内嵌图片 OCR、图表数据模型、旧版格式(.doc/.xls/.ppt)
+❌ 评估体系、RAGOps
+❌ LangGraph / Agent / Tool Calling
+```
+
+::: warning 安全提醒
+V2 没有认证与 ACL,**不应直接暴露到公网**。对公网部署前需要补齐 V4 的认证、权限、限流与审计。
+:::
+
+## 6. 配置与模型
+
+| 配置项 | 默认值 | 说明 |
+|---|---|---|
+| `EMBEDDING_MODEL` | `text-embedding-v4` | 文档与问题共用 |
+| `EMBEDDING_DIMENSION` | `1024` | 必须与 Milvus Collection 一致 |
+| `LLM_MODEL` | `qwen-plus` | 答案生成 |
+| `OCR_MODEL` | `qwen3.5-ocr` | 扫描页/图片文字识别 |
+| `VISION_MODEL` | `qwen3-vl-flash` | PDF/独立图片的图表与关系理解 |
+| `CHUNK_MAX_TOKENS` | `512` | Chunk Token 预算 |
+| `CHUNK_OVERLAP_TOKENS` | `64` | Chunk 重叠 Token |
+
+完整配置项见 [配置项速查](/reference/config)。
+
+## 7. 真实数据专项验收
+
+除合成格式 Smoke Test 外,仓库还提供真实图片和复杂 PDF 验收集:
+
+| 样本 | 重点验证 |
+|---|---|
+| `data/1.png` | 人工智能、机器学习、深度学习的嵌套包含关系;OCR 伪表格清理 |
+| `data/2.png` | Transformer 编码器/解码器、跨模块连线和输出概率关系 |
+| `data/attention is all you need.pdf` | 15 页双栏阅读顺序、表格、内嵌图片、页码和 BBox |
+
+启动完整 Docker 服务后执行:
+
+```bash
+uv run python scripts/smoke_v2_data.py --api-url http://localhost:8000
+```
+
+脚本只通过公开 API 完成以下闭环:
+
+1. 创建临时知识库并上传三份样本,断言每次请求立即返回 `202/PENDING`。
+2. 轮询文档状态,确认独立 Worker 最终推进到 `READY` 并记录 Parser 版本。
+3. 执行真实 Milvus Dense Retrieval,验证图片关系和 PDF Table 2 的题注、多级表头与数据行能在同一 Chunk 召回。
+4. 校验 PDF Table 2 的 Citation 指向第 8 页且带 BBox。
+5. 成功时删除脚本创建的知识库;失败时保留现场,便于检查状态、Chunk 和日志。
+
+PDFium 页面探测、Docling Layout/TableFormer 和切块均在本地 Worker 中运行;扫描页、裁剪图片、
+独立图片及 Embedding 会调用 `.env` 配置的阿里云百炼,因此执行该脚本会产生少量模型用量。
+需要保留验收数据供前端人工检查时添加 `--keep`。
+
+## 下一步
+
+- 进入架构部分 → [整体架构与分层](/architecture/overview)
diff --git a/apps/docs/guide/what-is-rag.md b/apps/docs/guide/what-is-rag.md
new file mode 100644
index 0000000..586f7c1
--- /dev/null
+++ b/apps/docs/guide/what-is-rag.md
@@ -0,0 +1,109 @@
+# 什么是 RAG
+
+## 1. 一句话定义
+
+**RAG(Retrieval-Augmented Generation,检索增强生成)** 是一种把「检索」和「生成」结合起来的问答技术。
+
+它的大致过程是:
+
+> 用户提问 → 先从知识库里**检索**出相关的资料 → 把资料作为**上下文**喂给大语言模型(LLM)→ LLM 基于这些资料**生成**答案。
+
+用公式表示:
+
+```text
+答案 = LLM( 用户问题 + 检索到的相关片段 )
+```
+
+## 2. 为什么要用 RAG:先看纯 LLM 的痛点
+
+只靠大模型(不使用 RAG)对话时,有四个明显问题:
+
+| 痛点 | 说明 |
+|---|---|
+| **知识过时** | LLM 的训练数据有截止日期,无法知道企业/个人最新发生的事情 |
+| **没有私有知识** | LLM 不知道你的公司制度、内部文档、个人笔记 |
+| **会「一本正经地胡说八道」** | 不知道答案时,模型会编造(Hallucination,幻觉),且用户无法分辨 |
+| **答案不可追溯** | 即使说对了,用户也无法知道依据来自哪里 |
+
+**RAG 正是为了解决这些问题而出现**:它不依赖 LLM「背下来」的知识,而是现场从知识库中查资料,再让 LLM 基于资料回答。
+
+## 3. RAG 解决问题的对照
+
+| 痛点 | RAG 的解法 |
+|---|---|
+| 知识过时 | 知识放在外部数据库,随时更新,LLM 每次现查 |
+| 没有私有知识 | 把私有文档(PDF / Word / Excel / Markdown…)切块、索引,变成可检索的知识库 |
+| 幻觉 | 要求 LLM「只依据检索到的证据回答」,没有证据就明确说不知道 |
+| 不可追溯 | 答案附带 **Citation(引用)**,指出依据来自哪份文档的哪个章节 |
+
+::: tip 一个类比
+普通 LLM 像「闭卷考试的学生」,只能靠背过的知识答题;
+RAG 像「开卷考试的学生」,可以随时翻阅资料再作答,还能标出「我这题的依据在第几页」。
+:::
+
+## 4. 一个完整的 RAG 系统长什么样
+
+一个完整可落地的 RAG 平台,通常由**两条链路**组成:
+
+### 链路一:知识入库(Ingestion,也叫索引/摄取)
+
+把原始文档变成可检索的形式:
+
+```text
+上传文档
+ ↓
+解析(Parser) 把 PDF/Word/Markdown 变成统一结构
+ ↓
+切块(Chunker) 切成适合检索的小片段(Chunk)
+ ↓
+向量化(Embedding) 把文本转成向量(一串数字,表达语义)
+ ↓
+索引(VectorStore) 存入向量数据库,供检索
+```
+
+### 链路二:问答(Query / Generation)
+
+用户提问后,从库里召回资料并生成答案:
+
+```text
+用户提问
+ ↓
+向量化问题 用同一个模型把问题转成向量
+ ↓
+检索(Retrieval) 在向量库里找最相似的 Chunk
+ ↓
+拼上下文 把召回的 Chunk 组织成带来源编号的 Prompt
+ ↓
+生成(Generation) LLM 基于上下文回答
+ ↓
+返回答案 + 引用 同时返回依据的文档/章节/页码
+```
+
+::: tip 理解建议
+把「**入库**」和「**问答**」当作两条独立的流水线来理解。
+入库做一次,问答做无数次;问答只使用入库产生的结果。
+这正是本项目(UltimateRAG)组织代码的核心逻辑。
+:::
+
+## 5. 关键术语表
+
+在继续阅读之前,先建立这些词的直觉:
+
+| 术语 | 直觉理解 | 在本项目中的体现 |
+|---|---|---|
+| **Document** | 一份上传的原始文档 | 含元数据和状态(PENDING / READY / FAILED) |
+| **Parser** | 把各种格式解析成统一结构的「翻译官」 | `MarkdownParser`、`PDFParser`、`WordParser`… |
+| **Block** | 解析后的最小语义块(标题、正文、表格…) | 领域模型 `Block` |
+| **Chunk** | 真正送去向量化、检索的文本片段 | 领域模型 `Chunk` |
+| **Embedding** | 把文本变成语义向量 | 百炼 `text-embedding-v4`,1024 维 |
+| **VectorStore** | 存向量并支持相似度检索的数据库 | Milvus |
+| **Retrieval** | 找出与问题最相关的片段 | `RetrievalService` |
+| **Context** | 拼给 LLM 的证据文本 | `ContextBuilder` |
+| **Citation** | 答案的依据引用 | 领域模型 `Citation` |
+| **Knowledge Base** | 一组文档的容器,也是检索的隔离边界 | `KnowledgeBase` |
+
+## 6. 下一步
+
+- 想更细致地了解 RAG 每一步在做什么 → [RAG 的核心环节](/guide/rag-pipeline)
+- 想了解 UltimateRAG 这个项目本身 → [项目定位与版本演进](/guide/project-overview)
+- 想直接看整体架构 → [整体架构与分层](/architecture/overview)
diff --git a/apps/docs/index.md b/apps/docs/index.md
index 1b80526..2306076 100644
--- a/apps/docs/index.md
+++ b/apps/docs/index.md
@@ -1,25 +1,50 @@
---
-# https://vitepress.dev/reference/default-theme-home-page
layout: home
hero:
- name: "My Awesome Project"
- text: "A VitePress Site"
- tagline: My great project tagline
+ name: "UltimateRAG"
+ text: "企业级 RAG 平台学习指南"
+ tagline: 从零理解 RAG 原理,彻底看懂 UltimateRAG 的架构、模块与核心流程
actions:
- theme: brand
- text: Markdown Examples
- link: /markdown-examples
+ text: 开始学习 RAG
+ link: /guide/what-is-rag
- theme: alt
- text: API Examples
- link: /api-examples
+ text: 查看整体架构
+ link: /architecture/overview
features:
- - title: Feature A
- details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- - title: Feature B
- details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- - title: Feature C
- details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
+ - title: 📖 RAG 入门
+ details: 从问题背景讲起,用通俗语言解释什么是 RAG、为什么需要它,以及检索增强生成的完整链路。
+ link: /guide/what-is-rag
+ - title: 🏗️ 整体架构
+ details: 四层架构(Interface → Application → Domain → Infrastructure)、依赖方向、三大存储职责与版本演进路线。
+ link: /architecture/overview
+ - title: 🧩 模块详解
+ details: 逐个拆解 Parser、Chunker、Embedding、VectorStore、Worker、Generation 等每个模块的职责与代码。
+ link: /modules/index
+ - title: 🔄 核心流程
+ details: 文档摄取(Parse → Chunk → Embed → Index)与检索问答(Retrieve → Context → Generate)两条主链路的端到端追踪。
+ link: /workflows/ingestion
+ - title: 💻 代码导读
+ details: 挑出最有代表性的核心代码,逐段解释设计意图、关键约束与失败行为。
+ link: /workflows/code-tour
+ - title: 📡 API 参考
+ details: 知识库、文档、检索、问答的全部 REST 接口、请求响应格式与错误处理。
+ link: /reference/api
---
+## 这份文档是写给谁的
+
+如果你是 **UltimateRAG 的开发者(或学习者)**,但面对这个仓库时感觉:
+
+- 项目很大,不知道从哪看起
+- 模块很多,不明白它们之间怎么协作
+- 术语很多(Domain / Parser / Chunk / Embedding / Milvus / Worker…),概念模糊
+- 想弄明白一个文档从上传到能被检索、被引用,中间到底发生了什么
+
+那么这份指南就是为你写的。
+
+它**不假设你已经懂 RAG**,而是从概念讲起;也**不只看目录结构**,而是带你顺着真实的数据流,把每个模块的职责和它们之间的关系讲清楚。
+
+> 💡 阅读建议:按左侧边栏的顺序从上到下阅读即可。如果时间有限,至少读完「RAG 入门」和「核心流程」两条主链路。
diff --git a/apps/docs/markdown-examples.md b/apps/docs/markdown-examples.md
deleted file mode 100644
index f9258a5..0000000
--- a/apps/docs/markdown-examples.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# Markdown Extension Examples
-
-This page demonstrates some of the built-in markdown extensions provided by VitePress.
-
-## Syntax Highlighting
-
-VitePress provides Syntax Highlighting powered by [Shiki](https://github.com/shikijs/shiki), with additional features like line-highlighting:
-
-**Input**
-
-````md
-```js{4}
-export default {
- data () {
- return {
- msg: 'Highlighted!'
- }
- }
-}
-```
-````
-
-**Output**
-
-```js{4}
-export default {
- data () {
- return {
- msg: 'Highlighted!'
- }
- }
-}
-```
-
-## Custom Containers
-
-**Input**
-
-```md
-::: info
-This is an info box.
-:::
-
-::: tip
-This is a tip.
-:::
-
-::: warning
-This is a warning.
-:::
-
-::: danger
-This is a dangerous warning.
-:::
-
-::: details
-This is a details block.
-:::
-```
-
-**Output**
-
-::: info
-This is an info box.
-:::
-
-::: tip
-This is a tip.
-:::
-
-::: warning
-This is a warning.
-:::
-
-::: danger
-This is a dangerous warning.
-:::
-
-::: details
-This is a details block.
-:::
-
-## More
-
-Check out the documentation for the [full list of markdown extensions](https://vitepress.dev/guide/markdown).
diff --git a/apps/docs/modules/api-web.md b/apps/docs/modules/api-web.md
new file mode 100644
index 0000000..4216178
--- /dev/null
+++ b/apps/docs/modules/api-web.md
@@ -0,0 +1,218 @@
+# API 与前端
+
+## 第一部分:后端 API(Interface 层)
+
+代码位置:`apps/api/`
+
+### 1. 这一层是什么
+
+API 是**进程启动 + HTTP 边界**:验证输入、调用应用服务、把领域结果映射为 JSON。它**不包含**数据库、对象存储、向量检索或 Prompt 业务逻辑。
+
+```text
+Validate Request
+ ↓
+Application Service
+ ↓
+Response
+```
+
+### 2. 文件职责
+
+| 文件 | 职责 |
+|---|---|
+| `app.py` | FastAPI 应用、Lifespan 装配、中间件、统一异常映射 |
+| `routes.py` | 全部 HTTP 路由(薄 Controller) |
+| `schemas.py` | Pydantic 请求/响应模型(外部数据验证边界) |
+| `container.py` | 进程级依赖容器 |
+
+### 3. app.py —— 应用入口与 Lifespan
+
+```python
+@asynccontextmanager
+async def lifespan(app: FastAPI):
+ # 阶段 1:与 Worker 共用同一 Composition Root,防止"API 校验支持某格式、
+ # Worker 却无法解析"的配置不一致
+ runtime = create_processing_runtime(settings)
+
+ # 阶段 2:LLM 只属于 HTTP 问答进程;后台 Worker 不创建生成模型客户端
+ llm = BailianLLMClient(...)
+ retrieval = RetrievalService(runtime.embedder, runtime.vector_store, runtime.repository)
+
+ # 阶段 3:集中放入进程级 Container,Route 只从 app.state 取服务
+ app.state.container = Container(
+ engine=runtime.engine,
+ repository=runtime.repository,
+ ingestion=runtime.ingestion,
+ retrieval=retrieval,
+ rag=RAGService(retrieval, ContextBuilder(...), llm),
+ lifecycle=DocumentLifecycleService(...),
+ )
+
+ # 阶段 4:幂等准备 MinIO Bucket + Milvus Collection。
+ # 任一失败 → 不执行 yield → 应用不进入服务阶段
+ await runtime.initialize()
+ yield
+ await runtime.close() # 释放数据库连接池
+```
+
+### 4. 统一异常映射
+
+| 业务异常 | HTTP 状态 | 含义 |
+|---|---|---|
+| `ResourceNotFoundError` | 404 | 知识库/文档不存在 |
+| `InvalidDocumentError` | 400 | 输入错误(类型/大小/格式) |
+| `DocumentBusyError` | 409 | 文档正在后台处理,稍后重试 |
+| `UltimateRAGError`(其他已知) | 502 | 外部处理故障,不暴露 Stack Trace |
+
+### 5. routes.py —— 全部端点
+
+**知识库**
+
+```text
+POST /api/knowledge-bases → 201 创建
+GET /api/knowledge-bases → 列表
+GET /api/knowledge-bases/{id} → 单个
+DELETE /api/knowledge-bases/{id} → 204 删除
+```
+
+**文档**
+
+```text
+POST /api/knowledge-bases/{kb_id}/documents → 202 上传入队(不等待处理)
+GET /api/knowledge-bases/{kb_id}/documents → 列表 + 实时状态
+GET /api/documents/{doc_id} → 单个元数据
+DELETE /api/documents/{doc_id} → 204 删除
+```
+
+**问答**
+
+```text
+POST /api/retrieval/search → 纯检索(不依赖 LLM,可独立调试)
+POST /api/chat → 完整问答(答案 + 引用 + 召回证据)
+POST /api/chat/stream → SSE 流式问答(AI SDK UI Message Stream)
+GET /api/health → 存活检查(不触发模型调用)
+```
+
+### 6. 上传端点的关键设计
+
+```python
+async def _read_bounded_upload(file, max_upload_bytes) -> bytes:
+ content = await file.read(max_upload_bytes + 1) # 只多读一个字节
+ if len(content) > max_upload_bytes:
+ raise InvalidDocumentError("文件不能超过 N MB")
+ return content
+```
+
+- **有界读取**:不在内存中完整加载任意大请求才拒绝
+- 应用服务保留同样校验:CLI / 测试 / 未来 Worker 直接调用时依然安全
+
+### 7. 流式端点(`/chat/stream`)的协议设计
+
+使用 **AI SDK Data Stream Protocol** 的 SSE 表示:
+
+```text
+start → start-step → data-retrieval(引用+证据随同一条消息)→ text-start
+ → text-delta × N → text-end → finish-step → finish → [DONE]
+```
+
+关键点:
+
+- **检索在 StreamingResponse 建立前完成**:知识库不存在、Embedding 失败、Milvus 不可用时,仍能返回结构化 HTTP 状态码
+- **Citation/RetrievalResult 通过有类型的 `data-retrieval` Part 同消息返回**:前端不需要在流结束后再发请求补取证据
+- LLM 在响应开始后的故障只能编码为 `error` Part(此时 200 已发出),日志保留完整堆栈,浏览器只收到稳定文案
+- 响应头:
+ - `X-Accel-Buffering: no`:关闭 Nginx 缓冲,让 token 及时抵达
+ - `x-vercel-ai-ui-message-stream: v1`:AI SDK 识别标记,CORS 中显式暴露
+
+### 8. schemas.py —— 外部验证边界
+
+Pydantic 模型与内部领域 dataclass 分离,**防止基础设施字段泄漏给客户端**:
+
+```python
+ChatRequest(RetrievalRequest):
+ query: str = Field(min_length=1, max_length=4000, alias="question")
+```
+
+- 外部字段用产品语义的 `question`,内部统一 `query`
+- `from_domain()` 类方法负责领域对象 → API 结构的显式映射
+- `RetrievalRequest.top_k`:`ge=1, le=20` 边界校验
+
+## 第二部分:前端(Next.js)
+
+代码位置:`apps/web/`
+
+### 9. 技术栈
+
+```text
+Next.js 16 + React 19 + TypeScript
+AI SDK(@ai-sdk/react, ai v7)— 消费流式消息
+Tailwind CSS + shadcn/ui 风格组件
+react-markdown + remark-gfm — 渲染答案 Markdown
+```
+
+### 10. 页面
+
+| 页面 | 功能 |
+|---|---|
+| `/` | 首页入口 |
+| `/knowledge-bases` | 知识库列表、创建 |
+| `/knowledge-bases/[id]` | 知识库详情:文档上传、状态轮询、删除 |
+| `/chat` | 聊天界面:流式问答 + 证据展示 |
+
+### 11. API 调用封装(`app/lib.ts`)
+
+```typescript
+export async function api{pageError ? "请检查后端服务是否可用,刷新页面重试。" - : "先创建一个知识库并上传 Markdown 文档,然后回到这里开始问答。"} + : "先创建一个知识库并上传文档,然后回到这里开始问答。"}