Kaguya-19 commited on
Commit
974817f
·
1 Parent(s): 8f500be
README.md CHANGED
@@ -1,3 +1,147 @@
1
  ---
2
  license: apache-2.0
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: apache-2.0
3
  ---
4
+
5
+ ## News
6
+
7
+ * [2025-06-05] 🚀🚀🚀 We have open-sourced **MiniCPM4-Survey**, a model built upon MiniCPM4-8B that is capable of generating trustworthy, long-form survey papers while maintaining competitive performance relative to significantly larger models.
8
+
9
+ ## Overview
10
+
11
+ **MiniCPM4-Survey** is an open-source LLM agent model jointly developed by [THUNLP](https://nlp.csai.tsinghua.edu.cn), Renmin University of China and [ModelBest](https://modelbest.cn/en). Built on [MiniCPM4](https://github.com/OpenBMB/MiniCPM4) with 8 billion parameters, it accepts users' quiries as input and autonomously generate trustworthy, long-form survey papers.
12
+
13
+ Key features include:
14
+
15
+ - **Plan-Retrieve-Write Survey Generation Framework** — We propose a multi-agent generation framework, which operates through three core stages: planning (defining the overall structure of the survey), retrieval (generating appropriate retrieval keywords), and writing (synthesizing the retrieved information to generate coherent section-level content).
16
+
17
+ - **High-Quality Dataset Construction** — We gather and process lots of expert-written survey papers to construct a high-quality training dataset. Meanwhile, we collect a large number of research papers to build a retrieval database.
18
+
19
+ - **Multi-Aspect Reward Design** — We carefully design a reward system with three aspects (structure, content, and citations) to evaluate the quality of the surveys, which is used as the reward function in the RL training stage.
20
+
21
+ - **Multi-Step RL Training Strategy** — We propose a *Context Manager* to ensure retention of essential information while facilitating efficient reasoning, and we construct *Parallel Environment* to maintain efficient RL training cycles.
22
+
23
+
24
+ ## Quick Start
25
+
26
+ ### Download the model
27
+
28
+ Download [MiniCPM4-Survey](https://huggingface.co/openbmb/MiniCPM4-Survey) from Hugging Face and place it in `model/MiniCPM4-Survey`.
29
+ We recommend using [MiniCPM-Embedding-Light](https://huggingface.co/openbmb/MiniCPM-Embedding-Light) as the embedding model, which can be downloaded from Hugging Face and placed in `model/MiniCPM-Embedding-Light`.
30
+ ### Perpare the environment
31
+
32
+ You can download the [paper data](https://www.kaggle.com/datasets/Cornell-University/arxiv) from Kaggle, then extract it. You can run `python dataset_process.py` to process the data and generate the retrieval database. Then you can run `python build_index.py` to build the retrieval database.
33
+
34
+ ```
35
+ cd ./code
36
+ curl -L -o ~/Downloads/arxiv.zip\
37
+ https://www.kaggle.com/api/v1/datasets/download/Cornell-University/arxiv
38
+ unzip ~/Downloads/arxiv.zip -d .
39
+ mkdir data
40
+ python ./src/preprocess/dataset_process.py
41
+ mkdir index
42
+ python ./src/preprocess/build_index.py
43
+ ```
44
+
45
+ ### Model Inference
46
+
47
+ You can run the following command to build the retrieval environment and start the inference:
48
+
49
+ ```bash
50
+ cd ./code
51
+ python ./src/retriever.py
52
+ bash ./scripts/run.sh
53
+ ```
54
+
55
+ If you want to run with the frontend, you can run the following command:
56
+
57
+ ```bash
58
+ cd ./code
59
+ python ./src/retriever.py
60
+ bash ./scripts/run_with_frontend.sh
61
+ cd frontend/minicpm4-survey
62
+ npm install
63
+ npm run dev
64
+ ```
65
+
66
+ Then you can visit `http://localhost:5173` in your browser to use the model.
67
+
68
+ ## Performance Evaluation
69
+
70
+ | Method | Relevance | Coverage | Depth | Novelty | Avg. | Fact Score |
71
+ |---------------------------------------------|-----------|----------|-------|---------|-------|------------|
72
+ | Naive RAG (driven by G2FT) | 3.25 | 2.95 | 3.35 | 2.60 | 3.04 | 43.68 |
73
+ | AutoSurvey (driven by G2FT) | 3.10 | 3.25 | 3.15 | **3.15**| 3.16 | 46.56 |
74
+ | Webthinker (driven by WTR1-7B) | 3.30 | 3.00 | 2.75 | 2.50 | 2.89 | -- |
75
+ | Webthinker (driven by QwQ-32B) | 3.40 | 3.30 | 3.30 | 2.50 | 3.13 | -- |
76
+ | OpenAI Deep Research (driven by GPT-4o) | 3.50 |**3.95** | 3.55 | 3.00 | **3.50** | -- |
77
+ | MiniCPM4-Survey | 3.45 | 3.70 | **3.85** | 3.00 | **3.50** | **68.73** |
78
+ |    *w/o* RL | **3.55** | 3.35 | 3.30 | 2.25 | 3.11 | 50.24 |
79
+
80
+ *Performance comparison of the survey generation systems. "G2FT" stands for Gemini-2.0-Flash-Thinking, and "WTR1-7B" denotes Webthinker-R1-7B. FactScore evaluation was omitted for Webthinker, as it does not include citation functionality, and for OpenAI Deep Research, which does not provide citations when exporting the results.*
81
+
82
+ # 中文
83
+ ## News
84
+
85
+ * [2025-06-05] 🚀🚀🚀我们开源了基于MiniCPM4-8B构建的MiniCPM4-Survey,能够生成可信的长篇调查报告,性能比肩更大模型。
86
+
87
+ ## 概览
88
+
89
+ MiniCPM4-Survey是由[THUNLP](https://nlp.csai.tsinghua.edu.cn)、中国人民大学和[ModelBest](https://modelbest.cn)联合开发的开源大语言模型���能体。它基于[MiniCPM4](https://github.com/OpenBMB/MiniCPM4) 80亿参数基座模型,接受用户质量作为输入,自主生成可信的长篇综述论文。
90
+
91
+ 主要特性包括:
92
+ - 计划-检索-写作生成框架 — 我们提出了一个多智能体生成框架,包含三个核心阶段:计划(定义综述的整体结构)、检索(生成合适的检索关键词)和写作(利用检索到的信息,生成连贯的段落)。
93
+ - 高质量数据集构建——我们收集并处理大量人类专家写作的综述论文,构建高质量训练集。同时,我们收集大量研究论文,构建检索数据库。
94
+ - 多方面奖励设计 — 我们精心设计了包含结构、内容和引用的奖励,用于评估综述的质量,在强化学习训练阶段作奖励函数。
95
+ - 多步强化学习训练策略 — 我们提出了一个上下文管理器,以确保在促进有效推理的同时保留必要的信息,并构建了并行环境,维持强化学习训练高效。
96
+
97
+
98
+ ## 使用
99
+
100
+ ### 下载模型
101
+ 从 Hugging Face 下载[MiniCPM4-Survey](https://huggingface.co/openbmb/MiniCPM4-Survey)并将其放在model/MiniCPM4-Survey中。
102
+ 我们建议使用[MiniCPM-Embedding-Light](https://huggingface.co/openbmb/MiniCPM-Embedding-Light)作为表征模型,放在model/MiniCPM-Embedding-Light中。
103
+
104
+ ### 准备环境
105
+ 从 Kaggle 下载论文数据,然后解压。运行`python dataset_process.py`,处理数据并生成检索数据库。然后运行`python build_index.py`,构建检索数据库。
106
+ ``` bash
107
+ cd ./code
108
+ curl -L -o ~/Downloads/arxiv.zip\
109
+ https://www.kaggle.com/api/v1/datasets/download/Cornell-University/arxiv
110
+ unzip ~/Downloads/arxiv.zip -d .
111
+ mkdir data
112
+ python ./src/preprocess/dataset_process.py
113
+ mkdir index
114
+ python ./src/preprocess/build_index.py
115
+ ```
116
+
117
+ ### 模型推理
118
+ 运行以下命令来构建检索环境并开始推理:
119
+ ``` bash
120
+ cd ./code
121
+ python ./src/retriever.py
122
+ bash ./scripts/run.sh
123
+ ```
124
+ 如果您想使用前端运行,可以运行以下命令:
125
+ ``` bash
126
+ cd ./code
127
+ python ./src/retriever.py
128
+ bash ./scripts/run_with_frontend.sh
129
+ cd frontend/minicpm4-survey
130
+ npm install
131
+ npm run dev
132
+ ```
133
+ 然后你可以在浏览器中访问`http://localhost:5173`使用。
134
+
135
+ ## 性能
136
+
137
+ | Method | Relevance | Coverage | Depth | Novelty | Avg. | Fact Score |
138
+ |---------------------------------------------|-----------|----------|-------|---------|-------|------------|
139
+ | Naive RAG (driven by G2FT) | 3.25 | 2.95 | 3.35 | 2.60 | 3.04 | 43.68 |
140
+ | AutoSurvey (driven by G2FT) | 3.10 | 3.25 | 3.15 | **3.15**| 3.16 | 46.56 |
141
+ | Webthinker (driven by WTR1-7B) | 3.30 | 3.00 | 2.75 | 2.50 | 2.89 | -- |
142
+ | Webthinker (driven by QwQ-32B) | 3.40 | 3.30 | 3.30 | 2.50 | 3.13 | -- |
143
+ | OpenAI Deep Research (driven by GPT-4o) | 3.50 |**3.95** | 3.55 | 3.00 | **3.50** | -- |
144
+ | MiniCPM4-Survey | 3.45 | 3.70 | **3.85** | 3.00 | **3.50** | **68.73** |
145
+ |    *w/o* RL | **3.55** | 3.35 | 3.30 | 2.25 | 3.11 | 50.24 |
146
+
147
+ *GPT-4o对综述生成系统的性能比较。“G2FT”代表Gemini-2.0-Flash-Thinking,“WTR1-7B”代表Webthinker-R1-7B。由于Webthinker不包括引用功能,OpenAI Deep Research在导出结果时不提供引用,因此省略了对它们的FactScore评估。我们的技术报告中包含评测的详细信息。*
added_tokens.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "<|execute_end|>": 73444,
3
+ "<|execute_start|>": 73443,
4
+ "<|fim_middle|>": 73446,
5
+ "<|fim_prefix|>": 73445,
6
+ "<|fim_suffix|>": 73447,
7
+ "<|im_end|>": 73440,
8
+ "<|im_start|>": 73441,
9
+ "<|tool_call|>": 73442
10
+ }
code/frontend/minicpm4-survey/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
code/frontend/minicpm4-survey/eslint.config.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+
6
+ export default [
7
+ { ignores: ['dist'] },
8
+ {
9
+ files: ['**/*.{js,jsx}'],
10
+ languageOptions: {
11
+ ecmaVersion: 2020,
12
+ globals: globals.browser,
13
+ parserOptions: {
14
+ ecmaVersion: 'latest',
15
+ ecmaFeatures: { jsx: true },
16
+ sourceType: 'module',
17
+ },
18
+ },
19
+ plugins: {
20
+ 'react-hooks': reactHooks,
21
+ 'react-refresh': reactRefresh,
22
+ },
23
+ rules: {
24
+ ...js.configs.recommended.rules,
25
+ ...reactHooks.configs.recommended.rules,
26
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
27
+ 'react-refresh/only-export-components': [
28
+ 'warn',
29
+ { allowConstantExport: true },
30
+ ],
31
+ },
32
+ },
33
+ ]
code/frontend/minicpm4-survey/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/png" href="/openbmb.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>MiniCPM4-Survey</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.jsx"></script>
12
+ </body>
13
+ </html>
code/frontend/minicpm4-survey/package-lock.json ADDED
@@ -0,0 +1,2822 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "minicpm4-survey",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "minicpm4-survey",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "dompurify": "^3.2.6",
12
+ "marked": "^15.0.12",
13
+ "react": "^19.1.0",
14
+ "react-dom": "^19.1.0"
15
+ },
16
+ "devDependencies": {
17
+ "@eslint/js": "^9.25.0",
18
+ "@types/react": "^19.1.2",
19
+ "@types/react-dom": "^19.1.2",
20
+ "@vitejs/plugin-react": "^4.4.1",
21
+ "eslint": "^9.25.0",
22
+ "eslint-plugin-react-hooks": "^5.2.0",
23
+ "eslint-plugin-react-refresh": "^0.4.19",
24
+ "globals": "^16.0.0",
25
+ "vite": "^6.3.5"
26
+ }
27
+ },
28
+ "node_modules/@ampproject/remapping": {
29
+ "version": "2.3.0",
30
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
31
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
32
+ "dev": true,
33
+ "license": "Apache-2.0",
34
+ "dependencies": {
35
+ "@jridgewell/gen-mapping": "^0.3.5",
36
+ "@jridgewell/trace-mapping": "^0.3.24"
37
+ },
38
+ "engines": {
39
+ "node": ">=6.0.0"
40
+ }
41
+ },
42
+ "node_modules/@babel/code-frame": {
43
+ "version": "7.27.1",
44
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
45
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
46
+ "dev": true,
47
+ "license": "MIT",
48
+ "dependencies": {
49
+ "@babel/helper-validator-identifier": "^7.27.1",
50
+ "js-tokens": "^4.0.0",
51
+ "picocolors": "^1.1.1"
52
+ },
53
+ "engines": {
54
+ "node": ">=6.9.0"
55
+ }
56
+ },
57
+ "node_modules/@babel/compat-data": {
58
+ "version": "7.27.3",
59
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz",
60
+ "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==",
61
+ "dev": true,
62
+ "license": "MIT",
63
+ "engines": {
64
+ "node": ">=6.9.0"
65
+ }
66
+ },
67
+ "node_modules/@babel/core": {
68
+ "version": "7.27.3",
69
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.3.tgz",
70
+ "integrity": "sha512-hyrN8ivxfvJ4i0fIJuV4EOlV0WDMz5Ui4StRTgVaAvWeiRCilXgwVvxJKtFQ3TKtHgJscB2YiXKGNJuVwhQMtA==",
71
+ "dev": true,
72
+ "license": "MIT",
73
+ "dependencies": {
74
+ "@ampproject/remapping": "^2.2.0",
75
+ "@babel/code-frame": "^7.27.1",
76
+ "@babel/generator": "^7.27.3",
77
+ "@babel/helper-compilation-targets": "^7.27.2",
78
+ "@babel/helper-module-transforms": "^7.27.3",
79
+ "@babel/helpers": "^7.27.3",
80
+ "@babel/parser": "^7.27.3",
81
+ "@babel/template": "^7.27.2",
82
+ "@babel/traverse": "^7.27.3",
83
+ "@babel/types": "^7.27.3",
84
+ "convert-source-map": "^2.0.0",
85
+ "debug": "^4.1.0",
86
+ "gensync": "^1.0.0-beta.2",
87
+ "json5": "^2.2.3",
88
+ "semver": "^6.3.1"
89
+ },
90
+ "engines": {
91
+ "node": ">=6.9.0"
92
+ },
93
+ "funding": {
94
+ "type": "opencollective",
95
+ "url": "https://opencollective.com/babel"
96
+ }
97
+ },
98
+ "node_modules/@babel/generator": {
99
+ "version": "7.27.3",
100
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz",
101
+ "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==",
102
+ "dev": true,
103
+ "license": "MIT",
104
+ "dependencies": {
105
+ "@babel/parser": "^7.27.3",
106
+ "@babel/types": "^7.27.3",
107
+ "@jridgewell/gen-mapping": "^0.3.5",
108
+ "@jridgewell/trace-mapping": "^0.3.25",
109
+ "jsesc": "^3.0.2"
110
+ },
111
+ "engines": {
112
+ "node": ">=6.9.0"
113
+ }
114
+ },
115
+ "node_modules/@babel/helper-compilation-targets": {
116
+ "version": "7.27.2",
117
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
118
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
119
+ "dev": true,
120
+ "license": "MIT",
121
+ "dependencies": {
122
+ "@babel/compat-data": "^7.27.2",
123
+ "@babel/helper-validator-option": "^7.27.1",
124
+ "browserslist": "^4.24.0",
125
+ "lru-cache": "^5.1.1",
126
+ "semver": "^6.3.1"
127
+ },
128
+ "engines": {
129
+ "node": ">=6.9.0"
130
+ }
131
+ },
132
+ "node_modules/@babel/helper-module-imports": {
133
+ "version": "7.27.1",
134
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
135
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
136
+ "dev": true,
137
+ "license": "MIT",
138
+ "dependencies": {
139
+ "@babel/traverse": "^7.27.1",
140
+ "@babel/types": "^7.27.1"
141
+ },
142
+ "engines": {
143
+ "node": ">=6.9.0"
144
+ }
145
+ },
146
+ "node_modules/@babel/helper-module-transforms": {
147
+ "version": "7.27.3",
148
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
149
+ "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
150
+ "dev": true,
151
+ "license": "MIT",
152
+ "dependencies": {
153
+ "@babel/helper-module-imports": "^7.27.1",
154
+ "@babel/helper-validator-identifier": "^7.27.1",
155
+ "@babel/traverse": "^7.27.3"
156
+ },
157
+ "engines": {
158
+ "node": ">=6.9.0"
159
+ },
160
+ "peerDependencies": {
161
+ "@babel/core": "^7.0.0"
162
+ }
163
+ },
164
+ "node_modules/@babel/helper-plugin-utils": {
165
+ "version": "7.27.1",
166
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
167
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
168
+ "dev": true,
169
+ "license": "MIT",
170
+ "engines": {
171
+ "node": ">=6.9.0"
172
+ }
173
+ },
174
+ "node_modules/@babel/helper-string-parser": {
175
+ "version": "7.27.1",
176
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
177
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
178
+ "dev": true,
179
+ "license": "MIT",
180
+ "engines": {
181
+ "node": ">=6.9.0"
182
+ }
183
+ },
184
+ "node_modules/@babel/helper-validator-identifier": {
185
+ "version": "7.27.1",
186
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
187
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
188
+ "dev": true,
189
+ "license": "MIT",
190
+ "engines": {
191
+ "node": ">=6.9.0"
192
+ }
193
+ },
194
+ "node_modules/@babel/helper-validator-option": {
195
+ "version": "7.27.1",
196
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
197
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
198
+ "dev": true,
199
+ "license": "MIT",
200
+ "engines": {
201
+ "node": ">=6.9.0"
202
+ }
203
+ },
204
+ "node_modules/@babel/helpers": {
205
+ "version": "7.27.3",
206
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz",
207
+ "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==",
208
+ "dev": true,
209
+ "license": "MIT",
210
+ "dependencies": {
211
+ "@babel/template": "^7.27.2",
212
+ "@babel/types": "^7.27.3"
213
+ },
214
+ "engines": {
215
+ "node": ">=6.9.0"
216
+ }
217
+ },
218
+ "node_modules/@babel/parser": {
219
+ "version": "7.27.3",
220
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz",
221
+ "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==",
222
+ "dev": true,
223
+ "license": "MIT",
224
+ "dependencies": {
225
+ "@babel/types": "^7.27.3"
226
+ },
227
+ "bin": {
228
+ "parser": "bin/babel-parser.js"
229
+ },
230
+ "engines": {
231
+ "node": ">=6.0.0"
232
+ }
233
+ },
234
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
235
+ "version": "7.27.1",
236
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
237
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
238
+ "dev": true,
239
+ "license": "MIT",
240
+ "dependencies": {
241
+ "@babel/helper-plugin-utils": "^7.27.1"
242
+ },
243
+ "engines": {
244
+ "node": ">=6.9.0"
245
+ },
246
+ "peerDependencies": {
247
+ "@babel/core": "^7.0.0-0"
248
+ }
249
+ },
250
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
251
+ "version": "7.27.1",
252
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
253
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
254
+ "dev": true,
255
+ "license": "MIT",
256
+ "dependencies": {
257
+ "@babel/helper-plugin-utils": "^7.27.1"
258
+ },
259
+ "engines": {
260
+ "node": ">=6.9.0"
261
+ },
262
+ "peerDependencies": {
263
+ "@babel/core": "^7.0.0-0"
264
+ }
265
+ },
266
+ "node_modules/@babel/template": {
267
+ "version": "7.27.2",
268
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
269
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
270
+ "dev": true,
271
+ "license": "MIT",
272
+ "dependencies": {
273
+ "@babel/code-frame": "^7.27.1",
274
+ "@babel/parser": "^7.27.2",
275
+ "@babel/types": "^7.27.1"
276
+ },
277
+ "engines": {
278
+ "node": ">=6.9.0"
279
+ }
280
+ },
281
+ "node_modules/@babel/traverse": {
282
+ "version": "7.27.3",
283
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz",
284
+ "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==",
285
+ "dev": true,
286
+ "license": "MIT",
287
+ "dependencies": {
288
+ "@babel/code-frame": "^7.27.1",
289
+ "@babel/generator": "^7.27.3",
290
+ "@babel/parser": "^7.27.3",
291
+ "@babel/template": "^7.27.2",
292
+ "@babel/types": "^7.27.3",
293
+ "debug": "^4.3.1",
294
+ "globals": "^11.1.0"
295
+ },
296
+ "engines": {
297
+ "node": ">=6.9.0"
298
+ }
299
+ },
300
+ "node_modules/@babel/traverse/node_modules/globals": {
301
+ "version": "11.12.0",
302
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
303
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
304
+ "dev": true,
305
+ "license": "MIT",
306
+ "engines": {
307
+ "node": ">=4"
308
+ }
309
+ },
310
+ "node_modules/@babel/types": {
311
+ "version": "7.27.3",
312
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz",
313
+ "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==",
314
+ "dev": true,
315
+ "license": "MIT",
316
+ "dependencies": {
317
+ "@babel/helper-string-parser": "^7.27.1",
318
+ "@babel/helper-validator-identifier": "^7.27.1"
319
+ },
320
+ "engines": {
321
+ "node": ">=6.9.0"
322
+ }
323
+ },
324
+ "node_modules/@esbuild/aix-ppc64": {
325
+ "version": "0.25.5",
326
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
327
+ "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
328
+ "cpu": [
329
+ "ppc64"
330
+ ],
331
+ "dev": true,
332
+ "license": "MIT",
333
+ "optional": true,
334
+ "os": [
335
+ "aix"
336
+ ],
337
+ "engines": {
338
+ "node": ">=18"
339
+ }
340
+ },
341
+ "node_modules/@esbuild/android-arm": {
342
+ "version": "0.25.5",
343
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
344
+ "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
345
+ "cpu": [
346
+ "arm"
347
+ ],
348
+ "dev": true,
349
+ "license": "MIT",
350
+ "optional": true,
351
+ "os": [
352
+ "android"
353
+ ],
354
+ "engines": {
355
+ "node": ">=18"
356
+ }
357
+ },
358
+ "node_modules/@esbuild/android-arm64": {
359
+ "version": "0.25.5",
360
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
361
+ "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
362
+ "cpu": [
363
+ "arm64"
364
+ ],
365
+ "dev": true,
366
+ "license": "MIT",
367
+ "optional": true,
368
+ "os": [
369
+ "android"
370
+ ],
371
+ "engines": {
372
+ "node": ">=18"
373
+ }
374
+ },
375
+ "node_modules/@esbuild/android-x64": {
376
+ "version": "0.25.5",
377
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
378
+ "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
379
+ "cpu": [
380
+ "x64"
381
+ ],
382
+ "dev": true,
383
+ "license": "MIT",
384
+ "optional": true,
385
+ "os": [
386
+ "android"
387
+ ],
388
+ "engines": {
389
+ "node": ">=18"
390
+ }
391
+ },
392
+ "node_modules/@esbuild/darwin-arm64": {
393
+ "version": "0.25.5",
394
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
395
+ "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
396
+ "cpu": [
397
+ "arm64"
398
+ ],
399
+ "dev": true,
400
+ "license": "MIT",
401
+ "optional": true,
402
+ "os": [
403
+ "darwin"
404
+ ],
405
+ "engines": {
406
+ "node": ">=18"
407
+ }
408
+ },
409
+ "node_modules/@esbuild/darwin-x64": {
410
+ "version": "0.25.5",
411
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
412
+ "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
413
+ "cpu": [
414
+ "x64"
415
+ ],
416
+ "dev": true,
417
+ "license": "MIT",
418
+ "optional": true,
419
+ "os": [
420
+ "darwin"
421
+ ],
422
+ "engines": {
423
+ "node": ">=18"
424
+ }
425
+ },
426
+ "node_modules/@esbuild/freebsd-arm64": {
427
+ "version": "0.25.5",
428
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
429
+ "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
430
+ "cpu": [
431
+ "arm64"
432
+ ],
433
+ "dev": true,
434
+ "license": "MIT",
435
+ "optional": true,
436
+ "os": [
437
+ "freebsd"
438
+ ],
439
+ "engines": {
440
+ "node": ">=18"
441
+ }
442
+ },
443
+ "node_modules/@esbuild/freebsd-x64": {
444
+ "version": "0.25.5",
445
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
446
+ "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
447
+ "cpu": [
448
+ "x64"
449
+ ],
450
+ "dev": true,
451
+ "license": "MIT",
452
+ "optional": true,
453
+ "os": [
454
+ "freebsd"
455
+ ],
456
+ "engines": {
457
+ "node": ">=18"
458
+ }
459
+ },
460
+ "node_modules/@esbuild/linux-arm": {
461
+ "version": "0.25.5",
462
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
463
+ "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
464
+ "cpu": [
465
+ "arm"
466
+ ],
467
+ "dev": true,
468
+ "license": "MIT",
469
+ "optional": true,
470
+ "os": [
471
+ "linux"
472
+ ],
473
+ "engines": {
474
+ "node": ">=18"
475
+ }
476
+ },
477
+ "node_modules/@esbuild/linux-arm64": {
478
+ "version": "0.25.5",
479
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
480
+ "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
481
+ "cpu": [
482
+ "arm64"
483
+ ],
484
+ "dev": true,
485
+ "license": "MIT",
486
+ "optional": true,
487
+ "os": [
488
+ "linux"
489
+ ],
490
+ "engines": {
491
+ "node": ">=18"
492
+ }
493
+ },
494
+ "node_modules/@esbuild/linux-ia32": {
495
+ "version": "0.25.5",
496
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
497
+ "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
498
+ "cpu": [
499
+ "ia32"
500
+ ],
501
+ "dev": true,
502
+ "license": "MIT",
503
+ "optional": true,
504
+ "os": [
505
+ "linux"
506
+ ],
507
+ "engines": {
508
+ "node": ">=18"
509
+ }
510
+ },
511
+ "node_modules/@esbuild/linux-loong64": {
512
+ "version": "0.25.5",
513
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
514
+ "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
515
+ "cpu": [
516
+ "loong64"
517
+ ],
518
+ "dev": true,
519
+ "license": "MIT",
520
+ "optional": true,
521
+ "os": [
522
+ "linux"
523
+ ],
524
+ "engines": {
525
+ "node": ">=18"
526
+ }
527
+ },
528
+ "node_modules/@esbuild/linux-mips64el": {
529
+ "version": "0.25.5",
530
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
531
+ "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
532
+ "cpu": [
533
+ "mips64el"
534
+ ],
535
+ "dev": true,
536
+ "license": "MIT",
537
+ "optional": true,
538
+ "os": [
539
+ "linux"
540
+ ],
541
+ "engines": {
542
+ "node": ">=18"
543
+ }
544
+ },
545
+ "node_modules/@esbuild/linux-ppc64": {
546
+ "version": "0.25.5",
547
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
548
+ "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
549
+ "cpu": [
550
+ "ppc64"
551
+ ],
552
+ "dev": true,
553
+ "license": "MIT",
554
+ "optional": true,
555
+ "os": [
556
+ "linux"
557
+ ],
558
+ "engines": {
559
+ "node": ">=18"
560
+ }
561
+ },
562
+ "node_modules/@esbuild/linux-riscv64": {
563
+ "version": "0.25.5",
564
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
565
+ "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
566
+ "cpu": [
567
+ "riscv64"
568
+ ],
569
+ "dev": true,
570
+ "license": "MIT",
571
+ "optional": true,
572
+ "os": [
573
+ "linux"
574
+ ],
575
+ "engines": {
576
+ "node": ">=18"
577
+ }
578
+ },
579
+ "node_modules/@esbuild/linux-s390x": {
580
+ "version": "0.25.5",
581
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
582
+ "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
583
+ "cpu": [
584
+ "s390x"
585
+ ],
586
+ "dev": true,
587
+ "license": "MIT",
588
+ "optional": true,
589
+ "os": [
590
+ "linux"
591
+ ],
592
+ "engines": {
593
+ "node": ">=18"
594
+ }
595
+ },
596
+ "node_modules/@esbuild/linux-x64": {
597
+ "version": "0.25.5",
598
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
599
+ "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
600
+ "cpu": [
601
+ "x64"
602
+ ],
603
+ "dev": true,
604
+ "license": "MIT",
605
+ "optional": true,
606
+ "os": [
607
+ "linux"
608
+ ],
609
+ "engines": {
610
+ "node": ">=18"
611
+ }
612
+ },
613
+ "node_modules/@esbuild/netbsd-arm64": {
614
+ "version": "0.25.5",
615
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
616
+ "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
617
+ "cpu": [
618
+ "arm64"
619
+ ],
620
+ "dev": true,
621
+ "license": "MIT",
622
+ "optional": true,
623
+ "os": [
624
+ "netbsd"
625
+ ],
626
+ "engines": {
627
+ "node": ">=18"
628
+ }
629
+ },
630
+ "node_modules/@esbuild/netbsd-x64": {
631
+ "version": "0.25.5",
632
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
633
+ "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
634
+ "cpu": [
635
+ "x64"
636
+ ],
637
+ "dev": true,
638
+ "license": "MIT",
639
+ "optional": true,
640
+ "os": [
641
+ "netbsd"
642
+ ],
643
+ "engines": {
644
+ "node": ">=18"
645
+ }
646
+ },
647
+ "node_modules/@esbuild/openbsd-arm64": {
648
+ "version": "0.25.5",
649
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
650
+ "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
651
+ "cpu": [
652
+ "arm64"
653
+ ],
654
+ "dev": true,
655
+ "license": "MIT",
656
+ "optional": true,
657
+ "os": [
658
+ "openbsd"
659
+ ],
660
+ "engines": {
661
+ "node": ">=18"
662
+ }
663
+ },
664
+ "node_modules/@esbuild/openbsd-x64": {
665
+ "version": "0.25.5",
666
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
667
+ "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
668
+ "cpu": [
669
+ "x64"
670
+ ],
671
+ "dev": true,
672
+ "license": "MIT",
673
+ "optional": true,
674
+ "os": [
675
+ "openbsd"
676
+ ],
677
+ "engines": {
678
+ "node": ">=18"
679
+ }
680
+ },
681
+ "node_modules/@esbuild/sunos-x64": {
682
+ "version": "0.25.5",
683
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
684
+ "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
685
+ "cpu": [
686
+ "x64"
687
+ ],
688
+ "dev": true,
689
+ "license": "MIT",
690
+ "optional": true,
691
+ "os": [
692
+ "sunos"
693
+ ],
694
+ "engines": {
695
+ "node": ">=18"
696
+ }
697
+ },
698
+ "node_modules/@esbuild/win32-arm64": {
699
+ "version": "0.25.5",
700
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
701
+ "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
702
+ "cpu": [
703
+ "arm64"
704
+ ],
705
+ "dev": true,
706
+ "license": "MIT",
707
+ "optional": true,
708
+ "os": [
709
+ "win32"
710
+ ],
711
+ "engines": {
712
+ "node": ">=18"
713
+ }
714
+ },
715
+ "node_modules/@esbuild/win32-ia32": {
716
+ "version": "0.25.5",
717
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
718
+ "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
719
+ "cpu": [
720
+ "ia32"
721
+ ],
722
+ "dev": true,
723
+ "license": "MIT",
724
+ "optional": true,
725
+ "os": [
726
+ "win32"
727
+ ],
728
+ "engines": {
729
+ "node": ">=18"
730
+ }
731
+ },
732
+ "node_modules/@esbuild/win32-x64": {
733
+ "version": "0.25.5",
734
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
735
+ "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
736
+ "cpu": [
737
+ "x64"
738
+ ],
739
+ "dev": true,
740
+ "license": "MIT",
741
+ "optional": true,
742
+ "os": [
743
+ "win32"
744
+ ],
745
+ "engines": {
746
+ "node": ">=18"
747
+ }
748
+ },
749
+ "node_modules/@eslint-community/eslint-utils": {
750
+ "version": "4.7.0",
751
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
752
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
753
+ "dev": true,
754
+ "license": "MIT",
755
+ "dependencies": {
756
+ "eslint-visitor-keys": "^3.4.3"
757
+ },
758
+ "engines": {
759
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
760
+ },
761
+ "funding": {
762
+ "url": "https://opencollective.com/eslint"
763
+ },
764
+ "peerDependencies": {
765
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
766
+ }
767
+ },
768
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
769
+ "version": "3.4.3",
770
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
771
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
772
+ "dev": true,
773
+ "license": "Apache-2.0",
774
+ "engines": {
775
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
776
+ },
777
+ "funding": {
778
+ "url": "https://opencollective.com/eslint"
779
+ }
780
+ },
781
+ "node_modules/@eslint-community/regexpp": {
782
+ "version": "4.12.1",
783
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
784
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
785
+ "dev": true,
786
+ "license": "MIT",
787
+ "engines": {
788
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
789
+ }
790
+ },
791
+ "node_modules/@eslint/config-array": {
792
+ "version": "0.20.0",
793
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
794
+ "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
795
+ "dev": true,
796
+ "license": "Apache-2.0",
797
+ "dependencies": {
798
+ "@eslint/object-schema": "^2.1.6",
799
+ "debug": "^4.3.1",
800
+ "minimatch": "^3.1.2"
801
+ },
802
+ "engines": {
803
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
804
+ }
805
+ },
806
+ "node_modules/@eslint/config-helpers": {
807
+ "version": "0.2.2",
808
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
809
+ "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
810
+ "dev": true,
811
+ "license": "Apache-2.0",
812
+ "engines": {
813
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
814
+ }
815
+ },
816
+ "node_modules/@eslint/core": {
817
+ "version": "0.14.0",
818
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
819
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
820
+ "dev": true,
821
+ "license": "Apache-2.0",
822
+ "dependencies": {
823
+ "@types/json-schema": "^7.0.15"
824
+ },
825
+ "engines": {
826
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
827
+ }
828
+ },
829
+ "node_modules/@eslint/eslintrc": {
830
+ "version": "3.3.1",
831
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
832
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
833
+ "dev": true,
834
+ "license": "MIT",
835
+ "dependencies": {
836
+ "ajv": "^6.12.4",
837
+ "debug": "^4.3.2",
838
+ "espree": "^10.0.1",
839
+ "globals": "^14.0.0",
840
+ "ignore": "^5.2.0",
841
+ "import-fresh": "^3.2.1",
842
+ "js-yaml": "^4.1.0",
843
+ "minimatch": "^3.1.2",
844
+ "strip-json-comments": "^3.1.1"
845
+ },
846
+ "engines": {
847
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
848
+ },
849
+ "funding": {
850
+ "url": "https://opencollective.com/eslint"
851
+ }
852
+ },
853
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
854
+ "version": "14.0.0",
855
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
856
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
857
+ "dev": true,
858
+ "license": "MIT",
859
+ "engines": {
860
+ "node": ">=18"
861
+ },
862
+ "funding": {
863
+ "url": "https://github.com/sponsors/sindresorhus"
864
+ }
865
+ },
866
+ "node_modules/@eslint/js": {
867
+ "version": "9.27.0",
868
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz",
869
+ "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==",
870
+ "dev": true,
871
+ "license": "MIT",
872
+ "engines": {
873
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
874
+ },
875
+ "funding": {
876
+ "url": "https://eslint.org/donate"
877
+ }
878
+ },
879
+ "node_modules/@eslint/object-schema": {
880
+ "version": "2.1.6",
881
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
882
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
883
+ "dev": true,
884
+ "license": "Apache-2.0",
885
+ "engines": {
886
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
887
+ }
888
+ },
889
+ "node_modules/@eslint/plugin-kit": {
890
+ "version": "0.3.1",
891
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
892
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
893
+ "dev": true,
894
+ "license": "Apache-2.0",
895
+ "dependencies": {
896
+ "@eslint/core": "^0.14.0",
897
+ "levn": "^0.4.1"
898
+ },
899
+ "engines": {
900
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
901
+ }
902
+ },
903
+ "node_modules/@humanfs/core": {
904
+ "version": "0.19.1",
905
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
906
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
907
+ "dev": true,
908
+ "license": "Apache-2.0",
909
+ "engines": {
910
+ "node": ">=18.18.0"
911
+ }
912
+ },
913
+ "node_modules/@humanfs/node": {
914
+ "version": "0.16.6",
915
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
916
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
917
+ "dev": true,
918
+ "license": "Apache-2.0",
919
+ "dependencies": {
920
+ "@humanfs/core": "^0.19.1",
921
+ "@humanwhocodes/retry": "^0.3.0"
922
+ },
923
+ "engines": {
924
+ "node": ">=18.18.0"
925
+ }
926
+ },
927
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
928
+ "version": "0.3.1",
929
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
930
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
931
+ "dev": true,
932
+ "license": "Apache-2.0",
933
+ "engines": {
934
+ "node": ">=18.18"
935
+ },
936
+ "funding": {
937
+ "type": "github",
938
+ "url": "https://github.com/sponsors/nzakas"
939
+ }
940
+ },
941
+ "node_modules/@humanwhocodes/module-importer": {
942
+ "version": "1.0.1",
943
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
944
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
945
+ "dev": true,
946
+ "license": "Apache-2.0",
947
+ "engines": {
948
+ "node": ">=12.22"
949
+ },
950
+ "funding": {
951
+ "type": "github",
952
+ "url": "https://github.com/sponsors/nzakas"
953
+ }
954
+ },
955
+ "node_modules/@humanwhocodes/retry": {
956
+ "version": "0.4.3",
957
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
958
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
959
+ "dev": true,
960
+ "license": "Apache-2.0",
961
+ "engines": {
962
+ "node": ">=18.18"
963
+ },
964
+ "funding": {
965
+ "type": "github",
966
+ "url": "https://github.com/sponsors/nzakas"
967
+ }
968
+ },
969
+ "node_modules/@jridgewell/gen-mapping": {
970
+ "version": "0.3.8",
971
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
972
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
973
+ "dev": true,
974
+ "license": "MIT",
975
+ "dependencies": {
976
+ "@jridgewell/set-array": "^1.2.1",
977
+ "@jridgewell/sourcemap-codec": "^1.4.10",
978
+ "@jridgewell/trace-mapping": "^0.3.24"
979
+ },
980
+ "engines": {
981
+ "node": ">=6.0.0"
982
+ }
983
+ },
984
+ "node_modules/@jridgewell/resolve-uri": {
985
+ "version": "3.1.2",
986
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
987
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
988
+ "dev": true,
989
+ "license": "MIT",
990
+ "engines": {
991
+ "node": ">=6.0.0"
992
+ }
993
+ },
994
+ "node_modules/@jridgewell/set-array": {
995
+ "version": "1.2.1",
996
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
997
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
998
+ "dev": true,
999
+ "license": "MIT",
1000
+ "engines": {
1001
+ "node": ">=6.0.0"
1002
+ }
1003
+ },
1004
+ "node_modules/@jridgewell/sourcemap-codec": {
1005
+ "version": "1.5.0",
1006
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
1007
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
1008
+ "dev": true,
1009
+ "license": "MIT"
1010
+ },
1011
+ "node_modules/@jridgewell/trace-mapping": {
1012
+ "version": "0.3.25",
1013
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
1014
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
1015
+ "dev": true,
1016
+ "license": "MIT",
1017
+ "dependencies": {
1018
+ "@jridgewell/resolve-uri": "^3.1.0",
1019
+ "@jridgewell/sourcemap-codec": "^1.4.14"
1020
+ }
1021
+ },
1022
+ "node_modules/@rolldown/pluginutils": {
1023
+ "version": "1.0.0-beta.9",
1024
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz",
1025
+ "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==",
1026
+ "dev": true,
1027
+ "license": "MIT"
1028
+ },
1029
+ "node_modules/@rollup/rollup-android-arm-eabi": {
1030
+ "version": "4.41.1",
1031
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
1032
+ "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
1033
+ "cpu": [
1034
+ "arm"
1035
+ ],
1036
+ "dev": true,
1037
+ "license": "MIT",
1038
+ "optional": true,
1039
+ "os": [
1040
+ "android"
1041
+ ]
1042
+ },
1043
+ "node_modules/@rollup/rollup-android-arm64": {
1044
+ "version": "4.41.1",
1045
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
1046
+ "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
1047
+ "cpu": [
1048
+ "arm64"
1049
+ ],
1050
+ "dev": true,
1051
+ "license": "MIT",
1052
+ "optional": true,
1053
+ "os": [
1054
+ "android"
1055
+ ]
1056
+ },
1057
+ "node_modules/@rollup/rollup-darwin-arm64": {
1058
+ "version": "4.41.1",
1059
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
1060
+ "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
1061
+ "cpu": [
1062
+ "arm64"
1063
+ ],
1064
+ "dev": true,
1065
+ "license": "MIT",
1066
+ "optional": true,
1067
+ "os": [
1068
+ "darwin"
1069
+ ]
1070
+ },
1071
+ "node_modules/@rollup/rollup-darwin-x64": {
1072
+ "version": "4.41.1",
1073
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
1074
+ "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
1075
+ "cpu": [
1076
+ "x64"
1077
+ ],
1078
+ "dev": true,
1079
+ "license": "MIT",
1080
+ "optional": true,
1081
+ "os": [
1082
+ "darwin"
1083
+ ]
1084
+ },
1085
+ "node_modules/@rollup/rollup-freebsd-arm64": {
1086
+ "version": "4.41.1",
1087
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
1088
+ "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
1089
+ "cpu": [
1090
+ "arm64"
1091
+ ],
1092
+ "dev": true,
1093
+ "license": "MIT",
1094
+ "optional": true,
1095
+ "os": [
1096
+ "freebsd"
1097
+ ]
1098
+ },
1099
+ "node_modules/@rollup/rollup-freebsd-x64": {
1100
+ "version": "4.41.1",
1101
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
1102
+ "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
1103
+ "cpu": [
1104
+ "x64"
1105
+ ],
1106
+ "dev": true,
1107
+ "license": "MIT",
1108
+ "optional": true,
1109
+ "os": [
1110
+ "freebsd"
1111
+ ]
1112
+ },
1113
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1114
+ "version": "4.41.1",
1115
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
1116
+ "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
1117
+ "cpu": [
1118
+ "arm"
1119
+ ],
1120
+ "dev": true,
1121
+ "license": "MIT",
1122
+ "optional": true,
1123
+ "os": [
1124
+ "linux"
1125
+ ]
1126
+ },
1127
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1128
+ "version": "4.41.1",
1129
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
1130
+ "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
1131
+ "cpu": [
1132
+ "arm"
1133
+ ],
1134
+ "dev": true,
1135
+ "license": "MIT",
1136
+ "optional": true,
1137
+ "os": [
1138
+ "linux"
1139
+ ]
1140
+ },
1141
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
1142
+ "version": "4.41.1",
1143
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
1144
+ "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
1145
+ "cpu": [
1146
+ "arm64"
1147
+ ],
1148
+ "dev": true,
1149
+ "license": "MIT",
1150
+ "optional": true,
1151
+ "os": [
1152
+ "linux"
1153
+ ]
1154
+ },
1155
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
1156
+ "version": "4.41.1",
1157
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
1158
+ "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
1159
+ "cpu": [
1160
+ "arm64"
1161
+ ],
1162
+ "dev": true,
1163
+ "license": "MIT",
1164
+ "optional": true,
1165
+ "os": [
1166
+ "linux"
1167
+ ]
1168
+ },
1169
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
1170
+ "version": "4.41.1",
1171
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
1172
+ "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
1173
+ "cpu": [
1174
+ "loong64"
1175
+ ],
1176
+ "dev": true,
1177
+ "license": "MIT",
1178
+ "optional": true,
1179
+ "os": [
1180
+ "linux"
1181
+ ]
1182
+ },
1183
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
1184
+ "version": "4.41.1",
1185
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
1186
+ "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
1187
+ "cpu": [
1188
+ "ppc64"
1189
+ ],
1190
+ "dev": true,
1191
+ "license": "MIT",
1192
+ "optional": true,
1193
+ "os": [
1194
+ "linux"
1195
+ ]
1196
+ },
1197
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1198
+ "version": "4.41.1",
1199
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
1200
+ "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
1201
+ "cpu": [
1202
+ "riscv64"
1203
+ ],
1204
+ "dev": true,
1205
+ "license": "MIT",
1206
+ "optional": true,
1207
+ "os": [
1208
+ "linux"
1209
+ ]
1210
+ },
1211
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1212
+ "version": "4.41.1",
1213
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
1214
+ "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
1215
+ "cpu": [
1216
+ "riscv64"
1217
+ ],
1218
+ "dev": true,
1219
+ "license": "MIT",
1220
+ "optional": true,
1221
+ "os": [
1222
+ "linux"
1223
+ ]
1224
+ },
1225
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1226
+ "version": "4.41.1",
1227
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
1228
+ "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
1229
+ "cpu": [
1230
+ "s390x"
1231
+ ],
1232
+ "dev": true,
1233
+ "license": "MIT",
1234
+ "optional": true,
1235
+ "os": [
1236
+ "linux"
1237
+ ]
1238
+ },
1239
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1240
+ "version": "4.41.1",
1241
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
1242
+ "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
1243
+ "cpu": [
1244
+ "x64"
1245
+ ],
1246
+ "dev": true,
1247
+ "license": "MIT",
1248
+ "optional": true,
1249
+ "os": [
1250
+ "linux"
1251
+ ]
1252
+ },
1253
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1254
+ "version": "4.41.1",
1255
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
1256
+ "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
1257
+ "cpu": [
1258
+ "x64"
1259
+ ],
1260
+ "dev": true,
1261
+ "license": "MIT",
1262
+ "optional": true,
1263
+ "os": [
1264
+ "linux"
1265
+ ]
1266
+ },
1267
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1268
+ "version": "4.41.1",
1269
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
1270
+ "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
1271
+ "cpu": [
1272
+ "arm64"
1273
+ ],
1274
+ "dev": true,
1275
+ "license": "MIT",
1276
+ "optional": true,
1277
+ "os": [
1278
+ "win32"
1279
+ ]
1280
+ },
1281
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1282
+ "version": "4.41.1",
1283
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
1284
+ "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
1285
+ "cpu": [
1286
+ "ia32"
1287
+ ],
1288
+ "dev": true,
1289
+ "license": "MIT",
1290
+ "optional": true,
1291
+ "os": [
1292
+ "win32"
1293
+ ]
1294
+ },
1295
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1296
+ "version": "4.41.1",
1297
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
1298
+ "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
1299
+ "cpu": [
1300
+ "x64"
1301
+ ],
1302
+ "dev": true,
1303
+ "license": "MIT",
1304
+ "optional": true,
1305
+ "os": [
1306
+ "win32"
1307
+ ]
1308
+ },
1309
+ "node_modules/@types/babel__core": {
1310
+ "version": "7.20.5",
1311
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1312
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1313
+ "dev": true,
1314
+ "license": "MIT",
1315
+ "dependencies": {
1316
+ "@babel/parser": "^7.20.7",
1317
+ "@babel/types": "^7.20.7",
1318
+ "@types/babel__generator": "*",
1319
+ "@types/babel__template": "*",
1320
+ "@types/babel__traverse": "*"
1321
+ }
1322
+ },
1323
+ "node_modules/@types/babel__generator": {
1324
+ "version": "7.27.0",
1325
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1326
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1327
+ "dev": true,
1328
+ "license": "MIT",
1329
+ "dependencies": {
1330
+ "@babel/types": "^7.0.0"
1331
+ }
1332
+ },
1333
+ "node_modules/@types/babel__template": {
1334
+ "version": "7.4.4",
1335
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1336
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1337
+ "dev": true,
1338
+ "license": "MIT",
1339
+ "dependencies": {
1340
+ "@babel/parser": "^7.1.0",
1341
+ "@babel/types": "^7.0.0"
1342
+ }
1343
+ },
1344
+ "node_modules/@types/babel__traverse": {
1345
+ "version": "7.20.7",
1346
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
1347
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
1348
+ "dev": true,
1349
+ "license": "MIT",
1350
+ "dependencies": {
1351
+ "@babel/types": "^7.20.7"
1352
+ }
1353
+ },
1354
+ "node_modules/@types/estree": {
1355
+ "version": "1.0.7",
1356
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
1357
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
1358
+ "dev": true,
1359
+ "license": "MIT"
1360
+ },
1361
+ "node_modules/@types/json-schema": {
1362
+ "version": "7.0.15",
1363
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1364
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
1365
+ "dev": true,
1366
+ "license": "MIT"
1367
+ },
1368
+ "node_modules/@types/react": {
1369
+ "version": "19.1.6",
1370
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz",
1371
+ "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==",
1372
+ "dev": true,
1373
+ "license": "MIT",
1374
+ "dependencies": {
1375
+ "csstype": "^3.0.2"
1376
+ }
1377
+ },
1378
+ "node_modules/@types/react-dom": {
1379
+ "version": "19.1.5",
1380
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz",
1381
+ "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==",
1382
+ "dev": true,
1383
+ "license": "MIT",
1384
+ "peerDependencies": {
1385
+ "@types/react": "^19.0.0"
1386
+ }
1387
+ },
1388
+ "node_modules/@types/trusted-types": {
1389
+ "version": "2.0.7",
1390
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
1391
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
1392
+ "license": "MIT",
1393
+ "optional": true
1394
+ },
1395
+ "node_modules/@vitejs/plugin-react": {
1396
+ "version": "4.5.0",
1397
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz",
1398
+ "integrity": "sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==",
1399
+ "dev": true,
1400
+ "license": "MIT",
1401
+ "dependencies": {
1402
+ "@babel/core": "^7.26.10",
1403
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
1404
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
1405
+ "@rolldown/pluginutils": "1.0.0-beta.9",
1406
+ "@types/babel__core": "^7.20.5",
1407
+ "react-refresh": "^0.17.0"
1408
+ },
1409
+ "engines": {
1410
+ "node": "^14.18.0 || >=16.0.0"
1411
+ },
1412
+ "peerDependencies": {
1413
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
1414
+ }
1415
+ },
1416
+ "node_modules/acorn": {
1417
+ "version": "8.14.1",
1418
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
1419
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
1420
+ "dev": true,
1421
+ "license": "MIT",
1422
+ "bin": {
1423
+ "acorn": "bin/acorn"
1424
+ },
1425
+ "engines": {
1426
+ "node": ">=0.4.0"
1427
+ }
1428
+ },
1429
+ "node_modules/acorn-jsx": {
1430
+ "version": "5.3.2",
1431
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1432
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1433
+ "dev": true,
1434
+ "license": "MIT",
1435
+ "peerDependencies": {
1436
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1437
+ }
1438
+ },
1439
+ "node_modules/ajv": {
1440
+ "version": "6.12.6",
1441
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1442
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1443
+ "dev": true,
1444
+ "license": "MIT",
1445
+ "dependencies": {
1446
+ "fast-deep-equal": "^3.1.1",
1447
+ "fast-json-stable-stringify": "^2.0.0",
1448
+ "json-schema-traverse": "^0.4.1",
1449
+ "uri-js": "^4.2.2"
1450
+ },
1451
+ "funding": {
1452
+ "type": "github",
1453
+ "url": "https://github.com/sponsors/epoberezkin"
1454
+ }
1455
+ },
1456
+ "node_modules/ansi-styles": {
1457
+ "version": "4.3.0",
1458
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1459
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1460
+ "dev": true,
1461
+ "license": "MIT",
1462
+ "dependencies": {
1463
+ "color-convert": "^2.0.1"
1464
+ },
1465
+ "engines": {
1466
+ "node": ">=8"
1467
+ },
1468
+ "funding": {
1469
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1470
+ }
1471
+ },
1472
+ "node_modules/argparse": {
1473
+ "version": "2.0.1",
1474
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1475
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1476
+ "dev": true,
1477
+ "license": "Python-2.0"
1478
+ },
1479
+ "node_modules/balanced-match": {
1480
+ "version": "1.0.2",
1481
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1482
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1483
+ "dev": true,
1484
+ "license": "MIT"
1485
+ },
1486
+ "node_modules/brace-expansion": {
1487
+ "version": "1.1.11",
1488
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1489
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1490
+ "dev": true,
1491
+ "license": "MIT",
1492
+ "dependencies": {
1493
+ "balanced-match": "^1.0.0",
1494
+ "concat-map": "0.0.1"
1495
+ }
1496
+ },
1497
+ "node_modules/browserslist": {
1498
+ "version": "4.25.0",
1499
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
1500
+ "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
1501
+ "dev": true,
1502
+ "funding": [
1503
+ {
1504
+ "type": "opencollective",
1505
+ "url": "https://opencollective.com/browserslist"
1506
+ },
1507
+ {
1508
+ "type": "tidelift",
1509
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1510
+ },
1511
+ {
1512
+ "type": "github",
1513
+ "url": "https://github.com/sponsors/ai"
1514
+ }
1515
+ ],
1516
+ "license": "MIT",
1517
+ "dependencies": {
1518
+ "caniuse-lite": "^1.0.30001718",
1519
+ "electron-to-chromium": "^1.5.160",
1520
+ "node-releases": "^2.0.19",
1521
+ "update-browserslist-db": "^1.1.3"
1522
+ },
1523
+ "bin": {
1524
+ "browserslist": "cli.js"
1525
+ },
1526
+ "engines": {
1527
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1528
+ }
1529
+ },
1530
+ "node_modules/callsites": {
1531
+ "version": "3.1.0",
1532
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1533
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1534
+ "dev": true,
1535
+ "license": "MIT",
1536
+ "engines": {
1537
+ "node": ">=6"
1538
+ }
1539
+ },
1540
+ "node_modules/caniuse-lite": {
1541
+ "version": "1.0.30001720",
1542
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz",
1543
+ "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==",
1544
+ "dev": true,
1545
+ "funding": [
1546
+ {
1547
+ "type": "opencollective",
1548
+ "url": "https://opencollective.com/browserslist"
1549
+ },
1550
+ {
1551
+ "type": "tidelift",
1552
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1553
+ },
1554
+ {
1555
+ "type": "github",
1556
+ "url": "https://github.com/sponsors/ai"
1557
+ }
1558
+ ],
1559
+ "license": "CC-BY-4.0"
1560
+ },
1561
+ "node_modules/chalk": {
1562
+ "version": "4.1.2",
1563
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1564
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1565
+ "dev": true,
1566
+ "license": "MIT",
1567
+ "dependencies": {
1568
+ "ansi-styles": "^4.1.0",
1569
+ "supports-color": "^7.1.0"
1570
+ },
1571
+ "engines": {
1572
+ "node": ">=10"
1573
+ },
1574
+ "funding": {
1575
+ "url": "https://github.com/chalk/chalk?sponsor=1"
1576
+ }
1577
+ },
1578
+ "node_modules/color-convert": {
1579
+ "version": "2.0.1",
1580
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1581
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1582
+ "dev": true,
1583
+ "license": "MIT",
1584
+ "dependencies": {
1585
+ "color-name": "~1.1.4"
1586
+ },
1587
+ "engines": {
1588
+ "node": ">=7.0.0"
1589
+ }
1590
+ },
1591
+ "node_modules/color-name": {
1592
+ "version": "1.1.4",
1593
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1594
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1595
+ "dev": true,
1596
+ "license": "MIT"
1597
+ },
1598
+ "node_modules/concat-map": {
1599
+ "version": "0.0.1",
1600
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1601
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1602
+ "dev": true,
1603
+ "license": "MIT"
1604
+ },
1605
+ "node_modules/convert-source-map": {
1606
+ "version": "2.0.0",
1607
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1608
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1609
+ "dev": true,
1610
+ "license": "MIT"
1611
+ },
1612
+ "node_modules/cross-spawn": {
1613
+ "version": "7.0.6",
1614
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1615
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1616
+ "dev": true,
1617
+ "license": "MIT",
1618
+ "dependencies": {
1619
+ "path-key": "^3.1.0",
1620
+ "shebang-command": "^2.0.0",
1621
+ "which": "^2.0.1"
1622
+ },
1623
+ "engines": {
1624
+ "node": ">= 8"
1625
+ }
1626
+ },
1627
+ "node_modules/csstype": {
1628
+ "version": "3.1.3",
1629
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1630
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1631
+ "dev": true,
1632
+ "license": "MIT"
1633
+ },
1634
+ "node_modules/debug": {
1635
+ "version": "4.4.1",
1636
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
1637
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
1638
+ "dev": true,
1639
+ "license": "MIT",
1640
+ "dependencies": {
1641
+ "ms": "^2.1.3"
1642
+ },
1643
+ "engines": {
1644
+ "node": ">=6.0"
1645
+ },
1646
+ "peerDependenciesMeta": {
1647
+ "supports-color": {
1648
+ "optional": true
1649
+ }
1650
+ }
1651
+ },
1652
+ "node_modules/deep-is": {
1653
+ "version": "0.1.4",
1654
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1655
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1656
+ "dev": true,
1657
+ "license": "MIT"
1658
+ },
1659
+ "node_modules/dompurify": {
1660
+ "version": "3.2.6",
1661
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz",
1662
+ "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
1663
+ "license": "(MPL-2.0 OR Apache-2.0)",
1664
+ "optionalDependencies": {
1665
+ "@types/trusted-types": "^2.0.7"
1666
+ }
1667
+ },
1668
+ "node_modules/electron-to-chromium": {
1669
+ "version": "1.5.161",
1670
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz",
1671
+ "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==",
1672
+ "dev": true,
1673
+ "license": "ISC"
1674
+ },
1675
+ "node_modules/esbuild": {
1676
+ "version": "0.25.5",
1677
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
1678
+ "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
1679
+ "dev": true,
1680
+ "hasInstallScript": true,
1681
+ "license": "MIT",
1682
+ "bin": {
1683
+ "esbuild": "bin/esbuild"
1684
+ },
1685
+ "engines": {
1686
+ "node": ">=18"
1687
+ },
1688
+ "optionalDependencies": {
1689
+ "@esbuild/aix-ppc64": "0.25.5",
1690
+ "@esbuild/android-arm": "0.25.5",
1691
+ "@esbuild/android-arm64": "0.25.5",
1692
+ "@esbuild/android-x64": "0.25.5",
1693
+ "@esbuild/darwin-arm64": "0.25.5",
1694
+ "@esbuild/darwin-x64": "0.25.5",
1695
+ "@esbuild/freebsd-arm64": "0.25.5",
1696
+ "@esbuild/freebsd-x64": "0.25.5",
1697
+ "@esbuild/linux-arm": "0.25.5",
1698
+ "@esbuild/linux-arm64": "0.25.5",
1699
+ "@esbuild/linux-ia32": "0.25.5",
1700
+ "@esbuild/linux-loong64": "0.25.5",
1701
+ "@esbuild/linux-mips64el": "0.25.5",
1702
+ "@esbuild/linux-ppc64": "0.25.5",
1703
+ "@esbuild/linux-riscv64": "0.25.5",
1704
+ "@esbuild/linux-s390x": "0.25.5",
1705
+ "@esbuild/linux-x64": "0.25.5",
1706
+ "@esbuild/netbsd-arm64": "0.25.5",
1707
+ "@esbuild/netbsd-x64": "0.25.5",
1708
+ "@esbuild/openbsd-arm64": "0.25.5",
1709
+ "@esbuild/openbsd-x64": "0.25.5",
1710
+ "@esbuild/sunos-x64": "0.25.5",
1711
+ "@esbuild/win32-arm64": "0.25.5",
1712
+ "@esbuild/win32-ia32": "0.25.5",
1713
+ "@esbuild/win32-x64": "0.25.5"
1714
+ }
1715
+ },
1716
+ "node_modules/escalade": {
1717
+ "version": "3.2.0",
1718
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1719
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1720
+ "dev": true,
1721
+ "license": "MIT",
1722
+ "engines": {
1723
+ "node": ">=6"
1724
+ }
1725
+ },
1726
+ "node_modules/escape-string-regexp": {
1727
+ "version": "4.0.0",
1728
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1729
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1730
+ "dev": true,
1731
+ "license": "MIT",
1732
+ "engines": {
1733
+ "node": ">=10"
1734
+ },
1735
+ "funding": {
1736
+ "url": "https://github.com/sponsors/sindresorhus"
1737
+ }
1738
+ },
1739
+ "node_modules/eslint": {
1740
+ "version": "9.27.0",
1741
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz",
1742
+ "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==",
1743
+ "dev": true,
1744
+ "license": "MIT",
1745
+ "dependencies": {
1746
+ "@eslint-community/eslint-utils": "^4.2.0",
1747
+ "@eslint-community/regexpp": "^4.12.1",
1748
+ "@eslint/config-array": "^0.20.0",
1749
+ "@eslint/config-helpers": "^0.2.1",
1750
+ "@eslint/core": "^0.14.0",
1751
+ "@eslint/eslintrc": "^3.3.1",
1752
+ "@eslint/js": "9.27.0",
1753
+ "@eslint/plugin-kit": "^0.3.1",
1754
+ "@humanfs/node": "^0.16.6",
1755
+ "@humanwhocodes/module-importer": "^1.0.1",
1756
+ "@humanwhocodes/retry": "^0.4.2",
1757
+ "@types/estree": "^1.0.6",
1758
+ "@types/json-schema": "^7.0.15",
1759
+ "ajv": "^6.12.4",
1760
+ "chalk": "^4.0.0",
1761
+ "cross-spawn": "^7.0.6",
1762
+ "debug": "^4.3.2",
1763
+ "escape-string-regexp": "^4.0.0",
1764
+ "eslint-scope": "^8.3.0",
1765
+ "eslint-visitor-keys": "^4.2.0",
1766
+ "espree": "^10.3.0",
1767
+ "esquery": "^1.5.0",
1768
+ "esutils": "^2.0.2",
1769
+ "fast-deep-equal": "^3.1.3",
1770
+ "file-entry-cache": "^8.0.0",
1771
+ "find-up": "^5.0.0",
1772
+ "glob-parent": "^6.0.2",
1773
+ "ignore": "^5.2.0",
1774
+ "imurmurhash": "^0.1.4",
1775
+ "is-glob": "^4.0.0",
1776
+ "json-stable-stringify-without-jsonify": "^1.0.1",
1777
+ "lodash.merge": "^4.6.2",
1778
+ "minimatch": "^3.1.2",
1779
+ "natural-compare": "^1.4.0",
1780
+ "optionator": "^0.9.3"
1781
+ },
1782
+ "bin": {
1783
+ "eslint": "bin/eslint.js"
1784
+ },
1785
+ "engines": {
1786
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1787
+ },
1788
+ "funding": {
1789
+ "url": "https://eslint.org/donate"
1790
+ },
1791
+ "peerDependencies": {
1792
+ "jiti": "*"
1793
+ },
1794
+ "peerDependenciesMeta": {
1795
+ "jiti": {
1796
+ "optional": true
1797
+ }
1798
+ }
1799
+ },
1800
+ "node_modules/eslint-plugin-react-hooks": {
1801
+ "version": "5.2.0",
1802
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
1803
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
1804
+ "dev": true,
1805
+ "license": "MIT",
1806
+ "engines": {
1807
+ "node": ">=10"
1808
+ },
1809
+ "peerDependencies": {
1810
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
1811
+ }
1812
+ },
1813
+ "node_modules/eslint-plugin-react-refresh": {
1814
+ "version": "0.4.20",
1815
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
1816
+ "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
1817
+ "dev": true,
1818
+ "license": "MIT",
1819
+ "peerDependencies": {
1820
+ "eslint": ">=8.40"
1821
+ }
1822
+ },
1823
+ "node_modules/eslint-scope": {
1824
+ "version": "8.3.0",
1825
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
1826
+ "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
1827
+ "dev": true,
1828
+ "license": "BSD-2-Clause",
1829
+ "dependencies": {
1830
+ "esrecurse": "^4.3.0",
1831
+ "estraverse": "^5.2.0"
1832
+ },
1833
+ "engines": {
1834
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1835
+ },
1836
+ "funding": {
1837
+ "url": "https://opencollective.com/eslint"
1838
+ }
1839
+ },
1840
+ "node_modules/eslint-visitor-keys": {
1841
+ "version": "4.2.0",
1842
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
1843
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
1844
+ "dev": true,
1845
+ "license": "Apache-2.0",
1846
+ "engines": {
1847
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1848
+ },
1849
+ "funding": {
1850
+ "url": "https://opencollective.com/eslint"
1851
+ }
1852
+ },
1853
+ "node_modules/espree": {
1854
+ "version": "10.3.0",
1855
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
1856
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
1857
+ "dev": true,
1858
+ "license": "BSD-2-Clause",
1859
+ "dependencies": {
1860
+ "acorn": "^8.14.0",
1861
+ "acorn-jsx": "^5.3.2",
1862
+ "eslint-visitor-keys": "^4.2.0"
1863
+ },
1864
+ "engines": {
1865
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1866
+ },
1867
+ "funding": {
1868
+ "url": "https://opencollective.com/eslint"
1869
+ }
1870
+ },
1871
+ "node_modules/esquery": {
1872
+ "version": "1.6.0",
1873
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
1874
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
1875
+ "dev": true,
1876
+ "license": "BSD-3-Clause",
1877
+ "dependencies": {
1878
+ "estraverse": "^5.1.0"
1879
+ },
1880
+ "engines": {
1881
+ "node": ">=0.10"
1882
+ }
1883
+ },
1884
+ "node_modules/esrecurse": {
1885
+ "version": "4.3.0",
1886
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1887
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1888
+ "dev": true,
1889
+ "license": "BSD-2-Clause",
1890
+ "dependencies": {
1891
+ "estraverse": "^5.2.0"
1892
+ },
1893
+ "engines": {
1894
+ "node": ">=4.0"
1895
+ }
1896
+ },
1897
+ "node_modules/estraverse": {
1898
+ "version": "5.3.0",
1899
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1900
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1901
+ "dev": true,
1902
+ "license": "BSD-2-Clause",
1903
+ "engines": {
1904
+ "node": ">=4.0"
1905
+ }
1906
+ },
1907
+ "node_modules/esutils": {
1908
+ "version": "2.0.3",
1909
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1910
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1911
+ "dev": true,
1912
+ "license": "BSD-2-Clause",
1913
+ "engines": {
1914
+ "node": ">=0.10.0"
1915
+ }
1916
+ },
1917
+ "node_modules/fast-deep-equal": {
1918
+ "version": "3.1.3",
1919
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1920
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1921
+ "dev": true,
1922
+ "license": "MIT"
1923
+ },
1924
+ "node_modules/fast-json-stable-stringify": {
1925
+ "version": "2.1.0",
1926
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1927
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1928
+ "dev": true,
1929
+ "license": "MIT"
1930
+ },
1931
+ "node_modules/fast-levenshtein": {
1932
+ "version": "2.0.6",
1933
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1934
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1935
+ "dev": true,
1936
+ "license": "MIT"
1937
+ },
1938
+ "node_modules/fdir": {
1939
+ "version": "6.4.5",
1940
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz",
1941
+ "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==",
1942
+ "dev": true,
1943
+ "license": "MIT",
1944
+ "peerDependencies": {
1945
+ "picomatch": "^3 || ^4"
1946
+ },
1947
+ "peerDependenciesMeta": {
1948
+ "picomatch": {
1949
+ "optional": true
1950
+ }
1951
+ }
1952
+ },
1953
+ "node_modules/file-entry-cache": {
1954
+ "version": "8.0.0",
1955
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
1956
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
1957
+ "dev": true,
1958
+ "license": "MIT",
1959
+ "dependencies": {
1960
+ "flat-cache": "^4.0.0"
1961
+ },
1962
+ "engines": {
1963
+ "node": ">=16.0.0"
1964
+ }
1965
+ },
1966
+ "node_modules/find-up": {
1967
+ "version": "5.0.0",
1968
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1969
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1970
+ "dev": true,
1971
+ "license": "MIT",
1972
+ "dependencies": {
1973
+ "locate-path": "^6.0.0",
1974
+ "path-exists": "^4.0.0"
1975
+ },
1976
+ "engines": {
1977
+ "node": ">=10"
1978
+ },
1979
+ "funding": {
1980
+ "url": "https://github.com/sponsors/sindresorhus"
1981
+ }
1982
+ },
1983
+ "node_modules/flat-cache": {
1984
+ "version": "4.0.1",
1985
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
1986
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
1987
+ "dev": true,
1988
+ "license": "MIT",
1989
+ "dependencies": {
1990
+ "flatted": "^3.2.9",
1991
+ "keyv": "^4.5.4"
1992
+ },
1993
+ "engines": {
1994
+ "node": ">=16"
1995
+ }
1996
+ },
1997
+ "node_modules/flatted": {
1998
+ "version": "3.3.3",
1999
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
2000
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
2001
+ "dev": true,
2002
+ "license": "ISC"
2003
+ },
2004
+ "node_modules/fsevents": {
2005
+ "version": "2.3.3",
2006
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
2007
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
2008
+ "dev": true,
2009
+ "hasInstallScript": true,
2010
+ "license": "MIT",
2011
+ "optional": true,
2012
+ "os": [
2013
+ "darwin"
2014
+ ],
2015
+ "engines": {
2016
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2017
+ }
2018
+ },
2019
+ "node_modules/gensync": {
2020
+ "version": "1.0.0-beta.2",
2021
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
2022
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
2023
+ "dev": true,
2024
+ "license": "MIT",
2025
+ "engines": {
2026
+ "node": ">=6.9.0"
2027
+ }
2028
+ },
2029
+ "node_modules/glob-parent": {
2030
+ "version": "6.0.2",
2031
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
2032
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
2033
+ "dev": true,
2034
+ "license": "ISC",
2035
+ "dependencies": {
2036
+ "is-glob": "^4.0.3"
2037
+ },
2038
+ "engines": {
2039
+ "node": ">=10.13.0"
2040
+ }
2041
+ },
2042
+ "node_modules/globals": {
2043
+ "version": "16.2.0",
2044
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz",
2045
+ "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==",
2046
+ "dev": true,
2047
+ "license": "MIT",
2048
+ "engines": {
2049
+ "node": ">=18"
2050
+ },
2051
+ "funding": {
2052
+ "url": "https://github.com/sponsors/sindresorhus"
2053
+ }
2054
+ },
2055
+ "node_modules/has-flag": {
2056
+ "version": "4.0.0",
2057
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2058
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2059
+ "dev": true,
2060
+ "license": "MIT",
2061
+ "engines": {
2062
+ "node": ">=8"
2063
+ }
2064
+ },
2065
+ "node_modules/ignore": {
2066
+ "version": "5.3.2",
2067
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
2068
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
2069
+ "dev": true,
2070
+ "license": "MIT",
2071
+ "engines": {
2072
+ "node": ">= 4"
2073
+ }
2074
+ },
2075
+ "node_modules/import-fresh": {
2076
+ "version": "3.3.1",
2077
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
2078
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
2079
+ "dev": true,
2080
+ "license": "MIT",
2081
+ "dependencies": {
2082
+ "parent-module": "^1.0.0",
2083
+ "resolve-from": "^4.0.0"
2084
+ },
2085
+ "engines": {
2086
+ "node": ">=6"
2087
+ },
2088
+ "funding": {
2089
+ "url": "https://github.com/sponsors/sindresorhus"
2090
+ }
2091
+ },
2092
+ "node_modules/imurmurhash": {
2093
+ "version": "0.1.4",
2094
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2095
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
2096
+ "dev": true,
2097
+ "license": "MIT",
2098
+ "engines": {
2099
+ "node": ">=0.8.19"
2100
+ }
2101
+ },
2102
+ "node_modules/is-extglob": {
2103
+ "version": "2.1.1",
2104
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2105
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2106
+ "dev": true,
2107
+ "license": "MIT",
2108
+ "engines": {
2109
+ "node": ">=0.10.0"
2110
+ }
2111
+ },
2112
+ "node_modules/is-glob": {
2113
+ "version": "4.0.3",
2114
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2115
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2116
+ "dev": true,
2117
+ "license": "MIT",
2118
+ "dependencies": {
2119
+ "is-extglob": "^2.1.1"
2120
+ },
2121
+ "engines": {
2122
+ "node": ">=0.10.0"
2123
+ }
2124
+ },
2125
+ "node_modules/isexe": {
2126
+ "version": "2.0.0",
2127
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2128
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2129
+ "dev": true,
2130
+ "license": "ISC"
2131
+ },
2132
+ "node_modules/js-tokens": {
2133
+ "version": "4.0.0",
2134
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
2135
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
2136
+ "dev": true,
2137
+ "license": "MIT"
2138
+ },
2139
+ "node_modules/js-yaml": {
2140
+ "version": "4.1.0",
2141
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2142
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2143
+ "dev": true,
2144
+ "license": "MIT",
2145
+ "dependencies": {
2146
+ "argparse": "^2.0.1"
2147
+ },
2148
+ "bin": {
2149
+ "js-yaml": "bin/js-yaml.js"
2150
+ }
2151
+ },
2152
+ "node_modules/jsesc": {
2153
+ "version": "3.1.0",
2154
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
2155
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
2156
+ "dev": true,
2157
+ "license": "MIT",
2158
+ "bin": {
2159
+ "jsesc": "bin/jsesc"
2160
+ },
2161
+ "engines": {
2162
+ "node": ">=6"
2163
+ }
2164
+ },
2165
+ "node_modules/json-buffer": {
2166
+ "version": "3.0.1",
2167
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2168
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
2169
+ "dev": true,
2170
+ "license": "MIT"
2171
+ },
2172
+ "node_modules/json-schema-traverse": {
2173
+ "version": "0.4.1",
2174
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2175
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2176
+ "dev": true,
2177
+ "license": "MIT"
2178
+ },
2179
+ "node_modules/json-stable-stringify-without-jsonify": {
2180
+ "version": "1.0.1",
2181
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2182
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
2183
+ "dev": true,
2184
+ "license": "MIT"
2185
+ },
2186
+ "node_modules/json5": {
2187
+ "version": "2.2.3",
2188
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
2189
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
2190
+ "dev": true,
2191
+ "license": "MIT",
2192
+ "bin": {
2193
+ "json5": "lib/cli.js"
2194
+ },
2195
+ "engines": {
2196
+ "node": ">=6"
2197
+ }
2198
+ },
2199
+ "node_modules/keyv": {
2200
+ "version": "4.5.4",
2201
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2202
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
2203
+ "dev": true,
2204
+ "license": "MIT",
2205
+ "dependencies": {
2206
+ "json-buffer": "3.0.1"
2207
+ }
2208
+ },
2209
+ "node_modules/levn": {
2210
+ "version": "0.4.1",
2211
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
2212
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
2213
+ "dev": true,
2214
+ "license": "MIT",
2215
+ "dependencies": {
2216
+ "prelude-ls": "^1.2.1",
2217
+ "type-check": "~0.4.0"
2218
+ },
2219
+ "engines": {
2220
+ "node": ">= 0.8.0"
2221
+ }
2222
+ },
2223
+ "node_modules/locate-path": {
2224
+ "version": "6.0.0",
2225
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2226
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2227
+ "dev": true,
2228
+ "license": "MIT",
2229
+ "dependencies": {
2230
+ "p-locate": "^5.0.0"
2231
+ },
2232
+ "engines": {
2233
+ "node": ">=10"
2234
+ },
2235
+ "funding": {
2236
+ "url": "https://github.com/sponsors/sindresorhus"
2237
+ }
2238
+ },
2239
+ "node_modules/lodash.merge": {
2240
+ "version": "4.6.2",
2241
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2242
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2243
+ "dev": true,
2244
+ "license": "MIT"
2245
+ },
2246
+ "node_modules/lru-cache": {
2247
+ "version": "5.1.1",
2248
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2249
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2250
+ "dev": true,
2251
+ "license": "ISC",
2252
+ "dependencies": {
2253
+ "yallist": "^3.0.2"
2254
+ }
2255
+ },
2256
+ "node_modules/marked": {
2257
+ "version": "15.0.12",
2258
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
2259
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
2260
+ "license": "MIT",
2261
+ "bin": {
2262
+ "marked": "bin/marked.js"
2263
+ },
2264
+ "engines": {
2265
+ "node": ">= 18"
2266
+ }
2267
+ },
2268
+ "node_modules/minimatch": {
2269
+ "version": "3.1.2",
2270
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2271
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2272
+ "dev": true,
2273
+ "license": "ISC",
2274
+ "dependencies": {
2275
+ "brace-expansion": "^1.1.7"
2276
+ },
2277
+ "engines": {
2278
+ "node": "*"
2279
+ }
2280
+ },
2281
+ "node_modules/ms": {
2282
+ "version": "2.1.3",
2283
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2284
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2285
+ "dev": true,
2286
+ "license": "MIT"
2287
+ },
2288
+ "node_modules/nanoid": {
2289
+ "version": "3.3.11",
2290
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
2291
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
2292
+ "dev": true,
2293
+ "funding": [
2294
+ {
2295
+ "type": "github",
2296
+ "url": "https://github.com/sponsors/ai"
2297
+ }
2298
+ ],
2299
+ "license": "MIT",
2300
+ "bin": {
2301
+ "nanoid": "bin/nanoid.cjs"
2302
+ },
2303
+ "engines": {
2304
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2305
+ }
2306
+ },
2307
+ "node_modules/natural-compare": {
2308
+ "version": "1.4.0",
2309
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2310
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2311
+ "dev": true,
2312
+ "license": "MIT"
2313
+ },
2314
+ "node_modules/node-releases": {
2315
+ "version": "2.0.19",
2316
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
2317
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
2318
+ "dev": true,
2319
+ "license": "MIT"
2320
+ },
2321
+ "node_modules/optionator": {
2322
+ "version": "0.9.4",
2323
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
2324
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
2325
+ "dev": true,
2326
+ "license": "MIT",
2327
+ "dependencies": {
2328
+ "deep-is": "^0.1.3",
2329
+ "fast-levenshtein": "^2.0.6",
2330
+ "levn": "^0.4.1",
2331
+ "prelude-ls": "^1.2.1",
2332
+ "type-check": "^0.4.0",
2333
+ "word-wrap": "^1.2.5"
2334
+ },
2335
+ "engines": {
2336
+ "node": ">= 0.8.0"
2337
+ }
2338
+ },
2339
+ "node_modules/p-limit": {
2340
+ "version": "3.1.0",
2341
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2342
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2343
+ "dev": true,
2344
+ "license": "MIT",
2345
+ "dependencies": {
2346
+ "yocto-queue": "^0.1.0"
2347
+ },
2348
+ "engines": {
2349
+ "node": ">=10"
2350
+ },
2351
+ "funding": {
2352
+ "url": "https://github.com/sponsors/sindresorhus"
2353
+ }
2354
+ },
2355
+ "node_modules/p-locate": {
2356
+ "version": "5.0.0",
2357
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2358
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2359
+ "dev": true,
2360
+ "license": "MIT",
2361
+ "dependencies": {
2362
+ "p-limit": "^3.0.2"
2363
+ },
2364
+ "engines": {
2365
+ "node": ">=10"
2366
+ },
2367
+ "funding": {
2368
+ "url": "https://github.com/sponsors/sindresorhus"
2369
+ }
2370
+ },
2371
+ "node_modules/parent-module": {
2372
+ "version": "1.0.1",
2373
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2374
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2375
+ "dev": true,
2376
+ "license": "MIT",
2377
+ "dependencies": {
2378
+ "callsites": "^3.0.0"
2379
+ },
2380
+ "engines": {
2381
+ "node": ">=6"
2382
+ }
2383
+ },
2384
+ "node_modules/path-exists": {
2385
+ "version": "4.0.0",
2386
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2387
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2388
+ "dev": true,
2389
+ "license": "MIT",
2390
+ "engines": {
2391
+ "node": ">=8"
2392
+ }
2393
+ },
2394
+ "node_modules/path-key": {
2395
+ "version": "3.1.1",
2396
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2397
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2398
+ "dev": true,
2399
+ "license": "MIT",
2400
+ "engines": {
2401
+ "node": ">=8"
2402
+ }
2403
+ },
2404
+ "node_modules/picocolors": {
2405
+ "version": "1.1.1",
2406
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2407
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2408
+ "dev": true,
2409
+ "license": "ISC"
2410
+ },
2411
+ "node_modules/picomatch": {
2412
+ "version": "4.0.2",
2413
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
2414
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
2415
+ "dev": true,
2416
+ "license": "MIT",
2417
+ "engines": {
2418
+ "node": ">=12"
2419
+ },
2420
+ "funding": {
2421
+ "url": "https://github.com/sponsors/jonschlinkert"
2422
+ }
2423
+ },
2424
+ "node_modules/postcss": {
2425
+ "version": "8.5.3",
2426
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
2427
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
2428
+ "dev": true,
2429
+ "funding": [
2430
+ {
2431
+ "type": "opencollective",
2432
+ "url": "https://opencollective.com/postcss/"
2433
+ },
2434
+ {
2435
+ "type": "tidelift",
2436
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2437
+ },
2438
+ {
2439
+ "type": "github",
2440
+ "url": "https://github.com/sponsors/ai"
2441
+ }
2442
+ ],
2443
+ "license": "MIT",
2444
+ "dependencies": {
2445
+ "nanoid": "^3.3.8",
2446
+ "picocolors": "^1.1.1",
2447
+ "source-map-js": "^1.2.1"
2448
+ },
2449
+ "engines": {
2450
+ "node": "^10 || ^12 || >=14"
2451
+ }
2452
+ },
2453
+ "node_modules/prelude-ls": {
2454
+ "version": "1.2.1",
2455
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2456
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2457
+ "dev": true,
2458
+ "license": "MIT",
2459
+ "engines": {
2460
+ "node": ">= 0.8.0"
2461
+ }
2462
+ },
2463
+ "node_modules/punycode": {
2464
+ "version": "2.3.1",
2465
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2466
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2467
+ "dev": true,
2468
+ "license": "MIT",
2469
+ "engines": {
2470
+ "node": ">=6"
2471
+ }
2472
+ },
2473
+ "node_modules/react": {
2474
+ "version": "19.1.0",
2475
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
2476
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
2477
+ "license": "MIT",
2478
+ "engines": {
2479
+ "node": ">=0.10.0"
2480
+ }
2481
+ },
2482
+ "node_modules/react-dom": {
2483
+ "version": "19.1.0",
2484
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
2485
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
2486
+ "license": "MIT",
2487
+ "dependencies": {
2488
+ "scheduler": "^0.26.0"
2489
+ },
2490
+ "peerDependencies": {
2491
+ "react": "^19.1.0"
2492
+ }
2493
+ },
2494
+ "node_modules/react-refresh": {
2495
+ "version": "0.17.0",
2496
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2497
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2498
+ "dev": true,
2499
+ "license": "MIT",
2500
+ "engines": {
2501
+ "node": ">=0.10.0"
2502
+ }
2503
+ },
2504
+ "node_modules/resolve-from": {
2505
+ "version": "4.0.0",
2506
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2507
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2508
+ "dev": true,
2509
+ "license": "MIT",
2510
+ "engines": {
2511
+ "node": ">=4"
2512
+ }
2513
+ },
2514
+ "node_modules/rollup": {
2515
+ "version": "4.41.1",
2516
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
2517
+ "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
2518
+ "dev": true,
2519
+ "license": "MIT",
2520
+ "dependencies": {
2521
+ "@types/estree": "1.0.7"
2522
+ },
2523
+ "bin": {
2524
+ "rollup": "dist/bin/rollup"
2525
+ },
2526
+ "engines": {
2527
+ "node": ">=18.0.0",
2528
+ "npm": ">=8.0.0"
2529
+ },
2530
+ "optionalDependencies": {
2531
+ "@rollup/rollup-android-arm-eabi": "4.41.1",
2532
+ "@rollup/rollup-android-arm64": "4.41.1",
2533
+ "@rollup/rollup-darwin-arm64": "4.41.1",
2534
+ "@rollup/rollup-darwin-x64": "4.41.1",
2535
+ "@rollup/rollup-freebsd-arm64": "4.41.1",
2536
+ "@rollup/rollup-freebsd-x64": "4.41.1",
2537
+ "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
2538
+ "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
2539
+ "@rollup/rollup-linux-arm64-gnu": "4.41.1",
2540
+ "@rollup/rollup-linux-arm64-musl": "4.41.1",
2541
+ "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
2542
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
2543
+ "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
2544
+ "@rollup/rollup-linux-riscv64-musl": "4.41.1",
2545
+ "@rollup/rollup-linux-s390x-gnu": "4.41.1",
2546
+ "@rollup/rollup-linux-x64-gnu": "4.41.1",
2547
+ "@rollup/rollup-linux-x64-musl": "4.41.1",
2548
+ "@rollup/rollup-win32-arm64-msvc": "4.41.1",
2549
+ "@rollup/rollup-win32-ia32-msvc": "4.41.1",
2550
+ "@rollup/rollup-win32-x64-msvc": "4.41.1",
2551
+ "fsevents": "~2.3.2"
2552
+ }
2553
+ },
2554
+ "node_modules/scheduler": {
2555
+ "version": "0.26.0",
2556
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
2557
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
2558
+ "license": "MIT"
2559
+ },
2560
+ "node_modules/semver": {
2561
+ "version": "6.3.1",
2562
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2563
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2564
+ "dev": true,
2565
+ "license": "ISC",
2566
+ "bin": {
2567
+ "semver": "bin/semver.js"
2568
+ }
2569
+ },
2570
+ "node_modules/shebang-command": {
2571
+ "version": "2.0.0",
2572
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2573
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2574
+ "dev": true,
2575
+ "license": "MIT",
2576
+ "dependencies": {
2577
+ "shebang-regex": "^3.0.0"
2578
+ },
2579
+ "engines": {
2580
+ "node": ">=8"
2581
+ }
2582
+ },
2583
+ "node_modules/shebang-regex": {
2584
+ "version": "3.0.0",
2585
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2586
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2587
+ "dev": true,
2588
+ "license": "MIT",
2589
+ "engines": {
2590
+ "node": ">=8"
2591
+ }
2592
+ },
2593
+ "node_modules/source-map-js": {
2594
+ "version": "1.2.1",
2595
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2596
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2597
+ "dev": true,
2598
+ "license": "BSD-3-Clause",
2599
+ "engines": {
2600
+ "node": ">=0.10.0"
2601
+ }
2602
+ },
2603
+ "node_modules/strip-json-comments": {
2604
+ "version": "3.1.1",
2605
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2606
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2607
+ "dev": true,
2608
+ "license": "MIT",
2609
+ "engines": {
2610
+ "node": ">=8"
2611
+ },
2612
+ "funding": {
2613
+ "url": "https://github.com/sponsors/sindresorhus"
2614
+ }
2615
+ },
2616
+ "node_modules/supports-color": {
2617
+ "version": "7.2.0",
2618
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2619
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2620
+ "dev": true,
2621
+ "license": "MIT",
2622
+ "dependencies": {
2623
+ "has-flag": "^4.0.0"
2624
+ },
2625
+ "engines": {
2626
+ "node": ">=8"
2627
+ }
2628
+ },
2629
+ "node_modules/tinyglobby": {
2630
+ "version": "0.2.14",
2631
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
2632
+ "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
2633
+ "dev": true,
2634
+ "license": "MIT",
2635
+ "dependencies": {
2636
+ "fdir": "^6.4.4",
2637
+ "picomatch": "^4.0.2"
2638
+ },
2639
+ "engines": {
2640
+ "node": ">=12.0.0"
2641
+ },
2642
+ "funding": {
2643
+ "url": "https://github.com/sponsors/SuperchupuDev"
2644
+ }
2645
+ },
2646
+ "node_modules/type-check": {
2647
+ "version": "0.4.0",
2648
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2649
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2650
+ "dev": true,
2651
+ "license": "MIT",
2652
+ "dependencies": {
2653
+ "prelude-ls": "^1.2.1"
2654
+ },
2655
+ "engines": {
2656
+ "node": ">= 0.8.0"
2657
+ }
2658
+ },
2659
+ "node_modules/update-browserslist-db": {
2660
+ "version": "1.1.3",
2661
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
2662
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
2663
+ "dev": true,
2664
+ "funding": [
2665
+ {
2666
+ "type": "opencollective",
2667
+ "url": "https://opencollective.com/browserslist"
2668
+ },
2669
+ {
2670
+ "type": "tidelift",
2671
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2672
+ },
2673
+ {
2674
+ "type": "github",
2675
+ "url": "https://github.com/sponsors/ai"
2676
+ }
2677
+ ],
2678
+ "license": "MIT",
2679
+ "dependencies": {
2680
+ "escalade": "^3.2.0",
2681
+ "picocolors": "^1.1.1"
2682
+ },
2683
+ "bin": {
2684
+ "update-browserslist-db": "cli.js"
2685
+ },
2686
+ "peerDependencies": {
2687
+ "browserslist": ">= 4.21.0"
2688
+ }
2689
+ },
2690
+ "node_modules/uri-js": {
2691
+ "version": "4.4.1",
2692
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2693
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2694
+ "dev": true,
2695
+ "license": "BSD-2-Clause",
2696
+ "dependencies": {
2697
+ "punycode": "^2.1.0"
2698
+ }
2699
+ },
2700
+ "node_modules/vite": {
2701
+ "version": "6.3.5",
2702
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
2703
+ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
2704
+ "dev": true,
2705
+ "license": "MIT",
2706
+ "dependencies": {
2707
+ "esbuild": "^0.25.0",
2708
+ "fdir": "^6.4.4",
2709
+ "picomatch": "^4.0.2",
2710
+ "postcss": "^8.5.3",
2711
+ "rollup": "^4.34.9",
2712
+ "tinyglobby": "^0.2.13"
2713
+ },
2714
+ "bin": {
2715
+ "vite": "bin/vite.js"
2716
+ },
2717
+ "engines": {
2718
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
2719
+ },
2720
+ "funding": {
2721
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2722
+ },
2723
+ "optionalDependencies": {
2724
+ "fsevents": "~2.3.3"
2725
+ },
2726
+ "peerDependencies": {
2727
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
2728
+ "jiti": ">=1.21.0",
2729
+ "less": "*",
2730
+ "lightningcss": "^1.21.0",
2731
+ "sass": "*",
2732
+ "sass-embedded": "*",
2733
+ "stylus": "*",
2734
+ "sugarss": "*",
2735
+ "terser": "^5.16.0",
2736
+ "tsx": "^4.8.1",
2737
+ "yaml": "^2.4.2"
2738
+ },
2739
+ "peerDependenciesMeta": {
2740
+ "@types/node": {
2741
+ "optional": true
2742
+ },
2743
+ "jiti": {
2744
+ "optional": true
2745
+ },
2746
+ "less": {
2747
+ "optional": true
2748
+ },
2749
+ "lightningcss": {
2750
+ "optional": true
2751
+ },
2752
+ "sass": {
2753
+ "optional": true
2754
+ },
2755
+ "sass-embedded": {
2756
+ "optional": true
2757
+ },
2758
+ "stylus": {
2759
+ "optional": true
2760
+ },
2761
+ "sugarss": {
2762
+ "optional": true
2763
+ },
2764
+ "terser": {
2765
+ "optional": true
2766
+ },
2767
+ "tsx": {
2768
+ "optional": true
2769
+ },
2770
+ "yaml": {
2771
+ "optional": true
2772
+ }
2773
+ }
2774
+ },
2775
+ "node_modules/which": {
2776
+ "version": "2.0.2",
2777
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2778
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2779
+ "dev": true,
2780
+ "license": "ISC",
2781
+ "dependencies": {
2782
+ "isexe": "^2.0.0"
2783
+ },
2784
+ "bin": {
2785
+ "node-which": "bin/node-which"
2786
+ },
2787
+ "engines": {
2788
+ "node": ">= 8"
2789
+ }
2790
+ },
2791
+ "node_modules/word-wrap": {
2792
+ "version": "1.2.5",
2793
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
2794
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
2795
+ "dev": true,
2796
+ "license": "MIT",
2797
+ "engines": {
2798
+ "node": ">=0.10.0"
2799
+ }
2800
+ },
2801
+ "node_modules/yallist": {
2802
+ "version": "3.1.1",
2803
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2804
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2805
+ "dev": true,
2806
+ "license": "ISC"
2807
+ },
2808
+ "node_modules/yocto-queue": {
2809
+ "version": "0.1.0",
2810
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2811
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2812
+ "dev": true,
2813
+ "license": "MIT",
2814
+ "engines": {
2815
+ "node": ">=10"
2816
+ },
2817
+ "funding": {
2818
+ "url": "https://github.com/sponsors/sindresorhus"
2819
+ }
2820
+ }
2821
+ }
2822
+ }
code/frontend/minicpm4-survey/package.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "minicpm4-survey",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "dompurify": "^3.2.6",
14
+ "marked": "^15.0.12",
15
+ "react": "^19.1.0",
16
+ "react-dom": "^19.1.0"
17
+ },
18
+ "devDependencies": {
19
+ "@eslint/js": "^9.25.0",
20
+ "@types/react": "^19.1.2",
21
+ "@types/react-dom": "^19.1.2",
22
+ "@vitejs/plugin-react": "^4.4.1",
23
+ "eslint": "^9.25.0",
24
+ "eslint-plugin-react-hooks": "^5.2.0",
25
+ "eslint-plugin-react-refresh": "^0.4.19",
26
+ "globals": "^16.0.0",
27
+ "vite": "^6.3.5"
28
+ }
29
+ }
code/frontend/minicpm4-survey/public/openbmb.png ADDED
code/frontend/minicpm4-survey/src/App.css ADDED
@@ -0,0 +1,318 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --neon-blue: #00f3ff;
3
+ --neon-purple: #ffffff;
4
+ --dark-panel: rgba(10, 10, 30, 0.95);
5
+ --glass-color: rgba(255, 255, 255, 0.05);
6
+ }
7
+
8
+ * {
9
+ box-sizing: border-box;
10
+ margin: 0;
11
+ padding: 0;
12
+ font-family: 'Orbitron', monospace;
13
+ }
14
+
15
+ body {
16
+ overflow: hidden;
17
+ }
18
+
19
+ .cyber-container {
20
+ position: relative;
21
+ display: flex;
22
+ min-height: 100vh;
23
+ background: radial-gradient(circle at center, #0a0a1f 0%, #000000 100%);
24
+ padding: 2rem;
25
+ gap: 2rem;
26
+ overflow: hidden;
27
+ }
28
+
29
+ /* 全息背景 */
30
+ .hologram-bg {
31
+ position: fixed;
32
+ top: -50%;
33
+ left: -50%;
34
+ width: 200%;
35
+ height: 200%;
36
+ background: repeating-linear-gradient(
37
+ 45deg,
38
+ transparent,
39
+ transparent 5px,
40
+ rgba(0, 255, 255, 0.05) 5px,
41
+ rgba(0, 255, 255, 0.05) 10px
42
+ );
43
+ animation: scan 20s linear infinite;
44
+ z-index: 0;
45
+ }
46
+
47
+ @keyframes scan {
48
+ 0% { transform: translateY(-50%) rotate(0deg); }
49
+ 100% { transform: translateY(50%) rotate(360deg); }
50
+ }
51
+
52
+ /* 面板样式 */
53
+ .tech-panel {
54
+ position: relative;
55
+ width: 220px;
56
+ padding: 1.5rem;
57
+ background: var(--glass-color);
58
+ backdrop-filter: blur(10px);
59
+ border: 1px solid rgba(255, 255, 255, 0.1);
60
+ border-radius: 12px;
61
+ box-shadow: 0 0 20px rgba(0, 255, 255, 0.2);
62
+ z-index: 1;
63
+ }
64
+
65
+ .tech-panel::before {
66
+ content: '';
67
+ position: absolute;
68
+ top: 0;
69
+ left: 0;
70
+ right: 0;
71
+ height: 2px;
72
+ background: linear-gradient(90deg, var(--neon-blue), var(--neon-purple), var(--neon-blue));
73
+ animation: pulse 3s infinite;
74
+ }
75
+
76
+ @keyframes pulse {
77
+ 0%, 100% { opacity: 0.5; }
78
+ 50% { opacity: 1; }
79
+ }
80
+
81
+ /* 输入框 */
82
+ .input-wrapper {
83
+ position: relative;
84
+ margin-bottom: 1.2rem;
85
+ }
86
+
87
+ .neon-input {
88
+ width: 100%;
89
+ padding: 0.8rem 1rem;
90
+ background: rgba(255, 255, 255, 0.03);
91
+ border: 1px solid rgba(0, 255, 255, 0.3);
92
+ border-radius: 6px;
93
+ color: #fff;
94
+ font-size: 1rem;
95
+ outline: none;
96
+ transition: all 0.3s ease;
97
+ }
98
+
99
+ .neon-input::placeholder {
100
+ color: rgba(255, 255, 255, 0.3);
101
+ }
102
+
103
+ .neon-input:focus {
104
+ border-color: var(--neon-blue);
105
+ box-shadow: 0 0 10px var(--neon-blue);
106
+ }
107
+
108
+ .input-glow {
109
+ position: absolute;
110
+ bottom: -5px;
111
+ left: 0;
112
+ width: 100%;
113
+ height: 2px;
114
+ background: linear-gradient(90deg, transparent, var(--neon-purple), transparent);
115
+ animation: glowPulse 2s infinite;
116
+ }
117
+
118
+ @keyframes glowPulse {
119
+ 0%, 100% { opacity: 0; }
120
+ 50% { opacity: 1; }
121
+ }
122
+
123
+ /* 核心区域 */
124
+ .core-module {
125
+ position: relative;
126
+ flex: 1;
127
+ z-index: 1;
128
+ display: flex;
129
+ flex-direction: column;
130
+ }
131
+
132
+ .quantum-textarea {
133
+ flex: 1;
134
+ padding: 2rem;
135
+ font-size: 1.2rem;
136
+ background: rgba(0, 0, 20, 0.7);
137
+ border: 2px solid var(--neon-blue);
138
+ border-radius: 12px;
139
+ color: #fff;
140
+ outline: none;
141
+ resize: both;
142
+ min-height: 300px;
143
+ backdrop-filter: blur(5px);
144
+ font-family: 'Orbitron', monospace;
145
+ transition: all 0.3s ease;
146
+ }
147
+
148
+ .quantum-textarea::placeholder {
149
+ color: rgba(255, 255, 255, 0.2);
150
+ }
151
+
152
+ .quantum-textarea:focus {
153
+ border-color: var(--neon-purple);
154
+ box-shadow: 0 0 20px var(--neon-purple);
155
+ }
156
+
157
+ .core-glow {
158
+ position: absolute;
159
+ top: 50%;
160
+ left: 50%;
161
+ width: 300%;
162
+ height: 300%;
163
+ background: radial-gradient(circle, var(--neon-blue) 0%, transparent 70%);
164
+ opacity: 0.1;
165
+ transform: translate(-50%, -50%);
166
+ z-index: 0;
167
+ pointer-events: none;
168
+ animation: pulseGlow 5s infinite alternate;
169
+ }
170
+
171
+ @keyframes pulseGlow {
172
+ 0% { transform: translate(-50%, -50%) scale(1); }
173
+ 100% { transform: translate(-50%, -50%) scale(1.2); }
174
+ }
175
+
176
+ /* 数据流动画 */
177
+ .data-stream {
178
+ position: absolute;
179
+ bottom: 1rem;
180
+ right: 2rem;
181
+ display: flex;
182
+ gap: 0.5rem;
183
+ z-index: 2;
184
+ }
185
+
186
+ .stream-pulse {
187
+ width: 6px;
188
+ height: 6px;
189
+ background: var(--neon-blue);
190
+ border-radius: 50%;
191
+ animation: pulseDot 1.5s infinite;
192
+ }
193
+
194
+ .delay-1 {
195
+ animation-delay: 0.3s;
196
+ }
197
+
198
+ .delay-2 {
199
+ animation-delay: 0.6s;
200
+ }
201
+
202
+ @keyframes pulseDot {
203
+ 0% { transform: scale(1); opacity: 1; }
204
+ 70% { transform: scale(1.5); opacity: 0.3; }
205
+ 100% { transform: scale(1); opacity: 1; }
206
+ }
207
+
208
+ /* 响应式设计 */
209
+ @media (max-width: 1024px) {
210
+ .cyber-container {
211
+ flex-direction: column;
212
+ padding: 1rem;
213
+ }
214
+
215
+ .tech-panel {
216
+ width: 100%;
217
+ margin-bottom: 1.5rem;
218
+ }
219
+
220
+ .core-module {
221
+ min-height: 400px;
222
+ }
223
+ }
224
+ .markdown-editor {
225
+ display: flex;
226
+ gap: 20px;
227
+ height: 100%;
228
+ z-index: 1;
229
+ }
230
+
231
+ .markdown-input,
232
+ .markdown-preview {
233
+ flex: 1;
234
+ padding: 15px;
235
+ font-size: 16px;
236
+ border: 2px solid var(--neon-blue);
237
+ border-radius: 8px;
238
+ background: rgba(0, 0, 20, 0.7);
239
+ color: #fff;
240
+ font-family: 'Orbitron', monospace;
241
+ resize: both;
242
+ }
243
+
244
+ .markdown-input {
245
+ min-height: 300px;
246
+ outline: none;
247
+ }
248
+
249
+ .markdown-input:focus {
250
+ box-shadow: 0 0 10px var(--neon-blue);
251
+ }
252
+
253
+ .markdown-preview {
254
+ max-height: 800px; /* 设置最大高度,超出后滚动 */
255
+ width: 100%;
256
+ overflow-y: auto; /* 垂直方向溢出时显示滚动条 */
257
+ padding: 10px;
258
+ border: 1px solid #333;
259
+ background-color: #111;
260
+ color: #eee;
261
+ font-family: monospace;
262
+ }
263
+
264
+ /* Markdown 内容增强样式 */
265
+ .markdown-preview h1, h2, h3 {
266
+ color: var(--neon-purple);
267
+ }
268
+
269
+ .markdown-preview pre {
270
+ background: #111;
271
+ padding: 10px;
272
+ border-radius: 6px;
273
+ color: #00ffcc;
274
+ overflow-x: auto;
275
+ }
276
+
277
+ .markdown-preview code {
278
+ background: rgba(255, 255, 255, 0.1);
279
+ padding: 2px 4px;
280
+ border-radius: 4px;
281
+ color: var(--neon-blue);
282
+ }
283
+
284
+ .core-module {
285
+ flex: 1;
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 1rem;
289
+ padding: 1rem;
290
+ }
291
+
292
+ .markdown-toolbar {
293
+ display: flex;
294
+ gap: 10px;
295
+ margin-bottom: 10px;
296
+ }
297
+
298
+ .neon-button {
299
+ background-color: #000;
300
+ color: #0f0;
301
+ border: 2px solid #0f0;
302
+ padding: 6px 12px;
303
+ font-size: 14px;
304
+ cursor: pointer;
305
+ transition: all 0.2s ease-in-out;
306
+ }
307
+
308
+ .neon-button:hover {
309
+ background-color: #0f0;
310
+ color: #000;
311
+ }
312
+
313
+ .markdown-editor {
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 10px;
317
+ padding: 1rem;
318
+ }
code/frontend/minicpm4-survey/src/App.jsx ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect, useMemo, useRef } from 'react';
2
+ import './App.css';
3
+ import DOMPurify from 'dompurify';
4
+ import { marked } from 'marked';
5
+
6
+ // 自定义 hook:防抖
7
+ function useDebounce(value, delay) {
8
+ const [debouncedValue, setDebouncedValue] = useState(value);
9
+
10
+ React.useEffect(() => {
11
+ const handler = setTimeout(() => {
12
+ setDebouncedValue(value);
13
+ }, delay);
14
+
15
+ return () => clearTimeout(handler);
16
+ }, [value, delay]);
17
+
18
+ return debouncedValue;
19
+ }
20
+
21
+ function MarkdownEditor({ value }) {
22
+ const containerRef = useRef(null);
23
+
24
+ const htmlContent = marked(value || '');
25
+ const sanitizedHtml = DOMPurify.sanitize(htmlContent);
26
+
27
+ const [userScrolled, setUserScrolled] = useState(false);
28
+
29
+ useEffect(() => {
30
+ const container = containerRef.current;
31
+ if (container && !userScrolled) {
32
+ requestAnimationFrame(() => {
33
+ container.scrollTop = container.scrollHeight;
34
+ });
35
+ }
36
+ }, [value, userScrolled]);
37
+
38
+ useEffect(() => {
39
+ const container = containerRef.current;
40
+ if (container) {
41
+ const handleScroll = () => {
42
+ const atBottom = container.scrollTop + container.clientHeight >= container.scrollHeight - 10;
43
+ setUserScrolled(!atBottom);
44
+ };
45
+ container.addEventListener('scroll', handleScroll);
46
+ return () => container.removeEventListener('scroll', handleScroll);
47
+ }
48
+ }, []);
49
+
50
+ // 复制 Markdown 内容
51
+ const handleCopy = () => {
52
+ navigator.clipboard.writeText(value || '')
53
+ .then(() => alert('Markdown 已复制到剪贴板'))
54
+ .catch(err => console.error('复制失败:', err));
55
+ };
56
+
57
+ // 下载 Markdown 文件
58
+ const handleDownload = () => {
59
+ const blob = new Blob([value || ''], { type: 'text/markdown;charset=utf-8' });
60
+ const url = URL.createObjectURL(blob);
61
+ const a = document.createElement('a');
62
+ a.href = url;
63
+ a.download = 'document.md';
64
+ document.body.appendChild(a);
65
+ a.click();
66
+ document.body.removeChild(a);
67
+ URL.revokeObjectURL(url);
68
+ };
69
+
70
+ return (
71
+ <div className="markdown-editor">
72
+ {/* <div className="markdown-toolbar">
73
+ <button className="neon-button" onClick={handleCopy}>复制 Markdown</button>
74
+ <button className="neon-button" onClick={handleDownload}>下载 Markdown</button>
75
+ </div> */}
76
+ <div
77
+ ref={containerRef}
78
+ className="markdown-preview"
79
+ dangerouslySetInnerHTML={{ __html: sanitizedHtml }}
80
+ />
81
+ </div>
82
+ );
83
+ }
84
+ function SendRequestToBackend() {
85
+ const [inputValue, setInputValue] = useState('');
86
+
87
+ const handleSendRequest = async () => {
88
+ try {
89
+ const response = await fetch('http://localhost:8001/generate_survey', {
90
+ method: 'POST',
91
+ headers: {
92
+ 'Content-Type': 'application/json',
93
+ },
94
+ body: JSON.stringify({ query: inputValue }),
95
+ });
96
+
97
+ if (!response.ok) {
98
+ throw new Error('Failed to send request');
99
+ }
100
+
101
+ const data = await response.json();
102
+ console.log('Response from backend:', data);
103
+ } catch (error) {
104
+ console.error('Error sending request:', error);
105
+ }
106
+ };
107
+
108
+ return (
109
+ <div className="request-panel" style={{ flexDirection: 'column', alignItems: 'center' }}>
110
+ <input
111
+ type="text"
112
+ value={inputValue}
113
+ onChange={(e) => setInputValue(e.target.value)}
114
+ className="neon-input"
115
+ placeholder="Enter text to send"
116
+ rows={3}
117
+ />
118
+ <button onClick={handleSendRequest} className="neon-button">
119
+ Go!
120
+ </button>
121
+ </div>
122
+ );
123
+ }
124
+
125
+
126
+ function App() {
127
+ const [inputs, setInputs] = useState({
128
+ query: { title: 'Query', displayText: '', targetText: '', isTyping: false },
129
+ nowUpdate: { title: 'Now Update', displayText: '', targetText: '', isTyping: false },
130
+ nextUpdate: { title: 'Next Update', displayText: '', targetText: '', isTyping: false },
131
+ searchKeywords: { title: 'Search Keywords', displayText: '', targetText: '', isTyping: false },
132
+ papers: { title: 'Papers', displayText: '', targetText: '', isTyping: false },
133
+ });
134
+
135
+ const [markdownContent, setMarkdownContent] = useState('');
136
+
137
+ const inputKeyMap = {
138
+ query: inputs.query,
139
+ nowUpdate: inputs.nowUpdate,
140
+ nextUpdate: inputs.nextUpdate,
141
+ searchKeywords: inputs.searchKeywords,
142
+ papers: inputs.papers,
143
+ markdown: markdownContent
144
+ };
145
+
146
+ const updateInputsFromPostData = (postData) => {
147
+ let newMarkdownContent = markdownContent;
148
+
149
+ Object.entries(postData).forEach(([key, value]) => {
150
+ if (key in inputKeyMap) {
151
+ if (key === 'markdown') {
152
+ if (markdownContent !== value) {
153
+ newMarkdownContent = value;
154
+ setMarkdownContent(newMarkdownContent);
155
+ }
156
+ } else if (inputKeyMap[key] && inputKeyMap[key].targetText !== value) {
157
+ const updatedInput = {
158
+ ...inputKeyMap[key],
159
+ targetText: value,
160
+ isTyping: true,
161
+ };
162
+ setInputs((prevInputs) => ({
163
+ ...prevInputs,
164
+ [key]: updatedInput,
165
+ }));
166
+
167
+ // startTypingAnimationForTextbox(value, (newText) => {
168
+ // setInputs((prevInputs) => ({
169
+ // ...prevInputs,
170
+ // [key]: {
171
+ // ...prevInputs[key],
172
+ // displayText: newText,
173
+ // },
174
+ // }));
175
+ // });
176
+ }
177
+ }
178
+ });
179
+
180
+
181
+ };
182
+
183
+ // const startTypingAnimationForTextbox = (text, setText) => {
184
+ // setText('');
185
+ // let charIndex = 0;
186
+ // const timer = setInterval(() => {
187
+ // if (charIndex < text.length) {
188
+ // setText((prev) => prev + text[charIndex]);
189
+ // charIndex++;
190
+ // } else {
191
+ // clearInterval(timer);
192
+ // }
193
+ // }, 50); // Reduced interval for faster typing animation
194
+ // };
195
+
196
+
197
+ useEffect(() => {
198
+ const ws = new WebSocket('ws://localhost:8001/ws');
199
+ ws.onmessage = (event) => {
200
+ try {
201
+ const data = JSON.parse(event.data);
202
+ updateInputsFromPostData(data);
203
+ console.log('Received data:', data);
204
+ } catch (e) {
205
+ console.error('Invalid WebSocket message:', e);
206
+ }
207
+ };
208
+ ws.onerror = (err) => {
209
+ console.error('WebSocket error:', err);
210
+ };
211
+ // return () => ws.close();
212
+ }, []);
213
+
214
+ const leftInputs = [inputs.nowUpdate, inputs.nextUpdate,inputs.searchKeywords];
215
+ const rightInputs = [inputs.papers];
216
+
217
+ return (
218
+ <div className="cyber-container">
219
+ <div className="tech-panel left-panel">
220
+ {leftInputs.map((input, index) => (
221
+ <div key={`left-${index}`} className="input-wrapper">
222
+ <h3 className="input-title" style={{ fontSize: '14px' }}>{input.title}</h3>
223
+ <textarea
224
+ value={input.targetText}
225
+ readOnly
226
+ className="neon-input"
227
+ rows={Math.max(10, input.targetText.split('\n').length)}
228
+ cols={50}
229
+ style={{ resize: 'none', fontSize: '12px' }}
230
+ />
231
+ </div>
232
+ ))}
233
+ </div>
234
+
235
+ <div className="core-module">
236
+ <SendRequestToBackend />
237
+ <MarkdownEditor value={markdownContent} />
238
+ </div>
239
+
240
+ <div className="tech-panel right-panel">
241
+ {rightInputs.map((input, index) => (
242
+ <div key={`right-${index}`} className="input-wrapper">
243
+ <h3 className="input-title" style={{ fontSize: '14px' }}>{input.title}</h3>
244
+ <textarea
245
+ value={input.targetText}
246
+ readOnly
247
+ className="neon-input"
248
+ rows={100}
249
+ cols={50}
250
+ style={{ resize: 'none', fontSize: '12px' }}
251
+ />
252
+ </div>
253
+ ))}
254
+ </div>
255
+ </div>
256
+ );
257
+ }
258
+
259
+ export default App;
code/frontend/minicpm4-survey/src/index.css ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color-scheme: light dark;
7
+ color: rgba(255, 255, 255, 0.87);
8
+ background-color: #242424;
9
+
10
+ font-synthesis: none;
11
+ text-rendering: optimizeLegibility;
12
+ -webkit-font-smoothing: antialiased;
13
+ -moz-osx-font-smoothing: grayscale;
14
+ }
15
+
16
+ a {
17
+ font-weight: 500;
18
+ color: #646cff;
19
+ text-decoration: inherit;
20
+ }
21
+ a:hover {
22
+ color: #535bf2;
23
+ }
24
+
25
+ body {
26
+ margin: 0;
27
+ display: flex;
28
+ place-items: center;
29
+ min-width: 320px;
30
+ min-height: 100vh;
31
+ }
32
+
33
+ h1 {
34
+ font-size: 3.2em;
35
+ line-height: 1.1;
36
+ }
37
+
38
+ button {
39
+ border-radius: 8px;
40
+ border: 1px solid transparent;
41
+ padding: 0.6em 1.2em;
42
+ font-size: 1em;
43
+ font-weight: 500;
44
+ font-family: inherit;
45
+ background-color: #1a1a1a;
46
+ cursor: pointer;
47
+ transition: border-color 0.25s;
48
+ }
49
+ button:hover {
50
+ border-color: #646cff;
51
+ }
52
+ button:focus,
53
+ button:focus-visible {
54
+ outline: 4px auto -webkit-focus-ring-color;
55
+ }
56
+
57
+ @media (prefers-color-scheme: light) {
58
+ :root {
59
+ color: #213547;
60
+ background-color: #ffffff;
61
+ }
62
+ a:hover {
63
+ color: #747bff;
64
+ }
65
+ button {
66
+ background-color: #f9f9f9;
67
+ }
68
+ }
code/frontend/minicpm4-survey/src/main.jsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import './index.css'
4
+ import App from './App.jsx'
5
+
6
+ createRoot(document.getElementById('root')).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ )
code/frontend/minicpm4-survey/vite.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ // https://vite.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ })
code/scripts/run.sh ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ python ./src/generation/run.py \
2
+ --model_path "openbmb/MiniCPM4-Survey" \
3
+ --query "Please design a survey that assesses the performance of language processing systems on unseen data to measure their robustness in natural language understanding tasks." \
4
+ --output_file "test.md" \
code/scripts/run_with_frontend.sh ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ python ./src/generation/run.py \
2
+ --model_path "openbmb/MiniCPM4-Survey" \
3
+ --query "Please design a survey that assesses the performance of language processing systems on unseen data to measure their robustness in natural language understanding tasks." \
4
+ --output_file "test.md" \
5
+ --port 8001 \
code/src/generation/buffer.py ADDED
@@ -0,0 +1,810 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import re
3
+ import json
4
+ import copy
5
+
6
+ # BASE_SURVEY_STRUCTURE = """
7
+ # # Title: A survey of ...
8
+ # # Introduction: None.
9
+ # # Section 1: None.
10
+ # ## Subsection 1 (if needed): None.
11
+ # ## Subsection 2 (if needed): None.
12
+ # ### Subsubsection 1 (if needed): None.
13
+ # ### Subsubsection 2 (if needed): None.
14
+ # ### ...
15
+ # # Section 2: None.
16
+ # # ...
17
+ # # Conclusion: None.
18
+ # """
19
+
20
+
21
+ class SurveyManager:
22
+ BASE_SURVEY_STRUCTURE = {
23
+ "title": "",
24
+ "abstract": "",
25
+ "introduction": {
26
+ "content": ""
27
+ },
28
+ "sections": [],
29
+ "conclusion": ""
30
+ }
31
+
32
+ def __init__(self):
33
+ pass
34
+
35
+ @staticmethod
36
+ def parse_update_pos(update_pos):
37
+ """
38
+ (1) "title", "abstract", "introduction", or "conclusion"
39
+ (2) "section-i/subsection-j/..."
40
+
41
+ """
42
+ if update_pos in ["title", "abstract", "introduction", "conclusion","plan"]:
43
+ return update_pos
44
+ else:
45
+ keys = update_pos.split("/")
46
+ if len(keys) == 1: # Section-?
47
+ i = int(keys[0].lower().split("section-")[-1])
48
+ return f"section-{i}"
49
+ elif len(keys) == 2: # Section-?/Subsection-?
50
+ i = int(keys[0].lower().split("section-")[-1])
51
+ j = int(keys[1].lower().split("subsection-")[-1])
52
+ return f"section-{i}/subsection-{j}"
53
+ elif len(keys) == 3: # Section-?/Subsection-?/Subsubsection-?
54
+ i = int(keys[0].lower().split("section-")[-1])
55
+ j = int(keys[1].lower().split("subsection-")[-1])
56
+ k = int(keys[2].lower().split("subsubsection-")[-1])
57
+ return f"section-{i}/subsection-{j}/subsubsection-{k}"
58
+ else:
59
+ raise ValueError("unsupported update_pos keys")
60
+
61
+ @staticmethod
62
+ def _to_one_line(string):
63
+ if isinstance(string, dict):
64
+ if "content" in string and string["content"]:
65
+ return SurveyManager._to_one_line(string["content"])
66
+ # return SurveyManager._to_one_line(string["content"])
67
+ else:
68
+ return "[PLAN] " + string.get("plan", "").replace("\n", " ").strip()
69
+ if not string:
70
+ return ""
71
+ else:
72
+ return string#.replace("\n", " ")
73
+
74
+ @staticmethod
75
+ def convert_survey_dict_to_str(current_survey):
76
+ string = ""
77
+ if current_survey == {}:
78
+ return "There is no survey."
79
+ # title
80
+ try:
81
+ content = SurveyManager._to_one_line(current_survey["title"])
82
+ string += f"# {content}\n"
83
+ except:
84
+ string += f"# Title: None\n"
85
+
86
+ # abstract
87
+ try:
88
+ content = SurveyManager._to_one_line(current_survey["abstract"])
89
+ string += f"## Abstract\n{content}\n"
90
+ except:
91
+ string += f"## Abstract\nNone\n"
92
+
93
+ # introduction
94
+ try:
95
+ content = SurveyManager._to_one_line(current_survey["introduction"])
96
+ string += f"## Introduction\n{content}\n"
97
+ except:
98
+ string += f"## Introduction\nNone\n"
99
+
100
+ # sections
101
+ if "sections" in current_survey:
102
+ for i, section in enumerate(current_survey["sections"]):
103
+ title_key = "name" if "name" in section else "title"
104
+ name, content = section[title_key], SurveyManager._to_one_line(section)
105
+ # string += f"# Section-{i+1} [{name}]: {content}\n"
106
+ string += f"## {name}\n{content}\n"
107
+
108
+ if "subsections" in section:
109
+ for j, subsection in enumerate(section["subsections"]):
110
+ name, content = subsection[title_key], SurveyManager._to_one_line(subsection)
111
+ # string += f" ## Subsection-{j+1} [{name}]: {content}\n"
112
+ string += f"### {name}\n{content}\n"
113
+
114
+ if "subsubsections" in subsection:
115
+ for k, subsubsection in enumerate(subsection["subsubsections"]):
116
+ name, content = subsubsection[title_key], SurveyManager._to_one_line(subsubsection)
117
+ # string += f" ### Subsubsection-{k+1} [{name}]: {content}\n"
118
+ string += f"#### {name}\n{content}\n"
119
+
120
+
121
+ # conclusion
122
+ try:
123
+ content = SurveyManager._to_one_line(current_survey["conclusion"])
124
+ string += f"## Conclusion\n{content}\n"
125
+ except:
126
+ string += f"## Conclusion:\nNone\n"
127
+
128
+ return string
129
+
130
+ @staticmethod
131
+ def _abbr_one_line(string, abbr=True):
132
+ if isinstance(string, dict):
133
+ if "content" in string and string["content"]:
134
+ return SurveyManager._abbr_one_line(string["content"], abbr=abbr)
135
+ elif "plan" in string:
136
+ return "[PLAN] " + string["plan"].replace("\n", " ").strip()
137
+ else:
138
+ return ""
139
+ else:
140
+ if not string:
141
+ return ""
142
+ else:
143
+ if abbr and len(string) > 50:
144
+ return "[OK] " + string.replace("\n", " ").strip()[:50] + "..."
145
+ else:
146
+ return "[OK] " + string.replace("\n", " ").strip()
147
+
148
+ @staticmethod
149
+ def convert_survey_dict_to_abbr_str(current_survey):
150
+ string = ""
151
+ if current_survey == {}:
152
+ return "There is no survey."
153
+ # title
154
+ try:
155
+ content = SurveyManager._abbr_one_line(current_survey["title"], abbr=False)
156
+ string += f"# Title: {content}\n"
157
+ except:
158
+ string += f"# Title: None\n"
159
+ # abstract
160
+ try:
161
+ content = SurveyManager._abbr_one_line(current_survey["abstract"], abbr=False)
162
+ string += f"# Abstract: {content}\n"
163
+ except:
164
+ string += f"# Abstract: None\n"
165
+
166
+ # introduction
167
+ try:
168
+ content = SurveyManager._abbr_one_line(current_survey["introduction"])
169
+ string += f"# Introduction: {content}\n"
170
+ except:
171
+ string += f"# Introduction: None\n"
172
+
173
+ # sections
174
+ if "sections" in current_survey:
175
+ for i, section in enumerate(current_survey["sections"]):
176
+ title_key = "name" if "name" in section else "title"
177
+ name, content = section[title_key], SurveyManager._abbr_one_line(section)
178
+ string += f"# Section-{i+1} [{name}]: {content}\n"
179
+
180
+ if "subsections" in section:
181
+ for j, subsection in enumerate(section["subsections"]):
182
+ name, content = subsection[title_key], SurveyManager._abbr_one_line(subsection)
183
+ string += f" ## Subsection-{j+1} [{name}]: {content}\n"
184
+
185
+ if "subsubsections" in subsection:
186
+ for k, subsubsection in enumerate(subsection["subsubsections"]):
187
+ name, content = subsubsection[title_key], SurveyManager._abbr_one_line(subsubsection)
188
+ string += f" ### Subsubsection-{k+1} [{name}]: {content}\n"
189
+
190
+ # conclusion
191
+ try:
192
+ content = SurveyManager._abbr_one_line(current_survey["conclusion"])
193
+ string += f"# Conclusion: {content}\n"
194
+ except:
195
+ string += f"# Conclusion: None\n"
196
+
197
+ return string
198
+
199
+ @staticmethod
200
+ def update_one_section(sections, i, content):
201
+ # i -= 1
202
+ if i >= 0 and i <= (len(sections)-1):
203
+ sections[i]["content"] = content
204
+ return True
205
+ else:
206
+ # print("update fail!")
207
+ return False
208
+
209
+ @staticmethod
210
+ def update_current_survey(current_survey, answer) -> bool:
211
+ """
212
+ update_pos: "section-i/subsection-j/subsubsection-k"
213
+ """
214
+ # if answer == {}:
215
+ # return True
216
+ try:
217
+ update_pos, content = answer["update"], answer["content"]
218
+
219
+ if update_pos == "plan":
220
+ # current_survey = content
221
+ if current_survey == {}:
222
+ for k,v in content.items():
223
+ current_survey[k] = copy.deepcopy(v)
224
+ else:
225
+ return False
226
+ elif update_pos in ["conclusion", "abstract"]:
227
+ if update_pos not in current_survey:
228
+ # print("update fail!")
229
+ return False
230
+ current_survey[update_pos] = content
231
+
232
+ elif update_pos == "introduction":
233
+ if update_pos not in current_survey:
234
+ # print("update fail!")
235
+ return False
236
+ current_survey[update_pos] = {"content": content}
237
+
238
+ else:
239
+ keys = update_pos.split("/")
240
+ if len(keys) == 1: # Section-?
241
+ i = int(keys[0].lower().split("section-")[-1])-1
242
+ return SurveyManager.update_one_section(current_survey["sections"], i, content)
243
+
244
+ elif len(keys) == 2: # Section-?/Subsection-?
245
+ i = int(keys[0].lower().split("section-")[-1])-1
246
+ j = int(keys[1].lower().split("subsection-")[-1])-1
247
+ try:
248
+ return SurveyManager.update_one_section(current_survey["sections"][i]["subsections"], j, content)
249
+ except:
250
+ # print("update fail!")
251
+ return False
252
+
253
+ elif len(keys) == 3: # Section-?/Subsection-?/Subsubsection-?
254
+ i = int(keys[0].lower().split("section-")[-1])-1
255
+ j = int(keys[1].lower().split("subsection-")[-1])-1
256
+ k = int(keys[2].lower().split("subsubsection-")[-1])-1
257
+ try:
258
+ return SurveyManager.update_one_section(current_survey["sections"][i]["subsections"][j]["subsubsections"], k, content) # 禁用第四级
259
+ except:
260
+ # print("update fail!")
261
+ return False
262
+ else:
263
+ # print("update fail!")
264
+ # print("unsupported update_pos keys")
265
+ return False
266
+ # raise ValueError("unsupported update_pos keys")
267
+ except:
268
+ # print("update fail!")
269
+ return False
270
+ # print("answer is not a valid json object.")
271
+ # print(answer)
272
+ # raise ValueError("answer is not a valid json object.")
273
+ return True
274
+
275
+
276
+ from prompts import *
277
+ class PromptManger:
278
+ system_prompt = SYSTEM_PROMPT_0415_BUFFER
279
+ user_prompt_v0 = USER_PROMPT_v0_0424_BUFFER
280
+ user_prompt = USER_PROMPT_0415_BUFFER
281
+
282
+
283
+
284
+
285
+
286
+ class BufferManager:
287
+ """
288
+ Used to manage prompts/responses generated during the Rollout phase, providing data support for subsequent training.
289
+ batch_rollout_data = [
290
+ {
291
+ query (or env_id): # Uniquely identifies a query or environment, [input parameter].
292
+ *running_id: # Uniquely identifies a single rollout. For cases where a query or environment is repeated multiple times, the query can be the same, but running_id will not repeat.
293
+ state: { # Indicates whether the process is finished.
294
+ "score": 0.0,
295
+ "done": True / False
296
+ "current_survey": dict # Structured data.
297
+ }
298
+ trajectory: [ # Organizes all data into a multi-turn interaction format.
299
+ {
300
+ step: int, 0~?, # The first step, usually includes some init_info or plan.
301
+ original_response: str, The raw output from the model, which may have various formatting issues.
302
+ answer_thought: str, # Encapsulated using the <think>...</think> block.
303
+ answer: {
304
+ "original_str": str
305
+ "update": str,
306
+ "name": str,
307
+ "content": str,
308
+ "inclusions": list, # Extracted independently?
309
+ }
310
+ tool_call_thought: str, # Encapsulated using the <think>...</think> block.
311
+ tool_call: {
312
+ "original_str": str, # Encapsulated using the <tool_call>...</tool_call> block, used for tool invocation. In the survey setting, it is either "done" to end the task or "search".
313
+ "tool_name": str # done or search.
314
+ "keywords": list[str], Extracted search keywords from tool_call, otherwise none.
315
+ }
316
+ *papers: list[str], # Top-n papers retrieved via the search engine. Required if using the Agent-Summary-1 for collaborative optimization; otherwise, not needed.
317
+ cites: list[str], # References cited by the model, which may include multiple citations.
318
+ summarys: list[str], # Summaries of papers generated using Agent-Summary-1. Must include BIBKEY.
319
+ *prompt_for_generator: str, # The prompt input to the generator at the current step. Required if using Agent-Summary-2 for generation and collaborative optimization; otherwise, not needed.
320
+ },
321
+ ...
322
+
323
+ ]
324
+
325
+ },
326
+ ...
327
+ ]
328
+
329
+ """
330
+ def __init__(self, prompts, repeat_n: int=1):
331
+ # self.config = config
332
+ self.step = 0
333
+ self.batch_rollout_data = []
334
+ self.running_ids = [] # active envs
335
+ batch_size = prompts.batch['input_ids'].size(0)
336
+ uids = prompts.non_tensor_batch['uid']
337
+ querys = prompts.non_tensor_batch['raw_prompt'].copy()
338
+ ground_truths = prompts.non_tensor_batch['ground_truth']
339
+ # print(querys)
340
+ new_querys = []
341
+ for i_batch in range(batch_size):
342
+ raw_prompt_i_batch = querys[i_batch][-1]["content"]
343
+ new_querys.append(raw_prompt_i_batch)
344
+ querys = new_querys
345
+
346
+ assert len(querys) == len(uids)
347
+ for query, uid, ground_truth in zip(querys, uids, ground_truths):
348
+
349
+ now_survey = {}
350
+
351
+ for _ in range(repeat_n):
352
+ self.batch_rollout_data.append({
353
+ "query": query,
354
+ "uid": uid,
355
+ "state": {
356
+ # "score": 0.0, # only for debug
357
+ # "format_score": None, # will update at last step
358
+ "done": False,
359
+ "current_survey": {}
360
+ },
361
+ "trajectory": [],
362
+ "history_messages": [],
363
+ })
364
+
365
+ @staticmethod
366
+ def _build_system_prompt():
367
+ prompt = PromptManger.system_prompt
368
+ return prompt
369
+ @staticmethod
370
+ def _build_user_prompt_v0(query, current_survey):
371
+ # query
372
+ prompt = PromptManger.user_prompt_v0.replace("<user_query>", query)
373
+
374
+ # add template
375
+ prompt = prompt.replace("<init_survey>", SurveyManager.convert_survey_dict_to_abbr_str(current_survey))
376
+ return prompt
377
+
378
+ @staticmethod
379
+ def _build_user_prompt(query, current_survey, trajs):
380
+ last_traj = trajs[-1]
381
+ # query
382
+ prompt = PromptManger.user_prompt.replace("<user_query>", query)
383
+
384
+ # add current survey
385
+ prompt = prompt.replace("<current_survey>", SurveyManager.convert_survey_dict_to_abbr_str(current_survey))
386
+
387
+ # current plan
388
+ if last_traj["tool_call_thought"] == "":
389
+ prompt = prompt.replace("<last_step_thought>", "Your last thought is not available, please give new plan")
390
+ else:
391
+ prompt = prompt.replace("<last_step_thought>", last_traj["tool_call_thought"])
392
+ prompt = prompt.replace("<last_step_tool_call>", json.dumps(last_traj["tool_call"]))
393
+
394
+ # summarys
395
+ for traj in reversed(trajs):
396
+ if len(traj["summarys"]) > 0:
397
+ break
398
+ summary_num = len(traj["summarys"])
399
+
400
+ if summary_num == 0:
401
+ prompt = prompt.replace("<summarys>", "There is no result.")
402
+ else:
403
+ prompt = prompt.replace("<summarys>", f"There are {summary_num} results:\n\n" + "\n\n".join(traj["summarys"]))
404
+
405
+ return prompt
406
+
407
+ @staticmethod
408
+ def _build_user_prompt_force_correct(query, current_survey, trajs):
409
+ if current_survey == {}:
410
+ # gen plan
411
+ now_section = "plan"
412
+ # trajs[-1]["tool_call_thought"] = "Next I will provide the plan. "
413
+ else:
414
+ now_section = ""
415
+ if isinstance(current_survey["abstract"],dict) and "content" not in current_survey["abstract"]:
416
+ now_section = "abstract"
417
+ elif "content" not in current_survey["introduction"]:
418
+ now_section = "introduction"
419
+ elif "sections" in current_survey:
420
+ for section in current_survey["sections"]:
421
+ if "content" not in section:
422
+ now_section = "section-{}".format(current_survey["sections"].index(section) + 1)
423
+ break
424
+ elif "subsections" in section:
425
+ for subsection in section["subsections"]:
426
+ if "content" not in subsection:
427
+ now_section = "section-{}/subsection-{}".format(
428
+ current_survey["sections"].index(section) + 1,
429
+ section["subsections"].index(subsection) + 1
430
+ )
431
+ break
432
+ elif "subsubsections" in subsection:
433
+ for subsubsection in subsection["subsubsections"]:
434
+ if "content" not in subsubsection:
435
+ now_section = "section-{}/subsection-{}/subsubsection-{}".format(
436
+ current_survey["sections"].index(section) + 1,
437
+ section["subsections"].index(subsection) + 1,
438
+ subsection["subsubsections"].index(subsubsection) + 1
439
+ )
440
+ break
441
+ if now_section:
442
+ break
443
+ if now_section:
444
+ break
445
+
446
+ elif isinstance(current_survey["conclusion"],dict) and "content" not in current_survey["conclusion"]:
447
+ now_section = "conclusion"
448
+ else:
449
+ trajs[-1]["tool_call_thought"] = "Next I will finalize the survey."
450
+ if now_section != "":
451
+ trajs[-1]["tool_call_thought"] = f"Next I will provide {now_section}"
452
+ for traj in reversed(trajs):
453
+ if len(traj["summarys"]) > 0:
454
+ break
455
+ summary_num = len(traj["summarys"])
456
+ if now_section == "plan" and summary_num == 0:
457
+ trajs[-1]["tool_call_thought"] = "I need to get enough information."
458
+
459
+ return BufferManager._build_user_prompt(query, current_survey, trajs)
460
+
461
+ @staticmethod
462
+ def _check_finalize(query, current_survey, trajs):
463
+ if current_survey == {}:
464
+ # gen plan
465
+ return False
466
+ # trajs[-1]["tool_call_thought"] = "Next I will provide the plan. "
467
+ else:
468
+ now_section = ""
469
+ if isinstance(current_survey["abstract"],dict) and "content" not in current_survey["abstract"]:
470
+ now_section = "abstract"
471
+ elif "content" not in current_survey["introduction"]:
472
+ now_section = "introduction"
473
+ elif "sections" in current_survey:
474
+ for section in current_survey["sections"]:
475
+ if "content" not in section:
476
+ now_section = "section-{}".format(current_survey["sections"].index(section) + 1)
477
+ break
478
+ elif "subsections" in section:
479
+ for subsection in section["subsections"]:
480
+ if "content" not in subsection:
481
+ now_section = "section-{}/subsection-{}".format(
482
+ current_survey["sections"].index(section) + 1,
483
+ section["subsections"].index(subsection) + 1
484
+ )
485
+ break
486
+ elif "subsubsections" in subsection:
487
+ for subsubsection in subsection["subsubsections"]:
488
+ if "content" not in subsubsection:
489
+ now_section = "section-{}/subsection-{}/subsubsection-{}".format(
490
+ current_survey["sections"].index(section) + 1,
491
+ section["subsections"].index(subsection) + 1,
492
+ subsection["subsubsections"].index(subsubsection) + 1
493
+ )
494
+ break
495
+ if now_section:
496
+ break
497
+ if now_section:
498
+ break
499
+
500
+ elif isinstance(current_survey["conclusion"],dict) and "content" not in current_survey["conclusion"]:
501
+ now_section = "conclusion"
502
+ # else:
503
+ # trajs[-1]["tool_call_thought"] = "Next I will finalize the survey."
504
+ if now_section != "":
505
+ return False
506
+
507
+ return True
508
+
509
+ # rule-based method: query, plan, paragraphs -> prompt -> thought, paragraph, action
510
+ def build_prompt_for_generator(self):
511
+ total_messages = []
512
+ self.running_ids = []
513
+ for running_id, data in enumerate(self.batch_rollout_data):
514
+ if data["state"]["done"]:
515
+ pass
516
+ else:
517
+ if len(data["trajectory"]) == 0: # first prompt
518
+ user_prompt = BufferManager._build_user_prompt_v0(data["query"],
519
+ data["state"]["current_survey"])
520
+ else:
521
+ if data["trajectory"][-1]["update_success"]:
522
+ user_prompt = BufferManager._build_user_prompt(data["query"],
523
+ data["state"]["current_survey"],
524
+ data["trajectory"])
525
+ else:
526
+ # user_prompt = data["history_messages"][-1][1]["content"]
527
+ user_prompt = BufferManager._build_user_prompt_force_correct(data["query"],
528
+ data["state"]["current_survey"],
529
+ data["trajectory"])
530
+ messages = [
531
+ {
532
+ "role": "system",
533
+ "content": BufferManager._build_system_prompt(),
534
+ },
535
+ {
536
+ "role": "user",
537
+ "content": user_prompt,
538
+ }
539
+ ]
540
+ data["history_messages"].append(messages)
541
+ total_messages.append(messages)
542
+ self.running_ids.append(running_id) # update running ids
543
+ return total_messages
544
+
545
+ def update_all_scores(self, scores):
546
+ assert len(scores) == len(self.batch_rollout_data)
547
+ for score, log in zip(scores, self.batch_rollout_data):
548
+ log["state"]["score"] = score
549
+
550
+ def update_all_format_scores(self, scores):
551
+ assert len(scores) == len(self.batch_rollout_data)
552
+ for score, log in zip(scores, self.batch_rollout_data):
553
+ log["state"]["format_score"] = score
554
+
555
+
556
+ def update_trajectory(self, model_responses, env_feedbacks):
557
+ """
558
+ model_response: original_response, thought, paragraph, tool_call, format_reward
559
+ env_feedback: done, search_keywards, abstracts, outcome_reward
560
+ """
561
+ assert len(self.running_ids) == len(model_responses)
562
+ assert len(self.running_ids) == len(env_feedbacks)
563
+
564
+ for running_id, response, feedback in zip(self.running_ids, model_responses, env_feedbacks):
565
+ # update state
566
+ self.batch_rollout_data[running_id]["state"]["done"] = feedback["done"] # if True, finalize the task
567
+
568
+ update_success = False
569
+ if response["true"]:
570
+ if self.batch_rollout_data[running_id]["state"]["current_survey"] != {}:
571
+ if len(response["answer"]) != 0: # no empty dict or start
572
+ update_success = SurveyManager.update_current_survey(
573
+ self.batch_rollout_data[running_id]["state"]["current_survey"],
574
+ response["answer"])
575
+ else:
576
+ # Search Then Write
577
+ if len(response["answer"]) != 0 and "There is no result" not in self.batch_rollout_data[running_id]["history_messages"][-1][1]["content"]:
578
+ update_success = SurveyManager.update_current_survey(
579
+ self.batch_rollout_data[running_id]["state"]["current_survey"],
580
+ response["answer"])
581
+ elif "There is no result" in self.batch_rollout_data[running_id]["history_messages"][-1][1]["content"] and len(response["answer"]) == 0:
582
+ update_success = True
583
+
584
+
585
+ self.batch_rollout_data[running_id]["trajectory"].append({
586
+ "step": self.step,
587
+ "original_response": response["original_response"],
588
+ "answer_thought": response["answer_thought"],
589
+ "answer": response["answer"],
590
+ "tool_call_thought": response["tool_call_thought"],
591
+ "tool_call": response["tool_call"],
592
+ "search_keywords": feedback["search_keywords"],
593
+ "summarys": feedback["summarys"],
594
+ "update_success": update_success and response["true"],
595
+ })
596
+
597
+
598
+ self.batch_rollout_data[running_id]["history_messages"][-1].append({
599
+ "role": "assistant",
600
+ "content": response["original_response"],
601
+ })
602
+
603
+ if self.batch_rollout_data[running_id]["state"]["done"]:
604
+ real_done = BufferManager._check_finalize(self.batch_rollout_data[running_id]["query"],
605
+ self.batch_rollout_data[running_id]["state"]["current_survey"],
606
+ self.batch_rollout_data[running_id]["trajectory"])
607
+ if not real_done:
608
+ self.batch_rollout_data[running_id]["state"]["done"] = False
609
+
610
+
611
+ @staticmethod
612
+ def match_reference(text:str):
613
+ reg = r"\\\w*cite(?!style)\w*\{(.+?)\}"
614
+ placeholder_reg = re.compile(r"^#\d+$")
615
+ reg_bibkeys = re.findall(reg, text)
616
+ bibkeys = set()
617
+ for bibkey in reg_bibkeys:
618
+ single_bib = bibkey.split(",")
619
+ for bib in single_bib:
620
+ if not placeholder_reg.match(bib):
621
+ bib = bib.strip()
622
+ if bib and bib != "*":
623
+ bibkeys.add(bib)
624
+
625
+ reg = r"\\nocite{(.+?)\}"
626
+ reg_bibkeys = re.findall(reg, text)
627
+ for bibkey in reg_bibkeys:
628
+ single_bib = bibkey.split(",")
629
+ for bib in single_bib:
630
+ if not placeholder_reg.match(bib):
631
+ bib = bib.strip()
632
+ if bib and bib != "*":
633
+ bibkeys.remove(bib)
634
+
635
+ ref_key_list = list(bibkeys)
636
+ return ref_key_list
637
+
638
+ @staticmethod
639
+ def parse_generator_response(response):
640
+ """
641
+ 1. 解析失败: step + 1, 重新生成, 给出提示
642
+ 2. 解析成功:
643
+ 2.1 tool_call == search(keywords) 发送post请求
644
+ 2.2 tool_call == done 结束任务
645
+
646
+ **standard format**
647
+
648
+ Current Update:
649
+ <think> [Your Thoughts]: str </think>
650
+ <answer> {"update": str, "content": str}: dict </answer>
651
+
652
+ Next Plan:
653
+ <think> [Your Thoughts]: str </think>
654
+ <tool_call> {"tool": "search", "arguments": {}}: dict</tool_call>
655
+ """
656
+ extracted_result = {
657
+ "original_response": response
658
+ }
659
+
660
+ try:
661
+ current_update = response.split("Current Update:")[-1].split("Next Plan:")[0]
662
+ except:
663
+ current_update = response
664
+
665
+ # pattern
666
+ think_pattern = r"<think>(.*?)</think>"
667
+ answer_pattern = r"<answer>(.*?)</answer>"
668
+ tool_pattern = r"<tool_call>(.*?)</tool_call>"
669
+
670
+ # extract information from current_update
671
+
672
+ think_match = re.search(think_pattern, current_update, re.DOTALL) # 多行提取
673
+ if think_match:
674
+ think = think_match.group(1)
675
+ think = think.strip()
676
+ else:
677
+ think = ""
678
+ extracted_result["answer_thought"] = think
679
+
680
+ answer_match = re.search(answer_pattern, current_update, re.DOTALL) # 多行提取
681
+ has_answer = False
682
+ if answer_match:
683
+ answer = answer_match.group(1)
684
+ answer = answer.strip()
685
+ try:
686
+ answer = json.loads(answer)
687
+ if not answer == {}:
688
+ assert isinstance(answer["update"], str)
689
+ answer["update"] = SurveyManager.parse_update_pos(answer["update"])
690
+ if answer["update"] == "plan":
691
+
692
+ assert isinstance(answer["content"], dict)
693
+ plan = answer["content"]
694
+ assert isinstance(plan, dict)
695
+ plan.pop("instruction",None)
696
+ keys = ["abstract", "introduction", "conclusion","sections","title"]
697
+ for key in keys:
698
+ assert key in plan
699
+ for key in plan:
700
+ assert key in keys
701
+ if key == "sections":
702
+ assert isinstance(plan[key], list)
703
+ for section in plan[key]:
704
+ assert isinstance(section, dict)
705
+ assert "plan" in section
706
+ assert "title" in section
707
+ assert isinstance(section["plan"], str)
708
+ assert isinstance(section["title"], str)
709
+ assert section["title"] != "Methodology" # 不能是Methodology,WIP
710
+ if "subsections" in section:
711
+ assert isinstance(section["subsections"], list)
712
+ for subsection in section["subsections"]:
713
+ assert isinstance(subsection, dict)
714
+ assert "plan" in subsection
715
+ assert "title" in subsection
716
+ assert isinstance(subsection["plan"], str)
717
+ assert isinstance(subsection["title"], str)
718
+ if "subsubsections" in section:
719
+ assert isinstance(subsection["subsubsections"], list)
720
+ for subsubsection in subsection["subsubsections"]:
721
+ assert isinstance(subsubsection, dict)
722
+ assert "plan" in subsubsection
723
+ assert "title" in subsubsection
724
+ assert isinstance(subsubsection["plan"], str)
725
+ assert isinstance(subsubsection["title"], str)
726
+ elif key == "title":
727
+ assert isinstance(plan[key], str)
728
+ else:
729
+ assert isinstance(plan[key], dict)
730
+ assert "plan" in plan[key]
731
+ if key not in ["abstract", "conclusion", "introduction"]:
732
+ assert "title" in plan[key]
733
+ else:
734
+ assert isinstance(answer["content"], str)
735
+ has_answer = True
736
+ except:
737
+ answer = {}
738
+ else:
739
+ answer = {}
740
+ extracted_result["answer"] = answer
741
+
742
+ # extract information from next_plan
743
+
744
+ try:
745
+ next_plan = response.split("Next Plan:")[1]
746
+ except:
747
+ try:
748
+ next_plan = response.split("</answer>")[1]
749
+ except:
750
+ next_plan = response
751
+
752
+ think_match = re.search(think_pattern, next_plan, re.DOTALL) # 多行提取
753
+ if think_match:
754
+ think = think_match.group(1)
755
+ think = think.strip()
756
+ else:
757
+ think = ""
758
+ extracted_result["tool_call_thought"] = think
759
+
760
+ tool_match = re.search(tool_pattern, next_plan, re.DOTALL) # 多行提取
761
+ has_tool_call = False
762
+ if tool_match:
763
+ tool_text = tool_match.group(1)
764
+ tool_text = tool_text.strip()
765
+ try:
766
+ tool_call = json.loads(tool_text)
767
+ assert tool_call["name"] in ["search_engine", "finalize"]
768
+ if tool_call["name"] == "search_engine":
769
+ assert isinstance(tool_call["arguments"]["query"], list)
770
+ has_tool_call = True
771
+ except:
772
+ tool_call = {}
773
+ else:
774
+
775
+ tool_call = {}
776
+
777
+ extracted_result["tool_call"] = tool_call
778
+
779
+ extracted_result["true"] = has_answer and has_tool_call
780
+ reg = r"[\u4e00-\u9fa5]"
781
+ has_chinese = re.search(reg, response) is not None
782
+ extracted_result["true"] = extracted_result["true"] and not has_chinese
783
+
784
+ return extracted_result
785
+
786
+
787
+ class BufferManager_V2(BufferManager):
788
+
789
+ def __init__(self, querys, repeat_n=1):
790
+ # self.config = config
791
+ self.step = 0
792
+ self.batch_rollout_data = []
793
+ self.running_ids = [] # active envs
794
+
795
+ for uid, query in enumerate(querys):
796
+ print("CURRENT QUERY: ", query)
797
+ for _ in range(repeat_n):
798
+ self.batch_rollout_data.append({
799
+ "query": query,
800
+ "uid": f"query_{uid}",
801
+ "state": {
802
+ # "score": 0.0, # only for debug
803
+ # "format_score": None, # will update at last step
804
+ "done": False,
805
+ "current_survey": {}
806
+ },
807
+ "trajectory": [],
808
+ "history_messages": []
809
+ })
810
+
code/src/generation/prompts.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ SYSTEM_PROMPT_0415_BUFFER = """You are a survey writer. You are asked to write a survey follow the instruction, refered as "Query" or "User's Query". You will finish the survey by multi-step updating.
4
+
5
+ Usually, you need to do two things:
6
+ (1) First, you need to update the survey using the retrieved information according to the current plan, refered as "Current Update". You MUST think inside <think>...</think> before you give your <answer>...</answer> action, mainly about "How to write paragraphs with citations based on retrieved information to complete the current plan?". If the current plan is None, or you think the current plan is not good, or you think the retrieved information is not enough for you to finish the plan, you can jump the "Answer" action by giving "{}" as answer. Please give the citation in \\cite{}.
7
+
8
+ (2) Then, you need decide what part of the survey needs to be updated, refered as "Next Plan". You MUST think inside <think>...</think> before you give your <tool_call>...</tool_call> action. If you think the current retrieved information is enough to finish your next plan, you can jump the "Tool Call" action by giving "{}" as tool call.
9
+
10
+ ## Answer
11
+ You can give one answer to update the survey.
12
+ <answer>
13
+ {"update": <section-pos>, "content": paragraph }
14
+ </answer>
15
+
16
+ There are two parameters in <answer> action.
17
+ * update: string, which position you want to update, such as "title", "abstract", "introduction", "section-1", "section-1/subsction-1", "section-1/subsction-1/subsection-1", and "conclusion".
18
+ * content: string, the update content for the position of the survey, please give the faithful citation in \\cite{}. . Or dict, only when you give the plan of the paper, the values including the section title and a simple plan of it.
19
+
20
+ ## Tool Call
21
+ You can call one function to assist the survey writing.
22
+
23
+ You are provided with function signatures within <tools></tools> XML tags:
24
+ <tools>
25
+ {"type": "function", "function": {"name": "search_engine", "description": "Search reasearch papers.", "parameters": {"type": "object", "properties": {"query": {"type": "array", "items": {"type": "string"}, "description": "The words to search for in quotes."}, "required": ["query"]}}}}
26
+ {"type": "function", "function": {"name": "finalize", "description": "Finalize the survey.", "parameters": {}, "required": []}}
27
+ </tools>
28
+
29
+ For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:
30
+ <tool_call> {"name": <function-name>, "arguments": <args-json-object>} </tool_call>
31
+
32
+ For example, You can call the search engine by using:
33
+ <tool_call> {"name": "search_engine", "arguments": {"query": ["keyword-1", "keyword-2", ...]} </tool_call>
34
+ If you think the survey is finished, please call:
35
+ <tool_call> {"name": "finalize", "arguments": {} </tool_call>
36
+
37
+ ** Attention **
38
+ You must use correct JSON format inside <answer>...</answer> and <tool_call>...</tool_call>, otherwise we can't extract the corrent content.
39
+
40
+ **Output format**
41
+ (1) Current Update:
42
+ <think> How to write paragraphs with citations based on retrieved information to complete the plan? </think>
43
+ <answer> Please provide your answer here. (JSON format) </answer>
44
+ (2) Next Plan:
45
+ <think> Which part of the survey needs to be updated? What information needs to be queried? </think>
46
+ <tool_call> Please call a tool here. (JSON format) </tool_call>
47
+ """
48
+
49
+ USER_PROMPT_v0_0424_BUFFER = """Please update the survey depending on the insturctions.
50
+ **User's Query**
51
+ <user_query>
52
+
53
+ **Current Survey**
54
+ <init_survey>
55
+
56
+ **Current Plan**
57
+ <think>I need to get enough information.</think>
58
+ <tool_call>{}</tool_call>
59
+
60
+ **Retrieved Information**
61
+ There is no results.
62
+
63
+ Please give your response following the output format.
64
+ """
65
+
66
+ USER_PROMPT_0415_BUFFER = """Please update the survey depending on the insturctions.
67
+ **User's Query**
68
+ <user_query>
69
+
70
+ **Current Survey**
71
+ <current_survey>
72
+
73
+ **Current Plan**
74
+ <think> <last_step_thought> </think>
75
+ <tool_call> <last_step_tool_call> </tool_call>
76
+
77
+ **Retrieved Information**
78
+ <summarys>
79
+
80
+ Please give your response following the output format.
81
+ """
code/src/generation/run.py ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from contextlib import contextmanager
2
+ from codetiming import Timer
3
+ @contextmanager
4
+ def _timer(name: str, timing_raw):
5
+ with Timer(name=name, logger=None) as timer:
6
+ yield
7
+ timing_raw[name] = timer.last
8
+
9
+ from buffer import SurveyManager
10
+ from buffer import BufferManager_V2 as BufferManager
11
+ from vllm import LLM, SamplingParams
12
+ from transformers import AutoTokenizer
13
+ import re
14
+ from fastapi import FastAPI, WebSocket, WebSocketDisconnect
15
+ from fastapi.middleware.cors import CORSMiddleware
16
+ import asyncio
17
+ import argparse
18
+ from pydantic import BaseModel
19
+ import json
20
+ import aiohttp
21
+
22
+
23
+ app = FastAPI()
24
+
25
+ # 允许跨域(如果前端和后端端口不同需要加上)
26
+ app.add_middleware(
27
+ CORSMiddleware,
28
+ allow_origins=["*"],
29
+ allow_credentials=True,
30
+ allow_methods=["*"],
31
+ allow_headers=["*"],
32
+ )
33
+
34
+ active_connections = set()
35
+
36
+ @app.websocket("/ws")
37
+ async def websocket_endpoint(websocket: WebSocket):
38
+ await websocket.accept()
39
+ active_connections.add(websocket)
40
+ try:
41
+ while True:
42
+ await websocket.receive_text()
43
+ except WebSocketDisconnect:
44
+ active_connections.remove(websocket)
45
+
46
+ async def post_to_frontend(payload):
47
+ print(f"Sending payload to frontend: {payload}") # Log the payload being sent
48
+ for ws in list(active_connections):
49
+ try:
50
+ await ws.send_text(payload)
51
+ except Exception as e:
52
+ print(f"Error sending to WebSocket: {e}")
53
+ active_connections.remove(ws)
54
+
55
+
56
+ def write_to_json(data, path):
57
+ with open(path, 'w', encoding='utf8') as f:
58
+ f.write(json.dumps(data, ensure_ascii=False, indent=4))
59
+
60
+ class OriginalvLLMRollout:
61
+ def __init__(self, model_name_or_path):
62
+ # init vLLM
63
+ self.rollout_model = LLM(
64
+ model=model_name_or_path,
65
+ tokenizer=model_name_or_path,
66
+ gpu_memory_utilization=0.95,
67
+ trust_remote_code=True,
68
+ )
69
+ self.sampling_params = SamplingParams(
70
+ temperature=0.7,
71
+ top_p=0.8,
72
+ repetition_penalty=1.05,
73
+ top_k=20,
74
+ max_tokens=2748,
75
+ )
76
+
77
+ def generate(self, input_texts):
78
+ generated_texts = []
79
+ completions = self.rollout_model.generate(input_texts, self.sampling_params, use_tqdm=False)
80
+ for output in completions:
81
+ generated_text = output.outputs[0].text
82
+ generated_texts.append(generated_text)
83
+ return generated_texts
84
+
85
+ def chat(self, input_messages):
86
+ generated_texts = []
87
+ completions = self.rollout_model.chat(input_messages, self.sampling_params, use_tqdm=False)
88
+ for output in completions:
89
+ generated_text = output.outputs[0].text
90
+ generated_texts.append(generated_text)
91
+ return generated_texts
92
+
93
+ async def rollout_with_env(querys, batch_size, max_turns, model_path, url,
94
+ deploy_port=None):
95
+ """
96
+ Args:
97
+ querys: [string]
98
+ """
99
+ ###############################
100
+ #### splited by batch size ####
101
+ ###############################
102
+ n = len(querys) // batch_size
103
+ batch_querys = []
104
+ for i in range(n+1):
105
+ temp_data = querys[i*batch_size: (i+1)*batch_size]
106
+ if len(temp_data) > 0:
107
+ batch_querys.append(temp_data)
108
+ print("QUERY NUMBER with BATCH: ", [len(x) for x in batch_querys])
109
+
110
+ ###################
111
+ #### init vllm ####
112
+ ###################
113
+ vllm_manager = OriginalvLLMRollout(model_path)
114
+
115
+ ############################
116
+ #### init Format Reward ####
117
+ ############################
118
+ tokenizer = AutoTokenizer.from_pretrained(model_path)
119
+
120
+ total_rollout_data = []
121
+ for querys in batch_querys:
122
+ ###########################################
123
+ #### acquire env configs and init envs ####
124
+ ###########################################
125
+ buffer_manager = BufferManager(querys)
126
+
127
+ while True:
128
+ # Break at max-turns
129
+ if buffer_manager.step >= max_turns:
130
+ break
131
+
132
+ ###############################
133
+ #### prepare input prompts ####
134
+ ###############################
135
+ messagess_todo = buffer_manager.build_prompt_for_generator()
136
+ # breakpoint()
137
+
138
+ # Break when no tasks
139
+ if len(messagess_todo) == 0:
140
+ break
141
+
142
+ ##########################
143
+ #### generate by vLLM ####
144
+ ##########################
145
+ timing_raw = {}
146
+ with _timer('vllm sampling', timing_raw):
147
+ # response_texts = vllm_manager.chat(messagess_todo)
148
+ response_texts = await asyncio.to_thread(vllm_manager.chat, messagess_todo)
149
+
150
+ ##################################
151
+ #### preprocess the responses ####
152
+ ##################################
153
+ # 对response的详细处理��以集成到环境类中,因环境而异, 先对Response进行预处理
154
+ extracted_results = []
155
+ for response_text in response_texts:
156
+ result = BufferManager.parse_generator_response(response_text)
157
+ extracted_results.append(result)
158
+
159
+ #################################################
160
+ #### execute in environment and get feedback ####
161
+ #################################################
162
+ payload = {
163
+ "tool_calls": [x["tool_call"] for x in extracted_results]
164
+ }
165
+ if buffer_manager.step <=2:
166
+ payload["topk"] = 20
167
+ with _timer('get env feedback', timing_raw):
168
+ # env_response_batched = requests.post(url, json=payload).json()
169
+ async with aiohttp.ClientSession() as session:
170
+ async with session.post(url, json=payload) as resp:
171
+ env_response_batched = await resp.json()
172
+
173
+ ###################################
174
+ #### postprocess the feedbacks ####
175
+ ###################################
176
+ with _timer('postprocessing', timing_raw):
177
+ buffer_manager.update_trajectory(extracted_results, env_response_batched)
178
+ buffer_manager.step += 1
179
+
180
+ print(timing_raw)
181
+
182
+ if deploy_port is not None:
183
+ now_text = json_to_markdown(buffer_manager.batch_rollout_data[-1])
184
+ now_search_keywords= buffer_manager.batch_rollout_data[-1]["trajectory"][-1]["search_keywords"]
185
+ now_update = buffer_manager.batch_rollout_data[-1]["trajectory"][-1]["answer_thought"]
186
+ next_update = buffer_manager.batch_rollout_data[-1]["trajectory"][-1]["tool_call_thought"]
187
+ now_query = buffer_manager.batch_rollout_data[-1]["query"]
188
+ trajs = buffer_manager.batch_rollout_data[-1]["trajectory"]
189
+ updated_success = buffer_manager.batch_rollout_data[-1]["trajectory"][-1]["update_success"]
190
+ if updated_success:
191
+ for traj in reversed(trajs):
192
+ if len(traj["summarys"]) > 0:
193
+ break
194
+ summary_num = len(traj["summarys"])
195
+ if summary_num == 0:
196
+ summary_text = "No summaries yet."
197
+ else:
198
+ summary_text = "\n".join(traj["summarys"])
199
+ frontend_payload = {
200
+ "markdown": now_text,
201
+ "searchKeywords": now_search_keywords,
202
+ "nowUpdate": now_update,
203
+ "nextUpdate": next_update,
204
+ "query": now_query,
205
+ "papers": summary_text
206
+ }
207
+ frontend_payload = json.dumps(frontend_payload, ensure_ascii=False)
208
+ try:
209
+ await post_to_frontend(frontend_payload)
210
+ except Exception as e:
211
+ print(f"Error posting to frontend: {e}")
212
+
213
+
214
+
215
+ for item in buffer_manager.batch_rollout_data:
216
+ item["survey_text"] = SurveyManager.convert_survey_dict_to_str(item["state"]["current_survey"])
217
+
218
+ total_rollout_data.extend(buffer_manager.batch_rollout_data)
219
+ #####################################
220
+ #### clear all envs and shutdown ####
221
+ #####################################
222
+ del buffer_manager
223
+
224
+ return total_rollout_data
225
+
226
+
227
+ def json_to_markdown(json_data):
228
+ text = SurveyManager.convert_survey_dict_to_str(json_data["state"]["current_survey"])
229
+ all_summarys = {}
230
+ for traj in json_data["trajectory"]:
231
+ for item in traj["summarys"]:
232
+ split_text = item.split("\n")
233
+ bibkey = split_text[0].split(":")[1].strip()
234
+ title_begin_index = item.find("Title:") + len("Title:")
235
+ title_end_index = item.find("Abstract:")
236
+ title = item[title_begin_index:title_end_index].strip()
237
+ arxivid = bibkey.split("arxivid")[-1].strip()
238
+ html = f"arxiv.org/abs/{arxivid}"
239
+ all_summarys[bibkey] = f"[{title}](https://{html})"
240
+
241
+ reg = r"\\cite\{(.+?)\}"
242
+ placeholder_reg = re.compile(r"^#\d+$")
243
+ reg_bibkeys = re.findall(reg, text)
244
+ bibkeys = []
245
+ for bibkey in reg_bibkeys:
246
+ single_bib = bibkey.split(",")
247
+ for bib in single_bib:
248
+ if not placeholder_reg.match(bib):
249
+ bib = bib.strip()
250
+ if bib and bib != "*" and bib not in bibkeys:
251
+ bibkeys.append(bib)
252
+
253
+ bibkeys_index = {bibkey: i+1 for i, bibkey in enumerate(bibkeys)}
254
+
255
+ def replace_bibkey(bibkey):
256
+ bibkey = bibkey.group(1)
257
+ single_bib = bibkey.split(",")
258
+ new_bibs = []
259
+ for bib in single_bib:
260
+ if not placeholder_reg.match(bib):
261
+ bib = bib.strip()
262
+ if bib and bib != "*":
263
+ if bib in bibkeys_index:
264
+ new_bibs.append(f"{bibkeys_index[bib]}")
265
+ else:
266
+ print(f"Warning: {bib} not found in bibkeys")
267
+ if len(new_bibs) > 0:
268
+ return "[" + ",".join(new_bibs) + "]"
269
+ else:
270
+ return ""
271
+ text = re.sub(reg, replace_bibkey, text)
272
+ reference_text = "\n\n".join([f"[{i}] {all_summarys[bibkey]}" for bibkey, i in bibkeys_index.items()])
273
+ text += "\n## References\n" + reference_text
274
+ return text
275
+
276
+ async def test_surveyGen(model_path, out_path,querys, url, deploy_port=None):
277
+
278
+ total_rollout_data = await rollout_with_env(querys, 1, 1000, model_path, url, deploy_port)
279
+ all_md_texts = []
280
+ for json_data in total_rollout_data:
281
+ md_text = json_to_markdown(json_data)
282
+ all_md_texts.append(md_text)
283
+
284
+ all_md_texts = "\n\n".join(all_md_texts)
285
+ with open(out_path, 'w', encoding='utf8') as f:
286
+ f.write(all_md_texts)
287
+
288
+ # with jsonlines.open(out_path, 'w') as writer:
289
+ # for item in total_rollout_data:
290
+ # writer.write(item)
291
+
292
+
293
+
294
+ class QueryRequest(BaseModel):
295
+ query: str
296
+
297
+ @app.post("/generate_survey")
298
+ async def generate_survey(request: QueryRequest):
299
+ global args # Ensure args is accessible
300
+ # 这里可以根据需要处理查询
301
+ model_path = args.model_path
302
+ out_path = args.output_file
303
+ query = request.query
304
+ querys = [query] # 将查询转换为列表
305
+ url = args.retriver_url
306
+ deploy_port = args.port if args.port is not None else None
307
+ try:
308
+ await test_surveyGen(model_path, out_path, querys, url, deploy_port)
309
+ return {"status": "success", "message": "Survey generated successfully."}
310
+ except Exception as e:
311
+ print(f"Error generating survey: {e}")
312
+ return {"status": "error", "message": str(e)}
313
+
314
+
315
+ if __name__ == "__main__":
316
+ parser = argparse.ArgumentParser(description="Run survey generation with vLLM.")
317
+ parser.add_argument("--model_path", type=str, required=True, help="Path to the model.")
318
+ parser.add_argument("--query", type=str, required=True, help="Query to generate survey.")
319
+ parser.add_argument("--output_file", type=str, required=True, help="Path to the output Markdown file.")
320
+ parser.add_argument("--retriver_url", type=str, default="http://localhost:8400", help="URL of the retriever service.")
321
+ parser.add_argument("--port", type=str, default=None, help="Deploy port, default is None, which means not deploy.")
322
+ args = parser.parse_args()
323
+
324
+ if args.port is not None:
325
+ import uvicorn
326
+ uvicorn.run(app, host="localhost", port=int(args.port))# log_level="debug")
327
+
328
+ # Run the survey generation
329
+ else:
330
+ asyncio.run(
331
+ test_surveyGen(
332
+ model_path=args.model_path,
333
+ out_path=args.output_file,
334
+ querys=[args.query],
335
+ url=args.retriver_url
336
+ )
337
+ )
338
+
code/src/preprocess/build_index.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch.distributed
2
+ import faiss
3
+ import pandas as pd
4
+ import faiss
5
+ import numpy as np
6
+ import jsonlines, json
7
+ from transformers import AutoModel
8
+ import os
9
+ import torch
10
+ '''
11
+ data format:
12
+ {
13
+ "bibkey": "some_bibkey",
14
+ "text": "The abstract or text of the paper."
15
+ }
16
+ example:
17
+ {
18
+ "bibkey": "arxivid1234.5678",
19
+ "text": "Title: A Study on Something\nAbstract: This paper discusses the findings of a study on something important in the field of research.\nAuthors: John Doe"
20
+ }
21
+ '''
22
+
23
+ model_name = "openbmb/MiniCPM-Embedding-Light"
24
+ model = AutoModel.from_pretrained(model_name, trust_remote_code=True, attn_implementation="flash_attention_2", torch_dtype=torch.float16).to("cuda")
25
+
26
+ input_path = "./data/arxiv.jsonl"
27
+
28
+ with jsonlines.open(input_path) as f:
29
+ survey_data = list(f)
30
+
31
+
32
+ xids = [item["bibkey"] for item in survey_data]
33
+ passages = [item["text"] for item in survey_data]
34
+
35
+ embeddings_doc_dense, _ = model.encode_corpus(passages, max_length=1024)
36
+
37
+
38
+ # faiss save index
39
+ index = faiss.IndexFlatIP(embeddings_doc_dense.shape[1])
40
+ id_map_index = faiss.IndexIDMap(index)
41
+ index = faiss.index_cpu_to_all_gpus(id_map_index)
42
+
43
+ x_ids_int = np.array(np.arange(len(xids)))
44
+
45
+ str_int_ids = {}
46
+ for i in range(len(xids)):
47
+ str_int_ids[xids[i]] = x_ids_int[i]
48
+ str_int_ids_df = pd.DataFrame(str_int_ids, index=[0]).T.reset_index()
49
+ str_int_ids_df.columns = ["str_id", "int_id"]
50
+ str_int_ids_df.to_csv("./index/str_int_ids_abstract.csv", index=False)
51
+
52
+ index.add_with_ids(embeddings_doc_dense, x_ids_int)
53
+
54
+ index = faiss.index_gpu_to_cpu(index)
55
+ faiss.write_index(index, "./index/index_abstract.faiss")
code/src/preprocess/data_process.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # curl -L -o ~/Downloads/arxiv.zip\
2
+ # https://www.kaggle.com/api/v1/datasets/download/Cornell-University/arxiv
3
+
4
+
5
+ import jsonlines
6
+
7
+ input_path = './data/arxiv-metadata-oai-snapshot.json'
8
+ output_path = './data/arxiv.jsonl'
9
+
10
+ new_data = []
11
+ with jsonlines.open(input_path, 'r') as reader:
12
+ for item in reader:
13
+ new_item = {
14
+ 'bibkey': f"arxivid{item['id']}",
15
+ 'text': f"Title: {item['title']}\nAbstract: {item['abstract']}\nAuthors: {item['authors']}",
16
+ }
17
+ new_data.append(new_item)
18
+
19
+ with jsonlines.open(output_path, 'w') as writer:
20
+ for item in new_data:
21
+ writer.write(item)
code/src/retriever/retriever.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import faiss
2
+ from fastapi import FastAPI
3
+ import torch
4
+ import pandas as pd
5
+ from collections import defaultdict
6
+ import pandas as pd
7
+ import jsonlines
8
+ from transformers import AutoModel, AutoTokenizer
9
+ import uvicorn
10
+ import asyncio
11
+ from pydantic import BaseModel
12
+ from typing import List, Optional
13
+ import re
14
+ import json
15
+ import asyncio
16
+ import argparse
17
+
18
+
19
+ app = FastAPI()
20
+
21
+
22
+
23
+ model_name = "openbmb/MiniCPM-Embedding-Light"
24
+ model = AutoModel.from_pretrained(model_name, trust_remote_code=True, attn_implementation="flash_attention_2", torch_dtype=torch.float16).to("cuda")
25
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
26
+
27
+ co = faiss.GpuMultipleClonerOptions()
28
+ co.shard = True
29
+ co.useFloat16 = True
30
+
31
+ faiss_index_path = "./index/index_abstract.faiss" # Replace with your FAISS index path"
32
+ faiss_index = faiss.read_index(faiss_index_path)
33
+ faiss_index = faiss.index_cpu_to_all_gpus(faiss_index,co=co)
34
+
35
+ corpus_path = "./data/arxiv.jsonl"
36
+ with jsonlines.open(corpus_path) as f:
37
+ paper_data = list(f)
38
+ paper_dict = {}
39
+ item_key = "text"
40
+
41
+
42
+ index_path = "./index/str_int_ids_abstract.csv"
43
+ index_df = pd.read_csv(index_path,converters={0: lambda x: str(x),1: lambda x: int(x)})
44
+ index_df.columns = ["str_id", "int_id"]
45
+ index_dict = index_df.set_index("int_id")["str_id"].to_dict()
46
+
47
+
48
+ for item in paper_data:
49
+ paper_dict[item["bibkey"]] = item[item_key]
50
+
51
+ class QueryRequest(BaseModel):
52
+ queries: List[str]
53
+ topk: Optional[int] = None
54
+ return_scores: bool = False
55
+
56
+ class MessageRequest(BaseModel):
57
+ tool_calls: List
58
+ topk: Optional[int] = 10
59
+
60
+ @app.post("/")
61
+ async def search_text_batch(request:MessageRequest):
62
+ tool_calls = request.tool_calls
63
+ topk = request.topk
64
+ results = []
65
+ finalize_indices = []
66
+ search_engine_indices = []
67
+ for i in range(len(tool_calls)):
68
+ try:
69
+ tool_calls[i]["name"]
70
+ except KeyError:
71
+ finalize_indices.append(i)
72
+ continue
73
+ if tool_calls[i]["name"] == "search_engine":
74
+ search_engine_indices.append(i)
75
+ elif tool_calls[i]["name"] == "finalize":
76
+ finalize_indices.append(i)
77
+ else:
78
+ finalize_indices.append(i)
79
+
80
+
81
+ tasks = []
82
+ for i in range(len(tool_calls)):
83
+ if i in search_engine_indices:
84
+ tasks.append(call_search_engine(tool_calls[i], topk))
85
+ search_task_results = await asyncio.gather(*tasks)
86
+ num_search = 0
87
+ num_finalize = 0
88
+ for i in range(len(tool_calls)):
89
+ if i in finalize_indices:
90
+ search_keywords, bibkeys,abstracts, done, score = "",[], [], True, 0.0
91
+ num_finalize += 1
92
+ elif i in search_engine_indices:
93
+ search_keywords, bibkeys, abstracts, done, score = search_task_results[num_search]
94
+ num_search += 1
95
+
96
+ titles = []
97
+ for abstract in abstracts:
98
+ try:
99
+ title = abstract.split("\n")[1]
100
+ title = title.split(":")[1].strip()
101
+ titles.append(title)
102
+ except:
103
+ titles.append("")
104
+ results.append({ "search_keywords":search_keywords, "summarys":abstracts, "done":done, "score":score, "titles":titles, "bibkeys":bibkeys})
105
+
106
+
107
+ return results
108
+
109
+ def extract_tool_call(text: str):
110
+ text = text.strip()
111
+
112
+ pattern = r"<tool_call>(.*?)</tool_call>"
113
+ match = re.search(pattern, text, re.DOTALL)
114
+ if not match:
115
+ return None
116
+ tool_text = match.group(1)
117
+ try:
118
+ tool_call = json.loads(tool_text)
119
+ except json.JSONDecodeError:
120
+ return None
121
+ return tool_call if isinstance(tool_call, dict) else None
122
+
123
+
124
+ def get_response(queries,ref):
125
+ text_raw = paper_dict[str(ref)]
126
+ text_raw = tokenizer(text_raw, max_length=8192, truncation=True)
127
+ text_raw = tokenizer.decode(text_raw["input_ids"])
128
+
129
+ response = text_raw
130
+ response = f"bibkey: {str(ref)}\n"+response
131
+ return response
132
+
133
+ async def call_search_engine(tool_call, topk=10):
134
+ try:
135
+ queries = tool_call["arguments"]["query"]
136
+ if isinstance(queries, str):
137
+ queries = [queries]
138
+ else:
139
+ queries = list(queries)
140
+
141
+ if len(queries) == 0:
142
+ return "", [], [], False, 0.0
143
+ results = defaultdict(dict)
144
+ query_embedding_to_text,_ = model.encode_query(queries, max_length=512, show_progress_bar=False)
145
+ _,results = faiss_index.search(query_embedding_to_text, topk)
146
+ result2query = {}
147
+ merge_rrf = defaultdict(float)
148
+ for i in range(len(results)):
149
+ for j in range(len(results[i])):
150
+ merge_rrf[results[i][j]] += 1/(j+1)
151
+ result2query[results[i][j]] = queries[i]
152
+ results = sorted(merge_rrf.items(), key=lambda x: x[1], reverse=True)
153
+
154
+ results = [x[0] for x in results][:topk]
155
+
156
+ # new_queries = [result2query[result] for result in results]
157
+ queries = ",".join(queries)
158
+
159
+ # bibkeys = [str(results[i]) for i in range(len(results))]
160
+ bibkeys = [str(index_dict[results[i]]) for i in range(len(results))]
161
+ response = [f"bibkey: {bibkey}\n{paper_dict[bibkey]}" for bibkey in bibkeys]
162
+ return queries,bibkeys , response, False, 0.0
163
+ except Exception as e:
164
+ print(f"Error in call_search_engine: {e}")
165
+ return "",[], [], False, 0.0
166
+
167
+
168
+
169
+ if __name__ == "__main__":
170
+ parser = argparse.ArgumentParser(description="Run the FastAPI application.")
171
+ parser.add_argument("--port", type=int, default=8400, help="Port to run the FastAPI application on.")
172
+ args = parser.parse_args()
173
+
174
+
175
+ uvicorn.run(app, host="0.0.0.0", port=args.port)
config.json ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "MiniCPMForCausalLM"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "auto_map": {
8
+ "AutoConfig": "configuration_minicpm.MiniCPMConfig",
9
+ "AutoModel": "modeling_minicpm.MiniCPMForCausalLM",
10
+ "AutoModelForCausalLM": "modeling_minicpm.MiniCPMForCausalLM",
11
+ "AutoModelForSeq2SeqLM": "modeling_minicpm.MiniCPMForCausalLM",
12
+ "AutoModelForSequenceClassification": "modeling_minicpm.MiniCPMForSequenceClassification"
13
+ },
14
+ "bos_token_id": 1,
15
+ "dim_model_base": 256,
16
+ "eos_token_id": 73440,
17
+ "hidden_act": "silu",
18
+ "hidden_size": 4096,
19
+ "initializer_range": 0.1,
20
+ "intermediate_size": 16384,
21
+ "max_position_embeddings": 32768,
22
+ "model_type": "minicpm",
23
+ "num_attention_heads": 32,
24
+ "num_hidden_layers": 32,
25
+ "num_key_value_heads": 2,
26
+ "pad_token_id": 73440,
27
+ "pretraining_tp": 1,
28
+ "rms_norm_eps": 1e-06,
29
+ "rope_scaling": {
30
+ "long_factor": [
31
+ 0.9977997200264581,
32
+ 1.014658295992452,
33
+ 1.0349680404997148,
34
+ 1.059429246056193,
35
+ 1.0888815016813513,
36
+ 1.1243301355211495,
37
+ 1.166977103606075,
38
+ 1.2182568066927284,
39
+ 1.2798772354275727,
40
+ 1.3538666751582975,
41
+ 1.4426259039919596,
42
+ 1.5489853358570191,
43
+ 1.6762658237220625,
44
+ 1.8283407612492941,
45
+ 2.0096956085876183,
46
+ 2.225478927469756,
47
+ 2.481536379650452,
48
+ 2.784415934557119,
49
+ 3.1413289096347365,
50
+ 3.560047844772632,
51
+ 4.048719380066383,
52
+ 4.615569542115128,
53
+ 5.2684819496549835,
54
+ 6.014438591970396,
55
+ 6.858830049237097,
56
+ 7.804668263503327,
57
+ 8.851768731513417,
58
+ 9.99600492938444,
59
+ 11.228766118181639,
60
+ 12.536757560834843,
61
+ 13.902257701387796,
62
+ 15.303885189125953,
63
+ 16.717837610115794,
64
+ 18.119465097853947,
65
+ 19.484965238406907,
66
+ 20.792956681060105,
67
+ 22.02571786985731,
68
+ 23.16995406772833,
69
+ 24.217054535738416,
70
+ 25.16289275000465,
71
+ 26.007284207271347,
72
+ 26.753240849586767,
73
+ 27.40615325712662,
74
+ 27.973003419175363,
75
+ 28.461674954469114,
76
+ 28.880393889607006,
77
+ 29.237306864684626,
78
+ 29.540186419591297,
79
+ 29.79624387177199,
80
+ 30.01202719065413,
81
+ 30.193382037992453,
82
+ 30.34545697551969,
83
+ 30.47273746338473,
84
+ 30.579096895249787,
85
+ 30.66785612408345,
86
+ 30.741845563814174,
87
+ 30.80346599254902,
88
+ 30.85474569563567,
89
+ 30.897392663720595,
90
+ 30.932841297560394,
91
+ 30.962293553185553,
92
+ 30.986754758742034,
93
+ 31.007064503249293,
94
+ 31.02392307921529
95
+ ],
96
+ "original_max_position_embeddings": 32768,
97
+ "rope_type": "longrope",
98
+ "short_factor": [
99
+ 0.9977997200264581,
100
+ 1.014658295992452,
101
+ 1.0349680404997148,
102
+ 1.059429246056193,
103
+ 1.0888815016813513,
104
+ 1.1243301355211495,
105
+ 1.166977103606075,
106
+ 1.2182568066927284,
107
+ 1.2798772354275727,
108
+ 1.3538666751582975,
109
+ 1.4426259039919596,
110
+ 1.5489853358570191,
111
+ 1.6762658237220625,
112
+ 1.8283407612492941,
113
+ 2.0096956085876183,
114
+ 2.225478927469756,
115
+ 2.481536379650452,
116
+ 2.784415934557119,
117
+ 3.1413289096347365,
118
+ 3.560047844772632,
119
+ 4.048719380066383,
120
+ 4.615569542115128,
121
+ 5.2684819496549835,
122
+ 6.014438591970396,
123
+ 6.858830049237097,
124
+ 7.804668263503327,
125
+ 8.851768731513417,
126
+ 9.99600492938444,
127
+ 11.228766118181639,
128
+ 12.536757560834843,
129
+ 13.902257701387796,
130
+ 15.303885189125953,
131
+ 16.717837610115794,
132
+ 18.119465097853947,
133
+ 19.484965238406907,
134
+ 20.792956681060105,
135
+ 22.02571786985731,
136
+ 23.16995406772833,
137
+ 24.217054535738416,
138
+ 25.16289275000465,
139
+ 26.007284207271347,
140
+ 26.753240849586767,
141
+ 27.40615325712662,
142
+ 27.973003419175363,
143
+ 28.461674954469114,
144
+ 28.880393889607006,
145
+ 29.237306864684626,
146
+ 29.540186419591297,
147
+ 29.79624387177199,
148
+ 30.01202719065413,
149
+ 30.193382037992453,
150
+ 30.34545697551969,
151
+ 30.47273746338473,
152
+ 30.579096895249787,
153
+ 30.66785612408345,
154
+ 30.741845563814174,
155
+ 30.80346599254902,
156
+ 30.85474569563567,
157
+ 30.897392663720595,
158
+ 30.932841297560394,
159
+ 30.962293553185553,
160
+ 30.986754758742034,
161
+ 31.007064503249293,
162
+ 31.02392307921529
163
+ ]
164
+ },
165
+ "rope_theta": 10000.0,
166
+ "scale_depth": 1.4,
167
+ "scale_emb": 12,
168
+ "tie_word_embeddings": false,
169
+ "torch_dtype": "bfloat16",
170
+ "transformers_version": "4.51.3",
171
+ "use_cache": false,
172
+ "vocab_size": 73448
173
+ }
configuration_minicpm.py ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved.
3
+ #
4
+ # This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX
5
+ # and OPT implementations in this library. It has been modified from its
6
+ # original forms to accommodate minor architectural differences compared
7
+ # to GPT-NeoX and OPT used by the Meta AI team that trained the model.
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ """ MiniCPM model configuration"""
21
+
22
+ from transformers.configuration_utils import PretrainedConfig
23
+ from transformers.utils import logging
24
+
25
+
26
+ logger = logging.get_logger(__name__)
27
+
28
+ MINICPM_PRETRAINED_CONFIG_ARCHIVE_MAP = {}
29
+
30
+
31
+ class MiniCPMConfig(PretrainedConfig):
32
+ r"""
33
+ This is the configuration class to store the configuration of a [`MiniCPMModel`]. It is used to instantiate an MiniCPM
34
+ model according to the specified arguments, defining the model architecture. Instantiating a configuration with the
35
+ defaults will yield a similar configuration to that of the MiniCPM-7B.
36
+
37
+ Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the
38
+ documentation from [`PretrainedConfig`] for more information.
39
+
40
+
41
+ Args:
42
+ vocab_size (`int`, *optional*, defaults to 32000):
43
+ Vocabulary size of the MiniCPM model. Defines the number of different tokens that can be represented by the
44
+ `inputs_ids` passed when calling [`MiniCPMModel`]
45
+ hidden_size (`int`, *optional*, defaults to 4096):
46
+ Dimension of the hidden representations.
47
+ intermediate_size (`int`, *optional*, defaults to 11008):
48
+ Dimension of the MLP representations.
49
+ num_hidden_layers (`int`, *optional*, defaults to 32):
50
+ Number of hidden layers in the Transformer decoder.
51
+ num_attention_heads (`int`, *optional*, defaults to 32):
52
+ Number of attention heads for each attention layer in the Transformer decoder.
53
+ num_key_value_heads (`int`, *optional*):
54
+ This is the number of key_value heads that should be used to implement Grouped Query Attention. If
55
+ `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if
56
+ `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When
57
+ converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed
58
+ by meanpooling all the original heads within that group. For more details checkout [this
59
+ paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to
60
+ `num_attention_heads`.
61
+ hidden_act (`str` or `function`, *optional*, defaults to `"silu"`):
62
+ The non-linear activation function (function or string) in the decoder.
63
+ max_position_embeddings (`int`, *optional*, defaults to 2048):
64
+ The maximum sequence length that this model might ever be used with. MiniCPM 1 supports up to 2048 tokens,
65
+ MiniCPM 2 up to 4096, CodeMiniCPM up to 16384.
66
+ initializer_range (`float`, *optional*, defaults to 0.02):
67
+ The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
68
+ rms_norm_eps (`float`, *optional*, defaults to 1e-06):
69
+ The epsilon used by the rms normalization layers.
70
+ use_cache (`bool`, *optional*, defaults to `True`):
71
+ Whether or not the model should return the last key/values attentions (not used by all models). Only
72
+ relevant if `config.is_decoder=True`.
73
+ pad_token_id (`int`, *optional*):
74
+ Padding token id.
75
+ bos_token_id (`int`, *optional*, defaults to 1):
76
+ Beginning of stream token id.
77
+ eos_token_id (`int`, *optional*, defaults to 2):
78
+ End of stream token id.
79
+ pretraining_tp (`int`, *optional*, defaults to 1):
80
+ Experimental feature. Tensor parallelism rank used during pretraining. Please refer to [this
81
+ document](https://huggingface.co/docs/transformers/parallelism) to understand more about it. This value is
82
+ necessary to ensure exact reproducibility of the pretraining results. Please refer to [this
83
+ issue](https://github.com/pytorch/pytorch/issues/76232).
84
+ tie_word_embeddings (`bool`, *optional*, defaults to `False`):
85
+ Whether to tie weight embeddings
86
+ rope_theta (`float`, *optional*, defaults to 10000.0):
87
+ The base period of the RoPE embeddings.
88
+ rope_scaling (`Dict`, *optional*):
89
+ Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports two scaling
90
+ strategies: linear and dynamic. Their scaling factor must be a float greater than 1. The expected format is
91
+ `{"type": strategy name, "factor": scaling factor}`. When using this flag, don't update
92
+ `max_position_embeddings` to the expected new maximum. See the following thread for more information on how
93
+ these scaling strategies behave:
94
+ https://www.reddit.com/r/LocalMiniCPM/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an
95
+ experimental feature, subject to breaking API changes in future versions.
96
+ attention_bias (`bool`, defaults to `False`, *optional*, defaults to `False`):
97
+ Whether to use a bias in the query, key, value and output projection layers during self-attention.
98
+ attention_dropout (`float`, *optional*, defaults to 0.0):
99
+ The dropout ratio for the attention probabilities.
100
+
101
+ ```python
102
+ >>> from transformers import MiniCPMModel, MiniCPMConfig
103
+
104
+ >>> # Initializing a MiniCPM minicpm-7b style configuration
105
+ >>> configuration = MiniCPMConfig()
106
+
107
+ >>> # Initializing a model from the minicpm-7b style configuration
108
+ >>> model = MiniCPMModel(configuration)
109
+
110
+ >>> # Accessing the model configuration
111
+ >>> configuration = model.config
112
+ ```"""
113
+
114
+ model_type = "minicpm"
115
+ keys_to_ignore_at_inference = ["past_key_values"]
116
+
117
+ def __init__(
118
+ self,
119
+ vocab_size=32000,
120
+ hidden_size=4096,
121
+ intermediate_size=11008,
122
+ num_hidden_layers=32,
123
+ num_attention_heads=32,
124
+ num_key_value_heads=None,
125
+ hidden_act="silu",
126
+ max_position_embeddings=2048,
127
+ initializer_range=0.02,
128
+ rms_norm_eps=1e-6,
129
+ use_cache=True,
130
+ pad_token_id=None,
131
+ bos_token_id=1,
132
+ eos_token_id=2,
133
+ pretraining_tp=1,
134
+ tie_word_embeddings=True,
135
+ rope_theta=10000.0,
136
+ rope_scaling=None,
137
+ attention_bias=False,
138
+ attention_dropout=0.0,
139
+ scale_emb=1,
140
+ dim_model_base=1,
141
+ scale_depth=1,
142
+ **kwargs,
143
+ ):
144
+ self.vocab_size = vocab_size
145
+ self.max_position_embeddings = max_position_embeddings
146
+ self.hidden_size = hidden_size
147
+ self.intermediate_size = intermediate_size
148
+ self.num_hidden_layers = num_hidden_layers
149
+ self.num_attention_heads = num_attention_heads
150
+
151
+ # for backward compatibility
152
+ if num_key_value_heads is None:
153
+ num_key_value_heads = num_attention_heads
154
+
155
+ self.num_key_value_heads = num_key_value_heads
156
+ self.hidden_act = hidden_act
157
+ self.initializer_range = initializer_range
158
+ self.rms_norm_eps = rms_norm_eps
159
+ self.pretraining_tp = pretraining_tp
160
+ self.use_cache = use_cache
161
+ self.rope_theta = rope_theta
162
+ self.rope_scaling = rope_scaling
163
+ # self._rope_scaling_validation()
164
+ self.attention_bias = attention_bias
165
+ self.attention_dropout = attention_dropout
166
+ self.scale_emb = scale_emb
167
+ self.dim_model_base = dim_model_base
168
+ self.scale_depth = scale_depth
169
+
170
+ super().__init__(
171
+ pad_token_id=pad_token_id,
172
+ bos_token_id=bos_token_id,
173
+ eos_token_id=eos_token_id,
174
+ tie_word_embeddings=tie_word_embeddings,
175
+ **kwargs,
176
+ )
177
+ try:
178
+ import flash_attn
179
+ self._attn_implementation = "flash_attention_2"
180
+ except:
181
+ pass
182
+
183
+ def _rope_scaling_validation(self):
184
+ """
185
+ Validate the `rope_scaling` configuration.
186
+ """
187
+ if self.rope_scaling is None:
188
+ return
189
+
190
+ if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 2:
191
+ raise ValueError(
192
+ "`rope_scaling` must be a dictionary with with two fields, `type` and `factor`, "
193
+ f"got {self.rope_scaling}"
194
+ )
195
+ rope_scaling_type = self.rope_scaling.get("type", None)
196
+ rope_scaling_factor = self.rope_scaling.get("factor", None)
197
+ if rope_scaling_type is None or rope_scaling_type not in ["linear", "dynamic"]:
198
+ raise ValueError(
199
+ f"`rope_scaling`'s type field must be one of ['linear', 'dynamic'], got {rope_scaling_type}"
200
+ )
201
+ if rope_scaling_factor is None or not isinstance(rope_scaling_factor, float) or rope_scaling_factor <= 1.0:
202
+ raise ValueError(f"`rope_scaling`'s factor field must be a float > 1, got {rope_scaling_factor}")
generation_config.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 1,
4
+ "eos_token_id": 73440,
5
+ "pad_token_id": 73440,
6
+ "transformers_version": "4.51.3",
7
+ "use_cache": false
8
+ }
model-00001-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2272d2c328bc65ef4e1a7710f1d29f3584c84fe7f5a8460a44e41da41561ac72
3
+ size 4964116352
model-00002-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:927aa21158b149c9bd8de07238d2060fba7525f822fa465b6a74b2ccb25e1cfb
3
+ size 4974396952
model-00003-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:74a22956fac386f8f1fdff60c090aa9a14d2d241b666261ad61422ce5def2d8f
3
+ size 4877986360
model-00004-of-00004.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b3d1610f229731974c82b387dfaa04e74920ae45f6f892aadfaef0f65c160066
3
+ size 1554041896
model.safetensors.index.json ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata": {
3
+ "total_size": 16370507776
4
+ },
5
+ "weight_map": {
6
+ "lm_head.weight": "model-00002-of-00004.safetensors",
7
+ "model.embed_tokens.weight": "model-00003-of-00004.safetensors",
8
+ "model.layers.0.input_layernorm.weight": "model-00001-of-00004.safetensors",
9
+ "model.layers.0.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
10
+ "model.layers.0.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
11
+ "model.layers.0.mlp.up_proj.weight": "model-00004-of-00004.safetensors",
12
+ "model.layers.0.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
13
+ "model.layers.0.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
14
+ "model.layers.0.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
15
+ "model.layers.0.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
16
+ "model.layers.0.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
17
+ "model.layers.1.input_layernorm.weight": "model-00002-of-00004.safetensors",
18
+ "model.layers.1.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
19
+ "model.layers.1.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
20
+ "model.layers.1.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
21
+ "model.layers.1.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
22
+ "model.layers.1.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
23
+ "model.layers.1.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
24
+ "model.layers.1.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
25
+ "model.layers.1.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
26
+ "model.layers.10.input_layernorm.weight": "model-00004-of-00004.safetensors",
27
+ "model.layers.10.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
28
+ "model.layers.10.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
29
+ "model.layers.10.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
30
+ "model.layers.10.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
31
+ "model.layers.10.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
32
+ "model.layers.10.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
33
+ "model.layers.10.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
34
+ "model.layers.10.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
35
+ "model.layers.11.input_layernorm.weight": "model-00001-of-00004.safetensors",
36
+ "model.layers.11.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
37
+ "model.layers.11.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
38
+ "model.layers.11.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
39
+ "model.layers.11.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
40
+ "model.layers.11.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
41
+ "model.layers.11.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
42
+ "model.layers.11.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
43
+ "model.layers.11.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
44
+ "model.layers.12.input_layernorm.weight": "model-00003-of-00004.safetensors",
45
+ "model.layers.12.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
46
+ "model.layers.12.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
47
+ "model.layers.12.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
48
+ "model.layers.12.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
49
+ "model.layers.12.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
50
+ "model.layers.12.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
51
+ "model.layers.12.self_attn.q_proj.weight": "model-00004-of-00004.safetensors",
52
+ "model.layers.12.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
53
+ "model.layers.13.input_layernorm.weight": "model-00001-of-00004.safetensors",
54
+ "model.layers.13.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
55
+ "model.layers.13.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
56
+ "model.layers.13.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
57
+ "model.layers.13.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
58
+ "model.layers.13.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
59
+ "model.layers.13.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
60
+ "model.layers.13.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
61
+ "model.layers.13.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
62
+ "model.layers.14.input_layernorm.weight": "model-00002-of-00004.safetensors",
63
+ "model.layers.14.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
64
+ "model.layers.14.mlp.gate_proj.weight": "model-00004-of-00004.safetensors",
65
+ "model.layers.14.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
66
+ "model.layers.14.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
67
+ "model.layers.14.self_attn.k_proj.weight": "model-00004-of-00004.safetensors",
68
+ "model.layers.14.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
69
+ "model.layers.14.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
70
+ "model.layers.14.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
71
+ "model.layers.15.input_layernorm.weight": "model-00004-of-00004.safetensors",
72
+ "model.layers.15.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
73
+ "model.layers.15.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
74
+ "model.layers.15.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
75
+ "model.layers.15.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
76
+ "model.layers.15.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
77
+ "model.layers.15.self_attn.o_proj.weight": "model-00004-of-00004.safetensors",
78
+ "model.layers.15.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
79
+ "model.layers.15.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
80
+ "model.layers.16.input_layernorm.weight": "model-00002-of-00004.safetensors",
81
+ "model.layers.16.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
82
+ "model.layers.16.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
83
+ "model.layers.16.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
84
+ "model.layers.16.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
85
+ "model.layers.16.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
86
+ "model.layers.16.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
87
+ "model.layers.16.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
88
+ "model.layers.16.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
89
+ "model.layers.17.input_layernorm.weight": "model-00001-of-00004.safetensors",
90
+ "model.layers.17.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
91
+ "model.layers.17.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
92
+ "model.layers.17.mlp.up_proj.weight": "model-00004-of-00004.safetensors",
93
+ "model.layers.17.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
94
+ "model.layers.17.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
95
+ "model.layers.17.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
96
+ "model.layers.17.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
97
+ "model.layers.17.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
98
+ "model.layers.18.input_layernorm.weight": "model-00002-of-00004.safetensors",
99
+ "model.layers.18.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
100
+ "model.layers.18.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
101
+ "model.layers.18.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
102
+ "model.layers.18.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
103
+ "model.layers.18.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
104
+ "model.layers.18.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
105
+ "model.layers.18.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
106
+ "model.layers.18.self_attn.v_proj.weight": "model-00004-of-00004.safetensors",
107
+ "model.layers.19.input_layernorm.weight": "model-00003-of-00004.safetensors",
108
+ "model.layers.19.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
109
+ "model.layers.19.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
110
+ "model.layers.19.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
111
+ "model.layers.19.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
112
+ "model.layers.19.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
113
+ "model.layers.19.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
114
+ "model.layers.19.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
115
+ "model.layers.19.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
116
+ "model.layers.2.input_layernorm.weight": "model-00001-of-00004.safetensors",
117
+ "model.layers.2.mlp.down_proj.weight": "model-00004-of-00004.safetensors",
118
+ "model.layers.2.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
119
+ "model.layers.2.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
120
+ "model.layers.2.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
121
+ "model.layers.2.self_attn.k_proj.weight": "model-00004-of-00004.safetensors",
122
+ "model.layers.2.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
123
+ "model.layers.2.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
124
+ "model.layers.2.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
125
+ "model.layers.20.input_layernorm.weight": "model-00003-of-00004.safetensors",
126
+ "model.layers.20.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
127
+ "model.layers.20.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
128
+ "model.layers.20.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
129
+ "model.layers.20.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
130
+ "model.layers.20.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
131
+ "model.layers.20.self_attn.o_proj.weight": "model-00004-of-00004.safetensors",
132
+ "model.layers.20.self_attn.q_proj.weight": "model-00004-of-00004.safetensors",
133
+ "model.layers.20.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
134
+ "model.layers.21.input_layernorm.weight": "model-00003-of-00004.safetensors",
135
+ "model.layers.21.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
136
+ "model.layers.21.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
137
+ "model.layers.21.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
138
+ "model.layers.21.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
139
+ "model.layers.21.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
140
+ "model.layers.21.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
141
+ "model.layers.21.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
142
+ "model.layers.21.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
143
+ "model.layers.22.input_layernorm.weight": "model-00003-of-00004.safetensors",
144
+ "model.layers.22.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
145
+ "model.layers.22.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
146
+ "model.layers.22.mlp.up_proj.weight": "model-00004-of-00004.safetensors",
147
+ "model.layers.22.post_attention_layernorm.weight": "model-00004-of-00004.safetensors",
148
+ "model.layers.22.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
149
+ "model.layers.22.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
150
+ "model.layers.22.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
151
+ "model.layers.22.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
152
+ "model.layers.23.input_layernorm.weight": "model-00004-of-00004.safetensors",
153
+ "model.layers.23.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
154
+ "model.layers.23.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
155
+ "model.layers.23.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
156
+ "model.layers.23.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
157
+ "model.layers.23.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
158
+ "model.layers.23.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
159
+ "model.layers.23.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
160
+ "model.layers.23.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
161
+ "model.layers.24.input_layernorm.weight": "model-00001-of-00004.safetensors",
162
+ "model.layers.24.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
163
+ "model.layers.24.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
164
+ "model.layers.24.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
165
+ "model.layers.24.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
166
+ "model.layers.24.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
167
+ "model.layers.24.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
168
+ "model.layers.24.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
169
+ "model.layers.24.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
170
+ "model.layers.25.input_layernorm.weight": "model-00004-of-00004.safetensors",
171
+ "model.layers.25.mlp.down_proj.weight": "model-00004-of-00004.safetensors",
172
+ "model.layers.25.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
173
+ "model.layers.25.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
174
+ "model.layers.25.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
175
+ "model.layers.25.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
176
+ "model.layers.25.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
177
+ "model.layers.25.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
178
+ "model.layers.25.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
179
+ "model.layers.26.input_layernorm.weight": "model-00003-of-00004.safetensors",
180
+ "model.layers.26.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
181
+ "model.layers.26.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
182
+ "model.layers.26.mlp.up_proj.weight": "model-00004-of-00004.safetensors",
183
+ "model.layers.26.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
184
+ "model.layers.26.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
185
+ "model.layers.26.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
186
+ "model.layers.26.self_attn.q_proj.weight": "model-00004-of-00004.safetensors",
187
+ "model.layers.26.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
188
+ "model.layers.27.input_layernorm.weight": "model-00003-of-00004.safetensors",
189
+ "model.layers.27.mlp.down_proj.weight": "model-00004-of-00004.safetensors",
190
+ "model.layers.27.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
191
+ "model.layers.27.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
192
+ "model.layers.27.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
193
+ "model.layers.27.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
194
+ "model.layers.27.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
195
+ "model.layers.27.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
196
+ "model.layers.27.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
197
+ "model.layers.28.input_layernorm.weight": "model-00001-of-00004.safetensors",
198
+ "model.layers.28.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
199
+ "model.layers.28.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
200
+ "model.layers.28.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
201
+ "model.layers.28.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
202
+ "model.layers.28.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
203
+ "model.layers.28.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
204
+ "model.layers.28.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
205
+ "model.layers.28.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
206
+ "model.layers.29.input_layernorm.weight": "model-00003-of-00004.safetensors",
207
+ "model.layers.29.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
208
+ "model.layers.29.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
209
+ "model.layers.29.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
210
+ "model.layers.29.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
211
+ "model.layers.29.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
212
+ "model.layers.29.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
213
+ "model.layers.29.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
214
+ "model.layers.29.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
215
+ "model.layers.3.input_layernorm.weight": "model-00003-of-00004.safetensors",
216
+ "model.layers.3.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
217
+ "model.layers.3.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
218
+ "model.layers.3.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
219
+ "model.layers.3.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
220
+ "model.layers.3.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
221
+ "model.layers.3.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
222
+ "model.layers.3.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
223
+ "model.layers.3.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
224
+ "model.layers.30.input_layernorm.weight": "model-00002-of-00004.safetensors",
225
+ "model.layers.30.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
226
+ "model.layers.30.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
227
+ "model.layers.30.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
228
+ "model.layers.30.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
229
+ "model.layers.30.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
230
+ "model.layers.30.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
231
+ "model.layers.30.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
232
+ "model.layers.30.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
233
+ "model.layers.31.input_layernorm.weight": "model-00003-of-00004.safetensors",
234
+ "model.layers.31.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
235
+ "model.layers.31.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
236
+ "model.layers.31.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
237
+ "model.layers.31.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
238
+ "model.layers.31.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
239
+ "model.layers.31.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
240
+ "model.layers.31.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
241
+ "model.layers.31.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
242
+ "model.layers.4.input_layernorm.weight": "model-00002-of-00004.safetensors",
243
+ "model.layers.4.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
244
+ "model.layers.4.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
245
+ "model.layers.4.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
246
+ "model.layers.4.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
247
+ "model.layers.4.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
248
+ "model.layers.4.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
249
+ "model.layers.4.self_attn.q_proj.weight": "model-00002-of-00004.safetensors",
250
+ "model.layers.4.self_attn.v_proj.weight": "model-00004-of-00004.safetensors",
251
+ "model.layers.5.input_layernorm.weight": "model-00003-of-00004.safetensors",
252
+ "model.layers.5.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
253
+ "model.layers.5.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
254
+ "model.layers.5.mlp.up_proj.weight": "model-00002-of-00004.safetensors",
255
+ "model.layers.5.post_attention_layernorm.weight": "model-00001-of-00004.safetensors",
256
+ "model.layers.5.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
257
+ "model.layers.5.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
258
+ "model.layers.5.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
259
+ "model.layers.5.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
260
+ "model.layers.6.input_layernorm.weight": "model-00001-of-00004.safetensors",
261
+ "model.layers.6.mlp.down_proj.weight": "model-00001-of-00004.safetensors",
262
+ "model.layers.6.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
263
+ "model.layers.6.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
264
+ "model.layers.6.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
265
+ "model.layers.6.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
266
+ "model.layers.6.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
267
+ "model.layers.6.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
268
+ "model.layers.6.self_attn.v_proj.weight": "model-00004-of-00004.safetensors",
269
+ "model.layers.7.input_layernorm.weight": "model-00004-of-00004.safetensors",
270
+ "model.layers.7.mlp.down_proj.weight": "model-00002-of-00004.safetensors",
271
+ "model.layers.7.mlp.gate_proj.weight": "model-00003-of-00004.safetensors",
272
+ "model.layers.7.mlp.up_proj.weight": "model-00001-of-00004.safetensors",
273
+ "model.layers.7.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
274
+ "model.layers.7.self_attn.k_proj.weight": "model-00003-of-00004.safetensors",
275
+ "model.layers.7.self_attn.o_proj.weight": "model-00002-of-00004.safetensors",
276
+ "model.layers.7.self_attn.q_proj.weight": "model-00001-of-00004.safetensors",
277
+ "model.layers.7.self_attn.v_proj.weight": "model-00003-of-00004.safetensors",
278
+ "model.layers.8.input_layernorm.weight": "model-00002-of-00004.safetensors",
279
+ "model.layers.8.mlp.down_proj.weight": "model-00003-of-00004.safetensors",
280
+ "model.layers.8.mlp.gate_proj.weight": "model-00002-of-00004.safetensors",
281
+ "model.layers.8.mlp.up_proj.weight": "model-00003-of-00004.safetensors",
282
+ "model.layers.8.post_attention_layernorm.weight": "model-00003-of-00004.safetensors",
283
+ "model.layers.8.self_attn.k_proj.weight": "model-00001-of-00004.safetensors",
284
+ "model.layers.8.self_attn.o_proj.weight": "model-00001-of-00004.safetensors",
285
+ "model.layers.8.self_attn.q_proj.weight": "model-00003-of-00004.safetensors",
286
+ "model.layers.8.self_attn.v_proj.weight": "model-00002-of-00004.safetensors",
287
+ "model.layers.9.input_layernorm.weight": "model-00001-of-00004.safetensors",
288
+ "model.layers.9.mlp.down_proj.weight": "model-00004-of-00004.safetensors",
289
+ "model.layers.9.mlp.gate_proj.weight": "model-00001-of-00004.safetensors",
290
+ "model.layers.9.mlp.up_proj.weight": "model-00004-of-00004.safetensors",
291
+ "model.layers.9.post_attention_layernorm.weight": "model-00002-of-00004.safetensors",
292
+ "model.layers.9.self_attn.k_proj.weight": "model-00002-of-00004.safetensors",
293
+ "model.layers.9.self_attn.o_proj.weight": "model-00003-of-00004.safetensors",
294
+ "model.layers.9.self_attn.q_proj.weight": "model-00004-of-00004.safetensors",
295
+ "model.layers.9.self_attn.v_proj.weight": "model-00001-of-00004.safetensors",
296
+ "model.norm.weight": "model-00002-of-00004.safetensors"
297
+ }
298
+ }
special_tokens_map.json ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "additional_special_tokens": [
3
+ "<|im_end|>",
4
+ "<|im_start|>",
5
+ "<|tool_call|>",
6
+ "<|execute_start|>",
7
+ "<|execute_end|>",
8
+ "<|fim_prefix|>",
9
+ "<|fim_middle|>",
10
+ "<|fim_suffix|>"
11
+ ],
12
+ "bos_token": {
13
+ "content": "<s>",
14
+ "lstrip": false,
15
+ "normalized": false,
16
+ "rstrip": false,
17
+ "single_word": false
18
+ },
19
+ "eos_token": {
20
+ "content": "<|im_end|>",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false
25
+ },
26
+ "pad_token": {
27
+ "content": "<|im_end|>",
28
+ "lstrip": false,
29
+ "normalized": false,
30
+ "rstrip": false,
31
+ "single_word": false
32
+ },
33
+ "unk_token": {
34
+ "content": "<unk>",
35
+ "lstrip": false,
36
+ "normalized": false,
37
+ "rstrip": false,
38
+ "single_word": false
39
+ }
40
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:bb74d51116831c3bf65db812c553f94ab0c88dcf97a5bbb37e3504f6d359c530
3
+ size 1181204
tokenizer_config.json ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_bos_token": true,
3
+ "add_eos_token": false,
4
+ "add_prefix_space": null,
5
+ "added_tokens_decoder": {
6
+ "0": {
7
+ "content": "<unk>",
8
+ "lstrip": false,
9
+ "normalized": false,
10
+ "rstrip": false,
11
+ "single_word": false,
12
+ "special": true
13
+ },
14
+ "1": {
15
+ "content": "<s>",
16
+ "lstrip": false,
17
+ "normalized": false,
18
+ "rstrip": false,
19
+ "single_word": false,
20
+ "special": true
21
+ },
22
+ "2": {
23
+ "content": "</s>",
24
+ "lstrip": false,
25
+ "normalized": false,
26
+ "rstrip": false,
27
+ "single_word": false,
28
+ "special": true
29
+ },
30
+ "73440": {
31
+ "content": "<|im_end|>",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false,
36
+ "special": true
37
+ },
38
+ "73441": {
39
+ "content": "<|im_start|>",
40
+ "lstrip": false,
41
+ "normalized": false,
42
+ "rstrip": false,
43
+ "single_word": false,
44
+ "special": true
45
+ },
46
+ "73442": {
47
+ "content": "<|tool_call|>",
48
+ "lstrip": false,
49
+ "normalized": false,
50
+ "rstrip": false,
51
+ "single_word": false,
52
+ "special": true
53
+ },
54
+ "73443": {
55
+ "content": "<|execute_start|>",
56
+ "lstrip": false,
57
+ "normalized": false,
58
+ "rstrip": false,
59
+ "single_word": false,
60
+ "special": true
61
+ },
62
+ "73444": {
63
+ "content": "<|execute_end|>",
64
+ "lstrip": false,
65
+ "normalized": false,
66
+ "rstrip": false,
67
+ "single_word": false,
68
+ "special": true
69
+ },
70
+ "73445": {
71
+ "content": "<|fim_prefix|>",
72
+ "lstrip": false,
73
+ "normalized": false,
74
+ "rstrip": false,
75
+ "single_word": false,
76
+ "special": true
77
+ },
78
+ "73446": {
79
+ "content": "<|fim_middle|>",
80
+ "lstrip": false,
81
+ "normalized": false,
82
+ "rstrip": false,
83
+ "single_word": false,
84
+ "special": true
85
+ },
86
+ "73447": {
87
+ "content": "<|fim_suffix|>",
88
+ "lstrip": false,
89
+ "normalized": false,
90
+ "rstrip": false,
91
+ "single_word": false,
92
+ "special": true
93
+ }
94
+ },
95
+ "additional_special_tokens": [
96
+ "<|im_end|>",
97
+ "<|im_start|>",
98
+ "<|tool_call|>",
99
+ "<|execute_start|>",
100
+ "<|execute_end|>",
101
+ "<|fim_prefix|>",
102
+ "<|fim_middle|>",
103
+ "<|fim_suffix|>"
104
+ ],
105
+ "bos_token": "<s>",
106
+ "chat_template": "{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% else %}{% set loop_messages = messages %}{% endif %}{% if system_message is defined %}{{ '<|im_start|>system\n' + system_message + '<|im_end|>\n' }}{% endif %}{% for message in loop_messages %}{% set content = message['content'] %}{% if message['role'] == 'user' %}{{ '<|im_start|>user\n' + content + '<|im_end|>\n<|im_start|>assistant\n' }}{% elif message['role'] == 'assistant' %}{{ content + '<|im_end|>' }}{% endif %}{% endfor %}",
107
+ "clean_up_tokenization_spaces": false,
108
+ "eos_token": "<|im_end|>",
109
+ "extra_special_tokens": {},
110
+ "legacy": true,
111
+ "model_max_length": 1000000000000000019884624838656,
112
+ "pad_token": "<|im_end|>",
113
+ "padding_side": "right",
114
+ "sp_model_kwargs": {},
115
+ "spaces_between_special_tokens": false,
116
+ "split_special_tokens": false,
117
+ "tokenizer_class": "LlamaTokenizer",
118
+ "unk_token": "<unk>",
119
+ "use_default_system_prompt": false
120
+ }