diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 2e4b345..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: CI - -on: - push: - branches: [main, develop] - pull_request: - branches: [main] - -jobs: - backend-lint-and-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./backend - - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: root123 - MYSQL_DATABASE: yuzhiran - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - cache-dependency-path: backend/package-lock.json - - - name: Install dependencies - run: npm ci - - - name: Generate Prisma client - run: npx prisma generate - env: - DATABASE_URL: mysql://root:root123@localhost:3306/yuzhiran - - - name: Type check - run: npx tsc --noEmit - - - name: Run tests - run: npm test - - frontend-lint-and-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./frontend - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - cache-dependency-path: frontend/package-lock.json - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test - - - name: Build - run: npm run build - - docker-build: - runs-on: ubuntu-latest - needs: [backend-lint-and-test, frontend-lint-and-test] - if: github.ref == 'refs/heads/main' - - steps: - - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build backend - uses: docker/build-push-action@v5 - with: - context: ./backend - push: false - tags: yuzhiran/backend:latest - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Build frontend - uses: docker/build-push-action@v5 - with: - context: ./frontend - push: false - tags: yuzhiran/frontend:latest - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/AGENTS.md b/AGENTS.md old mode 100644 new mode 100755 index f6770fe..0f643a1 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,7 +90,7 @@ 1. **任务开始前** — 读 AGENTS.md + docs/progress.md,了解当前进度和上下文 2. **规划阶段** — 分析需求,拆解为 TODO 列表,按优先级排序 -3. **执行阶段** — 按 TODO 依次实施,每次完成后验证(lint/test/build) +3. **执行阶段** — 按 TODO 依次实施,完成后先做**代码评审修复**(检查代码风格、类型安全、边界情况、安全隐患、是否符合项目约定),再做**测试验证**(运行 lint/build + 相关测试,发现失败立即修复) 4. **任务完成后** — 更新 docs/progress.md(更新阶段状态、补充完成项) 5. **归档** — 旧版 progress.md 移到 `docs/archive/progress-YYYY-MM-DD.md` 6. **提交** — 只有在用户明确要求时才创建 git commit diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/backend/.dockerignore b/backend/.dockerignore old mode 100644 new mode 100755 diff --git a/backend/.env.example b/backend/.env.example old mode 100644 new mode 100755 diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js new file mode 100644 index 0000000..22e42ff --- /dev/null +++ b/backend/.eslintrc.js @@ -0,0 +1,23 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['dist', 'node_modules'], + rules: { + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-explicit-any': 'warn', + 'no-console': 'off', + }, +}; diff --git a/backend/Dockerfile b/backend/Dockerfile old mode 100644 new mode 100755 diff --git a/backend/admin/index.html b/backend/admin/index.html old mode 100644 new mode 100755 diff --git a/backend/jest-e2e.json b/backend/jest-e2e.json old mode 100644 new mode 100755 diff --git a/backend/jest.config.json b/backend/jest.config.json old mode 100644 new mode 100755 diff --git a/backend/nest-cli.json b/backend/nest-cli.json old mode 100644 new mode 100755 diff --git a/backend/package-lock.json b/backend/package-lock.json old mode 100644 new mode 100755 index acf8bd6..a55b135 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -18,6 +18,7 @@ "@nestjs/serve-static": "^5.0.5", "@nestjs/swagger": "^11.4.2", "@prisma/client": "^5.22.0", + "alipay-sdk": "^4.14.0", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", @@ -42,6 +43,9 @@ "@types/node": "^20.19.40", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.1", "jest": "^30.4.0", "supertest": "^7.2.2", "ts-jest": "^29.4.9", @@ -168,24 +172,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -199,22 +185,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -280,24 +250,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/schematics/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -311,22 +263,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@angular-devkit/schematics/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -1394,6 +1330,103 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fidm/asn1": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", @@ -1416,6 +1449,44 @@ "node": ">= 8" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", @@ -3026,24 +3097,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@nestjs/schematics/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nestjs/schematics/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -3057,22 +3110,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nestjs/schematics/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nestjs/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -3194,6 +3231,44 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@nuxt/opencollective": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", @@ -3763,6 +3838,278 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", @@ -4253,6 +4600,16 @@ "acorn": "^8.14.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", @@ -4314,6 +4671,26 @@ "ajv": "^8.8.2" } }, + "node_modules/alipay-sdk": { + "version": "4.14.0", + "resolved": "https://registry.npmmirror.com/alipay-sdk/-/alipay-sdk-4.14.0.tgz", + "integrity": "sha512-oiD/VP5Ei0RRacHHmE+N0uqgOj2xzce7c0fHrtyyh1P04O+o9I1r65LdGPzU8960J56xOxS/d3c+R/9lsPUH7g==", + "license": "MIT", + "dependencies": { + "@fidm/x509": "^1.2.1", + "bignumber.js": "^9.1.2", + "camelcase-keys": "^7.0.2", + "crypto-js": "^4.2.0", + "formstream": "^1.5.0", + "snakecase-keys": "^8.0.0", + "sse-decoder": "^1.0.0", + "urllib": "^4", + "utility": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4589,6 +4966,15 @@ "bcrypt": "bin/bcrypt" } }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4812,6 +5198,48 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "license": "MIT", + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001792", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", @@ -5301,6 +5729,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5333,6 +5767,13 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5374,6 +5815,16 @@ "node": ">= 0.8" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5405,6 +5856,29 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.1.tgz", @@ -5660,6 +6134,63 @@ "node": ">=8" } }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5674,6 +6205,160 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5688,6 +6373,29 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5721,6 +6429,16 @@ "node": ">=4.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -5842,6 +6560,18 @@ "url": "https://opencollective.com/express" } }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5856,6 +6586,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -5879,6 +6616,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -5889,6 +6636,19 @@ "bser": "2.1.1" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-type": { "version": "21.3.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", @@ -5955,6 +6715,28 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -6105,6 +6887,18 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/formstream": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/formstream/-/formstream-1.5.2.tgz", + "integrity": "sha512-NASf0lgxC1AyKNXQIrXTEYkiX99LhCEXTkiGObXAkpBui86a4u8FjH1o2bGb3PpqI3kafC+yw4zWeK6l6VHTgg==", + "license": "MIT", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "node-hex": "^1.0.1", + "pause-stream": "~0.0.11" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6286,6 +7080,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -6332,6 +7139,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6351,6 +7187,13 @@ "dev": true, "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -6514,6 +7357,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -6595,6 +7448,25 @@ "dev": true, "license": "MIT" }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6615,6 +7487,19 @@ "node": ">=6" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -6635,6 +7520,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -7671,6 +8566,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -7685,6 +8587,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7761,6 +8670,16 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -7771,6 +8690,20 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/libphonenumber-js": { "version": "1.12.43", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.43.tgz", @@ -7879,6 +8812,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -7902,6 +8842,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "11.3.6", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", @@ -7955,6 +8904,18 @@ "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -8033,7 +8994,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -8227,6 +9187,16 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -8244,6 +9214,15 @@ "lodash": "^4.17.21" } }, + "node_modules/node-hex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/node-hex/-/node-hex-1.0.1.tgz", + "integrity": "sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8348,6 +9327,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8583,6 +9580,18 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8636,6 +9645,16 @@ "node": ">=4" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "30.4.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.0.tgz", @@ -8748,6 +9767,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -8892,6 +9944,56 @@ "dev": true, "license": "ISC" }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -8908,6 +10010,30 @@ "node": ">= 18" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -9177,6 +10303,42 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/snakecase-keys/-/snakecase-keys-8.1.0.tgz", + "integrity": "sha512-9/Eug2btrCiOi+9+vIXJnxUcKVfcbLy5Uwff4BrO6PQf3Oq/2iYQ/1zkmnrpIIjfel/DAasAlux7OvAmCa+Xnw==", + "license": "MIT", + "dependencies": { + "map-obj": "^4.2.0", + "snake-case": "^3.0.4", + "type-fest": "^4.15.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/snakecase-keys/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -9215,6 +10377,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/sse-decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/sse-decoder/-/sse-decoder-1.0.0.tgz", + "integrity": "sha512-JPopy3jfNmPcUz5Ru6skKhHNRJbsvcEW6Z4SirKkucLS8Jya1Bmf4FVX8giOkLm8xQJ7kK68P6GXoVSTkbedUA==", + "license": "MIT", + "engines": { + "node": ">= 14.19.3" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -9619,6 +10790,67 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9666,6 +10898,19 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-jest": { "version": "29.4.9", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", @@ -9860,6 +11105,19 @@ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "license": "Unlicense" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9955,12 +11213,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -10056,12 +11335,77 @@ "punycode": "^2.1.0" } }, + "node_modules/urllib": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/urllib/-/urllib-4.9.0.tgz", + "integrity": "sha512-Rp3DBvVqy9arSTMH6oN5N7OAN01U3dQ2xc19AadP86MzC4j67MDeqOup5shpWnjkDVGWfLfWPOd8CyqOtd6u3w==", + "license": "MIT", + "dependencies": { + "form-data": "^4.0.1", + "formstream": "^1.5.1", + "mime-types": "^2.1.35", + "qs": "^6.12.1", + "type-fest": "^4.20.1", + "undici": "^7.1.1", + "ylru": "^2.0.0" + }, + "engines": { + "node": ">= 18.19.0" + } + }, + "node_modules/urllib/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/urllib/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/urllib/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utility": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/utility/-/utility-2.5.0.tgz", + "integrity": "sha512-lDbOVde5UAKgtxrSyZNhqrTA7f7anba6DTqbsDWgUFk6PZlmr7djqPYw0FnL5a6TbJvRt38VmYqt07zVLzXG2A==", + "license": "MIT", + "dependencies": { + "escape-html": "^1.0.3", + "unescape": "^1.0.1", + "ylru": "^2.0.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -10294,6 +11638,16 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -10401,6 +11755,15 @@ "node": ">=12" } }, + "node_modules/ylru": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ylru/-/ylru-2.0.0.tgz", + "integrity": "sha512-T6hTrKcr9lKeUG0MQ/tO72D3UGptWVohgzpHG8ljU1jeBt2RCjcWxvsTPD8ZzUq1t1FvwROAw1kxg2euvg/THg==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/backend/package.json b/backend/package.json old mode 100644 new mode 100755 index db972c4..b2580e3 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "description": "宇之然 AI - 后端 API 服务", "main": "dist/main.js", "scripts": { - "build": "nest build", + "build": "nest build --tsc", "start": "nest start", "dev": "nest start --watch", "start:prod": "node dist/main", @@ -38,6 +38,7 @@ "@nestjs/serve-static": "^5.0.5", "@nestjs/swagger": "^11.4.2", "@prisma/client": "^5.22.0", + "alipay-sdk": "^4.14.0", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", @@ -62,6 +63,9 @@ "@types/node": "^20.19.40", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.1", "jest": "^30.4.0", "supertest": "^7.2.2", "ts-jest": "^29.4.9", diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma old mode 100644 new mode 100755 index 74c8b5a..7eb4e54 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -34,6 +34,7 @@ enum MemberPlan { model User { id Int @id @default(autoincrement()) + username String? @unique phone String? @unique email String? @unique passwordHash String? @@ -303,16 +304,18 @@ model SandboxSession { } model Order { - id Int @id @default(autoincrement()) - orderNo String @unique - userId Int - amount Float - planType String - status OrderStatus @default(PENDING) - payChannel String? - paidAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + orderNo String @unique + userId Int + amount Float + planType String + status OrderStatus @default(PENDING) + payChannel String? + transactionId String? + gatewayOrderId String? + paidAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id]) diff --git a/backend/prisma/seed.d.ts b/backend/prisma/seed.d.ts old mode 100644 new mode 100755 diff --git a/backend/prisma/seed.js b/backend/prisma/seed.js old mode 100644 new mode 100755 diff --git a/backend/prisma/seed.ts b/backend/prisma/seed.ts old mode 100644 new mode 100755 diff --git a/backend/prisma/tsconfig.json b/backend/prisma/tsconfig.json old mode 100644 new mode 100755 diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts old mode 100644 new mode 100755 index ea0863c..1f04e21 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -21,31 +21,18 @@ import { EnterpriseModule } from './modules/enterprise/enterprise.module'; import { NotificationModule } from './modules/notifications/notification.module'; import { LearningModule } from './modules/learning/learning.module'; import { SkillsModule } from './modules/skills/skills.module'; +import { AiAssistantModule } from './modules/ai-assistant/ai-assistant.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), PrismaModule, - AuthModule, - UsersModule, - CoursesModule, - ContentsModule, - PromptsModule, - ToolsModule, - SandboxModule, - OrdersModule, - AdminModule, - PaymentModule, - CategoriesModule, - DashboardModule, - SearchModule, - ModelsModule, - UploadModule, - CommunityModule, - EnterpriseModule, - NotificationModule, - LearningModule, - SkillsModule, + AuthModule, UsersModule, CoursesModule, ContentsModule, + PromptsModule, ToolsModule, SandboxModule, OrdersModule, + AdminModule, PaymentModule, CategoriesModule, DashboardModule, + SearchModule, ModelsModule, UploadModule, CommunityModule, + EnterpriseModule, NotificationModule, LearningModule, SkillsModule, + AiAssistantModule, ], }) export class AppModule {} diff --git a/backend/src/common/filters/global-exception.filter.ts b/backend/src/common/filters/global-exception.filter.ts old mode 100644 new mode 100755 diff --git a/backend/src/common/index.ts b/backend/src/common/index.ts old mode 100644 new mode 100755 diff --git a/backend/src/common/interceptors/logging.interceptor.ts b/backend/src/common/interceptors/logging.interceptor.ts old mode 100644 new mode 100755 diff --git a/backend/src/main.ts b/backend/src/main.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/admin.controller.ts b/backend/src/modules/admin/admin.controller.ts old mode 100644 new mode 100755 index 5ac699b..be09870 --- a/backend/src/modules/admin/admin.controller.ts +++ b/backend/src/modules/admin/admin.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Post, Get, Put, Body, UseGuards, Req, Param, HttpException, HttpStatus } from '@nestjs/common'; +import { Controller, Post, Get, Put, Body, UseGuards, Req, Param, Query, HttpException, HttpStatus } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { AdminService } from './admin.service'; @@ -7,6 +7,7 @@ import { CoursesService } from '../courses/courses.service'; import { PrismaService } from '../../prisma/prisma.service'; import { AIGatewayService } from '../ai/ai-gateway.service'; import { AdminAiAssistantService } from './ai-assistant.service'; +import { GatewayPayService } from '../payment/gateway-pay.service'; @ApiTags('管理后台') @Controller('admin') @@ -17,6 +18,7 @@ export class AdminController { private prisma: PrismaService, private aiGateway: AIGatewayService, private aiAssistant: AdminAiAssistantService, + private gatewayPay: GatewayPayService, ) {} @Post('login') @@ -34,13 +36,124 @@ export class AdminController { @Get('orders') @UseGuards(AuthGuard('jwt'), AdminGuard) @ApiBearerAuth() - async orders(@Req() req: any) { - const items = await this.prisma.order.findMany({ - orderBy: { createdAt: 'desc' }, - take: 100, - include: { user: { select: { id: true, nickname: true, phone: true } } }, + async orders( + @Query('page') page?: string, + @Query('pageSize') pageSize?: string, + @Query('search') search?: string, + @Query('status') status?: string, + @Query('payChannel') payChannel?: string, + @Query('planType') planType?: string, + ) { + const p = Math.max(1, Number(page) || 1); + const ps = Math.min(100, Math.max(1, Number(pageSize) || 20)); + const skip = (p - 1) * ps; + + const where: any = {}; + if (status) where.status = status; + if (payChannel) where.payChannel = payChannel; + if (planType) where.planType = planType; + if (search) { + where.OR = [ + { orderNo: { contains: search } }, + { user: { nickname: { contains: search } } }, + { user: { phone: { contains: search } } }, + ]; + } + + const [items, total] = await Promise.all([ + this.prisma.order.findMany({ + where, + orderBy: { createdAt: 'desc' }, + skip, + take: ps, + include: { user: { select: { id: true, nickname: true, phone: true } } }, + }), + this.prisma.order.count({ where }), + ]); + + return { items, total, page: p, pageSize: ps }; + } + + @Get('orders/:orderNo') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async orderDetail(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ + where: { orderNo }, + include: { user: { select: { id: true, nickname: true, phone: true, email: true, memberPlan: true, memberExpire: true } } }, }); - return { items }; + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + return order; + } + + @Post('orders/:orderNo/refund') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async orderRefund(@Param('orderNo') orderNo: string, @Body() body: { amount?: number; reason?: string }) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + if (order.status !== 'PAID') throw new HttpException('订单未支付,无法退款', HttpStatus.BAD_REQUEST); + + return this.gatewayPay.refund(orderNo, body.amount || order.amount, body.reason); + } + + @Post('orders/:orderNo/mark-paid') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async markOrderPaid(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + if (order.status !== 'PENDING') throw new HttpException('只能标记待支付订单为已支付', HttpStatus.BAD_REQUEST); + + await this.prisma.order.update({ + where: { id: order.id }, + data: { status: 'PAID', paidAt: new Date(), transactionId: `MANUAL_${Date.now()}` }, + }); + + // 激活订阅 + const mockOrder = { planType: order.planType, amount: order.amount }; + if (mockOrder.planType === 'MONTHLY' || mockOrder.planType === 'YEARLY') { + const durationDays = mockOrder.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let endDate: Date; + const existingSub = await this.prisma.subscription.findFirst({ + where: { userId: order.userId, status: 'ACTIVE', endDate: { gt: now } }, + }); + if (existingSub) { + endDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ where: { id: existingSub.id }, data: { endDate } }); + } else { + endDate = new Date(now); + endDate.setDate(endDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { userId: order.userId, plan: order.planType as any, startDate: now, endDate, status: 'ACTIVE' }, + }); + } + await this.prisma.user.update({ + where: { id: order.userId }, + data: { memberPlan: order.planType as any, memberExpire: endDate }, + }); + } + + return { ok: true, message: '订单已标记为已支付' }; + } + + @Get('orders/:orderNo/query') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async queryOrderPayment(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + + if (order.gatewayOrderId && !order.gatewayOrderId.startsWith('mock_')) { + return this.gatewayPay.queryOrder(order.gatewayOrderId); + } + return { + outTradeNo: orderNo, + localStatus: order.status, + amount: order.amount, + planType: order.planType, + }; } @Put('courses/:id/chapters') diff --git a/backend/src/modules/admin/admin.guard.ts b/backend/src/modules/admin/admin.guard.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/admin.module.ts b/backend/src/modules/admin/admin.module.ts old mode 100644 new mode 100755 index 5870885..91f5f68 --- a/backend/src/modules/admin/admin.module.ts +++ b/backend/src/modules/admin/admin.module.ts @@ -12,9 +12,10 @@ import { PublicController } from './public.controller'; import { CoursesModule } from '../courses/courses.module'; import { AuthModule } from '../auth/auth.module'; import { AIModule } from '../ai/ai.module'; +import { PaymentModule } from '../payment/payment.module'; @Module({ - imports: [CoursesModule, AuthModule, AIModule], + imports: [CoursesModule, AuthModule, AIModule, PaymentModule], controllers: [AdminController, AnalyticsController, SettingsController, OperationsController, UsersController, PublicController], providers: [AdminService, AdminGuard, AdminAiAssistantService], exports: [AdminService], diff --git a/backend/src/modules/admin/admin.service.ts b/backend/src/modules/admin/admin.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/ai-assistant.service.ts b/backend/src/modules/admin/ai-assistant.service.ts old mode 100644 new mode 100755 index 9fe7a20..ac843c8 --- a/backend/src/modules/admin/ai-assistant.service.ts +++ b/backend/src/modules/admin/ai-assistant.service.ts @@ -208,6 +208,15 @@ export class AdminAiAssistantService { { name: 'delete-admin', description: '禁用一个管理员账号', parameters: { id: { type: 'number', description: '管理员ID' } }, }, + // ---- 全局搜索 ---- + { + name: 'search', description: '全局搜索用户、订单、课程、内容等', + parameters: { q: { type: 'string', description: '搜索关键词(必填)' }, type: { type: 'string', enum: ['all', 'users', 'orders', 'courses', 'contents'], description: '搜索范围(可选,默认全部)' } }, + }, + // ---- 通知批量操作 ---- + { + name: 'mark-all-notifications-read', description: '将所有系统通知标记为已读', parameters: {}, + }, // ---- 企业版 ---- { name: 'get-enterprise-orgs', description: '查看所有企业组织', parameters: {}, @@ -383,6 +392,32 @@ export class AdminAiAssistantService { return { success: true, data: { id: call.params.id, status: newPromptStatus }, summary: `提示词 ${call.params.id} 状态已切换为 ${newPromptStatus}` }; } + case 'search': { + const q = call.params.q; + if (!q) throw new Error('请输入搜索关键词'); + const results: any[] = []; + if (call.params.type === 'all' || call.params.type === 'users') { + const users = await this.prisma.user.findMany({ where: { deletedAt: null, OR: [{ nickname: { contains: q } }, { phone: { contains: q } }, { email: { contains: q } }] }, select: { id: true, nickname: true, phone: true, email: true, status: true }, take: 20 }); + results.push(...users.map(u => ({ ...u, _type: 'user' }))); + } + if (call.params.type === 'all' || call.params.type === 'orders') { + const orders = await this.prisma.order.findMany({ where: { OR: [{ orderNo: { contains: q } }] }, take: 20, orderBy: { createdAt: 'desc' } }); + results.push(...orders.map(o => ({ ...o, _type: 'order' }))); + } + if (call.params.type === 'all' || call.params.type === 'courses') { + const courses = await this.prisma.course.findMany({ where: { deletedAt: null, OR: [{ title: { contains: q } }, { description: { contains: q } }] }, select: { id: true, title: true, status: true }, take: 20 }); + results.push(...courses.map(c => ({ ...c, _type: 'course' }))); + } + if (call.params.type === 'all' || call.params.type === 'contents') { + const contents = await this.prisma.content.findMany({ where: { deletedAt: null, OR: [{ title: { contains: q } }, { summary: { contains: q } }] }, select: { id: true, title: true, status: true }, take: 20 }); + results.push(...contents.map(c => ({ ...c, _type: 'content' }))); + } + return { success: true, data: { results, total: results.length }, summary: `找到 ${results.length} 条结果,共 ${results.filter(r => r._type === 'user').length} 个用户、${results.filter(r => r._type === 'order').length} 个订单、${results.filter(r => r._type === 'course').length} 个课程、${results.filter(r => r._type === 'content').length} 个内容` }; + } + case 'mark-all-notifications-read': { + await this.prisma.notification.updateMany({ where: { isRead: false }, data: { isRead: true } }); + return { success: true, data: {}, summary: '所有通知已标记为已读' }; + } case 'get-enterprise-orgs': { const items = await this.prisma.organization.findMany({ take: 50, orderBy: { createdAt: 'desc' } }); return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个企业组织` }; diff --git a/backend/src/modules/admin/analytics.controller.ts b/backend/src/modules/admin/analytics.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/operations.controller.ts b/backend/src/modules/admin/operations.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/public.controller.ts b/backend/src/modules/admin/public.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/settings.controller.ts b/backend/src/modules/admin/settings.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/tests/admin.service.spec.ts b/backend/src/modules/admin/tests/admin.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/users.controller.ts b/backend/src/modules/admin/users.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai-assistant/ai-assistant.controller.ts b/backend/src/modules/ai-assistant/ai-assistant.controller.ts new file mode 100644 index 0000000..400d0c0 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.controller.ts @@ -0,0 +1,73 @@ +import { Controller, Post, Body, Req, UseGuards, HttpException, HttpStatus } from '@nestjs/common'; +import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; +import { AuthGuard } from '@nestjs/passport'; +import { AIGatewayService } from '../ai/ai-gateway.service'; +import { UserAiAssistantService } from './ai-assistant.service'; + +@ApiTags('AI 助手') +@Controller('ai-assistant') +export class AiAssistantController { + constructor( + private aiGateway: AIGatewayService, + private aiAssistant: UserAiAssistantService, + ) {} + + @Post('chat') + @UseGuards(AuthGuard('jwt')) + @ApiBearerAuth() + async chat( + @Req() req: any, + @Body() body: { messages: { role: string; content: string }[]; pageContext?: string }, + ) { + try { + const { messages, pageContext } = body; + const toolsDesc = this.aiAssistant.getToolsDescription(); + + const systemContent = `你是宇之然 AI 学习与实践平台的智能助手,帮助用户了解和使用平台的所有功能。 +你可以回答用户的问题,也可以调用工具来执行操作(如搜索内容、查看学习分析、管理通知等)。 + +${pageContext ? `当前页面:${pageContext}\n\n` : ''}可用工具列表(需要执行操作时,返回 JSON:{"tool":"工具名","params":{...},"description":"简述"}): + +${toolsDesc} + +注意: +1. 当用户请求执行具体操作(如搜索、查看数据、管理通知)时,返回一个 JSON 工具调用。 +2. 普通对话问题直接文字回答,不需要返回 JSON。 +3. 每次只需要返回一个 JSON 工具调用,不要包含多余文字。 +4. 对于 navigate 工具,前端会自动跳转,你只需要返回 JSON 即可。`; + + const apiMessages = [ + { role: 'system' as const, content: systemContent }, + ...messages.map(m => ({ role: m.role as 'user' | 'assistant', content: m.content })), + ]; + + const reply = await this.aiGateway.chat('general', apiMessages, { temperature: 0.7, max_tokens: 2000 }); + return { reply }; + } catch (err: any) { + throw new HttpException(err.message || 'AI 助手请求失败', HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Post('action') + @UseGuards(AuthGuard('jwt')) + @ApiBearerAuth() + async action( + @Req() req: any, + @Body() body: { tool: string; params: Record; messages: { role: string; content: string }[] }, + ) { + const userId = req.user.userId; + const result = await this.aiAssistant.execute({ tool: body.tool, params: body.params }, userId); + + try { + const apiMessages = [ + { role: 'system' as const, content: '你是一个AI助手,下面是用户请求的执行结果,请用自然语言简洁总结给用户。' }, + ...body.messages.map(m => ({ role: m.role as 'user' | 'assistant', content: m.content })), + { role: 'assistant' as const, content: `【工具执行结果】\n工具: ${body.tool}\n参数: ${JSON.stringify(body.params)}\n结果: ${result.summary}\n数据: ${JSON.stringify(result.data)}` }, + ]; + const reply = await this.aiGateway.chat('general', apiMessages, { temperature: 0.3, max_tokens: 1000 }); + return { reply, result }; + } catch { + return { reply: result.summary, result }; + } + } +} diff --git a/backend/src/modules/ai-assistant/ai-assistant.module.ts b/backend/src/modules/ai-assistant/ai-assistant.module.ts new file mode 100644 index 0000000..0019bf8 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { AiAssistantController } from './ai-assistant.controller'; +import { UserAiAssistantService } from './ai-assistant.service'; +import { SkillsModule } from '../skills/skills.module'; +import { AIModule } from '../ai/ai.module'; + +@Module({ + imports: [SkillsModule, AIModule], + controllers: [AiAssistantController], + providers: [UserAiAssistantService], + exports: [UserAiAssistantService], +}) +export class AiAssistantModule {} diff --git a/backend/src/modules/ai-assistant/ai-assistant.service.ts b/backend/src/modules/ai-assistant/ai-assistant.service.ts new file mode 100644 index 0000000..a447695 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.service.ts @@ -0,0 +1,431 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import { SkillsService } from '../skills/skills.service'; + +export interface ToolDefinition { + name: string; + description: string; + parameters: Record; +} + +export interface ToolCall { + tool: string; + params: Record; + description?: string; +} + +export interface ToolResult { + success: boolean; + data: any; + summary: string; +} + +const KNOWLEDGE_DOMAINS = [ + { id: 'ai-basics', name: 'AI 基础知识', keywords: ['AI', '人工智能', '大模型', 'chatgpt', 'gpt', '大语言模型', 'llm', '深度学习', '神经网络', 'machine learning', '机器学习'] }, + { id: 'prompt-engineering', name: '提示词工程', keywords: ['提示词', 'prompt', 'system prompt', 'role', 'few-shot', 'chain-of-thought', 'cot'] }, + { id: 'programming', name: '编程开发', keywords: ['python', 'javascript', 'typescript', 'java', '代码', '函数', '算法', 'debug', 'bug', '编程', '开发', 'react', 'vue', 'node'] }, + { id: 'writing', name: '写作创作', keywords: ['写作', '文章', '文案', '润色', '作文', '创作', '故事', '小说', '博客'] }, + { id: 'english', name: '英语学习', keywords: ['英语', 'english', '翻译', '语法', 'grammar', 'vocabulary', '口语', '写作', '阅读'] }, + { id: 'data-science', name: '数据分析', keywords: ['数据', '分析', '统计', '图表', '可视化', 'sql', 'excel', 'pandas', 'numpy', '数据分析'] }, + { id: 'office', name: '办公效率', keywords: ['ppt', 'excel', 'word', '办公', '邮件', '报告', '文档', '会议', '总结'] }, + { id: 'career', name: '职业发展', keywords: ['简历', '面试', '求职', '职业', '工作', '升职', '薪资'] }, +]; + +const LEARNING_PATH_STAGES = [ + { + id: 'basics', title: '认识大模型', + tasks: [ + { label: '了解 AI 基本概念', keyword: '人工智能' }, + { label: '认识大语言模型', keyword: '大模型' }, + { label: '体验 AI 对话', keyword: '' }, + ], + }, + { + id: 'prompt', title: '提示词工程', + tasks: [ + { label: '了解提示词基础', keyword: '提示词' }, + { label: '练习提示词编写', keyword: '' }, + { label: '保存优质提示词', keyword: '' }, + ], + }, + { + id: 'advanced', title: '模型微调与高级应用', + tasks: [ + { label: '了解模型微调', keyword: '微调' }, + { label: '了解 RAG', keyword: 'rag' }, + { label: '了解 Function Calling', keyword: 'function calling' }, + ], + }, + { + id: 'agent', title: 'Agent 开发', + tasks: [ + { label: '了解 AI Agent', keyword: 'agent' }, + { label: '学习工具调用', keyword: 'tool' }, + { label: '实践项目', keyword: '' }, + ], + }, +]; + +@Injectable() +export class UserAiAssistantService { + constructor( + private prisma: PrismaService, + private skillsService: SkillsService, + ) {} + + private userTools(): ToolDefinition[] { + return [ + { + name: 'navigate', + description: '跳转到网站的某个页面', + parameters: { path: { type: 'string', description: '页面路径,如 /sandbox、/skills、/my/member、/learning、/models、/prompts、/compare、/community、/courses、/my、/about' } }, + }, + { + name: 'search', + description: '搜索平台上的课程、提示词、工具、文章等内容', + parameters: { q: { type: 'string', description: '搜索关键词(必填)' }, type: { type: 'string', enum: ['all', 'courses', 'prompts', 'tools', 'contents'], description: '搜索类型(可选,默认全部)' } }, + }, + { + name: 'list-skills', + description: '浏览技能列表,可按分类、难度、关键词过滤', + parameters: { category: { type: 'string', description: '分类(可选,如 basic/technical/creative)' }, difficulty: { type: 'string', description: '难度(可选,如 beginner/intermediate/advanced)' }, search: { type: 'string', description: '搜索关键词(可选)' } }, + }, + { + name: 'get-skill', + description: '查看某个技能的详细信息', + parameters: { id: { type: 'string', description: '技能ID(必填),如 coding、writing、english、data-analysis' } }, + }, + { + name: 'get-skill-categories', + description: '查看所有技能分类', + parameters: {}, + }, + { + name: 'get-learning-analytics', + description: '查看学情分析(知识领域掌握度),需要登录', + parameters: {}, + }, + { + name: 'get-learning-path', + description: '查看学习路径进度,需要登录', + parameters: {}, + }, + { + name: 'list-notifications', + description: '查看我的通知列表,需要登录', + parameters: { page: { type: 'number', description: '页码(可选)' }, pageSize: { type: 'number', description: '每页数量(可选)' } }, + }, + { + name: 'get-unread-count', + description: '查看未读通知数量,需要登录', + parameters: {}, + }, + { + name: 'mark-notification-read', + description: '标记某条通知为已读,需要登录', + parameters: { id: { type: 'number', description: '通知ID(必填)' } }, + }, + { + name: 'mark-all-read', + description: '将所有通知标记为已读,需要登录', + parameters: {}, + }, + { + name: 'get-profile', + description: '查看我的个人信息(昵称、手机号、会员状态等),需要登录', + parameters: {}, + }, + { + name: 'list-models', + description: '查看平台支持的AI模型列表', + parameters: {}, + }, + { + name: 'list-prompts', + description: '浏览提示词列表', + parameters: {}, + }, + { + name: 'list-courses', + description: '浏览课程列表', + parameters: {}, + }, + { + name: 'list-user-orders', + description: '查看我的订单记录,需要登录', + parameters: {}, + }, + { + name: 'get-current-subscription', + description: '查看当前会员订阅信息,需要登录', + parameters: {}, + }, + ]; + } + + getAvailableTools(): ToolDefinition[] { + return this.userTools(); + } + + getToolsDescription(): string { + return this.getAvailableTools().map(t => { + const params = Object.entries(t.parameters) + .map(([k, v]: any) => ` - ${k}: ${v.type}${v.description ? ' (' + v.description + ')' : ''}${v.enum ? ' [' + v.enum.join('|') + ']' : ''}`) + .join('\n'); + return `- **${t.name}**: ${t.description}\n${params}`; + }).join('\n\n'); + } + + async execute(call: ToolCall, userId?: number): Promise { + try { + switch (call.tool) { + case 'navigate': + return { success: true, data: { path: call.params.path }, summary: `跳转到 ${call.params.path}` }; + + case 'search': { + const { q, type } = call.params; + if (!q) throw new Error('请输入搜索关键词'); + const results = await this.search(q, type || 'all'); + return { success: true, data: results, summary: `找到 ${results.total} 条结果:${results.results.slice(0, 5).map(r => r.title).join('、')}` }; + } + + case 'list-skills': { + const skills = await this.skillsService.findAll(call.params); + return { success: true, data: skills, summary: `共 ${skills.total} 个技能:${skills.items.map(s => s.name).join('、')}` }; + } + + case 'get-skill': { + const skill = await this.skillsService.findById(call.params.id); + if (!skill) throw new Error(`技能 ${call.params.id} 不存在`); + return { success: true, data: skill, summary: `技能「${skill.name}」(${skill.category} - ${skill.difficulty}):${skill.description}` }; + } + + case 'get-skill-categories': { + const cats = await this.skillsService.getCategories(); + return { success: true, data: { categories: cats }, summary: `共 ${cats.length} 个分类:${cats.map(c => c.name).join('、')}` }; + } + + case 'get-learning-analytics': { + if (!userId) throw new Error('需要登录'); + const analytics = await this.getLearningAnalytics(userId); + return { success: true, data: analytics, summary: `总对话 ${analytics.totalSessions} 次,${analytics.domains.filter(d => d.weak).length} 个薄弱领域,建议从 ${analytics.recommendations[0]?.title || '探索更多'} 开始` }; + } + + case 'get-learning-path': { + if (!userId) throw new Error('需要登录'); + const path = await this.getLearningPath(userId); + return { success: true, data: path, summary: `学习路径共 ${path.length} 个阶段:${path.map(s => `${s.title}(${s.progress}%)`).join('、')}` }; + } + + case 'list-notifications': { + if (!userId) throw new Error('需要登录'); + const page = call.params.page || 1; + const pageSize = call.params.pageSize || 20; + const [items, total] = await Promise.all([ + this.prisma.notification.findMany({ + where: { userId }, orderBy: { createdAt: 'desc' }, skip: (page - 1) * pageSize, take: pageSize, + }), + this.prisma.notification.count({ where: { userId } }), + ]); + return { success: true, data: { items, total, page, pageSize }, summary: `共 ${total} 条通知` }; + } + + case 'get-unread-count': { + if (!userId) throw new Error('需要登录'); + const count = await this.prisma.notification.count({ where: { userId, isRead: false } }); + return { success: true, data: { count }, summary: `有 ${count} 条未读通知` }; + } + + case 'mark-notification-read': { + if (!userId) throw new Error('需要登录'); + await this.prisma.notification.updateMany({ where: { id: call.params.id, userId }, data: { isRead: true } }); + return { success: true, data: {}, summary: `通知 ${call.params.id} 已标记为已读` }; + } + + case 'mark-all-read': { + if (!userId) throw new Error('需要登录'); + await this.prisma.notification.updateMany({ where: { userId, isRead: false }, data: { isRead: true } }); + return { success: true, data: {}, summary: '所有通知已标记为已读' }; + } + + case 'get-profile': { + if (!userId) throw new Error('需要登录'); + const profile = await this.prisma.user.findUnique({ + where: { id: userId }, + select: { id: true, phone: true, email: true, nickname: true, avatar: true, status: true, memberPlan: true, memberExpire: true, sandboxDaily: true, createdAt: true }, + }); + if (!profile) throw new Error('用户不存在'); + return { success: true, data: profile, summary: `用户 ${profile.nickname || profile.phone || profile.email}${profile.memberPlan !== 'FREE' ? ',会员: ' + profile.memberPlan : ',当前为免费用户'}${profile.memberExpire ? ',到期: ' + profile.memberExpire.toISOString().slice(0, 10) : ''}` }; + } + + case 'list-models': { + const models = await this.prisma.aiModel.findMany({ where: { status: 'ACTIVE' }, orderBy: { sortOrder: 'asc' } }); + if (models.length === 0) { + return { success: true, data: { models: [] }, summary: '目前没有可用的AI模型,请稍后再试' }; + } + return { success: true, data: { models }, summary: `共 ${models.length} 个模型:${models.map(m => m.name).join('、')}` }; + } + + case 'list-prompts': { + const items = await this.prisma.prompt.findMany({ + where: { deletedAt: null, status: 'PUBLISHED' }, + take: 50, orderBy: { createdAt: 'desc' }, + select: { id: true, title: true, description: true, tags: true }, + }); + return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个提示词:${items.map(p => p.title).join('、')}` }; + } + + case 'list-courses': { + const items = await this.prisma.course.findMany({ + where: { deletedAt: null, status: 'PUBLISHED' }, + take: 50, orderBy: { createdAt: 'desc' }, + select: { id: true, title: true, description: true, price: true, isFree: true }, + }); + const freeCount = items.filter(c => c.isFree).length; + return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个课程(${freeCount} 个免费):${items.map(c => c.title).join('、')}` }; + } + + case 'list-user-orders': { + if (!userId) throw new Error('需要登录'); + const items = await this.prisma.order.findMany({ + where: { userId }, + take: 50, orderBy: { createdAt: 'desc' }, + }); + const paidAmount = items.filter(o => o.status === 'PAID').reduce((s, o) => s + o.amount, 0); + return { success: true, data: { items, total: items.length, paidAmount }, summary: `共 ${items.length} 笔订单,已支付总额 ¥${paidAmount}` }; + } + + case 'get-current-subscription': { + if (!userId) throw new Error('需要登录'); + const now = new Date(); + const sub = await this.prisma.subscription.findFirst({ + where: { userId, status: 'ACTIVE', endDate: { gt: now } }, + orderBy: { endDate: 'desc' }, + }); + if (!sub) { + const user = await this.prisma.user.findUnique({ where: { id: userId }, select: { memberPlan: true, memberExpire: true } }); + if (!user) throw new Error('用户不存在'); + return { success: true, data: null, summary: user.memberPlan !== 'FREE' ? `会员状态: ${user.memberPlan},到期 ${user.memberExpire?.toISOString().slice(0, 10) || '未知'}` : '当前为免费用户,暂无有效订阅' }; + } + return { success: true, data: sub, summary: `当前订阅: ${sub.plan},到期 ${sub.endDate.toISOString().slice(0, 10)},剩余 ${Math.ceil((sub.endDate.getTime() - Date.now()) / 86400000)} 天` }; + } + + default: + throw new Error(`未知工具: ${call.tool}`); + } + } catch (err: any) { + return { success: false, data: null, summary: `执行失败: ${err.message}` }; + } + } + + private async getLearningAnalytics(userId: number) { + const sessions = await this.prisma.sandboxSession.findMany({ + where: { userId }, orderBy: { createdAt: 'desc' }, take: 100, + }); + + const domainCounts: Record = {}; + const domainDates: Record = {}; + const totalSessions = sessions.length; + + for (const d of KNOWLEDGE_DOMAINS) domainCounts[d.id] = 0; + + for (const session of sessions) { + const searchText = `${session.title} ${session.messages || ''}`.toLowerCase(); + for (const domain of KNOWLEDGE_DOMAINS) { + if (domain.keywords.some(kw => searchText.includes(kw))) { + domainCounts[domain.id] = (domainCounts[domain.id] || 0) + 1; + if (!domainDates[domain.id] || session.createdAt.toISOString() > domainDates[domain.id]) { + domainDates[domain.id] = session.createdAt.toISOString(); + } + } + } + } + + const domains = KNOWLEDGE_DOMAINS.map(d => { + const count = domainCounts[d.id] || 0; + const mastery = Math.min(Math.round((count / Math.max(totalSessions * 0.3, 1)) * 100), 100); + return { id: d.id, name: d.name, sessionCount: count, mastery, lastActive: domainDates[d.id] || null, weak: mastery < 30 }; + }); + + const weakDomains = domains.filter(d => d.weak); + const recommendations = weakDomains.length > 0 + ? weakDomains.slice(0, 3).flatMap(d => [ + { title: `了解 ${d.name}`, url: '/sandbox' }, + ]) + : [{ title: '探索更多知识领域', url: '/sandbox' }]; + + return { domains, totalSessions, weakDomains: weakDomains.map(d => d.name), recommendations }; + } + + private async getLearningPath(userId: number) { + const sessions = await this.prisma.sandboxSession.findMany({ + where: { userId }, select: { title: true, messages: true }, + }); + const allText = sessions.map(s => `${s.title} ${s.messages || ''}`.toLowerCase()).join(' '); + + return LEARNING_PATH_STAGES.map(stage => { + const completedCount = stage.tasks.filter(t => !t.keyword || allText.includes(t.keyword)).length; + const progress = stage.tasks.length > 0 ? Math.round((completedCount / stage.tasks.length) * 100) : 0; + return { ...stage, completedCount, totalTasks: stage.tasks.length, progress, unlocked: true }; + }); + } + + private async search(q: string, type: string) { + const results: any[] = []; + let total = 0; + + if (type === 'all' || type === 'courses') { + const [items, count] = await Promise.all([ + this.prisma.course.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }] }, + select: { id: true, title: true, description: true, isFree: true }, + take: type === 'courses' ? 20 : 5, + }), + this.prisma.course.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'course' }))); + total += count; + } + + if (type === 'all' || type === 'prompts') { + const [items, count] = await Promise.all([ + this.prisma.prompt.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }, { content: { contains: q } }] }, + select: { id: true, title: true, description: true }, + take: type === 'prompts' ? 20 : 5, + }), + this.prisma.prompt.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }, { content: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'prompt' }))); + total += count; + } + + if (type === 'all' || type === 'tools') { + const [items, count] = await Promise.all([ + this.prisma.tool.findMany({ + where: { deletedAt: null, OR: [{ name: { contains: q } }, { description: { contains: q } }] }, + select: { id: true, name: true, description: true }, + take: type === 'tools' ? 20 : 5, + }), + this.prisma.tool.count({ where: { deletedAt: null, OR: [{ name: { contains: q } }, { description: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'tool' }))); + total += count; + } + + if (type === 'all' || type === 'contents') { + const [items, count] = await Promise.all([ + this.prisma.content.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { summary: { contains: q } }] }, + select: { id: true, title: true, summary: true }, + take: type === 'contents' ? 20 : 5, + }), + this.prisma.content.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { summary: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'content' }))); + total += count; + } + + return { results, total }; + } +} diff --git a/backend/src/modules/ai/ai-gateway.service.ts b/backend/src/modules/ai/ai-gateway.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai/ai.module.ts b/backend/src/modules/ai/ai.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai/tests/ai-gateway.service.spec.ts b/backend/src/modules/ai/tests/ai-gateway.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/auth.controller.ts b/backend/src/modules/auth/auth.controller.ts old mode 100644 new mode 100755 index cc4c298..2e1d961 --- a/backend/src/modules/auth/auth.controller.ts +++ b/backend/src/modules/auth/auth.controller.ts @@ -3,6 +3,7 @@ import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { AuthService } from './auth.service'; import { RegisterDto } from './dto/register.dto'; +import { LoginDto } from './dto/login.dto'; @ApiTags('认证') @Controller('auth') @@ -15,7 +16,7 @@ export class AuthController { } @Post('login') - async login(@Body() body: { account: string; password: string }) { + async login(@Body() body: LoginDto) { return this.authService.login(body.account, body.password); } diff --git a/backend/src/modules/auth/auth.module.ts b/backend/src/modules/auth/auth.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/auth.service.ts b/backend/src/modules/auth/auth.service.ts old mode 100644 new mode 100755 index ece60be..19bf12e --- a/backend/src/modules/auth/auth.service.ts +++ b/backend/src/modules/auth/auth.service.ts @@ -1,4 +1,4 @@ -import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { Injectable, UnauthorizedException, BadRequestException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcryptjs'; import { PrismaService } from '../../prisma/prisma.service'; @@ -10,14 +10,32 @@ export class AuthService { private jwtService: JwtService, ) {} - async register(data: { phone?: string; email?: string; password: string; nickname?: string }) { + async register(data: { username?: string; phone?: string; email?: string; password: string; nickname?: string }) { + if (!data.username && !data.phone && !data.email) { + throw new BadRequestException('请填写用户名、手机号或邮箱'); + } + + if (data.username) { + const exists = await this.prisma.user.findUnique({ where: { username: data.username } }); + if (exists) throw new BadRequestException('用户名已被注册'); + } + if (data.phone) { + const exists = await this.prisma.user.findUnique({ where: { phone: data.phone } }); + if (exists) throw new BadRequestException('手机号已被注册'); + } + if (data.email) { + const exists = await this.prisma.user.findUnique({ where: { email: data.email } }); + if (exists) throw new BadRequestException('邮箱已被注册'); + } + const passwordHash = await bcrypt.hash(data.password, 10); const user = await this.prisma.user.create({ data: { - phone: data.phone, - email: data.email, + username: data.username || null, + phone: data.phone || null, + email: data.email || null, passwordHash, - nickname: data.nickname || data.phone || data.email?.split('@')[0], + nickname: data.nickname || data.username || data.phone || data.email?.split('@')[0], }, }); return this.generateTokens(user.id); @@ -26,7 +44,7 @@ export class AuthService { async login(account: string, password: string) { const user = await this.prisma.user.findFirst({ where: { - OR: [{ phone: account }, { email: account }], + OR: [{ username: account }, { phone: account }, { email: account }], deletedAt: null, }, }); @@ -68,6 +86,7 @@ export class AuthService { where: { id: userId }, select: { id: true, + username: true, phone: true, email: true, nickname: true, diff --git a/backend/src/modules/auth/dto/login.dto.ts b/backend/src/modules/auth/dto/login.dto.ts new file mode 100644 index 0000000..7547e36 --- /dev/null +++ b/backend/src/modules/auth/dto/login.dto.ts @@ -0,0 +1,11 @@ +import { IsNotEmpty, IsString } from 'class-validator'; + +export class LoginDto { + @IsNotEmpty({ message: '请输入账号' }) + @IsString() + account: string; + + @IsNotEmpty({ message: '请输入密码' }) + @IsString() + password: string; +} diff --git a/backend/src/modules/auth/dto/register.dto.ts b/backend/src/modules/auth/dto/register.dto.ts old mode 100644 new mode 100755 index d5231a7..73fcd28 --- a/backend/src/modules/auth/dto/register.dto.ts +++ b/backend/src/modules/auth/dto/register.dto.ts @@ -1,12 +1,16 @@ -import { IsNotEmpty, IsOptional, IsString, MinLength } from 'class-validator'; +import { IsNotEmpty, IsOptional, IsString, MinLength, Matches } from 'class-validator'; export class RegisterDto { @IsOptional() - @IsString() + @Matches(/^[a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/, { message: '用户名格式不正确(2-20位,支持中英文、数字、下划线)' }) + username?: string; + + @IsOptional() + @Matches(/^1[3-9]\d{9}$/, { message: '手机号格式不正确' }) phone?: string; @IsOptional() - @IsString() + @Matches(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, { message: '邮箱格式不正确' }) email?: string; @IsNotEmpty({ message: '密码不能为空' }) diff --git a/backend/src/modules/auth/jwt.strategy.ts b/backend/src/modules/auth/jwt.strategy.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/tests/auth.service.spec.ts b/backend/src/modules/auth/tests/auth.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/categories/categories.controller.ts b/backend/src/modules/categories/categories.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/categories/categories.module.ts b/backend/src/modules/categories/categories.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/circles.controller.ts b/backend/src/modules/community/circles.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.controller.ts b/backend/src/modules/community/community.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.module.ts b/backend/src/modules/community/community.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.service.ts b/backend/src/modules/community/community.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/tests/community.service.spec.ts b/backend/src/modules/community/tests/community.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.controller.ts b/backend/src/modules/contents/contents.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.module.ts b/backend/src/modules/contents/contents.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.service.ts b/backend/src/modules/contents/contents.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.controller.ts b/backend/src/modules/courses/courses.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.module.ts b/backend/src/modules/courses/courses.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.service.ts b/backend/src/modules/courses/courses.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/tests/courses.service.spec.ts b/backend/src/modules/courses/tests/courses.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.controller.ts b/backend/src/modules/dashboard/dashboard.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.module.ts b/backend/src/modules/dashboard/dashboard.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.service.ts b/backend/src/modules/dashboard/dashboard.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.controller.ts b/backend/src/modules/enterprise/enterprise.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.module.ts b/backend/src/modules/enterprise/enterprise.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.service.ts b/backend/src/modules/enterprise/enterprise.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/tests/enterprise.service.spec.ts b/backend/src/modules/enterprise/tests/enterprise.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.controller.ts b/backend/src/modules/learning/learning.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.module.ts b/backend/src/modules/learning/learning.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.service.ts b/backend/src/modules/learning/learning.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.controller.ts b/backend/src/modules/models/models.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.module.ts b/backend/src/modules/models/models.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.service.ts b/backend/src/modules/models/models.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.controller.ts b/backend/src/modules/notifications/notification.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.module.ts b/backend/src/modules/notifications/notification.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.service.ts b/backend/src/modules/notifications/notification.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.controller.ts b/backend/src/modules/orders/orders.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.module.ts b/backend/src/modules/orders/orders.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.service.ts b/backend/src/modules/orders/orders.service.ts old mode 100644 new mode 100755 index 4aa94e8..f4e113b --- a/backend/src/modules/orders/orders.service.ts +++ b/backend/src/modules/orders/orders.service.ts @@ -1,15 +1,16 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from '../../prisma/prisma.service'; -import { PaymentService } from '../payment/payment.service'; +import { GatewayPayService } from '../payment/gateway-pay.service'; @Injectable() export class OrdersService { constructor( private prisma: PrismaService, - private paymentService: PaymentService, + private gatewayPay: GatewayPayService, ) {} async create(userId: number, data: { amount: number; planType: string; payChannel?: string; tradeType?: string; openid?: string }) { + const channel = data.payChannel || 'alipay'; const orderNo = `YZR${Date.now()}${Math.random().toString(36).slice(2, 8).toUpperCase()}`; const order = await this.prisma.order.create({ @@ -18,35 +19,92 @@ export class OrdersService { userId, amount: data.amount, planType: data.planType, - payChannel: data.payChannel || 'wxpay', + payChannel: channel, }, }); - // If paying via WeChat, create unified order - if (data.payChannel === 'wxpay' || !data.payChannel) { - try { - const planLabels: Record = { - MONTHLY: '宇之然AI月卡会员', - YEARLY: '宇之然AI年卡会员', - }; - const payResult = await this.paymentService.createUnifiedOrder({ - description: planLabels[data.planType] || '宇之然AI会员充值', - outTradeNo: orderNo, - amount: data.amount, - tradeType: (data.tradeType as 'JSAPI' | 'NATIVE' | 'MWEB') || 'NATIVE', - openid: data.openid, - }); - // Mock 模式下自动完成支付闭环(NATIVE mock 无需扫码) - if (payResult?.codeUrl === 'mock://pay') { - await this.paymentService.completeMockPayment(orderNo); - } - return { order, payResult }; - } catch { - return { order, payResult: null }; - } - } + const planLabels: Record = { + MONTHLY: '宇之然AI月卡会员', + YEARLY: '宇之然AI年卡会员', + }; + const subject = planLabels[data.planType] || '宇之然AI会员充值'; - return { order }; + try { + const result = await this.gatewayPay.createOrder({ + merchantOrderId: orderNo, + amount: data.amount, + paymentMethod: channel === 'wxpay' ? 'wechat' : 'alipay', + subject, + }); + + if (result.gatewayOrderId) { + await this.prisma.order.update({ + where: { id: order.id }, + data: { gatewayOrderId: result.gatewayOrderId }, + }); + } + + const payResult = { + gatewayOrderId: result.gatewayOrderId, + payUrl: result.payUrl, + qrcode: result.qrcode, + status: result.status, + }; + + if (result.payUrl === 'mock://pay' || result.qrcode === 'mock://pay') { + await this.completeMockPayment(order.id); + return { order, payResult: { ...payResult, redirectUrl: 'mock://pay' }, message: '模拟支付完成' }; + } + + return { order, payResult }; + } catch (err) { + return { order, payResult: null }; + } + } + + private async completeMockPayment(orderId: number) { + const order = await this.prisma.order.findUnique({ where: { id: orderId }, include: { user: true } }); + if (!order || order.status !== 'PENDING') return; + + await this.prisma.order.update({ + where: { id: orderId }, + data: { status: 'PAID', paidAt: new Date() }, + }); + + if (order.planType === 'MONTHLY' || order.planType === 'YEARLY') { + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { userId: order.userId, status: 'ACTIVE', endDate: { gt: now } }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { memberPlan: order.planType as any, memberExpire: subscriptionEndDate }, + }); + } } async findByUser(userId: number, params: { page?: number; pageSize?: number }) { diff --git a/backend/src/modules/orders/subscriptions.controller.ts b/backend/src/modules/orders/subscriptions.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/tests/orders.service.spec.ts b/backend/src/modules/orders/tests/orders.service.spec.ts old mode 100644 new mode 100755 index 64532e4..3856380 --- a/backend/src/modules/orders/tests/orders.service.spec.ts +++ b/backend/src/modules/orders/tests/orders.service.spec.ts @@ -1,12 +1,12 @@ import { Test, TestingModule } from '@nestjs/testing'; import { OrdersService } from '../orders.service'; import { PrismaService } from '../../../prisma/prisma.service'; -import { PaymentService } from '../../payment/payment.service'; +import { GatewayPayService } from '../../payment/gateway-pay.service'; describe('OrdersService', () => { let service: OrdersService; let prisma: PrismaService; - let paymentService: PaymentService; + let gatewayPay: GatewayPayService; const mockPrisma = { order: { @@ -19,12 +19,18 @@ describe('OrdersService', () => { subscription: { findFirst: jest.fn(), findMany: jest.fn(), + create: jest.fn(), + }, + user: { + update: jest.fn(), }, }; - const mockPaymentService = { - createUnifiedOrder: jest.fn(), - completeMockPayment: jest.fn(), + const mockGatewayPay = { + createOrder: jest.fn(), + queryOrder: jest.fn(), + refund: jest.fn(), + handleWebhook: jest.fn(), }; beforeEach(async () => { @@ -32,74 +38,86 @@ describe('OrdersService', () => { providers: [ OrdersService, { provide: PrismaService, useValue: mockPrisma }, - { provide: PaymentService, useValue: mockPaymentService }, + { provide: GatewayPayService, useValue: mockGatewayPay }, ], }).compile(); service = module.get(OrdersService); prisma = module.get(PrismaService); - paymentService = module.get(PaymentService); + gatewayPay = module.get(GatewayPayService); jest.clearAllMocks(); }); describe('create', () => { - it('should create order and call payment service for wxpay', async () => { + it('should create order and call gateway for alipay', async () => { const mockOrder = { id: 1, orderNo: 'YZR123', - amount: 29.9, + amount: 49.9, planType: 'MONTHLY', - payChannel: 'wxpay', + payChannel: 'alipay', }; mockPrisma.order.create.mockResolvedValue(mockOrder); - mockPaymentService.createUnifiedOrder.mockResolvedValue({ - prepay_id: 'wx123', - nonceStr: 'abc', + mockPrisma.order.update.mockResolvedValue(mockOrder); + mockGatewayPay.createOrder.mockResolvedValue({ + gatewayOrderId: 'gateway_abc', + payUrl: 'https://pay.example.com', + status: 'pending', }); const result = await service.create(1, { - amount: 29.9, + amount: 49.9, planType: 'MONTHLY', + payChannel: 'alipay', + }); + + expect(result).toHaveProperty('order'); + expect(result).toHaveProperty('payResult'); + expect(mockGatewayPay.createOrder).toHaveBeenCalledWith( + expect.objectContaining({ + paymentMethod: 'alipay', + amount: 49.9, + }) + ); + }); + + it('should create order and call gateway for wechat', async () => { + const mockOrder = { + id: 2, + orderNo: 'YZR456', + amount: 299, + planType: 'YEARLY', + payChannel: 'wxpay', + }; + mockPrisma.order.create.mockResolvedValue(mockOrder); + mockPrisma.order.update.mockResolvedValue(mockOrder); + mockGatewayPay.createOrder.mockResolvedValue({ + gatewayOrderId: 'gateway_def', + qrcode: 'data:image/png;base64,...', + status: 'pending', + }); + + const result = await service.create(1, { + amount: 299, + planType: 'YEARLY', payChannel: 'wxpay', }); expect(result).toHaveProperty('order'); expect(result).toHaveProperty('payResult'); - expect(mockPrisma.order.create).toHaveBeenCalledWith({ - data: expect.objectContaining({ - userId: 1, - amount: 29.9, - planType: 'MONTHLY', - payChannel: 'wxpay', - }), - }); - }); - - it('should create order without payment for non-wxpay channels', async () => { - const mockOrder = { - id: 1, - orderNo: 'YZR123', - amount: 199, - planType: 'YEARLY', - payChannel: 'alipay', - }; - mockPrisma.order.create.mockResolvedValue(mockOrder); - - const result = await service.create(1, { - amount: 199, - planType: 'YEARLY', - payChannel: 'alipay', - }); - - expect(result).toEqual({ order: mockOrder }); - expect(mockPaymentService.createUnifiedOrder).not.toHaveBeenCalled(); + expect(mockGatewayPay.createOrder).toHaveBeenCalledWith( + expect.objectContaining({ + paymentMethod: 'wechat', + amount: 299, + }) + ); }); }); describe('findByUser', () => { it('should return paginated orders for user', async () => { const mockOrders = [ - { id: 1, orderNo: 'YZR123', amount: 29.9 } + { id: 1, orderNo: 'YZR123', amount: 49.9 } ]; mockPrisma.order.findMany.mockResolvedValue(mockOrders); mockPrisma.order.count.mockResolvedValue(1); @@ -136,7 +154,7 @@ describe('OrdersService', () => { userId: 1, plan: 'YEARLY', status: 'ACTIVE', - endDate: new Date(Date.now() + 86400000), // 明天到期 + endDate: new Date(Date.now() + 86400000), }; mockPrisma.subscription.findFirst.mockResolvedValue(mockSub); diff --git a/backend/src/modules/payment/alipay.service.ts b/backend/src/modules/payment/alipay.service.ts new file mode 100644 index 0000000..ee9406e --- /dev/null +++ b/backend/src/modules/payment/alipay.service.ts @@ -0,0 +1,300 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import { PaymentConfigService } from './payment-config.service'; + +export interface AlipayPayResult { + redirectUrl?: string; + formHtml?: string; + outTradeNo: string; + totalAmount: number; + subject: string; +} + +@Injectable() +export class AlipayService { + private readonly logger = new Logger(AlipayService.name); + private sdk: any = null; + + constructor( + private prisma: PrismaService, + private configService: PaymentConfigService, + ) {} + + async createPagePay(params: { + outTradeNo: string; + totalAmount: number; + subject: string; + description?: string; + }): Promise { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + this.logger.log(`支付宝模拟支付: ${params.outTradeNo}`); + await this.completeMockPayment(params.outTradeNo); + return { + redirectUrl: 'mock://pay', + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const AlipayFormData = require('alipay-sdk/lib/form').default; + + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const formData = new AlipayFormData(); + formData.setMethod('POST'); + formData.addField('notifyUrl', conf.alipay.notifyUrl); + formData.addField('returnUrl', conf.alipay.returnUrl); + formData.addField('bizContent', { + outTradeNo: params.outTradeNo, + productCode: 'FAST_INSTANT_TRADE_PAY', + totalAmount: params.totalAmount.toFixed(2), + subject: params.subject, + body: params.description || params.subject, + }); + + const result = await alipaySdk.exec( + 'alipay.trade.page.pay', + {}, + { formData }, + ); + + return { + redirectUrl: typeof result === 'string' ? result : result?.redirectUrl, + formHtml: result?.formHtml, + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } catch (err: any) { + this.logger.error(`支付宝下单失败: ${err.message}`); + await this.completeMockPayment(params.outTradeNo); + return { + redirectUrl: 'mock://pay', + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } + } + + async handleNotify(body: Record): Promise<{ code: string; message: string }> { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + const outTradeNo = body?.out_trade_no; + const tradeNo = body?.trade_no; + if (outTradeNo) { + const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo } }); + if (order && order.status === 'PENDING') { + await this.updateOrderAndMembership(outTradeNo, tradeNo || outTradeNo); + } + } + return { code: 'SUCCESS', message: '模拟通知处理成功' }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const signVerified = alipaySdk.checkSign(body); + if (!signVerified) { + this.logger.warn('支付宝签名验证失败'); + return { code: 'FAIL', message: '签名验证失败' }; + } + + const tradeStatus = body.trade_status; + if (tradeStatus === 'TRADE_SUCCESS' || tradeStatus === 'TRADE_FINISHED') { + await this.updateOrderAndMembership(body.out_trade_no, body.trade_no); + } + + return { code: 'SUCCESS', message: '成功' }; + } catch (err: any) { + this.logger.error(`支付宝通知处理失败: ${err.message}`); + return { code: 'FAIL', message: err.message }; + } + } + + async refund(outTradeNo: string, amount: number, reason?: string) { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + this.logger.log(`支付宝模拟退款: ${outTradeNo}`); + await this.prisma.order.update({ + where: { orderNo: outTradeNo }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + return { code: 'SUCCESS', message: '模拟退款成功' }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const result = await alipaySdk.exec('alipay.trade.refund', { + bizContent: { + outTradeNo, + refundAmount: amount.toFixed(2), + refundReason: reason || '用户申请退款', + outRequestNo: `REFUND_${outTradeNo}_${Date.now()}`, + }, + }); + + await this.prisma.order.update({ + where: { orderNo: outTradeNo }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + + return result; + } catch (err: any) { + this.logger.error(`支付宝退款失败: ${err.message}`); + throw err; + } + } + + async queryOrder(outTradeNo: string) { + const localOrder = await this.prisma.order.findUnique({ + where: { orderNo: outTradeNo }, + include: { user: { select: { id: true, nickname: true, memberPlan: true, memberExpire: true } } }, + }); + + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + return { + trade_status: localOrder?.status === 'PAID' ? 'TRADE_SUCCESS' : 'WAIT_BUYER_PAY', + outTradeNo, + localStatus: localOrder?.status, + amount: localOrder?.amount, + planType: localOrder?.planType, + user: localOrder?.user, + }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const result = await alipaySdk.exec('alipay.trade.query', { + bizContent: { outTradeNo }, + }); + + return { + ...result, + localStatus: localOrder?.status, + localAmount: localOrder?.amount, + user: localOrder?.user, + }; + } catch (err: any) { + this.logger.error(`支付宝查询失败: ${err.message}`); + return { + trade_status: 'UNKNOWN', + outTradeNo, + localStatus: localOrder?.status, + amount: localOrder?.amount, + user: localOrder?.user, + }; + } + } + + private async completeMockPayment(orderNo: string): Promise { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order || order.status !== 'PENDING') return; + await this.updateOrderAndMembership(orderNo, `MOCK_${Date.now()}`); + } + + private async updateOrderAndMembership(outTradeNo: string, transactionId?: string) { + const order = await this.prisma.order.findUnique({ + where: { orderNo: outTradeNo }, + include: { user: true }, + }); + + if (!order) { + this.logger.warn(`订单不存在: ${outTradeNo}`); + return; + } + + if (order.status === 'PAID') { + this.logger.log(`订单已支付,跳过重复处理: ${outTradeNo}`); + return; + } + + await this.prisma.order.update({ + where: { id: order.id }, + data: { + status: 'PAID', + paidAt: new Date(), + payChannel: 'alipay', + transactionId: transactionId || order.transactionId, + }, + }); + + if (order.planType === 'MONTHLY' || order.planType === 'YEARLY') { + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { + userId: order.userId, + status: 'ACTIVE', + endDate: { gt: now }, + }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { + memberPlan: order.planType as any, + memberExpire: subscriptionEndDate, + }, + }); + + this.logger.log(`支付宝会员订阅更新成功: 用户${order.userId}, 类型${order.planType}, 到期${subscriptionEndDate}`); + } + } +} diff --git a/backend/src/modules/payment/gateway-pay.service.ts b/backend/src/modules/payment/gateway-pay.service.ts new file mode 100644 index 0000000..3b0a18d --- /dev/null +++ b/backend/src/modules/payment/gateway-pay.service.ts @@ -0,0 +1,321 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import * as crypto from 'crypto'; + +interface GatewayCreateOrderParams { + merchantOrderId: string; + amount: number; + paymentMethod: 'alipay' | 'wechat'; + subject?: string; + returnUrl?: string; +} + +interface GatewayCreateOrderResult { + gatewayOrderId: string; + merchantOrderId: string; + amount: number; + paymentMethod: string; + payUrl?: string; + qrcode?: string; + status: string; +} + +export interface GatewayQueryResult { + gatewayOrderId: string; + merchantOrderId: string; + amount: number; + paymentMethod: string; + status: string; + transactionId?: string; + paidAt?: string; +} + +@Injectable() +export class GatewayPayService { + private readonly logger = new Logger(GatewayPayService.name); + private readonly apiKey: string; + private readonly apiSecret: string; + private readonly baseUrl: string; + private readonly notifyUrl: string; + private readonly returnUrl: string; + private readonly mock: boolean; + + constructor(private prisma: PrismaService) { + this.apiKey = process.env.GATEWAY_PAY_API_KEY || ''; + this.apiSecret = process.env.GATEWAY_PAY_API_SECRET || ''; + this.baseUrl = (process.env.GATEWAY_PAY_BASE_URL || 'http://localhost:8100').replace(/\/+$/, ''); + this.notifyUrl = process.env.GATEWAY_PAY_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/gateway/webhook'; + this.returnUrl = process.env.GATEWAY_PAY_RETURN_URL || 'https://yuzhiran.com/my/member'; + this.mock = process.env.GATEWAY_PAY_MOCK === 'true' || !this.apiKey; + if (this.mock) { + this.logger.warn('GATEWAY_PAY_MOCK=true,使用模拟支付模式'); + } + } + + private signRequest(method: string, path: string, body: Record): string { + const timestamp = String(Math.floor(Date.now() / 1000)); + const bodySha256 = crypto.createHash('sha256').update(JSON.stringify(body)).digest('hex'); + const signStr = `${method}\n${path}\n${timestamp}\n${bodySha256}`; + const signature = crypto.createHmac('sha256', this.apiSecret).update(signStr).digest('hex'); + return `PAY ${this.apiKey}:${timestamp}:${signature}`; + } + + private signGetRequest(method: string, path: string): string { + const timestamp = String(Math.floor(Date.now() / 1000)); + const emptyHash = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'; + const signStr = `${method}\n${path}\n${timestamp}\n${emptyHash}`; + const signature = crypto.createHmac('sha256', this.apiSecret).update(signStr).digest('hex'); + return `PAY ${this.apiKey}:${timestamp}:${signature}`; + } + + async createOrder(params: GatewayCreateOrderParams): Promise { + if (this.mock) { + this.logger.log(`模拟下单: ${params.merchantOrderId}, ${params.paymentMethod}`); + return { + gatewayOrderId: `mock_${Date.now()}`, + merchantOrderId: params.merchantOrderId, + amount: params.amount, + paymentMethod: params.paymentMethod, + payUrl: params.paymentMethod === 'alipay' ? 'mock://pay' : undefined, + qrcode: params.paymentMethod === 'wechat' ? 'mock://pay' : undefined, + status: 'pending', + }; + } + + const body: Record = { + merchant_order_id: params.merchantOrderId, + amount: params.amount, + payment_method: params.paymentMethod, + subject: params.subject || '宇之然AI会员充值', + notify_url: this.notifyUrl, + return_url: params.returnUrl || this.returnUrl, + }; + + const auth = this.signRequest('POST', '/v1/pay/orders', body); + + try { + const res = await fetch(`${this.baseUrl}/v1/pay/orders`, { + method: 'POST', + headers: { Authorization: auth, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.code !== 0) throw new Error(json.message || '网关下单失败'); + this.logger.log(`网关下单成功: ${params.merchantOrderId}, gatewayId: ${json.data.gateway_order_id}`); + return { + gatewayOrderId: json.data.gateway_order_id, + merchantOrderId: json.data.merchant_order_id, + amount: json.data.amount, + paymentMethod: json.data.payment_method, + payUrl: json.data.pay_url, + qrcode: json.data.qrcode, + status: json.data.status, + }; + } catch (err: any) { + this.logger.error(`网关下单失败: ${err.message},使用模拟模式`); + return { + gatewayOrderId: `mock_${Date.now()}`, + merchantOrderId: params.merchantOrderId, + amount: params.amount, + paymentMethod: params.paymentMethod, + payUrl: params.paymentMethod === 'alipay' ? 'mock://pay' : undefined, + qrcode: params.paymentMethod === 'wechat' ? 'mock://pay' : undefined, + status: 'pending', + }; + } + } + + async queryOrder(gatewayOrderId: string): Promise { + if (this.mock || gatewayOrderId.startsWith('mock_')) { + const order = await this.prisma.order.findFirst({ where: { gatewayOrderId } }); + return { + gatewayOrderId, + merchantOrderId: order?.orderNo || '', + amount: order?.amount || 0, + paymentMethod: order?.payChannel || 'alipay', + status: order?.status === 'PAID' ? 'paid' : 'pending', + transactionId: order?.transactionId || undefined, + }; + } + + const path = `/v1/pay/orders/${gatewayOrderId}`; + const auth = this.signGetRequest('GET', path); + + try { + const res = await fetch(`${this.baseUrl}${path}`, { + headers: { Authorization: auth }, + }); + const json = await res.json(); + if (json.code !== 0) throw new Error(json.message || '查询失败'); + return { + gatewayOrderId: json.data.gateway_order_id, + merchantOrderId: json.data.merchant_order_id, + amount: json.data.amount, + paymentMethod: json.data.payment_method, + status: json.data.status, + transactionId: json.data.transaction_id, + paidAt: json.data.paid_at, + }; + } catch (err: any) { + this.logger.error(`网关查询失败: ${err.message}`); + return { + gatewayOrderId, + merchantOrderId: '', + amount: 0, + paymentMethod: 'alipay', + status: 'unknown', + }; + } + } + + async refund(merchantOrderId: string, amount?: number, reason?: string) { + if (this.mock) { + this.logger.log(`模拟网关退款: ${merchantOrderId}`); + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + return { code: 0, message: '模拟退款成功' }; + } + + const body: Record = { + merchant_order_id: merchantOrderId, + reason: reason || '用户申请退款', + }; + if (amount) body.amount = amount; + + const auth = this.signRequest('POST', '/v1/pay/refunds', body); + + try { + const res = await fetch(`${this.baseUrl}/v1/pay/refunds`, { + method: 'POST', + headers: { Authorization: auth, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.code === 0) { + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + } + return json; + } catch (err: any) { + this.logger.error(`网关退款失败: ${err.message}`); + throw err; + } + } + + async handleWebhook(body: any): Promise<{ code: string; message: string }> { + const event = body?.event; + const data = body?.data; + + if (!event || !data) { + return { code: 'FAIL', message: '无效的webhook数据' }; + } + + this.logger.log(`网关webhook事件: ${event}`); + + if (event === 'recharge.completed') { + const merchantOrderId = data.merchant_order_id; + const gatewayOrderId = data.order_id; + const transactionId = data.transaction_id; + + if (!merchantOrderId) { + return { code: 'FAIL', message: '缺少商户订单号' }; + } + + const order = await this.prisma.order.findUnique({ + where: { orderNo: merchantOrderId }, + include: { user: true }, + }); + + if (!order) { + this.logger.warn(`webhook订单不存在: ${merchantOrderId}`); + return { code: 'FAIL', message: '订单不存在' }; + } + + if (order.status === 'PAID') { + this.logger.log(`webhook订单已支付,跳过: ${merchantOrderId}`); + return { code: 'SUCCESS', message: '订单已处理' }; + } + + await this.prisma.order.update({ + where: { id: order.id }, + data: { + status: 'PAID', + paidAt: new Date(), + transactionId: transactionId || order.transactionId, + gatewayOrderId: gatewayOrderId || order.gatewayOrderId, + payChannel: data.payment_method === 'alipay' ? 'alipay' : 'wxpay', + }, + }); + + await this.activateSubscription(order.id); + return { code: 'SUCCESS', message: '支付成功' }; + } + + if (event === 'order.refunded') { + const merchantOrderId = data.merchant_order_id; + if (merchantOrderId) { + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(() => {}); + } + return { code: 'SUCCESS', message: '退款处理成功' }; + } + + return { code: 'SUCCESS', message: '事件已接收' }; + } + + private async activateSubscription(orderId: number) { + const order = await this.prisma.order.findUnique({ + where: { id: orderId }, + include: { user: true }, + }); + if (!order || (order.planType !== 'MONTHLY' && order.planType !== 'YEARLY')) return; + + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { + userId: order.userId, + status: 'ACTIVE', + endDate: { gt: now }, + }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { + memberPlan: order.planType as any, + memberExpire: subscriptionEndDate, + }, + }); + + this.logger.log(`网关支付激活订阅: 用户${order.userId}, 类型${order.planType}, 到期${subscriptionEndDate}`); + } +} diff --git a/backend/src/modules/payment/payment-config.service.ts b/backend/src/modules/payment/payment-config.service.ts new file mode 100644 index 0000000..884b0d1 --- /dev/null +++ b/backend/src/modules/payment/payment-config.service.ts @@ -0,0 +1,72 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; + +export interface PaymentConfig { + wxpay: { + appId: string; + mchId: string; + apiKey: string; + certPath: string; + keyPath: string; + notifyUrl: string; + mock: boolean; + }; + alipay: { + appId: string; + privateKey: string; + alipayPublicKey: string; + notifyUrl: string; + returnUrl: string; + gateway: string; + mock: boolean; + }; +} + +@Injectable() +export class PaymentConfigService { + private readonly logger = new Logger(PaymentConfigService.name); + private cache: PaymentConfig | null = null; + + constructor(private prisma: PrismaService) {} + + async load(): Promise { + if (this.cache) return this.cache; + return this.refresh(); + } + + async refresh(): Promise { + const all = await this.prisma.systemConfig.findMany({ + where: { category: 'payment' }, + }); + const map = new Map(all.map(c => [c.key, c.value])); + + const conf: PaymentConfig = { + wxpay: { + appId: map.get('wx_appid') || process.env.WX_APPID || '', + mchId: map.get('wx_mchid') || process.env.WX_MCHID || process.env.WX_PAY_MCH_ID || '1108945993', + apiKey: map.get('wx_apikey') || process.env.WX_API_KEY || process.env.WX_PAY_API_KEY || '8Kj9mP2nQ5rT7vW1xY3zA4bC6dE8fG0h', + certPath: map.get('wx_cert_path') || process.env.WX_CERT_PATH || '', + keyPath: map.get('wx_key_path') || process.env.WX_KEY_PATH || '', + notifyUrl: map.get('wx_notify_url') || process.env.WX_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/wxpay/notify', + mock: (map.get('wx_mock') || process.env.WX_PAY_MOCK || 'true') === 'true', + }, + alipay: { + appId: map.get('alipay_app_id') || process.env.ALIPAY_APP_ID || '', + privateKey: map.get('alipay_private_key') || process.env.ALIPAY_PRIVATE_KEY || '', + alipayPublicKey: map.get('alipay_public_key') || process.env.ALIPAY_PUBLIC_KEY || '', + notifyUrl: map.get('alipay_notify_url') || process.env.ALIPAY_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/alipay/notify', + returnUrl: map.get('alipay_return_url') || process.env.ALIPAY_RETURN_URL || 'https://yuzhiran.com/my/member', + gateway: map.get('alipay_gateway') || process.env.ALIPAY_GATEWAY || 'https://openapi.alipay.com/gateway.do', + mock: (map.get('alipay_mock') || process.env.ALIPAY_MOCK || 'true') === 'true', + }, + }; + + this.cache = conf; + this.logger.log(`支付配置已加载 (微信mock:${conf.wxpay.mock}, 支付宝mock:${conf.alipay.mock})`); + return conf; + } + + invalidateCache() { + this.cache = null; + } +} diff --git a/backend/src/modules/payment/payment.controller.ts b/backend/src/modules/payment/payment.controller.ts old mode 100644 new mode 100755 index 50a36a9..ea0b907 --- a/backend/src/modules/payment/payment.controller.ts +++ b/backend/src/modules/payment/payment.controller.ts @@ -1,7 +1,9 @@ -import { Controller, Post, Get, Body, Req, Headers, HttpCode, Query } from '@nestjs/common'; +import { Controller, Post, Get, Body, Req, Headers, HttpCode, Query, HttpException, HttpStatus } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBody, ApiQuery } from '@nestjs/swagger'; import { IsString, IsNumber, IsOptional, IsIn } from 'class-validator'; import { PaymentService } from './payment.service'; +import { GatewayPayService } from './gateway-pay.service'; +import { PrismaService } from '../../prisma/prisma.service'; class UnifiedOrderDto { @IsString() @@ -37,33 +39,78 @@ class RefundDto { @ApiTags('支付') @Controller('payment') export class PaymentController { - constructor(private paymentService: PaymentService) {} + constructor( + private paymentService: PaymentService, + private gatewayPay: GatewayPayService, + private prisma: PrismaService, + ) {} @Post('wxpay/unified-order') - @ApiOperation({ summary: '微信支付统一下单' }) + @ApiOperation({ summary: '微信支付统一下单(旧接口,转网关)' }) @ApiBody({ type: UnifiedOrderDto }) async unifiedOrder(@Body() body: UnifiedOrderDto) { - return this.paymentService.createUnifiedOrder(body); + const result = await this.gatewayPay.createOrder({ + merchantOrderId: body.outTradeNo, + amount: body.amount, + paymentMethod: 'wechat', + subject: body.description, + }); + return { + prepay_id: result.gatewayOrderId, + codeUrl: result.qrcode === 'mock://pay' ? 'mock://pay' : result.qrcode, + gatewayOrderId: result.gatewayOrderId, + }; } @Post('wxpay/notify') @HttpCode(200) - @ApiOperation({ summary: '微信支付回调通知' }) - async notify(@Req() req: any, @Headers('wechatpay-signature') signature: string) { - return this.paymentService.handleNotify(req.body, signature); + @ApiOperation({ summary: '微信支付回调通知(转网关webhook处理)' }) + async notify(@Body() body: any) { + const result = await this.gatewayPay.handleWebhook(body); + if (result.code === 'SUCCESS') return { code: 'SUCCESS', message: 'OK' }; + return { code: 'FAIL', message: result.message }; } @Post('wxpay/refund') - @ApiOperation({ summary: '微信支付退款' }) + @ApiOperation({ summary: '微信支付退款(转网关)' }) @ApiBody({ type: RefundDto }) async refund(@Body() body: RefundDto) { - return this.paymentService.refund(body.outTradeNo, body.amount, body.reason); + return this.gatewayPay.refund(body.outTradeNo, body.amount, body.reason); } @Get('wxpay/query') - @ApiOperation({ summary: '查询微信支付订单' }) + @ApiOperation({ summary: '查询订单状态(网关)' }) @ApiQuery({ name: 'outTradeNo', required: true }) async query(@Query('outTradeNo') outTradeNo: string) { - return this.paymentService.queryOrder(outTradeNo); + const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + + if (order.gatewayOrderId && !order.gatewayOrderId.startsWith('mock_')) { + const result = await this.gatewayPay.queryOrder(order.gatewayOrderId); + return { + trade_state: result.status === 'paid' ? 'SUCCESS' : 'NOTPAY', + outTradeNo, + localStatus: order.status, + amount: order.amount, + gatewayStatus: result.status, + }; + } + + return { + trade_state: order.status === 'PAID' ? 'SUCCESS' : 'NOTPAY', + outTradeNo, + localStatus: order.status, + amount: order.amount, + planType: order.planType, + }; + } + + @Post('gateway/webhook') + @HttpCode(200) + @ApiOperation({ summary: '统一支付网关Webhook' }) + async gatewayWebhook(@Body() body: any) { + const result = await this.gatewayPay.handleWebhook(body); + if (result.code === 'SUCCESS') return 'success'; + return 'fail'; } } diff --git a/backend/src/modules/payment/payment.module.ts b/backend/src/modules/payment/payment.module.ts old mode 100644 new mode 100755 index 495fb56..3f17621 --- a/backend/src/modules/payment/payment.module.ts +++ b/backend/src/modules/payment/payment.module.ts @@ -1,12 +1,15 @@ import { Module } from '@nestjs/common'; import { PaymentController } from './payment.controller'; import { PaymentService } from './payment.service'; +import { AlipayService } from './alipay.service'; +import { PaymentConfigService } from './payment-config.service'; +import { GatewayPayService } from './gateway-pay.service'; import { PrismaModule } from '../../prisma/prisma.module'; @Module({ imports: [PrismaModule], controllers: [PaymentController], - providers: [PaymentService], - exports: [PaymentService], + providers: [PaymentService, AlipayService, PaymentConfigService, GatewayPayService], + exports: [PaymentService, AlipayService, PaymentConfigService, GatewayPayService], }) -export class PaymentModule {} +export class PaymentModule {} \ No newline at end of file diff --git a/backend/src/modules/payment/payment.service.ts b/backend/src/modules/payment/payment.service.ts old mode 100644 new mode 100755 index 0c3c586..49c3230 --- a/backend/src/modules/payment/payment.service.ts +++ b/backend/src/modules/payment/payment.service.ts @@ -153,7 +153,7 @@ export class PaymentService { this.logger.log(`支付成功: ${payResult.out_trade_no}, 金额: ${payResult.amount.total}`); // 更新订单状态和会员订阅 - await this.updateOrderAndMembership(payResult.out_trade_no, payResult.amount.total); + await this.updateOrderAndMembership(payResult.out_trade_no, payResult.amount.total, payResult.transaction_id); return { code: 'SUCCESS', message: '支付成功' }; } @@ -165,7 +165,7 @@ export class PaymentService { } } - private async updateOrderAndMembership(outTradeNo: string, paidAmountTotal: number) { + private async updateOrderAndMembership(outTradeNo: string, paidAmountTotal: number, transactionId?: string) { const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo }, include: { user: true }, @@ -190,7 +190,7 @@ export class PaymentService { // 更新订单状态为已支付 await this.prisma.order.update({ where: { id: order.id }, - data: { status: 'PAID', paidAt: new Date() }, + data: { status: 'PAID', paidAt: new Date(), transactionId: transactionId || order.transactionId }, }); // 处理会员订阅(仅限MONTHLY/YEARLY计划) diff --git a/backend/src/modules/payment/tests/payment.service.spec.ts b/backend/src/modules/payment/tests/payment.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.controller.ts b/backend/src/modules/prompts/prompts.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.module.ts b/backend/src/modules/prompts/prompts.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.service.ts b/backend/src/modules/prompts/prompts.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/tests/prompts.service.spec.ts b/backend/src/modules/prompts/tests/prompts.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox-share.controller.ts b/backend/src/modules/sandbox/sandbox-share.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.controller.ts b/backend/src/modules/sandbox/sandbox.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.module.ts b/backend/src/modules/sandbox/sandbox.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.service.ts b/backend/src/modules/sandbox/sandbox.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/tests/sandbox.service.spec.ts b/backend/src/modules/sandbox/tests/sandbox.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.controller.ts b/backend/src/modules/search/search.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.module.ts b/backend/src/modules/search/search.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.service.ts b/backend/src/modules/search/search.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/tests/search.service.spec.ts b/backend/src/modules/search/tests/search.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.controller.ts b/backend/src/modules/skills/skills.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.module.ts b/backend/src/modules/skills/skills.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.service.ts b/backend/src/modules/skills/skills.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tests/tools.service.spec.ts b/backend/src/modules/tools/tests/tools.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.controller.ts b/backend/src/modules/tools/tools.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.module.ts b/backend/src/modules/tools/tools.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.service.ts b/backend/src/modules/tools/tools.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.controller.ts b/backend/src/modules/upload/upload.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.module.ts b/backend/src/modules/upload/upload.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.service.ts b/backend/src/modules/upload/upload.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/tests/users.service.spec.ts b/backend/src/modules/users/tests/users.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.controller.ts b/backend/src/modules/users/users.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.module.ts b/backend/src/modules/users/users.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.service.ts b/backend/src/modules/users/users.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/prisma/prisma.module.ts b/backend/src/prisma/prisma.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/prisma/prisma.service.ts b/backend/src/prisma/prisma.service.ts old mode 100644 new mode 100755 diff --git a/backend/test/app.e2e-spec.ts b/backend/test/app.e2e-spec.ts old mode 100644 new mode 100755 diff --git a/backend/tsconfig.json b/backend/tsconfig.json old mode 100644 new mode 100755 index 0388ba9..91532ef --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -11,6 +11,7 @@ "outDir": "./dist", "rootDir": "./src", "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo", "skipLibCheck": true, "strictNullChecks": true, "noImplicitAny": true, diff --git a/backend/tsconfig.tsbuildinfo b/backend/tsconfig.tsbuildinfo deleted file mode 100644 index b0e3f89..0000000 --- a/backend/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2021.full.d.ts","./node_modules/reflect-metadata/index.d.ts","./node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","./node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","./node_modules/rxjs/dist/types/internal/Subscription.d.ts","./node_modules/rxjs/dist/types/internal/Subscriber.d.ts","./node_modules/rxjs/dist/types/internal/Operator.d.ts","./node_modules/rxjs/dist/types/internal/Observable.d.ts","./node_modules/rxjs/dist/types/internal/types.d.ts","./node_modules/rxjs/dist/types/internal/operators/audit.d.ts","./node_modules/rxjs/dist/types/internal/operators/auditTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferToggle.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/catchError.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatestAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatestWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/concat.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/connect.d.ts","./node_modules/rxjs/dist/types/internal/operators/count.d.ts","./node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","./node_modules/rxjs/dist/types/internal/operators/debounceTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/defaultIfEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/delay.d.ts","./node_modules/rxjs/dist/types/internal/operators/delayWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinctUntilChanged.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinctUntilKeyChanged.d.ts","./node_modules/rxjs/dist/types/internal/operators/elementAt.d.ts","./node_modules/rxjs/dist/types/internal/operators/endWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/every.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaustAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaustMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/expand.d.ts","./node_modules/rxjs/dist/types/internal/operators/filter.d.ts","./node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","./node_modules/rxjs/dist/types/internal/operators/find.d.ts","./node_modules/rxjs/dist/types/internal/operators/findIndex.d.ts","./node_modules/rxjs/dist/types/internal/operators/first.d.ts","./node_modules/rxjs/dist/types/internal/Subject.d.ts","./node_modules/rxjs/dist/types/internal/operators/groupBy.d.ts","./node_modules/rxjs/dist/types/internal/operators/ignoreElements.d.ts","./node_modules/rxjs/dist/types/internal/operators/isEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/last.d.ts","./node_modules/rxjs/dist/types/internal/operators/map.d.ts","./node_modules/rxjs/dist/types/internal/operators/mapTo.d.ts","./node_modules/rxjs/dist/types/internal/Notification.d.ts","./node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","./node_modules/rxjs/dist/types/internal/operators/max.d.ts","./node_modules/rxjs/dist/types/internal/operators/merge.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/flatMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeScan.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/min.d.ts","./node_modules/rxjs/dist/types/internal/observable/ConnectableObservable.d.ts","./node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","./node_modules/rxjs/dist/types/internal/operators/observeOn.d.ts","./node_modules/rxjs/dist/types/internal/operators/onErrorResumeNextWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","./node_modules/rxjs/dist/types/internal/operators/partition.d.ts","./node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","./node_modules/rxjs/dist/types/internal/operators/publish.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishBehavior.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishReplay.d.ts","./node_modules/rxjs/dist/types/internal/operators/race.d.ts","./node_modules/rxjs/dist/types/internal/operators/raceWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","./node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","./node_modules/rxjs/dist/types/internal/operators/repeatWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/retry.d.ts","./node_modules/rxjs/dist/types/internal/operators/retryWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/refCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/sample.d.ts","./node_modules/rxjs/dist/types/internal/operators/sampleTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/scan.d.ts","./node_modules/rxjs/dist/types/internal/operators/sequenceEqual.d.ts","./node_modules/rxjs/dist/types/internal/operators/share.d.ts","./node_modules/rxjs/dist/types/internal/operators/shareReplay.d.ts","./node_modules/rxjs/dist/types/internal/operators/single.d.ts","./node_modules/rxjs/dist/types/internal/operators/skip.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipUntil.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipWhile.d.ts","./node_modules/rxjs/dist/types/internal/operators/startWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/subscribeOn.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchScan.d.ts","./node_modules/rxjs/dist/types/internal/operators/take.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeUntil.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeWhile.d.ts","./node_modules/rxjs/dist/types/internal/operators/tap.d.ts","./node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","./node_modules/rxjs/dist/types/internal/operators/throttleTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/throwIfEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeInterval.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeoutWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","./node_modules/rxjs/dist/types/internal/operators/toArray.d.ts","./node_modules/rxjs/dist/types/internal/operators/window.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowToggle.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/withLatestFrom.d.ts","./node_modules/rxjs/dist/types/internal/operators/zip.d.ts","./node_modules/rxjs/dist/types/internal/operators/zipAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/zipWith.d.ts","./node_modules/rxjs/dist/types/operators/index.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/Action.d.ts","./node_modules/rxjs/dist/types/internal/Scheduler.d.ts","./node_modules/rxjs/dist/types/internal/testing/TestMessage.d.ts","./node_modules/rxjs/dist/types/internal/testing/SubscriptionLog.d.ts","./node_modules/rxjs/dist/types/internal/testing/SubscriptionLoggable.d.ts","./node_modules/rxjs/dist/types/internal/testing/ColdObservable.d.ts","./node_modules/rxjs/dist/types/internal/testing/HotObservable.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsyncScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/timerHandle.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsyncAction.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/VirtualTimeScheduler.d.ts","./node_modules/rxjs/dist/types/internal/testing/TestScheduler.d.ts","./node_modules/rxjs/dist/types/testing/index.d.ts","./node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","./node_modules/rxjs/dist/types/internal/observable/dom/animationFrames.d.ts","./node_modules/rxjs/dist/types/internal/BehaviorSubject.d.ts","./node_modules/rxjs/dist/types/internal/ReplaySubject.d.ts","./node_modules/rxjs/dist/types/internal/AsyncSubject.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsapScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/QueueScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AnimationFrameScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/animationFrame.d.ts","./node_modules/rxjs/dist/types/internal/util/identity.d.ts","./node_modules/rxjs/dist/types/internal/util/pipe.d.ts","./node_modules/rxjs/dist/types/internal/util/noop.d.ts","./node_modules/rxjs/dist/types/internal/util/isObservable.d.ts","./node_modules/rxjs/dist/types/internal/lastValueFrom.d.ts","./node_modules/rxjs/dist/types/internal/firstValueFrom.d.ts","./node_modules/rxjs/dist/types/internal/util/ArgumentOutOfRangeError.d.ts","./node_modules/rxjs/dist/types/internal/util/EmptyError.d.ts","./node_modules/rxjs/dist/types/internal/util/NotFoundError.d.ts","./node_modules/rxjs/dist/types/internal/util/ObjectUnsubscribedError.d.ts","./node_modules/rxjs/dist/types/internal/util/SequenceError.d.ts","./node_modules/rxjs/dist/types/internal/util/UnsubscriptionError.d.ts","./node_modules/rxjs/dist/types/internal/observable/bindCallback.d.ts","./node_modules/rxjs/dist/types/internal/observable/bindNodeCallback.d.ts","./node_modules/rxjs/dist/types/internal/AnyCatcher.d.ts","./node_modules/rxjs/dist/types/internal/observable/combineLatest.d.ts","./node_modules/rxjs/dist/types/internal/observable/concat.d.ts","./node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","./node_modules/rxjs/dist/types/internal/observable/defer.d.ts","./node_modules/rxjs/dist/types/internal/observable/empty.d.ts","./node_modules/rxjs/dist/types/internal/observable/forkJoin.d.ts","./node_modules/rxjs/dist/types/internal/observable/from.d.ts","./node_modules/rxjs/dist/types/internal/observable/fromEvent.d.ts","./node_modules/rxjs/dist/types/internal/observable/fromEventPattern.d.ts","./node_modules/rxjs/dist/types/internal/observable/generate.d.ts","./node_modules/rxjs/dist/types/internal/observable/iif.d.ts","./node_modules/rxjs/dist/types/internal/observable/interval.d.ts","./node_modules/rxjs/dist/types/internal/observable/merge.d.ts","./node_modules/rxjs/dist/types/internal/observable/never.d.ts","./node_modules/rxjs/dist/types/internal/observable/of.d.ts","./node_modules/rxjs/dist/types/internal/observable/onErrorResumeNext.d.ts","./node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","./node_modules/rxjs/dist/types/internal/observable/partition.d.ts","./node_modules/rxjs/dist/types/internal/observable/race.d.ts","./node_modules/rxjs/dist/types/internal/observable/range.d.ts","./node_modules/rxjs/dist/types/internal/observable/throwError.d.ts","./node_modules/rxjs/dist/types/internal/observable/timer.d.ts","./node_modules/rxjs/dist/types/internal/observable/using.d.ts","./node_modules/rxjs/dist/types/internal/observable/zip.d.ts","./node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","./node_modules/rxjs/dist/types/internal/config.d.ts","./node_modules/rxjs/dist/types/index.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/ws-exception-filter.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validation-error.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/execution-context.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/can-activate.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/custom-route-param-factory.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/nest-interceptor.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/paramtype.interface.d.ts","./node_modules/@nestjs/common/interfaces/type.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/pipe-transform.interface.d.ts","./node_modules/@nestjs/common/enums/request-method.enum.d.ts","./node_modules/@nestjs/common/enums/http-status.enum.d.ts","./node_modules/@nestjs/common/enums/shutdown-signal.enum.d.ts","./node_modules/@nestjs/common/enums/version-type.enum.d.ts","./node_modules/@nestjs/common/enums/index.d.ts","./node_modules/@nestjs/common/interfaces/version-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-configuration.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-consumer.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-config-proxy.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/nest-middleware.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/index.d.ts","./node_modules/@nestjs/common/interfaces/global-prefix-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/before-application-shutdown.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-application-bootstrap.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-application-shutdown.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-destroy.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-init.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/index.d.ts","./node_modules/@nestjs/common/interfaces/http/http-exception-body.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/http-redirect-response.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/cors-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/https-options.interface.d.ts","./node_modules/@nestjs/common/services/logger.service.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-context-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/http-server.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/message-event.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/raw-body-request.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/index.d.ts","./node_modules/@nestjs/common/interfaces/injectable.interface.d.ts","./node_modules/@nestjs/common/interfaces/microservices/nest-hybrid-application-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/forward-reference.interface.d.ts","./node_modules/@nestjs/common/interfaces/scope-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/injection-token.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/optional-factory-dependency.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/provider.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/module-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/dynamic-module.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/introspection-result.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/nest-module.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/index.d.ts","./node_modules/@nestjs/common/interfaces/shutdown-hooks-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-context.interface.d.ts","./node_modules/@nestjs/common/interfaces/websockets/web-socket-adapter.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-microservice.interface.d.ts","./node_modules/@nestjs/common/interfaces/index.d.ts","./node_modules/@nestjs/common/decorators/core/catch.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/controller.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/dependencies.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/exception-filters.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/inject.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/injectable.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/optional.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/set-metadata.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-guards.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-interceptors.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-pipes.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/apply-decorators.d.ts","./node_modules/@nestjs/common/decorators/core/version.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/index.d.ts","./node_modules/@nestjs/common/decorators/modules/global.decorator.d.ts","./node_modules/@nestjs/common/decorators/modules/module.decorator.d.ts","./node_modules/@nestjs/common/decorators/modules/index.d.ts","./node_modules/@nestjs/common/decorators/http/request-mapping.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/route-params.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/http-code.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/create-route-param-metadata.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/render.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/header.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/redirect.decorator.d.ts","./node_modules/@nestjs/common/constants.d.ts","./node_modules/@nestjs/common/decorators/http/sse.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/index.d.ts","./node_modules/@nestjs/common/decorators/index.d.ts","./node_modules/@nestjs/common/exceptions/intrinsic.exception.d.ts","./node_modules/@nestjs/common/exceptions/http.exception.d.ts","./node_modules/@nestjs/common/exceptions/bad-gateway.exception.d.ts","./node_modules/@nestjs/common/exceptions/bad-request.exception.d.ts","./node_modules/@nestjs/common/exceptions/conflict.exception.d.ts","./node_modules/@nestjs/common/exceptions/forbidden.exception.d.ts","./node_modules/@nestjs/common/exceptions/gateway-timeout.exception.d.ts","./node_modules/@nestjs/common/exceptions/gone.exception.d.ts","./node_modules/@nestjs/common/exceptions/http-version-not-supported.exception.d.ts","./node_modules/@nestjs/common/exceptions/im-a-teapot.exception.d.ts","./node_modules/@nestjs/common/exceptions/internal-server-error.exception.d.ts","./node_modules/@nestjs/common/exceptions/method-not-allowed.exception.d.ts","./node_modules/@nestjs/common/exceptions/misdirected.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-acceptable.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-found.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-implemented.exception.d.ts","./node_modules/@nestjs/common/exceptions/payload-too-large.exception.d.ts","./node_modules/@nestjs/common/exceptions/precondition-failed.exception.d.ts","./node_modules/@nestjs/common/exceptions/request-timeout.exception.d.ts","./node_modules/@nestjs/common/exceptions/service-unavailable.exception.d.ts","./node_modules/@nestjs/common/exceptions/unauthorized.exception.d.ts","./node_modules/@nestjs/common/exceptions/unprocessable-entity.exception.d.ts","./node_modules/@nestjs/common/exceptions/unsupported-media-type.exception.d.ts","./node_modules/@nestjs/common/exceptions/index.d.ts","./node_modules/@nestjs/common/services/console-logger.service.d.ts","./node_modules/@nestjs/common/services/utils/filter-log-levels.util.d.ts","./node_modules/@nestjs/common/services/index.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/streamable-options.interface.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/streamable-handler-response.interface.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/index.d.ts","./node_modules/@nestjs/common/file-stream/streamable-file.d.ts","./node_modules/@nestjs/common/file-stream/index.d.ts","./node_modules/@nestjs/common/module-utils/constants.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-async-options.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-cls.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-host.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/index.d.ts","./node_modules/@nestjs/common/module-utils/configurable-module.builder.d.ts","./node_modules/@nestjs/common/module-utils/index.d.ts","./node_modules/@nestjs/common/pipes/default-value.pipe.d.ts","./node_modules/@nestjs/common/pipes/file/interfaces/file.interface.d.ts","./node_modules/@nestjs/common/pipes/file/interfaces/index.d.ts","./node_modules/@nestjs/common/pipes/file/file-validator-context.interface.d.ts","./node_modules/@nestjs/common/pipes/file/file-validator.interface.d.ts","./node_modules/@nestjs/common/pipes/file/file-type.validator.d.ts","./node_modules/@nestjs/common/pipes/file/max-file-size.validator.d.ts","./node_modules/@nestjs/common/utils/http-error-by-code.util.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file-options.interface.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file.pipe.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file-pipe.builder.d.ts","./node_modules/@nestjs/common/pipes/file/index.d.ts","./node_modules/@nestjs/common/interfaces/external/class-transform-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/transformer-package.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validator-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validator-package.interface.d.ts","./node_modules/@nestjs/common/pipes/validation.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-array.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-bool.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-date.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-enum.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-float.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-int.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-uuid.pipe.d.ts","./node_modules/@nestjs/common/pipes/index.d.ts","./node_modules/@nestjs/common/serializer/class-serializer.interfaces.d.ts","./node_modules/@nestjs/common/serializer/class-serializer.interceptor.d.ts","./node_modules/@nestjs/common/serializer/decorators/serialize-options.decorator.d.ts","./node_modules/@nestjs/common/serializer/decorators/index.d.ts","./node_modules/@nestjs/common/serializer/index.d.ts","./node_modules/@nestjs/common/utils/forward-ref.util.d.ts","./node_modules/@nestjs/common/utils/index.d.ts","./node_modules/@nestjs/common/index.d.ts","./node_modules/@nestjs/config/dist/conditional.module.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-change-event.interface.d.ts","./node_modules/@nestjs/config/dist/types/config-object.type.d.ts","./node_modules/@nestjs/config/dist/types/config.type.d.ts","./node_modules/@nestjs/config/dist/types/no-infer.type.d.ts","./node_modules/@nestjs/config/dist/types/path-value.type.d.ts","./node_modules/@nestjs/config/dist/types/index.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-factory.interface.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/ts5.6/globals.typedarray.d.ts","./node_modules/@types/node/ts5.6/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/ts5.6/index.d.ts","./node_modules/dotenv-expand/lib/main.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-module-options.interface.d.ts","./node_modules/@nestjs/config/dist/interfaces/index.d.ts","./node_modules/@nestjs/config/dist/config.module.d.ts","./node_modules/@nestjs/config/dist/config.service.d.ts","./node_modules/@nestjs/config/dist/utils/register-as.util.d.ts","./node_modules/@nestjs/config/dist/utils/get-config-token.util.d.ts","./node_modules/@nestjs/config/dist/utils/index.d.ts","./node_modules/@nestjs/config/dist/index.d.ts","./node_modules/@nestjs/config/index.d.ts","./node_modules/@prisma/client/runtime/library.d.ts","./node_modules/.prisma/client/index.d.ts","./node_modules/.prisma/client/default.d.ts","./node_modules/@prisma/client/default.d.ts","./src/prisma/prisma.service.ts","./src/prisma/prisma.module.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/@nestjs/jwt/dist/interfaces/jwt-module-options.interface.d.ts","./node_modules/@nestjs/jwt/dist/interfaces/index.d.ts","./node_modules/@nestjs/jwt/dist/jwt.errors.d.ts","./node_modules/@nestjs/jwt/dist/jwt.module.d.ts","./node_modules/@nestjs/jwt/dist/jwt.service.d.ts","./node_modules/@nestjs/jwt/dist/index.d.ts","./node_modules/@nestjs/jwt/index.d.ts","./node_modules/@nestjs/passport/dist/abstract.strategy.d.ts","./node_modules/@nestjs/passport/dist/interfaces/auth-module.options.d.ts","./node_modules/@nestjs/passport/dist/interfaces/type.interface.d.ts","./node_modules/@nestjs/passport/dist/interfaces/index.d.ts","./node_modules/@nestjs/passport/dist/auth.guard.d.ts","./node_modules/@nestjs/passport/dist/passport.module.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/passport/index.d.ts","./node_modules/@nestjs/passport/dist/passport/passport.serializer.d.ts","./node_modules/@nestjs/passport/dist/passport/passport.strategy.d.ts","./node_modules/@nestjs/passport/dist/index.d.ts","./node_modules/@nestjs/passport/index.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-basic.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-bearer.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/open-api-spec.interface.d.ts","./node_modules/@nestjs/swagger/dist/types/swagger-enum.type.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-body.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-consumes.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-cookie.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-default-getter.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-exclude-endpoint.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-exclude-controller.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-extra-models.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-header.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-hide-property.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-link.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-oauth2.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-operation.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/enum-schema-attributes.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-param.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-produces.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/schema-object-metadata.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-property.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-query.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-response.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-security.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-use-tags.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/callback-object.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-callbacks.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-extension.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-schema.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/index.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-ui-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-custom-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-document-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/index.d.ts","./node_modules/@nestjs/swagger/dist/document-builder.d.ts","./node_modules/@nestjs/swagger/dist/swagger-module.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/deep-partial-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/intersection-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/omit-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/partial-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/pick-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/index.d.ts","./node_modules/@nestjs/swagger/dist/utils/get-schema-path.util.d.ts","./node_modules/@nestjs/swagger/dist/utils/generate-schema.util.d.ts","./node_modules/@nestjs/swagger/dist/utils/index.d.ts","./node_modules/@nestjs/swagger/dist/index.d.ts","./node_modules/bcryptjs/umd/types.d.ts","./node_modules/bcryptjs/umd/index.d.ts","./src/modules/auth/auth.service.ts","./node_modules/class-validator/types/validation/ValidationError.d.ts","./node_modules/class-validator/types/validation/ValidatorOptions.d.ts","./node_modules/class-validator/types/validation-schema/ValidationSchema.d.ts","./node_modules/class-validator/types/container.d.ts","./node_modules/class-validator/types/validation/ValidationArguments.d.ts","./node_modules/class-validator/types/decorator/ValidationOptions.d.ts","./node_modules/class-validator/types/decorator/common/Allow.d.ts","./node_modules/class-validator/types/decorator/common/IsDefined.d.ts","./node_modules/class-validator/types/decorator/common/IsOptional.d.ts","./node_modules/class-validator/types/decorator/common/Validate.d.ts","./node_modules/class-validator/types/validation/ValidatorConstraintInterface.d.ts","./node_modules/class-validator/types/decorator/common/ValidateBy.d.ts","./node_modules/class-validator/types/decorator/common/ValidateIf.d.ts","./node_modules/class-validator/types/decorator/common/ValidateNested.d.ts","./node_modules/class-validator/types/decorator/common/ValidatePromise.d.ts","./node_modules/class-validator/types/decorator/common/IsLatLong.d.ts","./node_modules/class-validator/types/decorator/common/IsLatitude.d.ts","./node_modules/class-validator/types/decorator/common/IsLongitude.d.ts","./node_modules/class-validator/types/decorator/common/Equals.d.ts","./node_modules/class-validator/types/decorator/common/NotEquals.d.ts","./node_modules/class-validator/types/decorator/common/IsEmpty.d.ts","./node_modules/class-validator/types/decorator/common/IsNotEmpty.d.ts","./node_modules/class-validator/types/decorator/common/IsIn.d.ts","./node_modules/class-validator/types/decorator/common/IsNotIn.d.ts","./node_modules/class-validator/types/decorator/number/IsDivisibleBy.d.ts","./node_modules/class-validator/types/decorator/number/IsPositive.d.ts","./node_modules/class-validator/types/decorator/number/IsNegative.d.ts","./node_modules/class-validator/types/decorator/number/Max.d.ts","./node_modules/class-validator/types/decorator/number/Min.d.ts","./node_modules/class-validator/types/decorator/date/MinDate.d.ts","./node_modules/class-validator/types/decorator/date/MaxDate.d.ts","./node_modules/class-validator/types/decorator/string/Contains.d.ts","./node_modules/class-validator/types/decorator/string/NotContains.d.ts","./node_modules/@types/validator/lib/isBoolean.d.ts","./node_modules/@types/validator/lib/isEmail.d.ts","./node_modules/@types/validator/lib/isFQDN.d.ts","./node_modules/@types/validator/lib/isIBAN.d.ts","./node_modules/@types/validator/lib/isISO31661Alpha2.d.ts","./node_modules/@types/validator/lib/isISO4217.d.ts","./node_modules/@types/validator/lib/isISO6391.d.ts","./node_modules/@types/validator/lib/isTaxID.d.ts","./node_modules/@types/validator/lib/isURL.d.ts","./node_modules/@types/validator/index.d.ts","./node_modules/class-validator/types/decorator/string/IsAlpha.d.ts","./node_modules/class-validator/types/decorator/string/IsAlphanumeric.d.ts","./node_modules/class-validator/types/decorator/string/IsDecimal.d.ts","./node_modules/class-validator/types/decorator/string/IsAscii.d.ts","./node_modules/class-validator/types/decorator/string/IsBase64.d.ts","./node_modules/class-validator/types/decorator/string/IsByteLength.d.ts","./node_modules/class-validator/types/decorator/string/IsCreditCard.d.ts","./node_modules/class-validator/types/decorator/string/IsCurrency.d.ts","./node_modules/class-validator/types/decorator/string/IsEmail.d.ts","./node_modules/class-validator/types/decorator/string/IsFQDN.d.ts","./node_modules/class-validator/types/decorator/string/IsFullWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsHalfWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsVariableWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsHexColor.d.ts","./node_modules/class-validator/types/decorator/string/IsHexadecimal.d.ts","./node_modules/class-validator/types/decorator/string/IsMacAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsIP.d.ts","./node_modules/class-validator/types/decorator/string/IsPort.d.ts","./node_modules/class-validator/types/decorator/string/IsISBN.d.ts","./node_modules/class-validator/types/decorator/string/IsISIN.d.ts","./node_modules/class-validator/types/decorator/string/IsISO8601.d.ts","./node_modules/class-validator/types/decorator/string/IsJSON.d.ts","./node_modules/class-validator/types/decorator/string/IsJWT.d.ts","./node_modules/class-validator/types/decorator/string/IsLowercase.d.ts","./node_modules/class-validator/types/decorator/string/IsMobilePhone.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Alpha2.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Alpha3.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Numeric.d.ts","./node_modules/class-validator/types/decorator/string/IsMongoId.d.ts","./node_modules/class-validator/types/decorator/string/IsMultibyte.d.ts","./node_modules/class-validator/types/decorator/string/IsSurrogatePair.d.ts","./node_modules/class-validator/types/decorator/string/IsUrl.d.ts","./node_modules/class-validator/types/decorator/string/IsUUID.d.ts","./node_modules/class-validator/types/decorator/string/IsFirebasePushId.d.ts","./node_modules/class-validator/types/decorator/string/IsUppercase.d.ts","./node_modules/class-validator/types/decorator/string/Length.d.ts","./node_modules/class-validator/types/decorator/string/MaxLength.d.ts","./node_modules/class-validator/types/decorator/string/MinLength.d.ts","./node_modules/class-validator/types/decorator/string/Matches.d.ts","./node_modules/libphonenumber-js/types.d.cts","./node_modules/libphonenumber-js/max/index.d.cts","./node_modules/class-validator/types/decorator/string/IsPhoneNumber.d.ts","./node_modules/class-validator/types/decorator/string/IsMilitaryTime.d.ts","./node_modules/class-validator/types/decorator/string/IsHash.d.ts","./node_modules/class-validator/types/decorator/string/IsISSN.d.ts","./node_modules/class-validator/types/decorator/string/IsDateString.d.ts","./node_modules/class-validator/types/decorator/string/IsBooleanString.d.ts","./node_modules/class-validator/types/decorator/string/IsNumberString.d.ts","./node_modules/class-validator/types/decorator/string/IsBase32.d.ts","./node_modules/class-validator/types/decorator/string/IsBIC.d.ts","./node_modules/class-validator/types/decorator/string/IsBtcAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsDataURI.d.ts","./node_modules/class-validator/types/decorator/string/IsEAN.d.ts","./node_modules/class-validator/types/decorator/string/IsEthereumAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsHSL.d.ts","./node_modules/class-validator/types/decorator/string/IsIBAN.d.ts","./node_modules/class-validator/types/decorator/string/IsIdentityCard.d.ts","./node_modules/class-validator/types/decorator/string/IsISRC.d.ts","./node_modules/class-validator/types/decorator/string/IsLocale.d.ts","./node_modules/class-validator/types/decorator/string/IsMagnetURI.d.ts","./node_modules/class-validator/types/decorator/string/IsMimeType.d.ts","./node_modules/class-validator/types/decorator/string/IsOctal.d.ts","./node_modules/class-validator/types/decorator/string/IsPassportNumber.d.ts","./node_modules/class-validator/types/decorator/string/IsPostalCode.d.ts","./node_modules/class-validator/types/decorator/string/IsRFC3339.d.ts","./node_modules/class-validator/types/decorator/string/IsRgbColor.d.ts","./node_modules/class-validator/types/decorator/string/IsSemVer.d.ts","./node_modules/class-validator/types/decorator/string/IsStrongPassword.d.ts","./node_modules/class-validator/types/decorator/string/IsTimeZone.d.ts","./node_modules/class-validator/types/decorator/string/IsBase58.d.ts","./node_modules/class-validator/types/decorator/string/is-tax-id.d.ts","./node_modules/class-validator/types/decorator/string/is-iso4217-currency-code.d.ts","./node_modules/class-validator/types/decorator/string/isISO6391.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsBoolean.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsDate.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsNumber.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsEnum.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsInt.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsString.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsArray.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsObject.d.ts","./node_modules/class-validator/types/decorator/array/ArrayContains.d.ts","./node_modules/class-validator/types/decorator/array/ArrayNotContains.d.ts","./node_modules/class-validator/types/decorator/array/ArrayNotEmpty.d.ts","./node_modules/class-validator/types/decorator/array/ArrayMinSize.d.ts","./node_modules/class-validator/types/decorator/array/ArrayMaxSize.d.ts","./node_modules/class-validator/types/decorator/array/ArrayUnique.d.ts","./node_modules/class-validator/types/decorator/object/IsNotEmptyObject.d.ts","./node_modules/class-validator/types/decorator/object/IsInstance.d.ts","./node_modules/class-validator/types/decorator/decorators.d.ts","./node_modules/class-validator/types/validation/ValidationTypes.d.ts","./node_modules/class-validator/types/validation/Validator.d.ts","./node_modules/class-validator/types/register-decorator.d.ts","./node_modules/class-validator/types/metadata/ValidationMetadataArgs.d.ts","./node_modules/class-validator/types/metadata/ValidationMetadata.d.ts","./node_modules/class-validator/types/metadata/ConstraintMetadata.d.ts","./node_modules/class-validator/types/metadata/MetadataStorage.d.ts","./node_modules/class-validator/types/index.d.ts","./src/modules/auth/dto/register.dto.ts","./src/modules/auth/auth.controller.ts","./node_modules/@types/passport-strategy/index.d.ts","./node_modules/@types/passport-jwt/index.d.ts","./src/modules/auth/jwt.strategy.ts","./src/modules/auth/auth.module.ts","./src/modules/users/users.service.ts","./src/modules/users/users.controller.ts","./src/modules/users/users.module.ts","./src/modules/courses/courses.service.ts","./src/modules/courses/courses.controller.ts","./src/modules/courses/courses.module.ts","./src/modules/contents/contents.service.ts","./src/modules/contents/contents.controller.ts","./src/modules/contents/contents.module.ts","./src/modules/prompts/prompts.service.ts","./src/modules/prompts/prompts.controller.ts","./src/modules/prompts/prompts.module.ts","./src/modules/tools/tools.service.ts","./src/modules/tools/tools.controller.ts","./src/modules/tools/tools.module.ts","./src/modules/ai/ai-gateway.service.ts","./src/modules/sandbox/sandbox.service.ts","./src/modules/sandbox/sandbox.controller.ts","./src/modules/sandbox/sandbox-share.controller.ts","./src/modules/ai/ai.module.ts","./src/modules/sandbox/sandbox.module.ts","./src/modules/payment/payment.service.ts","./src/modules/orders/orders.service.ts","./src/modules/orders/orders.controller.ts","./src/modules/payment/payment.controller.ts","./src/modules/payment/payment.module.ts","./src/modules/orders/orders.module.ts","./src/modules/admin/admin.service.ts","./src/modules/admin/admin.guard.ts","./src/modules/admin/ai-assistant.service.ts","./src/modules/admin/admin.controller.ts","./src/modules/admin/analytics.controller.ts","./src/modules/admin/settings.controller.ts","./src/modules/admin/operations.controller.ts","./src/modules/admin/users.controller.ts","./src/modules/admin/public.controller.ts","./src/modules/admin/admin.module.ts","./src/modules/categories/categories.controller.ts","./src/modules/categories/categories.module.ts","./src/modules/dashboard/dashboard.service.ts","./src/modules/dashboard/dashboard.controller.ts","./src/modules/dashboard/dashboard.module.ts","./src/modules/search/search.service.ts","./src/modules/search/search.controller.ts","./src/modules/search/search.module.ts","./src/modules/models/models.service.ts","./src/modules/models/models.controller.ts","./src/modules/models/models.module.ts","./node_modules/@nestjs/core/adapters/http-adapter.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-body-parser-options.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-body-parser.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/serve-static-options.interface.d.ts","./node_modules/@nestjs/platform-express/adapters/express-adapter.d.ts","./node_modules/@nestjs/platform-express/adapters/index.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-application.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/index.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/multer-options.interface.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/any-files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/file-fields.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/file.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/no-files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/index.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/files-upload-module.interface.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/index.d.ts","./node_modules/@nestjs/platform-express/multer/multer.module.d.ts","./node_modules/@nestjs/platform-express/multer/index.d.ts","./node_modules/@nestjs/platform-express/index.d.ts","./node_modules/@types/multer/index.d.ts","./src/modules/upload/upload.controller.ts","./src/modules/upload/upload.service.ts","./src/modules/upload/upload.module.ts","./src/modules/notifications/notification.service.ts","./src/modules/community/community.service.ts","./src/modules/community/community.controller.ts","./src/modules/community/circles.controller.ts","./src/modules/community/community.module.ts","./src/modules/enterprise/enterprise.service.ts","./src/modules/enterprise/enterprise.controller.ts","./src/modules/enterprise/enterprise.module.ts","./src/modules/notifications/notification.controller.ts","./src/modules/notifications/notification.module.ts","./src/modules/learning/learning.service.ts","./src/modules/learning/learning.controller.ts","./src/modules/learning/learning.module.ts","./src/modules/skills/skills.service.ts","./src/modules/skills/skills.controller.ts","./src/modules/skills/skills.module.ts","./src/app.module.ts","./node_modules/@nestjs/core/adapters/index.d.ts","./node_modules/@nestjs/core/inspector/interfaces/edge.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/entrypoint.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/extras.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/node.interface.d.ts","./node_modules/@nestjs/core/injector/settlement-signal.d.ts","./node_modules/@nestjs/core/injector/injector.d.ts","./node_modules/@nestjs/core/inspector/interfaces/serialized-graph-metadata.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/serialized-graph-json.interface.d.ts","./node_modules/@nestjs/core/inspector/serialized-graph.d.ts","./node_modules/@nestjs/core/injector/opaque-key-factory/interfaces/module-opaque-key-factory.interface.d.ts","./node_modules/@nestjs/core/injector/compiler.d.ts","./node_modules/@nestjs/core/injector/modules-container.d.ts","./node_modules/@nestjs/core/injector/container.d.ts","./node_modules/@nestjs/core/injector/instance-links-host.d.ts","./node_modules/@nestjs/core/injector/abstract-instance-resolver.d.ts","./node_modules/@nestjs/core/injector/module-ref.d.ts","./node_modules/@nestjs/core/injector/module.d.ts","./node_modules/@nestjs/core/injector/instance-wrapper.d.ts","./node_modules/@nestjs/core/router/interfaces/exclude-route-metadata.interface.d.ts","./node_modules/@nestjs/core/application-config.d.ts","./node_modules/@nestjs/core/constants.d.ts","./node_modules/@nestjs/core/discovery/discovery-module.d.ts","./node_modules/@nestjs/core/discovery/discovery-service.d.ts","./node_modules/@nestjs/core/discovery/index.d.ts","./node_modules/@nestjs/core/helpers/http-adapter-host.d.ts","./node_modules/@nestjs/core/exceptions/base-exception-filter.d.ts","./node_modules/@nestjs/core/exceptions/index.d.ts","./node_modules/@nestjs/core/helpers/context-id-factory.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts","./node_modules/@nestjs/core/exceptions/exceptions-handler.d.ts","./node_modules/@nestjs/core/router/router-proxy.d.ts","./node_modules/@nestjs/core/helpers/context-creator.d.ts","./node_modules/@nestjs/core/exceptions/base-exception-filter-context.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/index.d.ts","./node_modules/@nestjs/core/exceptions/external-exception-filter.d.ts","./node_modules/@nestjs/core/exceptions/external-exceptions-handler.d.ts","./node_modules/@nestjs/core/exceptions/external-exception-filter-context.d.ts","./node_modules/@nestjs/core/guards/constants.d.ts","./node_modules/@nestjs/core/helpers/execution-context-host.d.ts","./node_modules/@nestjs/core/guards/guards-consumer.d.ts","./node_modules/@nestjs/core/guards/guards-context-creator.d.ts","./node_modules/@nestjs/core/guards/index.d.ts","./node_modules/@nestjs/core/interceptors/interceptors-consumer.d.ts","./node_modules/@nestjs/core/interceptors/interceptors-context-creator.d.ts","./node_modules/@nestjs/core/interceptors/index.d.ts","./node_modules/@nestjs/common/enums/route-paramtypes.enum.d.ts","./node_modules/@nestjs/core/pipes/params-token-factory.d.ts","./node_modules/@nestjs/core/pipes/pipes-consumer.d.ts","./node_modules/@nestjs/core/pipes/pipes-context-creator.d.ts","./node_modules/@nestjs/core/pipes/index.d.ts","./node_modules/@nestjs/core/helpers/context-utils.d.ts","./node_modules/@nestjs/core/injector/inquirer/inquirer-constants.d.ts","./node_modules/@nestjs/core/injector/inquirer/index.d.ts","./node_modules/@nestjs/core/interfaces/module-definition.interface.d.ts","./node_modules/@nestjs/core/interfaces/module-override.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts","./node_modules/@nestjs/core/inspector/graph-inspector.d.ts","./node_modules/@nestjs/core/metadata-scanner.d.ts","./node_modules/@nestjs/core/scanner.d.ts","./node_modules/@nestjs/core/injector/instance-loader.d.ts","./node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader-options.interface.d.ts","./node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader.d.ts","./node_modules/@nestjs/core/injector/index.d.ts","./node_modules/@nestjs/core/helpers/interfaces/external-handler-metadata.interface.d.ts","./node_modules/@nestjs/core/helpers/interfaces/params-metadata.interface.d.ts","./node_modules/@nestjs/core/helpers/external-context-creator.d.ts","./node_modules/@nestjs/core/helpers/index.d.ts","./node_modules/@nestjs/core/inspector/initialize-on-preview.allowlist.d.ts","./node_modules/@nestjs/core/inspector/partial-graph.host.d.ts","./node_modules/@nestjs/core/inspector/index.d.ts","./node_modules/@nestjs/core/middleware/route-info-path-extractor.d.ts","./node_modules/@nestjs/core/middleware/routes-mapper.d.ts","./node_modules/@nestjs/core/middleware/builder.d.ts","./node_modules/@nestjs/core/middleware/index.d.ts","./node_modules/@nestjs/core/nest-application-context.d.ts","./node_modules/@nestjs/core/nest-application.d.ts","./node_modules/@nestjs/common/interfaces/microservices/nest-microservice-options.interface.d.ts","./node_modules/@nestjs/core/nest-factory.d.ts","./node_modules/@nestjs/core/repl/repl.d.ts","./node_modules/@nestjs/core/repl/index.d.ts","./node_modules/@nestjs/core/router/interfaces/routes.interface.d.ts","./node_modules/@nestjs/core/router/interfaces/index.d.ts","./node_modules/@nestjs/core/router/request/request-constants.d.ts","./node_modules/@nestjs/core/router/request/index.d.ts","./node_modules/@nestjs/core/router/router-module.d.ts","./node_modules/@nestjs/core/router/index.d.ts","./node_modules/@nestjs/core/services/reflector.service.d.ts","./node_modules/@nestjs/core/services/index.d.ts","./node_modules/@nestjs/core/index.d.ts","./node_modules/helmet/index.d.cts","./node_modules/@types/compression/index.d.ts","./src/common/filters/global-exception.filter.ts","./src/common/interceptors/logging.interceptor.ts","./src/common/index.ts","./src/main.ts","./node_modules/@nestjs/testing/interfaces/mock-factory.d.ts","./node_modules/@nestjs/testing/interfaces/override-by-factory-options.interface.d.ts","./node_modules/@nestjs/testing/interfaces/override-module.interface.d.ts","./node_modules/@nestjs/testing/testing-module.d.ts","./node_modules/@nestjs/testing/testing-module.builder.d.ts","./node_modules/@nestjs/testing/interfaces/override-by.interface.d.ts","./node_modules/@nestjs/testing/interfaces/index.d.ts","./node_modules/@nestjs/testing/test.d.ts","./node_modules/@nestjs/testing/index.d.ts","./src/modules/admin/tests/admin.service.spec.ts","./src/modules/ai/tests/ai-gateway.service.spec.ts","./src/modules/auth/tests/auth.service.spec.ts","./src/modules/community/tests/community.service.spec.ts","./src/modules/courses/tests/courses.service.spec.ts","./src/modules/enterprise/tests/enterprise.service.spec.ts","./src/modules/orders/subscriptions.controller.ts","./src/modules/orders/tests/orders.service.spec.ts","./src/modules/payment/tests/payment.service.spec.ts","./src/modules/prompts/tests/prompts.service.spec.ts","./src/modules/sandbox/tests/sandbox.service.spec.ts","./src/modules/search/tests/search.service.spec.ts","./src/modules/tools/tests/tools.service.spec.ts","./src/modules/users/tests/users.service.spec.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/bcryptjs/index.d.ts","./node_modules/@types/cookiejar/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/use-at-your-own-risk.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/chalk/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbols/symbols.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbols/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/any/any.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/any/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/async-iterator/async-iterator.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/async-iterator/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/readonly.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/readonly-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly-optional/readonly-optional.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly-optional/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor/constructor.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/literal/literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/literal/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/enum/enum.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/enum/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/function/function.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/function/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/computed/computed.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/computed/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/never/never.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/never/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect-evaluated.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union-evaluated.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/recursive/recursive.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/recursive/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unsafe/unsafe.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unsafe/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/ref/ref.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/ref/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/tuple/tuple.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/tuple/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/error/error.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/error/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/string/string.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/string/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/boolean/boolean.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/boolean/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/number/number.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/number/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/integer/integer.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/integer/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/bigint/bigint.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/bigint/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/parse.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/finite.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/generate.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/syntax.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/pattern.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/union.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-property-keys.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/iterator/iterator.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/iterator/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/promise/promise.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/promise/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/sets/set.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/sets/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/optional.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/optional-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/awaited/awaited.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/awaited/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-property-keys.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-property-entries.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/null/null.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/null/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbol/symbol.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbol/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/undefined/undefined.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/undefined/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/partial.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/partial-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/regexp/regexp.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/regexp/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/record/record.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/record/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/required.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/required-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/transform/transform.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/transform/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/compute.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/infer.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/module.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/not/not.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/not/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/static/static.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/static/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/object/object.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/object/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/helpers/helpers.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/helpers/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/array/array.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/array/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/date/date.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/date/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/uint8array/uint8array.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/uint8array/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unknown/unknown.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unknown/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/void/void.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/void/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/schema.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/anyschema.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/value.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/create/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/create/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/argument/argument.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/argument/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/kind.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/value.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/patterns/patterns.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/patterns/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/format.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/composite/composite.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/composite/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/const/const.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/const/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor-parameters/constructor-parameters.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor-parameters/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude-from-template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-check.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-undefined.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract-from-template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instance-type/instance-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instance-type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instantiate/instantiate.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instantiate/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/intrinsic-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/intrinsic.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/capitalize.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/lowercase.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/uncapitalize.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/uppercase.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/parameters/parameters.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/parameters/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/rest/rest.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/rest/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/return-type/return-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/return-type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/json.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/javascript.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/index.d.ts","./node_modules/@jest/schemas/build/index.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/jest-mock/build/index.d.ts","./node_modules/expect/build/index.d.ts","./node_modules/@types/jest/index.d.ts","./node_modules/@types/methods/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/superagent/lib/agent-base.d.ts","./node_modules/@types/superagent/lib/node/response.d.ts","./node_modules/@types/superagent/types.d.ts","./node_modules/@types/superagent/lib/node/agent.d.ts","./node_modules/@types/superagent/lib/request-base.d.ts","./node_modules/form-data/index.d.ts","./node_modules/@types/superagent/lib/node/http2wrapper.d.ts","./node_modules/@types/superagent/lib/node/index.d.ts","./node_modules/@types/superagent/index.d.ts","./node_modules/@types/supertest/types.d.ts","./node_modules/@types/supertest/lib/agent.d.ts","./node_modules/@types/supertest/lib/test.d.ts","./node_modules/@types/supertest/lib/cookies.d.ts","./node_modules/@types/supertest/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"51e547984877a62227042850456de71a5c45e7fe86b7c975c6e68896c86fa23b","affectsGlobalScope":true},{"version":"62a4966981264d1f04c44eb0f4b5bdc3d81c1a54725608861e44755aa24ad6a5","affectsGlobalScope":true},{"version":"4350e5922fecd4bedda2964d69c213a1436349d0b8d260dd902795f5b94dc74b","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"c1e8d979afc15d66e2bd5a58c732d5a2ba3ccaae41ac7d5a2c539e6de66a8e51",{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true},"6d8dedbec739bc79642c1e96e9bfc0b83b25b104a0486aebf016fc7b85b39f48","e89535c3ec439608bcd0f68af555d0e5ddf121c54abe69343549718bd7506b9c","622a984b60c294ffb2f9152cf1d4d12e91d2b733d820eec949cf54d63a3c1025","81aae92abdeaccd9c1723cef39232c90c1aed9d9cf199e6e2a523b7d8e058a11","a63a6c6806a1e519688ef7bd8ca57be912fc0764485119dbd923021eb4e79665","75b57b109d774acca1e151df21cf5cb54c7a1df33a273f0457b9aee4ebd36fb9","073ca26c96184db9941b5ec0ddea6981c9b816156d9095747809e524fdd90e35","e41d17a2ec23306d953cda34e573ed62954ca6ea9b8c8b74e013d07a6886ce47","241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","2ae3787e1498b20aad1b9c2ee9ea517ec30e89b70d242d8e3e52d1e091039695",{"version":"c7c72c4cffb1bc83617eefed71ed68cc89df73cab9e19507ccdecb3e72b4967e","affectsGlobalScope":true},"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","38b38db08e7121828294dec10957a7a9ff263e33e2a904b346516d4a4acca482","a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","8a2aaea564939c22be05d665cc955996721bad6d43148f8fa21ae8f64afecd37","e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","95950a187596e206d32d5d9c7b932901088c65ed8f9040e614aa8e321e0225ef","89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","0521108c9f8ddb17654a0a54dae6ba9667c99eddccfd6af5748113e022d1c37a","c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","ee764e6e9a7f2b987cc1a2c0a9afd7a8f4d5ebc4fdb66ad557a7f14a8c2bd320","0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","d7058e75920120b142a9d57be25562a3cd9a936269fd52908505f530105f2ec4","6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","a472a1d3f25ce13a1d44911cd3983956ac040ce2018e155435ea34afb25f864c","b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","93181bac0d90db185bb730c95214f6118ae997fe836a98a49664147fbcaf1988","8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","c54166a85bd60f86d1ebb90ce0117c0ecb850b8a33b366691629fdf26f1bbbd8","0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","80f23f1d60fbed356f726b3b26f9d348dddbb34027926d10d59fad961e70a730","cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","cc20bb2227dd5de0aab0c8d697d1572f8000550e62c7bf5c92f212f657dd88c5","06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","d0da80c845999a16c24d0783033fb5366ada98df17867c98ad433ede05cd87fd","bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","fd9a991b51870325e46ebb0e6e18722d313f60cd8e596e645ec5ac15b96dbf4e","c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","314e402cd481370d08f63051ae8b8c8e6370db5ee3b8820eeeaaf8d722a6dac6","9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","cefc20054d20b85b534206dbcedd509bb74f87f3d8bc45c58c7be3a76caa45e1","ad6eee4877d0f7e5244d34bc5026fd6e9cf8e66c5c79416b73f9f6ebf132f924","4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","f4749c102ced952aa6f40f0b579865429c4869f6d83df91000e98005476bee87","56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","05f56cd4b929977d18df8f3d08a4c929a2592ef5af083e79974b20a063f30940","547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","cb46b38d5e791acaa243bf342b8b5f8491639847463ac965b93896d4fb0af0d9","7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","ce60a562cd2a92f37a88f2ddd99a3abfbc5848d7baf38c48fb8d3243701fcb75","a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","b6e2b0448ced813b8c207810d96551a26e7d7bb73255eea4b9701698f78846d6","8ae10cd85c1bd94d2f2d17c4cbd25c068a4b2471c70c2d96434239f97040747a","9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","8776a368617ce51129b74db7d55c3373dadcce5d0701e61d106e99998922a239","5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","9108ab5af05418f599ab48186193b1b07034c79a4a212a7f73535903ba4ca249","bb4e2cdcadf9c9e6ee2820af23cee6582d47c9c9c13b0dca1baaffe01fbbcb5f","6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","02ae43d5bae42efcd5a00d3923e764895ce056bca005a9f4e623aa6b4797c8af","db6e01f17012a9d7b610ae764f94a1af850f5d98c9c826ad61747dca0fb800bd","8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","97f9169882d393e6f303f570168ca86b5fe9aab556e9a43672dae7e6bb8e6495","7c9adb3fcd7851497818120b7e151465406e711d6a596a71b807f3a17853cb58","6752d402f9282dd6f6317c8c048aaaac27295739a166eed27e00391b358fed9a","9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","84794e3abd045880e0fadcf062b648faf982aa80cfc56d28d80120e298178626","053d8b827286a16a669a36ffc8ccc8acdf8cc154c096610aa12348b8c493c7b8","3cce4ce031710970fe12d4f7834375f5fd455aa129af4c11eb787935923ff551","8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","40f06693e2e3e58526b713c937895c02e113552dc8ba81ecd49cdd9596567ddb","4ed5e1992aedb174fb8f5aa8796aa6d4dcb8bd819b4af1b162a222b680a37fa0","d7f4bd46a8b97232ea6f8c28012b8d2b995e55e729d11405f159d3e00c51420a","d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","e4f4f9cf1e3ac9fd91ada072e4d428ecbf0aa6dc57138fb797b8a0ca3a1d521c","12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","8018dd2e95e7ce6e613ddd81672a54532614dc745520a2f9e3860ff7fb1be0ca","b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","0e704ee6e9fd8b6a5a7167886f4d8915f4bc22ed79f19cb7b32bd28458f50643","06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","904a96f84b1bcee9a7f0f258d17f8692e6652a0390566515fe6741a5c6db8c1c","11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","45b74185005ed45bec3f07cac6e4d68eaf02ead9ff5a66721679fb28020e5e7c","0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","795a08ae4e193f345073b49f68826ab6a9b280400b440906e4ec5c237ae777e6","8153df63cf65122809db17128e5918f59d6bb43a371b5218f4430c4585f64085","a8150bc382dd12ce58e00764d2366e1d59a590288ee3123af8a4a2cb4ef7f9df","5adfaf2f9f33957264ad199a186456a4676b2724ed700fc313ff945d03372169","d5c41a741cd408c34cb91f84468f70e9bda3dfeabf33251a61039b3cdb8b22d8","a20c3e0fe86a1d8fc500a0e9afec9a872ad3ab5b746ceb3dd7118c6d2bff4328","cbaf4a4aa8a8c02aa681c5870d5c69127974de29b7e01df570edec391a417959","c7135e329a18b0e712378d5c7bc2faec6f5ab0e955ea0002250f9e232af8b3e4","340a45cd77b41d8a6deda248167fa23d3dc67ec798d411bd282f7b3d555b1695","fae330f86bc10db6841b310f32367aaa6f553036a3afc426e0389ddc5566cd74","2bee1efe53481e93bb8b31736caba17353e7bb6fc04520bd312f4e344afd92f9","357b67529139e293a0814cb5b980c3487717c6fbf7c30934d67bc42dad316871","99d99a765426accf8133737843fb024a154dc6545fc0ffbba968a7c0b848959d","c782c5fd5fa5491c827ecade05c3af3351201dd1c7e77e06711c8029b7a9ee4d","883d2104e448bb351c49dd9689a7e8117b480b614b2622732655cef03021bf6d","d9b00ee2eca9b149663fdba1c1956331841ae296ee03eaaff6c5becbc0ff1ea8","09a7e04beb0547c43270b327c067c85a4e2154372417390731dfe092c4350998","eee530aaa93e9ec362e3941ee8355e2d073c7b21d88c2af4713e3d701dab8fef","28d47319b97dbeee9130b78eae03b2061d46dedbf92b0d9de13ed7ab8399ccd0","6559a36671052ca93cab9a289279a6cef6f9d1a72c34c34546a8848274a9c66c","7a0e4cd92545ad03910fd019ae9838718643bd4dde39881c745f236914901dfa","c99ebd20316217e349004ee1a0bc74d32d041fb6864093f10f31984c737b8cad","6f622e7f054f5ab86258362ac0a64a2d6a27f1e88732d6f5f052f422e08a70e7","d62d2ef93ceeb41cf9dfab25989a1e5f9ca5160741aac7f1453c69a6c14c69be","1491e80d72873fc586605283f2d9056ee59b166333a769e64378240df130d1c9","c32c073d389cfaa3b3e562423e16c2e6d26b8edebbb7d73ccffff4aa66f2171d","eca72bf229eecadb63e758613c62fab13815879053539a22477d83a48a21cd73","633db46fd1765736409a4767bfc670861468dde60dbb9a501fba4c1b72f8644d","f379412f2c0dddd193ff66dcdd9d9cc169162e441d86804c98c84423f993aa8a","f2ee748883723aa9325e5d7f30fce424f6a786706e1b91a5a55237c78ee89c4a","eda4760e5d7b171132265e970b67c322bcfffacb84248f44def26ed160eb722e","142f5190d730259339be1433931c0eb31ae7c7806f4e325f8a470bd9221b6533","cbd19f594f0ee7beffeb37dc0367af3908815acf4ce46d86b0515478718cfed8","3cdb96f128133efd129c798ac11f959e59d278ae439f69983224774d79ed11db","8776e64e6165838ac152fa949456732755b0976d1867ae5534ce248f0ccd7f41","896bbc7402b3a403cda96813c8ea595470ff76d31f32869d053317c00ca2589a","5c4c5b49bbb01828402bb04af1d71673b18852c11b7e95bfd5cf4c3d80d352c8","7030df3d920343df00324df59dc93a959a33e0f4940af3fefef8c07b7ee329bf","a96bc00e0c356e29e620eaec24a56d6dd7f4e304feefcc99066a1141c6fe05a7","d12cc0e5b09943c4cd0848f787eb9d07bf78b60798e4588c50582db9d4decc70","7333ee6354964fd396297958e52e5bf62179aa2c88ca0a35c6d3a668293b7e0e","19c3760af3cbc9da99d5b7763b9e33aaf8d018bc2ed843287b7ff4343adf4634","9d1e38aeb76084848d2fcd39b458ec88246de028c0f3f448b304b15d764b23d2","d406da1eccf18cec56fd29730c24af69758fe3ff49c4f94335e797119cbc0554","4898c93890a136da9156c75acd1a80a941a961b3032a0cf14e1fa09a764448b7","f5d7a845e3e1c6c27351ea5f358073d0b0681537a2da6201fab254aa434121d3","3a47d4582ef0697cccf1f3d03b620002f03fb0ff098f630e284433c417d6c61b","d7c30f0abfe9e197e376b016086cf66b2ffb84015139963f37301ed0da9d3d0d","ff75bba0148f07775bcb54bf4823421ed4ebdb751b3bf79cc003bd22e49d7d73","d40d20ac633703a7333770bfd60360126fc3302d5392d237bbb76e8c529a4f95","35a9867207c488061fb4f6fe4715802fbc164b4400018d2fa0149ad02db9a61c","b5fd805b7c578ca6a42c42bbfa6fda95a85d9e332106d810bb18116dc13a45f8","3abd9ab4fb3a035c865e6a68cb9f4260515354d5ebebacd5c681aee52c046d1f","13e82862532619a727cff9a9ba78df7ca66e8a9b69e4cbd18e9809257b6bf7ba","601fe4e366b99181cd0244d96418cffeaaa987a7e310c6f0ed0f06ce63dfe3e9","c66a4f2b1362abc4aeee0870c697691618b423c8c6e75624a40ef14a06f787b7","8808b1c4f84f2e43da98757a959fe7282cb1795737e16534a97b7d4d33e84dfc","cd0565ace87a2d7802bf4c20ea23a997c54e598b9eb89f9c75e69478c1f7a0b4","738020d2c8fc9df92d5dee4b682d35a776eaedfe2166d12bc8f186e1ea57cc52","86dd7c5657a0b0bc6bee8002edcfd544458d3d3c60974555746eb9b2583dc35e","d97b96b6ecd4ee03f9f1170722c825ef778430a6a0d7aab03b8929012bf773cd","e84e9b89251a57da26a339e75f4014f52e8ef59b77c2ee1e0171cde18d17b3b8","272dbfe04cfa965d6fff63fdaba415c1b5a515b1881ae265148f8a84ddeb318f","2035fb009b5fafa9a4f4e3b3fdb06d9225b89f2cbbf17a5b62413bf72cea721a","eefafec7c059f07b885b79b327d381c9a560e82b439793de597441a4e68d774a","72636f59b635c378dc9ea5246b9b3517b1214e340e468e54cb80126353053b2e","ebb79f267a3bf2de5f8edc1995c5d31777b539935fab8b7d863e8efb06c8e9ea","ada033e6a4c7f4e147e6d76bb881069dc66750619f8cc2472d65beeec1100145","0c04cc14a807a5dc0e3752d18a3b2655a135fefbf76ddcdabd0c5df037530d41","605d29d619180fbec287d1701e8b1f51f2d16747ec308d20aba3e9a0dac43a0f","67c19848b442d77c767414084fc571ce118b08301c4ddff904889d318f3a3363","c704ff0e0cb86d1b791767a88af21dadfee259180720a14c12baee668d0eb8fb","195c50e15d5b3ea034e01fbdca6f8ad4b35ad47463805bb0360bdffd6fce3009","da665f00b6877ae4adb39cd548257f487a76e3d99e006a702a4f38b4b39431cb","083aebdd7c96aee90b71ec970f81c48984d9c8ab863e7d30084f048ddcc9d6af","1c3bde1951add95d54a05e6628a814f2f43bf9d49902729eaf718dc9eb9f4e02","d7a4309673b06223537bc9544b1a5fe9425628e1c8ab5605f3c5ebc27ecb8074","0be3da88f06100e2291681bbda2592816dd804004f0972296b20725138ebcddf","3eadfd083d40777b403f4f4eecfa40f93876f2a01779157cc114b2565a7afb51","cb6789ce3eba018d5a7996ccbf50e27541d850e9b4ee97fdcb3cbd8c5093691f","a3684ea9719122f9477902acd08cd363a6f3cff6d493df89d4dc12fa58204e27","ff3c48a17bf10dfbb62448152042e4a48a56c9972059997ab9e7ed03b191809b","bc3561e460de5a2c19123f618fc1d5a96a484d168884d00666997d847f502bf9","c0c46113b4cd5ec9e7cf56e6dbfb3930ef6cbba914c0883eeced396988ae8320","118ea3f4e7b9c12e92551be0766706f57a411b4f18a1b4762cfde3cd6d4f0a96","01acd7f315e2493395292d9a02841f3b0300e77ccf42f84f4f11460e7623107d","656d1ce5b8fbed896bb803d849d6157242261030967b821d01e72264774cab55","da66c1b41d833858fe61947432130d39649f0b53d992dfd7d00f0bbe57191ef4","835739c6dcf0a9a1533d1e95b7d7cf8e44ca1341652856b897f4573078b23a31","774a3bcc0700036313c57a079e2e1161a506836d736203aa0463efa7b11a7e54","96577e3f8e0f9ea07ddf748d72dc1908581ef2aafd4ae7418a4574c26027cf02","f55971cb3ede99c17443b03788fe27b259dcd0f890ac31badcb74e3ffb4bb371","0ef0c246f8f255a5d798727c40d6d2231d2b0ebda5b1ec75e80eadb02022c548","ea127752a5ec75f2ac6ef7f1440634e6ae5bc8d09e6f98b61a8fb600def6a861","862320e775649dcca8915f8886865e9c6d8affc1e70ed4b97199f3b70a843b47","561764374e9f37cb895263d5c8380885972d75d09d0db64c12e0cb10ba90ae3e","ee889da857c29fa7375ad500926748ef2e029a6645d7c080e57769923d15dfef","56984ba2d781bd742b6bc0fa34c10df2eae59b42ec8b1b731d297f1590fa4071","7521de5e64e2dd022be87fce69d956a52d4425286fbc5697ecfec386da896d7e","f50b072ec1f4839b54fd1269a4fa7b03efbc9c59940224c7939632c0f70a39c3","a5b7ec6f1ff3f1d19a2547f7e1a50ab1284e6b4755d260a481ea01ed2c7cec60","1747f9eebf5beb8cfc46cf0303e300950b7bff20cff60b9c46818caced3226e3","9d969f36abb62139a90345ee5d03f1c2479831bd84c8f843d87ec304cad96ead","e972b52218fd5919aec6cd0e5e2a5fb75f5d2234cf05597a9441837a382b2b29","d1e292b0837d0ef5ede4f52363c9d8e93f5d5234086adc796e11eae390305b36","0a9e10028a96865d0f25aeca9e3b1ff0691b9b662aa186d9d490728434cf8261","1aed740b674839c89f427f48737bad435ee5a39d80b5929f9dc9cc9ac10a7700","6e9e3690dc3a6e99a845482e33ee78915893f2d0d579a55b6a0e9b4c44193371","4e7a76cce3b537b6cdb1c4b97e29cb4048ee8e7d829cf3a85f4527e92eb573f2","7e7e30f804f94b72d23a606f1d281de404a510984085fea8cbbefc7bdcaf1a37","46f1fe93f199a419172d7480407d9572064b54712b69406efa97e0244008b24e","044e6aaa3f612833fb80e323c65e9d816c3148b397e93630663cda5c2d8f4de1","deaf8eb392c46ea2c88553d3cc38d46cfd5ee498238dbc466e3f5be63ae0f651","6a79b61f57699de0a381c8a13f4c4bcd120556bfab0b4576994b6917cb62948b","c5133d7bdec65f465df12f0b507fbc0d96c78bfa5a012b0eb322cf1ff654e733","7905c052681cbe9286797ec036942618e1e8d698dcc2e60f4fb7a0013d470442","89049878a456b5e0870bb50289ea8ece28a2abd0255301a261fa8ab6a3e9a07d","d0da4f4fd66f37c13deabc1a641edd629141c333ccf862733788bd27e89436ac","d4a4f10062a6d82ba60d3ffde9154ef24b1baf2ce28c6439f5bdfb97aa0d18fc","f13310c360ecffddb3858dcb33a7619665369d465f55e7386c31d45dfc3847bf","e7bde95a05a0564ee1450bc9a53797b0ac7944bf24d87d6f645baca3aa60df48","62e68ce120914431a7d34232d3eca643a7ddd67584387936a5202ae1c4dd9a1b","91d695bba902cc2eda7edc076cd17c5c9340f7bb254597deb6679e343effadbb","e1cb8168c7e0bd4857a66558fe7fe6c66d08432a0a943c51bacdac83773d5745","a464510505f31a356e9833963d89ce39f37a098715fc2863e533255af4410525","0612b149cabbc136cb25de9daf062659f306b67793edc5e39755c51c724e2949","2579b150b86b5f644d86a6d58f17e3b801772c78866c34d41f86f3fc9eb523fe","e4b3a3e1b21a194b29d35488ec880948fc2ef8e937288463ea2981ad62a7b106","0353e05b0d8475c10ddd88056e0483b191aa5cdea00a25e0505b96e023f1a2d9","6a312caabb43c284a4b0da60d5c24f285338096eb9e977af1faca38d32a34685","b6eda93163beb978dd0d3042b11c60373506400c94613c0b40d1c0a9a9f1020e","a8af4739274959d70f7da4bfdd64f71cfc08d825c2d5d3561bc7baed760b33ef","99193bafaa9ce112889698de25c4b8c80b1209bb7402189aea1c7ada708a8a54","70473538c6eb9494d53bf1539fe69df68d87c348743d8f7244dcb02ca3619484","c48932ab06a4e7531bdca7b0f739ace5fa273f9a1b9009bcd26902f8c0b851f0","df6c83e574308f6540c19e3409370482a7d8f448d56c65790b4ac0ab6f6fedd8","ebbe6765a836bfa7f03181bc433c8984ca29626270ca1e240c009851222cb8a7","20f630766b73752f9d74aab6f4367dba9664e8122ea2edcb00168e4f8b667627","468df9d24a6e2bc6b4351417e3b5b4c2ca08264d6d5045fe18eb42e7996e58b4","954523d1f4856180cbf79b35bd754e14d3b2aea06c7efd71b254c745976086e9","31a030f1225ab463dd0189a11706f0eb413429510a7490192a170114b2af8697","6f48f244cd4b5b7e9a0326c74f480b179432397580504726de7c3c65d6304b36","5520e6defac8e6cdced6dd28808fafe795cb2cd87407bb1012e13a2b061f50b7","c3451661fb058f4e15971bbed29061dd960d02d9f8db1038e08b90d294a05c68","1f21aefa51f03629582568f97c20ef138febe32391012828e2a0149c2c393f62","b18141cda681d82b2693aef045107a910b90a7409ecff0830e1283f0bb2a53e6","18eb53924f27af2a5e9734dce28cf5985df7b2828dade1239241e95b639e9bf1","a9f1c52f4e7c2a2c4988b5638bd3dbfe38e408b358d02dd2fb8c8920e877f088","a7e10a8ad6536dd0225029e46108b18cee0d3c15c2f6e49bd62798ad85bc57b6","8db1ed144dd2304b9bd6e41211e22bad5f4ab1d8006e6ac127b29599f4b36083","843a5e3737f2abbbbd43bf2014b70f1c69a80530814a27ae1f8be213ae9ec222","6fc1be224ad6b3f3ec11535820def2d21636a47205c2c9de32238ba1ac8d82e6","5a44788293f9165116c9c183be66cefef0dc5d718782a04847de53bf664f3cc1","afd653ae63ce07075b018ba5ce8f4e977b6055c81cc65998410b904b94003c0a","9172155acfeb17b9d75f65b84f36cb3eb0ff3cd763db3f0d1ad5f6d10d55662f","71807b208e5f15feffb3ff530bec5b46b1217af0d8cc96dde00d549353bcb864","1a6eca5c2bc446481046c01a54553c3ffb856f81607a074f9f0256c59dd0ab13","dff93e0997c4e64ff29e9f70cad172c0b438c4f58c119f17a51c94d48164475a","fd1ddf926b323dfa439be49c1d41bbe233fe5656975a11183aeb3bf2addfa3bb","6dda11db28da6bcc7ff09242cd1866bdddd0ae91e2db3bea03ba66112399641a","ea4cd1e72af1aa49cf208b9cb4caf542437beb7a7a5b522f50a5f1b7480362ed","903a7d68a222d94da11a5a89449fdd5dd75d83cd95af34c0242e10b85ec33a93","e7fe2e7ed5c3a7beff60361632be19a8943e53466b7dd69c34f89faf473206d7","b4896cee83379e159f83021e262223354db79e439092e485611163e2082224ff","5243e79a643e41d9653011d6c66e95048fc0478eb8593dc079b70877a2e3990e",{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true},"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a",{"version":"1456e80bd8a3870034d89f91bd7df12ac29acfb083e31c0bb1fb38ca7bf5fbc2","affectsGlobalScope":true},{"version":"a98aedd64ad81793f146d36d1611ed9ba61b8b49ff040f0d13a103ed626595d9","affectsGlobalScope":true},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true},"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107",{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true},"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f",{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true},"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c",{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true},"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a",{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true},"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45",{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true},"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","092c1137e31de289f3cc6a57fdccb3cca298d8a680d1e367d206d3318f1394a1","855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86",{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true},"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d",{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true},"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee",{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true},"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5",{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true},"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9",{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true},"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e",{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true},"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","0ea329e5eab6719ff83bcb97e8bd03f1faab4feb74704010783b881fc9d80f92","76e7352249c42b9d54fe1f9e1ebcef777da1cb2eb33038366af49469d433597b","88cb622dd0ec1ef860e5c27fa884e60d2eba5ae22c7907dff82c56a69bdd2c8a","eb234b3e285e8bc071bdddc1ec0460095e13ead6222d44b02c4e0869522f9ba3","c85114872760189e50fef131944427b0fb367f0cc0b6dce164bb427a6fd89381","5ad69b0d7e7bdbcd3adfdb6a3e306e935c9c2711b1c60493646504a2f991346e","a12a667efdeb03b529bd4ebb4032998ddd32743799f59f9f18b186f8e63a2cf1","cee7efa0ae4c58deab218d1df0d1bf84abfd5c356cff28bca1421489cba13a19","f9e034b1ae29825c00532e08ea852b0c72885c343ee48d2975db0a6481218ab3","1193f49cbb883f40326461fe379e58ffa4c18d15bf6d6a1974ad2894e4fb20f3","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","21247c958d397091ec30e63b27294baa1d1434c333da4fda697743190311dc62","fa380c9f488a5ca23fd80abc7049c47218bb9db53823d4a9d07d11afbda49d33","d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","092fb7b72bf76e2bd33dbe21228a3613df5c21383dfe961629672135c86c9508","9223a0889abb0669020e94a9b8c1e68274cdc05533c1f79d84fe516450e94ebd","fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","95da3c365e3d45709ad6e0b4daa5cdaf05e9076ba3c201e8f8081dd282c02f57","7245fa556a63e4c5997642422fe4250df16a56694cc1a1f50108dc80fe3018ba","7c14e702387296711c1a829bc95052ff02f533d4aa27d53cc0186c795094a3a9","4c72d080623b3dcd8ebd41f38f7ac7804475510449d074ca9044a1cbe95517ae","579f8828da42ae02db6915a0223d23b0da07157ff484fecdbf8a96fffa0fa4df","5f6beb8c43a52e9119cf31a7583ceca88dc910d7de29caad1f81e98497f808ba","3ae3b86c48ae3b092e5d5548acbf4416b427fed498730c227180b5b1a8aa86e3","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","ba63131c5e91f797736444933af16ffa42f9f8c150d859ec65f568f037a416ea","44372b8b42e8916b0ab379da38dcf4de11227bad4221aba3e2dbe718999bdfab","43ebfcc5a9e9a9306ea4de9fda3abdd9e018040e246434b48ad56d93b14d4a3d","0e9aa853b5eb2ca09e0e3e3eb94cbd1d5fb3d682ab69817d4d11fe225953fc57","179683df1e78572988152d598f44297da79ac302545770710bba87563ce53e06","793c353144f16601da994fa4e62c09b7525836ce999c44f69c28929072ca206a","d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","93a3b8e57c68e348fc4054b245bd7cf4893225f56c991028844b693c2fa8c03c","2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed",{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true},"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47",{"version":"ff155930718467b27e379e4a195e4607ce277f805cad9d2fa5f4fd5dec224df6","affectsGlobalScope":true},"599ac4a84b7aa6a298731179ec1663a623ff8ac324cdc1dabb9c73c1259dc854","95c2ab3597d7d38e990bf212231a6def6f6af7e3d12b3bb1b67c15fc8bfd4f4a","585bc61f439c027640754dd26e480afa202f33e51db41ee283311a59c12c62e7","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","6ecc423e71318bafbd230e6059e082c377170dfc7e02fccfa600586f8604d452","772f9bdd2bf50c9c01b0506001545e9b878faa7394ad6e7d90b49b179a024584","90ba1a0bd84ecbe63ee17e31afe021e24bc7f002ee66eb69579819ddd0a6d1b0","df251aa7a87b6d003a45ad1f71b87ff4448e535db473cb3c897720012b5553d2","20ccce97c422c215a41f0aa8373eb2b6f4068633ceef401c5f743cecdf8119bf","cd1ccdd9fd7980d43dfede5d42ee3d18064baed98b136089cf7c8221d562f058","d60f9a4fd1e734e7b79517f02622426ea1000deb7d6549dfdece043353691a4e","ec05ccc3a2e35ef2800a5b5ed2eb2ad4cd004955447bebd86883ddf49625b400","403d28b5e5f8fcff795ac038902033ec5890143e950af45bd91a3ed231e8b59c","c73b59f91088c00886d44ca296d53a75c263c3bda31e3b2f37ceb137382282be","e7aa2c584edb0970cb4bb01eb10344200286055f9a22bc3dadcc5a1f9199af3e","bfeb476eb0049185cb94c2bfcadb3ce1190554bbcf170d2bf7c68ed9bb00458e","ae23a65a2b664ffe979b0a2a98842e10bdf3af67a356f14bbc9d77eb3ab13585","2db00053dff66774bc4216209acf094dd70d9dfd8211e409fc4bd8d10f7f66f6","eccf6ad2a8624329653896e8dbd03f30756cbd902a81b5d3942d6cf0e1a21575","1930c964051c04b4b5475702613cd5a27fcc2d33057aa946ff52bfca990dbc84","762992adfa3fbf42c0bce86caed3dc185786855b21a20265089770485e6aa9d3","8a440978a6b5c6e6ea76a2804a90c06cadbefb96f6680785d8d3bfab8c8875d8","62463aa3d299ae0cdc5473d2ac32213a05753c3adce87a8801c6d2b114a64116","05a0d93bb8653bb3833c1c22e3fa5432c38885b2e545e99524e67e25e5ce355c","bd3e38cbf8108b661c591dcd03290d5cf2f2a8a1c74b045ba6b6bf4118b0a967","40abfc1faa2971acedb69bde8d8c4bbd4edce4af12f786e747dfb8298e6a05a1","02153ce9d452d116e9b7bfe42058c02c4cac09f49c46450820b4b44c83306a3e","f689c0633e8c95f550d36af943d775f3fae3dac81a28714b45c7af0bbb76a980","34be0f820d16a54625b86ab6d7b7928dbb819b58ddac181aa3836390c8c3df24","0495afa06118083a11cd4da27acfd96a01b989aff0fc633823c5febe9668ef15","67feb4436be89f58ba899dec57f6e703bee1bb7205ba21ab50fca237f6753787","75849f5ead7684bf85ee9cce7e84683ed4332fa187f8ee0978ba9df96c5cee06","b5325ff5c9dc488bb9c87711faf2b73f639c45f190b81df88ed056807206958b","cc4f5179acd0a8efad722a44c4621d0da29169e03d78a452a27f73e1e7f27985","a743cf98667fdbb6989d9a7629d25a9824a484ce639bbf2740dc809341e6dbce","d73a2cbf1893668c1fc0b41878a9df37bbb128cb05e292b845f68b7b88ef9957","1f64f5cd141571d53606fc5a7f8bb2b869b4cd40c964188e856bcfe5000a9037","eb89de249984a951578b5fa472d0414cd10cd7d35777aa1c7c308dfe2b0b49d6","a7af5e8b12f757ae7b9e79c95e8494cc1d6ccdb7b298c6766bb1f9dd82fa21cf","7b36f5bce24167f089e4d3601e5fde14f0a233e1a0954df5ec56ae07f36e2219","5e168f60c9132665853ccba13a29e4d311ac174c0fd3eda5cee7a6c5071802d6","1c225a18846203fafc4334658715b0d3fd3ee842c4cfd42e628a535eda17730d","7ce93da38595d1caf57452d57e0733474564c2b290459d34f6e9dcf66e2d8beb","d7b672c1c583e9e34ff6df2549d6a55d7ca3adaf72e6a05081ea9ee625dac59f","f3a2902e84ebdef6525ed6bf116387a1256ea9ae8eeb36c22f070b7c9ea4cf09","788e6ec863183b001b1e96d54f876c9d5436fa3aa19397093912dcdae466caf7","ae3e98448468e46474d817b5ebe74db11ab22c2feb60e292d96ce1a4ee963623","f5c67304429e2e2554f63526e842f47bd9ee0cb0f18becc963b93b2d3fafe9c2","8903c1df475f531bf787bc795c718e415ce9974536d8429619fdc456f5329948","7beb7f04f6186bdac5e622d44e4cac38d9f2b9fcad984b10d3762e369524dd77","07fcc9be98e12bd2f0f71a501a9bfbe2e53d38c50e8a5e84223fdd05bd8749c5","8c724ec27deda8f7ecdca0f22d9bb8c97a4507500ec645f49dea9c73184c2512","9154e3f91f77ebb31dff1b545f5a638053b7c98b5d4820f47a94cb6af6f374cd","cb5eaaa2a079305b1c5344af739b29c479746f7a7aefffc7175d23d8b7c8dbb0","bd324dccada40f2c94aaa1ebc82b11ce3927b7a2fe74a5ab92b431d495a86e6f","56749bf8b557c4c76181b2fd87e41bde2b67843303ae2eabb299623897d704d6","5a6fbec8c8e62c37e9685a91a6ef0f6ecaddb1ee90f7b2c2b71b454b40a0d9a6","e7435f2f56c50688250f3b6ef99d8f3a1443f4e3d65b4526dfb31dfd4ba532f8","51a674644ed5a181ec1497c1b4aa6f8cfcbe3af5481bdb641c1b5a498bcb6f3c","33b7f4106cf45ae7ccbb95acd551e9a5cd3c27f598d48216bda84213b8ae0c7e","176d6f604b228f727afb8e96fd6ff78c7ca38102e07acfb86a0034d8f8a2064a","1b1a02c54361b8c222392054648a2137fc5983ad5680134a653b1d9f655fe43d","8bcb884d06860a129dbffa3500d51116d9d1040bb3bf1c9762eb2f1e7fd5c85c","e55c0f31407e1e4eee10994001a4f570e1817897a707655f0bbe4d4a66920e9e","a37c2194c586faa8979f50a5c5ca165b0903d31ee62a9fe65e4494aa099712c0","6602339ddc9cd7e54261bda0e70fb356d9cdc10e3ec7feb5fa28982f8a4d9e34","7ffaa736b8a04b0b8af66092da536f71ef13a5ef0428c7711f32b94b68f7c8c8","7b4930d666bbe5d10a19fcc8f60cfa392d3ad3383b7f61e979881d2c251bc895","46342f04405a2be3fbfb5e38fe3411325769f14482b8cd48077f2d14b64abcfb","8fa675c4f44e6020328cf85fdf25419300f35d591b4f56f56e00f9d52b6fbb3b","ba98f23160cfa6b47ee8072b8f54201f21a1ee9addc2ef461ebadf559fe5c43a","45a4591b53459e21217dc9803367a651e5a1c30358a015f27de0b3e719db816b","9ef22bee37885193b9fae7f4cad9502542c12c7fe16afe61e826cdd822643d84","b0451895b894c102eed19d50bd5fcb3afd116097f77a7d83625624fafcca8939","bce17120b679ff4f1be70f5fe5c56044e07ed45f1e555db6486c6ded8e1da1c8","7590477bfa2e309e677ff7f31cb466f377fcd0e10a72950439c3203175309958","3f9ebd554335d2c4c4e7dc67af342d37dc8f2938afa64605d8a93236022cc8a5","1c077c9f6c0bc02a36207994a6e92a8fbf72d017c4567f640b52bf32984d2392","600b42323925b32902b17563654405968aa12ee39e665f83987b7759224cc317","32c8f85f6b4e145537dfe61b94ddd98b47dbdd1d37dc4b7042a8d969cd63a1aa","2426ed0e9982c3d734a6896b697adf5ae93d634b73eb15b48da8106634f6d911","057431f69d565fb44c246f9f64eac09cf309a9af7afb97e588ebef19cc33c779","960d026ca8bf27a8f7a3920ee50438b50ec913d635aa92542ca07558f9c59eca","71f5d895cc1a8a935c40c070d3d0fade53ae7e303fd76f443b8b541dee19a90c","252eb4750d0439d1674ad0dc30d2a2a3e4655e08ad9e58a7e236b21e78d1d540","e344b4a389bb2dfa98f144f3f195387a02b6bdb69deed4a96d16cc283c567778","c6cdcd12d577032b84eed1de4d2de2ae343463701a25961b202cff93989439fb","3dc633586d48fcd04a4f8acdbf7631b8e4a334632f252d5707e04b299069721e","3322858f01c0349ee7968a5ce93a1ca0c154c4692aa8f1721dc5192a9191a168","6dde0a77adad4173a49e6de4edd6ef70f5598cbebb5c80d76c111943854636ca","09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","f7b622759e094a3c2e19640e0cb233b21810d2762b3e894ef7f415334125eb22","99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","9f642953aba68babd23de41de85d4e97f0c39ef074cb8ab8aa7d55237f62aff6","159d95163a0ed369175ae7838fa21a9e9e703de5fdb0f978721293dd403d9f4a","2d2ec3235e01474f45a68f28cf826c2f5228b79f7d474d12ca3604cdcfdac80c","6dd249868034c0434e170ba6e0451d67a0c98e5a74fd57a7999174ee22a0fa7b","9716553c72caf4ff992be810e650707924ec6962f6812bd3fbdb9ac3544fd38f","506bc8f4d2d639bebb120e18d3752ddeee11321fd1070ad2ce05612753c628d6","053c51bbc32db54be396654ab5ecd03a66118d64102ac9e22e950059bc862a5e","1977f62a560f3b0fc824281fd027a97ce06c4b2d47b408f3a439c29f1e9f7e10","627570f2487bd8d899dd4f36ecb20fe0eb2f8c379eff297e24caba0c985a6c43","0f6e0b1a1deb1ab297103955c8cd3797d18f0f7f7d30048ae73ba7c9fb5a1d89","0a051f254f9a16cdde942571baab358018386830fed9bdfff42478e38ba641ce","17269f8dfc30c4846ab7d8b5d3c97ac76f50f33de96f996b9bf974d817ed025b","9e82194af3a7d314ccbc64bb94bfb62f4bfea047db3422a7f6c5caf2d06540a9","083d6f3547ccbf25dfa37b950c50bee6691ed5c42107f038cc324dbca1e173ae","952a9eab21103b79b7a6cca8ad970c3872883aa71273f540285cad360c35da40","8ba48776335db39e0329018c04486907069f3d7ee06ce8b1a6134b7d745271cc","e6d5809e52ed7ef1860d1c483e005d1f71bab36772ef0fd80d5df6db1da0e815","893e5cfbae9ed690b75b8b2118b140665e08d182ed8531e1363ec050905e6cb2","6ae7c7ada66314a0c3acfbf6f6edf379a12106d8d6a1a15bd35bd803908f2c31","e4b1e912737472765e6d2264b8721995f86a463a1225f5e2a27f783ecc013a7b","97146bbe9e6b1aab070510a45976faaf37724c747a42d08563aeae7ba0334b4f","c40d552bd2a4644b0617ec2f0f1c58618a25d098d2d4aa7c65fb446f3c305b54","09e64dea2925f3a0ef972d7c11e7fa75fec4c0824e9383db23eacf17b368532f","424ddba00938bb9ae68138f1d03c669f43556fc3e9448ed676866c864ca3f1d6","a0fe12181346c8404aab9d9a938360133b770a0c08b75a2fce967d77ca4b543f","3cc6eb7935ff45d7628b93bb6aaf1a32e8cb3b24287f9e75694b607484b377b3","ced02e78a2e10f89f4d70440d0a8de952a5946623519c54747bc84214d644bac","efd463021ccc91579ed8ae62584176baab2cd407c555c69214152480531a2072","29647c3b79320cfeecb5862e1f79220e059b26db2be52ea256df9cf9203fb401","c87c29ad2df837f7bc528688d96793758e0c4b1965f5ca520a8c287999565f66","e8cdefd2dc293cb4866ee8f04368e7001884650bb0f43357c4fe044cc2e1674f","582a3578ebba9238eb0c5d30b4d231356d3e8116fea497119920208fb48ccf85","185eae4a1e8a54e38f36cd6681cfa54c975a2fc3bc2ba6a39bf8163fac85188d","0c0a02625cf59a0c7be595ccc270904042bea523518299b754c705f76d2a6919","f2c999522aa544d93920205e05e11a5d43332f95ec35bd8a17025a823035bc56","cee72255e129896f0240ceb58c22e207b83d2cc81d8446190d1b4ef9b507ccd6","3b54670e11a8d3512f87e46645aa9c83ae93afead4a302299a192ac5458aa586","c2fc4d3a130e9dc0e40f7e7d192ef2494a39c37da88b5454c8adf143623e5979","2e693158fc1eedba3a5766e032d3620c0e9c8ad0418e4769be8a0f103fdb52cd","516275ccf3e66dc391533afd4d326c44dd750345b68bb573fc592e4e4b74545f","07c342622568693847f6cb898679402dd19740f815fd43bec996daf24a1e2b85","fa40d705f9813843d47f19321591499f14d1a18fa5e8ca9beaee5aac633c3d0d","a7a6330fb015f72d821e23004e63a3827e0c632b614ef3a310b3c81b66de61fd","89968316b7069339433bd42d53fe56df98b6990783dfe00c9513fb4bd01c2a1c","a4096686f982f6977433ee9759ecbef49da29d7e6a5d8278f0fbc7b9f70fce12","62e62a477c56cda719013606616dd856cfdc37c60448d0feb53654860d3113bb","207c107dd2bd23fa9febac2fe05c7c72cdac02c3f57003ab2e1c6794a6db0c05","55133e906c4ddabecdfcbc6a2efd4536a3ac47a8fa0a3fe6d0b918cac882e0d4","2147f8d114cf58c05106c3dccea9924d069c69508b5980ed4011d2b648af2ffe","2eb4012a758b9a7ba9121951d7c4b9f103fe2fc626f13bec3e29037bb9420dc6","fe61f001bd4bd0a374daa75a2ba6d1bb12c849060a607593a3d9a44e6b1df590","cfe8221c909ad721b3da6080570553dea2f0e729afbdbcf2c141252cf22f39b5","34e89249b6d840032b9acdec61d136877f84f2cd3e3980355b8a18f119809956","6f36ff8f8a898184277e7c6e3bf6126f91c7a8b6a841f5b5e6cb415cfc34820e","4b6378c9b1b3a2521316c96f5c777e32a1b14d05b034ccd223499e26de8a379c","07be5ae9bf5a51f3d98ffcfacf7de2fe4842a7e5016f741e9fad165bb929be93","cb1b37eda1afc730d2909a0f62cac4a256276d5e62fea36db1473981a5a65ab1","c873a6d6019f0b93889e54bf3dfb133120d5adba79c0a31d2400d1b5d0f2a2a2","471386a0a7e4eb88c260bdde4c627e634a772bf22f830c4ec1dad823154fd6f5","108314a60f3cb2454f2d889c1fb8b3826795399e5d92e87b2918f14d70c01e69","d75cc838286d6b1260f0968557cd5f28495d7341c02ac93989fb5096deddfb47","d531dc11bb3a8a577bd9ff83e12638098bfc9e0856b25852b91aac70b0887f2a","19968b998a2ab7dfd39de0c942fc738b2b610895843fec25477bc393687babd8","c0e6319f0839d76beed6e37b45ec4bb80b394d836db308ae9db4dea0fe8a9297","1a7b11be5c442dab3f4af9faf20402798fddf1d3c904f7b310f05d91423ba870","079d3f1ddcaf6c0ff28cfc7851b0ce79fcd694b3590afa6b8efa6d1656216924","2c817fa37b3d2aa72f01ce4d3f93413a7fbdecafe1b9fb7bd7baaa1bbd46eb08","682203aed293a0986cc2fccc6321d862742b48d7359118ac8f36b290d28920d2","7406d75a4761b34ce126f099eafe6643b929522e9696e5db5043f4e5c74a9e40","7e9c4e62351e3af1e5e49e88ebb1384467c9cd7a03c132a3b96842ccdc8045c4","ea1f9c60a912065c08e0876bd9500e8fa194738855effb4c7962f1bfb9b1da86","903f34c920e699dacbc483780b45d1f1edcb1ebf4b585a999ece78e403bb2db3","100ebfd0470433805c43be5ae377b7a15f56b5d7181c314c21789c4fe9789595","12533f60d36d03d3cf48d91dc0b1d585f530e4c9818a4d695f672f2901a74a86","57b555a83466fb289968a1713f965f1a2bb3a91cc34d1fa21af8ebdef7fc872a","21d9968dad7a7f021080167d874b718197a60535418e240389d0b651dd8110e7","2ef7349b243bce723d67901991d5ad0dfc534da994af61c7c172a99ff599e135","fa103f65225a4b42576ae02d17604b02330aea35b8aaf889a8423d38c18fa253","1b9173f64a1eaee88fa0c66ab4af8474e3c9741e0b0bd1d83bfca6f0574b6025","1b212f0159d984162b3e567678e377f522d7bee4d02ada1cc770549c51087170","46bd71615bdf9bfa8499b9cfce52da03507f7140c93866805d04155fa19caa1b","86cb49eb242fe19c5572f58624354ffb8743ff0f4522428ebcabc9d54a837c73","fc2fb9f11e930479d03430ee5b6588c3788695372b0ab42599f3ec7e78c0f6d5","bb1e5cf70d99c277c9f1fe7a216b527dd6bd2f26b307a8ab65d24248fb3319f5","817547eacf93922e22570ba411f23e9164544dead83e379c7ae9c1cfc700c2cf","a728478cb11ab09a46e664c0782610d7dd5c9db3f9a249f002c92918ca0308f7","9e91ef9c3e057d6d9df8bcbfbba0207e83ef9ab98aa302cf9223e81e32fdfe8d","66d30ef7f307f95b3f9c4f97e6c1a5e4c462703de03f2f81aca8a1a2f8739dbd","293ca178fd6c23ed33050052c6544c9d630f9d3b11d42c36aa86218472129243","90a4be0e17ba5824558c38c93894e7f480b3adf5edd1fe04877ab56c56111595","fadd55cddab059940934df39ce2689d37110cfe37cc6775f06b0e8decf3092d7","adb906b7794a71185220332532dcbdd09527e0dd3ce9f0b9be0a88c56bbb7e9e","b4f3b4e20e2193179481ab325b8bd0871b986e1e8a8ed2961ce020c2dba7c02d","41744c67366a0482db029a21f0df4b52cd6f1c85cbc426b981b83b378ccb6e65","c3f3cf7561dd31867635c22f3c47c8491af4cfa3758c53e822a136828fc24e5d","a88ddea30fae38aa071a43b43205312dc5ff86f9e21d85ba26b14690dc19d95e","34fc71db924616ba097a0cb6cddc2ece273a27673dd3b206abf3f3b5d63bcace","5515f17f45c6aafe6459afa3318bba040cb466a8d91617041566808a5fd77a44","4df1f0c17953b0450aa988c9930061f8861b114e1649e1a16cfd70c5cbdf8d83","441104b363d80fe57eb79a50d495e0b7e3ebeb45a5f0d1a4067d71ef75e8fbfa","b71a8e7225095bf384e6fbdcf57e5f9b1cad422a1d9e9dcecb9d308843c25357","373a3894ce2f1dbd09d7e5ece04a0e42fadfca54bedf908425ef8c2ffa4a3879","03c92769f389dbd9e45232f7eb01c3e0f482b62555aaf2029dcbf380d5cee9e4","32d7f70fd3498bc76a46dab8b03af4215f445f490f8e213c80cf06b636a4e413","f068b6120f50c6fb9b1265aa7fcf7db42fd319d70ec74e817f43bbab6b26444b","716cac1898b2400e5c4e6ff72fbb229fb707156758341d67b9d91cdcf0d4cbce","a8faa8307c428acfd5eb03ef93a424deec77bb6f1f6655a8c555974681025790","598ba440ad17f226e2368eb6b3ee89a539584ffde388d747b36fb6896d403e18","19ff6e335cf5a64247219c3b159f634ee882823897844d348f02572bddca48f1","2ba544a839882f0e14565e04e1f04d73111f247e492e3634bb76fa2b583d9dec","0b42b0fb024d75aa454e152d95c371c671e7b647ef06e7d8066f7d3e3a0a8d84","cfcceb0cd08e40d81b9b6fa48f3b03485c52e64c0bca7563a1e2a141f3335680","2a586ceea6461e3fe579ace3c1198502dafa24b648db03583c23d75e331cd18e","93809637ebccee0d3f7ff9e0a8b4ad188cde2a47e0dadba3914a0cecef6205f8","01df56952126e6350c48e758b98a50d8ed7ae695dd943b61b9a90b83350f3cc5","876d7782df737132458e5f616eead4bc71c3edd28a7d00d87e41c4f17f55301a","0484338c1d8d0dc5c5f7fc63c27736e428f37fb0577e99a303d9a89796ba863a","36d554dd3e0a2517fee7830b1ce325ca8e39517613c2fddeed9be385c5931cb9","8a3cbba6da2a5d58d0ffd45e0f365fc9170e10ca039f811dea74906861a3e315","d8cbf4090abe6cdb87ea5c9d35323e07f5cefbe5e5fc7b3f5c2dd77889593926","7445f9b9501b68a85eee2042e52887bd0a7a06939ea3d7ce498faf431d12fd0a",{"version":"f0016f3b5ef9e7ea68fb0f4ade5d3cce6aafb7cad3f3ac193707884bd0582d59","signature":"55004a0335256d88a2fe8720282f9a8f39157839d5553804e11f868add44902a"},{"version":"174684157eb73e5e12f68736070cfc27e013d8b5841f0c008c74d15862d7a853","signature":"2f2da0e0baf217d324480bb7cd6bdefc449278e79cc51b3a8103d3df673f1ed8"},{"version":"62ea13a8daea2571d95986c4572b2fea9728bc4914faea0193d40d69e0d90255","signature":"45bda081794eb85998712ebbbdbb5ed73c700e12f306a751d40911fa1b745a4f"},{"version":"04d1ca7b98548e4b19d6fee8d1fcbd7ef91839d965d9fc8ce0a66b1c79960d00","signature":"8226f2a0394eb27fe9b925074d4a79023edb5562078ba87015a4ab104b7bc2cf"},{"version":"9e9a8d554d919f79003cbf25df6bd970009825dbd1db97aeb539619a0ad61c21","signature":"26523ec62adebb8062362c1797ba66b96838534454ee81e85ae80bfe77432ddd"},{"version":"741471570b9d8ccf181ac3f483b19bcc41276248d6ea60ae721820e0d5997834","signature":"e0a7b9d2324fac96bea82803d9597210417bbc7b9f36c88f1f81462fb49b556e"},{"version":"b89d70e65134623d60b8663e21865626a910c54cd6745d975662b92581bbc347","signature":"b1127a8a1c4e3c7ba65ea8c23b68ca3d8c5689e74718628da1683799d8aa9d8e"},{"version":"84a0f05f65979c72c576db6a88e0579a550536b28683e63958020c69cb57fe2c","signature":"850e8b256bc11d8892bdca031939ea3a4ce366e8e77c871c4dcd09df4ceff174"},{"version":"9a787908f18851dc6b0278d69852021a0c14231c7a342fc994790a1bd7217a79","signature":"e3549fedd3bd4a700c34070961a0c45dd17e17cd11a670d4574cf430acfa66bd"},{"version":"72597827bfa455013e3c1fdf70e15eee34c3606eab92384cc8c12d83ce77cc83","signature":"62e47d105ca68f33e01fec4c226f0b9843fdf57262c006cdc27dc64e4b72326b"},{"version":"220918aceed5898dce7128ca6d8c18d59c38bac51f39ebcf8a0dfa5252ac50c6","signature":"a3684909b502d2414d94ce06228f5d6dae72b658eac3f386843965e540b51834"},{"version":"6e20d61e8ecdcdadc4023f7bd49ad9a17de64fbb890c4ac4f8c3ced3726e98a3","signature":"43449e87f23dae0d9f076eaa078da7ede19b302890d26195c9105aa587aeb9cc"},"83eff0429e51968c6483b1002b723404a3a01a52714cb4c55f4ddc510ae65193","e974a0d721dcecde2b3f2efa8d668932617753174f2ed1527492c58a663989a4",{"version":"6a5ca12b8ec2b288b67f63024a97a2386fa115b621dbe00bb4596c2e05bd0ace","signature":"2daa7cb01a0ca60f4523f40064707ac4eb2a84c679c46a3cee556392e4284b58"},{"version":"8de8dfa96ee221640757fa8b42fe3509090c10cdba982c59647ddd3aae075c81","signature":"23813d1d009a104ef491115df320d9362101d9992fc8e7e4e945e77101a5327c"},"a2cf6bf3849dcadca8d828c5852dd502ecb7bda1f39f373d513fa7da4553c17f",{"version":"d0c769a07d8c043377e092621d36a1cae33a794c19f9c93fb786ff5677113cc7","signature":"2590cfaa0eb2e19e4c60f0026506fabc38bd50fbb4fb81d4a594b4df45627020"},{"version":"9a8ec8c1e667ecd497a9545b7d87a822b804de9d2d99c95c57aed71b8b908a0d","signature":"631b8f21adb1e305dbcfd404ab662b353f3af6594ddeed316a5106dbefefee21"},"37e968d1c2fc3234694c8e7f79eb69d7dd8ddda35a61d400475b06fad7f3b283",{"version":"96f0c8496d1a25075eedc1d1c037d2e188ba47bc4f6eb3ef19d38dffce3d7460","signature":"65b71509ffd05da807f6d144ce01ea408fc5cb68a082cec66ce1e58e456cdd4a"},{"version":"8695d951cdfe441b1c4bdeb784ebce7f1c70986a381a7982b0c3545e5181d531","signature":"4cb17d629e7bb0df751ae3e10d78a23d59ea51fc7c02044f9a003ba6f36fedf7"},"590278334523ef558e1256702b64ac5c5e0641d89181433e7dbf97991025056b","c96d0eb50e04702732ced0d112976a71d0874f710628b2ea0450fde0eaec416d","c37536154cf62004aab9a9a790bc4c2aa855932af0c175385c3010c777427318","e36258c0478620ffcd623950d4217e98c973364aeff7a63c7399c714153c3189","182f86e4530584050ce2c75c65dd78f29f2d5c4c3b25cd2a9be92747f56618ec","502c34e73941baffb2780d775d2d6b1bc4a0ff2617a1f1362fe4a458896464cb","d863b98f05ed108b1d586a4578eee308266bbf93bed28bbb2a0608f022bbac31","345a160f257cd8075b05122331802807894a214bf560e157f661aa8ee3294bca","b25872fcb184cc3466a30b08641b0e7b04987279258442e1325419dd8966a78e","59e9b56c3814da833c989a8d95f508956b11e8bf57b2c077c3de73df5d000feb","5217205a344d52eb8a5f5c322d9d732a00de7303d4c1ad48ab1568813279b333","04de5584b953b03611eeef01ba9948607def8f64f1e7fbc840752b13b4521b52","25e5c8b73c6ad21f39e8e72f954090f30b431a993252bccea5bdad4a3d93c760","5bf595f68b7c1d46ae8385e3363c6e0d4695b6da58a84c6340489fc07ffc73f8","b87682ddc9e2c3714ca66991cdd86ff7e18cae6fd010742a93bd612a07d19697","6fd2c680287dd441936fbf38e1b191e126492589b701ea01066a70c434b9ff88","86bf2bfe29d0bc3fbc68e64c25ea6eab9bcb3c518ae941012ed75b1e87d391ae","3c74d80d1dd95437cc9bbf22d88199e7410fd85af06171327125bcf4025deae8","00b4f8b82e78f658b7e269c95d07e55d391235ce34d432764687441177ae7f64","57880096566780d72e02a5b34d8577e78cdf072bfd624452a95d65bd8f07cbe0","10ac50eaf9eb62c048efe576592b14830a757f7ea7ed28ee8deafc19c9845297","e75af112e5487476f7c427945fbd76ca46b28285586ad349a25731d196222d56","e91adad3da69c366d57067fcf234030b8a05bcf98c25a759a7a5cd22398ac201","d7d6e1974124a2dad1a1b816ba2436a95f44feeda0573d6c9fb355f590cf9086","464413fcd7e7a3e1d3f2676dc5ef4ebe211c10e3107e126d4516d79439e4e808","18f912e4672327b3dd17d70e91da6fcd79d497ba01dde9053a23e7691f56908c","2974e2f06de97e1d6e61d1462b54d7da2c03b3e8458ee4b3dc36273bc6dda990","d8c1697db4bb3234ff3f8481545284992f1516bc712421b81ee3ef3f226ae112","59b6cce93747f7eb2c0405d9f32b77874e059d9881ec8f1b65ff6c068fcce6f2","e2c3c3ca3818d610599392a9431e60ec021c5d59262ecd616538484990f6e331","e3cd60be3c4f95c43420be67eaa21637585b7c1a8129f9b39983bbd294f9513c",{"version":"95f26e134cf46f4c2aec8c70a79dcbc00c5811bdc9734bd3f3535fa63f8448c3","affectsGlobalScope":true},"b5cecde79abfbc12a401f52dc970534379853c6143b0185732bf2afabc953226","3e4562626dc4a4e09d0b5fbdd16083f89e88bd8a7a4b9e9cb964dc8231c33746","bdc82c029046f9bdf950eb160a7eb7c6cca5544acb10e31483bceb9a0de09e68","a1a16d15c55a27fe042b61b42ae2d7c4dd036540e4f84d939d21c1053ddeaea4","06156ce3bf5dff17db589dd05ceeb20efa44f44706c93155589519efdf164c67","39f467a122ae4aae0448ccee0cb92ba5b8666ec153e89cefc340ca8a5868a8e8","8237014552816cab5bba9c9748ca6121cde336be5c163a7fce9ac024f3a60658","ff3950ee52fc51775ca9fd8f758ed67d1d527f067b801fe9f53089b075b555a4","bff8fa1b781caa592b3ced4365b47be1fe7ca870525f41a6587a5c4b133bed34","c38c3ddbf9e00e2ed424a5d1672d640ba399c5ab0693ad461291db8b19c61e00","fadfd5b74a2426655ce637d122b447c996f0855534eb3fa6b5ea6f49175e86d9","561a2ef6a9a91d9ccc4e33cb3a0fc7791be650886294e919c68dbafa37da37f2","b0a6bd387dac3ff1d394916696fbb80a875abfd2017d102a8f6aa3e836687b44","096584ee9cb27de81a93c104539890a97f6840a5445e14a391d0aff65a5f09a7","f44a399fbd677f4362e25e5f100d21d1af024dffd6e8c8e682a86fd5fb087c34","51e13f0d52ce09190f29f1e2632e217764df74a0122385cf4afc47018d9c6bbe","44ba669ff1636cdce44cb3af4905fc199da74ae82a758e7591f8099c0c72f073","1662b3fe927cffed10797b7b3ec993f20d38715ec0f43409e3700087df7808b9","31be0928db408483b3347e30857ba42ac8572982df10466b6ebc67cfadaaef50","4c646cc91a5748de3907114edd83c59477063e46eac5a041c4c296896ca83c3e","8b0b6a4c032a56d5651f7dd02ba3f05fbfe4131c4095093633cda3cae0991972","192a0c215bffe5e4ac7b9ff1e90e94bf4dfdad4f0f69a5ae07fccc36435ebb87","3ef8565e3d254583cced37534f161c31e3a8f341ff005c98b582c6d8c9274538","d7e42a3800e287d2a1af8479c7dd58c8663e80a01686cb89e0068be6c777d687","1098034333d3eb3c1d974435cacba9bd5a625711453412b3a514774fec7ca748","f2388b97b898a93d5a864e85627e3af8638695ebfa6d732ecd39d382824f0e63","73a3180fe69bf6e8d61f8fbbf969a3e4c9d19e1b3570768a281d371f85aa2dec","f477375e6f0bf2a638a71d4e7a3da8885e3a03f3e5350688541d136b10b762a6","a44d6ea4dc70c3d789e9cef3cc42b79c78d17d3ce07f5fd278a7e1cbe824da56","55cd8cbc22fe648429a787e16a9cd2dc501a2aafd28c00254ad120ef68a581c0","ba4900e9d6f9795a72e8f5ca13c18861821a3fc3ae7858acb0a3366091a47afb","7778e2cc5f74ef263a880159aa7fa67254d6232e94dd03429a75597a622537a7","8e06a1ef49502a62039eeb927a1bd7561b0bce48bd423a929e2e478fd827c273","7ec3d0b061da85d6ff50c337e3248a02a72088462739d88f33b9337dba488c4f","2f554c6798b731fc39ff4e3d86aadc932fdeaa063e3cbab025623ff5653c0031","fe4613c6c0d23edc04cd8585bdd86bc7337dc6265fb52037d11ca19eeb5e5aaf","53b26fbee1a21a6403cf4625d0e501a966b9ccf735754b854366cee8984b711c","9ff247206ec5dffdfadddfded2c9d9ad5f714821bb56760be40ed89121f192f4","98c6ddd06251098b3302e7094cbc9ab54a2ea88069f5416b7d0b8daee2ff8aa2","8c59d8256086ed17676139ee43c1155673e357ab956fb9d00711a7cac73e059d","cfe88132f67aa055a3f49d59b01585fa8d890f5a66a0a13bb71973d57573eee7","53ce488a97f0b50686ade64252f60a1e491591dd7324f017b86d78239bd232ca","50fd11b764194f06977c162c37e5a70bcf0d3579bf82dd4de4eee3ac68d0f82f","e0ceb647dcdf6b27fd37e8b0406c7eafb8adfc99414837f3c9bfd28ffed6150a","99579aa074ed298e7a3d6a47e68f0cd099e92411212d5081ce88344a5b1b528d","096e4ddaa8f0aa8b0ceadd6ab13c3fab53e8a0280678c405160341332eca3cd7","415b55892d813a74be51742edd777bbced1f1417848627bf71725171b5325133","942ab34f62ac3f3d20014615b6442b6dc51815e30a878ebc390dd70e0dec63bf","7a671bf8b4ad81b8b8aea76213ca31b8a5de4ba39490fbdee249fc5ba974a622","8e07f13fb0f67e12863b096734f004e14c5ebfd34a524ed4c863c80354c25a44","9faa56e38ed5637228530065a9bab19a4dc5a326fbdd1c99e73a310cfed4fcde","7d4ad85174f559d8e6ed28a5459aebfc0a7b0872f7775ca147c551e7765e3285","d422f0c340060a53cb56d0db24dd170e31e236a808130ab106f7ab2c846f1cdb","424403ef35c4c97a7f00ea85f4a5e2f088659c731e75dbe0c546137cb64ef8d8","16900e9a60518461d7889be8efeca3fe2cbcd3f6ce6dee70fea81dfbf8990a76","6daf17b3bd9499bd0cc1733ab227267d48cd0145ed9967c983ccb8f52eb72d6e","e4177e6220d0fef2500432c723dbd2eb9a27dcb491344e6b342be58cc1379ec0","ddc62031f48165334486ad1943a1e4ed40c15c94335697cb1e1fd19a182e3102","b3f4224eb155d7d13eb377ef40baa1f158f4637aa6de6297dfeeacefd6247476","4a168e11fe0f46918721d2f6fcdb676333395736371db1c113ae30b6fde9ccd2","5b0a75a5cced0bed0d733bde2da0bbb5d8c8c83d3073444ae52df5f16aefb6ab","ef2c1585cad462bdf65f2640e7bcd75cd0dbc45bae297e75072e11fe3db017fa","ef809928a4085de826f5b0c84175a56d32dd353856f5b9866d78b8419f8ea9bc","6f6eadb32844b0ec7b322293b011316486894f110443197c4c9fbcba01b3b2fa","a51e08f41e3e948c287268a275bfe652856a10f68ddd2bf3e3aaf5b8cdb9ef85","862f7d760ef37f0ae2c17de82e5fbf336b37d5c1b0dcf39dcd5468f90a7fdd54","af48a76b75041e2b3e7bd8eed786c07f39ea896bb2ff165e27e18208d09b8bee","cb524ec077f3963e13e85747c6b53fbdf6bf407c84ca1873c6e43da1e96bee6d","deb092bc337b2cb0a1b14f3d43f56bc663e1447694e6d479d6df8296bdd452d6","041bc1c3620322cb6152183857601707ef6626e9d99f736e8780533689fb1bf9","22bd7c75de7d68e075975bf1123de5bccecfd06688afff2e2022b4c70bfc91c3","128e7c2ffd37aa29e05367400d718b0e4770cefb1e658d8783ec80a16bc0643a","076ac4f2d642c473fa7f01c8c1b7b4ef58f921130174d9cf78430651f44c43ec","396c1e5a39706999ec8cc582916e05fcb4f901631d2c192c1292e95089a494d9","89df75d28f34fc698fe261f9489125b4e5828fbd62d863bbe93373d3ed995056","8ccf5843249a042f4553a308816fe8a03aa423e55544637757d0cfa338bb5186","93b44aa4a7b27ba57d9e2bad6fb7943956de85c5cc330d2c3e30cd25b4583d44","a0c6216075f54cafdfa90412596b165ff85e2cadd319c49557cc8410f487b77c","3c359d811ec0097cba00fb2afd844b125a2ddf4cad88afaf864e88c8d3d358bd","3c0b38e8bf11bf3ab87b5116ae8e7b2cad0147b1c80f2b77989dea6f0b93e024","8df06e1cd5bb3bf31529cc0db74fa2e57f7de1f6042726679eb8bc1f57083a99","d62f09256941e92a95b78ae2267e4cf5ff2ca8915d62b9561b1bc85af1baf428","e6223b7263dd7a49f4691bf8df2b1e69f764fb46972937e6f9b28538d050b1ba","d9b59eb4e79a0f7a144ee837afb3f1afbc4dab031e49666067a2b5be94b36bd4","1db014db736a09668e0c0576585174dbcfd6471bb5e2d79f151a241e0d18d66b","8a153d30edde9cefd102e5523b5a9673c298fc7cf7af5173ae946cbb8dd48f11","abaaf8d606990f505ee5f76d0b45a44df60886a7d470820fcfb2c06eafa99659","51a66bfa412057e786a712733107547ceb6f539061f5bf1c6e5a96e4ccf4f83c","d92a80c2c05cf974704088f9da904fe5eadc0b3ad49ddd1ef70ca8028b5adda1","fbd7450f20b4486c54f8a90486c395b14f76da66ba30a7d83590e199848f0660","ece5b0e45c865645ab65880854899a5422a0b76ada7baa49300c76d38a530ee1","62d89ac385aeab821e2d55b4f9a23a277d44f33c67fefe4859c17b80fdb397ea","f4dee11887c5564886026263c6ee65c0babc971b2b8848d85c35927af25da827","fb8dd49a4cd6d802be4554fbab193bb06e2035905779777f32326cb57cf6a2c2","e403ecdfba83013b5eb0e648a92ce182bff2a45ccb81db3035a69081563c2830","82d3e00d56a71fc169f3cf9ec5f5ffcc92f6c0e67d4dfc130dafe9f1886d5515","b8d57effce2d49a5493debbd8c644e8d52fbe66e2c6d451371375ef5f7bccb8e","9963d9857df2df335d1232a12eccbe5c777537a244f4b39406b27bf4736202f6","1b33478647aa1b771314745807397002a410c746480e9447db959110999873ce","a14e7c48debe27b25ddf7932e6976c4f58123e32be8384c3f91b0a4d9f67c2f0","7e6a96b383da9f5acb848bb9dedb9ac8489df7cec46bbf26aeaed2610f709078","9fac6ebf3c60ced53dd21def30a679ec225fc3ff4b8d66b86326c285a4eebb5a","8cb83cb98c460cd716d2a98b64eb1a07a3a65c7362436550e02f5c2d212871d1","07bc8a3551e39e70c38e7293b1a09916867d728043e352b119f951742cb91624","e47adc2176f43c617c0ab47f2d9b2bb1706d9e0669bf349a30c3fe09ddd63261","7fec79dfd7319fec7456b1b53134edb54c411ba493a0aef350eee75a4f223eeb","189c489705bb96a308dcde9b3336011d08bfbca568bcaf5d5d55c05468e9de7a","98f4b1074567341764b580bf14c5aabe82a4390d11553780814f7e932970a6f7","1dd24cbf39199100fbe2f3dbd1c7203c240c41d95f66301ecc7650ae77875be1","2e252235037a2cd8feebfbf74aa460f783e5d423895d13f29a934d7655a1f8be","3bd10a31e9066676e0af937c2ef2507451281861ae294d04c7c46e46706140d9","53477a1815e915b8c20222a2ac8f9e3de880a1e8c8dbf9dae529b3d2e2b4a53b",{"version":"dbd0794f86b0f3e7c2c28bbe6cbf91adc6ef2203c6a832548ef199816d47039c","affectsGlobalScope":true},"16a216abd2e98172a804e7b124e88e23c63fe12896ff6f72af752d44d11266b5","bcb2fb2a8e8f3ee0ae80924969a947d07b0af89e16a12ef47c10df0e0e33aaf8","8243c4c93b6c4d64f086fa2a8fa180cd592380178dda3296274753ad26218d60","2b0cc039816ca5dc54f124333a4645857cecede6b9d8312e5dcd9f3ff74991ee","6990f2fb809692c89ecee29660a7680543246d0aee7bfc6756a1047a9918cc29","b84b0deafa5845fd2f21e49945eec5642fc74616f4b324e32e1f5bdf84a0eb54","884cd5093164bd0d95afa8854b426df08997a085668f123992ec1bb8eb2accc1","fc892a9c766a171ee80ae5f90cdb1276a509a10bb8a9cc4ade22a637cd849eab","e2f0a4be4ff986b254035536cd7a0326c3998807c107314c484461d286be116c","052bfda778ba1d93404739c42f8c8be8c8f35bb4df1f05740542de9c8786000e","db114ef2aba1c12605774caca9a12f389e23a084f007662129450c669da9e981","6061e156608df22580cdfe4a7a5458d94c459fb813f432fc39aaf1d4a33a9888","0a33b8bff876368beef794f5f08e8221103efa394f9e0e27e19f557a8cdaa0a0","00ff0ab9ef8e80fa5f661376178da927120f98974ae453f1878fda1662a3c24a",{"version":"230f951114cbbe103632617f6b9591bfcaac2fbe4fc27158d528984ada8bd3eb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"dc32a7ce3f941cd47b298e971118b1abaa18f1c72e16d803d2a9518b94c628b2","b5a58595a790a580bc82de0e44898dc8802a7b8db9e62fb1b5afe4e8bc6a9b09","fc909066a936771070f4e142f262faed6e886c883537f03e8ce99a41f6a4be0e","54fae3169ef40000b63b1ceb89a27782217364ba3cb0990fa0a9d22c9343b887",{"version":"d9fe94961a12a090b9f42a740d0acd29fd41a98373da82a5735bcfb07496db0c","signature":"9c3ec00d7312bdbf929c985aafcfb44312a3d0bf5c18aab380790f309576b09f"},{"version":"5126acfa9a43c6020b8b0f1c55a78e9fe0f60adfbf5fae59ab370399505b6f7e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"77f2bd2c3b41aec171e16dc315f6840e67551fd92e77417b8193c716ace11e39","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"b648f0bb4f358e44c69649d448a95e5ee76f7a28bff8b4c069926f92547b5ea6",{"version":"f77792bc02b2dfc8c9645696a9c2e6acfe071599ddd7c12771b49444bec72495","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"6b8ba82472956e3c2012793ea52804218145cb53e2be86e2cb3aa3de4eb6b25b","1c5b3fca96bf8a12c234a3466821ecd5c8c3ae0bfc12b58d72b403447e75ae44","c64123347ea308d462eb2fe5f17db98486bb7b1fb1bb7e70389fc5da5bc2d98d","556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","a3d3f704c5339a36da3ca8c62b29072f87e86c783b8452d235992142ec71aa2d","0dc6940ff35d845686a118ee7384713a84024d60ef26f25a2f87992ec7ddbd64","751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","efd20a1e335999efb44d19f01f9a74b2c40491c0539d9f14ed2bbded3f573654","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","b104e2da53231a529373174880dc0abfbc80184bb473b6bf2a9a0746bebb663d","ee91a5fbbd1627c632df89cce5a4054f9cc6e7413ebdccc82b27c7ffeedf982d","85c8731ca285809fc248abf21b921fe00a67b6121d27060d6194eddc0e042b1a","6bac0cbdf1bc85ae707f91fdf037e1b600e39fb05df18915d4ecab04a1e59d3c","5688b21a05a2a11c25f56e53359e2dcda0a34cb1a582dbeb1eaacdeca55cb699","35558bf15f773acbe3ed5ac07dd27c278476630d85245f176e85f9a95128b6e0","951f54e4a63e82b310439993170e866dba0f28bb829cbc14d2f2103935cea381","4454a999dc1676b866450e8cddd9490be87b391b5526a33f88c7e45129d30c5d","99013139312db746c142f27515a14cdebb61ff37f20ee1de6a58ce30d36a4f0d","71da852f38ac50d2ae43a7b7f2899b10a2000727fee293b0b72123ed2e7e2ad6","74dd1096fca1fec76b951cf5eacf609feaf919e67e13af02fed49ec3b77ea797","a0691153ccf5aa1b687b1500239722fff4d755481c20e16d9fcd7fb2d659c7c7","fe2201d73ae56b1b4946c10e18549a93bf4c390308af9d422f1ffd3c7989ffc8","cad63667f992149cee390c3e98f38c00eee56a2dae3541c6d9929641b835f987","f497cad2b33824d8b566fa276cfe3561553f905fdc6b40406c92bcfcaec96552","eb58c4dbc6fec60617d80f8ccf23900a64d3190fda7cfb2558b389506ec69be0","578929b1c1e3adaed503c0a0f9bda8ba3fea598cc41ad5c38932f765684d9888","7cc9d600b2070b1e5c220044a8d5a58b40da1c11399b6c8968711de9663dc6b2","45f36cf09d3067cd98b39a7d430e0e531f02911dd6d63b6d784b1955eef86435","80419a23b4182c256fa51d71cb9c4d872256ca6873701ceabbd65f8426591e49","5aa046aaab44da1a63d229bd67a7a1344afbd6f64db20c2bbe3981ceb2db3b07","ed9ad5b51c6faf9d6f597aa0ab11cb1d3a361c51ba59d1220557ef21ad5b0146","73db7984e8a35e6b48e3879a6d024803dd990022def2750b3c23c01eb58bc30f","c9ecb910b3b4c0cf67bc74833fc41585141c196b5660d2eb3a74cfffbf5aa266","33dcfba8a7e4acbe23974d342c44c36d7382c3d1d261f8aef28261a7a5df2969","de26700eb7277e8cfdde32ebb21b3d9ad1d713b64fdc2019068b857611e8f0c4","e481bd2c07c8e93eb58a857a9e66f22cb0b5ddfd86bbf273816fd31ef3a80613","ef156ba4043f6228d37645d6d9c6230a311e1c7a86669518d5f2ebc26e6559bf","457fd1e6d6f359d7fa2ca453353f4317efccae5c902b13f15c587597015212bc","473b2b42af720ebdb539988c06e040fd9600facdeb23cb297d72ee0098d8598f","22bc373ca556de33255faaddb373fec49e08336638958ad17fbd6361c7461eed","b3d58358675095fef03ec71bddc61f743128682625f1336df2fc31e29499ab25","5b1ef94b03042629c76350fe18be52e17ab70f1c3be8f606102b30a5cd86c1b3","a7b6046c44d5fda21d39b3266805d37a2811c2f639bf6b40a633b9a5fb4f5d88","80b036a132f3def4623aad73d526c6261dcae3c5f7013857f9ecf6589b72951f","0a347c2088c3b1726b95ccde77953bede00dd9dd2fda84585fa6f9f6e9573c18","8cc3abb4586d574a3faeea6747111b291e0c9981003a0d72711351a6bcc01421","0a516adfde610035e31008b170da29166233678216ef3646822c1b9af98879da","70d48a1faa86f67c9cb8a39babc5049246d7c67b6617cd08f64e29c055897ca9","df10dc6fe1c49e2f94be9d7d1e625aeb66e5eb90b2e0af1f378bfdfa5313155b","082b818038423de54be877cebdb344a2e3cf3f6abcfc48218d8acf95c030426a","813514ef625cb8fc3befeec97afddfb3b80b80ced859959339d99f3ad538d8fe","039cd54028eb988297e189275764df06c18f9299b14c063e93bd3f30c046fee6","e91cfd040e6da28427c5c4396912874902c26605240bdc3457cc75b6235a80f2","b4347f0b45e4788c18241ac4dee20ceab96d172847f1c11d42439d3de3c09a3e","16fe6721dc0b4144a0cdcef98857ee19025bf3c2a3cc210bcd0b9d0e25f7cec8","346d903799e8ea99e9674ba5745642d47c0d77b003cc7bb93e1d4c21c9e37101","3997421bb1889118b1bbfc53dd198c3f653bf566fd13c663e02eb08649b985c4","2d1ac54184d897cb5b2e732d501fa4591f751678717fd0c1fd4a368236b75cba","bade30041d41945c54d16a6ec7046fba6d1a279aade69dfdef9e70f71f2b7226","56fbea100bd7dd903dc49a1001995d3c6eee10a419c66a79cdb194bff7250eb7","fe8d26b2b3e519e37ceea31b1790b17d7c5ab30334ca2b56d376501388ba80d6","37ad0a0c2b296442072cd928d55ef6a156d50793c46c2e2497da1c2750d27c1e","be93d07586d09e1b6625e51a1591d6119c9f1cbd95718497636a406ec42babee","a062b507ed5fc23fbc5850fd101bc9a39e9a0940bb52a45cd4624176337ad6b8","cf01f601ef1e10b90cad69312081ce0350f26a18330913487a26d6d4f7ce5a73","a9de7b9a5deaed116c9c89ad76fdcc469226a22b79c80736de585af4f97b17cd","5bde81e8b0efb2d977c6795f9425f890770d54610764b1d8df340ce35778c4f8","20fd0402351907669405355eeae8db00b3cf0331a3a86d8142f7b33805174f57","da6949af729eca1ec1fe867f93a601988b5b206b6049c027d0c849301d20af6f","7008f240ea3a5a344be4e5f9b5dbf26721aad3c5cfef5ff79d133fa7450e48fa","eb13c8624f5747a845aea0df1dfde0f2b8f5ed90ca3bc550b12777797cb1b1e3","2452fc0f47d3b5b466bda412397831dd5138e62f77aa5e11270e6ca3ecb8328d","33c2ebbdd9a62776ca0091a8d1f445fa2ea4b4f378bc92f524031a70dfbeec86","3ac3a5b34331a56a3f76de9baf619def3f3073961ce0a012b6ffa72cf8a91f1f","d5e9d32cc9813a5290a17492f554999e33f1aa083a128d3e857779548537a778","776f49489fa2e461b40370e501d8e775ddb32433c2d1b973f79d9717e1d79be5","be94ea1bfaa2eeef1e821a024914ef94cf0cba05be8f2e7df7e9556231870a1d","40cd13782413c7195ad8f189f81174850cc083967d056b23d529199d64f02c79","05e041810faf710c1dcd03f3ffde100c4a744672d93512314b1f3cfffccdaf20","15a8f79b1557978d752c0be488ee5a70daa389638d79570507a3d4cfc620d49d","968ee57037c469cffb3b0e268ab824a9c31e4205475b230011895466a1e72da4","77debd777927059acbaf1029dfc95900b3ab8ed0434ce3914775efb0574e747b","921e3bd6325acb712cd319eaec9392c9ad81f893dead509ab2f4e688f265e536","60f6768c96f54b870966957fb9a1b176336cd82895ded088980fb506c032be1c","755d9b267084db4ea40fa29653ea5fc43e125792b1940f2909ec70a4c7f712d8","7e3056d5333f2d8a9e54324c2e2293027e4cd9874615692a53ad69090894d116","1e25b848c58ad80be5c31b794d49092d94df2b7e492683974c436bcdbefb983c","3df6fc700b8d787974651680ae6e37b6b50726cf5401b7887f669ab195c2f2ef","145df08c171ec616645a353d5eaa5d5f57a5fbce960a47d847548abd9215a99e","dcfd2ca9e033077f9125eeca6890bb152c6c0bc715d0482595abc93c05d02d92","8056fa6beb8297f160e13c9b677ba2be92ab23adfb6940e5a974b05acd33163b","86dda1e79020fad844010b39abb68fafed2f3b2156e3302820c4d0a161f88b03","dea0dcec8d5e0153d6f0eacebb163d7c3a4b322a9304048adffc6d26084054bd","2afd081a65d595d806b0ff434d2a96dc3d6dcd8f0d1351c0a0968568c6944e0b","b86259ab4b95ebe1aedb03d3eebea647f0bd9a706981220f00210487d70e77a0","2f1f7c65e8ee58e3e7358f9b8b3c37d8447549ecc85046f9405a0fc67fbdf54b","e3f3964ff78dee11a07ae589f1319ff682f62f3c6c8afa935e3d8616cf21b431","2762c2dbee294ffb8fdbcae6db32c3dae09e477d6a348b48578b4145b15d1818","78a1eace936ad32ca1c228814f3333cb2e826e1447e60fee181b3c53d43a8d07","24bd135b687da453ea7bd98f7ece72e610a3ff8ca6ec23d321c0e32f19d32db6","64d45d55ba6e42734ac326d2ea1f674c72837443eb7ff66c82f95e4544980713","f9b0dc747f13dcc09e40c26ddcc118b1bafc3152f771fdc32757a7f8916a11fc","7035fc608c297fd38dfe757d44d3483a570e2d6c8824b2d6b20294d617da64c6","22160a296186123d2df75280a1fab70d2105ce1677af1ebb344ffcb88eef6e42","9067b3fd7d71165d4c34fcbbf29f883860fd722b7e8f92e87da036b355a6c625","e01ab4b99cc4a775d06155e9cadd2ebd93e4af46e2723cb9361f24a4e1f178ef","9a13410635d5cc9c2882e67921c59fb26e77b9d99efa1a80b5a46fdc2954afce","b04862a4f44f78fd12ad8ed34ab81f9f254a87398568173694a78dc0bdebcd23","fa894bdddb2ba0e6c65ad0d88942cf15328941246410c502576124ef044746f9","59c5a06fa4bf2fa320a3c5289b6f199a3e4f9562480f59c0987c91dc135a1adf","456a9a12ad5d57af0094edf99ceab1804449f6e7bc773d85d09c56a18978a177","a8e2a77f445a8a1ce61bfd4b7b22664d98cf19b84ec6a966544d0decec18e143","6f6b0b477db6c4039410c7a13fe1ebed4910dedf644330269816df419cdb1c65","960b6e1edfb9aafbd560eceaae0093b31a9232ab273f4ed776c647b2fb9771da","530f4bee13cc07fd4e8bac69eeb728a6270ebafeab886c98624c699725b29755","a0db48d42371b223cea8fd7a41763d48f9166ecd4baecc9d29d9bb44cc3c2d83","aaf3c2e268f27514eb28255835f38445a200cd8bcfdff2c07c6227f67aaaf657","6ade56d2afdf75a9bd55cd9c8593ed1d78674804d9f6d9aba04f807f3179979e","b67acb619b761e91e3a11dddb98c51ee140361bc361eb17538f1c3617e3ec157","81b097e0f9f8d8c3d5fe6ba9dc86139e2d95d1e24c5ce7396a276dfbb2713371","692d56fff4fb60948fe16e9fed6c4c4eac9b263c06a8c6e63726e28ed4844fd4","f13228f2c0e145fc6dc64917eeef690fb2883a0ac3fa9ebfbd99616fd12f5629","d89b2b41a42c04853037408080a2740f8cd18beee1c422638d54f8aefe95c5b8","be5d39e513e3e0135068e4ebed5473ab465ae441405dce90ab95055a14403f64","97e320c56905d9fa6ac8bd652cea750265384f048505870831e273050e2878cc","9932f390435192eb93597f89997500626fb31005416ce08a614f66ec475c5c42","5d89ca552233ac2d61aee34b0587f49111a54a02492e7a1098e0701dedca60c9","1ee47a39f996d76442fe9777bb4446bd110f6828488db0e65cba817b4ffc5807","fdc4fd2c610b368104746960b45216bc32685927529dd871a5330f4871d14906","7b5d77c769a6f54ea64b22f1877d64436f038d9c81f1552ad11ed63f394bd351","4f7d54c603949113f45505330caae6f41e8dbb59841d4ae20b42307dc4579835","a71fd01a802624c3fce6b09c14b461cc7c7758aa199c202d423a7c89ad89943c","1ed0dc05908eb15f46379bc1cb64423760e59d6c3de826a970b2e2f6da290bf5","db89ef053f209839606e770244031688c47624b771ff5c65f0fa1ec10a6919f1","4d45b88987f32b2ac744f633ff5ddb95cd10f64459703f91f1633ff457d6c30d","8512fd4a480cd8ef8bf923a85ff5e97216fa93fb763ec871144a9026e1c9dade","2aa58b491183eedf2c8ae6ef9a610cd43433fcd854f4cc3e2492027fbe63f5ca","ce1f3439cb1c5a207f47938e68752730892fc3e66222227effc6a8b693450b82","295ce2cf585c26a9b71ba34fbb026d2b5a5f0d738b06a356e514f39c20bf38ba","342f10cf9ba3fbf52d54253db5c0ac3de50360b0a3c28e648a449e28a4ac8a8c","c485987c684a51c30e375d70f70942576fa86e9d30ee8d5849b6017931fccc6f","320bd1aa480e22cdd7cd3d385157258cc252577f4948cbf7cfdf78ded9d6d0a8","4ee053dfa1fce5266ecfae2bf8b6b0cb78a6a76060a1dcf66fb7215b9ff46b0b","1f84d8b133284b596328df47453d3b3f3817ad206cf3facf5eb64b0a2c14f6d7","5c75e05bc62bffe196a9b2e9adfa824ffa7b90d62345a766c21585f2ce775001","cc2eb5b23140bbceadf000ef2b71d27ac011d1c325b0fc5ecd42a3221db5fb2e","fd75cc24ea5ec28a44c0afc2f8f33da5736be58737ba772318ae3bdc1c079dc3","5ae43407346e6f7d5408292a7d957a663cc7b6d858a14526714a23466ac83ef9","c72001118edc35bbe4fff17674dc5f2032ccdbcc5bec4bd7894a6ed55739d31b","353196fd0dd1d05e933703d8dad664651ed172b8dfb3beaef38e66522b1e0219","670aef817baea9332d7974295938cf0201a2d533c5721fccf4801ba9a4571c75","3f5736e735ee01c6ecc6d4ab35b2d905418bb0d2128de098b73e11dd5decc34f","b64e159c49afc6499005756f5a7c2397c917525ceab513995f047cdd80b04bdf","f72b400dbf8f27adbda4c39a673884cb05daf8e0a1d8152eec2480f5700db36c","24509d0601fc00c4d77c20cacddbca6b878025f4e0712bddd171c7917f8cdcde","5f5baa59149d3d6d6cef2c09d46bb4d19beb10d6bee8c05b7850c33535b3c438","f17a51aae728f9f1a2290919cf29a927621b27f6ae91697aee78f41d48851690","be02e3c3cb4e187fd252e7ae12f6383f274e82288c8772bb0daf1a4e4af571ad","82ca40fb541799273571b011cd9de6ee9b577ef68acc8408135504ae69365b74","8fb6646db72914d6ef0692ea88b25670bbf5e504891613a1f46b42783ec18cce","b61efdebae3d131b6ad71bd2aa7cc4284e351481339bf66d84ee5ed86465bcc8","213aa21650a910d95c4d0bee4bb936ecd51e230c1a9e5361e008830dcc73bc86","874a8c5125ad187e47e4a8eacc809c866c0e71b619a863cc14794dd3ccf23940","c31db8e51e85ee67018ac2a40006910efbb58e46baea774cf1f245d99bf178b5","31fac222250b18ebac0158938ede4b5d245e67d29cd2ef1e6c8a5859d137d803","a9dfb793a7e10949f4f3ea9f282b53d3bd8bf59f5459bc6e618e3457ed2529f5","2a77167687b0ec0c36ef581925103f1dc0c69993f61a9dbd299dcd30601af487","0f23b5ce60c754c2816c2542b9b164d6cb15243f4cbcd11cfafcab14b60e04d0","813ce40a8c02b172fdbeb8a07fdd427ac68e821f0e20e3dc699fb5f5bdf1ef0a","5ce6b24d5fd5ebb1e38fe817b8775e2e00c94145ad6eedaf26e3adf8bb3903d0","6babca69d3ae17be168cfceb91011eed881d41ce973302ee4e97d68a81c514b4","3e0832bc2533c0ec6ffcd61b7c055adedcca1a45364b3275c03343b83c71f5b3","342418c52b55f721b043183975052fb3956dae3c1f55f965fedfbbf4ad540501","6a6ab1edb5440ee695818d76f66d1a282a31207707e0d835828341e88e0c1160","7e9b4669774e97f5dc435ddb679aa9e7d77a1e5a480072c1d1291892d54bf45c","de439ddbed60296fbd1e5b4d242ce12aad718dffe6432efcae1ad6cd996defd3","ce5fb71799f4dbb0a9622bf976a192664e6c574d125d3773d0fa57926387b8b2","b9c0de070a5876c81540b1340baac0d7098ea9657c6653731a3199fcb2917cef","cbc91ecd74d8f9ddcbcbdc2d9245f14eff5b2f6ae38371283c97ca7dc3c4a45f","3ca1d6f016f36c61a59483c80d8b9f9d50301fbe52a0dde288c1381862b13636","ecfef0c0ff0c80ac9a6c2fab904a06b680fb5dfe8d9654bb789e49c6973cb781","0ee2eb3f7c0106ccf6e388bc0a16e1b3d346e88ac31b6a5bbc15766e43992167","7a80da7b14bc7902b1da607c8b3734ad5740f8f5fade9a7bfbf753b9bba22652","7e46dd61422e5afe88c34e5f1894ae89a37b7a07393440c092e9dc4399820172","9df4f57d7279173b0810154c174aa03fd60f5a1f0c3acfe8805e55e935bdecd4","a02a51b68a60a06d4bd0c747d6fbade0cb87eefda5f985fb4650e343da424f12","0cf851e2f0ecf61cabe64efd72de360246bcb8c19c6ef7b5cbb702293e1ff755","0c0e0aaf37ab0552dffc13eb584d8c56423b597c1c49f7974695cb45e2973de6","e2e0cd8f6470bc69bbfbc5e758e917a4e0f9259da7ffc93c0930516b0aa99520","180de8975eff720420697e7b5d95c0ecaf80f25d0cea4f8df7fe9cf817d44884","424a7394f9704d45596dce70bd015c5afec74a1cc5760781dfda31bc300df88f","044a62b9c967ee8c56dcb7b2090cf07ef2ac15c07e0e9c53d99fab7219ee3d67","3903b01a9ba327aae8c7ea884cdabc115d27446fba889afc95fddca8a9b4f6e2","78fd8f2504fbfb0070569729bf2fe41417fdf59f8c3e975ab3143a96f03e0a4a","8afd4f91e3a060a886a249f22b23da880ec12d4a20b6404acc5e283ef01bdd46","72e72e3dea4081877925442f67b23be151484ef0a1565323c9af7f1c5a0820f0","fa8c21bafd5d8991019d58887add8971ccbe88243c79bbcaec2e2417a40af4e8","ab35597fd103b902484b75a583606f606ab2cef7c069fae6c8aca0f058cee77d","ca54ec33929149dded2199dca95fd8ad7d48a04f6e8500f3f84a050fa77fee45","cac7dcf6f66d12979cc6095f33edc7fbb4266a44c8554cd44cd04572a4623fd0","98af566e6d420e54e4d8d942973e7fbe794e5168133ad6658b589d9dfb4409d8","fd80af69ef04ab9cb2404aca13e8a620f0cf29c0814c69b663a467def21de35e","d421c4e4d70b03d8d05f993dd13a2c473c967b863438b167a8b3c01d4685a692","3bf23090b94bda18a619623d2652b48ea904e26304267b10fcbdb85e032b7351","d4d6aab35ead2fbdafc31c9b0cb8a5b5939c7d24c63356c979757194eaa282cf","f80aedd7cc51ccb70537fc79f07b44512e0ce43e2bf3dd350743bfb968cf26ce","b3202cfb0370950f175b9d1c1bebda95f0c62fee5fc2853f474aace51be42860",{"version":"3e2f739bdfb6b194ae2af13316b4c5bb18b3fe81ac340288675f92ba2061b370","affectsGlobalScope":true},"b0f9ef6423d6b29dde29fd60d83d215796b2c1b76bfca28ac374ae18702cfb8e","ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","e7bb49fac2aa46a13011b5eb5e4a8648f70a28aea1853fab2444dd4fcb4d4ec7","464e45d1a56dae066d7e1a2f32e55b8de4bfb072610c3483a4091d73c9924908","da318e126ac39362c899829547cc8ee24fa3e8328b52cdd27e34173cf19c7941","24bd01a91f187b22456c7171c07dbf44f3ad57ebd50735aab5c13fa23d7114b4","4738eefeaaba4d4288a08c1c226a76086095a4d5bcc7826d2564e7c29da47671","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","dbec715e9e82df297e49e3ed0029f6151aa40517ebfd6fcdba277a8a2e1d3a1b","097f1f8ca02e8940cfdcca553279e281f726485fa6fb214b3c9f7084476f6bcc","8f75e211a2e83ff216eb66330790fb6412dcda2feb60c4f165c903cf375633ee","c3fb0d969970b37d91f0dbf493c014497fe457a2280ac42ae24567015963dbf7","a9155c6deffc2f6a69e69dc12f0950ba1b4db03b3d26ab7a523efc89149ce979","c99faf0d7cb755b0424a743ea0cbf195606bf6cd023b5d10082dba8d3714673c","8e770f88d5f5b92aa94251b2d223d18e85dc0ff8ffba5b0d82164a78e8ac5663","3134a6c11d0beb89fcb57ee0720c68fbd47d6c796e219ec188c459553e46505b","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7"],"root":[531,532,610,752,753,[756,805],[827,846],[940,943],[953,966]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"outDir":"./dist","removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strictBindCallApply":true,"strictNullChecks":true,"target":8},"fileIdsList":[[421,468,528],[421,468,527],[421,468,967],[421,468],[421,468,1176],[307,421,468],[407,421,468],[56,308,309,310,311,312,313,314,315,316,317,318,319,320,421,468],[259,293,421,468],[266,421,468],[256,307,407,421,468],[325,326,327,328,329,330,331,333,421,468],[261,421,468],[307,407,421,468],[261,332,421,468],[321,324,334,421,468],[322,323,421,468],[297,421,468],[261,262,263,264,421,468],[337,421,468],[279,336,421,468],[336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,421,468],[366,421,468],[363,364,421,468],[362,365,421,468,498],[55,265,307,335,359,362,367,374,399,404,406,421,468],[61,259,421,468],[60,421,468],[61,251,252,421,468,876,881],[251,259,421,468],[60,250,421,468],[259,387,421,468],[253,389,421,468],[250,254,421,468],[254,421,468],[60,307,421,468],[258,259,421,468],[271,421,468],[273,274,275,276,277,421,468],[265,421,468],[265,266,285,421,468],[279,280,286,287,288,421,468],[57,58,59,60,61,251,252,253,254,255,256,257,258,259,260,266,271,272,278,285,289,290,291,293,301,302,303,304,305,306,421,468],[284,421,468],[267,268,269,270,421,468],[259,267,268,421,468],[259,265,266,421,468],[259,269,421,468],[259,297,421,468],[292,294,295,296,297,298,299,300,421,468],[57,259,421,468],[293,421,468],[57,259,292,296,298,421,468],[268,421,468],[294,421,468],[259,293,294,295,421,468],[283,421,468],[259,263,283,284,301,302,421,468],[281,282,284,421,468],[255,257,266,272,286,303,304,307,421,468],[61,250,255,257,260,303,304,421,468],[264,421,468],[250,421,468],[283,307,368,372,421,468],[372,373,421,468],[307,368,421,468],[307,368,369,421,468],[369,370,421,468],[369,370,371,421,468],[260,421,468],[377,378,379,421,468],[377,421,468],[379,380,381,383,384,385,421,468],[376,421,468],[379,382,421,468],[379,380,381,383,384,421,468],[260,377,379,383,421,468],[375,386,391,392,393,394,395,396,397,398,421,468],[260,307,391,421,468],[260,382,421,468],[260,382,407,421,468],[253,259,260,382,387,388,389,390,421,468],[250,307,387,388,400,421,468],[307,387,421,468],[402,421,468],[335,400,421,468],[400,401,403,421,468],[283,421,468,510],[283,360,361,421,468],[292,421,468],[265,307,421,468],[405,421,468],[407,421,468,519],[250,409,414,421,468],[408,414,421,468,519,520,521,524],[414,421,468],[415,421,468,517],[409,415,421,468,518],[410,411,412,413,421,468],[421,468,522,523],[414,421,468,519,525],[421,468,525],[285,307,407,421,468],[421,468,806],[307,407,421,468,865,866],[332,421,468],[407,421,468,859,864,865],[421,468,869,870],[61,307,421,468,860,865,879],[407,421,468,847,872],[60,407,421,468,873,876],[307,421,468,860,865,867,878,880,884],[60,421,468,882,883],[421,468,873],[250,307,407,421,468,887],[307,407,421,468,860,865,867,879],[421,468,886,888,889],[307,421,468,865],[421,468,865],[307,407,421,468,887],[60,307,407,421,468],[307,407,421,468,859,860,865,885,887,890,893,898,899,912,913],[250,421,468,806],[421,468,872,875,914],[421,468,899,911],[55,421,468,847,867,868,871,874,906,911,915,918,922,923,924,926,928,934,936],[307,407,421,468,853,861,864,865],[307,421,468,857],[284,307,332,407,421,468,856,857,858,859,864,865,867,937],[421,468,859,860,863,865,901,910],[307,407,421,468,852,864,865],[421,468,900],[407,421,468,860,865],[407,421,468,853,860,864,905],[307,332,407,421,468,852,864],[407,421,468,858,859,863,903,907,908,909],[407,421,468,853,860,861,862,864,865],[307,332,421,468,860,863,865],[250,421,468,864],[259,292,298,421,468],[421,468,849,850,851,860,864,865,904],[421,468,856,905,916,917],[332,407,421,468,865],[332,407,421,468],[421,468,848,849,850,851,854,856],[421,468,853],[421,468,855,856],[407,421,468,848,849,850,851,854,855],[421,468,891,892],[307,421,468,860,865,867,879],[421,468,902],[290,421,468],[271,307,421,468,919,920],[421,468,921],[307,421,468,867],[307,421,468,860,867],[284,307,407,421,468,853,860,861,862,864,865],[283,307,407,421,468,847,860,867,905,923],[284,285,407,421,468,806,925],[421,468,895,896,897],[407,421,468,894],[421,468,927],[407,421,468,496],[421,468,930,932,933],[421,468,929],[421,468,931],[407,421,468,859,864,930],[421,468,877],[307,332,407,421,468,860,864,865,867,902,903,905,906],[421,468,935],[421,468,534,536,537,538,539],[421,468,535],[407,421,468,534],[407,421,468,535],[421,468,534,536],[421,468,540],[407,421,468,543,545],[421,468,542,545,546,547,558,559],[421,468,543,544],[407,421,468,543],[421,468,557],[421,468,545],[421,468,560],[281,285,307,407,421,468,482,484,556,806,807,808,809],[421,468,810],[421,468,811,813,824],[421,468,807,808,812],[281,407,421,468,482,484,556,807,808,809],[421,468,482],[421,468,820,822,823],[407,421,468,814],[421,468,815,816,817,818,819],[307,421,468,814],[421,468,821],[407,421,468,821],[407,421,468,564,565],[421,468,587],[421,468,564,565],[421,468,564],[407,421,468,564,565,578],[407,421,468,578,581],[407,421,468,564],[421,468,581],[421,468,562,563,566,567,568,569,570,571,572,573,574,575,576,577,579,580,582,583,584,585,586,588,589,590],[421,468,564,584,595],[55,421,468,591,595,596,597,603,606],[421,468,564,593,594],[407,421,468,564,578],[421,468,564,592],[286,407,421,468,595],[421,468,598,599,600,601,602],[421,468,604,605],[421,468,947,948,950,951],[421,468,944,945,949],[421,468,945,948],[421,468,902,948],[297,421,468,948],[284,407,421,468,902,906,946,947,950],[407,421,468,860,864,867,905,925,937],[421,468,529],[421,468,986,988,992,995,997,999,1001,1003,1005,1009,1013,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1045,1050,1052,1054,1056,1058,1061,1063,1068,1072,1076,1078,1080,1082,1085,1087,1089,1092,1094,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1119,1122,1124,1126,1130,1132,1135,1137,1139,1141,1145,1151,1155,1157,1159,1166,1168,1170,1172,1175],[421,468,986,1119],[421,468,987],[421,468,1125],[421,468,986,1102,1106,1119],[421,468,1107],[421,468,986,1102,1119],[421,468,991],[421,468,1007,1013,1017,1023,1054,1106,1119],[421,468,1062],[421,468,1036],[421,468,1030],[421,468,1120,1121],[421,468,1119],[421,468,1009,1013,1050,1056,1068,1104,1106,1119],[421,468,1136],[421,468,985,1119],[421,468,1006],[421,468,988,995,1001,1005,1009,1025,1037,1078,1080,1082,1104,1106,1110,1112,1114,1119],[421,468,1138],[421,468,999,1009,1025,1119],[421,468,1140],[421,468,986,995,997,1061,1102,1106,1119],[421,468,998],[421,468,1123],[421,468,1117],[421,468,1109],[421,468,986,1001,1119],[421,468,1002],[421,468,1026],[421,468,1058,1104,1119,1143],[421,468,1045,1119,1143],[421,468,1009,1017,1045,1058,1102,1106,1119,1142,1144],[421,468,1142,1143,1144],[421,468,1027,1119],[421,468,1001,1058,1104,1106,1119,1148],[421,468,1058,1104,1119,1148],[421,468,1017,1058,1102,1106,1119,1147,1149],[421,468,1146,1147,1148,1149,1150],[421,468,1058,1104,1119,1153],[421,468,1045,1119,1153],[421,468,1009,1017,1045,1058,1102,1106,1119,1152,1154],[421,468,1152,1153,1154],[421,468,1004],[421,468,1127,1128,1129],[421,468,986,988,992,995,999,1001,1005,1007,1009,1013,1017,1019,1021,1023,1025,1029,1031,1033,1035,1037,1045,1052,1054,1058,1061,1078,1080,1082,1087,1089,1094,1098,1100,1104,1108,1110,1112,1114,1116,1119,1126],[421,468,986,988,992,995,999,1001,1005,1007,1009,1013,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1045,1052,1054,1058,1061,1078,1080,1082,1087,1089,1094,1098,1100,1104,1108,1110,1112,1114,1116,1119,1126],[421,468,1009,1104,1119],[421,468,1105],[421,468,1046,1047,1048,1049],[421,468,1048,1058,1104,1106,1119],[421,468,1046,1050,1058,1104,1119],[421,468,1001,1017,1033,1035,1045,1119],[421,468,1007,1009,1013,1017,1019,1023,1025,1046,1047,1049,1058,1104,1106,1108,1119],[421,468,1156],[421,468,999,1009,1119],[421,468,1158],[421,468,992,995,997,999,1005,1013,1017,1025,1052,1054,1061,1089,1104,1108,1114,1119,1126],[421,468,1034],[421,468,1010,1011,1012],[421,468,995,1009,1010,1061,1119],[421,468,1009,1010,1119],[421,468,1119,1161],[421,468,1160,1161,1162,1163,1164,1165],[421,468,1001,1058,1104,1106,1119,1161],[421,468,1001,1017,1045,1058,1119,1160],[421,468,1051],[421,468,1064,1065,1066,1067],[421,468,1058,1065,1104,1106,1119],[421,468,1013,1017,1019,1025,1056,1104,1106,1108,1119],[421,468,1001,1007,1017,1023,1033,1058,1064,1066,1106,1119],[421,468,1000],[421,468,989,990,1057],[421,468,986,1104,1119],[421,468,989,990,992,995,999,1001,1003,1005,1013,1017,1025,1050,1052,1054,1056,1061,1104,1106,1108,1119],[421,468,992,995,999,1003,1005,1007,1009,1013,1017,1023,1025,1050,1052,1061,1063,1068,1072,1076,1085,1089,1092,1094,1104,1106,1108,1119],[421,468,1097],[421,468,992,995,999,1003,1005,1013,1017,1019,1023,1025,1052,1061,1089,1102,1104,1106,1108,1119],[421,468,986,1095,1096,1102,1104,1119],[421,468,1008],[421,468,1099],[421,468,1077],[421,468,1032],[421,468,1103],[421,468,986,995,1061,1102,1106,1119],[421,468,1069,1070,1071],[421,468,1058,1070,1104,1119],[421,468,1058,1070,1104,1106,1119],[421,468,1001,1007,1013,1017,1019,1023,1050,1058,1069,1071,1104,1106,1119],[421,468,1059,1060],[421,468,1058,1059,1104],[421,468,986,1058,1060,1106,1119],[421,468,1167],[421,468,1005,1009,1025,1119],[421,468,1083,1084],[421,468,1058,1083,1104,1106,1119],[421,468,995,997,1001,1007,1013,1017,1019,1023,1029,1031,1033,1035,1037,1058,1061,1078,1080,1082,1084,1104,1106,1119],[421,468,1131],[421,468,1073,1074,1075],[421,468,1058,1074,1104,1119],[421,468,1058,1074,1104,1106,1119],[421,468,1001,1007,1013,1017,1019,1023,1050,1058,1073,1075,1104,1106,1119],[421,468,1053],[421,468,996],[421,468,995,1061,1119],[421,468,993,994],[421,468,993,1058,1104],[421,468,986,994,1058,1106,1119],[421,468,1088],[421,468,986,988,1001,1003,1009,1017,1029,1031,1033,1035,1045,1087,1102,1104,1106,1119],[421,468,1018],[421,468,1022],[421,468,986,1021,1102,1119],[421,468,1086],[421,468,1133,1134],[421,468,1090,1091],[421,468,1058,1090,1104,1106,1119],[421,468,995,997,1001,1007,1013,1017,1019,1023,1029,1031,1033,1035,1037,1058,1061,1078,1080,1082,1091,1104,1106,1119],[421,468,1169],[421,468,1013,1017,1025,1119],[421,468,1171],[421,468,1005,1009,1119],[421,468,988,992,999,1001,1003,1005,1013,1017,1019,1023,1025,1029,1031,1033,1035,1037,1045,1052,1054,1078,1080,1082,1087,1089,1100,1104,1108,1110,1112,1114,1116,1117],[421,468,1117,1118],[421,468,986],[421,468,1055],[421,468,1101],[421,468,992,995,999,1003,1005,1009,1013,1017,1019,1021,1023,1025,1052,1054,1061,1089,1094,1098,1100,1104,1106,1108,1119],[421,468,1028],[421,468,1079],[421,468,985],[421,468,1001,1017,1027,1029,1031,1033,1035,1037,1038,1045],[421,468,1001,1017,1027,1031,1038,1039,1045,1106],[421,468,1038,1039,1040,1041,1042,1043,1044],[421,468,1027],[421,468,1027,1045],[421,468,1001,1017,1029,1031,1033,1037,1045,1106],[421,468,986,1001,1009,1017,1029,1031,1033,1035,1037,1041,1102,1106,1119],[421,468,1001,1017,1043,1102,1106],[421,468,1093],[421,468,1024],[421,468,1173,1174],[421,468,992,999,1005,1037,1052,1054,1063,1080,1082,1087,1110,1112,1116,1119,1126,1141,1157,1159,1168,1172,1173],[421,468,988,995,997,1001,1003,1009,1013,1017,1019,1021,1023,1025,1029,1031,1033,1035,1045,1050,1058,1061,1068,1072,1076,1078,1085,1089,1092,1094,1098,1100,1104,1108,1114,1119,1137,1139,1145,1151,1155,1166,1170],[421,468,1111],[421,468,1081],[421,468,1014,1015,1016],[421,468,995,1009,1014,1061,1119],[421,468,1009,1014,1119],[421,468,1113],[421,468,1020],[421,468,1115],[421,468,967,968,969,970,971],[421,468,967,969],[421,468,482,516,554],[421,468,515,556],[421,468,482,516],[421,468,975,978],[421,468,975,976,977],[421,468,978],[421,468,479,482,516,548,549,550],[421,468,551,553,555],[421,468,980],[421,468,981],[421,468,1178,1182],[421,468,473,516,533],[421,468,498,556],[421,465,468],[421,467,468],[421,468,473,501],[421,468,469,474,479,487,498,509],[421,468,469,470,479,487],[416,417,418,421,468],[421,468,471,510],[421,468,472,473,480,488],[421,468,473,498,506],[421,468,474,476,479,487],[421,467,468,475],[421,468,476,477],[421,468,478,479],[421,467,468,479],[421,468,479,480,481,498,509],[421,468,479,480,481,494,498,501],[421,468,476,479,482,487,498,509],[421,468,479,480,482,483,487,498,506,509],[421,468,482,484,498,506,509],[421,468,479,485],[421,468,486,509,514],[421,468,476,479,487,498],[421,468,488],[421,468,489],[421,467,468,490],[421,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515],[421,468,492],[421,468,493],[421,468,479,494,495],[421,468,494,496,510,512],[421,468,479,498,499,501],[421,468,500,501],[421,468,498,499],[421,468,501],[421,468,502],[421,465,468,498,503],[421,468,479,504,505],[421,468,504,505],[421,468,473,487,498,506],[421,468,507],[468],[419,420,421,422,423,424,425,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515],[421,468,487,508],[421,468,482,493,509],[421,468,473,510],[421,468,498,511],[421,468,486,512],[421,468,513],[421,463,468],[421,463,468,479,481,490,498,501,509,512,514],[421,468,498,515],[421,468,534,754],[421,468,556,557],[421,468,482,556],[421,468,480,498,516],[421,468,482,516,552],[421,468,1193],[421,468,974,1184,1186,1188,1194],[421,468,483,487,498,506,516],[421,468,480,482,483,484,487,498,1184,1187,1188,1189,1190,1191,1192],[421,468,482,498,1193],[421,468,480,1187,1188],[421,468,509,1187],[421,468,1194,1195,1196,1197,1198],[421,468,1194,1195,1199],[421,468,1194,1195],[421,468,482,483,487,1184,1194],[421,468,644,645,646,647,648,649,650,651,652],[421,468,1200],[421,468,608],[421,468,615],[421,468,616],[421,468,615,616,621],[421,468,617,618,619,620,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742],[421,468,616,653],[421,468,616,647],[421,468,616,694],[421,468,611,612,613,614,615,616,621,743,744,745,746,750],[421,468,621],[421,468,613,748,749],[421,468,615,747],[421,468,616,621],[421,468,611,612],[421,468,516],[421,468,983,1180,1181],[421,468,482,498,516],[421,468,1178],[421,468,984,1179],[421,468,693],[421,468,1177],[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,182,183,185,194,196,197,198,199,200,201,203,204,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,421,468],[107,421,468],[65,66,421,468],[62,63,64,66,421,468],[63,66,421,468],[66,107,421,468],[62,66,184,421,468],[64,65,66,421,468],[62,66,421,468],[66,421,468],[65,421,468],[62,65,107,421,468],[63,65,66,223,421,468],[65,66,223,421,468],[65,231,421,468],[63,65,66,421,468],[75,421,468],[98,421,468],[119,421,468],[65,66,107,421,468],[66,114,421,468],[65,66,107,125,421,468],[65,66,125,421,468],[66,166,421,468],[62,66,185,421,468],[191,193,421,468],[62,66,184,191,192,421,468],[184,185,193,421,468],[191,421,468],[62,66,191,192,193,421,468],[207,421,468],[202,421,468],[205,421,468],[63,65,185,186,187,188,421,468],[107,185,186,187,188,421,468],[185,187,421,468],[65,186,187,189,190,194,421,468],[62,65,421,468],[66,209,421,468],[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,421,468],[195,421,468],[421,435,439,468,509],[421,435,468,498,509],[421,430,468],[421,432,435,468,506,509],[421,468,487,506],[421,430,468,516],[421,432,435,468,487,509],[421,427,428,431,434,468,479,498,509],[421,435,442,468],[421,427,433,468],[421,435,456,457,468],[421,431,435,468,501,509,516],[421,456,468,516],[421,429,430,468,516],[421,435,468],[421,429,430,431,432,433,434,435,436,437,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,457,458,459,460,461,462,468],[421,435,450,468],[421,435,442,443,468],[421,433,435,443,444,468],[421,434,468],[421,427,430,435,468],[421,435,439,443,444,468],[421,439,468],[421,433,435,438,468,509],[421,427,432,435,442,468],[421,468,498],[421,430,435,456,468,514,516],[407,421,468,526,532,757,760,763,766,769,772,778,783,784,794,796,799,802,805,829,834,837,839,842,845],[407,421,468,556],[421,468,940,941],[183,250,407,421,468],[407,421,468,489,607,825,846,937,938,939,942],[407,421,468,531,561,607,761,773,785,786,787],[407,421,468,541,757,763,777,785,786,787,788,789,790,791,792,793],[407,421,468,531,541,609],[407,421,468,531,609],[407,421,468,531,561,607,786],[407,421,468,531,607],[407,421,468,531,541,609,785,952],[407,421,468,773],[421,468,773,952],[407,421,468,561,607,610,752],[407,421,468,526,541,561,610,753,756],[421,468,751],[407,421,468,526,531,561,755],[421,468,531,541,610,952],[407,421,468,795],[407,421,468,561,607,831],[407,421,468,830,831,832,833],[407,421,468,531,830],[407,421,468,531,830,831,952],[407,421,468,607,764],[407,421,468,764,765],[407,421,468,531],[407,421,468,561,607,761],[407,421,468,761,762],[421,468,531,761,952],[407,421,468,561,607,797],[407,421,468,797,798],[407,421,468,561,607,835],[407,421,468,835,836],[407,421,468,531,835,952],[407,421,468,561,607,840],[407,421,468,840,841],[407,421,468,607,803],[407,421,468,803,804],[407,421,468,561,607,830],[407,421,468,830,838],[407,421,468,561,607,751,780],[407,421,468,780,781,783],[407,421,468,531,779],[407,421,468,561,607,780],[421,468,531,779,780,952],[407,421,468,607,751,779],[407,421,468,532,779,782],[407,421,468,489,531],[421,468,531,779,952],[407,421,468,561,607,767],[407,421,468,767,768],[421,468,531,767,952],[407,421,468,774],[407,421,468,561,607,773,774],[407,421,468,774,775,776,777],[407,421,468,473,531,773],[407,421,468,531,773,774,952],[407,421,468,607,800],[407,421,468,800,801],[421,468,531,800,952],[407,421,468,607,843],[407,421,468,843,844],[421,468,531,770,952],[407,421,468,607,770],[407,421,468,770,771],[407,421,468,473,489,607,825,826],[407,421,468,827,828],[407,421,468,480,489],[421,468,531,758,952],[407,421,468,561,607,758],[407,421,468,758,759],[407,421,468,530],[528,531,761,773,785,787],[531],[528,531],[527,531],[528,779,780],[528,531,779],[528,780],[779],[774],[773,774],[531,773]],"referencedMap":[[529,1],[528,2],[969,3],[967,4],[983,4],[1177,5],[332,4],[319,4],[56,4],[308,6],[309,6],[310,4],[311,7],[321,8],[312,6],[313,9],[314,4],[315,4],[316,6],[317,6],[318,6],[320,10],[328,11],[330,4],[327,4],[334,12],[331,4],[329,4],[325,13],[326,14],[333,15],[335,16],[322,4],[324,17],[323,18],[262,4],[265,19],[261,4],[894,4],[263,4],[264,4],[338,20],[339,20],[340,20],[341,20],[342,20],[343,20],[344,20],[337,21],[345,20],[359,22],[346,20],[336,4],[347,20],[348,20],[349,20],[350,20],[351,20],[352,20],[353,20],[354,20],[355,20],[356,20],[357,20],[358,20],[367,23],[365,24],[364,4],[363,4],[366,25],[407,26],[57,4],[58,4],[59,4],[876,27],[61,28],[882,29],[881,30],[251,31],[252,28],[387,4],[281,4],[282,4],[388,32],[253,4],[389,4],[390,33],[60,4],[255,34],[256,35],[254,36],[257,34],[258,4],[260,37],[272,38],[273,4],[278,39],[274,4],[275,4],[276,4],[277,4],[279,4],[280,40],[286,41],[289,42],[287,4],[288,4],[307,43],[290,4],[291,4],[925,44],[271,45],[269,46],[267,47],[268,48],[270,4],[298,49],[292,4],[301,50],[294,51],[299,52],[297,53],[300,54],[295,55],[296,56],[284,57],[303,58],[285,59],[305,60],[306,61],[293,4],[302,4],[259,4],[266,62],[304,63],[373,64],[368,4],[374,65],[369,66],[370,67],[371,68],[372,69],[375,70],[380,71],[378,72],[379,72],[386,73],[376,4],[377,74],[381,71],[383,75],[385,76],[384,77],[399,78],[392,79],[393,80],[394,80],[395,81],[396,81],[397,80],[398,80],[391,82],[401,83],[400,84],[403,85],[402,86],[404,87],[360,88],[362,89],[283,4],[361,57],[405,90],[382,91],[406,92],[408,7],[520,93],[521,94],[525,95],[409,4],[415,96],[518,97],[519,98],[410,4],[411,4],[414,99],[412,4],[413,4],[523,4],[524,100],[522,101],[526,102],[806,103],[847,104],[867,105],[868,106],[869,4],[870,107],[871,108],[880,109],[873,110],[877,111],[885,112],[883,7],[884,113],[874,114],[886,4],[888,115],[889,116],[890,117],[879,118],[875,119],[899,120],[887,121],[914,122],[872,123],[915,124],[912,125],[913,7],[937,126],[862,127],[858,128],[860,129],[911,130],[853,131],[901,132],[900,4],[861,133],[908,134],[865,135],[909,4],[910,136],[863,137],[864,138],[859,139],[857,140],[852,4],[905,141],[918,142],[916,7],[848,7],[904,143],[849,14],[850,106],[851,144],[855,145],[854,146],[917,147],[856,148],[893,149],[891,115],[892,150],[902,14],[903,151],[906,152],[921,153],[922,154],[919,155],[920,156],[923,157],[924,158],[926,159],[898,160],[895,161],[896,6],[897,150],[928,162],[927,163],[934,164],[866,7],[930,165],[929,7],[932,166],[931,4],[933,167],[878,168],[907,169],[936,170],[935,7],[540,171],[536,172],[535,173],[537,4],[538,174],[539,175],[541,176],[542,4],[546,177],[560,178],[543,7],[545,179],[544,4],[547,180],[558,181],[559,182],[561,183],[810,184],[811,185],[825,186],[813,187],[812,188],[807,189],[808,4],[809,4],[824,190],[815,191],[816,191],[817,191],[818,191],[820,192],[819,191],[821,193],[822,194],[814,4],[823,195],[562,4],[563,4],[566,196],[588,197],[567,4],[568,4],[569,7],[571,4],[570,4],[589,4],[572,4],[573,198],[574,4],[575,7],[576,4],[577,199],[579,200],[580,4],[582,201],[583,200],[584,202],[590,203],[585,199],[586,199],[591,204],[596,205],[607,206],[587,4],[578,199],[595,207],[564,4],[581,208],[593,209],[594,4],[592,4],[597,210],[598,7],[603,211],[599,7],[600,7],[601,7],[602,7],[565,4],[605,202],[604,4],[606,212],[952,213],[950,214],[944,7],[945,4],[949,215],[946,216],[951,217],[948,218],[947,219],[530,220],[527,4],[1176,221],[987,222],[988,223],[1125,222],[1126,224],[1107,225],[1108,226],[991,227],[992,228],[1062,229],[1063,230],[1036,222],[1037,231],[1030,222],[1031,232],[1122,233],[1120,234],[1121,4],[1136,235],[1137,236],[1006,237],[1007,238],[1138,239],[1139,240],[1140,241],[1141,242],[998,243],[999,244],[1124,245],[1123,246],[1109,222],[1110,247],[1002,248],[1003,249],[1026,4],[1027,250],[1144,251],[1142,252],[1143,253],[1145,254],[1146,255],[1149,256],[1147,257],[1150,234],[1148,258],[1151,259],[1154,260],[1152,261],[1153,262],[1155,263],[1004,243],[1005,264],[1130,265],[1127,266],[1128,267],[1129,4],[1105,268],[1106,269],[1050,270],[1049,271],[1047,272],[1046,273],[1048,274],[1157,275],[1156,276],[1159,277],[1158,278],[1035,279],[1034,222],[1013,280],[1011,281],[1010,227],[1012,282],[1162,283],[1166,284],[1160,285],[1161,286],[1163,283],[1164,283],[1165,283],[1052,287],[1051,227],[1068,288],[1066,289],[1067,234],[1064,290],[1065,291],[1001,292],[1000,222],[1058,293],[989,222],[990,294],[1057,295],[1095,296],[1098,297],[1096,298],[1097,299],[1009,300],[1008,222],[1100,301],[1099,227],[1078,302],[1077,222],[1033,303],[1032,222],[1104,304],[1103,305],[1072,306],[1071,307],[1069,308],[1070,309],[1061,310],[1060,311],[1059,312],[1168,313],[1167,314],[1085,315],[1084,316],[1083,317],[1132,318],[1131,4],[1076,319],[1075,320],[1073,321],[1074,322],[1054,323],[1053,227],[997,324],[996,325],[995,326],[994,327],[993,328],[1089,329],[1088,330],[1019,331],[1018,227],[1023,332],[1022,333],[1087,334],[1086,222],[1133,4],[1135,335],[1134,4],[1092,336],[1091,337],[1090,338],[1170,339],[1169,340],[1172,341],[1171,342],[1118,343],[1119,344],[1117,345],[1056,346],[1055,4],[1102,347],[1101,348],[1029,349],[1028,222],[1080,350],[1079,222],[986,351],[985,4],[1039,352],[1040,353],[1045,354],[1038,355],[1042,356],[1041,357],[1043,358],[1044,359],[1094,360],[1093,227],[1025,361],[1024,227],[1175,362],[1174,363],[1173,364],[1112,365],[1111,222],[1082,366],[1081,222],[1017,367],[1015,368],[1014,227],[1016,369],[1114,370],[1113,222],[1021,371],[1020,222],[1116,372],[1115,222],[972,373],[968,3],[970,374],[971,3],[973,4],[555,375],[939,376],[554,377],[974,4],[979,378],[978,379],[977,380],[975,4],[551,381],[556,382],[552,4],[980,4],[981,383],[982,384],[1183,385],[976,4],[534,386],[1184,4],[533,4],[826,387],[465,388],[466,388],[467,389],[468,390],[469,391],[470,392],[416,4],[419,393],[417,4],[418,4],[471,394],[472,395],[473,396],[474,397],[475,398],[476,399],[477,399],[478,400],[479,401],[480,402],[481,403],[422,4],[482,404],[483,405],[484,406],[485,407],[486,408],[487,409],[488,410],[489,411],[490,412],[491,413],[492,414],[493,415],[494,416],[495,416],[496,417],[497,4],[498,418],[500,419],[499,420],[501,421],[502,422],[503,423],[504,424],[505,425],[506,426],[507,427],[421,428],[420,4],[516,429],[508,430],[509,431],[510,432],[511,433],[512,434],[513,435],[423,4],[424,4],[425,4],[464,436],[514,437],[515,438],[755,439],[754,440],[557,441],[549,4],[550,4],[548,442],[553,443],[1185,4],[1194,444],[1186,4],[1189,445],[1192,446],[1193,447],[1187,448],[1190,449],[1188,450],[1199,451],[1196,452],[1198,4],[1197,453],[1195,454],[653,455],[644,4],[645,4],[646,4],[647,4],[648,4],[649,4],[650,4],[651,4],[652,4],[1200,4],[1201,456],[609,457],[608,4],[426,4],[984,4],[614,4],[616,458],[735,459],[739,459],[738,459],[736,459],[737,459],[740,459],[617,459],[629,459],[618,459],[631,459],[633,459],[626,459],[627,459],[628,459],[632,459],[634,459],[619,459],[630,459],[620,459],[622,460],[623,459],[624,459],[625,459],[641,459],[640,459],[743,461],[635,459],[637,459],[636,459],[638,459],[639,459],[742,459],[741,459],[642,459],[654,462],[655,462],[657,459],[703,459],[702,459],[723,459],[658,462],[700,459],[704,459],[659,459],[660,459],[661,462],[705,459],[699,462],[656,462],[706,459],[662,462],[707,459],[663,462],[687,459],[664,459],[708,459],[665,459],[697,462],[667,459],[668,459],[709,463],[670,459],[672,459],[673,459],[679,459],[680,459],[681,459],[674,462],[711,459],[698,462],[710,462],[675,459],[676,459],[712,459],[677,459],[669,462],[713,459],[696,459],[714,459],[678,462],[682,459],[683,459],[701,462],[715,459],[716,459],[695,464],[671,459],[717,462],[718,459],[719,459],[720,459],[721,462],[684,459],[722,459],[686,462],[688,459],[685,462],[666,459],[689,459],[692,459],[690,459],[691,459],[643,459],[725,459],[724,459],[726,459],[733,459],[727,459],[728,459],[730,459],[731,459],[729,459],[734,459],[732,459],[751,465],[749,466],[750,467],[748,468],[747,459],[746,469],[613,4],[615,4],[611,4],[744,4],[745,470],[621,458],[612,4],[517,471],[1182,472],[1191,473],[938,189],[1179,474],[1180,475],[1181,4],[694,476],[693,4],[1178,477],[55,4],[250,478],[223,4],[201,479],[199,479],[114,480],[65,481],[64,482],[200,483],[185,484],[107,485],[63,486],[62,487],[249,482],[214,488],[213,488],[125,489],[221,480],[222,480],[224,490],[225,480],[226,487],[227,480],[198,480],[228,480],[229,491],[230,480],[231,488],[232,492],[233,480],[234,480],[235,480],[236,480],[237,488],[238,480],[239,480],[240,480],[241,480],[242,493],[243,480],[244,480],[245,480],[246,480],[247,480],[67,487],[68,487],[69,487],[70,487],[71,487],[72,487],[73,487],[74,480],[76,494],[77,487],[75,487],[78,487],[79,487],[80,487],[81,487],[82,487],[83,487],[84,480],[85,487],[86,487],[87,487],[88,487],[89,487],[90,480],[91,487],[92,487],[93,487],[94,487],[95,487],[96,487],[97,480],[99,495],[98,487],[100,487],[101,487],[102,487],[103,487],[104,493],[105,480],[106,480],[120,496],[108,497],[109,487],[110,487],[111,480],[112,487],[113,487],[115,498],[116,487],[117,487],[118,487],[119,487],[121,487],[122,487],[123,487],[124,487],[126,499],[127,487],[128,487],[129,487],[130,480],[131,487],[132,500],[133,500],[134,500],[135,480],[136,487],[137,487],[138,487],[143,487],[139,487],[140,480],[141,487],[142,480],[144,487],[145,487],[146,487],[147,487],[148,487],[149,487],[150,480],[151,487],[152,487],[153,487],[154,487],[155,487],[156,487],[157,487],[158,487],[159,487],[160,487],[161,487],[162,487],[163,487],[164,487],[165,487],[166,487],[167,501],[168,487],[169,487],[170,487],[171,487],[172,487],[173,487],[174,480],[175,480],[176,480],[177,480],[178,480],[179,487],[180,487],[181,487],[182,487],[248,480],[184,502],[207,503],[202,503],[193,504],[191,505],[205,506],[194,507],[208,508],[203,509],[204,506],[206,510],[192,4],[197,4],[189,511],[190,512],[187,4],[188,513],[186,487],[195,514],[66,515],[215,4],[216,4],[217,4],[218,4],[219,4],[220,4],[209,4],[212,488],[211,4],[210,516],[183,517],[196,518],[52,4],[53,4],[9,4],[10,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[4,4],[23,4],[27,4],[24,4],[25,4],[26,4],[28,4],[29,4],[30,4],[5,4],[31,4],[32,4],[33,4],[34,4],[6,4],[38,4],[35,4],[36,4],[37,4],[39,4],[7,4],[40,4],[45,4],[46,4],[41,4],[42,4],[43,4],[44,4],[8,4],[54,4],[50,4],[47,4],[48,4],[49,4],[1,4],[51,4],[12,4],[11,4],[442,519],[452,520],[441,519],[462,521],[433,522],[432,523],[461,471],[455,524],[460,525],[435,526],[449,527],[434,528],[458,529],[430,530],[429,471],[459,531],[431,532],[436,533],[437,4],[440,533],[427,4],[463,534],[453,535],[444,536],[445,537],[447,538],[443,539],[446,540],[456,471],[438,541],[439,542],[448,543],[428,544],[451,535],[450,533],[454,4],[457,545],[846,546],[940,547],[942,548],[941,549],[943,550],[788,551],[786,7],[794,552],[785,553],[787,554],[789,555],[791,555],[793,556],[790,555],[953,557],[792,555],[773,7],[777,558],[954,559],[753,560],[757,561],[610,553],[752,562],[756,563],[955,564],[795,556],[796,565],[833,566],[832,566],[834,567],[831,568],[956,569],[765,570],[766,571],[764,572],[762,573],[763,574],[761,572],[957,575],[798,576],[799,577],[797,572],[836,578],[837,579],[835,572],[958,580],[841,581],[842,582],[840,572],[804,583],[805,584],[803,572],[838,585],[839,586],[830,572],[781,587],[784,588],[780,589],[959,590],[960,591],[782,592],[783,593],[779,594],[961,595],[768,596],[769,597],[767,572],[962,598],[776,599],[775,600],[778,601],[774,602],[963,603],[801,604],[802,605],[800,572],[964,606],[844,607],[845,608],[843,572],[965,609],[771,610],[772,611],[770,572],[827,612],[829,613],[828,614],[966,615],[759,616],[760,617],[758,572],[532,572],[531,618]],"exportedModulesMap":[[529,1],[528,2],[969,3],[967,4],[983,4],[1177,5],[332,4],[319,4],[56,4],[308,6],[309,6],[310,4],[311,7],[321,8],[312,6],[313,9],[314,4],[315,4],[316,6],[317,6],[318,6],[320,10],[328,11],[330,4],[327,4],[334,12],[331,4],[329,4],[325,13],[326,14],[333,15],[335,16],[322,4],[324,17],[323,18],[262,4],[265,19],[261,4],[894,4],[263,4],[264,4],[338,20],[339,20],[340,20],[341,20],[342,20],[343,20],[344,20],[337,21],[345,20],[359,22],[346,20],[336,4],[347,20],[348,20],[349,20],[350,20],[351,20],[352,20],[353,20],[354,20],[355,20],[356,20],[357,20],[358,20],[367,23],[365,24],[364,4],[363,4],[366,25],[407,26],[57,4],[58,4],[59,4],[876,27],[61,28],[882,29],[881,30],[251,31],[252,28],[387,4],[281,4],[282,4],[388,32],[253,4],[389,4],[390,33],[60,4],[255,34],[256,35],[254,36],[257,34],[258,4],[260,37],[272,38],[273,4],[278,39],[274,4],[275,4],[276,4],[277,4],[279,4],[280,40],[286,41],[289,42],[287,4],[288,4],[307,43],[290,4],[291,4],[925,44],[271,45],[269,46],[267,47],[268,48],[270,4],[298,49],[292,4],[301,50],[294,51],[299,52],[297,53],[300,54],[295,55],[296,56],[284,57],[303,58],[285,59],[305,60],[306,61],[293,4],[302,4],[259,4],[266,62],[304,63],[373,64],[368,4],[374,65],[369,66],[370,67],[371,68],[372,69],[375,70],[380,71],[378,72],[379,72],[386,73],[376,4],[377,74],[381,71],[383,75],[385,76],[384,77],[399,78],[392,79],[393,80],[394,80],[395,81],[396,81],[397,80],[398,80],[391,82],[401,83],[400,84],[403,85],[402,86],[404,87],[360,88],[362,89],[283,4],[361,57],[405,90],[382,91],[406,92],[408,7],[520,93],[521,94],[525,95],[409,4],[415,96],[518,97],[519,98],[410,4],[411,4],[414,99],[412,4],[413,4],[523,4],[524,100],[522,101],[526,102],[806,103],[847,104],[867,105],[868,106],[869,4],[870,107],[871,108],[880,109],[873,110],[877,111],[885,112],[883,7],[884,113],[874,114],[886,4],[888,115],[889,116],[890,117],[879,118],[875,119],[899,120],[887,121],[914,122],[872,123],[915,124],[912,125],[913,7],[937,126],[862,127],[858,128],[860,129],[911,130],[853,131],[901,132],[900,4],[861,133],[908,134],[865,135],[909,4],[910,136],[863,137],[864,138],[859,139],[857,140],[852,4],[905,141],[918,142],[916,7],[848,7],[904,143],[849,14],[850,106],[851,144],[855,145],[854,146],[917,147],[856,148],[893,149],[891,115],[892,150],[902,14],[903,151],[906,152],[921,153],[922,154],[919,155],[920,156],[923,157],[924,158],[926,159],[898,160],[895,161],[896,6],[897,150],[928,162],[927,163],[934,164],[866,7],[930,165],[929,7],[932,166],[931,4],[933,167],[878,168],[907,169],[936,170],[935,7],[540,171],[536,172],[535,173],[537,4],[538,174],[539,175],[541,176],[542,4],[546,177],[560,178],[543,7],[545,179],[544,4],[547,180],[558,181],[559,182],[561,183],[810,184],[811,185],[825,186],[813,187],[812,188],[807,189],[808,4],[809,4],[824,190],[815,191],[816,191],[817,191],[818,191],[820,192],[819,191],[821,193],[822,194],[814,4],[823,195],[562,4],[563,4],[566,196],[588,197],[567,4],[568,4],[569,7],[571,4],[570,4],[589,4],[572,4],[573,198],[574,4],[575,7],[576,4],[577,199],[579,200],[580,4],[582,201],[583,200],[584,202],[590,203],[585,199],[586,199],[591,204],[596,205],[607,206],[587,4],[578,199],[595,207],[564,4],[581,208],[593,209],[594,4],[592,4],[597,210],[598,7],[603,211],[599,7],[600,7],[601,7],[602,7],[565,4],[605,202],[604,4],[606,212],[952,213],[950,214],[944,7],[945,4],[949,215],[946,216],[951,217],[948,218],[947,219],[530,220],[527,4],[1176,221],[987,222],[988,223],[1125,222],[1126,224],[1107,225],[1108,226],[991,227],[992,228],[1062,229],[1063,230],[1036,222],[1037,231],[1030,222],[1031,232],[1122,233],[1120,234],[1121,4],[1136,235],[1137,236],[1006,237],[1007,238],[1138,239],[1139,240],[1140,241],[1141,242],[998,243],[999,244],[1124,245],[1123,246],[1109,222],[1110,247],[1002,248],[1003,249],[1026,4],[1027,250],[1144,251],[1142,252],[1143,253],[1145,254],[1146,255],[1149,256],[1147,257],[1150,234],[1148,258],[1151,259],[1154,260],[1152,261],[1153,262],[1155,263],[1004,243],[1005,264],[1130,265],[1127,266],[1128,267],[1129,4],[1105,268],[1106,269],[1050,270],[1049,271],[1047,272],[1046,273],[1048,274],[1157,275],[1156,276],[1159,277],[1158,278],[1035,279],[1034,222],[1013,280],[1011,281],[1010,227],[1012,282],[1162,283],[1166,284],[1160,285],[1161,286],[1163,283],[1164,283],[1165,283],[1052,287],[1051,227],[1068,288],[1066,289],[1067,234],[1064,290],[1065,291],[1001,292],[1000,222],[1058,293],[989,222],[990,294],[1057,295],[1095,296],[1098,297],[1096,298],[1097,299],[1009,300],[1008,222],[1100,301],[1099,227],[1078,302],[1077,222],[1033,303],[1032,222],[1104,304],[1103,305],[1072,306],[1071,307],[1069,308],[1070,309],[1061,310],[1060,311],[1059,312],[1168,313],[1167,314],[1085,315],[1084,316],[1083,317],[1132,318],[1131,4],[1076,319],[1075,320],[1073,321],[1074,322],[1054,323],[1053,227],[997,324],[996,325],[995,326],[994,327],[993,328],[1089,329],[1088,330],[1019,331],[1018,227],[1023,332],[1022,333],[1087,334],[1086,222],[1133,4],[1135,335],[1134,4],[1092,336],[1091,337],[1090,338],[1170,339],[1169,340],[1172,341],[1171,342],[1118,343],[1119,344],[1117,345],[1056,346],[1055,4],[1102,347],[1101,348],[1029,349],[1028,222],[1080,350],[1079,222],[986,351],[985,4],[1039,352],[1040,353],[1045,354],[1038,355],[1042,356],[1041,357],[1043,358],[1044,359],[1094,360],[1093,227],[1025,361],[1024,227],[1175,362],[1174,363],[1173,364],[1112,365],[1111,222],[1082,366],[1081,222],[1017,367],[1015,368],[1014,227],[1016,369],[1114,370],[1113,222],[1021,371],[1020,222],[1116,372],[1115,222],[972,373],[968,3],[970,374],[971,3],[973,4],[555,375],[939,376],[554,377],[974,4],[979,378],[978,379],[977,380],[975,4],[551,381],[556,382],[552,4],[980,4],[981,383],[982,384],[1183,385],[976,4],[534,386],[1184,4],[533,4],[826,387],[465,388],[466,388],[467,389],[468,390],[469,391],[470,392],[416,4],[419,393],[417,4],[418,4],[471,394],[472,395],[473,396],[474,397],[475,398],[476,399],[477,399],[478,400],[479,401],[480,402],[481,403],[422,4],[482,404],[483,405],[484,406],[485,407],[486,408],[487,409],[488,410],[489,411],[490,412],[491,413],[492,414],[493,415],[494,416],[495,416],[496,417],[497,4],[498,418],[500,419],[499,420],[501,421],[502,422],[503,423],[504,424],[505,425],[506,426],[507,427],[421,428],[420,4],[516,429],[508,430],[509,431],[510,432],[511,433],[512,434],[513,435],[423,4],[424,4],[425,4],[464,436],[514,437],[515,438],[755,439],[754,440],[557,441],[549,4],[550,4],[548,442],[553,443],[1185,4],[1194,444],[1186,4],[1189,445],[1192,446],[1193,447],[1187,448],[1190,449],[1188,450],[1199,451],[1196,452],[1198,4],[1197,453],[1195,454],[653,455],[644,4],[645,4],[646,4],[647,4],[648,4],[649,4],[650,4],[651,4],[652,4],[1200,4],[1201,456],[609,457],[608,4],[426,4],[984,4],[614,4],[616,458],[735,459],[739,459],[738,459],[736,459],[737,459],[740,459],[617,459],[629,459],[618,459],[631,459],[633,459],[626,459],[627,459],[628,459],[632,459],[634,459],[619,459],[630,459],[620,459],[622,460],[623,459],[624,459],[625,459],[641,459],[640,459],[743,461],[635,459],[637,459],[636,459],[638,459],[639,459],[742,459],[741,459],[642,459],[654,462],[655,462],[657,459],[703,459],[702,459],[723,459],[658,462],[700,459],[704,459],[659,459],[660,459],[661,462],[705,459],[699,462],[656,462],[706,459],[662,462],[707,459],[663,462],[687,459],[664,459],[708,459],[665,459],[697,462],[667,459],[668,459],[709,463],[670,459],[672,459],[673,459],[679,459],[680,459],[681,459],[674,462],[711,459],[698,462],[710,462],[675,459],[676,459],[712,459],[677,459],[669,462],[713,459],[696,459],[714,459],[678,462],[682,459],[683,459],[701,462],[715,459],[716,459],[695,464],[671,459],[717,462],[718,459],[719,459],[720,459],[721,462],[684,459],[722,459],[686,462],[688,459],[685,462],[666,459],[689,459],[692,459],[690,459],[691,459],[643,459],[725,459],[724,459],[726,459],[733,459],[727,459],[728,459],[730,459],[731,459],[729,459],[734,459],[732,459],[751,465],[749,466],[750,467],[748,468],[747,459],[746,469],[613,4],[615,4],[611,4],[744,4],[745,470],[621,458],[612,4],[517,471],[1182,472],[1191,473],[938,189],[1179,474],[1180,475],[1181,4],[694,476],[693,4],[1178,477],[55,4],[250,478],[223,4],[201,479],[199,479],[114,480],[65,481],[64,482],[200,483],[185,484],[107,485],[63,486],[62,487],[249,482],[214,488],[213,488],[125,489],[221,480],[222,480],[224,490],[225,480],[226,487],[227,480],[198,480],[228,480],[229,491],[230,480],[231,488],[232,492],[233,480],[234,480],[235,480],[236,480],[237,488],[238,480],[239,480],[240,480],[241,480],[242,493],[243,480],[244,480],[245,480],[246,480],[247,480],[67,487],[68,487],[69,487],[70,487],[71,487],[72,487],[73,487],[74,480],[76,494],[77,487],[75,487],[78,487],[79,487],[80,487],[81,487],[82,487],[83,487],[84,480],[85,487],[86,487],[87,487],[88,487],[89,487],[90,480],[91,487],[92,487],[93,487],[94,487],[95,487],[96,487],[97,480],[99,495],[98,487],[100,487],[101,487],[102,487],[103,487],[104,493],[105,480],[106,480],[120,496],[108,497],[109,487],[110,487],[111,480],[112,487],[113,487],[115,498],[116,487],[117,487],[118,487],[119,487],[121,487],[122,487],[123,487],[124,487],[126,499],[127,487],[128,487],[129,487],[130,480],[131,487],[132,500],[133,500],[134,500],[135,480],[136,487],[137,487],[138,487],[143,487],[139,487],[140,480],[141,487],[142,480],[144,487],[145,487],[146,487],[147,487],[148,487],[149,487],[150,480],[151,487],[152,487],[153,487],[154,487],[155,487],[156,487],[157,487],[158,487],[159,487],[160,487],[161,487],[162,487],[163,487],[164,487],[165,487],[166,487],[167,501],[168,487],[169,487],[170,487],[171,487],[172,487],[173,487],[174,480],[175,480],[176,480],[177,480],[178,480],[179,487],[180,487],[181,487],[182,487],[248,480],[184,502],[207,503],[202,503],[193,504],[191,505],[205,506],[194,507],[208,508],[203,509],[204,506],[206,510],[192,4],[197,4],[189,511],[190,512],[187,4],[188,513],[186,487],[195,514],[66,515],[215,4],[216,4],[217,4],[218,4],[219,4],[220,4],[209,4],[212,488],[211,4],[210,516],[183,517],[196,518],[52,4],[53,4],[9,4],[10,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[4,4],[23,4],[27,4],[24,4],[25,4],[26,4],[28,4],[29,4],[30,4],[5,4],[31,4],[32,4],[33,4],[34,4],[6,4],[38,4],[35,4],[36,4],[37,4],[39,4],[7,4],[40,4],[45,4],[46,4],[41,4],[42,4],[43,4],[44,4],[8,4],[54,4],[50,4],[47,4],[48,4],[49,4],[1,4],[51,4],[12,4],[11,4],[442,519],[452,520],[441,519],[462,521],[433,522],[432,523],[461,471],[455,524],[460,525],[435,526],[449,527],[434,528],[458,529],[430,530],[429,471],[459,531],[431,532],[436,533],[437,4],[440,533],[427,4],[463,534],[453,535],[444,536],[445,537],[447,538],[443,539],[446,540],[456,471],[438,541],[439,542],[448,543],[428,544],[451,535],[450,533],[454,4],[457,545],[846,546],[940,547],[942,548],[941,549],[943,550],[788,619],[786,7],[785,553],[787,620],[789,555],[791,621],[793,620],[790,622],[953,557],[792,555],[753,560],[757,561],[610,553],[752,562],[756,563],[955,564],[795,556],[796,565],[833,566],[832,566],[834,567],[831,568],[956,569],[765,570],[766,571],[764,572],[762,573],[763,574],[761,572],[957,575],[798,576],[799,577],[797,572],[836,578],[837,579],[835,572],[958,580],[841,581],[842,582],[840,572],[804,583],[805,584],[803,572],[838,585],[839,586],[830,572],[781,623],[780,624],[959,625],[782,626],[779,620],[768,596],[769,597],[767,572],[962,598],[776,627],[775,628],[774,629],[801,604],[802,605],[800,572],[964,606],[844,607],[845,608],[843,572],[965,609],[771,610],[772,611],[770,572],[827,612],[829,613],[828,614],[966,615],[759,616],[760,617],[758,572],[532,572],[531,618]],"semanticDiagnosticsPerFile":[529,528,969,967,983,1177,332,319,56,308,309,310,311,321,312,313,314,315,316,317,318,320,328,330,327,334,331,329,325,326,333,335,322,324,323,262,265,261,894,263,264,338,339,340,341,342,343,344,337,345,359,346,336,347,348,349,350,351,352,353,354,355,356,357,358,367,365,364,363,366,407,57,58,59,876,61,882,881,251,252,387,281,282,388,253,389,390,60,255,256,254,257,258,260,272,273,278,274,275,276,277,279,280,286,289,287,288,307,290,291,925,271,269,267,268,270,298,292,301,294,299,297,300,295,296,284,303,285,305,306,293,302,259,266,304,373,368,374,369,370,371,372,375,380,378,379,386,376,377,381,383,385,384,399,392,393,394,395,396,397,398,391,401,400,403,402,404,360,362,283,361,405,382,406,408,520,521,525,409,415,518,519,410,411,414,412,413,523,524,522,526,806,847,867,868,869,870,871,880,873,877,885,883,884,874,886,888,889,890,879,875,899,887,914,872,915,912,913,937,862,858,860,911,853,901,900,861,908,865,909,910,863,864,859,857,852,905,918,916,848,904,849,850,851,855,854,917,856,893,891,892,902,903,906,921,922,919,920,923,924,926,898,895,896,897,928,927,934,866,930,929,932,931,933,878,907,936,935,540,536,535,537,538,539,541,542,546,560,543,545,544,547,558,559,561,810,811,825,813,812,807,808,809,824,815,816,817,818,820,819,821,822,814,823,562,563,566,588,567,568,569,571,570,589,572,573,574,575,576,577,579,580,582,583,584,590,585,586,591,596,607,587,578,595,564,581,593,594,592,597,598,603,599,600,601,602,565,605,604,606,952,950,944,945,949,946,951,948,947,530,527,1176,987,988,1125,1126,1107,1108,991,992,1062,1063,1036,1037,1030,1031,1122,1120,1121,1136,1137,1006,1007,1138,1139,1140,1141,998,999,1124,1123,1109,1110,1002,1003,1026,1027,1144,1142,1143,1145,1146,1149,1147,1150,1148,1151,1154,1152,1153,1155,1004,1005,1130,1127,1128,1129,1105,1106,1050,1049,1047,1046,1048,1157,1156,1159,1158,1035,1034,1013,1011,1010,1012,1162,1166,1160,1161,1163,1164,1165,1052,1051,1068,1066,1067,1064,1065,1001,1000,1058,989,990,1057,1095,1098,1096,1097,1009,1008,1100,1099,1078,1077,1033,1032,1104,1103,1072,1071,1069,1070,1061,1060,1059,1168,1167,1085,1084,1083,1132,1131,1076,1075,1073,1074,1054,1053,997,996,995,994,993,1089,1088,1019,1018,1023,1022,1087,1086,1133,1135,1134,1092,1091,1090,1170,1169,1172,1171,1118,1119,1117,1056,1055,1102,1101,1029,1028,1080,1079,986,985,1039,1040,1045,1038,1042,1041,1043,1044,1094,1093,1025,1024,1175,1174,1173,1112,1111,1082,1081,1017,1015,1014,1016,1114,1113,1021,1020,1116,1115,972,968,970,971,973,555,939,554,974,979,978,977,975,551,556,552,980,981,982,1183,976,534,1184,533,826,465,466,467,468,469,470,416,419,417,418,471,472,473,474,475,476,477,478,479,480,481,422,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,500,499,501,502,503,504,505,506,507,421,420,516,508,509,510,511,512,513,423,424,425,464,514,515,755,754,557,549,550,548,553,1185,1194,1186,1189,1192,1193,1187,1190,1188,1199,1196,1198,1197,1195,653,644,645,646,647,648,649,650,651,652,1200,1201,609,608,426,984,614,616,735,739,738,736,737,740,617,629,618,631,633,626,627,628,632,634,619,630,620,622,623,624,625,641,640,743,635,637,636,638,639,742,741,642,654,655,657,703,702,723,658,700,704,659,660,661,705,699,656,706,662,707,663,687,664,708,665,697,667,668,709,670,672,673,679,680,681,674,711,698,710,675,676,712,677,669,713,696,714,678,682,683,701,715,716,695,671,717,718,719,720,721,684,722,686,688,685,666,689,692,690,691,643,725,724,726,733,727,728,730,731,729,734,732,751,749,750,748,747,746,613,615,611,744,745,621,612,517,1182,1191,938,1179,1180,1181,694,693,1178,55,250,223,201,199,114,65,64,200,185,107,63,62,249,214,213,125,221,222,224,225,226,227,198,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,67,68,69,70,71,72,73,74,76,77,75,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,98,100,101,102,103,104,105,106,120,108,109,110,111,112,113,115,116,117,118,119,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,143,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,248,184,207,202,193,191,205,194,208,203,204,206,192,197,189,190,187,188,186,195,66,215,216,217,218,219,220,209,212,211,210,183,196,52,53,9,10,14,13,2,15,16,17,18,19,20,21,22,3,4,23,27,24,25,26,28,29,30,5,31,32,33,34,6,38,35,36,37,39,7,40,45,46,41,42,43,44,8,54,50,47,48,49,1,51,12,11,442,452,441,462,433,432,461,455,460,435,449,434,458,430,429,459,431,436,437,440,427,463,453,444,445,447,443,446,456,438,439,448,428,451,450,454,457,846,940,942,941,943,788,786,794,785,787,789,791,793,790,953,792,773,777,954,753,757,610,752,756,955,795,796,833,832,834,831,956,765,766,764,762,763,761,957,798,799,797,836,837,835,958,841,842,840,804,805,803,838,839,830,781,784,780,959,960,782,783,779,961,768,769,767,962,776,775,778,774,963,801,802,800,964,844,845,843,965,771,772,770,827,829,828,966,759,760,758,532,531]},"version":"5.3.3"} \ No newline at end of file diff --git a/backend/uploads/843b1def-80bc-4339-9795-5a792512b1f4.png b/backend/uploads/843b1def-80bc-4339-9795-5a792512b1f4.png old mode 100644 new mode 100755 diff --git a/backend/uploads/bba131c5-d294-46ae-a944-f07d0efe24fa.png b/backend/uploads/bba131c5-d294-46ae-a944-f07d0efe24fa.png old mode 100644 new mode 100755 diff --git a/backend/uploads/d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png b/backend/uploads/d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d17f21f..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,74 +0,0 @@ -version: '3.8' - -services: - mysql: - image: mysql:8.0 - container_name: yuzhiran-mysql - restart: unless-stopped - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} - MYSQL_DATABASE: yuzhiran - MYSQL_USER: yuzhiran - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-yuzhiran123} - ports: - - "3306:3306" - volumes: - - mysql_data:/var/lib/mysql - - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] - interval: 10s - timeout: 5s - retries: 5 - - backend: - build: - context: ./backend - dockerfile: Dockerfile - container_name: yuzhiran-backend - restart: unless-stopped - ports: - - "4000:4000" - environment: - NODE_ENV: production - PORT: 4000 - DATABASE_URL: mysql://yuzhiran:${MYSQL_PASSWORD:-yuzhiran123}@mysql:3306/yuzhiran - JWT_SECRET: ${JWT_SECRET:-yuzhiran-jwt-secret-2024} - volumes: - - ./backend/uploads:/app/uploads - depends_on: - mysql: - condition: service_healthy - healthcheck: - test: ["CMD", "wget", "--spider", "http://localhost:4000/api/docs"] - interval: 30s - timeout: 10s - retries: 3 - - frontend: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: yuzhiran-frontend - restart: unless-stopped - ports: - - "3000:3000" - environment: - NODE_ENV: production - NEXT_PUBLIC_API_URL: http://localhost:4000 - depends_on: - - backend - - # Uncomment when Redis is available: - # redis: - # image: redis:7-alpine - # container_name: yuzhiran-redis - # restart: unless-stopped - # ports: - # - "6379:6379" - # volumes: - # - redis_data:/data - -volumes: - mysql_data: - # redis_data: diff --git a/docs/admin-system-plan.md b/docs/admin-system-plan.md old mode 100644 new mode 100755 diff --git a/docs/archive/progress-2026-05-12-before-notifications.md b/docs/archive/progress-2026-05-12-before-notifications.md old mode 100644 new mode 100755 diff --git a/docs/design-tokens.md b/docs/design-tokens.md old mode 100644 new mode 100755 diff --git a/docs/progress.md b/docs/progress.md old mode 100644 new mode 100755 index f21920e..b351e18 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,8 +1,8 @@ # 项目进度追踪 -## 当前阶段:P3 — 体验增强 +## 当前阶段:P4 — 支付闭环 + 部署 -### Phase 1-3 — 全部完成 ✅ +### Phase 1-4 — 全部完成 ✅ ### P0 — 全局优化(全部完成 ✅) | 子项 | 说明 | 状态 | @@ -36,74 +36,203 @@ | **P3c** | 会话重命名 | PATCH endpoint + 双击编辑 | ✅ | | — | SDK / 共享 UI 包 | 远期规划 | 📋 | -### 参考来源 -- opencode 源码克隆到 `/tmp/opencode-source/`(21 packages, 147MB) - -### P4 — 支付闭环(进行中 🔄) +### P4 — 支付闭环 + 统一网关(已完成 ✅) | 子项 | 说明 | 状态 | |------|------|------| -| **P4a** | Mock 支付自动完成 — `PaymentService.completeMockPayment()` + `OrdersService` 检测 mock 结果后自动调用 | ✅ | -| **P4b** | 会员页面 mock 提示优化 — 显示"订阅成功"而非"请扫码支付" | ✅ | -| **P4c** | 真实微信支付证书部署 — 商户证书/密钥已安装到 `backend/cert/key/`,参数与 `.env` 一致 | ✅ | -| **P4d** | 下单切 NATIVE 扫码支付 — 默认 `tradeType: 'NATIVE'`,前端展示二维码 Modal + 轮询支付状态 | ✅ | -| **P4e** | JSAPI 支付集成 — 检测微信环境 + openid,在 Mini Program web-view 内自动调起 `WeixinJSBridge`;其他场景 NATIVE 兜底 | ✅ | +| **P4a** | 统一支付网关集成 — `GatewayPayService` HMAC-SHA256 对接 yzrcloud.cn 网关,支持支付宝/微信 | ✅ | +| **P4b** | 会员页双支付按钮 — 支付宝/微信可选,统一走网关 | ✅ | +| **P4c** | 网关 Webhook 接收 — `POST /api/v1/payment/gateway/webhook`,处理 `recharge.completed` / `order.refunded` | ✅ | +| **P4d** | 管理后台订单增强 — 搜索/分页/渠道筛选/退款弹窗/标记已付 | ✅ | +| **P4e** | Mock 降级 — 网关不可达时自动 mock 完成支付,不影响开发 | ✅ | | — | 订阅到期提醒 / 自动续费 | 📋 远期 | -| — | 获取公众号 appid 后补充 Web OAuth 流程 | 📋 待定 | ### P5 — 运营助手(已完成 ✅) | 子项 | 说明 | 状态 | |------|------|------| -| **P5a** | 新增 `POST /admin/ai-assistant/chat` 端点 — 管理员专用 AI 聊天,使用 AdminGuard | ✅ | -| **P5b** | 新增 `AdminAiAssistantService` — 19 个可执行工具定义(查看数据/用户管理/评论审核/状态切换等) | ✅ | -| **P5c** | 新增 `POST /admin/ai-assistant/action` 端点 — 工具执行 + AI 自然语言总结 | ✅ | -| **P5d** | 前端运营助手改造 — Tool Calling 架构,AI 自动识别用户意图→调用工具→解释结果→展示 | ✅ | -| **P5e** | system prompt 动态注入可用工具列表,覆盖仪表盘/用户/订单/评论/Banner/通知/配置/角色/企业版等 | ✅ | +| **P5a** | 新增 `POST /admin/ai-assistant/chat` 端点 — 管理员专用 AI 聊天 | ✅ | +| **P5b** | `AdminAiAssistantService` — 19 个可执行工具定义 | ✅ | +| **P5c** | `POST /admin/ai-assistant/action` — 工具执行 + AI 总结 | ✅ | +| **P5d** | 前端 Tool Calling 架构 — AI 自动识别意图→调用→解释→展示 | ✅ | +| **P5e** | system prompt 动态注入工具列表 | ✅ | -### 关键决策 -- `frontend/src/lib/models.ts` 作为模型列表单数据源 -- 所有颜色使用 CSS 变量(`text-foreground`/`text-muted-foreground`/`bg-card`/`bg-muted`/`border-border`) -- `nest build` 正常产出(`--tsc` 遗漏 prisma 模块) -- 沙盒 JWT 认证保留 -- Mock 支付自动完成闭环,无需手动触发回调;真实微信支付上线后自动切换 -- 运营助手采用 Tool Calling 架构:system prompt 描述工具 → AI 返回 JSON 工具调用 → 后端执行 → 结果喂回 AI 总结 → 展示给用户 +--- -## 2026-05-27 Session +## 部署架构 + +### 域名概况 + +| 域名 | 类型 | 说明 | 状态 | +|------|------|------|------| +| **www.yuzhiran.com** | AI 学习平台 | 前端静态导出 + NestJS 后端 | 🟢 线上 | +| **trade.yuzhiran.com** | 另一项目(非 AI 平台) | SPA 应用,独立后端 8002 端口 | 🟢 线上 | +| **alvnc.yuzhiran.com** | 其他服务 | — | 🟢 线上 | + +### www.yuzhiran.com 部署详情 + +``` +用户 → Nginx (443/80) → /api/* → backend (127.0.0.1:4000) + → /* → static files (/www/wwwroot/www.yuzhiran.com/) +``` + +| 组件 | 技术栈 | 运行方式 | 端口 | +|------|--------|---------|------| +| **前端** | Next.js 14 App Router → `output: 'export'` 静态 HTML | Nginx 直接提供 `/www/wwwroot/www.yuzhiran.com/` | 443/80 | +| **后端** | NestJS + Prisma + MySQL | PM2 (`yuzhiran-api`) | 4000 | +| **数据库** | MySQL 8.0 | systemd (`ai_leaning`) | 3306 | +| **Web 服务器** | Nginx (宝塔面板) | systemd | 443/80 | +| **支付网关** | yzrcloud.cn 统一网关 | 外部服务 | 8100(内网) | + +**Nginx 配置** (`/www/server/panel/vhost/nginx/www.yuzhiran.com.conf`): +- 静态资源 `/` → `try_files $uri $uri.html $uri/index.html =404` +- API 代理 `/api/` → `proxy_pass http://127.0.0.1:4000` +- 静态资源缓存: `_next/static/` 365 天, 图片 30 天, JS/CSS 12 小时 + +**部署流程**: +```bash +# 前端 +cd frontend && npm run build # 生成 out/ +cp -r out/* /www/wwwroot/www.yuzhiran.com/ + +# 后端 +cd backend && npm run build # 生成 dist/ +pm2 restart yuzhiran-api +``` + +### trade.yuzhiran.com(独立项目) + +非 AI 学习平台项目,独立部署: +- 前端 SPA (React),root at `/www/wwwroot/trade.yuzhiran.com/` +- 后端 API at `127.0.0.1:8002` +- 路由: `/admin/` → SPA fallback, `/workspace/` → SPA fallback + +--- + +## 支付对接 + +### 架构总览 + +``` +前端 (会员页) → POST /orders/create → GatewayPayService → HMAC-SHA256 → yzrcloud.cn 网关 + ├── 支付宝 PC 网站 + └── 微信 Native 扫码 +网关回调 → POST /api/v1/payment/gateway/webhook → 更新订单 + 激活订阅 +``` + +### 统一支付网关对接参数 + +| 参数 | 值 | 来源 | +|------|-----|------| +| 网关地址(内网) | `http://localhost:8100` | `.env` | +| 网关地址(外网) | `https://www.yzrcloud.cn/api/gateway` | 未启用 | +| API Key | `pay_2ac89d9831244c2ebdbb2a24` | AI学习平台.key | +| API Secret | `6a2e6c6801384bd0800849ef42ad5e8ef51898819895478a` | AI学习平台.key | +| 签名算法 | HMAC-SHA256 | `sign_str = "{method}\n{path}\n{timestamp}\n{body_sha256}"` | +| Webhook | `POST /api/v1/payment/gateway/webhook` | 后端接收 | +| 支付方式 | `alipay` / `wechat` | 网关统一处理 | +| Mock 模式 | `GATEWAY_PAY_MOCK=true` | 开发环境启用 | + +### 后端对接文件 + +| 文件 | 说明 | +|------|------| +| `backend/src/modules/payment/gateway-pay.service.ts` | 核心网关服务,HMAC 签名 + 下单/查询/退款/Webhook | +| `backend/src/modules/payment/payment.controller.ts` | `/api/v1/payment/gateway/webhook` 等端点 | +| `backend/src/modules/orders/orders.service.ts` | 下单路由,统一走网关 | +| `backend/.env` | `GATEWAY_PAY_*` 配置项 | + +### API 端点一览 + +| 方法 | 路径 | 说明 | 认证 | +|------|------|------|------| +| POST | `/api/v1/payment/gateway/webhook` | 网关支付成功/退款回调 | 无(网关签名在 body 中) | +| GET | `/api/v1/payment/wxpay/query?outTradeNo=xxx` | 订单状态查询(转网关) | JWT | +| POST | `/api/v1/payment/wxpay/refund` | 退款(转网关) | JWT | +| POST | `/api/v1/orders/create` | 创建订单+发起支付 | JWT | +| GET | `/api/v1/admin/orders?page=&search=&status=&payChannel=` | 管理员订单搜索 | Admin JWT | +| POST | `/api/v1/admin/orders/:orderNo/refund` | 管理员退款 | Admin JWT | +| POST | `/api/v1/admin/orders/:orderNo/mark-paid` | 标记人工已付 | Admin JWT | + +### 商户密钥文件 + +备份位置: `/root/hermes-workspace/backup/网关支付/pay-api/merchants/AI学习平台.key` + +--- + +## 2026-05-31 Session (下午) ### Changes Made -- **Fixed OpenAI default model**: Changed `OPENAI_MODEL` in `.env` from `meituan/longcat-flash-lite` (invalid, returned 400) to `deepseek/deepseek-v4-flash` (confirmed working on qnaigc API). The "通用模式" (general model) now returns real AI responses instead of mock fallback. -- **Fixed empty content handling**: Updated `OpenAICompatibleProvider.chat()` to fall back to `reasoning_content` when `content` is empty (SenseNova models return content in `reasoning_content`). Same fix applied in `chatStream()` for delta content. +- **AI 助手架构升级**: 用户端 + 管理后台双 AI 助手均采用完整 Tool Calling 架构 +- **新增 `UserAiAssistantService`**: 后台工具执行服务,18 个工具(搜索/技能/学情/通知/个人信息/模型/提示词/课程/订单) +- **新增 `AiAssistantController`**: `POST /api/v1/ai-assistant/chat` + `/action` 端点 +- **新增 `AiAssistantModule`**: 注册 SkillsModule + AIModule 依赖 +- **重写前端 `ai-assistant.tsx`**: Tool Calling 架构 + 页面感知上下文 + 登录控制 +- **更新前端 `admin-ai-assistant.tsx`**: 新增 search/mark-all-notifications-read 工具描述 + 更多 starter +- **新增后台 `search`/`mark-all-notifications-read` 工具**: 全局搜索用户/订单/课程/内容 + 通知批量已读 +- **重构 `assistant-actions.ts`**: 统一 `executeClientAction()` API,支持所有客户端操作 +- **清理 `assistant-context.ts`**: 精简为纯上下文数据源,移除旧 action 格式 + +### 用户端 AI 助手可用操作 +| 分类 | 工具 | +|------|------| +| 🧭 导航 | `navigate` — 跳转到任意页面 | +| 🔍 搜索 | `search` — 全局搜索课程/提示词/工具/文章 | +| 🎯 技能 | `list-skills` / `get-skill` / `get-skill-categories` | +| 📊 学情 | `get-learning-analytics` / `get-learning-path` | +| 🔔 通知 | `list-notifications` / `get-unread-count` / `mark-notification-read` / `mark-all-read` | +| 👤 个人 | `get-profile` / `list-user-orders` / `get-current-subscription` | +| 📚 内容 | `list-models` / `list-prompts` / `list-courses` | +| ⚡ 客户端 | `setModel` / `startChat` / `openSkill` / `setParameter` | + +### 管理后台新增工具 +| 工具 | 说明 | +|------|------| +| `search` | 全局搜索用户/订单/课程/内容 | +| `mark-all-notifications-read` | 批量标记所有通知已读 | ### Verification -- Backend successfully registers: `OpenAI 兼容接口已注册: deepseek/deepseek-v4-flash` -- 5 test chat requests to `POST /api/v1/sandbox/chat` with `model:"general"` all returned 201 in 1.3-12.7s (vs. previous mock/fallback) -- No more `AIGatewayService` "调用失败" errors in logs for OpenAI provider -- Backend runs under PM2 (v7.0.1), managed via `pm2 restart backend --update-env` +- ✅ 后端 92 项测试全部通过 +- ✅ 后端 TypeScript 编译无错误 +- ✅ 前端 75 静态页面全部生成成功 +- ✅ 所有文件创建/修改完成 -### Known Issues -- SenseNova API (`token.sensenova.cn`) still returns 404 "model is not found" for `deepseek-v4-flash` et al — models might need different naming on that endpoint -- Server: backend `node dist/main.js` on port 4000, frontend Next.js on port 3000, both managed by PM2 +--- +- `frontend/src/lib/models.ts` 作为模型列表单数据源 +- 所有颜色使用 CSS 变量(`text-foreground`/`text-muted-foreground`/`bg-card`/`bg-muted`/`border-border`) +- 沙盒 JWT 认证保留 +- 支付全部通过 yzrcloud.cn 统一网关处理,支持支付宝/微信 +- 运营助手采用 Tool Calling 架构 +- 前端静态导出 (`output: 'export'`) + Nginx 直接提供 +- 注册支持用户名、手机号、邮箱三选一,登录支持用户名/手机号/邮箱 +- 注册时校验重复用户名/手机号/邮箱并返回友好提示 +- 镜像站点 `www.yuzhiran.com.cn` 与主站配置同步 -### 2026-05-27 后续优化 +--- -**彻底修复 CSS 丢失问题** +## 2026-06-01 Session — 注册优化 + 镜像站部署 -根本原因:PM2 用 `npm run dev`(`next dev`)运行前端,每次重启都会重新编译,`.next` 缓存被销毁导致 CSS 丢失。 +### Changes Made +- **Prisma User 模型**: 新增 `username` 字段 (`String? @unique`) +- **注册 DTO**: 新增 `username` 字段验证(2-20位,支持中英文/数字/下划线) +- **注册逻辑重构** (`auth.service.ts`): + - 注册前分别检查 username/phone/email 是否已存在 → 友好提示 + - 三字段至少需提供一个 + - 注册成功用 username 做默认 nickname +- **登录逻辑** (`auth.service.ts`): `OR` 查询增加 `{ username: account }` +- **前端 i18n**: 新增 `username`/`usernameOptional`/`usernameConflict`/`phoneConflict`/`emailConflict` 翻译 key +- **前端 auth 页**: + - 注册表单增加用户名输入框 + - 前端预校验用户名格式(2-20位,中英文/数字/下划线) + - 友好错误映射:覆盖用户名/手机号/邮箱冲突提示 + - 登录框提示改为 "用户名 / 手机号 / 邮箱" +- **镜像站部署**: + - 前端静态文件部署至 `/www/wwwroot/www.yuzhiran.com.cn/` + - Nginx vhost 配置同步主站:Next.js clean URL + API proxy + 静态缓存 + - Nginx reload + PM2 restart -解决方案:改用 `output: 'export'` 静态导出 + 独立 HTTP 服务器。 - -| 文件 | 变更 | -|------|------| -| `frontend/server.js` | **新增** — Node.js 静态文件服务器,支持 Next.js 静态导出 URL 模式(`/about` → `about.html`),CSS/JS 缓存一年,HTML 不缓存 | -| `ecosystem.config.js` | 前端从 `npm run dev` 改为 `node server.js`,NODE_ENV=production | -| `frontend/package.json` | `predev` 改为仅删 `out/`,不再删 `.next/` | - -部署流程: -1. `npm run build` → 生成 `out/` 静态目录 -2. PM2 运行 `node server.js` → 直接提供静态文件 -3. 重启后 CSS 不变,无需重新编译 - -当前状态: -- 前端 `localhost:3000` (static server, 无编译延迟) -- 后端 `localhost:4000` (NestJS) -- 所有路由正常 (/, /about, /sandbox 均为 200) -- CSS 持久化,重启后不丢失 +### Verification +- ✅ Prisma db push 成功(`username` 列 + 唯一索引) +- ✅ 后端 92 项测试全部通过 +- ✅ 后端 TypeScript 编译无错误 +- ✅ 前端 75 静态页面全部生成成功 +- ✅ Nginx 配置语法验证通过 +- ✅ 主站 + 镜像站均已部署 diff --git a/docs/产品优化方向.md b/docs/产品优化方向.md old mode 100644 new mode 100755 diff --git a/docs/产品规划书.md b/docs/产品规划书.md old mode 100644 new mode 100755 diff --git a/docs/合规与运营方案.md b/docs/合规与运营方案.md old mode 100644 new mode 100755 diff --git a/docs/技术架构设计.md b/docs/技术架构设计.md old mode 100644 new mode 100755 diff --git a/ecosystem.config.js b/ecosystem.config.js old mode 100644 new mode 100755 index 3b4f141..7c80eea --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -1,8 +1,10 @@ +const path = require('path'); + module.exports = { apps: [ { name: 'backend', - cwd: '/home/wlt/ai-learning-platform/backend', + cwd: path.resolve(__dirname, 'backend'), script: 'node', args: 'dist/main.js', instances: 1, @@ -10,22 +12,8 @@ module.exports = { watch: false, max_restarts: 10, env: { - NODE_ENV: 'development' - } - }, - { - name: 'frontend', - cwd: '/home/wlt/ai-learning-platform/frontend', - script: 'node', - args: 'server.js', - instances: 1, - autorestart: true, - watch: false, - max_restarts: 3, - env: { - NODE_ENV: 'production', - PORT: 3000 + NODE_ENV: 'production' } } ] -} \ No newline at end of file +}; diff --git a/frontend/.dockerignore b/frontend/.dockerignore old mode 100644 new mode 100755 diff --git a/frontend/.env.example b/frontend/.env.example old mode 100644 new mode 100755 diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json new file mode 100644 index 0000000..d2b3044 --- /dev/null +++ b/frontend/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": "next", + "rules": {} +} diff --git a/frontend/.gitignore b/frontend/.gitignore old mode 100644 new mode 100755 diff --git a/frontend/Dockerfile b/frontend/Dockerfile old mode 100644 new mode 100755 index 5448c9e..40e3d08 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -16,18 +16,16 @@ WORKDIR /app RUN apk add --no-cache tini -COPY --from=builder /app/.next ./.next +COPY --from=builder /app/out ./out COPY --from=builder /app/public ./public -COPY --from=builder /app/package*.json ./ -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/next.config*.js ./ +COPY --from=builder /app/server.js ./server.js ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3000 EXPOSE 3000 USER node ENTRYPOINT ["/sbin/tini", "--"] -CMD ["npm", "run", "start"] +CMD ["node", "server.js"] diff --git a/frontend/e2e/admin-pages.spec.ts b/frontend/e2e/admin-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/dark-mode.spec.ts b/frontend/e2e/dark-mode.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/functional-pages.spec.ts b/frontend/e2e/functional-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/homepage.spec.ts b/frontend/e2e/homepage.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/listing-pages.spec.ts b/frontend/e2e/listing-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/navigation.spec.ts b/frontend/e2e/navigation.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/not-found.spec.ts b/frontend/e2e/not-found.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/static-pages.spec.ts b/frontend/e2e/static-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/user-pages.spec.ts b/frontend/e2e/user-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts old mode 100644 new mode 100755 diff --git a/frontend/next.config.js b/frontend/next.config.js old mode 100644 new mode 100755 index bb2ec14..5bf8cc8 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -4,7 +4,7 @@ const nextConfig = { images: { unoptimized: true }, typescript: { ignoreBuildErrors: true }, env: { - NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'https://api.yuzhiran.com', + NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || '/api/v1', NEXT_PUBLIC_SITE_URL: 'https://yuzhiran.com', NEXT_PUBLIC_SITE_NAME: '宇之然 AI', }, diff --git a/frontend/package-lock.json b/frontend/package-lock.json old mode 100644 new mode 100755 index 99caaa1..a0a3dc9 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -48,7 +48,11 @@ "@types/qrcode": "^1.5.6", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "@vitejs/plugin-react": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-next": "^16.2.6", "jsdom": "^29.1.1", "vitest": "^4.1.5" } @@ -124,14 +128,13 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -139,17 +142,213 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", @@ -160,6 +359,54 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bramus/specificity": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", @@ -347,6 +594,126 @@ "tslib": "^2.4.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@exodus/bytes": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", @@ -403,6 +770,75 @@ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -413,6 +849,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -463,6 +910,46 @@ "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", "license": "MIT" }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", @@ -642,6 +1129,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmmirror.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@oxc-project/types": { "version": "0.128.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", @@ -2841,6 +3338,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -3042,6 +3546,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "25.6.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", @@ -3085,6 +3596,589 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vitejs/plugin-react": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", @@ -3231,6 +4325,46 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3279,6 +4413,13 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", @@ -3301,6 +4442,166 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -3311,6 +4612,23 @@ "node": ">=12" } }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/autoprefixer": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", @@ -3347,6 +4665,52 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmmirror.com/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.27", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", @@ -3381,6 +4745,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -3437,6 +4814,66 @@ "node": ">=10.16.0" } }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3484,6 +4921,39 @@ "node": ">=18" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3582,6 +5052,13 @@ "node": ">= 6" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3589,6 +5066,21 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -3739,6 +5231,13 @@ "node": ">=12" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -3753,6 +5252,78 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -3773,6 +5344,49 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3816,6 +5430,19 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -3824,6 +5451,21 @@ "license": "MIT", "peer": true }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.352", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", @@ -3848,6 +5490,85 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -3857,6 +5578,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", @@ -3864,6 +5613,66 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-toolkit": { "version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", @@ -3878,6 +5687,712 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -3888,6 +6403,16 @@ "@types/estree": "^1.0.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", @@ -3903,6 +6428,13 @@ "node": ">=12.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -3931,6 +6463,20 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -3940,6 +6486,19 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3964,6 +6523,44 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -4004,6 +6601,13 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4027,6 +6631,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -4035,6 +6690,31 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -4044,6 +6724,73 @@ "node": ">=6" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4056,12 +6803,174 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -4074,6 +6983,23 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/highlight.js": { "version": "11.11.1", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", @@ -4095,6 +7021,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/immer": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", @@ -4104,6 +7040,33 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -4114,6 +7077,40 @@ "node": ">=8" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -4122,6 +7119,60 @@ "node": ">=12" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4134,6 +7185,46 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", @@ -4149,6 +7240,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4158,6 +7284,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -4166,6 +7308,26 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4178,6 +7340,32 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4187,6 +7375,33 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4194,6 +7409,183 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -4209,6 +7601,19 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsdom": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", @@ -4250,6 +7655,113 @@ } } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -4540,6 +8052,13 @@ "node": ">=8" } }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4592,6 +8111,16 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", @@ -4631,6 +8160,32 @@ "node": ">=4" } }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/motion-dom": { "version": "12.38.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", @@ -4646,6 +8201,13 @@ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", "license": "MIT" }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -4675,6 +8237,29 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/next": { "version": "14.2.35", "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", @@ -4763,6 +8348,35 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-releases": { "version": "2.0.38", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", @@ -4796,6 +8410,119 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", @@ -4807,6 +8534,52 @@ ], "license": "MIT" }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4840,6 +8613,19 @@ "node": ">=6" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -4861,6 +8647,26 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4944,7 +8750,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -4962,6 +8767,16 @@ "node": ">=10.13.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", @@ -5118,6 +8933,16 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -5134,6 +8959,25 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5377,6 +9221,50 @@ "redux": "^5.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5426,6 +9314,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -5436,6 +9344,23 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rolldown": { "version": "1.0.0-rc.18", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", @@ -5493,6 +9418,61 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -5515,11 +9495,172 @@ "loose-envify": "^1.1.0" } }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -5546,6 +9687,13 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5560,6 +9708,20 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -5581,6 +9743,119 @@ "node": ">=8" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5592,6 +9867,16 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -5605,6 +9890,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -5650,6 +9948,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -5716,6 +10027,13 @@ "node": ">=14.0.0" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -5872,18 +10190,161 @@ "node": ">=20" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -5897,6 +10358,49 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", @@ -5913,6 +10417,44 @@ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "license": "MIT" }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -5943,6 +10485,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -6264,11 +10816,116 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, + "node_modules/which-typed-array": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -6286,6 +10943,16 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -6313,6 +10980,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -6335,6 +11009,13 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -6367,6 +11048,42 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/frontend/package.json b/frontend/package.json old mode 100644 new mode 100755 index fc0194a..f68f78c --- a/frontend/package.json +++ b/frontend/package.json @@ -65,7 +65,11 @@ "@types/qrcode": "^1.5.6", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "@vitejs/plugin-react": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-next": "^16.2.6", "jsdom": "^29.1.1", "vitest": "^4.1.5" } diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts old mode 100644 new mode 100755 diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js old mode 100644 new mode 100755 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico old mode 100644 new mode 100755 diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png old mode 100644 new mode 100755 diff --git a/frontend/public/icon.svg b/frontend/public/icon.svg old mode 100644 new mode 100755 diff --git a/frontend/public/images/beian/gongan-beian.png b/frontend/public/images/beian/gongan-beian.png new file mode 100755 index 0000000..2a13ba2 Binary files /dev/null and b/frontend/public/images/beian/gongan-beian.png differ diff --git a/frontend/public/images/yzr/kefu.png b/frontend/public/images/yzr/kefu.png new file mode 100755 index 0000000..05317bf Binary files /dev/null and b/frontend/public/images/yzr/kefu.png differ diff --git a/frontend/public/images/yzr/yuzhiran-tech.jpg b/frontend/public/images/yzr/yuzhiran-tech.jpg new file mode 100755 index 0000000..404bb48 Binary files /dev/null and b/frontend/public/images/yzr/yuzhiran-tech.jpg differ diff --git a/frontend/public/images/yzr/yuzhiran-yhl.jpg b/frontend/public/images/yzr/yuzhiran-yhl.jpg new file mode 100755 index 0000000..f7130d2 Binary files /dev/null and b/frontend/public/images/yzr/yuzhiran-yhl.jpg differ diff --git a/frontend/public/images/yzr/yuzhiran.jpg b/frontend/public/images/yzr/yuzhiran.jpg new file mode 100755 index 0000000..cc61e6f Binary files /dev/null and b/frontend/public/images/yzr/yuzhiran.jpg differ diff --git a/frontend/server.js b/frontend/server.js old mode 100644 new mode 100755 diff --git a/frontend/src/app/__tests__/home.test.tsx b/frontend/src/app/__tests__/home.test.tsx old mode 100644 new mode 100755 index 44b3e64..150e78e --- a/frontend/src/app/__tests__/home.test.tsx +++ b/frontend/src/app/__tests__/home.test.tsx @@ -43,8 +43,8 @@ describe('HomePage', () => { it('should render sandbox preview section', () => { render(); - expect(screen.getByText('AI 沙盒')).toBeInTheDocument(); - expect(screen.getByText('在线体验 AI 对话,边学边练')).toBeInTheDocument(); + expect(screen.getByText('AI 沙盒实战')).toBeInTheDocument(); + expect(screen.getByText('内置 AI 对话沙盒,边学边练')).toBeInTheDocument(); }); it('should render CTA section', () => { @@ -64,14 +64,12 @@ describe('HomePage', () => { it('should render course descriptions', () => { render(); - expect(screen.getByText(/面向零基础用户/)).toBeInTheDocument(); - expect(screen.getByText(/系统学习提示词编写技巧/)).toBeInTheDocument(); - expect(screen.getByText(/学习使用 AI 工具/)).toBeInTheDocument(); + expect(screen.getAllByText('探索 AI 世界').length).toBe(3); }); it('should render sandbox with mock chat interface', () => { render(); - expect(screen.getByText(/你好!我是宇之然 AI 助手/)).toBeInTheDocument(); - expect(screen.getByText(/正在输入/)).toBeInTheDocument(); + expect(screen.getByText('AI 沙盒实战')).toBeInTheDocument(); + expect(screen.getByText('内置 AI 对话沙盒,边学边练')).toBeInTheDocument(); }); }); diff --git a/frontend/src/app/about/page.tsx b/frontend/src/app/about/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/analytics/page.tsx b/frontend/src/app/admin/analytics/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/comments/page.tsx b/frontend/src/app/admin/comments/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/[id]/edit-content.tsx b/frontend/src/app/admin/contents/[id]/edit-content.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/[id]/page.tsx b/frontend/src/app/admin/contents/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/new/page.tsx b/frontend/src/app/admin/contents/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/page.tsx b/frontend/src/app/admin/contents/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/[id]/edit-course.tsx b/frontend/src/app/admin/courses/[id]/edit-course.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/[id]/page.tsx b/frontend/src/app/admin/courses/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/new/page.tsx b/frontend/src/app/admin/courses/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/page.tsx b/frontend/src/app/admin/courses/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/org-detail.tsx b/frontend/src/app/admin/enterprise/[id]/org-detail.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/page.tsx b/frontend/src/app/admin/enterprise/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/report/page.tsx b/frontend/src/app/admin/enterprise/[id]/report/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/report/report-page.tsx b/frontend/src/app/admin/enterprise/[id]/report/report-page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/page.tsx b/frontend/src/app/admin/enterprise/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/layout.tsx b/frontend/src/app/admin/layout.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/login/page.tsx b/frontend/src/app/admin/login/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/operations/banners/page.tsx b/frontend/src/app/admin/operations/banners/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/operations/notifications/page.tsx b/frontend/src/app/admin/operations/notifications/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/orders/page.tsx b/frontend/src/app/admin/orders/page.tsx old mode 100644 new mode 100755 index d564955..595912c --- a/frontend/src/app/admin/orders/page.tsx +++ b/frontend/src/app/admin/orders/page.tsx @@ -1,7 +1,6 @@ 'use client'; -import { useEffect, useState } from 'react'; - +import { useEffect, useState, useCallback } from 'react'; import { Skeleton } from '@/components/ui/skeleton'; import { API_BASE } from '@/lib/config'; @@ -11,48 +10,109 @@ interface Order { amount: number; planType: string; status: string; + payChannel: string | null; + transactionId: string | null; + paidAt: string | null; createdAt: string; - user?: { nickname: string }; + user?: { id: number; nickname: string; phone?: string; email?: string }; } export default function AdminOrders() { const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); + const [total, setTotal] = useState(0); + const [page, setPage] = useState(1); + const [pageSize] = useState(20); + const [search, setSearch] = useState(''); + const [searchInput, setSearchInput] = useState(''); + const [statusFilter, setStatusFilter] = useState(''); + const [channelFilter, setChannelFilter] = useState(''); + const [refundModal, setRefundModal] = useState<{ open: boolean; order: Order | null; reason: string; loading: boolean }>({ + open: false, order: null, reason: '', loading: false, + }); - useEffect(() => { loadOrders(); }, []); + const token = typeof window !== 'undefined' ? localStorage.getItem('adminToken') : null; - async function loadOrders() { + const loadOrders = useCallback(async () => { + setLoading(true); try { - const token = localStorage.getItem('adminToken'); - const res = await fetch(`${API_BASE}/orders`, { + const params = new URLSearchParams(); + params.set('page', String(page)); + params.set('pageSize', String(pageSize)); + if (search) params.set('search', search); + if (statusFilter) params.set('status', statusFilter); + if (channelFilter) params.set('payChannel', channelFilter); + + const res = await fetch(`${API_BASE}/admin/orders?${params}`, { headers: { Authorization: `Bearer ${token}` }, }); - if (res.ok) { const data = await res.json(); setOrders(data.items || []); + setTotal(data.total || 0); } } catch {} setLoading(false); + }, [page, pageSize, search, statusFilter, channelFilter, token]); + + useEffect(() => { loadOrders(); }, [loadOrders]); + + function handleSearch() { + setSearch(searchInput); + setPage(1); } - async function refund(orderNo: string) { - if (!confirm('确认要退款吗?')) return; + function handleRefund(order: Order) { + setRefundModal({ open: true, order, reason: '用户申请退款', loading: false }); + } + + async function confirmRefund() { + const order = refundModal.order; + if (!order) return; + setRefundModal(prev => ({ ...prev, loading: true })); try { - const token = localStorage.getItem('adminToken'); - await fetch(`${API_BASE}/payment/wxpay/refund`, { + const res = await fetch(`${API_BASE}/admin/orders/${order.orderNo}/refund`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, - body: JSON.stringify({ outTradeNo: orderNo, amount: 0, reason: '管理员退款' }), + body: JSON.stringify({ amount: order.amount, reason: refundModal.reason }), }); - alert('退款成功'); - loadOrders(); - } catch {} + if (res.ok) { + alert('退款成功'); + setRefundModal({ open: false, order: null, reason: '', loading: false }); + loadOrders(); + } else { + const err = await res.json(); + alert(err.message || '退款失败'); + } + } catch { + alert('退款失败,请重试'); + } } + async function handleMarkPaid(orderNo: string) { + if (!confirm('确认要将此订单标记为已支付吗?')) return; + try { + const res = await fetch(`${API_BASE}/admin/orders/${orderNo}/mark-paid`, { + method: 'POST', + headers: { Authorization: `Bearer ${token}` }, + }); + if (res.ok) { + alert('已标记为已支付'); + loadOrders(); + } else { + const err = await res.json(); + alert(err.message || '操作失败'); + } + } catch { + alert('操作失败'); + } + } + + const totalPages = Math.ceil(total / pageSize); + if (loading) return (
@@ -69,6 +129,46 @@ export default function AdminOrders() {
+
+
+ setSearchInput(e.target.value)} + onKeyDown={e => e.key === 'Enter' && handleSearch()} + placeholder="搜索订单号/用户/手机号..." + className="px-3 py-2 text-sm bg-background border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-600" + /> + +
+ + + 共 {total} 条 +
+
@@ -77,6 +177,7 @@ export default function AdminOrders() { + @@ -85,8 +186,12 @@ export default function AdminOrders() { {orders.map(order => ( - - + + + ))} @@ -126,12 +246,69 @@ export default function AdminOrders() {
用户 金额 类型渠道 状态 时间 操作
{order.orderNo}{order.user?.nickname || '-'} + {order.orderNo} + {order.user?.nickname || '-'} + {order.user?.phone && ({order.user.phone})} + ¥{order.amount} + + {order.payChannel === 'alipay' ? '支付宝' : order.payChannel === 'wxpay' ? '微信' : '-'} + + - {order.status} + {order.status === 'PAID' ? '已支付' : order.status === 'PENDING' ? '待支付' : order.status === 'REFUNDED' ? '已退款' : '已取消'} {new Date(order.createdAt).toLocaleDateString()} - {order.status === 'PAID' && ( - - )} +
+ {order.status === 'PAID' && ( + + )} + {order.status === 'PENDING' && ( + + )} +
{orders.length === 0 && ( -
- 暂无订单数据 +
暂无订单数据
+ )} + + {totalPages > 1 && ( +
+ 第 {page}/{totalPages} 页 +
+ + +
)}
+ + {refundModal.open && refundModal.order && ( +
setRefundModal({ ...refundModal, open: false })}> +
e.stopPropagation()}> +

确认退款

+

+ 订单号: {refundModal.order.orderNo}
+ 金额: ¥{refundModal.order.amount} +

+
+ + setRefundModal(prev => ({ ...prev, reason: e.target.value }))} + className="w-full px-3 py-2 text-sm bg-background border border-border rounded-lg" + placeholder="请输入退款原因" + /> +
+
+ + +
+
+
+ )} ); } diff --git a/frontend/src/app/admin/page.tsx b/frontend/src/app/admin/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/[id]/client.tsx b/frontend/src/app/admin/prompts/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/[id]/page.tsx b/frontend/src/app/admin/prompts/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/new/page.tsx b/frontend/src/app/admin/prompts/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/page.tsx b/frontend/src/app/admin/prompts/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/settings/config/page.tsx b/frontend/src/app/admin/settings/config/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/settings/roles/page.tsx b/frontend/src/app/admin/settings/roles/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/[id]/client.tsx b/frontend/src/app/admin/tools/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/[id]/page.tsx b/frontend/src/app/admin/tools/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/new/page.tsx b/frontend/src/app/admin/tools/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/page.tsx b/frontend/src/app/admin/tools/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/users/page.tsx b/frontend/src/app/admin/users/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/ai-agreement/page.tsx b/frontend/src/app/ai-agreement/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/auth/page.tsx b/frontend/src/app/auth/page.tsx old mode 100644 new mode 100755 index 60ec8c6..c70a464 --- a/frontend/src/app/auth/page.tsx +++ b/frontend/src/app/auth/page.tsx @@ -25,7 +25,20 @@ function AuthForm() { const [error, setError] = useState(''); const [loginForm, setLoginForm] = useState({ account: '', password: '' }); - const [registerForm, setRegisterForm] = useState({ phone: '', email: '', password: '', confirmPassword: '', nickname: '' }); + const [registerForm, setRegisterForm] = useState({ username: '', phone: '', email: '', password: '', confirmPassword: '', nickname: '' }); + + function getFriendlyError(msg: string): string { + const map: Record = { + '手机号格式不正确': '手机号格式不正确(11位手机号)', + '邮箱格式不正确': '邮箱格式不正确', + '用户名格式不正确(2-20位,支持中英文、数字、下划线)': '用户名格式不正确(2-20位,支持中英文、数字、下划线)', + '用户名已被注册': t.auth.usernameConflict, + '手机号已被注册': t.auth.phoneConflict, + '邮箱已被注册': t.auth.emailConflict, + '请填写用户名、手机号或邮箱': '请填写用户名、手机号或邮箱', + }; + return map[msg] || msg || t.auth.loginFailed; + } async function handleLogin(e: FormEvent) { e.preventDefault(); @@ -37,38 +50,50 @@ function AuthForm() { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ account: loginForm.account, password: loginForm.password }), }); + if (!res.ok) { + let msg = t.auth.loginFailed; + try { const d = await res.json(); msg = d.message || msg; } catch {} + throw new Error(msg); + } const data = await res.json(); - if (!res.ok) throw new Error(data.message || t.auth.loginFailed); login(data.accessToken, data.refreshToken); toast.success(t.auth.loginSuccess); router.push('/'); - } catch (err: any) { setError(err.message); } + } catch (err: any) { setError(getFriendlyError(err.message)); } finally { setLoading(false); } } async function handleRegister(e: FormEvent) { e.preventDefault(); setError(''); - const { phone, email, password, confirmPassword, nickname } = registerForm; - if (!phone && !email) { setError(t.auth.fillPhoneOrEmail); return; } + const { username, phone, email, password, confirmPassword, nickname } = registerForm; + if (!username && !phone && !email) { setError(t.auth.fillPhoneOrEmail); return; } + if (username && !/^[a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/.test(username)) { setError('用户名格式不正确(2-20位,支持中英文、数字、下划线)'); return; } + if (phone && !/^1[3-9]\d{9}$/.test(phone)) { setError('手机号格式不正确(11位手机号)'); return; } + if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { setError('邮箱格式不正确'); return; } if (!password) { setError(t.auth.fillPassword); return; } if (password.length < 6) { setError(t.auth.passwordMinLength); return; } if (password !== confirmPassword) { setError(t.auth.passwordsNotMatch); return; } setLoading(true); try { const body: Record = { password }; + if (username) body.username = username; if (phone) body.phone = phone; if (email) body.email = email; if (nickname) body.nickname = nickname; const res = await fetch(`${API_BASE}/auth/register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); + if (!res.ok) { + let msg = t.auth.registerFailed; + try { const d = await res.json(); msg = d.message || msg; } catch {} + throw new Error(msg); + } const data = await res.json(); - if (!res.ok) throw new Error(data.message || t.auth.registerFailed); login(data.accessToken, data.refreshToken); toast.success(t.auth.registerSuccess); router.push('/'); - } catch (err: any) { setError(err.message); } + } catch (err: any) { setError(getFriendlyError(err.message)); } finally { setLoading(false); } } @@ -99,7 +124,7 @@ function AuthForm() {
- setLoginForm({ ...loginForm, account: e.target.value })} /> setLoginForm({ ...loginForm, password: e.target.value })} /> @@ -115,6 +140,8 @@ function AuthForm() { onChange={(e) => setRegisterForm({ ...registerForm, phone: e.target.value })} /> setRegisterForm({ ...registerForm, email: e.target.value })} /> + setRegisterForm({ ...registerForm, username: e.target.value })} /> setRegisterForm({ ...registerForm, nickname: e.target.value })} /> {children} + ); diff --git a/frontend/src/app/learning/analytics/page.tsx b/frontend/src/app/learning/analytics/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/learning/path/page.tsx b/frontend/src/app/learning/path/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/models/page.tsx b/frontend/src/app/models/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/dashboard/page.tsx b/frontend/src/app/my/dashboard/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/favorites/page.tsx b/frontend/src/app/my/favorites/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/learning/page.tsx b/frontend/src/app/my/learning/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/member/page.tsx b/frontend/src/app/my/member/page.tsx old mode 100644 new mode 100755 index 8c6f5e8..f612dfa --- a/frontend/src/app/my/member/page.tsx +++ b/frontend/src/app/my/member/page.tsx @@ -6,16 +6,15 @@ import { apiFetch } from '../../../lib/auth'; import { Skeleton } from '@/components/ui/skeleton'; import PaymentModal from '@/components/ui/payment-modal'; import { useT } from '@/i18n'; -import { isWeChatBrowser, getOpenidFromUrl, isMiniProgram } from '@/lib/wechat'; +import { isWeChatBrowser } from '@/lib/wechat'; interface PayResult { - prepay_id?: string; - nonceStr?: string; - timeStamp?: string; - package?: string; - paySign?: string; - signType?: string; + gatewayOrderId?: string; + payUrl?: string; + qrcode?: string; codeUrl?: string; + redirectUrl?: string; + status?: string; } interface Subscription { @@ -23,7 +22,7 @@ interface Subscription { } interface Order { - id: number; orderNo: string; amount: number; planType: string; status: string; createdAt: string; + id: number; orderNo: string; amount: number; planType: string; status: string; payChannel?: string; createdAt: string; } const PLANS = [ @@ -41,9 +40,10 @@ export default function MemberPage() { const [quota, setQuota] = useState<{ used: number; remaining: number; dailyLimit: number } | null>(null); const [loading, setLoading] = useState(true); const [payLoading, setPayLoading] = useState(null); + const [payChannel, setPayChannel] = useState<'wxpay' | 'alipay'>('alipay'); const [paymentModal, setPaymentModal] = useState<{ - open: boolean; orderNo: string; payResult: PayResult; tradeType: 'JSAPI' | 'NATIVE'; - }>({ open: false, orderNo: '', payResult: {}, tradeType: 'NATIVE' }); + open: boolean; orderNo: string; payResult: PayResult; payChannel: 'wxpay' | 'alipay'; + }>({ open: false, orderNo: '', payResult: {}, payChannel: 'alipay' }); useEffect(() => { loadData(); }, []); @@ -66,16 +66,11 @@ export default function MemberPage() { async function handleSubscribe(planType: string) { setPayLoading(planType); try { - const inWeChat = isWeChatBrowser(); - const openid = getOpenidFromUrl(); - const useJsapi = inWeChat && openid && isMiniProgram(); - const tradeType = useJsapi ? 'JSAPI' : 'NATIVE'; - const body: Record = { amount: planType === 'MONTHLY' ? 49.9 : 299, - planType, payChannel: 'wxpay', tradeType, + planType, + payChannel, }; - if (useJsapi && openid) body.openid = openid; const res = await apiFetch('/orders/create', { method: 'POST', @@ -84,13 +79,17 @@ export default function MemberPage() { const data = await res.json(); if (data.order && data.payResult) { - // Mock mode → auto-completed by backend - if (data.payResult.codeUrl === 'mock://pay') { + const payUrl = data.payResult.payUrl || data.payResult.redirectUrl; + const qrCode = data.payResult.qrcode || data.payResult.codeUrl; + + if ((payUrl === 'mock://pay' || qrCode === 'mock://pay') || data.message === '模拟支付完成') { loadData(); - } else { + } else if (payUrl || qrCode) { setPaymentModal({ - open: true, orderNo: data.order.orderNo, - payResult: data.payResult, tradeType, + open: true, + orderNo: data.order.orderNo, + payResult: data.payResult, + payChannel, }); } } @@ -164,10 +163,40 @@ export default function MemberPage() { ))}
{plan.id !== 'FREE' && ( - +
+ {!isCurrent && ( +
+ + +
+ )} + {isCurrent && ( + + )} +
)} ); @@ -188,9 +217,14 @@ export default function MemberPage() {
¥{order.amount}
- - {order.status} - +
+ {order.payChannel && ( + {order.payChannel === 'alipay' ? '支付宝' : '微信'} + )} + + {order.status} + +
))} @@ -201,7 +235,7 @@ export default function MemberPage() { open={paymentModal.open} orderNo={paymentModal.orderNo} payResult={paymentModal.payResult} - tradeType={paymentModal.tradeType} + payChannel={paymentModal.payChannel} onPaid={handlePaymentPaid} onClose={() => setPaymentModal(prev => ({ ...prev, open: false }))} /> diff --git a/frontend/src/app/my/page.tsx b/frontend/src/app/my/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/settings/page.tsx b/frontend/src/app/my/settings/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/not-found.tsx b/frontend/src/app/not-found.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/notifications/page.tsx b/frontend/src/app/notifications/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/privacy/page.tsx b/frontend/src/app/privacy/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/__tests__/prompts.vitest.tsx b/frontend/src/app/prompts/__tests__/prompts.vitest.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/page.tsx b/frontend/src/app/prompts/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/workshop/page.tsx b/frontend/src/app/prompts/workshop/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/code/page.tsx b/frontend/src/app/sandbox/code/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/compare/page.tsx b/frontend/src/app/sandbox/compare/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/page.tsx b/frontend/src/app/sandbox/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/share/page.tsx b/frontend/src/app/sandbox/share/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/search/page.tsx b/frontend/src/app/search/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/[id]/client.tsx b/frontend/src/app/skills/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/[id]/page.tsx b/frontend/src/app/skills/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/page.tsx b/frontend/src/app/skills/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/terms/page.tsx b/frontend/src/app/terms/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/tools/page.tsx b/frontend/src/app/tools/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/users/[id]/page.tsx b/frontend/src/app/users/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/users/[id]/user-profile.tsx b/frontend/src/app/users/[id]/user-profile.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/components/admin-ai-assistant.tsx b/frontend/src/components/admin-ai-assistant.tsx old mode 100644 new mode 100755 index 9562f41..46c7a31 --- a/frontend/src/components/admin-ai-assistant.tsx +++ b/frontend/src/components/admin-ai-assistant.tsx @@ -30,6 +30,7 @@ const AVAILABLE_TOOLS_DESC = `可用工具列表(需要执行操作时,返 - **list-roles**: 角色列表 - **list-admins**: 管理员列表 - **get-enterprise-orgs**: 企业组织列表 +- **search**: 全局搜索(q必填, type? 可选 all|users|orders|courses|contents) === 创建 === - **create-course**: 创建课程(title必填, description?, price?, isFree?, status?) @@ -72,6 +73,9 @@ const AVAILABLE_TOOLS_DESC = `可用工具列表(需要执行操作时,返 === 导航 === - **navigate**: 跳转到页面(path: /admin/users等) +=== 通知管理 === +- **mark-all-notifications-read**: 将所有通知标记为已读 + 当用户请求执行操作时,先调用对应工具。工具执行完毕后会用自然语言总结结果。`; const SYSTEM_PROMPT = `你是宇之然AI管理后台的智能助手,帮助管理员完成日常运营工作。 @@ -210,7 +214,7 @@ export function AdminAIAssistant() { ); } - const starters = ['查看仪表盘数据', '列出最近用户', '查看待审核评论', '查看企业版组织']; + const starters = ['查看仪表盘数据', '列出最近用户', '搜索订单', '查看待审核评论', '查看企业版组织', '列出所有角色', '帮我查一下最近的课程']; return (
diff --git a/frontend/src/components/ai-assistant.tsx b/frontend/src/components/ai-assistant.tsx old mode 100644 new mode 100755 index c8b4b3d..c32b16a --- a/frontend/src/components/ai-assistant.tsx +++ b/frontend/src/components/ai-assistant.tsx @@ -2,19 +2,83 @@ import { useState, useRef, useEffect, FormEvent } from 'react'; import { usePathname, useRouter } from 'next/navigation'; -import { MessageCircle, X, Send, Minus, Sparkles } from 'lucide-react'; -import { getAssistantContext, parseActionCommand, type AssistantContext, type AssistantAction } from '@/lib/assistant-context'; -import { executeAction, setRouter } from '@/lib/assistant-actions'; +import { X, Send, Minus, Sparkles } from 'lucide-react'; +import { executeClientAction } from '@/lib/assistant-actions'; import { useT } from '@/i18n'; import { getToken, apiFetch } from '@/lib/auth'; -import { DEFAULT_MODEL } from '@/lib/models'; import { toast } from 'sonner'; interface Message { role: 'user' | 'assistant'; content: string; - hasAction?: boolean; - actionExecuted?: boolean; +} + +const PAGE_CONTEXTS: Record = { + '/': { + greeting: '你好!我是宇之然 AI 助手,可以帮你了解平台功能、搜索内容、查看学习进度等。试试下面的问题:', + starters: ['宇之然 AI 能做什么?', '如何开始学习 AI?', '搜索一些课程', '推荐一个学习路线', '查看有哪些技能'], + }, + '/sandbox': { + greeting: '我在 AI 沙盒页面,可以帮你了解沙盒功能、切换模型、开始对话等。', + starters: ['如何切换模型?', '高级参数怎么调?', '如何查看历史记录?', '对话次数限制是多少'], + }, + '/skills': { + greeting: '我在技能库页面,可以帮你了解各种技能、推荐适合你的技能。', + starters: ['有哪些技能可以学习?', '如何选择适合我的技能?', '有哪些入门技能?', '如何开始练习一个技能?'], + }, + '/learning': { + greeting: '我在学习路径页面,可以帮你分析学习情况、推荐学习内容。', + starters: ['查看我的学情分析', '学习路径有哪些阶段?', '我有哪些薄弱环节', '推荐学习内容'], + }, + '/my': { + greeting: '我在个人中心页面,可以帮你管理账户、查看会员信息等。', + starters: ['查看个人信息', '我的会员状态', '查看订单记录', '查看通知'], + }, + '/models': { + greeting: '我在模型百科页面,可以帮你了解各种 AI 模型的特点和用途。', + starters: ['有哪些模型可以参考?', '如何选择合适的模型?', '模型能力怎么对比?', '查看所有模型'], + }, + '/prompts': { + greeting: '我在提示词工坊页面,可以帮你了解提示词编写技巧。', + starters: ['如何编写一个好的提示词?', '查看有哪些提示词', '如何测试提示词效果?'], + }, + '/courses': { + greeting: '我在课程专题页面,可以帮你选择课程、规划学习。', + starters: ['有哪些课程可以学习?', '如何选择适合我的课程?', '有免费的课程吗?', '搜索课程'], + }, + '/compare': { + greeting: '我在对比实验室页面,可以帮你了解如何使用对比功能。', + starters: ['对比实验室怎么用?', '如何添加对比模型?', '对比结果怎么看?'], + }, +}; + +function getPageContext(pathname: string) { + const sorted = Object.keys(PAGE_CONTEXTS).sort((a, b) => b.length - a.length); + for (const key of sorted) { + if (pathname.startsWith(key)) return PAGE_CONTEXTS[key]; + } + return PAGE_CONTEXTS['/']; +} + +function parseToolCall(text: string): { tool: string; params: Record; description?: string } | null { + let braceDepth = 0; + let start = -1; + for (let i = 0; i < text.length; i++) { + if (text[i] === '{') { + if (start === -1) start = i; + braceDepth++; + } else if (text[i] === '}') { + braceDepth--; + if (braceDepth === 0 && start !== -1) { + try { + const parsed = JSON.parse(text.slice(start, i + 1)); + if (parsed.tool) return parsed; + } catch {} + start = -1; + } + } + } + return null; } export function AIAssistant() { @@ -26,23 +90,18 @@ export function AIAssistant() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [sending, setSending] = useState(false); - const [context, setContext] = useState(getAssistantContext(pathname)); + const [pageCtx, setPageCtx] = useState(getPageContext(pathname)); const [started, setStarted] = useState(false); const messagesEndRef = useRef(null); const inputRef = useRef(null); useEffect(() => { - setRouter(router); - }, [router]); - - useEffect(() => { - setContext(getAssistantContext(pathname)); + setPageCtx(getPageContext(pathname)); }, [pathname]); useEffect(() => { if (open && !started) { - const ctx = getAssistantContext(pathname); - setMessages([{ role: 'assistant', content: ctx.systemPrompt }]); + setPageCtx(getPageContext(pathname)); setStarted(true); } }, [open, pathname, started]); @@ -55,6 +114,29 @@ export function AIAssistant() { if (open) inputRef.current?.focus(); }, [open]); + async function postChat(messages: { role: string; content: string }[], pageContext?: string): Promise { + const tk = getToken(); + if (!tk) throw new Error('请先登录'); + const res = await apiFetch('/ai-assistant/chat', { + method: 'POST', + body: JSON.stringify({ messages, pageContext }), + }); + const data = await res.json(); + if (!res.ok) throw new Error(data.message || '请求失败'); + return data.reply; + } + + async function executeTool(tool: string, params: Record, messages: { role: string; content: string }[]): Promise<{ reply: string }> { + const tk = getToken(); + const res = await apiFetch('/ai-assistant/action', { + method: 'POST', + body: JSON.stringify({ tool, params, messages }), + }); + const data = await res.json(); + if (!res.ok) throw new Error(data.message || '工具执行失败'); + return data; + } + async function handleSend(e: FormEvent) { e.preventDefault(); const text = input.trim(); @@ -67,47 +149,34 @@ export function AIAssistant() { try { const tk = getToken(); - let reply = ''; - if (tk) { - const ctx = getAssistantContext(pathname); - const apiMessages = [ - { role: 'system', content: ctx.systemPrompt }, - ...messages.filter(m => m.role === 'user' || m.role === 'assistant').map(m => ({ role: m.role, content: m.content })), - { role: 'user', content: text }, - ]; - const res = await apiFetch('/sandbox/chat', { - method: 'POST', - body: JSON.stringify({ - conversationId: crypto.randomUUID(), - model: DEFAULT_MODEL, - messages: apiMessages, - }), - }); - const data = await res.json(); - if (!res.ok) throw new Error(data.message || '请求失败'); - reply = data.reply; - } else { - await new Promise(r => setTimeout(r, 400)); - reply = '📝 登录后可体验完整 AI 对话功能。\n\n点击右上角「登录」或「注册」即可开始使用,解锁 AI 助手的全部能力。'; + if (!tk) { + const reply = '📝 登录后可体验完整 AI 对话功能。\n\n点击右上角「登录」或「注册」即可开始使用,解锁 AI 助手的全部能力。'; + setMessages(prev => [...prev, { role: 'assistant', content: reply }]); + return; } - const action = parseActionCommand(reply); - const hasAction = !!action; - - if (hasAction) { - const cleanReply = reply.replace(/\{[\s\S]*?"action"\s*:\s*?"[^"]+"[\s\S]*?\}/, '').trim(); - const finalReply = cleanReply || '收到你的请求,正在处理...'; - - setMessages(prev => [...prev, { role: 'assistant', content: finalReply, hasAction: true }]); - - const result = await executeAction(action); - if (result.success) { - toast.success(result.message, { icon: }); - setMessages(prev => prev.map((m, i) => - i === prev.length - 1 ? { ...m, actionExecuted: true } : m - )); + const apiMessages = [ + ...messages.filter(m => m.role === 'user' || m.role === 'assistant').map(m => ({ role: m.role, content: m.content })), + { role: 'user', content: text }, + ]; + + const currentPage = pathname.split('/').filter(Boolean)[0] || '首页'; + let reply = await postChat(apiMessages, currentPage); + const toolCall = parseToolCall(reply); + + if (toolCall) { + const clientActions = ['navigate', 'setModel', 'startChat', 'openSkill', 'setParameter']; + if (clientActions.includes(toolCall.tool)) { + setMessages(prev => [...prev, { role: 'assistant', content: `正在${toolCall.description || '执行操作'}...` }]); + const result = await executeClientAction(toolCall.tool, toolCall.params, router); + if (result.success) { + toast.success(result.message, { icon: }); + } else { + toast.error(result.message); + } } else { - toast.error(result.message); + const result = await executeTool(toolCall.tool, toolCall.params, apiMessages); + setMessages(prev => [...prev, { role: 'assistant', content: result.reply }]); } } else { setMessages(prev => [...prev, { role: 'assistant', content: reply }]); @@ -121,9 +190,7 @@ export function AIAssistant() { function handleStarter(starter: string) { setInput(starter); - setTimeout(() => { - inputRef.current?.focus(); - }, 0); + setTimeout(() => inputRef.current?.focus(), 0); } if (!open) { @@ -149,8 +216,6 @@ export function AIAssistant() { ); } - const ctx = getAssistantContext(pathname); - return (
setMinimized(!minimized)} className="p-1.5 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors"> -
@@ -177,13 +242,13 @@ export function AIAssistant() { {!minimized && ( <>
- {messages.length === 1 && messages[0].role === 'assistant' && ( + {messages.length === 0 && (

- {t.assistant?.greeting || '你好!我是宇之然 AI 助手,可以帮你了解和使用本站功能。试试下面的问题:'} + {pageCtx.greeting}

- {ctx.starters.map((q, i) => ( + {pageCtx.starters.map((q, i) => (
)} - {messages.map((msg, i) => { - const showActionIndicator = msg.hasAction && msg.actionExecuted && i === messages.length - 1; - return ( -
- {msg.role === 'assistant' && ( -
Y
- )} -
- {i === messages.length - 1 && msg.role === 'assistant' && started && messages.length > 1 - ? msg.content - : msg.role === 'assistant' && i === 0 - ? null - : msg.content} - {showActionIndicator && ( - - - - )} -
- {msg.role === 'user' && ( -
- )} + {messages.map((msg, i) => ( +
+ {msg.role === 'assistant' && ( +
Y
+ )} +
+ {msg.content}
- ); - })} + {msg.role === 'user' && ( +
+ )} +
+ ))} {sending && (
Y
@@ -266,4 +319,4 @@ export function AIAssistant() {
); -} \ No newline at end of file +} diff --git a/frontend/src/components/layout/__tests__/footer.test.tsx b/frontend/src/components/layout/__tests__/footer.test.tsx old mode 100644 new mode 100755 index e9dc9b0..f741ec5 --- a/frontend/src/components/layout/__tests__/footer.test.tsx +++ b/frontend/src/components/layout/__tests__/footer.test.tsx @@ -15,7 +15,7 @@ describe('Footer', () => { it('should render navigation links', () => { render(