Kaynağa Gözat

初始化项目,首次提交

yanxh 2 hafta önce
işleme
21d9bb4e83
74 değiştirilmiş dosya ile 16569 ekleme ve 0 silme
  1. 2 0
      .env.development
  2. 1 0
      .env.production
  3. 3 0
      .gitignore
  4. 1 0
      index.html
  5. 9407 0
      package-lock.json
  6. 36 0
      package.json
  7. 66 0
      scripts/gen-tabbar-icons.mjs
  8. 17 0
      src/App.vue
  9. 3 0
      src/api/index.ts
  10. 23 0
      src/api/modules/address.ts
  11. 88 0
      src/api/modules/companyMeal.ts
  12. 17 0
      src/api/modules/homeBanners.ts
  13. 85 0
      src/api/modules/meal.ts
  14. 46 0
      src/api/modules/memberAuth.ts
  15. 23 0
      src/api/modules/order.ts
  16. 26 0
      src/components/EmptyState.vue
  17. 190 0
      src/components/MealMenuItemCard.vue
  18. 29 0
      src/components/OrderStatusTag.vue
  19. 27 0
      src/components/PriceSummary.vue
  20. 6 0
      src/config/api.ts
  21. 3 0
      src/config/env.ts
  22. 2 0
      src/config/index.ts
  23. 4 0
      src/constants/routes.ts
  24. 12 0
      src/env.d.ts
  25. 12 0
      src/main.ts
  26. 17 0
      src/manifest.json
  27. 152 0
      src/package-views/pages/company/applications.vue
  28. 290 0
      src/package-views/pages/company/apply.vue
  29. 101 0
      src/package-views/pages/company/benefit.vue
  30. 129 0
      src/package-views/pages/company/select.vue
  31. 217 0
      src/package-views/pages/login/index.vue
  32. 644 0
      src/package-views/pages/meal/checkout.vue
  33. 533 0
      src/package-views/pages/meal/detail.vue
  34. 687 0
      src/package-views/pages/meal/menu.vue
  35. 180 0
      src/package-views/pages/meal/restaurant-select.vue
  36. 311 0
      src/package-views/pages/order/detail.vue
  37. 182 0
      src/package-views/pages/order/success.vue
  38. 166 0
      src/pages.json
  39. 189 0
      src/pages/address/edit.vue
  40. 181 0
      src/pages/address/list.vue
  41. 442 0
      src/pages/meal/index.vue
  42. 327 0
      src/pages/order/index.vue
  43. 385 0
      src/pages/profile/index.vue
  44. BIN
      src/static/tabbar/meal-active.png
  45. BIN
      src/static/tabbar/meal.png
  46. BIN
      src/static/tabbar/order-active.png
  47. BIN
      src/static/tabbar/order.png
  48. BIN
      src/static/tabbar/profile-active.png
  49. BIN
      src/static/tabbar/profile.png
  50. 3 0
      src/store/index.ts
  51. 34 0
      src/store/modules/auth.ts
  52. 33 0
      src/store/modules/company.ts
  53. 70 0
      src/store/modules/meal.ts
  54. 39 0
      src/styles/common.scss
  55. 26 0
      src/types/address.ts
  56. 12 0
      src/types/common.ts
  57. 170 0
      src/types/companyMeal.ts
  58. 4 0
      src/types/index.ts
  59. 215 0
      src/types/meal.ts
  60. 72 0
      src/types/order.ts
  61. 7 0
      src/types/pay.ts
  62. 7 0
      src/uni.scss
  63. 52 0
      src/utils/auth.ts
  64. 168 0
      src/utils/device.ts
  65. 34 0
      src/utils/mealDisplay.ts
  66. 8 0
      src/utils/money.ts
  67. 54 0
      src/utils/needLoginError.ts
  68. 15 0
      src/utils/orderCancelActions.ts
  69. 28 0
      src/utils/pay.ts
  70. 108 0
      src/utils/request.ts
  71. 53 0
      src/utils/tokenStorage.ts
  72. 18 0
      src/utils/unifiedOrderWechatPay.ts
  73. 45 0
      tsconfig.json
  74. 32 0
      vite.config.ts

+ 2 - 0
.env.development

@@ -0,0 +1,2 @@
+VITE_API_BASE_URL=http://127.0.0.1:8086/mobile
+VITE_DEV_API_TARGET=http://127.0.0.1:8086

+ 1 - 0
.env.production

@@ -0,0 +1 @@
+VITE_API_BASE_URL=/mobile

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+.trae/
+dist/
+node_modules/

+ 1 - 0
index.html

@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8" /><script>var coverSupport='CSS' in window&&typeof CSS.supports==='function'&&(CSS.supports('top: env(a)')||CSS.supports('top: constant(a)'));document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'+(coverSupport?', viewport-fit=cover':'')+'" />')</script><title>订餐小程序</title></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body></html>

+ 9407 - 0
package-lock.json

@@ -0,0 +1,9407 @@
+{
+    "name": "meal_mini_app",
+    "version": "1.0.0",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "meal_mini_app",
+            "version": "1.0.0",
+            "dependencies": {
+                "@dcloudio/uni-app": "3.0.0-4080420251103001",
+                "@dcloudio/uni-components": "3.0.0-4080420251103001",
+                "@dcloudio/uni-mp-weixin": "3.0.0-4080420251103001",
+                "pinia": "^2.1.7",
+                "uview-plus": "^3.7.36",
+                "vue": "^3.4.21"
+            },
+            "devDependencies": {
+                "@dcloudio/types": "^3.4.8",
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/vite-plugin-uni": "3.0.0-4080420251103001",
+                "@types/node": "^20.10.0",
+                "@vue/runtime-core": "^3.4.21",
+                "@vue/tsconfig": "^0.1.3",
+                "sass": "^1.69.5",
+                "sharp": "^0.35.2",
+                "typescript": "^4.9.4",
+                "vite": "5.2.8",
+                "vue-tsc": "^1.0.24"
+            }
+        },
+        "node_modules/@ampproject/remapping": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz",
+            "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.5",
+                "@jridgewell/trace-mapping": "^0.3.24"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/code-frame": {
+            "version": "7.24.7",
+            "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz",
+            "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/highlight": "^7.24.7",
+                "picocolors": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "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==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/core": {
+            "version": "7.25.2",
+            "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.25.2.tgz",
+            "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
+            "license": "MIT",
+            "dependencies": {
+                "@ampproject/remapping": "^2.2.0",
+                "@babel/code-frame": "^7.24.7",
+                "@babel/generator": "^7.25.0",
+                "@babel/helper-compilation-targets": "^7.25.2",
+                "@babel/helper-module-transforms": "^7.25.2",
+                "@babel/helpers": "^7.25.0",
+                "@babel/parser": "^7.25.0",
+                "@babel/template": "^7.25.0",
+                "@babel/traverse": "^7.25.2",
+                "@babel/types": "^7.25.2",
+                "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/generator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz",
+            "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
+            "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/generator/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/generator/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-annotate-as-pure": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+            "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-annotate-as-pure/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/@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==",
+            "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-create-class-features-plugin": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+            "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "@babel/helper-member-expression-to-functions": "^7.29.7",
+                "@babel/helper-optimise-call-expression": "^7.29.7",
+                "@babel/helper-replace-supers": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+                "@babel/traverse": "^7.29.7",
+                "semver": "^6.3.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-create-regexp-features-plugin": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
+            "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "regexpu-core": "^6.3.1",
+                "semver": "^6.3.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-define-polyfill-provider": {
+            "version": "0.6.8",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+            "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-compilation-targets": "^7.28.6",
+                "@babel/helper-plugin-utils": "^7.28.6",
+                "debug": "^4.4.3",
+                "lodash.debounce": "^4.0.8",
+                "resolve": "^1.22.11"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+            }
+        },
+        "node_modules/@babel/helper-define-polyfill-provider/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/@babel/helper-define-polyfill-provider/node_modules/resolve": {
+            "version": "1.22.12",
+            "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz",
+            "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "es-errors": "^1.3.0",
+                "is-core-module": "^2.16.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/@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==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-member-expression-to-functions": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+            "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/traverse": "^7.29.7",
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-member-expression-to-functions/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/@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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/traverse": "^7.29.7",
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-module-imports/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^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==",
+            "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-optimise-call-expression": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+            "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-optimise-call-expression/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/@babel/helper-plugin-utils": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+            "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-remap-async-to-generator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
+            "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "@babel/helper-wrap-function": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-replace-supers": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+            "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-member-expression-to-functions": "^7.29.7",
+                "@babel/helper-optimise-call-expression": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+            "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/traverse": "^7.29.7",
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-skip-transparent-expression-wrappers/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/@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==",
+            "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==",
+            "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==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-wrap-function": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
+            "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/template": "^7.29.7",
+                "@babel/traverse": "^7.29.7",
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-wrap-function/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/@babel/helpers": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz",
+            "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/template": "^7.29.7",
+                "@babel/types": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helpers/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight": {
+            "version": "7.25.9",
+            "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.25.9.tgz",
+            "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.25.9",
+                "chalk": "^2.4.2",
+                "js-tokens": "^4.0.0",
+                "picocolors": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/parser": {
+            "version": "7.25.6",
+            "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.6.tgz",
+            "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.25.6"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz",
+            "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz",
+            "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz",
+            "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz",
+            "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz",
+            "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+                "@babel/plugin-transform-optional-chaining": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.13.0"
+            }
+        },
+        "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz",
+            "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-proposal-private-property-in-object": {
+            "version": "7.21.0-placeholder-for-preset-env.2",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+            "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-import-assertions": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz",
+            "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-import-attributes": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz",
+            "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-import-meta": {
+            "version": "7.10.4",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+            "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.10.4"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-jsx": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
+            "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-typescript": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
+            "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+            "version": "7.18.6",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+            "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+                "@babel/helper-plugin-utils": "^7.18.6"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-arrow-functions": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz",
+            "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-async-generator-functions": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
+            "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-remap-async-to-generator": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-async-to-generator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
+            "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-imports": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-remap-async-to-generator": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-block-scoped-functions": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz",
+            "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-block-scoping": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
+            "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-class-properties": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
+            "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-class-static-block": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
+            "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.12.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-classes": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
+            "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "@babel/helper-compilation-targets": "^7.29.7",
+                "@babel/helper-globals": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-replace-supers": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-computed-properties": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz",
+            "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/template": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-destructuring": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
+            "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-dotall-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz",
+            "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-duplicate-keys": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz",
+            "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz",
+            "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-dynamic-import": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz",
+            "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-explicit-resource-management": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz",
+            "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/plugin-transform-destructuring": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-exponentiation-operator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz",
+            "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-export-namespace-from": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
+            "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-for-of": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
+            "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-function-name": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz",
+            "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-compilation-targets": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-json-strings": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz",
+            "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-literals": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz",
+            "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
+            "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-member-expression-literals": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz",
+            "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-amd": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz",
+            "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-commonjs": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
+            "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-systemjs": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz",
+            "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.29.7",
+                "@babel/helper-plugin-utils": "^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-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-modules-umd": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz",
+            "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-transforms": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
+            "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-new-target": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz",
+            "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
+            "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-numeric-separator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz",
+            "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-object-rest-spread": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
+            "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-compilation-targets": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/plugin-transform-destructuring": "^7.29.7",
+                "@babel/plugin-transform-parameters": "^7.29.7",
+                "@babel/traverse": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-object-super": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz",
+            "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-replace-supers": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-optional-catch-binding": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
+            "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-optional-chaining": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
+            "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-parameters": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
+            "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-private-methods": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
+            "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-class-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-private-property-in-object": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
+            "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "@babel/helper-create-class-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-property-literals": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz",
+            "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-regenerator": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz",
+            "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-regexp-modifiers": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz",
+            "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-reserved-words": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz",
+            "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-shorthand-properties": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz",
+            "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-spread": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz",
+            "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-sticky-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz",
+            "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-template-literals": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz",
+            "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-typeof-symbol": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz",
+            "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-typescript": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz",
+            "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-annotate-as-pure": "^7.29.7",
+                "@babel/helper-create-class-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+                "@babel/plugin-syntax-typescript": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-escapes": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz",
+            "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-property-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz",
+            "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
+            "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz",
+            "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0"
+            }
+        },
+        "node_modules/@babel/preset-env": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.29.7.tgz",
+            "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/compat-data": "^7.29.7",
+                "@babel/helper-compilation-targets": "^7.29.7",
+                "@babel/helper-plugin-utils": "^7.29.7",
+                "@babel/helper-validator-option": "^7.29.7",
+                "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7",
+                "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7",
+                "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7",
+                "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7",
+                "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7",
+                "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7",
+                "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+                "@babel/plugin-syntax-import-assertions": "^7.29.7",
+                "@babel/plugin-syntax-import-attributes": "^7.29.7",
+                "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+                "@babel/plugin-transform-arrow-functions": "^7.29.7",
+                "@babel/plugin-transform-async-generator-functions": "^7.29.7",
+                "@babel/plugin-transform-async-to-generator": "^7.29.7",
+                "@babel/plugin-transform-block-scoped-functions": "^7.29.7",
+                "@babel/plugin-transform-block-scoping": "^7.29.7",
+                "@babel/plugin-transform-class-properties": "^7.29.7",
+                "@babel/plugin-transform-class-static-block": "^7.29.7",
+                "@babel/plugin-transform-classes": "^7.29.7",
+                "@babel/plugin-transform-computed-properties": "^7.29.7",
+                "@babel/plugin-transform-destructuring": "^7.29.7",
+                "@babel/plugin-transform-dotall-regex": "^7.29.7",
+                "@babel/plugin-transform-duplicate-keys": "^7.29.7",
+                "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7",
+                "@babel/plugin-transform-dynamic-import": "^7.29.7",
+                "@babel/plugin-transform-explicit-resource-management": "^7.29.7",
+                "@babel/plugin-transform-exponentiation-operator": "^7.29.7",
+                "@babel/plugin-transform-export-namespace-from": "^7.29.7",
+                "@babel/plugin-transform-for-of": "^7.29.7",
+                "@babel/plugin-transform-function-name": "^7.29.7",
+                "@babel/plugin-transform-json-strings": "^7.29.7",
+                "@babel/plugin-transform-literals": "^7.29.7",
+                "@babel/plugin-transform-logical-assignment-operators": "^7.29.7",
+                "@babel/plugin-transform-member-expression-literals": "^7.29.7",
+                "@babel/plugin-transform-modules-amd": "^7.29.7",
+                "@babel/plugin-transform-modules-commonjs": "^7.29.7",
+                "@babel/plugin-transform-modules-systemjs": "^7.29.7",
+                "@babel/plugin-transform-modules-umd": "^7.29.7",
+                "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7",
+                "@babel/plugin-transform-new-target": "^7.29.7",
+                "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7",
+                "@babel/plugin-transform-numeric-separator": "^7.29.7",
+                "@babel/plugin-transform-object-rest-spread": "^7.29.7",
+                "@babel/plugin-transform-object-super": "^7.29.7",
+                "@babel/plugin-transform-optional-catch-binding": "^7.29.7",
+                "@babel/plugin-transform-optional-chaining": "^7.29.7",
+                "@babel/plugin-transform-parameters": "^7.29.7",
+                "@babel/plugin-transform-private-methods": "^7.29.7",
+                "@babel/plugin-transform-private-property-in-object": "^7.29.7",
+                "@babel/plugin-transform-property-literals": "^7.29.7",
+                "@babel/plugin-transform-regenerator": "^7.29.7",
+                "@babel/plugin-transform-regexp-modifiers": "^7.29.7",
+                "@babel/plugin-transform-reserved-words": "^7.29.7",
+                "@babel/plugin-transform-shorthand-properties": "^7.29.7",
+                "@babel/plugin-transform-spread": "^7.29.7",
+                "@babel/plugin-transform-sticky-regex": "^7.29.7",
+                "@babel/plugin-transform-template-literals": "^7.29.7",
+                "@babel/plugin-transform-typeof-symbol": "^7.29.7",
+                "@babel/plugin-transform-unicode-escapes": "^7.29.7",
+                "@babel/plugin-transform-unicode-property-regex": "^7.29.7",
+                "@babel/plugin-transform-unicode-regex": "^7.29.7",
+                "@babel/plugin-transform-unicode-sets-regex": "^7.29.7",
+                "@babel/preset-modules": "0.1.6-no-external-plugins",
+                "babel-plugin-polyfill-corejs2": "^0.4.15",
+                "babel-plugin-polyfill-corejs3": "^0.14.0",
+                "babel-plugin-polyfill-regenerator": "^0.6.6",
+                "core-js-compat": "^3.48.0",
+                "semver": "^6.3.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@babel/preset-modules": {
+            "version": "0.1.6-no-external-plugins",
+            "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+            "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-plugin-utils": "^7.0.0",
+                "@babel/types": "^7.4.4",
+                "esutils": "^2.0.2"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+            }
+        },
+        "node_modules/@babel/runtime": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz",
+            "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+            "license": "MIT",
+            "engines": {
+                "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==",
+            "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/template/node_modules/@babel/code-frame": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz",
+            "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.29.7",
+                "js-tokens": "^4.0.0",
+                "picocolors": "^1.1.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/template/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/template/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/template/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "license": "ISC"
+        },
+        "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==",
+            "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/traverse/node_modules/@babel/code-frame": {
+            "version": "7.29.7",
+            "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz",
+            "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.29.7",
+                "js-tokens": "^4.0.0",
+                "picocolors": "^1.1.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/traverse/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@babel/traverse/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/traverse/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "license": "ISC"
+        },
+        "node_modules/@babel/types": {
+            "version": "7.25.6",
+            "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz",
+            "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.24.8",
+                "@babel/helper-validator-identifier": "^7.24.7",
+                "to-fast-properties": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@dcloudio/types": {
+            "version": "3.4.19",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/types/-/types-3.4.19.tgz",
+            "integrity": "sha512-1foayOFEAQ+jnQLt3ACsovCNjer3/fXn1I2VBpmDOzs2nk/n4UHwRLAxZV/RpxRqaGOPEvKrO/Pq+VI6sAmuRw==",
+            "license": "Apache-2.0"
+        },
+        "node_modules/@dcloudio/uni-app": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-pzBWZiICfMmAxzBvAoXlTcDYoVNrV+ztsUyDouUxZJShpquQdVqHJqHxAlvGLR7c5gHCVtnKilCKwmu6zjNGrA==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cloud": "3.0.0-4080420251103001",
+                "@dcloudio/uni-components": "3.0.0-4080420251103001",
+                "@dcloudio/uni-console": "3.0.0-4080420251103001",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001",
+                "@dcloudio/uni-push": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-stat": "3.0.0-4080420251103001",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "@dcloudio/types": "3.4.19"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-CI9gfUSrneTJFp52CBpAwDE9vsaxdwg4uA7n2ehKB+WLXgP2zmLp+0QoSQoFYISYll6MnfQK6Pcl8Oj1c7mKUA==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@ampproject/remapping": "^2.1.2",
+                "@babel/code-frame": "7.24.7",
+                "@babel/core": "7.25.2",
+                "@babel/parser": "7.25.6",
+                "@babel/types": "7.25.6",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@intlify/core-base": "9.1.9",
+                "@intlify/shared": "9.1.9",
+                "@intlify/vue-devtools": "9.1.9",
+                "@rollup/pluginutils": "5.1.0",
+                "@vue/compiler-core": "3.4.21",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "adm-zip": "0.5.16",
+                "autoprefixer": "10.4.20",
+                "base64url": "^3.0.1",
+                "chokidar": "3.6.0",
+                "compare-versions": "^3.6.0",
+                "debug": "4.3.7",
+                "entities": "^4.5.0",
+                "es-module-lexer": "1.5.4",
+                "esbuild": "0.20.2",
+                "estree-walker": "2.0.2",
+                "fast-glob": "3.3.3",
+                "fs-extra": "10.1.0",
+                "hash-sum": "2.0.0",
+                "isbinaryfile": "5.0.2",
+                "jsonc-parser": "3.3.1",
+                "lines-and-columns": "^2.0.4",
+                "magic-string": "0.30.11",
+                "merge": "2.1.1",
+                "mime": "3.0.0",
+                "module-alias": "2.2.3",
+                "os-locale-s-fix": "^1.0.8-fix-1",
+                "picocolors": "1.1.0",
+                "postcss-import": "^14.0.2",
+                "postcss-load-config": "^3.1.1",
+                "postcss-modules": "^4.3.0",
+                "postcss-selector-parser": "6.1.2",
+                "resolve": "1.22.8",
+                "source-map-js": "1.2.1",
+                "tapable": "^2.2.0",
+                "unimport": "4.1.1",
+                "unplugin-auto-import": "19.1.0",
+                "xregexp": "3.1.0"
+            },
+            "engines": {
+                "node": "^14.18.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/reactivity": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+            "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-core": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+            "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/reactivity": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/runtime-dom": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+            "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "csstype": "^3.1.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared/node_modules/@vue/server-renderer": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+            "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "vue": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-cli-shared/node_modules/vue": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+            "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/runtime-dom": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@dcloudio/uni-cloud": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-RQp+MkmrW/OxfaTbN1ohNnCcj7q55ub2F0pMAr5OCKHOV/sB4NhnwTKzB7C4B1Ha1oR8ulTAfmwUiBP89dSEmg==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/shared": "3.4.21",
+                "fast-glob": "3.3.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-components": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-YBsUWVx6OrJVR/59QU9H6QX+ulEB5GK+Fp3xZPU3NiVKczSAEsE2eBU3+xSYSyndUrP4BDqV1qhjt5cgpFJcsA==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cloud": "3.0.0-4080420251103001",
+                "@dcloudio/uni-h5": "3.0.0-4080420251103001",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001"
+            }
+        },
+        "node_modules/@dcloudio/uni-console": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-bVdk8iVfld8mTUX8tB6keRm54htGMLOeJhuG1Cx8R8aOJfqTU8yuowf8ZIxIRsqs2dXV/5fHNGcbd/uFosDwDA==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "fs-extra": "10.1.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5/-/uni-h5-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-Xl4bR2znjF6QJ2IHPen5eQiISpSWFZZaXXpFa0IyTf93xSBcSvsg9Nq5izBYPxkH4YXD/hiVHdbgwyHciq/cog==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-h5-vite": "3.0.0-4080420251103001",
+                "@dcloudio/uni-h5-vue": "3.0.0-4080420251103001",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "debug": "4.3.7",
+                "localstorage-polyfill": "^1.0.1",
+                "postcss-selector-parser": "6.1.2",
+                "safe-area-insets": "1.4.1",
+                "vue-router": "4.4.4",
+                "xmlhttprequest": "^1.8.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-Z9wMRSI+v9aDVlvQYHPnv1gggYJk6WVMINvty/tg01bFXMkBs99TyjaT4XShPM46q8TVySd3lDRQOcY6cfUY1A==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@rollup/pluginutils": "5.1.0",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "debug": "4.3.7",
+                "fs-extra": "10.1.0",
+                "mime": "3.0.0",
+                "module-alias": "2.2.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/reactivity": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+            "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-core": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+            "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/reactivity": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/runtime-dom": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+            "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "csstype": "^3.1.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/server-renderer": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+            "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "vue": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vite/node_modules/vue": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+            "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/runtime-dom": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-NbQCQFbnXIOKdek/ntwh1NslnmrZbuYRrfbe2ZVZOz8gXKfaR7GEO/GPPbTpI7mw3+iM906msksBh9HBzsD5TA==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/server-renderer": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/reactivity": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+            "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-core": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+            "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/reactivity": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/runtime-dom": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+            "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "csstype": "^3.1.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue/node_modules/@vue/server-renderer": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+            "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "vue": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5-vue/node_modules/vue": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+            "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/runtime-dom": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@dcloudio/uni-h5/node_modules/@vue/reactivity": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz",
+            "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-core": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+            "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/reactivity": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-dom": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+            "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/runtime-core": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "csstype": "^3.1.3"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5/node_modules/@vue/server-renderer": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+            "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "vue": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-h5/node_modules/vue": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
+            "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+            "license": "MIT",
+            "peer": true,
+            "dependencies": {
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/runtime-dom": "3.4.21",
+                "@vue/server-renderer": "3.4.21",
+                "@vue/shared": "3.4.21"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@dcloudio/uni-i18n": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-FHUQ8Ex0GbJsYxVZR1CrUoRc9Rm2OnfudCxpXIJSxpd1tp4sje8QhIeXwRIMEXcATc00hngTSgQrnuMuu5g72Q==",
+            "license": "Apache-2.0"
+        },
+        "node_modules/@dcloudio/uni-mp-compiler": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-compiler/-/uni-mp-compiler-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-tMyKHyUyNl/yy/6D7M66IVxJhkaieimL2F/ZprNP8fl1QWBZqBBxokxAVeFeGbX7f9Sd1Vi+HdAowQkMCNfdDw==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@babel/generator": "7.25.6",
+                "@babel/parser": "7.25.6",
+                "@babel/types": "7.25.6",
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/compiler-core": "3.4.21",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "estree-walker": "2.0.2"
+            }
+        },
+        "node_modules/@dcloudio/uni-mp-compiler/node_modules/@babel/generator": {
+            "version": "7.25.6",
+            "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.6.tgz",
+            "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.25.6",
+                "@jridgewell/gen-mapping": "^0.3.5",
+                "@jridgewell/trace-mapping": "^0.3.25",
+                "jsesc": "^2.5.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-mp-compiler/node_modules/jsesc": {
+            "version": "2.5.2",
+            "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz",
+            "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+            "license": "MIT",
+            "bin": {
+                "jsesc": "bin/jsesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@dcloudio/uni-mp-vite": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-vite/-/uni-mp-vite-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-/MQElW4cWS0nL1gofvpY0xV1XjAcF7zVrjYIFoiht1rEwW6ec64umKOI9YGMUKi+Gx8o2Qa4XTsqChlE/MzSFg==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-i18n": "3.0.0-4080420251103001",
+                "@dcloudio/uni-mp-compiler": "3.0.0-4080420251103001",
+                "@dcloudio/uni-mp-vue": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "debug": "4.3.7"
+            }
+        },
+        "node_modules/@dcloudio/uni-mp-vue": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-vue/-/uni-mp-vue-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-H1xF0jLrN3WnN/xCWKy+74bSt7AHa8grz3Nw75u+77vmkuIzxiGpauUQ4FG6l2zBtiW3EM+gfcfFUMunTlHM4A==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-mp-weixin": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-AoaXYxNngQBjNQ6hJJ4Jzz6KDDEjYeEUs8idhX+dujUO1JgBGpWbE9gP66VdaPNmD7+aZ/1tK1fZG6JjuHW+8w==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-mp-vite": "3.0.0-4080420251103001",
+                "@dcloudio/uni-mp-vue": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@vue/shared": "3.4.21",
+                "jimp": "0.10.3",
+                "licia": "1.41.1",
+                "qrcode-reader": "1.0.4",
+                "qrcode-terminal": "0.12.0",
+                "ws": "8.18.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-nvue-styler": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-LXwlJyfusm/bIC2qceJuJm72XNQtRXt5REG/6p+mtEYum8l4qloFJ5za1TdQXRsECXPGz6rS8YqU8iDTe70vdw==",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "parse-css-font": "^4.0.0",
+                "postcss": "8.4.45"
+            }
+        },
+        "node_modules/@dcloudio/uni-nvue-styler/node_modules/postcss": {
+            "version": "8.4.45",
+            "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.45.tgz",
+            "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "nanoid": "^3.3.7",
+                "picocolors": "^1.0.1",
+                "source-map-js": "^1.2.0"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/@dcloudio/uni-push": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-PZ766hB4OBRuHLNJ6umNNGo8WljC67LMFgpD7ORHa6+SmS+JfncMqXufWGsuh/Q/1/QPqe4Pcm8w1zG5Bke1vw==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001"
+            }
+        },
+        "node_modules/@dcloudio/uni-shared": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-+EfZmMVToYOaKBkzXix/LMGosZaFiFUyZ1vnGg3giLEcr5r8EYQ/NQ3GfthcD6pC9A114imv5Az+4HeKhcKZiw==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@dcloudio/uni-stat": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-CCADC5plW/etPbhORExii2pJ6m337YeHB+V1R7w6JBmFdGqqYj7+3Vq24wWSSECc4hpiZFLk3dNzu5/NNw2p1Q==",
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "debug": "4.3.7"
+            }
+        },
+        "node_modules/@dcloudio/vite-plugin-uni": {
+            "version": "3.0.0-4080420251103001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-4080420251103001.tgz",
+            "integrity": "sha512-r9UOGDrHqvOV2p9IW+4wql8BJJjKgPRWH9Y0rkztp7GjvtUqCkkoVwlh5sJXYwqPNZL5JWPuj0Cl+ZtTg1njyw==",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@babel/core": "7.25.2",
+                "@babel/plugin-syntax-import-meta": "^7.10.4",
+                "@babel/plugin-transform-typescript": "^7.23.3",
+                "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+                "@dcloudio/uni-nvue-styler": "3.0.0-4080420251103001",
+                "@dcloudio/uni-shared": "3.0.0-4080420251103001",
+                "@rollup/pluginutils": "5.1.0",
+                "@vitejs/plugin-legacy": "5.3.2",
+                "@vitejs/plugin-vue": "5.2.4",
+                "@vitejs/plugin-vue-jsx": "3.1.0",
+                "@vue/compiler-core": "3.4.21",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-sfc": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "cac": "6.7.9",
+                "debug": "4.3.7",
+                "estree-walker": "2.0.2",
+                "express": "4.20.0",
+                "fast-glob": "3.3.3",
+                "fs-extra": "10.1.0",
+                "hash-sum": "2.0.0",
+                "jsonc-parser": "3.3.1",
+                "magic-string": "0.30.11",
+                "picocolors": "1.1.0",
+                "terser": "^5.4.0",
+                "unplugin-auto-import": "19.1.0"
+            },
+            "bin": {
+                "uni": "bin/uni.js"
+            },
+            "engines": {
+                "node": "^14.18.0 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "vite": "5.2.8"
+            }
+        },
+        "node_modules/@emnapi/runtime": {
+            "version": "1.11.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@emnapi/runtime/-/runtime-1.11.1.tgz",
+            "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "tslib": "^2.4.0"
+            }
+        },
+        "node_modules/@esbuild/aix-ppc64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+            "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+            "cpu": [
+                "ppc64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "aix"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+            "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+            "cpu": [
+                "arm"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+            "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+            "cpu": [
+                "arm64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+            "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-arm64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+            "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+            "cpu": [
+                "arm64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+            "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-arm64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+            "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+            "cpu": [
+                "arm64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+            "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+            "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+            "cpu": [
+                "arm"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+            "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+            "cpu": [
+                "arm64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ia32": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+            "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+            "cpu": [
+                "ia32"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-loong64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+            "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+            "cpu": [
+                "loong64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-mips64el": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+            "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+            "cpu": [
+                "mips64el"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ppc64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+            "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+            "cpu": [
+                "ppc64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-riscv64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+            "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+            "cpu": [
+                "riscv64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-s390x": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+            "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+            "cpu": [
+                "s390x"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+            "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/netbsd-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+            "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/openbsd-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+            "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/sunos-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+            "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-arm64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+            "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-ia32": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+            "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+            "cpu": [
+                "ia32"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-x64": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+            "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+            "cpu": [
+                "x64"
+            ],
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@img/colour": {
+            "version": "1.1.0",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/colour/-/colour-1.1.0.tgz",
+            "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=18"
+            }
+        },
+        "node_modules/@img/sharp-darwin-arm64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.2.tgz",
+            "integrity": "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-darwin-arm64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-darwin-x64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.2.tgz",
+            "integrity": "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-darwin-x64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-freebsd-wasm32": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.2.tgz",
+            "integrity": "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==",
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "dependencies": {
+                "@img/sharp-wasm32": "0.35.2"
+            },
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-darwin-arm64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.1.tgz",
+            "integrity": "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-darwin-x64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.1.tgz",
+            "integrity": "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-arm": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.1.tgz",
+            "integrity": "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-arm64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.1.tgz",
+            "integrity": "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-ppc64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.1.tgz",
+            "integrity": "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-riscv64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.1.tgz",
+            "integrity": "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-s390x": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.1.tgz",
+            "integrity": "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linux-x64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.1.tgz",
+            "integrity": "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.1.tgz",
+            "integrity": "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+            "version": "1.3.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.1.tgz",
+            "integrity": "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-linux-arm": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.2.tgz",
+            "integrity": "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-arm": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linux-arm64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.2.tgz",
+            "integrity": "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-arm64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linux-ppc64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.2.tgz",
+            "integrity": "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-ppc64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linux-riscv64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.2.tgz",
+            "integrity": "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-riscv64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linux-s390x": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.2.tgz",
+            "integrity": "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-s390x": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linux-x64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.2.tgz",
+            "integrity": "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linux-x64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linuxmusl-arm64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.2.tgz",
+            "integrity": "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linuxmusl-arm64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-linuxmusl-x64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.2.tgz",
+            "integrity": "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-libvips-linuxmusl-x64": "1.3.1"
+            }
+        },
+        "node_modules/@img/sharp-wasm32": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-wasm32/-/sharp-wasm32-0.35.2.tgz",
+            "integrity": "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==",
+            "dev": true,
+            "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+            "optional": true,
+            "dependencies": {
+                "@emnapi/runtime": "^1.11.1"
+            },
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-webcontainers-wasm32": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.2.tgz",
+            "integrity": "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==",
+            "cpu": [
+                "wasm32"
+            ],
+            "dev": true,
+            "license": "Apache-2.0",
+            "optional": true,
+            "dependencies": {
+                "@img/sharp-wasm32": "0.35.2"
+            },
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-win32-arm64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.2.tgz",
+            "integrity": "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0 AND LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-win32-ia32": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.2.tgz",
+            "integrity": "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "license": "Apache-2.0 AND LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": "^20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@img/sharp-win32-x64": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.2.tgz",
+            "integrity": "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "Apache-2.0 AND LGPL-3.0-or-later",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            }
+        },
+        "node_modules/@intlify/core-base": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.9.tgz",
+            "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
+            "license": "MIT",
+            "dependencies": {
+                "@intlify/devtools-if": "9.1.9",
+                "@intlify/message-compiler": "9.1.9",
+                "@intlify/message-resolver": "9.1.9",
+                "@intlify/runtime": "9.1.9",
+                "@intlify/shared": "9.1.9",
+                "@intlify/vue-devtools": "9.1.9"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/devtools-if": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
+            "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@intlify/shared": "9.1.9"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/message-compiler": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
+            "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@intlify/message-resolver": "9.1.9",
+                "@intlify/shared": "9.1.9",
+                "source-map": "0.6.1"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/message-resolver": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
+            "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/runtime": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.9.tgz",
+            "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
+            "license": "MIT",
+            "dependencies": {
+                "@intlify/message-compiler": "9.1.9",
+                "@intlify/message-resolver": "9.1.9",
+                "@intlify/shared": "9.1.9"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/shared": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.9.tgz",
+            "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@intlify/vue-devtools": {
+            "version": "9.1.9",
+            "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
+            "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
+            "license": "MIT",
+            "dependencies": {
+                "@intlify/message-resolver": "9.1.9",
+                "@intlify/runtime": "9.1.9",
+                "@intlify/shared": "9.1.9"
+            },
+            "engines": {
+                "node": ">= 10"
+            }
+        },
+        "node_modules/@jimp/bmp": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/bmp/-/bmp-0.10.3.tgz",
+            "integrity": "sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "bmp-js": "^0.1.0",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/core": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/core/-/core-0.10.3.tgz",
+            "integrity": "sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "any-base": "^1.1.0",
+                "buffer": "^5.2.0",
+                "core-js": "^3.4.1",
+                "exif-parser": "^0.1.12",
+                "file-type": "^9.0.0",
+                "load-bmfont": "^1.3.1",
+                "mkdirp": "^0.5.1",
+                "phin": "^2.9.1",
+                "pixelmatch": "^4.0.2",
+                "tinycolor2": "^1.4.1"
+            }
+        },
+        "node_modules/@jimp/custom": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/custom/-/custom-0.10.3.tgz",
+            "integrity": "sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/core": "^0.10.3",
+                "core-js": "^3.4.1"
+            }
+        },
+        "node_modules/@jimp/gif": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/gif/-/gif-0.10.3.tgz",
+            "integrity": "sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1",
+                "omggif": "^1.0.9"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/jpeg": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/jpeg/-/jpeg-0.10.3.tgz",
+            "integrity": "sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1",
+                "jpeg-js": "^0.3.4"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-blit": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz",
+            "integrity": "sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-blur": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz",
+            "integrity": "sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-circle": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz",
+            "integrity": "sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-color": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-color/-/plugin-color-0.10.3.tgz",
+            "integrity": "sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1",
+                "tinycolor2": "^1.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-contain": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz",
+            "integrity": "sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-blit": ">=0.3.5",
+                "@jimp/plugin-resize": ">=0.3.5",
+                "@jimp/plugin-scale": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-cover": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz",
+            "integrity": "sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-crop": ">=0.3.5",
+                "@jimp/plugin-resize": ">=0.3.5",
+                "@jimp/plugin-scale": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-crop": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz",
+            "integrity": "sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-displace": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz",
+            "integrity": "sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-dither": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz",
+            "integrity": "sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-fisheye": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz",
+            "integrity": "sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-flip": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz",
+            "integrity": "sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-rotate": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-gaussian": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz",
+            "integrity": "sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-invert": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz",
+            "integrity": "sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-mask": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz",
+            "integrity": "sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-normalize": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz",
+            "integrity": "sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-print": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-print/-/plugin-print-0.10.3.tgz",
+            "integrity": "sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1",
+                "load-bmfont": "^1.4.0"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-blit": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-resize": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz",
+            "integrity": "sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-rotate": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz",
+            "integrity": "sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-blit": ">=0.3.5",
+                "@jimp/plugin-crop": ">=0.3.5",
+                "@jimp/plugin-resize": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-scale": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz",
+            "integrity": "sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-resize": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-shadow": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz",
+            "integrity": "sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-blur": ">=0.3.5",
+                "@jimp/plugin-resize": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/plugin-threshold": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz",
+            "integrity": "sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5",
+                "@jimp/plugin-color": ">=0.8.0",
+                "@jimp/plugin-resize": ">=0.8.0"
+            }
+        },
+        "node_modules/@jimp/plugins": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/plugins/-/plugins-0.10.3.tgz",
+            "integrity": "sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/plugin-blit": "^0.10.3",
+                "@jimp/plugin-blur": "^0.10.3",
+                "@jimp/plugin-circle": "^0.10.3",
+                "@jimp/plugin-color": "^0.10.3",
+                "@jimp/plugin-contain": "^0.10.3",
+                "@jimp/plugin-cover": "^0.10.3",
+                "@jimp/plugin-crop": "^0.10.3",
+                "@jimp/plugin-displace": "^0.10.3",
+                "@jimp/plugin-dither": "^0.10.3",
+                "@jimp/plugin-fisheye": "^0.10.3",
+                "@jimp/plugin-flip": "^0.10.3",
+                "@jimp/plugin-gaussian": "^0.10.3",
+                "@jimp/plugin-invert": "^0.10.3",
+                "@jimp/plugin-mask": "^0.10.3",
+                "@jimp/plugin-normalize": "^0.10.3",
+                "@jimp/plugin-print": "^0.10.3",
+                "@jimp/plugin-resize": "^0.10.3",
+                "@jimp/plugin-rotate": "^0.10.3",
+                "@jimp/plugin-scale": "^0.10.3",
+                "@jimp/plugin-shadow": "^0.10.3",
+                "@jimp/plugin-threshold": "^0.10.3",
+                "core-js": "^3.4.1",
+                "timm": "^1.6.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/png": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/png/-/png-0.10.3.tgz",
+            "integrity": "sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/utils": "^0.10.3",
+                "core-js": "^3.4.1",
+                "pngjs": "^3.3.3"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/tiff": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/tiff/-/tiff-0.10.3.tgz",
+            "integrity": "sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "core-js": "^3.4.1",
+                "utif": "^2.0.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/types": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/types/-/types-0.10.3.tgz",
+            "integrity": "sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/bmp": "^0.10.3",
+                "@jimp/gif": "^0.10.3",
+                "@jimp/jpeg": "^0.10.3",
+                "@jimp/png": "^0.10.3",
+                "@jimp/tiff": "^0.10.3",
+                "core-js": "^3.4.1",
+                "timm": "^1.6.1"
+            },
+            "peerDependencies": {
+                "@jimp/custom": ">=0.3.5"
+            }
+        },
+        "node_modules/@jimp/utils": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/@jimp/utils/-/utils-0.10.3.tgz",
+            "integrity": "sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "core-js": "^3.4.1",
+                "regenerator-runtime": "^0.13.3"
+            }
+        },
+        "node_modules/@jimp/utils/node_modules/regenerator-runtime": {
+            "version": "0.13.11",
+            "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+            "license": "MIT"
+        },
+        "node_modules/@jridgewell/gen-mapping": {
+            "version": "0.3.13",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+            "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.0",
+                "@jridgewell/trace-mapping": "^0.3.24"
+            }
+        },
+        "node_modules/@jridgewell/remapping": {
+            "version": "2.3.5",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+            "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.5",
+                "@jridgewell/trace-mapping": "^0.3.24"
+            }
+        },
+        "node_modules/@jridgewell/resolve-uri": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+            "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@jridgewell/source-map": {
+            "version": "0.3.11",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+            "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/gen-mapping": "^0.3.5",
+                "@jridgewell/trace-mapping": "^0.3.25"
+            }
+        },
+        "node_modules/@jridgewell/sourcemap-codec": {
+            "version": "1.5.5",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+            "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+            "license": "MIT"
+        },
+        "node_modules/@jridgewell/trace-mapping": {
+            "version": "0.3.31",
+            "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+            "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/resolve-uri": "^3.1.0",
+                "@jridgewell/sourcemap-codec": "^1.4.14"
+            }
+        },
+        "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==",
+            "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==",
+            "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==",
+            "license": "MIT",
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@parcel/watcher": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.6.tgz",
+            "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
+            "dev": true,
+            "hasInstallScript": true,
+            "license": "MIT",
+            "optional": true,
+            "dependencies": {
+                "detect-libc": "^2.0.3",
+                "is-glob": "^4.0.3",
+                "node-addon-api": "^7.0.0",
+                "picomatch": "^4.0.3"
+            },
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            },
+            "optionalDependencies": {
+                "@parcel/watcher-android-arm64": "2.5.6",
+                "@parcel/watcher-darwin-arm64": "2.5.6",
+                "@parcel/watcher-darwin-x64": "2.5.6",
+                "@parcel/watcher-freebsd-x64": "2.5.6",
+                "@parcel/watcher-linux-arm-glibc": "2.5.6",
+                "@parcel/watcher-linux-arm-musl": "2.5.6",
+                "@parcel/watcher-linux-arm64-glibc": "2.5.6",
+                "@parcel/watcher-linux-arm64-musl": "2.5.6",
+                "@parcel/watcher-linux-x64-glibc": "2.5.6",
+                "@parcel/watcher-linux-x64-musl": "2.5.6",
+                "@parcel/watcher-win32-arm64": "2.5.6",
+                "@parcel/watcher-win32-ia32": "2.5.6",
+                "@parcel/watcher-win32-x64": "2.5.6"
+            }
+        },
+        "node_modules/@parcel/watcher-android-arm64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz",
+            "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-darwin-arm64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
+            "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-darwin-x64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz",
+            "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-freebsd-x64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz",
+            "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-arm-glibc": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz",
+            "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-arm-musl": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz",
+            "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-arm64-glibc": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz",
+            "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-arm64-musl": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz",
+            "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-x64-glibc": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz",
+            "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-linux-x64-musl": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz",
+            "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-win32-arm64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz",
+            "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-win32-ia32": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz",
+            "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher-win32-x64": {
+            "version": "2.5.6",
+            "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz",
+            "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">= 10.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/parcel"
+            }
+        },
+        "node_modules/@parcel/watcher/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",
+            "optional": true,
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/@rollup/pluginutils": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+            "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+            "license": "MIT",
+            "dependencies": {
+                "@types/estree": "^1.0.0",
+                "estree-walker": "^2.0.2",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=14.0.0"
+            },
+            "peerDependencies": {
+                "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+            },
+            "peerDependenciesMeta": {
+                "rollup": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@rollup/rollup-android-arm-eabi": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz",
+            "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ]
+        },
+        "node_modules/@rollup/rollup-android-arm64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz",
+            "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "android"
+            ]
+        },
+        "node_modules/@rollup/rollup-darwin-arm64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz",
+            "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ]
+        },
+        "node_modules/@rollup/rollup-darwin-x64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz",
+            "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ]
+        },
+        "node_modules/@rollup/rollup-freebsd-arm64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz",
+            "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ]
+        },
+        "node_modules/@rollup/rollup-freebsd-x64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz",
+            "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "freebsd"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz",
+            "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz",
+            "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-arm64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz",
+            "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-arm64-musl": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz",
+            "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-loong64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz",
+            "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-loong64-musl": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz",
+            "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz",
+            "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-ppc64-musl": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz",
+            "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz",
+            "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-riscv64-musl": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz",
+            "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-s390x-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz",
+            "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-x64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz",
+            "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-linux-x64-musl": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz",
+            "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "linux"
+            ]
+        },
+        "node_modules/@rollup/rollup-openbsd-x64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz",
+            "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "openbsd"
+            ]
+        },
+        "node_modules/@rollup/rollup-openharmony-arm64": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz",
+            "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "openharmony"
+            ]
+        },
+        "node_modules/@rollup/rollup-win32-arm64-msvc": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz",
+            "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ]
+        },
+        "node_modules/@rollup/rollup-win32-ia32-msvc": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz",
+            "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ]
+        },
+        "node_modules/@rollup/rollup-win32-x64-gnu": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz",
+            "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ]
+        },
+        "node_modules/@rollup/rollup-win32-x64-msvc": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz",
+            "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "win32"
+            ]
+        },
+        "node_modules/@types/estree": {
+            "version": "1.0.9",
+            "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz",
+            "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+            "license": "MIT"
+        },
+        "node_modules/@types/node": {
+            "version": "20.19.42",
+            "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.42.tgz",
+            "integrity": "sha512-5L7SUaFC1RyDraj2yRhyBzHTobyXHmohD100CChNtyPyleoq37Mqab5Gn8XEKI04dfN/oqPdpHk38MgcQWHbZg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "undici-types": "~6.21.0"
+            }
+        },
+        "node_modules/@vitejs/plugin-legacy": {
+            "version": "5.3.2",
+            "resolved": "https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz",
+            "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/core": "^7.23.9",
+                "@babel/preset-env": "^7.23.9",
+                "browserslist": "^4.23.0",
+                "browserslist-to-esbuild": "^2.1.1",
+                "core-js": "^3.36.0",
+                "magic-string": "^0.30.7",
+                "regenerator-runtime": "^0.14.1",
+                "systemjs": "^6.14.3"
+            },
+            "engines": {
+                "node": "^18.0.0 || >=20.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/vitejs/vite?sponsor=1"
+            },
+            "peerDependencies": {
+                "terser": "^5.4.0",
+                "vite": "^5.0.0"
+            }
+        },
+        "node_modules/@vitejs/plugin-vue": {
+            "version": "5.2.4",
+            "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+            "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": "^18.0.0 || >=20.0.0"
+            },
+            "peerDependencies": {
+                "vite": "^5.0.0 || ^6.0.0",
+                "vue": "^3.2.25"
+            }
+        },
+        "node_modules/@vitejs/plugin-vue-jsx": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz",
+            "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/core": "^7.23.3",
+                "@babel/plugin-transform-typescript": "^7.23.3",
+                "@vue/babel-plugin-jsx": "^1.1.5"
+            },
+            "engines": {
+                "node": "^14.18.0 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "vite": "^4.0.0 || ^5.0.0",
+                "vue": "^3.0.0"
+            }
+        },
+        "node_modules/@volar/language-core": {
+            "version": "1.11.1",
+            "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz",
+            "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@volar/source-map": "1.11.1"
+            }
+        },
+        "node_modules/@volar/source-map": {
+            "version": "1.11.1",
+            "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz",
+            "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "muggle-string": "^0.3.1"
+            }
+        },
+        "node_modules/@volar/typescript": {
+            "version": "1.11.1",
+            "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz",
+            "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@volar/language-core": "1.11.1",
+                "path-browserify": "^1.0.1"
+            }
+        },
+        "node_modules/@vue/babel-helper-vue-transform-on": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz",
+            "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@vue/babel-plugin-jsx": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz",
+            "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-module-imports": "^7.27.1",
+                "@babel/helper-plugin-utils": "^7.27.1",
+                "@babel/plugin-syntax-jsx": "^7.27.1",
+                "@babel/template": "^7.27.2",
+                "@babel/traverse": "^7.28.0",
+                "@babel/types": "^7.28.2",
+                "@vue/babel-helper-vue-transform-on": "1.5.0",
+                "@vue/babel-plugin-resolve-type": "1.5.0",
+                "@vue/shared": "^3.5.18"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            },
+            "peerDependenciesMeta": {
+                "@babel/core": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@vue/babel-plugin-jsx/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/@vue/babel-plugin-jsx/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@vue/babel-plugin-resolve-type": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz",
+            "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/code-frame": "^7.27.1",
+                "@babel/helper-module-imports": "^7.27.1",
+                "@babel/helper-plugin-utils": "^7.27.1",
+                "@babel/parser": "^7.28.0",
+                "@vue/compiler-sfc": "^3.5.18"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sxzz"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.0.0-0"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/code-frame": {
+            "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",
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.29.7",
+                "js-tokens": "^4.0.0",
+                "picocolors": "^1.1.1"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/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/@vue/babel-plugin-resolve-type/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/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.35.tgz",
+            "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.29.3",
+                "@vue/shared": "3.5.35",
+                "entities": "^7.0.1",
+                "estree-walker": "^2.0.2",
+                "source-map-js": "^1.2.1"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz",
+            "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-core": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz",
+            "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.29.3",
+                "@vue/compiler-core": "3.5.35",
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/compiler-ssr": "3.5.35",
+                "@vue/shared": "3.5.35",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.30.21",
+                "postcss": "^8.5.15",
+                "source-map-js": "^1.2.1"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz",
+            "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/entities": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz",
+            "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/magic-string": {
+            "version": "0.30.21",
+            "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+            "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.5"
+            }
+        },
+        "node_modules/@vue/babel-plugin-resolve-type/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/@vue/compiler-core": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
+            "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.23.9",
+                "@vue/shared": "3.4.21",
+                "entities": "^4.5.0",
+                "estree-walker": "^2.0.2",
+                "source-map-js": "^1.0.2"
+            }
+        },
+        "node_modules/@vue/compiler-dom": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
+            "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-core": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@vue/compiler-sfc": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
+            "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.23.9",
+                "@vue/compiler-core": "3.4.21",
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/compiler-ssr": "3.4.21",
+                "@vue/shared": "3.4.21",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.30.7",
+                "postcss": "^8.4.35",
+                "source-map-js": "^1.0.2"
+            }
+        },
+        "node_modules/@vue/compiler-ssr": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
+            "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-dom": "3.4.21",
+                "@vue/shared": "3.4.21"
+            }
+        },
+        "node_modules/@vue/devtools-api": {
+            "version": "6.6.4",
+            "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+            "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/language-core": {
+            "version": "1.8.27",
+            "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz",
+            "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@volar/language-core": "~1.11.1",
+                "@volar/source-map": "~1.11.1",
+                "@vue/compiler-dom": "^3.3.0",
+                "@vue/shared": "^3.3.0",
+                "computeds": "^0.0.1",
+                "minimatch": "^9.0.3",
+                "muggle-string": "^0.3.1",
+                "path-browserify": "^1.0.1",
+                "vue-template-compiler": "^2.7.14"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@vue/reactivity": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.35.tgz",
+            "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/runtime-core": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.35.tgz",
+            "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/reactivity": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/runtime-dom": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz",
+            "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/reactivity": "3.5.35",
+                "@vue/runtime-core": "3.5.35",
+                "@vue/shared": "3.5.35",
+                "csstype": "^3.2.3"
+            }
+        },
+        "node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/server-renderer": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.35.tgz",
+            "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-ssr": "3.5.35",
+                "@vue/shared": "3.5.35"
+            },
+            "peerDependencies": {
+                "vue": "3.5.35"
+            }
+        },
+        "node_modules/@vue/server-renderer/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/@vue/server-renderer/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-core": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.35.tgz",
+            "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.29.3",
+                "@vue/shared": "3.5.35",
+                "entities": "^7.0.1",
+                "estree-walker": "^2.0.2",
+                "source-map-js": "^1.2.1"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-dom": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz",
+            "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-core": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/compiler-ssr": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz",
+            "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/@vue/server-renderer/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/server-renderer/node_modules/entities": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz",
+            "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+            "license": "BSD-2-Clause",
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/@vue/shared": {
+            "version": "3.4.21",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz",
+            "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+            "license": "MIT"
+        },
+        "node_modules/@vue/tsconfig": {
+            "version": "0.1.3",
+            "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz",
+            "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==",
+            "dev": true,
+            "license": "MIT",
+            "peerDependencies": {
+                "@types/node": "*"
+            },
+            "peerDependenciesMeta": {
+                "@types/node": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/accepts": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+            "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mime-types": "~2.1.34",
+                "negotiator": "0.6.3"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "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==",
+            "license": "MIT",
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/adm-zip": {
+            "version": "0.5.16",
+            "resolved": "https://registry.npmmirror.com/adm-zip/-/adm-zip-0.5.16.tgz",
+            "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12.0"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "license": "MIT",
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/any-base": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/any-base/-/any-base-1.1.0.tgz",
+            "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
+            "license": "MIT"
+        },
+        "node_modules/anymatch": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+            "license": "ISC",
+            "dependencies": {
+                "normalize-path": "^3.0.0",
+                "picomatch": "^2.0.4"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/array-flatten": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+            "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/autoprefixer": {
+            "version": "10.4.20",
+            "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz",
+            "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "browserslist": "^4.23.3",
+                "caniuse-lite": "^1.0.30001646",
+                "fraction.js": "^4.3.7",
+                "normalize-range": "^0.1.2",
+                "picocolors": "^1.0.1",
+                "postcss-value-parser": "^4.2.0"
+            },
+            "bin": {
+                "autoprefixer": "bin/autoprefixer"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-corejs2": {
+            "version": "0.4.17",
+            "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+            "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/compat-data": "^7.28.6",
+                "@babel/helper-define-polyfill-provider": "^0.6.8",
+                "semver": "^6.3.1"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-corejs3": {
+            "version": "0.14.2",
+            "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz",
+            "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-define-polyfill-provider": "^0.6.8",
+                "core-js-compat": "^3.48.0"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+            }
+        },
+        "node_modules/babel-plugin-polyfill-regenerator": {
+            "version": "0.6.8",
+            "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+            "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-define-polyfill-provider": "^0.6.8"
+            },
+            "peerDependencies": {
+                "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+            }
+        },
+        "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/base64-js": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+            "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/base64url": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmmirror.com/base64url/-/base64url-3.0.1.tgz",
+            "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/baseline-browser-mapping": {
+            "version": "2.10.34",
+            "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz",
+            "integrity": "sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==",
+            "license": "Apache-2.0",
+            "bin": {
+                "baseline-browser-mapping": "dist/cli.cjs"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/binary-extensions": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+            "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/bmp-js": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmmirror.com/bmp-js/-/bmp-js-0.1.0.tgz",
+            "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
+            "license": "MIT"
+        },
+        "node_modules/body-parser": {
+            "version": "1.20.3",
+            "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz",
+            "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "bytes": "3.1.2",
+                "content-type": "~1.0.5",
+                "debug": "2.6.9",
+                "depd": "2.0.0",
+                "destroy": "1.2.0",
+                "http-errors": "2.0.0",
+                "iconv-lite": "0.4.24",
+                "on-finished": "2.4.1",
+                "qs": "6.13.0",
+                "raw-body": "2.5.2",
+                "type-is": "~1.6.18",
+                "unpipe": "1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8",
+                "npm": "1.2.8000 || >= 1.4.16"
+            }
+        },
+        "node_modules/body-parser/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/body-parser/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/body-parser/node_modules/qs": {
+            "version": "6.13.0",
+            "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
+            "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "dependencies": {
+                "side-channel": "^1.0.6"
+            },
+            "engines": {
+                "node": ">=0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz",
+            "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "balanced-match": "^1.0.0"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+            "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+            "license": "MIT",
+            "dependencies": {
+                "fill-range": "^7.1.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/browserslist": {
+            "version": "4.28.2",
+            "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.2.tgz",
+            "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "baseline-browser-mapping": "^2.10.12",
+                "caniuse-lite": "^1.0.30001782",
+                "electron-to-chromium": "^1.5.328",
+                "node-releases": "^2.0.36",
+                "update-browserslist-db": "^1.2.3"
+            },
+            "bin": {
+                "browserslist": "cli.js"
+            },
+            "engines": {
+                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+            }
+        },
+        "node_modules/browserslist-to-esbuild": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmmirror.com/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz",
+            "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "meow": "^13.0.0"
+            },
+            "bin": {
+                "browserslist-to-esbuild": "cli/index.js"
+            },
+            "engines": {
+                "node": ">=18"
+            },
+            "peerDependencies": {
+                "browserslist": "*"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+            "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+            "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": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.1.13"
+            }
+        },
+        "node_modules/buffer-equal": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-0.0.1.tgz",
+            "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/buffer-from": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+            "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/bytes": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+            "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/cac": {
+            "version": "6.7.9",
+            "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.9.tgz",
+            "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "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/caniuse-lite": {
+            "version": "1.0.30001797",
+            "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz",
+            "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "CC-BY-4.0"
+        },
+        "node_modules/centra": {
+            "version": "2.7.0",
+            "resolved": "https://registry.npmmirror.com/centra/-/centra-2.7.0.tgz",
+            "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
+            "license": "MIT",
+            "dependencies": {
+                "follow-redirects": "^1.15.6"
+            }
+        },
+        "node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/chokidar": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+            "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+            "license": "MIT",
+            "dependencies": {
+                "anymatch": "~3.1.2",
+                "braces": "~3.0.2",
+                "glob-parent": "~5.1.2",
+                "is-binary-path": "~2.1.0",
+                "is-glob": "~4.0.1",
+                "normalize-path": "~3.0.0",
+                "readdirp": "~3.6.0"
+            },
+            "engines": {
+                "node": ">= 8.10.0"
+            },
+            "funding": {
+                "url": "https://paulmillr.com/funding/"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "license": "MIT",
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+            "license": "MIT"
+        },
+        "node_modules/commander": {
+            "version": "2.20.3",
+            "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+            "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/compare-versions": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmmirror.com/compare-versions/-/compare-versions-3.6.0.tgz",
+            "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+            "license": "MIT"
+        },
+        "node_modules/computeds": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz",
+            "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/confbox": {
+            "version": "0.1.8",
+            "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+            "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+            "license": "MIT"
+        },
+        "node_modules/content-disposition": {
+            "version": "0.5.4",
+            "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+            "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "safe-buffer": "5.2.1"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/content-type": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+            "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/convert-source-map": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
+            "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+            "license": "MIT"
+        },
+        "node_modules/cookie": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz",
+            "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/cookie-signature": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+            "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/core-js": {
+            "version": "3.49.0",
+            "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.49.0.tgz",
+            "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/core-js"
+            }
+        },
+        "node_modules/core-js-compat": {
+            "version": "3.49.0",
+            "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.49.0.tgz",
+            "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "browserslist": "^4.28.1"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/core-js"
+            }
+        },
+        "node_modules/css-font-size-keywords": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
+            "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/css-font-stretch-keywords": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
+            "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/css-font-style-keywords": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
+            "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/css-font-weight-keywords": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
+            "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/css-list-helpers": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/css-list-helpers/-/css-list-helpers-2.0.0.tgz",
+            "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/css-system-font-keywords": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
+            "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/cssesc": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+            "license": "MIT",
+            "bin": {
+                "cssesc": "bin/cssesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/csstype": {
+            "version": "3.2.3",
+            "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz",
+            "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+            "license": "MIT"
+        },
+        "node_modules/de-indent": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
+            "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/debug": {
+            "version": "4.3.7",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz",
+            "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+            "license": "MIT",
+            "dependencies": {
+                "ms": "^2.1.3"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/depd": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+            "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "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==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8",
+                "npm": "1.2.8000 || >= 1.4.16"
+            }
+        },
+        "node_modules/detect-libc": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz",
+            "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+            "dev": true,
+            "license": "Apache-2.0",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/dom-walk": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmmirror.com/dom-walk/-/dom-walk-0.1.2.tgz",
+            "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+        },
+        "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/ee-first": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+            "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/electron-to-chromium": {
+            "version": "1.5.368",
+            "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz",
+            "integrity": "sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==",
+            "license": "ISC"
+        },
+        "node_modules/encodeurl": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
+            "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/entities": {
+            "version": "4.5.0",
+            "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+            "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+            "license": "BSD-2-Clause",
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/es-define-property": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+            "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/es-errors": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+            "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/es-module-lexer": {
+            "version": "1.5.4",
+            "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+            "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+            "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/esbuild": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz",
+            "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "@esbuild/aix-ppc64": "0.20.2",
+                "@esbuild/android-arm": "0.20.2",
+                "@esbuild/android-arm64": "0.20.2",
+                "@esbuild/android-x64": "0.20.2",
+                "@esbuild/darwin-arm64": "0.20.2",
+                "@esbuild/darwin-x64": "0.20.2",
+                "@esbuild/freebsd-arm64": "0.20.2",
+                "@esbuild/freebsd-x64": "0.20.2",
+                "@esbuild/linux-arm": "0.20.2",
+                "@esbuild/linux-arm64": "0.20.2",
+                "@esbuild/linux-ia32": "0.20.2",
+                "@esbuild/linux-loong64": "0.20.2",
+                "@esbuild/linux-mips64el": "0.20.2",
+                "@esbuild/linux-ppc64": "0.20.2",
+                "@esbuild/linux-riscv64": "0.20.2",
+                "@esbuild/linux-s390x": "0.20.2",
+                "@esbuild/linux-x64": "0.20.2",
+                "@esbuild/netbsd-x64": "0.20.2",
+                "@esbuild/openbsd-x64": "0.20.2",
+                "@esbuild/sunos-x64": "0.20.2",
+                "@esbuild/win32-arm64": "0.20.2",
+                "@esbuild/win32-ia32": "0.20.2",
+                "@esbuild/win32-x64": "0.20.2"
+            }
+        },
+        "node_modules/escalade": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+            "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-html": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+            "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/estree-walker": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+            "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+            "license": "MIT"
+        },
+        "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.npmmirror.com/etag/-/etag-1.8.1.tgz",
+            "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/exif-parser": {
+            "version": "0.1.12",
+            "resolved": "https://registry.npmmirror.com/exif-parser/-/exif-parser-0.1.12.tgz",
+            "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+        },
+        "node_modules/express": {
+            "version": "4.20.0",
+            "resolved": "https://registry.npmmirror.com/express/-/express-4.20.0.tgz",
+            "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "accepts": "~1.3.8",
+                "array-flatten": "1.1.1",
+                "body-parser": "1.20.3",
+                "content-disposition": "0.5.4",
+                "content-type": "~1.0.4",
+                "cookie": "0.6.0",
+                "cookie-signature": "1.0.6",
+                "debug": "2.6.9",
+                "depd": "2.0.0",
+                "encodeurl": "~2.0.0",
+                "escape-html": "~1.0.3",
+                "etag": "~1.8.1",
+                "finalhandler": "1.2.0",
+                "fresh": "0.5.2",
+                "http-errors": "2.0.0",
+                "merge-descriptors": "1.0.3",
+                "methods": "~1.1.2",
+                "on-finished": "2.4.1",
+                "parseurl": "~1.3.3",
+                "path-to-regexp": "0.1.10",
+                "proxy-addr": "~2.0.7",
+                "qs": "6.11.0",
+                "range-parser": "~1.2.1",
+                "safe-buffer": "5.2.1",
+                "send": "0.19.0",
+                "serve-static": "1.16.0",
+                "setprototypeof": "1.2.0",
+                "statuses": "2.0.1",
+                "type-is": "~1.6.18",
+                "utils-merge": "1.0.1",
+                "vary": "~1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.10.0"
+            }
+        },
+        "node_modules/express/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/express/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/exsolve": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz",
+            "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
+            "license": "MIT"
+        },
+        "node_modules/fast-glob": {
+            "version": "3.3.3",
+            "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+            "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+            "license": "MIT",
+            "dependencies": {
+                "@nodelib/fs.stat": "^2.0.2",
+                "@nodelib/fs.walk": "^1.2.3",
+                "glob-parent": "^5.1.2",
+                "merge2": "^1.3.0",
+                "micromatch": "^4.0.8"
+            },
+            "engines": {
+                "node": ">=8.6.0"
+            }
+        },
+        "node_modules/fastq": {
+            "version": "1.20.1",
+            "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz",
+            "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+            "license": "ISC",
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/file-type": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmmirror.com/file-type/-/file-type-9.0.0.tgz",
+            "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/fill-range": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+            "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+            "license": "MIT",
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/finalhandler": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz",
+            "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "2.6.9",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "on-finished": "2.4.1",
+                "parseurl": "~1.3.3",
+                "statuses": "2.0.1",
+                "unpipe": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/finalhandler/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/finalhandler/node_modules/encodeurl": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+            "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/finalhandler/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/follow-redirects": {
+            "version": "1.16.0",
+            "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz",
+            "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/RubenVerborgh"
+                }
+            ],
+            "license": "MIT",
+            "engines": {
+                "node": ">=4.0"
+            },
+            "peerDependenciesMeta": {
+                "debug": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/forwarded": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+            "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/fraction.js": {
+            "version": "4.3.7",
+            "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
+            "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+            "license": "MIT",
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "type": "patreon",
+                "url": "https://github.com/sponsors/rawify"
+            }
+        },
+        "node_modules/fresh": {
+            "version": "0.5.2",
+            "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+            "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/fs-extra": {
+            "version": "10.1.0",
+            "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+            "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+            "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+            "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+            "license": "MIT",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/generic-names": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/generic-names/-/generic-names-4.0.0.tgz",
+            "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+            "license": "MIT",
+            "dependencies": {
+                "loader-utils": "^3.2.0"
+            }
+        },
+        "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==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/get-intrinsic": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+            "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "call-bind-apply-helpers": "^1.0.2",
+                "es-define-property": "^1.0.1",
+                "es-errors": "^1.3.0",
+                "es-object-atoms": "^1.1.1",
+                "function-bind": "^1.1.2",
+                "get-proto": "^1.0.1",
+                "gopd": "^1.2.0",
+                "has-symbols": "^1.1.0",
+                "hasown": "^2.0.2",
+                "math-intrinsics": "^1.1.0"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/get-proto": {
+            "version": "1.0.1",
+            "resolved": "https://registry.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/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "license": "ISC",
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/global": {
+            "version": "4.4.0",
+            "resolved": "https://registry.npmmirror.com/global/-/global-4.4.0.tgz",
+            "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+            "license": "MIT",
+            "dependencies": {
+                "min-document": "^2.19.0",
+                "process": "^0.11.10"
+            }
+        },
+        "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.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+            "license": "ISC"
+        },
+        "node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "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/hash-sum": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
+            "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+            "license": "MIT"
+        },
+        "node_modules/hasown": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz",
+            "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+            "license": "MIT",
+            "dependencies": {
+                "function-bind": "^1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/he": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+            "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+            "dev": true,
+            "license": "MIT",
+            "bin": {
+                "he": "bin/he"
+            }
+        },
+        "node_modules/http-errors": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+            "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "depd": "2.0.0",
+                "inherits": "2.0.4",
+                "setprototypeof": "1.2.0",
+                "statuses": "2.0.1",
+                "toidentifier": "1.0.1"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/iconv-lite": {
+            "version": "0.4.24",
+            "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+            "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "safer-buffer": ">= 2.1.2 < 3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/icss-replace-symbols": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+            "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
+            "license": "ISC"
+        },
+        "node_modules/icss-utils": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz",
+            "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+            "license": "ISC",
+            "engines": {
+                "node": "^10 || ^12 || >= 14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+            "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": "BSD-3-Clause"
+        },
+        "node_modules/immutable": {
+            "version": "5.1.6",
+            "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.6.tgz",
+            "integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "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/invert-kv": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmmirror.com/invert-kv/-/invert-kv-3.0.1.tgz",
+            "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sindresorhus/invert-kv?sponsor=1"
+            }
+        },
+        "node_modules/ipaddr.js": {
+            "version": "1.9.1",
+            "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+            "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/is-binary-path": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+            "license": "MIT",
+            "dependencies": {
+                "binary-extensions": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-core-module": {
+            "version": "2.16.2",
+            "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.2.tgz",
+            "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+            "license": "MIT",
+            "dependencies": {
+                "hasown": "^2.0.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-function": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/is-function/-/is-function-1.0.2.tgz",
+            "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+            "license": "MIT"
+        },
+        "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==",
+            "license": "MIT",
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-number": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/isbinaryfile": {
+            "version": "5.0.2",
+            "resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz",
+            "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 18.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/gjtorikian/"
+            }
+        },
+        "node_modules/jimp": {
+            "version": "0.10.3",
+            "resolved": "https://registry.npmmirror.com/jimp/-/jimp-0.10.3.tgz",
+            "integrity": "sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/runtime": "^7.7.2",
+                "@jimp/custom": "^0.10.3",
+                "@jimp/plugins": "^0.10.3",
+                "@jimp/types": "^0.10.3",
+                "core-js": "^3.4.1",
+                "regenerator-runtime": "^0.13.3"
+            }
+        },
+        "node_modules/jimp/node_modules/regenerator-runtime": {
+            "version": "0.13.11",
+            "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+            "license": "MIT"
+        },
+        "node_modules/jpeg-js": {
+            "version": "0.3.7",
+            "resolved": "https://registry.npmmirror.com/jpeg-js/-/jpeg-js-0.3.7.tgz",
+            "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
+            "license": "BSD-3-Clause"
+        },
+        "node_modules/js-tokens": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+            "license": "MIT"
+        },
+        "node_modules/jsesc": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
+            "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+            "license": "MIT",
+            "bin": {
+                "jsesc": "bin/jsesc"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/json5": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
+            "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+            "license": "MIT",
+            "bin": {
+                "json5": "lib/cli.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/jsonc-parser": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+            "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+            "license": "MIT"
+        },
+        "node_modules/jsonfile": {
+            "version": "6.2.1",
+            "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz",
+            "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+            "license": "MIT",
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/lcid": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmmirror.com/lcid/-/lcid-3.1.1.tgz",
+            "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+            "license": "MIT",
+            "dependencies": {
+                "invert-kv": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/licia": {
+            "version": "1.41.1",
+            "resolved": "https://registry.npmmirror.com/licia/-/licia-1.41.1.tgz",
+            "integrity": "sha512-XqObV8u1KEMdYWaNK0leRrTwhzKnLQEkhbnuUu7qGNH3zJoN7l9sfvF6PfHstSCuUOmpEP+0SBjRrk0I9uZs8g==",
+            "license": "MIT"
+        },
+        "node_modules/lilconfig": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
+            "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/lines-and-columns": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
+            "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
+            "license": "MIT",
+            "engines": {
+                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+            }
+        },
+        "node_modules/load-bmfont": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmmirror.com/load-bmfont/-/load-bmfont-1.4.2.tgz",
+            "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==",
+            "license": "MIT",
+            "dependencies": {
+                "buffer-equal": "0.0.1",
+                "mime": "^1.3.4",
+                "parse-bmfont-ascii": "^1.0.3",
+                "parse-bmfont-binary": "^1.0.5",
+                "parse-bmfont-xml": "^1.1.4",
+                "phin": "^3.7.1",
+                "xhr": "^2.0.1",
+                "xtend": "^4.0.0"
+            }
+        },
+        "node_modules/load-bmfont/node_modules/mime": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+            "license": "MIT",
+            "bin": {
+                "mime": "cli.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/load-bmfont/node_modules/phin": {
+            "version": "3.7.1",
+            "resolved": "https://registry.npmmirror.com/phin/-/phin-3.7.1.tgz",
+            "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==",
+            "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+            "license": "MIT",
+            "dependencies": {
+                "centra": "^2.7.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/loader-utils": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz",
+            "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 12.13.0"
+            }
+        },
+        "node_modules/local-pkg": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.2.1.tgz",
+            "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
+            "license": "MIT",
+            "dependencies": {
+                "mlly": "^1.7.4",
+                "pkg-types": "^2.3.0",
+                "quansync": "^0.2.11"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/antfu"
+            }
+        },
+        "node_modules/local-pkg/node_modules/confbox": {
+            "version": "0.2.4",
+            "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz",
+            "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+            "license": "MIT"
+        },
+        "node_modules/local-pkg/node_modules/pkg-types": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz",
+            "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
+            "license": "MIT",
+            "dependencies": {
+                "confbox": "^0.2.4",
+                "exsolve": "^1.0.8",
+                "pathe": "^2.0.3"
+            }
+        },
+        "node_modules/localstorage-polyfill": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/localstorage-polyfill/-/localstorage-polyfill-1.0.1.tgz",
+            "integrity": "sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/lodash.camelcase": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+            "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+            "license": "MIT"
+        },
+        "node_modules/lodash.debounce": {
+            "version": "4.0.8",
+            "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+            "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "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==",
+            "license": "ISC",
+            "dependencies": {
+                "yallist": "^3.0.2"
+            }
+        },
+        "node_modules/magic-string": {
+            "version": "0.30.11",
+            "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+            "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.0"
+            }
+        },
+        "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/media-typer": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+            "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/meow": {
+            "version": "13.2.0",
+            "resolved": "https://registry.npmmirror.com/meow/-/meow-13.2.0.tgz",
+            "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=18"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/merge": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz",
+            "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+            "license": "MIT"
+        },
+        "node_modules/merge-descriptors": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+            "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+            "dev": true,
+            "license": "MIT",
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/merge2": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/methods": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+            "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/micromatch": {
+            "version": "4.0.8",
+            "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+            "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+            "license": "MIT",
+            "dependencies": {
+                "braces": "^3.0.3",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/mime": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz",
+            "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+            "license": "MIT",
+            "bin": {
+                "mime": "cli.js"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "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==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/mime-types": {
+            "version": "2.1.35",
+            "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+            "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/min-document": {
+            "version": "2.19.2",
+            "resolved": "https://registry.npmmirror.com/min-document/-/min-document-2.19.2.tgz",
+            "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
+            "license": "MIT",
+            "dependencies": {
+                "dom-walk": "^0.1.0"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "9.0.9",
+            "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz",
+            "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "brace-expansion": "^2.0.2"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            },
+            "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==",
+            "license": "MIT",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "0.5.6",
+            "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+            "license": "MIT",
+            "dependencies": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/mlly": {
+            "version": "1.8.2",
+            "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz",
+            "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+            "license": "MIT",
+            "dependencies": {
+                "acorn": "^8.16.0",
+                "pathe": "^2.0.3",
+                "pkg-types": "^1.3.1",
+                "ufo": "^1.6.3"
+            }
+        },
+        "node_modules/module-alias": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz",
+            "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+            "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==",
+            "license": "MIT"
+        },
+        "node_modules/muggle-string": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz",
+            "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/nanoid": {
+            "version": "3.3.12",
+            "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.12.tgz",
+            "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/negotiator": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/node-addon-api": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+            "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+            "dev": true,
+            "license": "MIT",
+            "optional": true
+        },
+        "node_modules/node-releases": {
+            "version": "2.0.47",
+            "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.47.tgz",
+            "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=18"
+            }
+        },
+        "node_modules/normalize-path": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/normalize-range": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+            "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "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/omggif": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmmirror.com/omggif/-/omggif-1.0.10.tgz",
+            "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+            "license": "MIT"
+        },
+        "node_modules/on-finished": {
+            "version": "2.4.1",
+            "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+            "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ee-first": "1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/os-locale-s-fix": {
+            "version": "1.0.8-fix-1",
+            "resolved": "https://registry.npmmirror.com/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
+            "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==",
+            "license": "MIT",
+            "dependencies": {
+                "lcid": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10",
+                "yarn": "^1.22.4"
+            }
+        },
+        "node_modules/pako": {
+            "version": "1.0.11",
+            "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+            "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+            "license": "(MIT AND Zlib)"
+        },
+        "node_modules/parse-bmfont-ascii": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmmirror.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+            "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
+            "license": "MIT"
+        },
+        "node_modules/parse-bmfont-binary": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmmirror.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+            "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
+            "license": "MIT"
+        },
+        "node_modules/parse-bmfont-xml": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmmirror.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
+            "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
+            "license": "MIT",
+            "dependencies": {
+                "xml-parse-from-string": "^1.0.0",
+                "xml2js": "^0.5.0"
+            }
+        },
+        "node_modules/parse-css-font": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/parse-css-font/-/parse-css-font-4.0.0.tgz",
+            "integrity": "sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "css-font-size-keywords": "^1.0.0",
+                "css-font-stretch-keywords": "^1.0.1",
+                "css-font-style-keywords": "^1.0.1",
+                "css-font-weight-keywords": "^1.0.0",
+                "css-list-helpers": "^2.0.0",
+                "css-system-font-keywords": "^1.0.0",
+                "unquote": "^1.1.1"
+            }
+        },
+        "node_modules/parse-headers": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.6.tgz",
+            "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==",
+            "license": "MIT"
+        },
+        "node_modules/parseurl": {
+            "version": "1.3.3",
+            "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+            "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/path-browserify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
+            "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+            "license": "MIT"
+        },
+        "node_modules/path-to-regexp": {
+            "version": "0.1.10",
+            "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
+            "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/pathe": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz",
+            "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+            "license": "MIT"
+        },
+        "node_modules/phin": {
+            "version": "2.9.3",
+            "resolved": "https://registry.npmmirror.com/phin/-/phin-2.9.3.tgz",
+            "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
+            "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+            "license": "MIT"
+        },
+        "node_modules/picocolors": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz",
+            "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+            "license": "ISC"
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz",
+            "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/pify": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
+            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/pinia": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz",
+            "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/devtools-api": "^6.6.3",
+                "vue-demi": "^0.14.10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/posva"
+            },
+            "peerDependencies": {
+                "typescript": ">=4.4.4",
+                "vue": "^2.7.0 || ^3.5.11"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/pixelmatch": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmmirror.com/pixelmatch/-/pixelmatch-4.0.2.tgz",
+            "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+            "license": "ISC",
+            "dependencies": {
+                "pngjs": "^3.0.0"
+            },
+            "bin": {
+                "pixelmatch": "bin/pixelmatch"
+            }
+        },
+        "node_modules/pkg-types": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz",
+            "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+            "license": "MIT",
+            "dependencies": {
+                "confbox": "^0.1.8",
+                "mlly": "^1.7.4",
+                "pathe": "^2.0.1"
+            }
+        },
+        "node_modules/pngjs": {
+            "version": "3.4.0",
+            "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-3.4.0.tgz",
+            "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/postcss": {
+            "version": "8.5.15",
+            "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz",
+            "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "nanoid": "^3.3.12",
+                "picocolors": "^1.1.1",
+                "source-map-js": "^1.2.1"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/postcss-import": {
+            "version": "14.1.0",
+            "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz",
+            "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+            "license": "MIT",
+            "dependencies": {
+                "postcss-value-parser": "^4.0.0",
+                "read-cache": "^1.0.0",
+                "resolve": "^1.1.7"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "postcss": "^8.0.0"
+            }
+        },
+        "node_modules/postcss-load-config": {
+            "version": "3.1.4",
+            "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+            "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+            "license": "MIT",
+            "dependencies": {
+                "lilconfig": "^2.0.5",
+                "yaml": "^1.10.2"
+            },
+            "engines": {
+                "node": ">= 10"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": ">=8.0.9",
+                "ts-node": ">=9.0.0"
+            },
+            "peerDependenciesMeta": {
+                "postcss": {
+                    "optional": true
+                },
+                "ts-node": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/postcss-modules": {
+            "version": "4.3.1",
+            "resolved": "https://registry.npmmirror.com/postcss-modules/-/postcss-modules-4.3.1.tgz",
+            "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+            "license": "MIT",
+            "dependencies": {
+                "generic-names": "^4.0.0",
+                "icss-replace-symbols": "^1.1.0",
+                "lodash.camelcase": "^4.3.0",
+                "postcss-modules-extract-imports": "^3.0.0",
+                "postcss-modules-local-by-default": "^4.0.0",
+                "postcss-modules-scope": "^3.0.0",
+                "postcss-modules-values": "^4.0.0",
+                "string-hash": "^1.1.1"
+            },
+            "peerDependencies": {
+                "postcss": "^8.0.0"
+            }
+        },
+        "node_modules/postcss-modules-extract-imports": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+            "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+            "license": "ISC",
+            "engines": {
+                "node": "^10 || ^12 || >= 14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/postcss-modules-local-by-default": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+            "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+            "license": "MIT",
+            "dependencies": {
+                "icss-utils": "^5.0.0",
+                "postcss-selector-parser": "^7.0.0",
+                "postcss-value-parser": "^4.1.0"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >= 14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+            "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+            "license": "MIT",
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-modules-scope": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+            "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+            "license": "ISC",
+            "dependencies": {
+                "postcss-selector-parser": "^7.0.0"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >= 14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+            "version": "7.1.1",
+            "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+            "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+            "license": "MIT",
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-modules-values": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+            "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+            "license": "ISC",
+            "dependencies": {
+                "icss-utils": "^5.0.0"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >= 14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/postcss-selector-parser": {
+            "version": "6.1.2",
+            "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+            "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+            "license": "MIT",
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-value-parser": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+            "license": "MIT"
+        },
+        "node_modules/postcss/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "license": "ISC"
+        },
+        "node_modules/process": {
+            "version": "0.11.10",
+            "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+            "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6.0"
+            }
+        },
+        "node_modules/proxy-addr": {
+            "version": "2.0.7",
+            "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+            "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "forwarded": "0.2.0",
+                "ipaddr.js": "1.9.1"
+            },
+            "engines": {
+                "node": ">= 0.10"
+            }
+        },
+        "node_modules/qrcode-reader": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmmirror.com/qrcode-reader/-/qrcode-reader-1.0.4.tgz",
+            "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==",
+            "license": "Apache-2.0"
+        },
+        "node_modules/qrcode-terminal": {
+            "version": "0.12.0",
+            "resolved": "https://registry.npmmirror.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+            "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+            "bin": {
+                "qrcode-terminal": "bin/qrcode-terminal.js"
+            }
+        },
+        "node_modules/qs": {
+            "version": "6.11.0",
+            "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz",
+            "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+            "dev": true,
+            "license": "BSD-3-Clause",
+            "dependencies": {
+                "side-channel": "^1.0.4"
+            },
+            "engines": {
+                "node": ">=0.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/quansync": {
+            "version": "0.2.11",
+            "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz",
+            "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/antfu"
+                },
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/sxzz"
+                }
+            ],
+            "license": "MIT"
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+            "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/range-parser": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+            "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/raw-body": {
+            "version": "2.5.2",
+            "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz",
+            "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "bytes": "3.1.2",
+                "http-errors": "2.0.0",
+                "iconv-lite": "0.4.24",
+                "unpipe": "1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/read-cache": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
+            "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+            "license": "MIT",
+            "dependencies": {
+                "pify": "^2.3.0"
+            }
+        },
+        "node_modules/readdirp": {
+            "version": "3.6.0",
+            "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+            "license": "MIT",
+            "dependencies": {
+                "picomatch": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=8.10.0"
+            }
+        },
+        "node_modules/regenerate": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
+            "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/regenerate-unicode-properties": {
+            "version": "10.2.2",
+            "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+            "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "regenerate": "^1.4.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/regenerator-runtime": {
+            "version": "0.14.1",
+            "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+            "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/regexpu-core": {
+            "version": "6.4.0",
+            "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz",
+            "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "regenerate": "^1.4.2",
+                "regenerate-unicode-properties": "^10.2.2",
+                "regjsgen": "^0.8.0",
+                "regjsparser": "^0.13.0",
+                "unicode-match-property-ecmascript": "^2.0.0",
+                "unicode-match-property-value-ecmascript": "^2.2.1"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/regjsgen": {
+            "version": "0.8.0",
+            "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz",
+            "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/regjsparser": {
+            "version": "0.13.1",
+            "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.1.tgz",
+            "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "jsesc": "~3.1.0"
+            },
+            "bin": {
+                "regjsparser": "bin/parser"
+            }
+        },
+        "node_modules/resolve": {
+            "version": "1.22.8",
+            "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
+            "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+            "license": "MIT",
+            "dependencies": {
+                "is-core-module": "^2.13.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/reusify": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+            "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+            "license": "MIT",
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rollup": {
+            "version": "4.61.1",
+            "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.61.1.tgz",
+            "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==",
+            "devOptional": true,
+            "license": "MIT",
+            "dependencies": {
+                "@types/estree": "1.0.9"
+            },
+            "bin": {
+                "rollup": "dist/bin/rollup"
+            },
+            "engines": {
+                "node": ">=18.0.0",
+                "npm": ">=8.0.0"
+            },
+            "optionalDependencies": {
+                "@rollup/rollup-android-arm-eabi": "4.61.1",
+                "@rollup/rollup-android-arm64": "4.61.1",
+                "@rollup/rollup-darwin-arm64": "4.61.1",
+                "@rollup/rollup-darwin-x64": "4.61.1",
+                "@rollup/rollup-freebsd-arm64": "4.61.1",
+                "@rollup/rollup-freebsd-x64": "4.61.1",
+                "@rollup/rollup-linux-arm-gnueabihf": "4.61.1",
+                "@rollup/rollup-linux-arm-musleabihf": "4.61.1",
+                "@rollup/rollup-linux-arm64-gnu": "4.61.1",
+                "@rollup/rollup-linux-arm64-musl": "4.61.1",
+                "@rollup/rollup-linux-loong64-gnu": "4.61.1",
+                "@rollup/rollup-linux-loong64-musl": "4.61.1",
+                "@rollup/rollup-linux-ppc64-gnu": "4.61.1",
+                "@rollup/rollup-linux-ppc64-musl": "4.61.1",
+                "@rollup/rollup-linux-riscv64-gnu": "4.61.1",
+                "@rollup/rollup-linux-riscv64-musl": "4.61.1",
+                "@rollup/rollup-linux-s390x-gnu": "4.61.1",
+                "@rollup/rollup-linux-x64-gnu": "4.61.1",
+                "@rollup/rollup-linux-x64-musl": "4.61.1",
+                "@rollup/rollup-openbsd-x64": "4.61.1",
+                "@rollup/rollup-openharmony-arm64": "4.61.1",
+                "@rollup/rollup-win32-arm64-msvc": "4.61.1",
+                "@rollup/rollup-win32-ia32-msvc": "4.61.1",
+                "@rollup/rollup-win32-x64-gnu": "4.61.1",
+                "@rollup/rollup-win32-x64-msvc": "4.61.1",
+                "fsevents": "~2.3.2"
+            }
+        },
+        "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==",
+            "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/safe-area-insets": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmmirror.com/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+            "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ==",
+            "license": "ISC"
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "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/safer-buffer": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+            "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/sass": {
+            "version": "1.100.0",
+            "resolved": "https://registry.npmmirror.com/sass/-/sass-1.100.0.tgz",
+            "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "chokidar": "^5.0.0",
+                "immutable": "^5.1.5",
+                "source-map-js": ">=0.6.2 <2.0.0"
+            },
+            "bin": {
+                "sass": "sass.js"
+            },
+            "engines": {
+                "node": ">=20.19.0"
+            },
+            "optionalDependencies": {
+                "@parcel/watcher": "^2.4.1"
+            }
+        },
+        "node_modules/sass/node_modules/chokidar": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz",
+            "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "readdirp": "^5.0.0"
+            },
+            "engines": {
+                "node": ">= 20.19.0"
+            },
+            "funding": {
+                "url": "https://paulmillr.com/funding/"
+            }
+        },
+        "node_modules/sass/node_modules/readdirp": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz",
+            "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 20.19.0"
+            },
+            "funding": {
+                "type": "individual",
+                "url": "https://paulmillr.com/funding/"
+            }
+        },
+        "node_modules/sax": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz",
+            "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+            "license": "BlueOak-1.0.0",
+            "engines": {
+                "node": ">=11.0.0"
+            }
+        },
+        "node_modules/scule": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+            "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+            "license": "MIT"
+        },
+        "node_modules/semver": {
+            "version": "6.3.1",
+            "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+            "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            }
+        },
+        "node_modules/send": {
+            "version": "0.19.0",
+            "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz",
+            "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "2.6.9",
+                "depd": "2.0.0",
+                "destroy": "1.2.0",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "etag": "~1.8.1",
+                "fresh": "0.5.2",
+                "http-errors": "2.0.0",
+                "mime": "1.6.0",
+                "ms": "2.1.3",
+                "on-finished": "2.4.1",
+                "range-parser": "~1.2.1",
+                "statuses": "2.0.1"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/send/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/send/node_modules/debug/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/send/node_modules/encodeurl": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+            "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/send/node_modules/mime": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+            "dev": true,
+            "license": "MIT",
+            "bin": {
+                "mime": "cli.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/serve-static": {
+            "version": "1.16.0",
+            "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.0.tgz",
+            "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "parseurl": "~1.3.3",
+                "send": "0.18.0"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/serve-static/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/serve-static/node_modules/debug/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/serve-static/node_modules/encodeurl": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+            "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/serve-static/node_modules/mime": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+            "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+            "dev": true,
+            "license": "MIT",
+            "bin": {
+                "mime": "cli.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/serve-static/node_modules/send": {
+            "version": "0.18.0",
+            "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz",
+            "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "debug": "2.6.9",
+                "depd": "2.0.0",
+                "destroy": "1.2.0",
+                "encodeurl": "~1.0.2",
+                "escape-html": "~1.0.3",
+                "etag": "~1.8.1",
+                "fresh": "0.5.2",
+                "http-errors": "2.0.0",
+                "mime": "1.6.0",
+                "ms": "2.1.3",
+                "on-finished": "2.4.1",
+                "range-parser": "~1.2.1",
+                "statuses": "2.0.1"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/setprototypeof": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+            "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+            "dev": true,
+            "license": "ISC"
+        },
+        "node_modules/sharp": {
+            "version": "0.35.2",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/sharp/-/sharp-0.35.2.tgz",
+            "integrity": "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==",
+            "dev": true,
+            "license": "Apache-2.0",
+            "dependencies": {
+                "@img/colour": "^1.1.0",
+                "detect-libc": "^2.1.2",
+                "semver": "^7.8.4"
+            },
+            "engines": {
+                "node": ">=20.9.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/libvips"
+            },
+            "optionalDependencies": {
+                "@img/sharp-darwin-arm64": "0.35.2",
+                "@img/sharp-darwin-x64": "0.35.2",
+                "@img/sharp-freebsd-wasm32": "0.35.2",
+                "@img/sharp-libvips-darwin-arm64": "1.3.1",
+                "@img/sharp-libvips-darwin-x64": "1.3.1",
+                "@img/sharp-libvips-linux-arm": "1.3.1",
+                "@img/sharp-libvips-linux-arm64": "1.3.1",
+                "@img/sharp-libvips-linux-ppc64": "1.3.1",
+                "@img/sharp-libvips-linux-riscv64": "1.3.1",
+                "@img/sharp-libvips-linux-s390x": "1.3.1",
+                "@img/sharp-libvips-linux-x64": "1.3.1",
+                "@img/sharp-libvips-linuxmusl-arm64": "1.3.1",
+                "@img/sharp-libvips-linuxmusl-x64": "1.3.1",
+                "@img/sharp-linux-arm": "0.35.2",
+                "@img/sharp-linux-arm64": "0.35.2",
+                "@img/sharp-linux-ppc64": "0.35.2",
+                "@img/sharp-linux-riscv64": "0.35.2",
+                "@img/sharp-linux-s390x": "0.35.2",
+                "@img/sharp-linux-x64": "0.35.2",
+                "@img/sharp-linuxmusl-arm64": "0.35.2",
+                "@img/sharp-linuxmusl-x64": "0.35.2",
+                "@img/sharp-webcontainers-wasm32": "0.35.2",
+                "@img/sharp-win32-arm64": "0.35.2",
+                "@img/sharp-win32-ia32": "0.35.2",
+                "@img/sharp-win32-x64": "0.35.2"
+            }
+        },
+        "node_modules/sharp/node_modules/semver": {
+            "version": "7.8.5",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/semver/-/semver-7.8.5.tgz",
+            "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "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/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "license": "BSD-3-Clause",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-js": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+            "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+            "license": "BSD-3-Clause",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-support": {
+            "version": "0.5.21",
+            "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+            "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "source-map": "^0.6.0"
+            }
+        },
+        "node_modules/statuses": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+            "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/string-hash": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmmirror.com/string-hash/-/string-hash-1.1.3.tgz",
+            "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+            "license": "CC0-1.0"
+        },
+        "node_modules/strip-literal": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.1.0.tgz",
+            "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+            "license": "MIT",
+            "dependencies": {
+                "js-tokens": "^9.0.1"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/antfu"
+            }
+        },
+        "node_modules/strip-literal/node_modules/js-tokens": {
+            "version": "9.0.1",
+            "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+            "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+            "license": "MIT"
+        },
+        "node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "license": "MIT",
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/systemjs": {
+            "version": "6.15.1",
+            "resolved": "https://registry.npmmirror.com/systemjs/-/systemjs-6.15.1.tgz",
+            "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/tapable": {
+            "version": "2.3.3",
+            "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz",
+            "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/webpack"
+            }
+        },
+        "node_modules/terser": {
+            "version": "5.48.0",
+            "resolved": "https://registry.npmmirror.com/terser/-/terser-5.48.0.tgz",
+            "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==",
+            "dev": true,
+            "license": "BSD-2-Clause",
+            "dependencies": {
+                "@jridgewell/source-map": "^0.3.3",
+                "acorn": "^8.15.0",
+                "commander": "^2.20.0",
+                "source-map-support": "~0.5.20"
+            },
+            "bin": {
+                "terser": "bin/terser"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/timm": {
+            "version": "1.7.1",
+            "resolved": "https://registry.npmmirror.com/timm/-/timm-1.7.1.tgz",
+            "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==",
+            "license": "MIT"
+        },
+        "node_modules/tinycolor2": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
+            "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+            "license": "MIT"
+        },
+        "node_modules/to-fast-properties": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+            "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+            "license": "MIT",
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/toidentifier": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+            "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.6"
+            }
+        },
+        "node_modules/tslib": {
+            "version": "2.8.1",
+            "resolved": "https://packages.aliyun.com/6051be3dff5718e91a64e9da/npm/npm-registry/tslib/-/tslib-2.8.1.tgz",
+            "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+            "dev": true,
+            "license": "0BSD",
+            "optional": true
+        },
+        "node_modules/type-is": {
+            "version": "1.6.18",
+            "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+            "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "media-typer": "0.3.0",
+                "mime-types": "~2.1.24"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "4.9.5",
+            "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz",
+            "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+            "devOptional": true,
+            "license": "Apache-2.0",
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=4.2.0"
+            }
+        },
+        "node_modules/ufo": {
+            "version": "1.6.4",
+            "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.4.tgz",
+            "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+            "license": "MIT"
+        },
+        "node_modules/undici-types": {
+            "version": "6.21.0",
+            "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
+            "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/unicode-canonical-property-names-ecmascript": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+            "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-match-property-ecmascript": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+            "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "unicode-canonical-property-names-ecmascript": "^2.0.0",
+                "unicode-property-aliases-ecmascript": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-match-property-value-ecmascript": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+            "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unicode-property-aliases-ecmascript": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+            "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/unimport": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.1.1.tgz",
+            "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==",
+            "license": "MIT",
+            "dependencies": {
+                "acorn": "^8.14.0",
+                "escape-string-regexp": "^5.0.0",
+                "estree-walker": "^3.0.3",
+                "fast-glob": "^3.3.3",
+                "local-pkg": "^1.0.0",
+                "magic-string": "^0.30.17",
+                "mlly": "^1.7.4",
+                "pathe": "^2.0.2",
+                "picomatch": "^4.0.2",
+                "pkg-types": "^1.3.1",
+                "scule": "^1.3.0",
+                "strip-literal": "^3.0.0",
+                "unplugin": "^2.1.2",
+                "unplugin-utils": "^0.2.3"
+            },
+            "engines": {
+                "node": ">=18.12.0"
+            }
+        },
+        "node_modules/unimport/node_modules/escape-string-regexp": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+            "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/unimport/node_modules/estree-walker": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+            "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+            "license": "MIT",
+            "dependencies": {
+                "@types/estree": "^1.0.0"
+            }
+        },
+        "node_modules/unimport/node_modules/magic-string": {
+            "version": "0.30.21",
+            "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+            "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.5"
+            }
+        },
+        "node_modules/unimport/node_modules/picomatch": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz",
+            "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/universalify": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+            "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/unpipe": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+            "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/unplugin": {
+            "version": "2.3.11",
+            "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz",
+            "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/remapping": "^2.3.5",
+                "acorn": "^8.15.0",
+                "picomatch": "^4.0.3",
+                "webpack-virtual-modules": "^0.6.2"
+            },
+            "engines": {
+                "node": ">=18.12.0"
+            }
+        },
+        "node_modules/unplugin-auto-import": {
+            "version": "19.1.0",
+            "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
+            "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
+            "license": "MIT",
+            "dependencies": {
+                "local-pkg": "^1.0.0",
+                "magic-string": "^0.30.17",
+                "picomatch": "^4.0.2",
+                "unimport": "^4.1.1",
+                "unplugin": "^2.2.0",
+                "unplugin-utils": "^0.2.4"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/antfu"
+            },
+            "peerDependencies": {
+                "@nuxt/kit": "^3.2.2",
+                "@vueuse/core": "*"
+            },
+            "peerDependenciesMeta": {
+                "@nuxt/kit": {
+                    "optional": true
+                },
+                "@vueuse/core": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/unplugin-auto-import/node_modules/magic-string": {
+            "version": "0.30.21",
+            "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+            "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.5"
+            }
+        },
+        "node_modules/unplugin-auto-import/node_modules/picomatch": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz",
+            "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/unplugin-utils": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz",
+            "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==",
+            "license": "MIT",
+            "dependencies": {
+                "pathe": "^2.0.3",
+                "picomatch": "^4.0.3"
+            },
+            "engines": {
+                "node": ">=18.12.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sxzz"
+            }
+        },
+        "node_modules/unplugin-utils/node_modules/picomatch": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz",
+            "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/unplugin/node_modules/picomatch": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz",
+            "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/unquote": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz",
+            "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/update-browserslist-db": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+            "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "license": "MIT",
+            "dependencies": {
+                "escalade": "^3.2.0",
+                "picocolors": "^1.1.1"
+            },
+            "bin": {
+                "update-browserslist-db": "cli.js"
+            },
+            "peerDependencies": {
+                "browserslist": ">= 4.21.0"
+            }
+        },
+        "node_modules/update-browserslist-db/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "license": "ISC"
+        },
+        "node_modules/utif": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/utif/-/utif-2.0.1.tgz",
+            "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+            "license": "MIT",
+            "dependencies": {
+                "pako": "^1.0.5"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+            "license": "MIT"
+        },
+        "node_modules/utils-merge": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+            "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/uview-plus": {
+            "version": "3.8.49",
+            "resolved": "https://registry.npmmirror.com/uview-plus/-/uview-plus-3.8.49.tgz",
+            "integrity": "sha512-e2CDFVYfh7To2cF79cjxKJjPmNLaECgZyBMAjw/wTepI+8AKESixRL7FDfgPehWTpFBEivlM7qUCGVx8VagJsA==",
+            "engines": {
+                "HBuilderX": "^3.1.0",
+                "uni-app": "^4.66",
+                "uni-app-x": ""
+            }
+        },
+        "node_modules/vary": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+            "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/vite": {
+            "version": "5.2.8",
+            "resolved": "https://registry.npmmirror.com/vite/-/vite-5.2.8.tgz",
+            "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "esbuild": "^0.20.1",
+                "postcss": "^8.4.38",
+                "rollup": "^4.13.0"
+            },
+            "bin": {
+                "vite": "bin/vite.js"
+            },
+            "engines": {
+                "node": "^18.0.0 || >=20.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/vitejs/vite?sponsor=1"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.3"
+            },
+            "peerDependencies": {
+                "@types/node": "^18.0.0 || >=20.0.0",
+                "less": "*",
+                "lightningcss": "^1.21.0",
+                "sass": "*",
+                "stylus": "*",
+                "sugarss": "*",
+                "terser": "^5.4.0"
+            },
+            "peerDependenciesMeta": {
+                "@types/node": {
+                    "optional": true
+                },
+                "less": {
+                    "optional": true
+                },
+                "lightningcss": {
+                    "optional": true
+                },
+                "sass": {
+                    "optional": true
+                },
+                "stylus": {
+                    "optional": true
+                },
+                "sugarss": {
+                    "optional": true
+                },
+                "terser": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vue": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.35.tgz",
+            "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/compiler-sfc": "3.5.35",
+                "@vue/runtime-dom": "3.5.35",
+                "@vue/server-renderer": "3.5.35",
+                "@vue/shared": "3.5.35"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vue-demi": {
+            "version": "0.14.10",
+            "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+            "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "bin": {
+                "vue-demi-fix": "bin/vue-demi-fix.js",
+                "vue-demi-switch": "bin/vue-demi-switch.js"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/antfu"
+            },
+            "peerDependencies": {
+                "@vue/composition-api": "^1.0.0-rc.1",
+                "vue": "^3.0.0-0 || ^2.6.0"
+            },
+            "peerDependenciesMeta": {
+                "@vue/composition-api": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/vue-router": {
+            "version": "4.4.4",
+            "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.4.tgz",
+            "integrity": "sha512-3MlnDqwRwZwCQVbtVfpsU+nrNymNjnXSsQtXName5925NVC1+326VVfYH9vSrA0N13teGEo8z5x7gbRnGjCDiQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/devtools-api": "^6.6.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/posva"
+            },
+            "peerDependencies": {
+                "vue": "^3.2.0"
+            }
+        },
+        "node_modules/vue-template-compiler": {
+            "version": "2.7.16",
+            "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
+            "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "de-indent": "^1.0.2",
+                "he": "^1.2.0"
+            }
+        },
+        "node_modules/vue-tsc": {
+            "version": "1.8.27",
+            "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz",
+            "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "@volar/typescript": "~1.11.1",
+                "@vue/language-core": "1.8.27",
+                "semver": "^7.5.4"
+            },
+            "bin": {
+                "vue-tsc": "bin/vue-tsc.js"
+            },
+            "peerDependencies": {
+                "typescript": "*"
+            }
+        },
+        "node_modules/vue-tsc/node_modules/semver": {
+            "version": "7.8.2",
+            "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.2.tgz",
+            "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==",
+            "dev": true,
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/vue/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/types": "^7.29.7"
+            },
+            "bin": {
+                "parser": "bin/babel-parser.js"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/vue/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==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/helper-string-parser": "^7.29.7",
+                "@babel/helper-validator-identifier": "^7.29.7"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-core": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.35.tgz",
+            "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.29.3",
+                "@vue/shared": "3.5.35",
+                "entities": "^7.0.1",
+                "estree-walker": "^2.0.2",
+                "source-map-js": "^1.2.1"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-dom": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz",
+            "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-core": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-sfc": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz",
+            "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==",
+            "license": "MIT",
+            "dependencies": {
+                "@babel/parser": "^7.29.3",
+                "@vue/compiler-core": "3.5.35",
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/compiler-ssr": "3.5.35",
+                "@vue/shared": "3.5.35",
+                "estree-walker": "^2.0.2",
+                "magic-string": "^0.30.21",
+                "postcss": "^8.5.15",
+                "source-map-js": "^1.2.1"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/compiler-ssr": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz",
+            "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==",
+            "license": "MIT",
+            "dependencies": {
+                "@vue/compiler-dom": "3.5.35",
+                "@vue/shared": "3.5.35"
+            }
+        },
+        "node_modules/vue/node_modules/@vue/shared": {
+            "version": "3.5.35",
+            "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.35.tgz",
+            "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==",
+            "license": "MIT"
+        },
+        "node_modules/vue/node_modules/entities": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz",
+            "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+            "license": "BSD-2-Clause",
+            "engines": {
+                "node": ">=0.12"
+            },
+            "funding": {
+                "url": "https://github.com/fb55/entities?sponsor=1"
+            }
+        },
+        "node_modules/vue/node_modules/magic-string": {
+            "version": "0.30.21",
+            "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
+            "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+            "license": "MIT",
+            "dependencies": {
+                "@jridgewell/sourcemap-codec": "^1.5.5"
+            }
+        },
+        "node_modules/webpack-virtual-modules": {
+            "version": "0.6.2",
+            "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+            "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+            "license": "MIT"
+        },
+        "node_modules/ws": {
+            "version": "8.18.0",
+            "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz",
+            "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": ">=5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/xhr": {
+            "version": "2.6.0",
+            "resolved": "https://registry.npmmirror.com/xhr/-/xhr-2.6.0.tgz",
+            "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+            "license": "MIT",
+            "dependencies": {
+                "global": "~4.4.0",
+                "is-function": "^1.0.1",
+                "parse-headers": "^2.0.0",
+                "xtend": "^4.0.0"
+            }
+        },
+        "node_modules/xml-parse-from-string": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+            "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
+            "license": "MIT"
+        },
+        "node_modules/xml2js": {
+            "version": "0.5.0",
+            "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.5.0.tgz",
+            "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+            "license": "MIT",
+            "dependencies": {
+                "sax": ">=0.6.0",
+                "xmlbuilder": "~11.0.0"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/xmlbuilder": {
+            "version": "11.0.1",
+            "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+            "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/xmlhttprequest": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+            "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/xregexp": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-3.1.0.tgz",
+            "integrity": "sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==",
+            "license": "MIT"
+        },
+        "node_modules/xtend": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
+            "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+            "license": "ISC"
+        },
+        "node_modules/yaml": {
+            "version": "1.10.3",
+            "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.3.tgz",
+            "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+            "license": "ISC",
+            "engines": {
+                "node": ">= 6"
+            }
+        }
+    }
+}

+ 36 - 0
package.json

@@ -0,0 +1,36 @@
+{
+    "name": "meal_mini_app",
+    "version": "1.0.0",
+    "description": "订餐小程序 - UniApp Vue3 TypeScript",
+    "main": "main.ts",
+    "scripts": {
+        "dev:mp-weixin": "uni -p mp-weixin",
+        "build:mp-weixin": "uni build -p mp-weixin",
+        "gen:tabbar-icons": "node scripts/gen-tabbar-icons.mjs",
+        "type-check": "vue-tsc --noEmit"
+    },
+    "dependencies": {
+        "@dcloudio/uni-app": "3.0.0-4080420251103001",
+        "@dcloudio/uni-components": "3.0.0-4080420251103001",
+        "@dcloudio/uni-mp-weixin": "3.0.0-4080420251103001",
+        "pinia": "^2.1.7",
+        "uview-plus": "^3.7.36",
+        "vue": "^3.4.21"
+    },
+    "devDependencies": {
+        "@dcloudio/types": "^3.4.8",
+        "@dcloudio/uni-cli-shared": "3.0.0-4080420251103001",
+        "@dcloudio/vite-plugin-uni": "3.0.0-4080420251103001",
+        "@types/node": "^20.10.0",
+        "@vue/runtime-core": "^3.4.21",
+        "@vue/tsconfig": "^0.1.3",
+        "sass": "^1.69.5",
+        "sharp": "^0.35.2",
+        "typescript": "^4.9.4",
+        "vite": "5.2.8",
+        "vue-tsc": "^1.0.24"
+    },
+    "uni-app": {
+        "scripts": {}
+    }
+}

+ 66 - 0
scripts/gen-tabbar-icons.mjs

@@ -0,0 +1,66 @@
+/**
+ * 生成 81×81 TabBar PNG 图标(透明底,适合微信小程序)
+ * 用法:node scripts/gen-tabbar-icons.mjs
+ */
+import fs from 'node:fs'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+import sharp from 'sharp'
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url))
+const outDir = path.resolve(__dirname, '../src/static/tabbar')
+
+const GRAY = '#666666'
+const PRIMARY = '#00BCD4'
+
+function svgIcon(type, color) {
+  if (type === 'meal') {
+    return `<svg width="81" height="81" xmlns="http://www.w3.org/2000/svg">
+      <path d="M26 22 V48" fill="none" stroke="${color}" stroke-width="4" stroke-linecap="round"/>
+      <path d="M34 22 V48" fill="none" stroke="${color}" stroke-width="4" stroke-linecap="round"/>
+      <path d="M26 22 C26 16 34 16 34 22" fill="none" stroke="${color}" stroke-width="4" stroke-linecap="round"/>
+      <path d="M48 22 V58" fill="none" stroke="${color}" stroke-width="4" stroke-linecap="round"/>
+      <path d="M48 22 C48 16 56 16 56 22 V34 C56 40 48 40 48 34" fill="none" stroke="${color}" stroke-width="4" stroke-linejoin="round"/>
+      <ellipse cx="40.5" cy="58" rx="22" ry="6" fill="none" stroke="${color}" stroke-width="3"/>
+    </svg>`
+  }
+  if (type === 'order') {
+    return `<svg width="81" height="81" xmlns="http://www.w3.org/2000/svg">
+      <rect x="22" y="18" width="37" height="48" rx="6" fill="none" stroke="${color}" stroke-width="4"/>
+      <line x1="30" y1="32" x2="51" y2="32" stroke="${color}" stroke-width="3" stroke-linecap="round"/>
+      <line x1="30" y1="42" x2="51" y2="42" stroke="${color}" stroke-width="3" stroke-linecap="round"/>
+      <line x1="30" y1="52" x2="44" y2="52" stroke="${color}" stroke-width="3" stroke-linecap="round"/>
+    </svg>`
+  }
+  return `<svg width="81" height="81" xmlns="http://www.w3.org/2000/svg">
+    <circle cx="40.5" cy="32" r="12" fill="none" stroke="${color}" stroke-width="4"/>
+    <path d="M20 62 C20 50 58 50 61 62" fill="none" stroke="${color}" stroke-width="4" stroke-linecap="round"/>
+  </svg>`
+}
+
+async function writeIcon(name, type, color) {
+  const svg = svgIcon(type, color)
+  const buf = await sharp(Buffer.from(svg)).png().toBuffer()
+  fs.writeFileSync(path.join(outDir, name), buf)
+}
+
+async function main() {
+  fs.mkdirSync(outDir, { recursive: true })
+  const items = [
+    ['meal.png', 'meal', GRAY],
+    ['meal-active.png', 'meal', PRIMARY],
+    ['order.png', 'order', GRAY],
+    ['order-active.png', 'order', PRIMARY],
+    ['profile.png', 'profile', GRAY],
+    ['profile-active.png', 'profile', PRIMARY]
+  ]
+  for (const [file, type, color] of items) {
+    await writeIcon(file, type, color)
+    console.log('wrote', file)
+  }
+}
+
+main().catch(err => {
+  console.error(err)
+  process.exit(1)
+})

+ 17 - 0
src/App.vue

@@ -0,0 +1,17 @@
+<template>
+  <view id="app" />
+</template>
+
+<script setup lang="ts">
+import { onLaunch } from '@dcloudio/uni-app'
+import { useAuthStore } from '@/store/modules/auth'
+
+onLaunch(() => {
+  useAuthStore().initAuth()
+})
+</script>
+
+<style lang="scss">
+@import 'uview-plus/index.scss';
+@import './styles/common.scss';
+</style>

+ 3 - 0
src/api/index.ts

@@ -0,0 +1,3 @@
+export * from './modules/meal'
+export * from './modules/companyMeal'
+export * from './modules/memberAuth'

+ 23 - 0
src/api/modules/address.ts

@@ -0,0 +1,23 @@
+import { del, get, post, put } from '@/utils/request'
+import type { ApiResponse } from '@/types/common'
+import type { MemberAddress, MemberAddressSaveParams } from '@/types/address'
+
+export function fetchAddressList(): Promise<ApiResponse<MemberAddress[]>> {
+  return get<MemberAddress[]>('/address/list', undefined, { showLoading: false })
+}
+
+export function createAddress(data: MemberAddressSaveParams): Promise<ApiResponse<{ id: string }>> {
+  return post<{ id: string }>('/address/create', data)
+}
+
+export function updateAddress(id: string, data: MemberAddressSaveParams): Promise<ApiResponse<void>> {
+  return put<void>(`/address/update/${encodeURIComponent(id)}`, data)
+}
+
+export function deleteAddress(id: string): Promise<ApiResponse<void>> {
+  return del<void>(`/address/delete/${encodeURIComponent(id)}`)
+}
+
+export function setDefaultAddress(id: string): Promise<ApiResponse<void>> {
+  return post<void>(`/address/default/${encodeURIComponent(id)}`)
+}

+ 88 - 0
src/api/modules/companyMeal.ts

@@ -0,0 +1,88 @@
+import { get, post } from '@/utils/request'
+import type { ApiResponse } from '@/types/common'
+import type { FoodCompanyEmployeeCompany, FoodCompanyJoinApply, FoodCompanyJoinApplyCreateParams, FoodCompanyMealBenefit, FoodCompanyMealOrder, FoodCompanyMealOrderPage, FoodCompanyMealTrial, FoodCompanySearch, FoodCompanySubsidyRuleSummary } from '@/types/companyMeal'
+import type { FoodMealDateStatus, FoodMealMenu, FoodMealMenuItemDetail, FoodMealPayPrepare, FoodMealType } from '@/types/meal'
+
+type CompanyMealServiceAreaParams = { serviceAreaId?: string; restaurantId?: string }
+
+function withServiceAreaId<T extends CompanyMealServiceAreaParams>(params: T): Omit<T, 'serviceAreaId' | 'restaurantId'> & CompanyMealServiceAreaParams {
+  const { serviceAreaId, restaurantId, ...payload } = params
+  const resolvedServiceAreaId = serviceAreaId || restaurantId
+  return { ...payload, serviceAreaId: resolvedServiceAreaId, restaurantId: restaurantId || resolvedServiceAreaId }
+}
+
+export function fetchMyCompanies(): Promise<ApiResponse<FoodCompanyEmployeeCompany[]>> {
+  return get<FoodCompanyEmployeeCompany[]>('/food/meal/company/myCompanies')
+}
+
+export function searchCompanies(keyword?: string): Promise<ApiResponse<FoodCompanySearch[]>> {
+  return get<FoodCompanySearch[]>('/food/meal/company/search', { keyword })
+}
+
+export function applyJoinCompany(data: FoodCompanyJoinApplyCreateParams): Promise<ApiResponse<FoodCompanyJoinApply>> {
+  return post<FoodCompanyJoinApply>('/food/meal/company/join/apply', data)
+}
+
+export function fetchMyCompanyJoinApplications(): Promise<ApiResponse<FoodCompanyJoinApply[]>> {
+  return get<FoodCompanyJoinApply[]>('/food/meal/company/join/myApplications')
+}
+
+export function fetchCompanyBenefit(companyId: string): Promise<ApiResponse<FoodCompanyMealBenefit>> {
+  return get<FoodCompanyMealBenefit>('/food/meal/company/benefit', { companyId })
+}
+
+export function fetchCompanySubsidyRules(params: { companyId: string; mealType?: string }): Promise<ApiResponse<FoodCompanySubsidyRuleSummary[]>> {
+  return get<FoodCompanySubsidyRuleSummary[]>('/food/meal/company/subsidyRules', params)
+}
+
+export function fetchCompanyMealDates(params: { companyId: string } & CompanyMealServiceAreaParams): Promise<ApiResponse<string[]>> {
+  return get<string[]>('/food/meal/company/dates', withServiceAreaId(params), { showLoading: false })
+}
+
+export function fetchCompanyMealDateStatuses(params: { companyId: string; weekStart?: string } & CompanyMealServiceAreaParams): Promise<ApiResponse<FoodMealDateStatus[]>> {
+  return get<FoodMealDateStatus[]>('/food/meal/company/dateStatuses', withServiceAreaId(params), { showLoading: false })
+}
+
+export function fetchCompanyMealTypes(params: { companyId: string; mealDate?: string } & CompanyMealServiceAreaParams): Promise<ApiResponse<FoodMealType[]>> {
+  return get<FoodMealType[]>('/food/meal/company/mealTypes', withServiceAreaId(params), { showLoading: false })
+}
+
+export function fetchCompanyMealMenu(params: { companyId: string; mealDate: string; mealType: string } & CompanyMealServiceAreaParams): Promise<ApiResponse<FoodMealMenu>> {
+  return get<FoodMealMenu>('/food/meal/company/menu', withServiceAreaId(params), { showLoading: false })
+}
+
+export function fetchCompanyMealMenuItemDetail(companyId: string, menuItemId: string): Promise<ApiResponse<FoodMealMenuItemDetail>> {
+  return get<FoodMealMenuItemDetail>(`/food/meal/company/item/${encodeURIComponent(menuItemId)}`, { companyId }, { showLoading: false })
+}
+
+export function trialCompanyMealOrder(params: { companyId: string; menuId: string; mealDate: string; mealType: string; items: { menuItemId: string; specId?: string; quantity: number }[] } & CompanyMealServiceAreaParams): Promise<ApiResponse<FoodCompanyMealTrial>> {
+  return post<FoodCompanyMealTrial>('/food/meal/company/trial', withServiceAreaId(params), { showLoading: false })
+}
+
+export function createCompanyMealOrder(params: { companyId: string; menuId: string; mealDate: string; mealType: string; addressId?: string; deliveryType?: 'delivery' | 'pickup'; remark?: string; items: { menuItemId: string; specId?: string; quantity: number }[] } & CompanyMealServiceAreaParams): Promise<ApiResponse<FoodCompanyMealOrder>> {
+  return post<FoodCompanyMealOrder>('/food/meal/company/order/create', withServiceAreaId(params))
+}
+
+export function prepareCompanyMealPay(params: { orderId: string }): Promise<ApiResponse<FoodMealPayPrepare>> {
+  return post<FoodMealPayPrepare>('/food/meal/company/order/pay/prepare', params, { showLoading: false })
+}
+
+export function cancelCompanyMealOrder(params: { orderId: string; cancelReason?: string }): Promise<ApiResponse<FoodCompanyMealOrder>> {
+  return post<FoodCompanyMealOrder>('/food/meal/company/order/cancel', params)
+}
+
+export function applyCompanyMealRefund(params: { orderId: string; refundReason?: string }): Promise<ApiResponse<FoodCompanyMealOrder>> {
+  return post<FoodCompanyMealOrder>('/food/meal/company/order/refund/apply', params)
+}
+
+export function fetchCompanyMealOrderList(query?: { pageNo?: number; pageSize?: number; companyId?: string; orderStatus?: string; payStatus?: string }): Promise<ApiResponse<FoodCompanyMealOrderPage>> {
+  return post<FoodCompanyMealOrderPage>('/food/meal/company/order/myList', { pageNo: 1, pageSize: 20, ...query })
+}
+
+export function fetchCompanyMealOrderDetail(orderId: string): Promise<ApiResponse<FoodCompanyMealOrder>> {
+  return get<FoodCompanyMealOrder>(`/food/meal/company/order/detail/${encodeURIComponent(orderId)}`)
+}
+
+export function confirmCompanyMealOrderPaid(params: { orderId?: string; payOrderId?: string; payOrderNo?: string; paidAmount?: number }): Promise<ApiResponse<FoodCompanyMealOrder>> {
+  return post<FoodCompanyMealOrder>('/food/meal/company/order/paid', params)
+}

+ 17 - 0
src/api/modules/homeBanners.ts

@@ -0,0 +1,17 @@
+import { get } from '@/utils/request'
+import type { ApiResponse } from '@/types/common'
+
+export type MiniHomeBannerItem = {
+  id?: string
+  title?: string
+  imageUrl?: string
+  image?: string
+  picUrl?: string
+  linkUrl?: string
+  linkType?: string
+  sort?: number
+}
+
+export function fetchHomeBanners(): Promise<ApiResponse<MiniHomeBannerItem[]>> {
+  return get<MiniHomeBannerItem[]>('/home/banners', { _ts: Date.now() }, { showLoading: false, skipAuth: true })
+}

+ 85 - 0
src/api/modules/meal.ts

@@ -0,0 +1,85 @@
+import { get, post } from '@/utils/request'
+import type { ApiResponse } from '@/types/common'
+import type { FoodMealDateStatus, FoodMealHotItem, FoodMealMenu, FoodMealMenuItemDetail, FoodMealOrder, FoodMealOrderPage, FoodMealPayPrepare, FoodMealServiceArea, FoodMealTrial, FoodMealType } from '@/types/meal'
+
+type MealServiceAreaParams = { serviceAreaId?: string; restaurantId?: string }
+type MealDatesParams = string | MealServiceAreaParams | undefined
+
+function serviceAreaIdOf(params?: MealDatesParams) {
+  if (typeof params === 'string') return params
+  return params?.serviceAreaId || params?.restaurantId
+}
+
+function serviceAreaParams(params?: MealDatesParams) {
+  const serviceAreaId = serviceAreaIdOf(params)
+  const restaurantId = typeof params === 'object' ? (params.restaurantId || serviceAreaId) : serviceAreaId
+  return { serviceAreaId, restaurantId }
+}
+
+function withServiceAreaId<T extends MealServiceAreaParams>(params: T): Omit<T, 'serviceAreaId' | 'restaurantId'> & MealServiceAreaParams {
+  const { serviceAreaId, restaurantId, ...payload } = params
+  const resolvedServiceAreaId = serviceAreaId || restaurantId
+  return { ...payload, serviceAreaId: resolvedServiceAreaId, restaurantId: restaurantId || resolvedServiceAreaId }
+}
+
+export async function fetchMealServiceAreas(): Promise<ApiResponse<FoodMealServiceArea[]>> {
+  try {
+    return await get<FoodMealServiceArea[]>('/food/meal/serviceAreas', undefined, { showLoading: false, skipAuth: true, showErrorToast: false })
+  } catch {
+    return get<FoodMealServiceArea[]>('/food/meal/restaurants', undefined, { showLoading: false, skipAuth: true })
+  }
+}
+
+export const fetchMealRestaurants = fetchMealServiceAreas
+
+export function fetchMealDates(params?: MealDatesParams): Promise<ApiResponse<string[]>> {
+  return get<string[]>('/food/meal/dates', serviceAreaParams(params), { showLoading: false, skipAuth: true })
+}
+
+export function fetchMealDateStatuses(params?: MealServiceAreaParams & { weekStart?: string }): Promise<ApiResponse<FoodMealDateStatus[]>> {
+  return get<FoodMealDateStatus[]>('/food/meal/dateStatuses', withServiceAreaId(params || {}), { showLoading: false, skipAuth: true })
+}
+
+export function fetchMealTypes(params: MealServiceAreaParams & { mealDate?: string }): Promise<ApiResponse<FoodMealType[]>> {
+  return get<FoodMealType[]>('/food/meal/mealTypes', withServiceAreaId(params), { showLoading: false, skipAuth: true })
+}
+
+export function fetchMealMenu(params: MealServiceAreaParams & { mealDate: string; mealType: string }): Promise<ApiResponse<FoodMealMenu>> {
+  return get<FoodMealMenu>('/food/meal/menu', withServiceAreaId(params), { showLoading: false, skipAuth: true })
+}
+
+export function fetchMealHotItems(params?: MealServiceAreaParams & { mealType?: string; limit?: number }): Promise<ApiResponse<FoodMealHotItem[]>> {
+  return get<FoodMealHotItem[]>('/food/meal/hotItems', withServiceAreaId({ ...(params || {}), limit: params?.limit || 5 }), { showLoading: false, skipAuth: true })
+}
+
+export function fetchMealMenuItemDetail(menuItemId: string): Promise<ApiResponse<FoodMealMenuItemDetail>> {
+  return get<FoodMealMenuItemDetail>(`/food/meal/item/${encodeURIComponent(menuItemId)}`, undefined, { showLoading: false, skipAuth: true })
+}
+
+export function trialMealOrder(params: MealServiceAreaParams & { menuId: string; mealDate: string; mealType: string; items: { menuItemId: string; specId?: string; quantity: number }[] }): Promise<ApiResponse<FoodMealTrial>> {
+  return post<FoodMealTrial>('/food/meal/order/trial', withServiceAreaId(params))
+}
+
+export function createMealOrder(params: MealServiceAreaParams & { menuId: string; mealDate: string; mealType: string; addressId?: string; deliveryType?: 'delivery' | 'pickup'; remark?: string; items: { menuItemId: string; specId?: string; quantity: number }[] }): Promise<ApiResponse<FoodMealOrder>> {
+  return post<FoodMealOrder>('/food/meal/order/create', withServiceAreaId(params))
+}
+
+export function prepareMealPay(params: { orderId: string }): Promise<ApiResponse<FoodMealPayPrepare>> {
+  return post<FoodMealPayPrepare>('/food/meal/order/pay/prepare', params, { showLoading: false })
+}
+
+export function cancelMealOrder(params: { orderId: string; cancelReason?: string }): Promise<ApiResponse<FoodMealOrder>> {
+  return post<FoodMealOrder>('/food/meal/order/cancel', params, { showLoading: false, showErrorToast: false })
+}
+
+export function applyMealRefund(params: { orderId: string; refundReason?: string }): Promise<ApiResponse<FoodMealOrder>> {
+  return post<FoodMealOrder>('/food/meal/order/refund/apply', params)
+}
+
+export function fetchMealOrderList(query?: { pageNo?: number; pageSize?: number; orderStatus?: string; payStatus?: string }): Promise<ApiResponse<FoodMealOrderPage>> {
+  return post<FoodMealOrderPage>('/food/meal/order/myList', { pageNo: 1, pageSize: 20, ...query })
+}
+
+export function fetchMealOrderDetail(orderId: string): Promise<ApiResponse<FoodMealOrder>> {
+  return get<FoodMealOrder>(`/food/meal/order/detail/${encodeURIComponent(orderId)}`)
+}

+ 46 - 0
src/api/modules/memberAuth.ts

@@ -0,0 +1,46 @@
+import { post } from '@/utils/request'
+import type { ApiResponse } from '@/types/common'
+
+export type LoginResult = {
+  accessToken?: string
+  token?: string
+  satoken?: string
+  memberId?: string
+  nickname?: string
+  avatar?: string
+  phone?: string
+}
+
+export interface MemberLoginResultVO {
+  accessToken: string
+  tokenType?: string
+  expiresIn?: number
+  refreshToken?: string
+  isNewUser?: boolean
+  needBindMobile?: boolean
+  memberId: string
+  memberNo?: string
+  nickname?: string
+  avatar?: string
+  mobile?: string
+}
+
+export function mockLogin(params: { token: string; nickname?: string }): Promise<ApiResponse<LoginResult>> {
+  return Promise.resolve({ code: 200, msg: 'ok', data: { accessToken: params.token, nickname: params.nickname || '体验用户' } })
+}
+
+export function loginByWechatCode(params: { code: string; phoneCode?: string }): Promise<ApiResponse<LoginResult>> {
+  return post<LoginResult>('/member/auth/wechatLogin', params, { showErrorToast: false })
+}
+
+export function loginByWechatMiniPhone(payload: {
+  code: string
+  phoneCode: string
+  inviteCode?: string
+}): Promise<ApiResponse<MemberLoginResultVO>> {
+  return post<MemberLoginResultVO>('/member/auth/loginByWechatMiniPhone', payload, { showLoading: false, skipAuth: true })
+}
+
+export function getPhoneByCode(phoneCode: string): Promise<ApiResponse<string>> {
+  return post<string>('/member/auth/getPhoneByCode', { phoneCode })
+}

+ 23 - 0
src/api/modules/order.ts

@@ -0,0 +1,23 @@
+import { get, post } from '@/utils/request'
+import type { ApiResponse, PageResp } from '@/types/common'
+import type { OrderBizType, OrderInfo } from '@/types/order'
+import type { RequestConfig } from '@/utils/request'
+
+export type TradeOrderListQueryBody = {
+  pageNo?: number
+  pageSize?: number
+  bizType?: OrderBizType
+  status?: number
+  orderBy?: string
+}
+
+export function getUnifiedTradeOrderList(
+  data?: TradeOrderListQueryBody,
+  config?: Partial<RequestConfig>
+): Promise<ApiResponse<PageResp<OrderInfo>>> {
+  return post<PageResp<OrderInfo>>('/tradeOrder/list', { pageNo: 1, pageSize: 20, ...data }, { showLoading: false, ...config })
+}
+
+export function getTradeOrderDetail(id: string): Promise<ApiResponse<OrderInfo>> {
+  return get<OrderInfo>(`/tradeOrder/${encodeURIComponent(id)}`)
+}

+ 26 - 0
src/components/EmptyState.vue

@@ -0,0 +1,26 @@
+<template>
+  <view class="empty">
+    <view class="empty-title">{{ title }}</view>
+    <view v-if="description" class="empty-desc">{{ description }}</view>
+  </view>
+</template>
+
+<script setup lang="ts">
+defineProps<{ title: string; description?: string }>()
+</script>
+
+<style scoped lang="scss">
+.empty {
+  padding: 80rpx 32rpx;
+  text-align: center;
+  color: #8a94a6;
+}
+.empty-title {
+  font-size: 30rpx;
+  color: #4b5563;
+}
+.empty-desc {
+  margin-top: 12rpx;
+  font-size: 24rpx;
+}
+</style>

+ 190 - 0
src/components/MealMenuItemCard.vue

@@ -0,0 +1,190 @@
+<template>
+  <view :class="['card', 'menu-item', disabled && 'disabled']" @click="emit('detail')">
+    <view class="thumb-wrap">
+      <image v-if="item.itemImage" class="thumb" :src="item.itemImage" mode="aspectFill" />
+      <view v-else class="thumb empty-thumb">订餐</view>
+      <view v-if="soldOut" class="sold-out-stamp">已售罄</view>
+    </view>
+    <view class="info">
+      <view class="name">{{ item.itemName }}</view>
+      <view v-if="item.tags?.length" class="tags">
+        <text v-for="tag in item.tags" :key="tag" class="tag">{{ tag }}</text>
+      </view>
+      <view :class="['muted', 'stock', disabled && 'danger']">{{ stockText }}</view>
+      <view v-if="item.limitQuantityPerUser != null" class="muted limit">每人限购 {{ item.limitQuantityPerUser }} 份</view>
+      <view class="bottom">
+        <text class="price">¥{{ formatMoney(item.salePrice) }}</text>
+        <view class="stepper" @click.stop>
+          <button class="mini" :disabled="disabled || quantity <= 0" @click="change(-1)">-</button>
+          <text>{{ quantity }}</text>
+          <button v-if="hasSpecs" class="spec-btn" :disabled="disabled" @click="emit('detail')">{{ soldOut ? '售罄' : '选规格' }}</button>
+          <button v-else-if="soldOut" class="sold-out-btn" disabled>售罄</button>
+          <button v-else class="mini" :disabled="disabled || maxQuantity <= 0" @click="change(1)">+</button>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import type { FoodMealMenuItem } from '@/types/meal'
+import { formatMoney } from '@/utils/money'
+
+const props = defineProps<{ item: FoodMealMenuItem; quantity: number; disabled?: boolean; disabledReason?: string }>()
+const emit = defineEmits<{ (e: 'change', value: number): void; (e: 'detail'): void }>()
+
+const hasSpecs = computed(() => Boolean(props.item.specs?.length))
+const remainQuantity = computed(() => {
+  if (props.item.remainingQuantity != null) return props.item.remainingQuantity
+  if (props.item.stockQuantity == null) return null
+  return Math.max(props.item.stockQuantity - (props.item.soldQuantity || 0), 0)
+})
+const maxQuantity = computed(() => {
+  const stock = remainQuantity.value == null ? 999 : remainQuantity.value
+  const limit = props.item.limitQuantityPerUser == null ? 999 : props.item.limitQuantityPerUser
+  return Math.min(stock, limit)
+})
+const soldOut = computed(() => props.item.soldOut === true || (remainQuantity.value != null && remainQuantity.value <= 0))
+const disabled = computed(() => props.disabled || soldOut.value || maxQuantity.value <= 0)
+const stockText = computed(() => {
+  if (props.disabledReason) return props.disabledReason
+  if (soldOut.value) return '仅剩 0,已售罄'
+  if (remainQuantity.value == null) return '库存充足'
+  return `仅剩 ${remainQuantity.value} 份`
+})
+
+function change(delta: number) {
+  if (hasSpecs.value && delta > 0) {
+    emit('detail')
+    return
+  }
+  if (disabled.value) {
+    uni.showToast({ title: stockText.value, icon: 'none' })
+    return
+  }
+  const next = Math.max(0, Math.min(props.quantity + delta, maxQuantity.value))
+  if (next === props.quantity && delta > 0) {
+    uni.showToast({ title: '已达可选上限', icon: 'none' })
+  }
+  emit('change', next)
+}
+</script>
+
+<style scoped lang="scss">
+.menu-item {
+  display: flex;
+  gap: 20rpx;
+}
+.disabled {
+  opacity: 0.58;
+}
+.thumb-wrap {
+  position: relative;
+  width: 150rpx;
+  height: 150rpx;
+  overflow: hidden;
+  border-radius: 16rpx;
+}
+.thumb {
+  width: 150rpx;
+  height: 150rpx;
+  background: #eef2f7;
+}
+.empty-thumb {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #00838f;
+  background: #e0f7fa;
+  font-weight: 700;
+}
+.sold-out-stamp {
+  position: absolute;
+  left: -22rpx;
+  top: 50rpx;
+  width: 198rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  transform: rotate(-28deg);
+  text-align: center;
+  color: #ef4444;
+  border: 4rpx solid #ef4444;
+  background: rgba(255, 255, 255, 0.82);
+  font-weight: 800;
+  font-size: 26rpx;
+}
+.info {
+  flex: 1;
+}
+.name {
+  font-weight: 600;
+  font-size: 30rpx;
+}
+.tags {
+  margin-top: 10rpx;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8rpx;
+}
+.tag {
+  padding: 3rpx 12rpx;
+  border-radius: 999rpx;
+  background: #fff7ed;
+  color: #f97316;
+  font-size: 21rpx;
+}
+.stock {
+  margin-top: 12rpx;
+  font-size: 24rpx;
+}
+.limit {
+  margin-top: 6rpx;
+  font-size: 22rpx;
+}
+.danger {
+  color: #ef4444;
+}
+.bottom {
+  margin-top: 22rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.stepper {
+  display: flex;
+  align-items: center;
+  gap: 18rpx;
+}
+.mini {
+  width: 52rpx;
+  height: 52rpx;
+  line-height: 48rpx;
+  padding: 0;
+  border-radius: 50%;
+  font-size: 32rpx;
+}
+.spec-btn {
+  height: 52rpx;
+  line-height: 48rpx;
+  padding: 0 18rpx;
+  border-radius: 999rpx;
+  font-size: 24rpx;
+  color: #fff;
+  background: #00bcd4;
+}
+.spec-btn[disabled],
+.sold-out-btn {
+  opacity: 0.45;
+}
+.sold-out-btn {
+  height: 52rpx;
+  line-height: 48rpx;
+  padding: 0 18rpx;
+  border-radius: 999rpx;
+  font-size: 24rpx;
+}
+.mini[disabled] {
+  opacity: 0.45;
+}
+</style>

+ 29 - 0
src/components/OrderStatusTag.vue

@@ -0,0 +1,29 @@
+<template>
+  <view class="tag" :class="status">{{ orderStatusLabel(status) }}</view>
+</template>
+
+<script setup lang="ts">
+import { orderStatusLabel } from '@/utils/mealDisplay'
+
+defineProps<{ status: string }>()
+</script>
+
+<style scoped lang="scss">
+.tag {
+  display: inline-flex;
+  padding: 6rpx 18rpx;
+  border-radius: 999rpx;
+  background: #e0f7fa;
+  color: #00838f;
+  font-size: 24rpx;
+}
+.refunded,
+.cancelled {
+  background: #f3f4f6;
+  color: #6b7280;
+}
+.refunding {
+  background: #fff7ed;
+  color: #ea580c;
+}
+</style>

+ 27 - 0
src/components/PriceSummary.vue

@@ -0,0 +1,27 @@
+<template>
+  <view class="card price-summary">
+    <view v-for="item in items" :key="item.label" class="row">
+      <text>{{ item.label }}</text>
+      <text :class="item.strong ? 'price' : ''">¥{{ formatMoney(item.value) }}</text>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { formatMoney } from '@/utils/money'
+
+defineProps<{ items: { label: string; value: number | undefined; strong?: boolean }[] }>()
+</script>
+
+<style scoped lang="scss">
+.price-summary {
+  display: flex;
+  flex-direction: column;
+  gap: 18rpx;
+}
+.row {
+  display: flex;
+  justify-content: space-between;
+  color: #4b5563;
+}
+</style>

+ 6 - 0
src/config/api.ts

@@ -0,0 +1,6 @@
+import { envConfig } from './env'
+
+export const apiConfig = {
+  baseURL: envConfig.apiBaseURL.replace(/\/$/, ''),
+  timeout: 15000
+}

+ 3 - 0
src/config/env.ts

@@ -0,0 +1,3 @@
+export const envConfig = {
+  apiBaseURL: import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1:8086/mobile'
+}

+ 2 - 0
src/config/index.ts

@@ -0,0 +1,2 @@
+export * from './api'
+export * from './env'

+ 4 - 0
src/constants/routes.ts

@@ -0,0 +1,4 @@
+/**
+ * 小程序内固定路由。
+ */
+export const ROUTE_LOGIN_INDEX = '/package-views/pages/login/index'

+ 12 - 0
src/env.d.ts

@@ -0,0 +1,12 @@
+/// <reference types="@dcloudio/types" />
+
+interface ImportMetaEnv {
+  readonly VITE_API_BASE_URL?: string
+  readonly VITE_DEV_API_TARGET?: string
+}
+
+interface ImportMeta {
+  readonly env: ImportMetaEnv
+}
+
+declare module 'uview-plus'

+ 12 - 0
src/main.ts

@@ -0,0 +1,12 @@
+import { createSSRApp } from 'vue'
+import { createPinia } from 'pinia'
+import uviewPlus from 'uview-plus'
+import App from './App.vue'
+
+export function createApp() {
+  const app = createSSRApp(App)
+  const pinia = createPinia()
+  app.use(pinia)
+  app.use(uviewPlus)
+  return { app, pinia }
+}

+ 17 - 0
src/manifest.json

@@ -0,0 +1,17 @@
+{
+    "name": "订餐小程序",
+    "appid": "wx2aa33e1b0f13463e",
+    "description": "订餐小程序",
+    "versionName": "1.0.0",
+    "versionCode": "100",
+    "transformPx": false,
+    "mp-weixin": {
+        "appid": "wx2aa33e1b0f13463e",
+        "setting": {
+            "urlCheck": false,
+            "es6": true,
+            "minified": true
+        },
+        "usingComponents": true
+    }
+}

+ 152 - 0
src/package-views/pages/company/applications.vue

@@ -0,0 +1,152 @@
+<template>
+  <view class="safe-page applications-page">
+    <view class="card head-card">
+      <view>
+        <view class="section-title">加入申请记录</view>
+        <view class="muted">查看企业加入申请的审核进度。</view>
+      </view>
+      <view class="secondary-btn small" @click="goApply">继续申请</view>
+    </view>
+
+    <view v-if="loading" class="loading">申请记录加载中...</view>
+    <EmptyState v-else-if="!applications.length" title="暂无申请记录" description="如需企业团餐,请先申请加入企业" />
+    <view v-else>
+      <view v-for="item in applications" :key="item.id" class="card application-card">
+        <view class="row-between">
+          <view class="company-name">{{ item.companyName }}</view>
+          <view :class="['status-tag', item.status]">{{ statusLabel(item.status) }}</view>
+        </view>
+        <view class="muted">编码:{{ item.companyCode || '-' }}</view>
+        <view class="muted">申请人:{{ item.employeeName }} {{ item.mobile }}</view>
+        <view v-if="item.employeeNo" class="muted">工号:{{ item.employeeNo }}</view>
+        <view v-if="item.applyReason" class="reason">申请说明:{{ item.applyReason }}</view>
+        <view class="muted">申请时间:{{ formatTime(item.applyTime || item.createDate) }}</view>
+        <view v-if="item.status === 'rejected' && item.auditRemark" class="reject-remark">审批备注:{{ item.auditRemark }}</view>
+        <view v-if="item.status === 'approved'" class="primary-btn action-btn" @click="goCompany">去我的企业</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { onShow } from '@dcloudio/uni-app'
+import EmptyState from '@/components/EmptyState.vue'
+import { fetchMyCompanyJoinApplications } from '@/api/modules/companyMeal'
+import type { FoodCompanyJoinApply, FoodCompanyJoinApplyStatus } from '@/types/companyMeal'
+import { requireLoginNavigate } from '@/utils/auth'
+
+const applications = ref<FoodCompanyJoinApply[]>([])
+const loading = ref(false)
+
+onShow(loadApplications)
+
+async function loadApplications() {
+  if (!requireLoginNavigate('/package-views/pages/company/applications')) return
+  loading.value = true
+  try {
+    const res = await fetchMyCompanyJoinApplications()
+    applications.value = res.data || []
+  } finally {
+    loading.value = false
+  }
+}
+
+function statusLabel(status: FoodCompanyJoinApplyStatus) {
+  if (status === 'approved') return '已通过'
+  if (status === 'rejected') return '已拒绝'
+  return '待审核'
+}
+
+function formatTime(value?: string) {
+  if (!value) return '-'
+  return value.replace('T', ' ').slice(0, 16)
+}
+
+function goApply() {
+  uni.navigateTo({ url: '/package-views/pages/company/apply' })
+}
+
+function goCompany() {
+  uni.navigateTo({ url: '/package-views/pages/company/select' })
+}
+</script>
+
+<style scoped lang="scss">
+.applications-page {
+  padding-bottom: 48rpx;
+}
+.head-card,
+.row-between {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.head-card,
+.application-card {
+  margin-bottom: 20rpx;
+}
+.section-title {
+  font-size: 32rpx;
+  font-weight: 800;
+  margin-bottom: 12rpx;
+}
+.company-name {
+  flex: 1;
+  min-width: 0;
+  font-size: 32rpx;
+  font-weight: 800;
+  color: #0f172a;
+}
+.status-tag {
+  flex-shrink: 0;
+  padding: 6rpx 18rpx;
+  border-radius: 999rpx;
+  background: #fffbeb;
+  color: #d97706;
+  font-size: 22rpx;
+  font-weight: 700;
+}
+.status-tag.approved {
+  background: #dcfce7;
+  color: #16a34a;
+}
+.status-tag.rejected {
+  background: #fee2e2;
+  color: #ef4444;
+}
+.reason,
+.reject-remark {
+  margin-top: 14rpx;
+  color: #475569;
+}
+.reject-remark {
+  padding: 16rpx;
+  border-radius: 16rpx;
+  background: #fff1f2;
+  color: #ef4444;
+}
+.secondary-btn {
+  height: 72rpx;
+  line-height: 72rpx;
+  text-align: center;
+  border-radius: 16rpx;
+  background: #f3f4f6;
+  color: #4b5563;
+  font-weight: 700;
+}
+.small {
+  flex-shrink: 0;
+  padding: 0 22rpx;
+  font-size: 24rpx;
+}
+.action-btn {
+  margin-top: 22rpx;
+}
+.loading {
+  padding: 80rpx 32rpx;
+  text-align: center;
+  color: #8a94a6;
+}
+</style>

+ 290 - 0
src/package-views/pages/company/apply.vue

@@ -0,0 +1,290 @@
+<template>
+  <view class="safe-page apply-page">
+    <view class="card search-card">
+      <view class="section-title">申请加入企业</view>
+      <view class="muted">输入企业名称或编码,选择企业后提交员工信息等待审核。</view>
+      <view class="search-row">
+        <input v-model.trim="keyword" class="search-input" placeholder="企业名称/编码模糊搜索" confirm-type="search" @confirm="search" />
+        <view :class="['search-btn', searching && 'disabled']" @click="search">{{ searching ? '搜索中' : '搜索' }}</view>
+      </view>
+    </view>
+
+    <view v-if="latestApplication" class="card latest-card">
+      <view class="row-between">
+        <view class="section-title no-margin">最近申请</view>
+        <view :class="['status-tag', latestApplication.status]">{{ statusLabel(latestApplication.status) }}</view>
+      </view>
+      <view class="company-name">{{ latestApplication.companyName }}</view>
+      <view class="muted">申请人:{{ latestApplication.employeeName }} {{ latestApplication.mobile }}</view>
+      <view class="muted">申请时间:{{ formatTime(latestApplication.applyTime || latestApplication.createDate) }}</view>
+      <view v-if="latestApplication.auditRemark" class="remark">审批备注:{{ latestApplication.auditRemark }}</view>
+    </view>
+
+    <view class="card result-card">
+      <view class="section-title">搜索结果</view>
+      <view v-if="searching" class="loading">企业搜索中...</view>
+      <EmptyState v-else-if="searched && !companies.length" title="未找到企业" description="请更换名称或编码后重试" />
+      <view v-else-if="!searched" class="tip-text">请输入关键词搜索,也可直接点击搜索查看可申请企业。</view>
+      <view v-for="company in companies" :key="company.companyId" :class="['company-item', selectedCompany?.companyId === company.companyId && 'selected']" @click="selectCompany(company)">
+        <view>
+          <view class="company-name">{{ company.companyName }}</view>
+          <view class="muted">编码:{{ company.companyCode || '-' }}</view>
+        </view>
+        <view class="select-state">{{ selectedCompany?.companyId === company.companyId ? '已选' : '选择' }}</view>
+      </view>
+    </view>
+
+    <view class="card form-card">
+      <view class="section-title">申请信息</view>
+      <view v-if="selectedCompany" class="selected-company">已选企业:{{ selectedCompany.companyName }}</view>
+      <view v-else class="tip-text">请先选择要加入的企业</view>
+      <view class="form-item">
+        <view class="label">姓名</view>
+        <input v-model.trim="form.employeeName" class="input" placeholder="请输入真实姓名" />
+      </view>
+      <view class="form-item">
+        <view class="label">手机号</view>
+        <input v-model.trim="form.mobile" class="input" type="number" maxlength="11" placeholder="请输入手机号" />
+      </view>
+      <view class="form-item">
+        <view class="label">工号</view>
+        <input v-model.trim="form.employeeNo" class="input" placeholder="请输入工号(选填)" />
+      </view>
+      <view class="form-item">
+        <view class="label">申请说明</view>
+        <textarea v-model.trim="form.applyReason" class="textarea" maxlength="200" placeholder="可填写部门、岗位等说明(选填)" />
+      </view>
+      <view :class="['primary-btn', submitting && 'disabled']" @click="submitApply">{{ submitting ? '提交中...' : '提交申请' }}</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, reactive, ref } from 'vue'
+import { onShow } from '@dcloudio/uni-app'
+import EmptyState from '@/components/EmptyState.vue'
+import { applyJoinCompany, fetchMyCompanyJoinApplications, searchCompanies } from '@/api/modules/companyMeal'
+import type { FoodCompanyJoinApply, FoodCompanyJoinApplyStatus, FoodCompanySearch } from '@/types/companyMeal'
+import { useAuthStore } from '@/store/modules/auth'
+import { requireLoginNavigate } from '@/utils/auth'
+
+const auth = useAuthStore()
+const keyword = ref('')
+const companies = ref<FoodCompanySearch[]>([])
+const selectedCompany = ref<FoodCompanySearch | null>(null)
+const applications = ref<FoodCompanyJoinApply[]>([])
+const searching = ref(false)
+const searched = ref(false)
+const submitting = ref(false)
+const form = reactive({
+  employeeName: '',
+  mobile: '',
+  employeeNo: '',
+  applyReason: ''
+})
+
+const latestApplication = computed(() => applications.value[0] || null)
+
+onShow(async () => {
+  if (!requireLoginNavigate('/package-views/pages/company/apply')) return
+  auth.initAuth()
+  if (!form.employeeName) form.employeeName = auth.userInfo?.nickname || ''
+  if (!form.mobile) form.mobile = auth.userInfo?.phone || ''
+  await loadApplications()
+})
+
+async function loadApplications() {
+  try {
+    const res = await fetchMyCompanyJoinApplications()
+    applications.value = res.data || []
+  } catch {
+    applications.value = []
+  }
+}
+
+async function search() {
+  if (searching.value) return
+  searching.value = true
+  searched.value = true
+  try {
+    const res = await searchCompanies(keyword.value)
+    companies.value = res.data || []
+  } finally {
+    searching.value = false
+  }
+}
+
+function selectCompany(company: FoodCompanySearch) {
+  selectedCompany.value = company
+}
+
+function validateForm() {
+  if (!selectedCompany.value?.companyId) return '请选择企业'
+  if (!form.employeeName) return '请输入姓名'
+  if (!form.mobile) return '请输入手机号'
+  if (!/^1\d{10}$/.test(form.mobile)) return '请输入正确手机号'
+  return ''
+}
+
+async function submitApply() {
+  if (submitting.value) return
+  const error = validateForm()
+  if (error) {
+    uni.showToast({ title: error, icon: 'none' })
+    return
+  }
+  submitting.value = true
+  try {
+    await applyJoinCompany({
+      companyId: selectedCompany.value!.companyId,
+      employeeName: form.employeeName,
+      mobile: form.mobile,
+      employeeNo: form.employeeNo,
+      applyReason: form.applyReason
+    })
+    uni.showModal({
+      title: '提交成功',
+      content: '申请已提交,请等待企业审核。',
+      showCancel: false,
+      confirmText: '知道了'
+    })
+    await loadApplications()
+  } finally {
+    submitting.value = false
+  }
+}
+
+function statusLabel(status: FoodCompanyJoinApplyStatus) {
+  if (status === 'approved') return '已通过'
+  if (status === 'rejected') return '已拒绝'
+  return '待审核'
+}
+
+function formatTime(value?: string) {
+  if (!value) return '-'
+  return value.replace('T', ' ').slice(0, 16)
+}
+</script>
+
+<style scoped lang="scss">
+.apply-page {
+  padding-bottom: 48rpx;
+}
+.search-card,
+.latest-card,
+.result-card,
+.form-card {
+  margin-bottom: 20rpx;
+}
+.section-title {
+  font-size: 32rpx;
+  font-weight: 800;
+  margin-bottom: 16rpx;
+}
+.no-margin {
+  margin-bottom: 0;
+}
+.row-between,
+.search-row,
+.company-item {
+  display: flex;
+  align-items: center;
+}
+.row-between,
+.company-item {
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.search-row {
+  margin-top: 24rpx;
+  gap: 16rpx;
+}
+.search-input,
+.input,
+.textarea {
+  box-sizing: border-box;
+  width: 100%;
+  border-radius: 16rpx;
+  background: #f8fafc;
+  border: 1px solid #eef2f7;
+  font-size: 28rpx;
+}
+.search-input,
+.input {
+  height: 84rpx;
+  padding: 0 24rpx;
+}
+.search-input {
+  flex: 1;
+}
+.search-btn,
+.select-state {
+  flex-shrink: 0;
+  color: #00acc1;
+  font-weight: 700;
+}
+.search-btn {
+  height: 84rpx;
+  line-height: 84rpx;
+  padding: 0 28rpx;
+  border-radius: 16rpx;
+  background: #e0f7fa;
+}
+.company-name {
+  font-size: 30rpx;
+  font-weight: 700;
+  color: #0f172a;
+  margin-bottom: 10rpx;
+}
+.company-item {
+  padding: 24rpx 0;
+  border-top: 1px solid #eef2f7;
+}
+.company-item.selected {
+  margin: 0 -16rpx;
+  padding: 24rpx 16rpx;
+  border-radius: 20rpx;
+  background: #f0fdff;
+}
+.status-tag {
+  padding: 6rpx 18rpx;
+  border-radius: 999rpx;
+  background: #fffbeb;
+  color: #d97706;
+  font-size: 22rpx;
+  font-weight: 700;
+}
+.status-tag.approved {
+  background: #dcfce7;
+  color: #16a34a;
+}
+.status-tag.rejected {
+  background: #fee2e2;
+  color: #ef4444;
+}
+.remark,
+.selected-company {
+  margin-top: 14rpx;
+  color: #475569;
+}
+.form-item {
+  margin-bottom: 22rpx;
+}
+.label {
+  margin-bottom: 12rpx;
+  color: #334155;
+  font-weight: 700;
+}
+.textarea {
+  height: 150rpx;
+  padding: 20rpx 24rpx;
+}
+.loading,
+.tip-text {
+  padding: 28rpx 0;
+  color: #8a94a6;
+}
+.disabled {
+  opacity: 0.6;
+}
+</style>

+ 101 - 0
src/package-views/pages/company/benefit.vue

@@ -0,0 +1,101 @@
+<template>
+  <view class="safe-page">
+    <view v-if="loading" class="loading">权益信息加载中...</view>
+    <view v-else-if="!companyId" class="card empty-card">
+      <EmptyState title="缺少企业信息" description="请先选择企业后再查看权益" />
+      <view class="primary-btn" @click="goCompanySelect">选择企业</view>
+      <view class="secondary-btn" @click="goHome">返回首页</view>
+    </view>
+    <view v-else>
+      <view v-if="benefit" class="card">
+        <view class="title">{{ benefit.companyName }}</view>
+        <view class="muted">员工:{{ benefit.employeeName }}</view>
+        <view class="balance">可用余额 ¥{{ formatMoney(benefit.accountAvailableBalance) }}</view>
+      </view>
+      <view class="card rules">
+        <view class="title">补贴规则</view>
+        <view v-for="rule in rules" :key="rule.id" class="rule">
+          <view>{{ rule.ruleName }}</view>
+          <view class="muted">{{ rule.subsidyMode }} {{ rule.subsidyAmount !== undefined ? `¥${formatMoney(rule.subsidyAmount)}` : '' }}</view>
+        </view>
+        <EmptyState v-if="!rules.length" title="暂无补贴规则" description="当前企业暂未配置可展示的团餐补贴规则" />
+        <view v-if="!rules.length" class="secondary-btn" @click="goCompanySelect">返回企业选择</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import EmptyState from '@/components/EmptyState.vue'
+import { fetchCompanyBenefit, fetchCompanySubsidyRules } from '@/api/modules/companyMeal'
+import type { FoodCompanyMealBenefit, FoodCompanySubsidyRuleSummary } from '@/types/companyMeal'
+import { formatMoney } from '@/utils/money'
+
+const companyId = ref('')
+const loading = ref(false)
+const benefit = ref<FoodCompanyMealBenefit | null>(null)
+const rules = ref<FoodCompanySubsidyRuleSummary[]>([])
+
+onLoad(async query => {
+  companyId.value = String(query?.companyId || '')
+  if (!companyId.value) return
+  loading.value = true
+  try {
+    const [benefitRes, rulesRes] = await Promise.all([
+      fetchCompanyBenefit(companyId.value),
+      fetchCompanySubsidyRules({ companyId: companyId.value })
+    ])
+    benefit.value = benefitRes.data
+    rules.value = rulesRes.data || []
+  } finally {
+    loading.value = false
+  }
+})
+
+function goCompanySelect() {
+  uni.redirectTo({ url: '/package-views/pages/company/select' })
+}
+
+function goHome() {
+  uni.switchTab({ url: '/pages/meal/index' })
+}
+</script>
+
+<style scoped lang="scss">
+.loading {
+  padding: 80rpx 32rpx;
+  text-align: center;
+  color: #8a94a6;
+}
+.empty-card {
+  padding-bottom: 32rpx;
+}
+.title {
+  font-size: 34rpx;
+  font-weight: 700;
+  margin-bottom: 14rpx;
+}
+.balance {
+  margin-top: 24rpx;
+  color: #ff6b35;
+  font-weight: 700;
+}
+.rules {
+  margin-top: 20rpx;
+}
+.rule {
+  padding: 18rpx 0;
+  border-top: 1px solid #eef2f7;
+}
+.secondary-btn {
+  margin-top: 20rpx;
+  height: 88rpx;
+  line-height: 88rpx;
+  text-align: center;
+  border-radius: 16rpx;
+  background: #f3f4f6;
+  color: #4b5563;
+}
+</style>

+ 129 - 0
src/package-views/pages/company/select.vue

@@ -0,0 +1,129 @@
+<template>
+  <view class="safe-page">
+    <view v-if="loading" class="loading">企业信息加载中...</view>
+    <view v-else-if="!companies.length" class="card empty-card">
+      <EmptyState title="暂无绑定企业" description="可申请加入企业,审核通过后使用企业团餐;也可以先使用个人订餐" />
+      <view class="primary-btn" @click="goApply">申请加入企业</view>
+      <view class="secondary-btn" @click="goApplications">查看申请记录</view>
+      <view class="secondary-btn" @click="goPersonalMeal">进入个人订餐</view>
+      <view class="secondary-btn" @click="goHome">返回首页</view>
+    </view>
+    <view v-else>
+      <view class="card action-card">
+        <view>
+          <view class="name small-name">加入其他企业</view>
+          <view class="muted">如有新的企业团餐需求,可继续提交加入申请</view>
+        </view>
+        <view class="apply-link" @click="goApply">去申请</view>
+      </view>
+      <view v-for="company in companies" :key="company.companyId" class="card company" @click="select(company)">
+        <view class="name">{{ company.companyName }}</view>
+        <view class="muted">员工:{{ company.employeeName || '-' }}</view>
+        <view class="muted">可用余额:¥{{ formatMoney(company.availableBalance) }}</view>
+        <view class="benefit-link" @click.stop="goBenefit(company.companyId)">查看权益</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onShow } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import EmptyState from '@/components/EmptyState.vue'
+import { fetchMyCompanies } from '@/api/modules/companyMeal'
+import { useCompanyStore } from '@/store/modules/company'
+import type { FoodCompanyEmployeeCompany } from '@/types/companyMeal'
+import { formatMoney } from '@/utils/money'
+import { requireLoginNavigate } from '@/utils/auth'
+
+const store = useCompanyStore()
+const companies = ref<FoodCompanyEmployeeCompany[]>([])
+const loading = ref(false)
+
+onShow(loadCompanies)
+
+async function loadCompanies() {
+  if (!requireLoginNavigate('/package-views/pages/company/select')) return
+  loading.value = true
+  try {
+    const res = await fetchMyCompanies()
+    companies.value = res.data || []
+    store.setCompanies(companies.value)
+  } finally {
+    loading.value = false
+  }
+}
+
+function select(company: FoodCompanyEmployeeCompany) {
+  store.setCurrentCompany(company)
+  uni.navigateTo({ url: '/package-views/pages/meal/menu?mode=company' })
+}
+
+function goBenefit(companyId: string) {
+  uni.navigateTo({ url: `/package-views/pages/company/benefit?companyId=${encodeURIComponent(companyId)}` })
+}
+
+function goApply() {
+  uni.navigateTo({ url: '/package-views/pages/company/apply' })
+}
+
+function goApplications() {
+  uni.navigateTo({ url: '/package-views/pages/company/applications' })
+}
+
+function goPersonalMeal() {
+  uni.redirectTo({ url: '/package-views/pages/meal/menu?mode=personal' })
+}
+
+function goHome() {
+  uni.switchTab({ url: '/pages/meal/index' })
+}
+</script>
+
+<style scoped lang="scss">
+.loading {
+  padding: 80rpx 32rpx;
+  text-align: center;
+  color: #8a94a6;
+}
+.empty-card {
+  padding-bottom: 32rpx;
+}
+.company,
+.action-card {
+  margin-bottom: 20rpx;
+}
+.action-card {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 20rpx;
+}
+.name {
+  font-size: 34rpx;
+  font-weight: 700;
+  margin-bottom: 16rpx;
+}
+.small-name {
+  font-size: 30rpx;
+}
+.benefit-link,
+.apply-link {
+  margin-top: 20rpx;
+  color: #00bcd4;
+  font-weight: 700;
+}
+.apply-link {
+  flex-shrink: 0;
+  margin-top: 0;
+}
+.secondary-btn {
+  margin-top: 20rpx;
+  height: 88rpx;
+  line-height: 88rpx;
+  text-align: center;
+  border-radius: 16rpx;
+  background: #f3f4f6;
+  color: #4b5563;
+}
+</style>

+ 217 - 0
src/package-views/pages/login/index.vue

@@ -0,0 +1,217 @@
+<template>
+  <view class="safe-page login">
+    <view class="hero">
+      <view class="brand">订餐小程序</view>
+      <view class="subtitle">授权本机号码,一键登录订餐服务</view>
+    </view>
+
+    <view class="card box">
+      <!-- #ifdef MP-WEIXIN -->
+      <button class="phone-btn" open-type="getPhoneNumber" :loading="logging" @getphonenumber="onGetPhoneNumber">
+        授权本机号码一键登录
+      </button>
+      <!-- #endif -->
+
+      <!-- #ifndef MP-WEIXIN -->
+      <view class="tip-box">一键登录仅支持微信小程序,请在微信中打开本小程序。</view>
+      <!-- #endif -->
+
+      <view class="agreement-section">
+        <view class="checkbox-hit" @click="agreed = !agreed">
+          <view class="checkbox" :class="{ checked: agreed }">
+            <text v-if="agreed" class="checkbox-check">✓</text>
+          </view>
+        </view>
+        <view class="agreement-text">
+          我已阅读
+          <text class="agreement-link" @click.stop="openAgreement('service')">用户协议</text>
+          和
+          <text class="agreement-link" @click.stop="openAgreement('privacy')">隐私政策</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import { loginByWechatMiniPhone } from '@/api/modules/memberAuth'
+import { useAuthStore } from '@/store/modules/auth'
+import { isTabBarPage } from '@/utils/auth'
+import { removeSsoToken } from '@/utils/tokenStorage'
+
+const auth = useAuthStore()
+const redirect = ref('')
+const agreed = ref(false)
+const logging = ref(false)
+
+onLoad(query => {
+  redirect.value = decodeURIComponent(String(query?.redirect || ''))
+})
+
+function openAgreement(type: 'service' | 'privacy') {
+  uni.showToast({ title: type === 'service' ? '用户协议页面待配置' : '隐私政策页面待配置', icon: 'none' })
+}
+
+async function onGetPhoneNumber(e: { detail?: { errMsg?: string; code?: string } }) {
+  if (logging.value) return
+  if (!agreed.value) {
+    uni.showToast({ title: '请先阅读并同意用户协议与隐私政策', icon: 'none' })
+    return
+  }
+  const detail = e.detail || {}
+  if (detail.errMsg !== 'getPhoneNumber:ok') {
+    uni.showToast({ title: '需要授权手机号才能完成登录', icon: 'none' })
+    return
+  }
+  const phoneCode = detail.code
+  if (!phoneCode) {
+    uni.showToast({ title: '未取得手机号授权,请使用较新版本微信后重试', icon: 'none' })
+    return
+  }
+
+  logging.value = true
+  uni.showLoading({ title: '登录中...', mask: true })
+  try {
+    const loginRes = await new Promise<UniApp.LoginRes>((resolve, reject) => {
+      uni.login({ provider: 'weixin', success: resolve, fail: reject })
+    })
+    const jsCode = loginRes.code
+    if (!jsCode) throw new Error('获取微信登录凭证失败')
+
+    const res = await loginByWechatMiniPhone({ code: jsCode, phoneCode })
+    const data = res.data
+    auth.setToken(data.accessToken)
+    if (data.refreshToken) {
+      auth.setSsoToken(data.refreshToken)
+    } else {
+      removeSsoToken()
+    }
+    auth.setUser({
+      id: data.memberId,
+      nickname: (data.nickname || '会员').trim(),
+      loginName: data.memberNo?.trim(),
+      avatar: data.avatar || '',
+      phone: (data.mobile || '').trim()
+    })
+
+    uni.hideLoading()
+    uni.showToast({ title: '登录成功', icon: 'none' })
+    setTimeout(goAfterLogin, 300)
+  } catch (error) {
+    uni.hideLoading()
+    uni.showToast({ title: (error as Error).message || '登录失败', icon: 'none' })
+  } finally {
+    logging.value = false
+  }
+}
+
+function goAfterLogin() {
+  const fallbackUrl = '/pages/meal/index'
+  const url = redirect.value || fallbackUrl
+  if (isTabBarPage(url)) {
+    uni.switchTab({
+      url,
+      fail: () => uni.reLaunch({ url })
+    })
+    return
+  }
+  uni.redirectTo({
+    url,
+    fail: () => {
+      uni.navigateTo({
+        url,
+        fail: () => uni.switchTab({ url: fallbackUrl })
+      })
+    }
+  })
+}
+</script>
+
+<style scoped lang="scss">
+.login {
+  background: linear-gradient(180deg, #e8fafc 0%, #f7fbfc 45%, #ffffff 100%);
+}
+.hero {
+  padding: 96rpx 32rpx 28rpx;
+  text-align: center;
+}
+.brand {
+  font-size: 44rpx;
+  font-weight: 800;
+  color: #16343a;
+}
+.subtitle {
+  margin-top: 16rpx;
+  font-size: 26rpx;
+  color: #6b7c80;
+}
+.box {
+  margin: 40rpx 24rpx 0;
+  padding: 40rpx 32rpx;
+}
+.phone-btn {
+  width: 100%;
+  height: 96rpx;
+  line-height: 96rpx;
+  border-radius: 999rpx;
+  background: #00bcd4;
+  color: #fff;
+  font-size: 32rpx;
+  font-weight: 700;
+  border: none;
+  box-shadow: 0 14rpx 32rpx rgba(0, 188, 212, 0.25);
+
+  &::after {
+    border: none;
+  }
+}
+.tip-box {
+  padding: 28rpx;
+  border-radius: 18rpx;
+  background: #fff8e6;
+  color: #8a6d3b;
+  font-size: 26rpx;
+  line-height: 1.5;
+}
+.agreement-section {
+  display: flex;
+  align-items: flex-start;
+  gap: 14rpx;
+  margin-top: 32rpx;
+}
+.checkbox-hit {
+  padding-top: 4rpx;
+}
+.checkbox {
+  width: 34rpx;
+  height: 34rpx;
+  border: 2rpx solid #a8c2c8;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #fff;
+
+  &.checked {
+    background: #00bcd4;
+    border-color: #00bcd4;
+  }
+}
+.checkbox-check {
+  font-size: 22rpx;
+  color: #fff;
+  line-height: 1;
+}
+.agreement-text {
+  flex: 1;
+  font-size: 24rpx;
+  color: #7a8b90;
+  line-height: 1.65;
+}
+.agreement-link {
+  color: #00a9bf;
+  padding: 0 4rpx;
+}
+</style>

+ 644 - 0
src/package-views/pages/meal/checkout.vue

@@ -0,0 +1,644 @@
+<template>
+  <view class="safe-page checkout-page">
+    <view class="card hero-card">
+      <view>
+        <view class="title">确认订单</view>
+        <view v-if="payload" class="muted">{{ payload.mode === 'company' ? '企业团餐' : '个人订餐' }} · {{ payload.mealDate }} · {{ mealTypeLabel(payload.mealType) }}</view>
+        <view v-else class="muted">订单信息不存在,请返回重新选择菜品</view>
+      </view>
+      <view v-if="payload" class="mode-tag">{{ payload.mode === 'company' ? '企业' : '个人' }}</view>
+    </view>
+
+    <view v-if="payload" class="card pickup-card">
+      <view class="card-head">
+        <view class="section-title">自提信息</view>
+        <view class="pickup-tag">自提</view>
+      </view>
+      <view class="pickup-main">
+        <view class="pickup-name">{{ payload.serviceAreaName || '当前服务区域' }}</view>
+        <view class="muted">取货日期:{{ payload.pickupDate || payload.mealDate }}</view>
+        <view class="muted">取餐点:{{ payload.pickupLocation || payload.serviceArea?.pickupLocation || '以现场通知为准' }}</view>
+        <view v-if="payload.serviceAreaPhone" class="muted">联系电话:{{ payload.serviceAreaPhone }}</view>
+      </view>
+    </view>
+
+    <view v-if="payload" class="card address-card" @click="goAddressSelect">
+      <view class="card-head">
+        <view class="section-title">收货信息</view>
+        <view class="switch-link">{{ selectedAddress ? '切换' : '去添加' }}</view>
+      </view>
+      <view v-if="selectedAddress" class="address-main">
+        <view class="address-head">
+          <text class="address-name">{{ selectedAddress.name }}</text>
+          <text class="muted">{{ selectedAddress.phone }}</text>
+        </view>
+        <view v-if="addressText" class="muted address-text">{{ addressText }}</view>
+      </view>
+      <view v-else class="address-empty" @click.stop="goAddressEdit">
+        <view class="muted">请先维护收货人信息</view>
+        <view class="go-edit-link">去添加收货信息</view>
+      </view>
+    </view>
+
+    <view v-if="payload" class="card items-card">
+      <view class="card-head">
+        <view class="section-title">预订餐食</view>
+        <view class="muted">共 {{ totalQuantity }} 份</view>
+      </view>
+      <view v-for="item in payload.items" :key="item.menuItemId" class="food-row">
+        <view class="food-main">
+          <view class="food-name">{{ item.itemName || '餐食' }}</view>
+          <view v-if="item.specName" class="muted spec-line">规格:{{ item.specName }}<text v-if="item.specDescription">({{ item.specDescription }})</text></view>
+          <view class="muted">¥{{ formatMoney(item.salePrice || 0) }} × {{ item.quantity }} 份</view>
+          <view :class="['muted', 'stock-line', stockDanger(item) && 'danger']">{{ stockText(item) }}</view>
+        </view>
+        <view class="food-price">¥{{ formatMoney(item.totalAmount ?? (item.salePrice || 0) * item.quantity) }}</view>
+      </view>
+      <view class="items-total">
+        <text>餐食金额</text>
+        <text>¥{{ formatMoney(localTotalAmount) }}</text>
+      </view>
+    </view>
+
+    <PriceSummary :items="summaryItems" />
+
+    <view v-if="payload?.mode === 'company'" class="card pay-tip">
+      <view v-if="employeePayAmount <= 0" class="tip-title">企业已支付,无需个人付款</view>
+      <view v-else class="tip-title">需补差 ¥{{ formatMoney(employeePayAmount) }}</view>
+      <view class="muted">{{ employeePayAmount <= 0 ? '提交后将直接生成企业团餐订单' : '提交后订单可能处于待支付状态,请在订单详情中处理补差支付' }}</view>
+    </view>
+
+    <view class="card remark-card">
+      <view class="section-title">订单备注</view>
+      <textarea v-model="remark" class="remark-input" maxlength="100" placeholder="如有忌口、取餐备注,可填写备注" />
+    </view>
+
+    <view class="bottom-bar">
+      <view>
+        <view class="muted">应付金额</view>
+        <view class="payable">¥{{ formatMoney(payableAmount) }}</view>
+      </view>
+      <view :class="['primary-btn', 'submit', submitLoading && 'disabled']" @click="submitOrder">{{ submitButtonText }}</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, ref } from 'vue'
+import { onLoad, onShow } from '@dcloudio/uni-app'
+import PriceSummary from '@/components/PriceSummary.vue'
+import { createCompanyMealOrder, fetchCompanyMealMenu, trialCompanyMealOrder } from '@/api/modules/companyMeal'
+import { cancelMealOrder, createMealOrder, fetchMealMenu, fetchMealOrderDetail, prepareMealPay } from '@/api/modules/meal'
+import { fetchAddressList } from '@/api/modules/address'
+import { requestWechatPay } from '@/utils/pay'
+import { mealTypeLabel } from '@/utils/mealDisplay'
+import { formatMoney } from '@/utils/money'
+import type { FoodMealServiceArea } from '@/types/meal'
+import type { MemberAddress } from '@/types/address'
+
+type PayloadItem = {
+  menuItemId: string
+  specId?: string
+  specName?: string
+  specDescription?: string
+  quantity: number
+  itemName?: string
+  salePrice?: number
+  totalAmount?: number
+  stockQuantity?: number | null
+  soldQuantity?: number | null
+  remainingQuantity?: number | null
+  limitQuantityPerUser?: number | null
+}
+
+type StockSnapshot = Pick<PayloadItem, 'stockQuantity' | 'soldQuantity' | 'remainingQuantity'> & {
+  soldOut?: boolean
+  limitQuantityPerUser?: number | null
+}
+
+type SpecWithStock = {
+  id?: string
+  name: string
+  description?: string
+  salePrice?: number
+} & StockSnapshot
+
+type Payload = {
+  mode: 'personal' | 'company'
+  companyId?: string
+  menuId: string
+  serviceAreaId?: string
+  restaurantId?: string
+  serviceAreaName?: string
+  serviceAreaPhone?: string
+  serviceArea?: FoodMealServiceArea
+  mealDate: string
+  mealType: string
+  pickupType?: 'pickup' | 'delivery'
+  pickupDate?: string
+  pickupLocation?: string
+  deadlineTime?: string
+  deadlineRemainSeconds?: number | null
+  totalAmount?: number
+  items: PayloadItem[]
+  trial?: {
+    originalAmount: number
+    discountAmount: number
+    companyPayAmount: number
+    employeePayAmount: number
+  }
+}
+
+const payload = ref<Payload | null>(null)
+const submitLoading = ref(false)
+const remark = ref('')
+const selectedAddress = ref<MemberAddress | null>(null)
+const addressText = computed(() => {
+  const a = selectedAddress.value
+  if (!a) return ''
+  return [a.province, a.city, a.district, a.detail].filter(Boolean).join('')
+})
+
+const localTotalAmount = computed(() => {
+  if (!payload.value) return 0
+  if (typeof payload.value.totalAmount === 'number') return payload.value.totalAmount
+  return payload.value.items.reduce((sum, item) => sum + (item.totalAmount ?? (item.salePrice || 0) * item.quantity), 0)
+})
+const totalQuantity = computed(() => payload.value?.items.reduce((sum, item) => sum + item.quantity, 0) || 0)
+const employeePayAmount = computed(() => payload.value?.trial?.employeePayAmount || 0)
+const payableAmount = computed(() => payload.value?.mode === 'company' ? employeePayAmount.value : localTotalAmount.value)
+const submitButtonText = computed(() => {
+  if (submitLoading.value) return '提交中...'
+  if (payload.value?.mode === 'company') return employeePayAmount.value > 0 ? '提交并补差' : '提交企业订单'
+  return '提交并支付'
+})
+
+const summaryItems = computed(() => {
+  if (!payload.value) return []
+  if (payload.value.mode === 'company' && payload.value.trial) {
+    return [
+      { label: '原价', value: payload.value.trial.originalAmount },
+      { label: '优惠', value: payload.value.trial.discountAmount },
+      { label: '企业承担', value: payload.value.trial.companyPayAmount },
+      { label: '员工自付', value: payload.value.trial.employeePayAmount, strong: true }
+    ]
+  }
+  return [{ label: '订单金额', value: localTotalAmount.value, strong: true }]
+})
+
+onLoad(() => {
+  payload.value = uni.getStorageSync('meal_checkout_payload') || null
+  loadDefaultAddress()
+})
+
+onShow(() => {
+  const stored = uni.getStorageSync('meal_selected_address') as MemberAddress | undefined
+  if (stored) {
+    selectedAddress.value = stored
+    uni.removeStorageSync('meal_selected_address')
+  } else if (!selectedAddress.value) {
+    loadDefaultAddress()
+  }
+})
+
+async function loadDefaultAddress() {
+  try {
+    const res = await fetchAddressList()
+    const list = res.data || []
+    selectedAddress.value = list.find(item => item.isDefault) || list[0] || null
+  } catch {
+    // 忽略地址加载失败
+  }
+}
+
+function goAddressSelect() {
+  uni.navigateTo({ url: '/pages/address/list?select=1' })
+}
+
+function goAddressEdit() {
+  uni.navigateTo({ url: '/pages/address/edit' })
+}
+
+function clearCheckoutCache() {
+  uni.removeStorageSync('meal_selected_address')
+  uni.removeStorageSync('meal_checkout_payload')
+}
+
+function goOrderDetail(mode: 'personal' | 'company', orderId: string) {
+  uni.redirectTo({ url: `/package-views/pages/order/detail?mode=${mode}&orderId=${encodeURIComponent(orderId)}` })
+}
+
+function goOrderSuccess(mode: 'personal' | 'company', orderId: string) {
+  uni.redirectTo({ url: `/package-views/pages/order/success?mode=${mode}&orderId=${encodeURIComponent(orderId)}` })
+}
+
+function showUnpaidOrderEntry(mode: 'personal' | 'company', orderId: string, message: string) {
+  uni.showModal({
+    title: '订单已创建',
+    content: message,
+    showCancel: false,
+    confirmText: '查看订单',
+    complete: () => goOrderDetail(mode, orderId)
+  })
+}
+
+function remainingQuantity(item: Pick<PayloadItem, 'stockQuantity' | 'soldQuantity' | 'remainingQuantity'>) {
+  if (item.remainingQuantity != null) return item.remainingQuantity
+  if (item.stockQuantity == null) return null
+  return Math.max(item.stockQuantity - (item.soldQuantity || 0), 0)
+}
+
+function stockText(item: PayloadItem) {
+  const remain = remainingQuantity(item)
+  if (remain == null) return '库存充足'
+  if (remain <= 0) return '已售罄,请返回重新选择'
+  if (item.quantity > remain) return `库存不足,剩余 ${remain} 份`
+  return `当前剩余 ${remain} 份`
+}
+
+function stockDanger(item: PayloadItem) {
+  const remain = remainingQuantity(item)
+  return remain != null && (remain <= 0 || item.quantity > remain)
+}
+
+function showStockError(message: string) {
+  uni.showModal({ title: '无法提交订单', content: message, showCancel: false, confirmText: '知道了' })
+}
+
+function payloadServiceAreaId() {
+  return payload.value?.serviceAreaId || payload.value?.restaurantId
+}
+
+async function refreshAndValidateStock() {
+  if (!payload.value) return false
+  const serviceAreaId = payloadServiceAreaId()
+  const res = payload.value.mode === 'company' && payload.value.companyId
+    ? await fetchCompanyMealMenu({ companyId: payload.value.companyId, serviceAreaId, mealDate: payload.value.mealDate, mealType: payload.value.mealType })
+    : await fetchMealMenu({ serviceAreaId, mealDate: payload.value.mealDate, mealType: payload.value.mealType })
+  const menu = res.data
+  if (!menu?.items?.length) {
+    showStockError('当前菜单不可预订,请返回重新选择')
+    return false
+  }
+  if (menu.orderable === false) {
+    showStockError(menu.notOrderableReason || '当前菜单不可预订')
+    return false
+  }
+  const latestItems = new Map(menu.items.map(item => [item.id, item]))
+  const refreshedItems: PayloadItem[] = []
+  for (const selectedItem of payload.value.items) {
+    const latestItem = latestItems.get(selectedItem.menuItemId)
+    if (!latestItem) {
+      showStockError('部分餐食已下架,请返回重新选择')
+      return false
+    }
+    const menuItemRemain = remainingQuantity(latestItem)
+    if (menuItemRemain != null && menuItemRemain <= 0) {
+      showStockError(`${latestItem.itemName || '餐食'} 已售罄,请返回重新选择`)
+      return false
+    }
+    if (menuItemRemain != null && selectedItem.quantity > menuItemRemain) {
+      showStockError(`${latestItem.itemName || '餐食'} 库存不足,当前剩余 ${menuItemRemain} 份`)
+      return false
+    }
+    if (latestItem.specs?.length && !selectedItem.specId) {
+      showStockError(`${latestItem.itemName || '餐食'} 需返回详情页选择规格`)
+      return false
+    }
+    const latestSpec = selectedItem.specId ? (latestItem.specs?.find(spec => spec.id === selectedItem.specId) as SpecWithStock | undefined) : undefined
+    if (selectedItem.specId && !latestSpec) {
+      showStockError(`${latestItem.itemName || '餐食'} 规格已下架,请返回重新选择`)
+      return false
+    }
+    const stockSource: StockSnapshot = latestSpec ?? latestItem
+    const remain = remainingQuantity(stockSource)
+    if (latestSpec?.soldOut === true || (remain != null && remain <= 0)) {
+      showStockError(`${latestItem.itemName || '餐食'}${latestSpec?.name ? `(${latestSpec.name})` : ''} 已售罄,请返回重新选择`)
+      return false
+    }
+    if (remain != null && selectedItem.quantity > remain) {
+      showStockError(`${latestItem.itemName || '餐食'}${latestSpec?.name ? `(${latestSpec.name})` : ''} 库存不足,当前剩余 ${remain} 份`)
+      return false
+    }
+    const limitQuantityPerUser = stockSource.limitQuantityPerUser ?? latestItem.limitQuantityPerUser
+    if (limitQuantityPerUser != null && selectedItem.quantity > limitQuantityPerUser) {
+      showStockError(`${latestItem.itemName || '餐食'}${latestSpec?.name ? `(${latestSpec.name})` : ''} 每人限购 ${limitQuantityPerUser} 份`)
+      return false
+    }
+    const salePrice = latestSpec?.salePrice ?? latestItem.salePrice ?? selectedItem.salePrice ?? 0
+    refreshedItems.push({
+      ...selectedItem,
+      itemName: latestItem.itemName || selectedItem.itemName,
+      specName: latestSpec?.name || selectedItem.specName,
+      specDescription: latestSpec?.description || selectedItem.specDescription,
+      salePrice,
+      totalAmount: salePrice * selectedItem.quantity,
+      stockQuantity: stockSource.stockQuantity,
+      soldQuantity: stockSource.soldQuantity,
+      remainingQuantity: remain,
+      limitQuantityPerUser
+    })
+  }
+  let trial = payload.value.trial
+  if (payload.value.mode === 'company' && payload.value.companyId) {
+    const trialRes = await trialCompanyMealOrder({
+      companyId: payload.value.companyId,
+      serviceAreaId,
+      menuId: payload.value.menuId,
+      mealDate: payload.value.mealDate,
+      mealType: payload.value.mealType,
+      items: refreshedItems.map(item => ({ menuItemId: item.menuItemId, specId: item.specId, quantity: item.quantity }))
+    })
+    trial = {
+      originalAmount: trialRes.data.originalAmount,
+      discountAmount: trialRes.data.discountAmount,
+      companyPayAmount: trialRes.data.companyPayAmount,
+      employeePayAmount: trialRes.data.employeePayAmount
+    }
+  }
+  payload.value = {
+    ...payload.value,
+    serviceAreaId: menu.serviceAreaId || menu.restaurantId || serviceAreaId,
+    serviceAreaName: menu.serviceArea?.name || menu.serviceAreaName || menu.restaurant?.name || menu.restaurantName || payload.value.serviceAreaName,
+    serviceAreaPhone: menu.serviceArea?.phone || menu.restaurant?.phone || payload.value.serviceAreaPhone,
+    serviceArea: menu.serviceArea || menu.restaurant || payload.value.serviceArea,
+    pickupDate: menu.pickupDate || payload.value.pickupDate,
+    pickupLocation: menu.pickupLocation || menu.serviceArea?.pickupLocation || menu.restaurant?.pickupLocation || payload.value.pickupLocation,
+    totalAmount: refreshedItems.reduce((sum, item) => sum + (item.totalAmount ?? (item.salePrice || 0) * item.quantity), 0),
+    items: refreshedItems,
+    trial
+  }
+  uni.setStorageSync('meal_checkout_payload', payload.value)
+  return true
+}
+
+async function submitOrder() {
+  if (submitLoading.value) return
+  if (!payload.value) {
+    uni.showToast({ title: '订单信息不存在', icon: 'none' })
+    return
+  }
+  if (!payload.value.items.length) {
+    uni.showToast({ title: '订餐明细不能为空', icon: 'none' })
+    return
+  }
+  if (!selectedAddress.value) {
+    uni.showModal({
+      title: '提示',
+      content: '请先维护收货人信息后再下单',
+      confirmText: '去添加',
+      success: res => {
+        if (res.confirm) goAddressEdit()
+      }
+    })
+    return
+  }
+  const serviceAreaId = payloadServiceAreaId()
+  const addressId = selectedAddress.value.id
+
+  submitLoading.value = true
+  try {
+    const stockValid = await refreshAndValidateStock()
+    if (!stockValid) return
+
+    if (payload.value.mode === 'company') {
+      const res = await createCompanyMealOrder({
+        companyId: payload.value.companyId || '',
+        serviceAreaId,
+        menuId: payload.value.menuId,
+        mealDate: payload.value.mealDate,
+        mealType: payload.value.mealType,
+        deliveryType: 'pickup',
+        addressId,
+        remark: remark.value,
+        items: payload.value.items.map(item => ({ menuItemId: item.menuItemId, specId: item.specId, quantity: item.quantity }))
+      })
+      clearCheckoutCache()
+      if ((res.data.employeePayAmount || 0) <= 0) {
+        uni.showToast({ title: '企业已支付,无需个人付款', icon: 'none' })
+        goOrderSuccess('company', res.data.id)
+      } else {
+        showUnpaidOrderEntry('company', res.data.id, '企业订单已创建,需补差或等待支付状态更新,请在订单详情中继续处理。')
+      }
+      return
+    }
+
+    const order = await createMealOrder({
+      serviceAreaId,
+      menuId: payload.value.menuId,
+      mealDate: payload.value.mealDate,
+      mealType: payload.value.mealType,
+      deliveryType: 'pickup',
+      addressId,
+      remark: remark.value,
+      items: payload.value.items.map(item => ({ menuItemId: item.menuItemId, specId: item.specId, quantity: item.quantity }))
+    })
+    clearCheckoutCache()
+    try {
+      const pay = await prepareMealPay({ orderId: order.data.id })
+      // skip-payment 模式:后端已直接标记已支付,VO 无 packageValue(bindPayOrder 未执行),直接跳成功页
+      if (!pay.data?.packageValue) {
+        goOrderSuccess('personal', order.data.id)
+        return
+      }
+      await requestWechatPay(pay.data)
+      goOrderSuccess('personal', order.data.id)
+    } catch {
+      // 支付失败/取消:先尝试取消订单
+      let cancelled = false
+      try {
+        await cancelMealOrder({ orderId: order.data.id, cancelReason: '用户取消支付' })
+        cancelled = true
+      } catch {
+        // 取消失败:可能是微信回调已将订单标记为已支付(前端回调与后端回调时差)
+        // 需查订单状态,已支付则跳成功页,否则提示异常
+      }
+      if (cancelled) {
+        uni.showToast({ title: '支付已取消,订单未生成', icon: 'none' })
+        setTimeout(() => uni.navigateBack(), 1500)
+      } else {
+        try {
+          const detail = await fetchMealOrderDetail(order.data.id)
+          if (detail.data?.orderStatus === 'paid' || detail.data?.payStatus === 'paid') {
+            uni.showToast({ title: '支付成功', icon: 'none' })
+            goOrderSuccess('personal', order.data.id)
+          } else {
+            uni.showToast({ title: '支付未完成,请稍后在订单中处理', icon: 'none', duration: 3000 })
+            setTimeout(() => uni.navigateBack(), 3000)
+          }
+        } catch {
+          uni.showToast({ title: '支付未完成,请稍后在订单中处理', icon: 'none', duration: 3000 })
+          setTimeout(() => uni.navigateBack(), 3000)
+        }
+      }
+    }
+  } finally {
+    submitLoading.value = false
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.checkout-page {
+  padding-bottom: 150rpx;
+}
+.hero-card,
+.card-head,
+.food-row,
+.items-total,
+.bottom-bar {
+  display: flex;
+  align-items: center;
+}
+.hero-card,
+.card-head,
+.food-row,
+.items-total,
+.bottom-bar {
+  justify-content: space-between;
+}
+.title {
+  font-size: 34rpx;
+  font-weight: 800;
+  margin-bottom: 12rpx;
+}
+.mode-tag,
+.pickup-tag {
+  border-radius: 999rpx;
+  color: #00a6bd;
+  background: #e8fbff;
+}
+.mode-tag,
+.pickup-tag {
+  padding: 8rpx 18rpx;
+  font-size: 24rpx;
+}
+.section-title {
+  font-size: 30rpx;
+  font-weight: 800;
+}
+.pickup-card,
+.items-card,
+.pay-tip,
+.remark-card,
+.address-card {
+  margin-top: 20rpx;
+}
+.address-card {
+  cursor: pointer;
+}
+.address-main {
+  margin-top: 16rpx;
+}
+.address-head {
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+  margin-bottom: 8rpx;
+}
+.address-name {
+  font-size: 32rpx;
+  font-weight: 800;
+  color: #111827;
+}
+.address-text {
+  font-size: 28rpx;
+  line-height: 1.5;
+}
+.address-empty {
+  margin-top: 16rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.go-edit-link {
+  color: #00a6bd;
+  font-size: 28rpx;
+  font-weight: 700;
+}
+.switch-link {
+  color: #00a6bd;
+  font-size: 26rpx;
+  font-weight: 700;
+}
+.pickup-main {
+  margin-top: 20rpx;
+  display: flex;
+  flex-direction: column;
+  gap: 10rpx;
+}
+.pickup-name {
+  color: #111827;
+  font-size: 32rpx;
+  font-weight: 800;
+}
+.food-row {
+  gap: 20rpx;
+  padding: 22rpx 0;
+  border-top: 1rpx solid #eef2f7;
+}
+.food-row:first-of-type {
+  border-top: 0;
+}
+.food-main {
+  flex: 1;
+  min-width: 0;
+}
+.food-name {
+  color: #111827;
+  font-size: 30rpx;
+  font-weight: 700;
+  margin-bottom: 8rpx;
+}
+.food-price {
+  font-weight: 800;
+  color: #ff6b35;
+}
+.stock-line,
+.spec-line {
+  margin-top: 6rpx;
+  font-size: 22rpx;
+}
+.danger {
+  color: #ef4444;
+}
+.items-total {
+  border-top: 1rpx solid #eef2f7;
+  padding-top: 20rpx;
+  font-weight: 800;
+}
+.pay-tip {
+  background: #fffaf0;
+}
+.tip-title {
+  font-weight: 800;
+  margin-bottom: 12rpx;
+}
+.remark-input {
+  width: 100%;
+  min-height: 120rpx;
+  margin-top: 20rpx;
+  font-size: 28rpx;
+  color: #111827;
+}
+.bottom-bar {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 18rpx 28rpx calc(18rpx + env(safe-area-inset-bottom));
+  background: #fff;
+  box-shadow: 0 -8rpx 30rpx rgba(15, 23, 42, 0.08);
+}
+.payable {
+  color: #ef4444;
+  font-size: 36rpx;
+  font-weight: 800;
+}
+.submit {
+  width: 240rpx;
+}
+.disabled {
+  opacity: 0.6;
+}
+</style>

+ 533 - 0
src/package-views/pages/meal/detail.vue

@@ -0,0 +1,533 @@
+<template>
+  <view class="safe-page detail-page">
+    <scroll-view scroll-y class="detail-scroll">
+      <swiper v-if="images.length" class="swiper" circular indicator-dots>
+        <swiper-item v-for="img in images" :key="img">
+          <image class="hero-img" :src="img" mode="aspectFill" />
+        </swiper-item>
+      </swiper>
+      <view v-else class="empty-img">订餐</view>
+
+    <view v-if="item" class="card main-card">
+      <view class="title-row">
+        <view class="name">{{ item.itemName }}</view>
+        <view class="price">¥{{ formatMoney(finalSalePrice) }}</view>
+      </view>
+      <view v-if="item.tags?.length" class="tags">
+        <text v-for="tag in item.tags" :key="tag" class="tag">{{ tag }}</text>
+      </view>
+      <view :class="['stock', soldOut && 'danger']">{{ stockText }}</view>
+    </view>
+
+    <view v-if="item" class="card info-card" @click="goServiceAreaSelect">
+      <view class="section-title">当前服务区域</view>
+      <view class="area-row">
+        <view>
+          <view class="area-name">{{ currentServiceArea?.name || item.serviceArea?.name || item.restaurant?.name || '未选择服务区域' }}</view>
+          <view class="muted">{{ currentServiceArea?.floorLabel || currentServiceArea?.locationLabel || item.serviceArea?.locationLabel || item.serviceArea?.address || item.restaurant?.locationLabel || item.restaurant?.address || '暂无位置信息' }}</view>
+          <view v-if="currentServiceArea?.phone || item.serviceArea?.phone || item.restaurant?.phone" class="muted">电话:{{ currentServiceArea?.phone || item.serviceArea?.phone || item.restaurant?.phone }}</view>
+        </view>
+        <view class="switch-link">切换</view>
+      </view>
+    </view>
+
+    <view v-if="item" class="card info-card">
+      <view class="section-title">取餐信息</view>
+      <view class="info-line">取货方式:自提</view>
+      <view class="info-line">取货日期:{{ item.pickupDate || item.menuDate || '以订单为准' }}</view>
+      <view class="info-line">取餐点:{{ item.pickupLocation || currentServiceArea?.pickupLocation || '以现场通知为准' }}</view>
+    </view>
+
+    <view v-if="item" class="card info-card">
+      <view class="section-title">下单倒计时</view>
+      <view :class="['countdown', hasDeadline && countdown <= 0 && 'danger']">{{ countdownText }}</view>
+    </view>
+
+    <view v-if="item?.specs?.length" class="card info-card">
+      <view class="section-title">菜品规格</view>
+      <view class="specs">
+        <view v-for="spec in item.specs" :key="spec.id || spec.name" :class="['spec', isSpecSelected(spec) && 'active']" @click="selectSpec(spec)">
+          <view>{{ spec.name }}</view>
+          <view v-if="spec.description" class="muted">{{ spec.description }}</view>
+          <view class="muted">{{ specStockText(spec) }}</view>
+        </view>
+      </view>
+    </view>
+
+    <view v-if="item" class="card info-card">
+      <view class="section-title">购买数量</view>
+      <view class="stepper-row">
+        <view class="stepper">
+          <view :class="['step-btn', quantity <= 1 && 'step-disabled']" @click="changeQuantity(-1)">-</view>
+          <text class="step-num">{{ quantity }}</text>
+          <view :class="['step-btn', quantity >= maxQuantity && 'step-disabled']" @click="changeQuantity(1)">+</view>
+        </view>
+        <view v-if="maxQuantityText" class="muted step-tip">{{ maxQuantityText }}</view>
+      </view>
+    </view>
+
+      <view v-if="item?.descriptionHtml" class="card info-card">
+        <view class="section-title">菜品描述</view>
+        <rich-text :nodes="item.descriptionHtml" />
+      </view>
+      <view class="detail-bottom-spacer" />
+    </scroll-view>
+
+    <view class="bottom-bar">
+      <button :class="['buy-btn', (!canBuy || loading) && 'disabled']" :disabled="!canBuy || loading" @click="buyNow">{{ buttonText }}</button>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, onUnmounted, ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { fetchMealMenuItemDetail } from '@/api/modules/meal'
+import { fetchCompanyMealMenuItemDetail, trialCompanyMealOrder } from '@/api/modules/companyMeal'
+import { useCompanyStore } from '@/store/modules/company'
+import { useMealStore } from '@/store/modules/meal'
+import type { FoodMealMenuItemDetail, FoodMealMenuItemSpec } from '@/types/meal'
+import { formatMoney } from '@/utils/money'
+import { requireLoginNavigate } from '@/utils/auth'
+
+type StockSnapshot = {
+  stockQuantity?: number | null
+  soldQuantity?: number | null
+  remainingQuantity?: number | null
+  soldOut?: boolean
+  limitQuantityPerUser?: number | null
+}
+
+type SpecWithStock = FoodMealMenuItemSpec & StockSnapshot
+
+const company = useCompanyStore()
+const meal = useMealStore()
+const item = ref<FoodMealMenuItemDetail | null>(null)
+const loading = ref(false)
+const menuItemId = ref('')
+const mode = ref<'personal' | 'company'>('personal')
+const companyId = ref('')
+const countdown = ref(0)
+const selectedSpec = ref<SpecWithStock | null>(null)
+const quantity = ref(1)
+let timer: ReturnType<typeof setInterval> | null = null
+let countdownRefreshed = false
+
+const currentServiceArea = computed(() => item.value?.serviceArea || meal.currentServiceArea || item.value?.restaurant)
+const detailServiceAreaId = computed(() => item.value?.serviceAreaId || item.value?.serviceArea?.id || item.value?.restaurantId || item.value?.restaurant?.id)
+const serviceAreaChanged = computed(() => {
+  return Boolean(meal.currentServiceArea?.id && detailServiceAreaId.value && meal.currentServiceArea.id !== detailServiceAreaId.value)
+})
+const images = computed(() => item.value?.images?.length ? item.value.images : (item.value?.itemImage ? [item.value.itemImage] : []))
+const hasSpecs = computed(() => Boolean(item.value?.specs?.length))
+const finalSalePrice = computed(() => selectedSpec.value?.salePrice ?? item.value?.salePrice ?? 0)
+const currentStockSource = computed<StockSnapshot | null>(() => selectedSpec.value || item.value)
+const currentLimitQuantityPerUser = computed(() => selectedSpec.value?.limitQuantityPerUser ?? item.value?.limitQuantityPerUser ?? null)
+const currentRemainingQuantity = computed(() => currentStockSource.value ? remainingQuantity(currentStockSource.value) : null)
+const soldOut = computed(() => {
+  if (selectedSpec.value?.soldOut === true) return true
+  if (!selectedSpec.value && item.value?.soldOut === true) return true
+  return currentRemainingQuantity.value != null && currentRemainingQuantity.value <= 0
+})
+const hasDeadline = computed(() => item.value?.deadlineRemainSeconds != null)
+const maxQuantity = computed(() => {
+  const stock = currentRemainingQuantity.value == null ? 999 : currentRemainingQuantity.value
+  const limit = currentLimitQuantityPerUser.value == null ? 999 : currentLimitQuantityPerUser.value
+  return Math.max(Math.min(stock, limit), 1)
+})
+const maxQuantityText = computed(() => {
+  const remain = currentRemainingQuantity.value
+  const limit = currentLimitQuantityPerUser.value
+  if (remain != null && limit != null) return `本单最多可选 ${Math.min(remain, limit)} 份`
+  if (remain != null) return `本单最多可选 ${remain} 份`
+  if (limit != null) return `每人限购 ${limit} 份`
+  return ''
+})
+const canBuy = computed(() => Boolean(item.value && !soldOut.value && item.value.orderable !== false && (!hasDeadline.value || countdown.value > 0)))
+const stockText = computed(() => {
+  const remain = currentRemainingQuantity.value
+  const stock = remain == null ? '库存充足' : (remain <= 0 ? '仅剩 0,已售罄' : `仅剩 ${remain} 份`)
+  if (currentLimitQuantityPerUser.value != null) return `${stock},每人限购 ${currentLimitQuantityPerUser.value} 份`
+  return stock
+})
+const countdownText = computed(() => {
+  if (item.value?.orderable === false) return item.value.notOrderableReason || '已停止接单'
+  if (hasDeadline.value && countdown.value <= 0) return '已截单/停止接单'
+  if (!hasDeadline.value) return '随时可订'
+  const h = Math.floor(countdown.value / 3600).toString().padStart(2, '0')
+  const m = Math.floor((countdown.value % 3600) / 60).toString().padStart(2, '0')
+  const s = Math.floor(countdown.value % 60).toString().padStart(2, '0')
+  return `${h}:${m}:${s}`
+})
+const buttonText = computed(() => {
+  if (soldOut.value) return '已售罄'
+  if (item.value?.orderable === false) return '已停止接单'
+  if (hasDeadline.value && countdown.value <= 0) return '已截单'
+  return '立即购买'
+})
+
+onLoad(async query => {
+  menuItemId.value = String(query?.menuItemId || '')
+  mode.value = query?.mode === 'company' ? 'company' : 'personal'
+  companyId.value = String(query?.companyId || '')
+  await loadDetail()
+})
+
+onUnmounted(() => stopTimer())
+
+async function loadDetail() {
+  if (!menuItemId.value) return
+  loading.value = true
+  try {
+    const currentCompanyId = companyId.value || company.currentCompany?.companyId
+    const res = mode.value === 'company' && currentCompanyId
+      ? await fetchCompanyMealMenuItemDetail(currentCompanyId, menuItemId.value)
+      : await fetchMealMenuItemDetail(menuItemId.value)
+    const detail = res.data
+    item.value = detail
+    selectedSpec.value = detail.specs?.find(spec => !specSoldOut(spec)) || detail.specs?.[0] || null
+    quantity.value = 1
+    countdown.value = Math.max(Number(detail.deadlineRemainSeconds || 0), 0)
+    countdownRefreshed = false
+    startTimer()
+  } finally {
+    loading.value = false
+  }
+}
+
+function startTimer() {
+  stopTimer()
+  if (!item.value || !hasDeadline.value || countdown.value <= 0) return
+  timer = setInterval(async () => {
+    countdown.value = Math.max(countdown.value - 1, 0)
+    if (countdown.value <= 0) {
+      stopTimer()
+      if (!countdownRefreshed) {
+        countdownRefreshed = true
+        await refreshDetailOnce()
+      }
+    }
+  }, 1000)
+}
+
+function stopTimer() {
+  if (timer) clearInterval(timer)
+  timer = null
+}
+
+async function refreshDetailOnce() {
+  if (!menuItemId.value) return
+  const currentCompanyId = companyId.value || company.currentCompany?.companyId
+  const res = mode.value === 'company' && currentCompanyId
+    ? await fetchCompanyMealMenuItemDetail(currentCompanyId, menuItemId.value)
+    : await fetchMealMenuItemDetail(menuItemId.value)
+  const detail = res.data
+  item.value = detail
+  selectedSpec.value = detail.specs?.find(spec => selectedSpec.value?.id ? spec.id === selectedSpec.value.id : spec.name === selectedSpec.value?.name) as SpecWithStock || detail.specs?.find(spec => !specSoldOut(spec)) || detail.specs?.[0] || null
+  countdown.value = Math.max(Number(detail.deadlineRemainSeconds || 0), 0)
+}
+
+function modeQuery() {
+  const params = [`mode=${mode.value}`]
+  const currentCompanyId = companyId.value || company.currentCompany?.companyId
+  if (mode.value === 'company' && currentCompanyId) params.push(`companyId=${encodeURIComponent(currentCompanyId)}`)
+  return params.join('&')
+}
+
+function goServiceAreaSelect() {
+  uni.navigateTo({ url: `/package-views/pages/meal/restaurant-select?from=detail&${modeQuery()}` })
+}
+
+function remainingQuantity(source: { stockQuantity?: number | null; soldQuantity?: number | null; remainingQuantity?: number | null }) {
+  if (source.remainingQuantity != null) return source.remainingQuantity
+  if (source.stockQuantity == null) return null
+  return Math.max(source.stockQuantity - (source.soldQuantity || 0), 0)
+}
+
+function specSoldOut(spec: FoodMealMenuItemSpec) {
+  const snapshot = spec as SpecWithStock
+  const remain = remainingQuantity(snapshot)
+  return snapshot.soldOut === true || (remain != null && remain <= 0)
+}
+
+function specStockText(spec: FoodMealMenuItemSpec) {
+  const snapshot = spec as SpecWithStock
+  const remain = remainingQuantity(snapshot)
+  const stock = remain == null ? '库存充足' : (remain <= 0 ? '仅剩 0,已售罄' : `仅剩 ${remain} 份`)
+  if (snapshot.limitQuantityPerUser != null) return `${stock},每人限购 ${snapshot.limitQuantityPerUser} 份`
+  return stock
+}
+
+function selectSpec(spec: FoodMealMenuItemSpec) {
+  selectedSpec.value = spec as SpecWithStock
+  quantity.value = 1
+}
+
+function changeQuantity(delta: number) {
+  if (delta < 0 && quantity.value <= 1) return
+  if (delta > 0 && quantity.value >= maxQuantity.value) return
+  const next = Math.max(1, Math.min(quantity.value + delta, maxQuantity.value))
+  if (next === quantity.value && delta > 0) {
+    uni.showToast({ title: '已达可选上限', icon: 'none' })
+  }
+  quantity.value = next
+}
+
+function isSpecSelected(spec: FoodMealMenuItemSpec) {
+  if (!selectedSpec.value) return false
+  if (selectedSpec.value.id || spec.id) return selectedSpec.value.id === spec.id
+  return selectedSpec.value.name === spec.name
+}
+
+async function buyNow() {
+  if (!item.value || !canBuy.value) return
+  if (serviceAreaChanged.value) {
+    uni.showModal({
+      title: '服务区域已切换',
+      content: '请返回菜单重新选择当前服务区域的菜品',
+      confirmText: '返回菜单',
+      success: res => {
+        if (res.confirm) uni.redirectTo({ url: `/package-views/pages/meal/menu?${modeQuery()}` })
+      }
+    })
+    return
+  }
+  if (!requireLoginNavigate(`/package-views/pages/meal/detail?menuItemId=${encodeURIComponent(menuItemId.value)}&${modeQuery()}`)) return
+  if (hasSpecs.value && !selectedSpec.value?.id) {
+    uni.showToast({ title: '请选择规格', icon: 'none' })
+    return
+  }
+  const currentCompanyId = companyId.value || company.currentCompany?.companyId
+  if (mode.value === 'company' && !currentCompanyId) {
+    uni.showToast({ title: '请选择企业', icon: 'none' })
+    return
+  }
+  const serviceArea = item.value.serviceArea || item.value.restaurant || currentServiceArea.value
+  const stockSnapshot = selectedSpec.value || item.value
+  const checkoutItem = {
+    menuItemId: item.value.id,
+    specId: selectedSpec.value?.id,
+    specName: selectedSpec.value?.name,
+    specDescription: selectedSpec.value?.description,
+    quantity: quantity.value,
+    itemName: item.value.itemName,
+    salePrice: finalSalePrice.value,
+    totalAmount: finalSalePrice.value * quantity.value,
+    stockQuantity: stockSnapshot.stockQuantity,
+    soldQuantity: stockSnapshot.soldQuantity,
+    remainingQuantity: remainingQuantity(stockSnapshot),
+    limitQuantityPerUser: stockSnapshot.limitQuantityPerUser
+  }
+  let trial
+  if (mode.value === 'company' && currentCompanyId) {
+    const trialRes = await trialCompanyMealOrder({
+      companyId: currentCompanyId,
+      serviceAreaId: detailServiceAreaId.value || serviceArea?.id,
+      menuId: item.value.menuId,
+      mealDate: item.value.menuDate || '',
+      mealType: item.value.mealType || '',
+      items: [{ menuItemId: item.value.id, specId: selectedSpec.value?.id, quantity: quantity.value }]
+    })
+    trial = {
+      originalAmount: trialRes.data.originalAmount,
+      discountAmount: trialRes.data.discountAmount,
+      companyPayAmount: trialRes.data.companyPayAmount,
+      employeePayAmount: trialRes.data.employeePayAmount
+    }
+  }
+  uni.setStorageSync('meal_checkout_payload', {
+    mode: mode.value,
+    ...(mode.value === 'company' ? { companyId: currentCompanyId, companyName: company.currentCompany?.companyName, trial } : {}),
+    menuId: item.value.menuId,
+    serviceAreaId: detailServiceAreaId.value || serviceArea?.id,
+    serviceAreaName: item.value.serviceAreaName || serviceArea?.name,
+    serviceAreaPhone: serviceArea?.phone,
+    serviceArea,
+    mealDate: item.value.menuDate,
+    mealType: item.value.mealType,
+    pickupType: 'pickup',
+    pickupDate: item.value.pickupDate || item.value.menuDate,
+    pickupLocation: item.value.pickupLocation || item.value.serviceArea?.pickupLocation || item.value.restaurant?.pickupLocation || serviceArea?.pickupLocation,
+    deadlineTime: item.value.deadlineTime,
+    deadlineRemainSeconds: countdown.value,
+    items: [checkoutItem],
+    totalAmount: finalSalePrice.value * quantity.value
+  })
+  uni.navigateTo({ url: '/package-views/pages/meal/checkout' })
+}
+</script>
+
+<style scoped lang="scss">
+.detail-page {
+  height: 100vh;
+  padding: 0;
+  overflow: hidden;
+}
+.detail-scroll {
+  height: calc(100vh - 148rpx - env(safe-area-inset-bottom));
+  padding: 24rpx 24rpx 0;
+  box-sizing: border-box;
+}
+.detail-bottom-spacer {
+  height: 40rpx;
+}
+.swiper,
+.hero-img,
+.empty-img {
+  width: 100%;
+  height: 430rpx;
+  border-radius: 28rpx;
+  overflow: hidden;
+}
+.empty-img {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #00838f;
+  background: #e0f7fa;
+  font-size: 42rpx;
+  font-weight: 700;
+}
+.main-card,
+.info-card {
+  margin-top: 22rpx;
+}
+.title-row,
+.area-row {
+  display: flex;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.name {
+  flex: 1;
+  font-size: 38rpx;
+  font-weight: 700;
+}
+.price {
+  color: #ef4444;
+  font-size: 38rpx;
+  font-weight: 800;
+}
+.tags {
+  margin-top: 18rpx;
+  display: flex;
+  gap: 10rpx;
+  flex-wrap: wrap;
+}
+.tag {
+  padding: 5rpx 14rpx;
+  border-radius: 999rpx;
+  background: #fff7ed;
+  color: #f97316;
+  font-size: 22rpx;
+}
+.stock,
+.countdown {
+  margin-top: 18rpx;
+  font-size: 30rpx;
+  font-weight: 700;
+  color: #16a34a;
+}
+.danger {
+  color: #ef4444;
+}
+.section-title {
+  font-size: 30rpx;
+  font-weight: 700;
+  margin-bottom: 16rpx;
+}
+.area-name {
+  font-weight: 700;
+  font-size: 30rpx;
+}
+.switch-link {
+  color: #f97316;
+  font-weight: 700;
+}
+.info-line {
+  margin-top: 10rpx;
+  color: #334155;
+}
+.specs {
+  display: flex;
+  flex-direction: column;
+  gap: 14rpx;
+}
+.spec {
+  padding: 18rpx;
+  border-radius: 18rpx;
+  border: 2rpx solid #e2e8f0;
+}
+.spec.disabled {
+  opacity: 0.58;
+}
+.spec-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 16rpx;
+  font-weight: 700;
+}
+.spec-price {
+  color: #ef4444;
+}
+.spec.active {
+  border-color: #00bcd4;
+  background: #e0f7fa;
+}
+.stepper-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.stepper {
+  display: flex;
+  align-items: center;
+  gap: 24rpx;
+}
+.step-btn {
+  width: 56rpx;
+  height: 56rpx;
+  line-height: 52rpx;
+  padding: 0;
+  border-radius: 50%;
+  border: 2rpx solid #e2e8f0;
+  background: #f8fafc;
+  font-size: 32rpx;
+  color: #334155;
+}
+.step-btn[disabled],
+.step-disabled {
+  opacity: 0.4;
+}
+.step-num {
+  min-width: 48rpx;
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 700;
+}
+.step-tip {
+  font-size: 24rpx;
+}
+.bottom-bar {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 20rpx 28rpx calc(20rpx + env(safe-area-inset-bottom));
+  background: #fff;
+  box-shadow: 0 -8rpx 30rpx rgba(15, 23, 42, 0.08);
+}
+.buy-btn {
+  height: 88rpx;
+  line-height: 88rpx;
+  border-radius: 999rpx;
+  background: #00bcd4;
+  color: #fff;
+  font-weight: 700;
+}
+.buy-btn.disabled {
+  background: #cbd5e1;
+}
+</style>

+ 687 - 0
src/package-views/pages/meal/menu.vue

@@ -0,0 +1,687 @@
+<template>
+  <view class="safe-page menu-page">
+    <view v-if="meal.currentServiceArea" class="card area-card">
+      <view class="area-main">
+        <view class="area-title-row">
+          <view class="area-name">{{ meal.currentServiceArea.name }}</view>
+          <view :class="['area-badge', meal.currentServiceArea.openStatus === 'closed' && 'closed']">{{ meal.currentServiceArea.openStatusText || '已开放' }}</view>
+        </view>
+        <view class="muted">{{ pickupLocationText }}</view>
+        <view v-if="meal.currentServiceArea.phone" class="muted">电话:{{ meal.currentServiceArea.phone }}</view>
+      </view>
+      <view class="switch-btn" @click="goServiceAreaSelect">切换区域</view>
+    </view>
+    <view v-else class="card area-card empty-area">
+      <view>暂无可用服务区域</view>
+      <view class="switch-btn" @click="goServiceAreaSelect">选择区域</view>
+    </view>
+
+    <view class="card selector">
+      <view class="section-title">订餐模式</view>
+      <view class="seg">
+        <view :class="['seg-item', mode === 'personal' && 'active']" @click="setMode('personal')">个人</view>
+        <view :class="['seg-item', mode === 'company' && 'active']" @click="goCompanySelect">企业</view>
+      </view>
+      <view v-if="mode === 'company'" class="muted company-name">企业:{{ company.currentCompany?.companyName || '未选择' }}</view>
+    </view>
+
+    <view class="card selector">
+      <view class="section-title">用餐日期</view>
+      <view v-if="datesLoading" class="loading-text">日期加载中...</view>
+      <view v-else class="week-row">
+        <view v-for="item in displayDateStatuses" :key="item.mealDate" :class="['date-chip', selectedDate === item.mealDate && 'chip-active', !item.orderable && 'disabled-chip']" @click="selectDate(item)">
+          <text class="date-main">{{ dateMainText(item.mealDate) }}</text>
+          <text class="date-sub">{{ dateSubText(item.mealDate) }}</text>
+        </view>
+      </view>
+      <view v-if="!datesLoading && !availableDisplayDateStatuses.length" class="tip-text">暂无可订菜单</view>
+
+      <view class="section-title mt">餐别</view>
+      <view v-if="mealTypesLoading" class="loading-text">餐别加载中...</view>
+      <view v-else-if="mealTypes.length" class="chips">
+        <view v-for="type in mealTypes" :key="type.value" :class="['chip', selectedMealType === type.value && 'chip-active']" @click="selectMealType(type.value)">{{ type.label || mealTypeLabel(type.value) }}</view>
+      </view>
+      <view v-else class="tip-text">{{ selectedDate ? '当前日期暂无可订餐餐别' : '请先选择用餐日期' }}</view>
+    </view>
+
+    <view v-if="menuLoading" class="card loading-card">菜单加载中...</view>
+    <EmptyState v-else-if="!meal.currentServiceArea" title="暂无服务区域" description="请选择可用服务区域后查看菜单" />
+    <EmptyState v-else-if="!availableDisplayDateStatuses.length" title="暂无可订菜单" description="请稍后再来查看" />
+    <EmptyState v-else-if="!mealTypes.length" title="暂无餐别" description="请选择其他日期或稍后再试" />
+    <EmptyState v-else-if="!menu?.items?.length" title="暂无菜单" description="请选择其他日期或餐别" />
+    <view v-else class="list">
+      <view v-if="menu.orderable === false || serviceAreaClosed" class="card unavailable-card">{{ disabledReason }}</view>
+      <view v-else-if="hasDeadline && countdown > 0" class="card deadline-card">距离截单 {{ countdownText }}<text v-if="menu.deadlineTime">({{ menu.deadlineTime }})</text></view>
+      <MealMenuItemCard
+        v-for="item in menu.items"
+        :key="item.id"
+        :item="withRemaining(item)"
+        :quantity="quantities[item.id] || 0"
+        :disabled="menu.orderable === false || serviceAreaClosed || (hasDeadline && countdown <= 0)"
+        :disabled-reason="menu.orderable === false || serviceAreaClosed || (hasDeadline && countdown <= 0) ? disabledReason : undefined"
+        @change="value => setQuantity(item.id, value)"
+        @detail="goDetail(item.id)"
+      />
+    </view>
+
+    <view class="cart-bar">
+      <view>
+        <view class="muted">已选 {{ selectedCount }} 份</view>
+        <view class="price">¥{{ formatMoney(totalAmount) }}</view>
+      </view>
+      <view :class="['primary-btn', 'submit', (checkoutLoading || !canCheckout) && 'disabled']" @click="goCheckout">{{ checkoutLoading ? '处理中...' : '去结算' }}</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onLoad, onShow } from '@dcloudio/uni-app'
+import { computed, onUnmounted, ref } from 'vue'
+import EmptyState from '@/components/EmptyState.vue'
+import MealMenuItemCard from '@/components/MealMenuItemCard.vue'
+import { fetchMealDateStatuses, fetchMealMenu, fetchMealServiceAreas, fetchMealTypes, trialMealOrder } from '@/api/modules/meal'
+import { fetchCompanyMealDateStatuses, fetchCompanyMealMenu, fetchCompanyMealTypes, fetchMyCompanies, trialCompanyMealOrder } from '@/api/modules/companyMeal'
+import { useCompanyStore } from '@/store/modules/company'
+import { useMealStore } from '@/store/modules/meal'
+import type { FoodMealDateStatus, FoodMealMenu, FoodMealType } from '@/types/meal'
+import { formatMoney } from '@/utils/money'
+import { mealTypeLabel } from '@/utils/mealDisplay'
+import { requireLoginNavigate } from '@/utils/auth'
+
+const company = useCompanyStore()
+const meal = useMealStore()
+const mode = ref<'personal' | 'company'>('personal')
+const weekOffset = ref(0) // 0=本周, 1=下一周
+const dateStatuses = ref<FoodMealDateStatus[]>([])
+const mealTypes = ref<FoodMealType[]>([])
+const selectedDate = ref('')
+const selectedMealType = ref('')
+const menu = ref<FoodMealMenu | null>(null)
+const quantities = ref<Record<string, number>>({})
+const datesLoading = ref(false)
+const mealTypesLoading = ref(false)
+const menuLoading = ref(false)
+const checkoutLoading = ref(false)
+const countdown = ref(0)
+let timer: ReturnType<typeof setInterval> | null = null
+let countdownRefreshed = false
+
+const selectedItems = computed(() => Object.entries(quantities.value).filter(([, quantity]) => quantity > 0))
+const selectedCount = computed(() => selectedItems.value.reduce((sum, [, quantity]) => sum + quantity, 0))
+const totalAmount = computed(() => selectedItems.value.reduce((sum, [id, quantity]) => {
+  const item = menu.value?.items.find(i => i.id === id)
+  return sum + (item?.salePrice || 0) * quantity
+}, 0))
+const serviceAreaClosed = computed(() => meal.currentServiceArea?.openStatus === 'closed')
+const pickupLocationText = computed(() => meal.currentServiceArea?.pickupLocation || meal.currentServiceArea?.floorLabel || meal.currentServiceArea?.locationLabel || meal.currentServiceArea?.address || '暂无位置信息')
+const currentWeekDates = computed(() => buildWeekDates(weekOffset.value))
+const dateStatusMap = computed(() => new Map(dateStatuses.value.map(item => [item.mealDate, item])))
+const displayDateStatuses = computed<FoodMealDateStatus[]>(() => currentWeekDates.value.map(date => dateStatusMap.value.get(date) || {
+  mealDate: date,
+  orderable: false,
+  status: 'unavailable',
+  reason: '当前日期不可预订'
+}))
+const availableDisplayDateStatuses = computed(() => displayDateStatuses.value.filter(item => item.orderable))
+const hasDeadline = computed(() => menu.value?.deadlineRemainSeconds != null)
+const disabledReason = computed(() => {
+  if (serviceAreaClosed.value) return '当前服务区域未开放'
+  if (menu.value?.orderable === false) return menu.value.notOrderableReason || '当前菜单不可预订'
+  if (hasDeadline.value && countdown.value <= 0) return '已截单/停止接单'
+  return '当前菜单不可预订'
+})
+const canCheckout = computed(() => Boolean(menu.value?.items?.length && menu.value.orderable !== false && !serviceAreaClosed.value && (!hasDeadline.value || countdown.value > 0)))
+const countdownText = computed(() => {
+  const h = Math.floor(countdown.value / 3600).toString().padStart(2, '0')
+  const m = Math.floor((countdown.value % 3600) / 60).toString().padStart(2, '0')
+  const s = Math.floor(countdown.value % 60).toString().padStart(2, '0')
+  return `${h}:${m}:${s}`
+})
+
+function currentServiceAreaId(menuData?: FoodMealMenu | null) {
+  return menuData?.serviceAreaId || menuData?.restaurantId || meal.currentServiceAreaId
+}
+
+onLoad(async query => {
+  mode.value = query?.mode === 'company' ? 'company' : 'personal'
+  if (mode.value === 'company') {
+    const validCompany = await ensureValidCompany()
+    if (!validCompany) return
+  }
+  await initServiceAreasAndDates()
+})
+
+onShow(async () => {
+  if (mode.value === 'company') {
+    const validCompany = await ensureValidCompany()
+    if (!validCompany) return
+  }
+  if (!meal.serviceAreas.length) return
+  const menuServiceAreaId = currentServiceAreaId(menu.value)
+  if (meal.currentServiceAreaId && !menuLoading.value && menuServiceAreaId !== meal.currentServiceAreaId) await loadDates()
+})
+
+onUnmounted(() => stopTimer())
+
+async function initServiceAreasAndDates() {
+  await loadServiceAreas()
+  await loadDates()
+}
+
+async function loadServiceAreas() {
+  const res = await fetchMealServiceAreas()
+  meal.setServiceAreas(res.data || [])
+}
+
+async function setMode(next: 'personal' | 'company') {
+  if (mode.value === next) return
+  mode.value = next
+  quantities.value = {}
+  if (next === 'company') {
+    const validCompany = await ensureValidCompany()
+    if (!validCompany) return
+  }
+  await loadDates()
+}
+
+function goCompanySelect() {
+  if (!requireLoginNavigate('/package-views/pages/company/select')) return
+  uni.navigateTo({ url: '/package-views/pages/company/select' })
+}
+
+function guideCompanySelect(message = '企业团餐需先选择绑定企业') {
+  uni.showModal({
+    title: '请选择企业',
+    content: message,
+    confirmText: '去选择',
+    success: res => {
+      if (res.confirm) goCompanySelect()
+    }
+  })
+}
+
+async function ensureValidCompany() {
+  if (!requireLoginNavigate('/package-views/pages/meal/menu?mode=company')) return false
+  try {
+    const previousCompanyId = company.currentCompanyId || company.currentCompany?.companyId || ''
+    const res = await fetchMyCompanies()
+    company.setCompanies(res.data || [])
+    if (previousCompanyId && company.currentCompany?.companyId !== previousCompanyId) {
+      guideCompanySelect('当前企业已失效,请重新选择企业')
+      return false
+    }
+    if (company.currentCompany) return true
+    guideCompanySelect()
+  } catch {
+    guideCompanySelect('企业信息刷新失败,请稍后重试或重新选择企业')
+  }
+  return false
+}
+
+function goServiceAreaSelect() {
+  uni.navigateTo({ url: `/package-views/pages/meal/restaurant-select?from=menu&${modeQuery()}` })
+}
+
+async function loadDates() {
+  stopTimer()
+  datesLoading.value = true
+  weekOffset.value = 0
+  try {
+    await fetchAndApplyDateStatuses()
+    if (await shouldSwitchToNextWeek()) {
+      weekOffset.value = 1
+      await fetchAndApplyDateStatuses()
+    }
+    const firstAvailableDate = availableDisplayDateStatuses.value[0]
+    if (firstAvailableDate) await selectDate(firstAvailableDate, true)
+    else resetMenuState()
+  } finally {
+    datesLoading.value = false
+  }
+}
+
+async function fetchAndApplyDateStatuses() {
+  const serviceAreaId = meal.currentServiceAreaId
+  const weekStart = currentWeekDates.value[0]
+  const res = mode.value === 'company' && company.currentCompany
+    ? await fetchCompanyMealDateStatuses({ companyId: company.currentCompany.companyId, serviceAreaId, weekStart })
+    : await fetchMealDateStatuses({ serviceAreaId, weekStart })
+  dateStatuses.value = res.data || []
+}
+
+async function shouldSwitchToNextWeek() {
+  const today = new Date()
+  today.setHours(0, 0, 0, 0)
+  if (today.getDay() !== 0) return false
+  const todayStr = formatDate(today)
+  const todayStatus = dateStatusMap.value.get(todayStr)
+  if (!todayStatus || !todayStatus.orderable) return true
+  const serviceAreaId = meal.currentServiceAreaId
+  if (!serviceAreaId) return false
+  try {
+    const res = mode.value === 'company' && company.currentCompany
+      ? await fetchCompanyMealTypes({ companyId: company.currentCompany.companyId, serviceAreaId, mealDate: todayStr })
+      : await fetchMealTypes({ serviceAreaId, mealDate: todayStr })
+    return !(res.data && res.data.length > 0)
+  } catch {
+    return false
+  }
+}
+
+function resetMenuState() {
+  selectedDate.value = ''
+  mealTypes.value = []
+  selectedMealType.value = ''
+  menu.value = null
+  quantities.value = {}
+  countdown.value = 0
+}
+
+async function selectDate(dateStatus: FoodMealDateStatus, force = false) {
+  if (!dateStatus.orderable) {
+    uni.showToast({ title: dateStatus.reason || dateStatusText(dateStatus.status), icon: 'none' })
+    return
+  }
+  const date = dateStatus.mealDate
+  if (!force && selectedDate.value === date && mealTypes.value.length) return
+  selectedDate.value = date
+  selectedMealType.value = ''
+  mealTypes.value = []
+  menu.value = null
+  quantities.value = {}
+  stopTimer()
+  mealTypesLoading.value = true
+  try {
+    const serviceAreaId = meal.currentServiceAreaId
+    const res = mode.value === 'company' && company.currentCompany
+      ? await fetchCompanyMealTypes({ companyId: company.currentCompany.companyId, serviceAreaId, mealDate: date })
+      : await fetchMealTypes({ serviceAreaId, mealDate: date })
+    mealTypes.value = res.data || []
+    if (mealTypes.value.length) await selectMealType(mealTypes.value[0].value)
+  } finally {
+    mealTypesLoading.value = false
+  }
+}
+
+async function selectMealType(mealType: string) {
+  if (!selectedDate.value) return
+  selectedMealType.value = mealType
+  quantities.value = {}
+  menu.value = null
+  stopTimer()
+  menuLoading.value = true
+  try {
+    const serviceAreaId = meal.currentServiceAreaId
+    const res = mode.value === 'company' && company.currentCompany
+      ? await fetchCompanyMealMenu({ companyId: company.currentCompany.companyId, serviceAreaId, mealDate: selectedDate.value, mealType })
+      : await fetchMealMenu({ serviceAreaId, mealDate: selectedDate.value, mealType })
+    menu.value = res.data || null
+    meal.setMenu(menu.value)
+    countdown.value = Math.max(Number(menu.value?.deadlineRemainSeconds || 0), 0)
+    countdownRefreshed = false
+    startTimer()
+  } finally {
+    menuLoading.value = false
+  }
+}
+
+function startTimer() {
+  stopTimer()
+  if (!menu.value || !hasDeadline.value || countdown.value <= 0) return
+  timer = setInterval(async () => {
+    countdown.value = Math.max(countdown.value - 1, 0)
+    if (countdown.value <= 0) {
+      stopTimer()
+      if (!countdownRefreshed) {
+        countdownRefreshed = true
+        await refreshCurrentMenu()
+      }
+    }
+  }, 1000)
+}
+
+function stopTimer() {
+  if (timer) clearInterval(timer)
+  timer = null
+}
+
+async function refreshCurrentMenu() {
+  if (!selectedDate.value || !selectedMealType.value) return
+  const serviceAreaId = meal.currentServiceAreaId
+  const res = mode.value === 'company' && company.currentCompany
+    ? await fetchCompanyMealMenu({ companyId: company.currentCompany.companyId, serviceAreaId, mealDate: selectedDate.value, mealType: selectedMealType.value })
+    : await fetchMealMenu({ serviceAreaId, mealDate: selectedDate.value, mealType: selectedMealType.value })
+  menu.value = res.data || null
+  meal.setMenu(menu.value)
+  countdown.value = Math.max(Number(menu.value?.deadlineRemainSeconds || 0), 0)
+}
+
+function remainingQuantity(item: { stockQuantity?: number | null; soldQuantity?: number | null; remainingQuantity?: number | null }) {
+  if (item.remainingQuantity != null) return item.remainingQuantity
+  if (item.stockQuantity == null) return null
+  return Math.max(item.stockQuantity - (item.soldQuantity || 0), 0)
+}
+
+function withRemaining<T extends { stockQuantity?: number | null; soldQuantity?: number | null; remainingQuantity?: number | null }>(item: T): T {
+  return { ...item, remainingQuantity: remainingQuantity(item) }
+}
+
+function setQuantity(id: string, value: number) {
+  const item = menu.value?.items.find(i => i.id === id)
+  if (item?.specs?.length && value > 0) {
+    uni.showToast({ title: '请选择规格', icon: 'none' })
+    goDetail(id)
+    return
+  }
+  quantities.value = { ...quantities.value, [id]: value }
+  if (value <= 0) delete quantities.value[id]
+}
+
+function modeQuery() {
+  const params = [`mode=${mode.value}`]
+  if (mode.value === 'company' && company.currentCompany?.companyId) params.push(`companyId=${encodeURIComponent(company.currentCompany.companyId)}`)
+  return params.join('&')
+}
+
+function goDetail(menuItemId: string) {
+  uni.navigateTo({ url: `/package-views/pages/meal/detail?menuItemId=${encodeURIComponent(menuItemId)}&${modeQuery()}` })
+}
+
+function dateStatusText(status: FoodMealDateStatus['status']) {
+  const textMap: Record<FoodMealDateStatus['status'], string> = {
+    orderable: '可预订',
+    expired: '已过期',
+    not_started: '未到可预订时间',
+    after_deadline: '已超过预约截止时间',
+    out_of_range: '超出可预订范围',
+    no_menu: '当前日期暂无可订菜单',
+    invalid_date: '日期无效',
+    unavailable: '当前日期不可预订'
+  }
+  return textMap[status] || '当前日期不可预订'
+}
+
+function buildWeekDates(offset = 0) {
+  const today = new Date()
+  today.setHours(0, 0, 0, 0)
+  const monday = new Date(today)
+  const day = today.getDay()
+  monday.setDate(today.getDate() - (day === 0 ? 6 : day - 1) + offset * 7)
+  return Array.from({ length: 7 }, (_, index) => {
+    const date = new Date(monday)
+    date.setDate(monday.getDate() + index)
+    return formatDate(date)
+  })
+}
+
+function formatDate(date: Date) {
+  const year = date.getFullYear()
+  const month = `${date.getMonth() + 1}`.padStart(2, '0')
+  const day = `${date.getDate()}`.padStart(2, '0')
+  return `${year}-${month}-${day}`
+}
+
+function dateMainText(date: string) {
+  const today = new Date()
+  today.setHours(0, 0, 0, 0)
+  const target = new Date(`${date}T00:00:00`)
+  const diff = Math.round((target.getTime() - today.getTime()) / 86400000)
+  if (diff === 0) return '今天'
+  if (diff === 1) return '明天'
+  if (diff === 2) return '后天'
+  return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][target.getDay()]
+}
+
+function dateSubText(date: string) {
+  return date.slice(5)
+}
+
+async function goCheckout() {
+  if (checkoutLoading.value) return
+  if (datesLoading.value || mealTypesLoading.value || menuLoading.value) {
+    uni.showToast({ title: '菜单加载中,请稍候', icon: 'none' })
+    return
+  }
+  if (!canCheckout.value) {
+    uni.showToast({ title: disabledReason.value, icon: 'none' })
+    return
+  }
+  if (!selectedItems.value.length) {
+    uni.showToast({ title: '请选择菜品', icon: 'none' })
+    return
+  }
+  if (!requireLoginNavigate('/package-views/pages/meal/menu')) return
+  if (mode.value === 'company') {
+    const validCompany = await ensureValidCompany()
+    if (!validCompany) return
+  }
+
+  const needSpecItem = selectedItems.value
+    .map(([menuItemId]) => menu.value?.items.find(i => i.id === menuItemId))
+    .find(item => item?.specs?.length)
+  if (needSpecItem?.id) {
+    uni.showModal({
+      title: '请选择规格',
+      content: `${needSpecItem.itemName || '该餐食'} 需到详情页选择规格后购买`,
+      confirmText: '去选择',
+      success: res => {
+        if (res.confirm) goDetail(needSpecItem.id)
+      }
+    })
+    return
+  }
+
+  checkoutLoading.value = true
+  const orderItems = selectedItems.value.map(([menuItemId, quantity]) => ({ menuItemId, quantity }))
+  const checkoutItems = selectedItems.value.map(([menuItemId, quantity]) => {
+    const item = menu.value?.items.find(i => i.id === menuItemId)
+    return {
+      menuItemId,
+      quantity,
+      itemName: item?.itemName,
+      salePrice: item?.salePrice || 0,
+      totalAmount: (item?.salePrice || 0) * quantity,
+      stockQuantity: item?.stockQuantity,
+      soldQuantity: item?.soldQuantity,
+      remainingQuantity: item ? remainingQuantity(item) : null,
+      limitQuantityPerUser: item?.limitQuantityPerUser
+    }
+  })
+  const payload = {
+    mode: mode.value,
+    menuId: menu.value!.id,
+    serviceAreaId: currentServiceAreaId(menu.value),
+    serviceAreaName: menu.value!.serviceArea?.name || menu.value!.serviceAreaName || menu.value!.restaurant?.name || menu.value!.restaurantName || meal.currentServiceArea?.name,
+    serviceAreaPhone: menu.value!.serviceArea?.phone || menu.value!.restaurant?.phone || meal.currentServiceArea?.phone,
+    serviceArea: menu.value!.serviceArea || menu.value!.restaurant || meal.currentServiceArea,
+    mealDate: selectedDate.value,
+    mealType: selectedMealType.value,
+    pickupType: 'pickup' as const,
+    pickupDate: menu.value!.pickupDate || selectedDate.value,
+    pickupLocation: menu.value!.pickupLocation || menu.value!.serviceArea?.pickupLocation || menu.value!.restaurant?.pickupLocation || meal.currentServiceArea?.pickupLocation,
+    deadlineTime: menu.value!.deadlineTime,
+    deadlineRemainSeconds: countdown.value,
+    items: checkoutItems,
+    totalAmount: totalAmount.value
+  }
+  try {
+    if (mode.value === 'company') {
+      const trial = await trialCompanyMealOrder({
+        companyId: company.currentCompany!.companyId,
+        serviceAreaId: payload.serviceAreaId,
+        menuId: payload.menuId,
+        mealDate: payload.mealDate,
+        mealType: payload.mealType,
+        items: orderItems
+      })
+      uni.setStorageSync('meal_checkout_payload', { ...payload, companyId: company.currentCompany!.companyId, companyName: company.currentCompany!.companyName, trial: trial.data })
+    } else {
+      const trial = await trialMealOrder({
+        serviceAreaId: payload.serviceAreaId,
+        menuId: payload.menuId,
+        mealDate: payload.mealDate,
+        mealType: payload.mealType,
+        items: orderItems
+      })
+      const trialItems = new Map((trial.data.items || []).map(item => [item.menuItemId, item]))
+      uni.setStorageSync('meal_checkout_payload', {
+        ...payload,
+        totalAmount: trial.data.totalAmount,
+        items: payload.items.map(item => ({ ...item, ...(trialItems.get(item.menuItemId) || {}) }))
+      })
+    }
+    uni.navigateTo({ url: '/package-views/pages/meal/checkout' })
+  } finally {
+    checkoutLoading.value = false
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.menu-page {
+  padding-bottom: 150rpx;
+}
+.area-card,
+.selector {
+  margin-bottom: 20rpx;
+}
+.area-card {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.area-main {
+  flex: 1;
+  min-width: 0;
+}
+.area-title-row {
+  display: flex;
+  align-items: center;
+  gap: 12rpx;
+  margin-bottom: 10rpx;
+}
+.area-name {
+  font-size: 32rpx;
+  font-weight: 800;
+  color: #0f172a;
+}
+.area-badge {
+  padding: 4rpx 12rpx;
+  border-radius: 999rpx;
+  color: #16a34a;
+  background: #dcfce7;
+  font-size: 22rpx;
+}
+.area-badge.closed {
+  color: #64748b;
+  background: #e2e8f0;
+}
+.switch-btn {
+  flex-shrink: 0;
+  padding: 14rpx 20rpx;
+  border-radius: 999rpx;
+  background: #f97316;
+  color: #fff;
+  font-size: 24rpx;
+  font-weight: 700;
+}
+.empty-area {
+  color: #64748b;
+}
+.section-title {
+  font-weight: 700;
+  margin-bottom: 16rpx;
+}
+.mt {
+  margin-top: 24rpx;
+}
+.seg,
+.chips {
+  display: flex;
+  gap: 16rpx;
+}
+.week-row {
+  display: grid;
+  grid-template-columns: repeat(7, minmax(0, 1fr));
+  gap: 8rpx;
+}
+.seg-item,
+.chip,
+.date-chip {
+  display: inline-flex;
+  border-radius: 999rpx;
+  background: #f3f4f6;
+  color: #4b5563;
+}
+.seg-item,
+.chip {
+  padding: 16rpx 28rpx;
+}
+.date-chip {
+  min-width: 0;
+  padding: 12rpx 4rpx;
+  flex-direction: column;
+  align-items: center;
+  gap: 4rpx;
+}
+.date-main {
+  font-weight: 700;
+}
+.date-sub {
+  font-size: 22rpx;
+}
+.active,
+.chip-active {
+  background: #e0f7fa;
+  color: #00838f;
+  font-weight: 700;
+}
+.disabled-chip {
+  opacity: 0.45;
+}
+.company-name {
+  margin-top: 16rpx;
+}
+.loading-text,
+.tip-text,
+.loading-card {
+  color: #8a94a6;
+}
+.loading-card {
+  text-align: center;
+  margin-bottom: 20rpx;
+}
+.list {
+  display: flex;
+  flex-direction: column;
+  gap: 20rpx;
+}
+.unavailable-card {
+  color: #ef4444;
+  background: #fff1f2;
+}
+.deadline-card {
+  color: #92400e;
+  background: #fffbeb;
+}
+.cart-bar {
+  position: fixed;
+  left: 24rpx;
+  right: 24rpx;
+  bottom: 28rpx;
+  background: #fff;
+  border-radius: 24rpx;
+  padding: 20rpx 24rpx;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  box-shadow: 0 8rpx 28rpx rgba(15, 23, 42, 0.12);
+}
+.submit {
+  width: 220rpx;
+}
+.disabled {
+  opacity: 0.6;
+}
+</style>

+ 180 - 0
src/package-views/pages/meal/restaurant-select.vue

@@ -0,0 +1,180 @@
+<template>
+  <view class="safe-page select-page">
+    <view v-if="meal.currentServiceArea" class="block">
+      <view class="section-title">当前服务区域</view>
+      <view class="area-card current">
+        <image v-if="meal.currentServiceArea.icon" class="area-icon" :src="meal.currentServiceArea.icon" mode="aspectFill" />
+        <view v-else class="area-icon placeholder">订</view>
+        <view class="area-main">
+          <view class="area-name">{{ meal.currentServiceArea.name }}</view>
+          <view class="badge">{{ meal.currentServiceArea.openStatusText || '已开放' }}</view>
+          <view class="muted">{{ areaLocation(meal.currentServiceArea) }}</view>
+          <view v-if="meal.currentServiceArea.phone" class="muted">电话:{{ meal.currentServiceArea.phone }}</view>
+        </view>
+      </view>
+    </view>
+
+    <view class="block">
+      <view class="section-title">其他区域</view>
+      <view v-if="loading" class="card loading-card">区域加载中...</view>
+      <EmptyState v-else-if="!otherServiceAreas.length" title="暂无其他区域" description="请稍后再试" />
+      <view v-else class="list">
+        <view v-for="item in otherServiceAreas" :key="item.id" class="area-card">
+          <image v-if="item.icon" class="area-icon" :src="item.icon" mode="aspectFill" />
+          <view v-else class="area-icon placeholder">订</view>
+          <view class="area-main">
+            <view class="area-name">{{ item.name }}</view>
+            <view :class="['badge', item.openStatus === 'closed' && 'closed']">{{ item.openStatusText || '已开放' }}</view>
+            <view class="muted">{{ areaLocation(item) }}</view>
+            <view v-if="item.phone" class="muted">电话:{{ item.phone }}</view>
+          </view>
+          <button class="choose-btn" :disabled="item.openStatus === 'closed'" @click="choose(item)">选这个</button>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import EmptyState from '@/components/EmptyState.vue'
+import { fetchMealServiceAreas } from '@/api/modules/meal'
+import { useMealStore } from '@/store/modules/meal'
+import type { FoodMealServiceArea } from '@/types/meal'
+
+const meal = useMealStore()
+const loading = ref(false)
+const from = ref<'home' | 'menu' | 'detail'>('menu')
+const mode = ref<'personal' | 'company'>('personal')
+const companyId = ref('')
+
+const otherServiceAreas = computed(() => meal.serviceAreas.filter(item => item.id !== meal.currentServiceArea?.id))
+
+onLoad(async query => {
+  const source = String(query?.from || '')
+  from.value = source === 'home' || source === 'detail' ? source : 'menu'
+  mode.value = query?.mode === 'company' ? 'company' : 'personal'
+  companyId.value = String(query?.companyId || '')
+  await loadServiceAreas()
+})
+
+async function loadServiceAreas() {
+  loading.value = true
+  try {
+    const res = await fetchMealServiceAreas()
+    meal.setServiceAreas(res.data || [])
+  } finally {
+    loading.value = false
+  }
+}
+
+function areaLocation(item: FoodMealServiceArea) {
+  return item.floorLabel || item.locationLabel || item.address || '暂无位置信息'
+}
+
+function menuUrl() {
+  const params = [`mode=${mode.value}`]
+  if (mode.value === 'company' && companyId.value) params.push(`companyId=${encodeURIComponent(companyId.value)}`)
+  return `/package-views/pages/meal/menu?${params.join('&')}`
+}
+
+function choose(item: FoodMealServiceArea) {
+  meal.setCurrentServiceArea(item)
+  uni.showToast({ title: '切换成功', icon: 'success' })
+  setTimeout(() => {
+    if (from.value === 'detail') {
+      uni.redirectTo({ url: menuUrl() })
+      return
+    }
+    const pages = getCurrentPages()
+    if (pages.length > 1) uni.navigateBack()
+    else if (from.value === 'home') uni.switchTab({ url: '/pages/meal/index' })
+    else uni.redirectTo({ url: menuUrl() })
+  }, 350)
+}
+</script>
+
+<style scoped lang="scss">
+.select-page {
+  padding-bottom: 40rpx;
+}
+.block {
+  margin-bottom: 28rpx;
+}
+.section-title {
+  margin: 0 0 16rpx;
+  font-weight: 700;
+  font-size: 30rpx;
+}
+.list {
+  display: flex;
+  flex-direction: column;
+  gap: 18rpx;
+}
+.area-card {
+  display: flex;
+  align-items: center;
+  gap: 18rpx;
+  padding: 24rpx;
+  border-radius: 24rpx;
+  background: #fff;
+  box-shadow: 0 10rpx 28rpx rgba(15, 23, 42, 0.06);
+}
+.current {
+  border: 3rpx solid #ef4444;
+  background: #fff7f7;
+}
+.area-icon {
+  width: 104rpx;
+  height: 104rpx;
+  border-radius: 22rpx;
+  background: #e0f7fa;
+}
+.placeholder {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #00838f;
+  font-weight: 700;
+}
+.area-main {
+  flex: 1;
+  min-width: 0;
+}
+.area-name {
+  font-size: 31rpx;
+  font-weight: 700;
+  color: #0f172a;
+}
+.badge {
+  display: inline-block;
+  margin: 10rpx 0;
+  padding: 4rpx 14rpx;
+  border-radius: 999rpx;
+  font-size: 22rpx;
+  color: #16a34a;
+  background: #dcfce7;
+}
+.closed {
+  color: #64748b;
+  background: #e2e8f0;
+}
+.choose-btn {
+  min-width: 136rpx;
+  height: 62rpx;
+  line-height: 62rpx;
+  border-radius: 999rpx;
+  color: #fff;
+  background: #f97316;
+  font-size: 25rpx;
+  padding: 0 20rpx;
+}
+.choose-btn[disabled] {
+  background: #cbd5e1;
+}
+.loading-card {
+  text-align: center;
+  color: #64748b;
+}
+</style>

+ 311 - 0
src/package-views/pages/order/detail.vue

@@ -0,0 +1,311 @@
+<template>
+  <view class="safe-page">
+    <view v-if="loading" class="card state">订单详情加载中...</view>
+    <view v-else-if="missingOrderId" class="card empty-card">
+      <EmptyState title="缺少订单信息" description="未获取到订单编号,请返回订单列表重新进入" />
+      <view class="primary-btn empty-action" @click="goOrderList">返回订单列表</view>
+    </view>
+    <view v-else-if="!order" class="card empty-card">
+      <EmptyState title="订单详情为空" description="暂未获取到订单详情,请稍后重试" />
+      <view class="primary-btn empty-action" @click="loadDetail">重新加载</view>
+    </view>
+    <template v-else>
+      <view class="card head">
+        <view>
+          <view class="title">{{ orderServiceAreaName }}</view>
+          <view class="muted">{{ mealTypeLabel(order.mealType) }} · {{ order.mealDate }}</view>
+          <view v-if="orderPickupLocation" class="muted extra">取餐点:{{ orderPickupLocation }}</view>
+          <view v-if="mode === 'company'" class="muted extra">{{ (order as FoodCompanyMealOrder).companyName || '企业订单' }}</view>
+          <view class="muted extra">订单号:{{ order.orderNo }}</view>
+          <view class="muted extra">支付状态:{{ payStatusLabel(order.payStatus) }}</view>
+        </view>
+        <OrderStatusTag :status="order.orderStatus" />
+      </view>
+
+      <view v-if="hasAddress" class="card delivery-card">
+        <view class="section-title">配送信息</view>
+        <view class="delivery-user">
+          <text class="delivery-name">{{ order.receiverName || '收货人' }}</text>
+          <text class="muted">{{ order.receiverMobile }}</text>
+        </view>
+        <view v-if="orderAddressText" class="delivery-address">{{ orderAddressText }}</view>
+        <view v-if="order.remark" class="muted delivery-remark">备注:{{ order.remark }}</view>
+      </view>
+
+      <view v-if="order.pickupCode" class="card pickup">
+        <view class="muted">取餐码</view>
+        <view class="code">{{ order.pickupCode }}</view>
+      </view>
+      <view v-else class="card pickup-empty">
+        <view class="muted">取餐码</view>
+        <view>支付完成后生成取餐码,请以订单状态为准</view>
+      </view>
+
+      <PriceSummary :items="summaryItems" />
+
+      <view class="card items">
+        <view class="section-title">菜品明细</view>
+        <view v-if="order.items?.length">
+          <view v-for="item in order.items" :key="item.id" class="item-row">
+            <view>
+              <view>{{ item.itemName }}</view>
+              <view class="muted">¥{{ formatMoney(item.salePrice) }} × {{ item.quantity }}</view>
+              <template v-if="mode === 'company'">
+                <view class="muted tiny">企业承担 ¥{{ formatMoney((item as FoodCompanyMealOrderItem).companyPayAmount) }} · 员工自付 ¥{{ formatMoney((item as FoodCompanyMealOrderItem).employeePayAmount) }}</view>
+              </template>
+            </view>
+            <view class="price">¥{{ formatMoney(item.totalAmount) }}</view>
+          </view>
+        </view>
+        <EmptyState v-else title="暂无菜品明细" description="当前订单未返回菜品信息" />
+      </view>
+
+      <view v-if="hasActions" class="actions">
+        <view v-if="canCancel" class="action cancel" @click="cancelOrder">取消订单</view>
+        <view v-if="canContinue" class="action primary" @click="continueOrder">继续处理</view>
+        <view v-if="canRefund" class="action refund" @click="applyRefund">申请退款</view>
+      </view>
+    </template>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import EmptyState from '@/components/EmptyState.vue'
+import OrderStatusTag from '@/components/OrderStatusTag.vue'
+import PriceSummary from '@/components/PriceSummary.vue'
+import { applyCompanyMealRefund, cancelCompanyMealOrder, fetchCompanyMealOrderDetail, prepareCompanyMealPay } from '@/api/modules/companyMeal'
+import { applyMealRefund, cancelMealOrder, fetchMealOrderDetail, prepareMealPay } from '@/api/modules/meal'
+import type { FoodCompanyMealOrder, FoodCompanyMealOrderItem } from '@/types/companyMeal'
+import type { FoodMealOrder } from '@/types/meal'
+import { formatMoney } from '@/utils/money'
+import { mealTypeLabel, payStatusLabel } from '@/utils/mealDisplay'
+import { requireLoginNavigate } from '@/utils/auth'
+import { requestWechatPay } from '@/utils/pay'
+
+type DetailOrder = FoodMealOrder | FoodCompanyMealOrder
+const mode = ref<'personal' | 'company'>('personal')
+const orderId = ref('')
+const order = ref<DetailOrder | null>(null)
+const loading = ref(false)
+const operating = ref(false)
+const missingOrderId = computed(() => !orderId.value)
+const orderAddressText = computed(() => {
+  const o = order.value
+  if (!o) return ''
+  return o.fullAddress || `${o.province || ''}${o.city || ''}${o.district || ''}${o.detailAddress || ''}`
+})
+const hasAddress = computed(() => Boolean(order.value?.addressId || order.value?.receiverName || order.value?.receiverMobile || orderAddressText.value))
+const orderServiceAreaName = computed(() => order.value?.serviceArea?.name || order.value?.serviceAreaName || order.value?.restaurant?.name || order.value?.restaurantName || '订餐订单')
+const orderPickupLocation = computed(() => order.value?.pickupLocation || order.value?.serviceArea?.pickupLocation || order.value?.restaurant?.pickupLocation || '')
+const canCancel = computed(() => order.value?.orderStatus === 'pending_pay')
+const canContinue = computed(() => order.value?.orderStatus === 'pending_pay')
+const canRefund = computed(() => order.value?.orderStatus === 'paid')
+const hasActions = computed(() => canCancel.value || canContinue.value || canRefund.value)
+
+const summaryItems = computed(() => {
+  if (!order.value) return []
+  if (mode.value === 'company') {
+    const o = order.value as FoodCompanyMealOrder
+    return [
+      { label: '订单总额', value: o.totalAmount },
+      { label: '优惠金额', value: o.discountAmount },
+      { label: '企业原承担', value: o.companyPayAmount },
+      { label: '员工原自付', value: o.employeePayAmount },
+      { label: '企业净承担', value: o.companyNetPayAmount, strong: true },
+      { label: '员工净自付', value: o.employeeNetPayAmount, strong: true },
+      { label: '退款金额', value: o.refundAmount || 0 }
+    ]
+  }
+  const o = order.value as FoodMealOrder
+  return [
+    { label: '订单金额', value: o.totalAmount },
+    { label: '实付金额', value: o.userPayAmount, strong: true },
+    { label: '退款金额', value: o.refundAmount || 0 }
+  ]
+})
+
+onLoad(async query => {
+  mode.value = query?.mode === 'company' ? 'company' : 'personal'
+  orderId.value = String(query?.orderId || '')
+  const redirect = `/package-views/pages/order/detail?mode=${mode.value}&orderId=${encodeURIComponent(orderId.value)}`
+  if (!requireLoginNavigate(redirect)) return
+  await loadDetail()
+})
+
+async function loadDetail() {
+  if (!orderId.value) return
+  loading.value = true
+  try {
+    const res = mode.value === 'company' ? await fetchCompanyMealOrderDetail(orderId.value) : await fetchMealOrderDetail(orderId.value)
+    order.value = res.data || null
+  } finally {
+    loading.value = false
+  }
+}
+
+async function confirmAction(content: string) {
+  const result = await new Promise<UniApp.ShowModalRes>(resolve => {
+    uni.showModal({ title: '操作确认', content, confirmText: '确认', cancelText: '再想想', success: resolve })
+  })
+  return result.confirm
+}
+
+async function cancelOrder() {
+  if (!order.value || operating.value) return
+  const confirmed = await confirmAction('确认取消该订单吗?取消后如需订餐请重新下单。')
+  if (!confirmed) return
+  operating.value = true
+  try {
+    if (mode.value === 'company') await cancelCompanyMealOrder({ orderId: order.value.id, cancelReason: '用户取消' })
+    else await cancelMealOrder({ orderId: order.value.id, cancelReason: '用户取消' })
+    uni.showToast({ title: '订单已取消', icon: 'none' })
+    await loadDetail()
+  } finally {
+    operating.value = false
+  }
+}
+
+async function continueOrder() {
+  if (!order.value || operating.value) return
+  operating.value = true
+  try {
+    const pay = mode.value === 'company'
+      ? await prepareCompanyMealPay({ orderId: order.value.id })
+      : await prepareMealPay({ orderId: order.value.id })
+    await requestWechatPay(pay.data)
+    uni.showToast({ title: '支付完成', icon: 'none' })
+    await loadDetail()
+  } catch (error) {
+    uni.showToast({ title: '支付未完成,可稍后继续处理', icon: 'none' })
+  } finally {
+    operating.value = false
+  }
+}
+
+async function applyRefund() {
+  if (!order.value || operating.value) return
+  const confirmed = await confirmAction('确认申请退款吗?提交后订单将进入退款处理流程。')
+  if (!confirmed) return
+  operating.value = true
+  try {
+    if (mode.value === 'company') await applyCompanyMealRefund({ orderId: order.value.id, refundReason: '用户申请退款' })
+    else await applyMealRefund({ orderId: order.value.id, refundReason: '用户申请退款' })
+    uni.showToast({ title: '已提交退款申请', icon: 'none' })
+    await loadDetail()
+  } finally {
+    operating.value = false
+  }
+}
+
+function goOrderList() {
+  uni.switchTab({ url: '/pages/order/index' })
+}
+</script>
+
+<style scoped lang="scss">
+.state,
+.empty-card {
+  text-align: center;
+}
+.empty-action {
+  margin-top: 8rpx;
+}
+.head {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  gap: 20rpx;
+}
+.title {
+  font-size: 34rpx;
+  font-weight: 700;
+  margin-bottom: 12rpx;
+}
+.extra {
+  margin-top: 8rpx;
+  font-size: 24rpx;
+}
+.delivery-card,
+.pickup {
+  margin: 20rpx 0;
+}
+.delivery-user {
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+  margin-top: 16rpx;
+}
+.delivery-name {
+  font-size: 30rpx;
+  font-weight: 800;
+}
+.delivery-address {
+  margin-top: 12rpx;
+  color: #111827;
+  font-size: 28rpx;
+  line-height: 1.5;
+}
+.delivery-remark {
+  margin-top: 10rpx;
+}
+.pickup {
+  text-align: center;
+}
+.pickup-empty {
+  margin: 20rpx 0;
+  display: flex;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.code {
+  margin-top: 10rpx;
+  font-size: 56rpx;
+  font-weight: 700;
+  color: #ff6b35;
+  letter-spacing: 8rpx;
+}
+.items {
+  margin-top: 20rpx;
+}
+.section-title {
+  font-weight: 700;
+  margin-bottom: 12rpx;
+}
+.item-row {
+  display: flex;
+  justify-content: space-between;
+  gap: 20rpx;
+  padding: 18rpx 0;
+  border-top: 1px solid #eef2f7;
+}
+.tiny {
+  margin-top: 8rpx;
+  font-size: 22rpx;
+}
+.actions {
+  display: flex;
+  gap: 20rpx;
+  margin-top: 28rpx;
+}
+.action {
+  flex: 1;
+  height: 82rpx;
+  border-radius: 41rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background: #fff;
+}
+.primary {
+  background: linear-gradient(135deg, #00bcd4, #26c6da);
+  color: #fff;
+}
+.cancel {
+  color: #6b7280;
+}
+.refund {
+  color: #f56c6c;
+}
+</style>

+ 182 - 0
src/package-views/pages/order/success.vue

@@ -0,0 +1,182 @@
+<template>
+  <view class="safe-page success">
+    <view class="card box">
+      <view class="icon">✓</view>
+      <view class="title">{{ title }}</view>
+      <view class="muted">{{ description }}</view>
+      <view v-if="loading" class="muted loading">订单信息加载中...</view>
+      <view v-if="hasAddress" class="summary-card">
+        <view class="summary-title">配送信息</view>
+        <view class="summary-user">{{ order?.receiverName || '收货人' }} {{ order?.receiverMobile || '' }}</view>
+        <view v-if="orderAddressText" class="summary-text">{{ orderAddressText }}</view>
+      </view>
+      <view v-if="orderItems.length" class="summary-card">
+        <view class="summary-title">预订餐食</view>
+        <view v-for="item in orderItems" :key="item.id" class="meal-row">
+          <text>{{ item.itemName }}</text>
+          <text>× {{ item.quantity }} 份</text>
+        </view>
+        <view class="meal-total">共 {{ totalQuantity }} 份</view>
+      </view>
+      <view v-if="pickupCode" class="pickup-wrap">
+        <view class="muted">取餐码</view>
+        <view class="pickup">{{ pickupCode }}</view>
+      </view>
+      <view v-if="orderId" class="primary-btn" @click="goDetail">查看订单</view>
+      <view v-else class="primary-btn" @click="goOrderList">查看订单列表</view>
+      <view class="back" @click="goHome">返回订餐</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed, ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { fetchCompanyMealOrderDetail } from '@/api/modules/companyMeal'
+import { fetchMealOrderDetail } from '@/api/modules/meal'
+import type { FoodCompanyMealOrder } from '@/types/companyMeal'
+import type { FoodMealOrder } from '@/types/meal'
+import { payStatusLabel } from '@/utils/mealDisplay'
+
+type DetailOrder = FoodMealOrder | FoodCompanyMealOrder
+const mode = ref<'personal' | 'company'>('personal')
+const orderId = ref('')
+const pickupCode = ref('')
+const order = ref<DetailOrder | null>(null)
+const loading = ref(false)
+
+const title = computed(() => {
+  if (!orderId.value) return '订单信息待确认'
+  if (!order.value) return mode.value === 'company' ? '企业订单已提交' : '订单已提交'
+  if (order.value.orderStatus === 'pending_pay') return mode.value === 'company' ? '企业订单待补差' : '订单待支付'
+  if (order.value.payStatus === 'paid' || order.value.orderStatus === 'paid') return mode.value === 'company' ? '企业订单已完成支付' : '支付成功'
+  return mode.value === 'company' ? '企业订单已提交' : '订单已提交'
+})
+
+const description = computed(() => {
+  if (!orderId.value) return '未获取到订单编号,可前往订单列表查看最新订单'
+  if (!order.value) return '请以订单详情状态为准'
+  if (order.value.orderStatus === 'pending_pay') return '支付未完成,可进入订单详情继续处理'
+  if (mode.value === 'company') {
+    const companyOrder = order.value as FoodCompanyMealOrder
+    if ((companyOrder.employeeNetPayAmount ?? companyOrder.employeePayAmount) <= 0) return '企业已承担本单费用,请等待配送或查看订单状态'
+    return `当前支付状态:${payStatusLabel(order.value.payStatus)},请等待配送或查看订单状态`
+  }
+  return `当前支付状态:${payStatusLabel(order.value.payStatus)},请等待配送或查看订单状态`
+})
+const orderAddressText = computed(() => {
+  const o = order.value
+  if (!o) return ''
+  return o.fullAddress || `${o.province || ''}${o.city || ''}${o.district || ''}${o.detailAddress || ''}`
+})
+const hasAddress = computed(() => Boolean(order.value?.addressId || order.value?.receiverName || order.value?.receiverMobile || orderAddressText.value))
+const orderItems = computed(() => order.value?.items || [])
+const totalQuantity = computed(() => orderItems.value.reduce((sum: number, item: { quantity: number }) => sum + item.quantity, 0))
+
+onLoad(async query => {
+  mode.value = query?.mode === 'company' ? 'company' : 'personal'
+  orderId.value = String(query?.orderId || '')
+  if (!orderId.value) return
+  loading.value = true
+  try {
+    const res = mode.value === 'company' ? await fetchCompanyMealOrderDetail(orderId.value) : await fetchMealOrderDetail(orderId.value)
+    order.value = res.data || null
+    pickupCode.value = res.data?.pickupCode || ''
+  } finally {
+    loading.value = false
+  }
+})
+
+function goDetail() {
+  if (!orderId.value) {
+    uni.showToast({ title: '缺少订单编号', icon: 'none' })
+    return
+  }
+  uni.redirectTo({ url: `/package-views/pages/order/detail?mode=${mode.value}&orderId=${encodeURIComponent(orderId.value)}` })
+}
+
+function goOrderList() {
+  uni.switchTab({ url: '/pages/order/index' })
+}
+
+function goHome() {
+  uni.switchTab({ url: '/pages/meal/index' })
+}
+</script>
+
+<style scoped lang="scss">
+.box {
+  text-align: center;
+  margin-top: 120rpx;
+}
+.icon {
+  width: 120rpx;
+  height: 120rpx;
+  border-radius: 50%;
+  margin: 0 auto 28rpx;
+  background: #00bcd4;
+  color: #fff;
+  font-size: 76rpx;
+  line-height: 120rpx;
+}
+.title {
+  font-size: 38rpx;
+  font-weight: 700;
+}
+.loading {
+  margin-top: 20rpx;
+}
+.summary-card {
+  margin: 28rpx 0 0;
+  padding: 24rpx;
+  border-radius: 24rpx;
+  background: #f8fafc;
+  text-align: left;
+}
+.summary-title {
+  font-size: 28rpx;
+  font-weight: 800;
+  margin-bottom: 14rpx;
+}
+.summary-user {
+  font-weight: 700;
+  margin-bottom: 8rpx;
+}
+.summary-text {
+  color: #334155;
+  font-size: 26rpx;
+  line-height: 1.5;
+}
+.meal-row {
+  display: flex;
+  justify-content: space-between;
+  gap: 20rpx;
+  padding: 10rpx 0;
+  color: #334155;
+  font-size: 26rpx;
+}
+.meal-total {
+  border-top: 1rpx solid #e2e8f0;
+  margin-top: 10rpx;
+  padding-top: 14rpx;
+  text-align: right;
+  font-weight: 800;
+}
+.pickup-wrap {
+  margin: 36rpx auto;
+}
+.pickup {
+  margin-top: 10rpx;
+  font-size: 58rpx;
+  font-weight: 700;
+  color: #ff6b35;
+  letter-spacing: 8rpx;
+}
+.primary-btn {
+  margin-top: 40rpx;
+}
+.back {
+  margin-top: 28rpx;
+  color: #00838f;
+}
+</style>

+ 166 - 0
src/pages.json

@@ -0,0 +1,166 @@
+{
+  "easycom": {
+    "autoscan": true,
+    "custom": {
+      "^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
+      "^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
+      "^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"
+    }
+  },
+  "pages": [
+    {
+      "path": "pages/meal/index",
+      "style": {
+        "navigationBarTitleText": "订餐",
+        "navigationBarBackgroundColor": "#E8FAFC",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/order/index",
+      "style": {
+        "navigationBarTitleText": "订单",
+        "navigationBarBackgroundColor": "#E8FAFC",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/profile/index",
+      "style": {
+        "navigationBarTitleText": "我的",
+        "navigationBarBackgroundColor": "#E8FAFC"
+      }
+    },
+    {
+      "path": "pages/address/list",
+      "style": {
+        "navigationBarTitleText": "配送地址",
+        "navigationBarBackgroundColor": "#E8FAFC"
+      }
+    },
+    {
+      "path": "pages/address/edit",
+      "style": {
+        "navigationBarTitleText": "编辑地址",
+        "navigationBarBackgroundColor": "#E8FAFC"
+      }
+    }
+  ],
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "订餐小程序",
+    "navigationBarBackgroundColor": "#E8FAFC",
+    "backgroundColor": "#F5F7FA"
+  },
+  "tabBar": {
+    "color": "#666666",
+    "selectedColor": "#00BCD4",
+    "borderStyle": "white",
+    "backgroundColor": "#ffffff",
+    "list": [
+      {
+        "pagePath": "pages/meal/index",
+        "iconPath": "static/tabbar/meal.png",
+        "selectedIconPath": "static/tabbar/meal-active.png",
+        "text": "订餐"
+      },
+      {
+        "pagePath": "pages/order/index",
+        "iconPath": "static/tabbar/order.png",
+        "selectedIconPath": "static/tabbar/order-active.png",
+        "text": "订单"
+      },
+      {
+        "pagePath": "pages/profile/index",
+        "iconPath": "static/tabbar/profile.png",
+        "selectedIconPath": "static/tabbar/profile-active.png",
+        "text": "我的"
+      }
+    ]
+  },
+  "subPackages": [
+    {
+      "root": "package-views",
+      "name": "package-views",
+      "pages": [
+        {
+          "path": "pages/meal/menu",
+          "style": {
+            "navigationBarTitleText": "选择菜品",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/meal/restaurant-select",
+          "style": {
+            "navigationBarTitleText": "选择服务区域",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/meal/detail",
+          "style": {
+            "navigationBarTitleText": "菜品详情",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/meal/checkout",
+          "style": {
+            "navigationBarTitleText": "确认订单",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/order/detail",
+          "style": {
+            "navigationBarTitleText": "订单详情",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/order/success",
+          "style": {
+            "navigationBarTitleText": "下单成功",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/company/select",
+          "style": {
+            "navigationBarTitleText": "选择企业",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/company/apply",
+          "style": {
+            "navigationBarTitleText": "申请加入企业",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/company/applications",
+          "style": {
+            "navigationBarTitleText": "加入申请记录",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/company/benefit",
+          "style": {
+            "navigationBarTitleText": "企业权益",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        },
+        {
+          "path": "pages/login/index",
+          "style": {
+            "navigationBarTitleText": "登录",
+            "navigationBarBackgroundColor": "#E8FAFC"
+          }
+        }
+      ]
+    }
+  ]
+}

+ 189 - 0
src/pages/address/edit.vue

@@ -0,0 +1,189 @@
+<template>
+  <view class="safe-page edit-page">
+    <view class="card form-card">
+      <view class="title">{{ addressId ? '编辑配送地址' : '新增配送地址' }}</view>
+      <view class="field">
+        <view class="label">收货人</view>
+        <input v-model="form.receiverName" class="input" placeholder="请输入收货人姓名" />
+      </view>
+      <view class="field">
+        <view class="label">手机号</view>
+        <view class="phone-row">
+          <input v-model="form.receiverMobile" class="input phone-input" type="number" maxlength="11" placeholder="请输入手机号" />
+          <button class="wx-phone-btn" open-type="getPhoneNumber" :loading="phoneLoading" @getphonenumber="onGetPhoneNumber">获取微信手机号</button>
+        </view>
+      </view>
+      <view class="default-row">
+        <view>
+          <view class="default-title">设为默认地址</view>
+          <view class="muted">下单结算时优先使用默认地址</view>
+        </view>
+        <switch :checked="form.isDefault === 1" color="#00bcd4" @change="onDefaultChange" />
+      </view>
+    </view>
+
+    <view :class="['primary-btn', saving && 'disabled']" @click="saveAddress">{{ saving ? '保存中...' : '保存地址' }}</view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { createAddress, fetchAddressList, updateAddress } from '@/api/modules/address'
+import { getPhoneByCode } from '@/api/modules/memberAuth'
+import { useAuthStore } from '@/store/modules/auth'
+import type { MemberAddressSaveParams } from '@/types/address'
+
+const auth = useAuthStore()
+const addressId = ref('')
+const saving = ref(false)
+const phoneLoading = ref(false)
+const form = reactive<MemberAddressSaveParams>({
+  receiverName: '',
+  receiverMobile: '',
+  province: '',
+  city: '',
+  district: '',
+  detailAddress: '',
+  isDefault: 0
+})
+
+onLoad(query => {
+  addressId.value = typeof query?.id === 'string' ? decodeURIComponent(query.id) : ''
+  if (addressId.value) {
+    loadAddress()
+  } else {
+    if (!form.receiverMobile && auth.userInfo?.phone) {
+      form.receiverMobile = auth.userInfo.phone
+    }
+  }
+})
+
+async function loadAddress() {
+  const res = await fetchAddressList()
+  const item = (res.data || []).find(address => address.id === addressId.value)
+  if (!item) return
+  form.receiverName = item.name || ''
+  form.receiverMobile = item.phone || ''
+  form.province = item.province || ''
+  form.provinceCode = item.provinceCode
+  form.city = item.city || ''
+  form.cityCode = item.cityCode
+  form.district = item.district || ''
+  form.districtCode = item.districtCode
+  form.detailAddress = item.detail || ''
+  form.isDefault = item.isDefault ? 1 : 0
+}
+
+function onDefaultChange(event: Event) {
+  form.isDefault = (event as unknown as { detail: { value: boolean } }).detail.value ? 1 : 0
+}
+
+async function onGetPhoneNumber(event: { detail: { errMsg: string; code?: string } }) {
+  if (event.detail.errMsg !== 'getPhoneNumber:ok') return
+  const phoneCode = event.detail.code
+  if (!phoneCode) {
+    uni.showToast({ title: '获取手机号失败', icon: 'none' })
+    return
+  }
+  phoneLoading.value = true
+  try {
+    const res = await getPhoneByCode(phoneCode)
+    if (res.data) {
+      form.receiverMobile = res.data
+      uni.showToast({ title: '已获取手机号', icon: 'none' })
+    }
+  } catch {
+    uni.showToast({ title: '获取手机号失败,请手动输入', icon: 'none' })
+  } finally {
+    phoneLoading.value = false
+  }
+}
+
+function validate() {
+  if (!form.receiverName.trim()) return '请输入收货人姓名'
+  if (!/^1\d{10}$/.test(form.receiverMobile)) return '请输入正确手机号'
+  return ''
+}
+
+async function saveAddress() {
+  if (saving.value) return
+  const message = validate()
+  if (message) {
+    uni.showToast({ title: message, icon: 'none' })
+    return
+  }
+  saving.value = true
+  try {
+    if (addressId.value) {
+      await updateAddress(addressId.value, form)
+    } else {
+      await createAddress(form)
+    }
+    uni.showToast({ title: '保存成功', icon: 'none' })
+    setTimeout(() => uni.navigateBack(), 300)
+  } finally {
+    saving.value = false
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.edit-page {
+  padding-bottom: 40rpx;
+}
+.title {
+  font-size: 34rpx;
+  font-weight: 800;
+  margin-bottom: 24rpx;
+}
+.field {
+  padding: 22rpx 0;
+  border-bottom: 1rpx solid #eef2f7;
+}
+.label {
+  margin-bottom: 14rpx;
+  color: #374151;
+  font-weight: 700;
+  font-size: 28rpx;
+}
+.input {
+  width: 100%;
+  color: #111827;
+  font-size: 30rpx;
+}
+.phone-row {
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+}
+.phone-input {
+  flex: 1;
+  min-width: 0;
+}
+.wx-phone-btn {
+  flex-shrink: 0;
+  padding: 0 20rpx;
+  height: 64rpx;
+  line-height: 64rpx;
+  border-radius: 999rpx;
+  background: #00bcd4;
+  color: #fff;
+  font-size: 24rpx;
+  font-weight: 700;
+}
+.default-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-top: 28rpx;
+}
+.default-title {
+  font-size: 30rpx;
+  font-weight: 700;
+  margin-bottom: 8rpx;
+}
+.disabled {
+  opacity: 0.6;
+}
+</style>

+ 181 - 0
src/pages/address/list.vue

@@ -0,0 +1,181 @@
+<template>
+  <view class="safe-page address-page">
+    <view class="header card">
+      <view>
+        <view class="title">{{ selectMode ? '选择配送地址' : '配送地址' }}</view>
+        <view class="muted">{{ selectMode ? '选择本次订单使用的地址' : '维护下单配送收货信息' }}</view>
+      </view>
+      <view class="add-btn" @click="goEdit()">新增</view>
+    </view>
+
+    <view v-if="addresses.length" class="address-list">
+      <view v-for="item in addresses" :key="item.id" class="card address-card">
+        <view class="address-main" @click="selectOrEdit(item)">
+          <view class="address-head">
+            <text class="name">{{ item.name }}</text>
+            <text class="phone">{{ item.phone }}</text>
+            <text v-if="item.isDefault" class="default-tag">默认</text>
+          </view>
+          <view v-if="fullAddress(item)" class="address-text">{{ fullAddress(item) }}</view>
+        </view>
+        <view class="actions">
+          <view v-if="!item.isDefault" class="action" @click="setDefault(item)">设为默认</view>
+          <view class="action" @click="goEdit(item.id)">编辑</view>
+          <view class="action danger" @click="remove(item)">删除</view>
+        </view>
+      </view>
+    </view>
+
+    <view v-else class="empty card">
+      <view class="empty-title">暂无配送地址</view>
+      <view class="muted">新增地址后,下单时可自动使用默认地址</view>
+      <view class="primary-btn empty-btn" @click="goEdit()">新增配送地址</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import { onLoad, onShow } from '@dcloudio/uni-app'
+import { deleteAddress, fetchAddressList, setDefaultAddress } from '@/api/modules/address'
+import type { MemberAddress } from '@/types/address'
+
+const addresses = ref<MemberAddress[]>([])
+const selectMode = ref(false)
+
+onLoad(query => {
+  selectMode.value = query?.select === '1'
+})
+
+onShow(() => {
+  loadAddresses()
+})
+
+async function loadAddresses() {
+  const res = await fetchAddressList()
+  addresses.value = res.data || []
+}
+
+function fullAddress(item: MemberAddress) {
+  const parts = [item.province, item.city, item.district, item.detail].filter(Boolean)
+  return parts.join('')
+}
+
+function selectOrEdit(item: MemberAddress) {
+  if (selectMode.value) {
+    uni.setStorageSync('meal_selected_address', item)
+    uni.navigateBack()
+    return
+  }
+  goEdit(item.id)
+}
+
+function goEdit(id?: string) {
+  const url = id ? `/pages/address/edit?id=${encodeURIComponent(id)}` : '/pages/address/edit'
+  uni.navigateTo({ url })
+}
+
+async function setDefault(item: MemberAddress) {
+  await setDefaultAddress(item.id)
+  uni.showToast({ title: '已设为默认', icon: 'none' })
+  await loadAddresses()
+}
+
+function remove(item: MemberAddress) {
+  uni.showModal({
+    title: '删除地址',
+    content: '确定删除该配送地址吗?',
+    success: async res => {
+      if (!res.confirm) return
+      await deleteAddress(item.id)
+      const selected = uni.getStorageSync('meal_selected_address') as MemberAddress | undefined
+      if (selected?.id === item.id) uni.removeStorageSync('meal_selected_address')
+      uni.showToast({ title: '已删除', icon: 'none' })
+      await loadAddresses()
+    }
+  })
+}
+</script>
+
+<style scoped lang="scss">
+.address-page {
+  padding-bottom: 40rpx;
+}
+.header,
+.address-head,
+.actions {
+  display: flex;
+  align-items: center;
+}
+.header {
+  justify-content: space-between;
+}
+.title {
+  font-size: 34rpx;
+  font-weight: 800;
+  margin-bottom: 10rpx;
+}
+.add-btn {
+  padding: 14rpx 26rpx;
+  border-radius: 999rpx;
+  color: #fff;
+  background: #00bcd4;
+  font-size: 26rpx;
+}
+.address-card {
+  margin-top: 20rpx;
+}
+.address-main {
+  padding-bottom: 20rpx;
+}
+.address-head {
+  gap: 16rpx;
+  margin-bottom: 14rpx;
+}
+.name {
+  font-size: 32rpx;
+  font-weight: 800;
+}
+.phone {
+  color: #5f6b7a;
+  font-size: 28rpx;
+}
+.default-tag {
+  padding: 4rpx 12rpx;
+  border-radius: 999rpx;
+  color: #00a6bd;
+  background: #e8fbff;
+  font-size: 22rpx;
+}
+.address-text {
+  color: #1f2937;
+  line-height: 1.5;
+  font-size: 28rpx;
+}
+.actions {
+  justify-content: flex-end;
+  gap: 28rpx;
+  border-top: 1rpx solid #eef2f7;
+  padding-top: 18rpx;
+}
+.action {
+  color: #00a6bd;
+  font-size: 26rpx;
+}
+.danger {
+  color: #ef4444;
+}
+.empty {
+  text-align: center;
+  padding: 80rpx 32rpx;
+  margin-top: 24rpx;
+}
+.empty-title {
+  font-size: 32rpx;
+  font-weight: 800;
+  margin-bottom: 12rpx;
+}
+.empty-btn {
+  margin-top: 36rpx;
+}
+</style>

+ 442 - 0
src/pages/meal/index.vue

@@ -0,0 +1,442 @@
+<template>
+  <view class="safe-page home">
+    <swiper v-if="banners.length" class="banner-swiper" circular autoplay indicator-dots indicator-color="rgba(255,255,255,.45)" indicator-active-color="#fff">
+      <swiper-item v-for="banner in banners" :key="banner.id || banner.imageUrl || banner.title">
+        <view class="banner-item" @click="openBanner(banner)">
+          <image class="banner-img" :src="bannerImage(banner)" mode="aspectFill" />
+          <view v-if="banner.title" class="banner-title">{{ banner.title }}</view>
+        </view>
+      </swiper-item>
+    </swiper>
+
+    <view class="hero">
+      <view>
+        <view class="title">在线订餐</view>
+        <view class="sub">个人点餐、企业补贴、员工补差一站完成</view>
+      </view>
+      <view class="hero-badge">今日可订</view>
+    </view>
+
+    <view class="card area-card" @click="goServiceAreaSelect">
+      <view>
+        <view class="area-label">当前服务区域</view>
+        <view class="area-name">{{ meal.currentServiceArea?.name || '请选择服务区域' }}</view>
+        <view class="muted">{{ areaLocation }}</view>
+      </view>
+      <view class="switch-btn">切换区域</view>
+    </view>
+
+    <view class="grid">
+      <view class="card entry entry-personal" @click="goMeal('personal')">
+        <view class="entry-label">个人订餐</view>
+        <view class="entry-title">自主选菜在线支付</view>
+        <view class="muted">按餐别查看今日菜单</view>
+      </view>
+      <view class="card entry entry-company" @click="goCompany">
+        <view class="entry-label">企业团餐</view>
+        <view class="entry-title">企业承担员工补差</view>
+        <view class="muted">登录后查看企业权益</view>
+      </view>
+    </view>
+
+    <view v-if="recommendDishes.length" class="section">
+      <view class="section-head">
+        <view>
+          <view class="section-title">推荐菜品</view>
+          <view class="section-sub">来自当前服务区域可订菜单</view>
+        </view>
+        <view class="section-more" @click="goMeal('personal')">去订餐</view>
+      </view>
+      <scroll-view scroll-x class="dish-scroll" :show-scrollbar="false">
+        <view class="dish-row">
+          <view v-for="dish in recommendDishes" :key="dish.id" class="dish-card" @click="goMeal('personal')">
+            <image v-if="dish.itemImage" class="dish-img" :src="dish.itemImage" mode="aspectFill" />
+            <view v-else class="dish-img dish-img-empty">订餐</view>
+            <view class="dish-name">{{ dish.itemName }}</view>
+            <view class="dish-price">¥{{ formatMoney(dish.salePrice) }}</view>
+          </view>
+        </view>
+      </scroll-view>
+    </view>
+
+    <view v-if="hotDishes.length" class="section">
+      <view class="section-head">
+        <view>
+          <view class="section-title">热门菜品</view>
+          <view class="section-sub">大家常点,优先推荐</view>
+        </view>
+      </view>
+      <view class="hot-list">
+        <view v-for="dish in hotDishes" :key="dish.id" class="hot-item" @click="goMeal('personal')">
+          <image v-if="dish.itemImage" class="hot-img" :src="dish.itemImage" mode="aspectFill" />
+          <view v-else class="hot-img hot-img-empty">热</view>
+          <view class="hot-main">
+            <view class="hot-name">{{ dish.itemName }}</view>
+            <view class="muted">已售 {{ dish.soldQuantity || 0 }}</view>
+          </view>
+          <view class="dish-price">¥{{ formatMoney(dish.salePrice) }}</view>
+        </view>
+      </view>
+    </view>
+
+    <view class="card tip">
+      <view class="entry-title">订餐说明</view>
+      <view class="muted">菜单和订餐截止时间以后端配置为准,下单金额以后端结算结果为准。</view>
+    </view>
+
+    <view v-if="!loggedIn" class="login-banner">
+      <view>
+        <view class="login-title">登录后可下单</view>
+        <view class="login-sub">查看订单和企业权益</view>
+      </view>
+      <view class="login-btn" @click="goLogin">去登录</view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onShow } from '@dcloudio/uni-app'
+import { computed, ref } from 'vue'
+import { fetchHomeBanners, type MiniHomeBannerItem } from '@/api/modules/homeBanners'
+import { fetchMealDates, fetchMealHotItems, fetchMealMenu, fetchMealServiceAreas, fetchMealTypes } from '@/api/modules/meal'
+import type { FoodMealHotItem, FoodMealMenuItem } from '@/types/meal'
+import { isLoggedIn, requireLoginNavigate } from '@/utils/auth'
+import { formatMoney } from '@/utils/money'
+import { useMealStore } from '@/store/modules/meal'
+
+const defaultBanners: MiniHomeBannerItem[] = [
+  {
+    id: 'meal-default-banner',
+    title: '杏花村智慧订餐',
+    imageUrl: 'https://trae-api-cn.mchost.guru/api/ide/v1/text_to_image?prompt=realistic%20Chinese%20restaurant%20table%20with%20fresh%20local%20dishes%2C%20warm%20morning%20light%2C%20clean%20modern%20food%20ordering%20mini%20program%20banner%2C%20appetizing%2C%20high%20quality%20commercial%20photography&image_size=landscape_16_9'
+  }
+]
+
+const meal = useMealStore()
+const banners = ref<MiniHomeBannerItem[]>(defaultBanners)
+const menuItems = ref<FoodMealMenuItem[]>([])
+const hotItems = ref<FoodMealHotItem[]>([])
+const loggedIn = ref(false)
+
+const recommendDishes = computed(() => menuItems.value.filter(item => item.itemImage).slice(0, 6))
+const hotDishes = computed(() => hotItems.value.slice(0, 5))
+const areaLocation = computed(() => meal.currentServiceArea?.floorLabel || meal.currentServiceArea?.locationLabel || meal.currentServiceArea?.address || '请选择后查看该区域菜单')
+
+onShow(async () => {
+  loggedIn.value = isLoggedIn()
+  await loadBanners()
+  await loadServiceAreas()
+  await loadHotDishes()
+  await loadMenuPreview()
+})
+
+async function loadBanners() {
+  try {
+    const res = await fetchHomeBanners()
+    const remoteBanners = (res.data || []).filter(item => Boolean(bannerImage(item)))
+    banners.value = remoteBanners.length ? remoteBanners : defaultBanners
+  } catch {
+    banners.value = defaultBanners
+  }
+}
+
+async function loadServiceAreas() {
+  try {
+    const res = await fetchMealServiceAreas()
+    meal.setServiceAreas(res.data || [])
+  } catch {
+    meal.setServiceAreas([])
+  }
+}
+
+async function loadHotDishes() {
+  try {
+    const serviceAreaId = meal.currentServiceAreaId
+    const res = await fetchMealHotItems({ serviceAreaId, limit: 5 })
+    hotItems.value = res.data || []
+  } catch {
+    hotItems.value = []
+  }
+}
+
+async function loadMenuPreview() {
+  try {
+    const serviceAreaId = meal.currentServiceAreaId
+    const dates = await fetchMealDates(serviceAreaId)
+    const mealDate = dates.data?.[0]
+    if (!mealDate) {
+      menuItems.value = []
+      return
+    }
+    const types = await fetchMealTypes({ serviceAreaId, mealDate })
+    const mealType = types.data?.[0]?.value
+    if (!mealType) {
+      menuItems.value = []
+      return
+    }
+    const menu = await fetchMealMenu({ serviceAreaId, mealDate, mealType })
+    menuItems.value = menu.data?.items || []
+  } catch {
+    menuItems.value = []
+  }
+}
+
+function bannerImage(banner: MiniHomeBannerItem) {
+  return banner.imageUrl || banner.image || banner.picUrl || ''
+}
+
+function openBanner(banner: MiniHomeBannerItem) {
+  if (!banner.linkUrl) return
+  if (banner.linkUrl.startsWith('/pages/')) {
+    uni.switchTab({ url: banner.linkUrl })
+    return
+  }
+  if (banner.linkUrl.startsWith('/package-views/')) {
+    uni.navigateTo({ url: banner.linkUrl })
+  }
+}
+
+function goServiceAreaSelect() {
+  uni.navigateTo({ url: '/package-views/pages/meal/restaurant-select?from=home' })
+}
+
+function goMeal(mode: 'personal' | 'company') {
+  uni.navigateTo({ url: `/package-views/pages/meal/menu?mode=${mode}` })
+}
+
+function goCompany() {
+  if (!requireLoginNavigate('/package-views/pages/company/select')) return
+  uni.navigateTo({ url: '/package-views/pages/company/select' })
+}
+
+function goLogin() {
+  requireLoginNavigate('/pages/meal/index')
+}
+</script>
+
+<style scoped lang="scss">
+.home {
+  padding-bottom: 150rpx;
+}
+.banner-swiper {
+  height: 300rpx;
+  border-radius: 28rpx;
+  overflow: hidden;
+  margin-bottom: 24rpx;
+}
+.banner-item,
+.banner-img {
+  width: 100%;
+  height: 100%;
+}
+.banner-title {
+  position: absolute;
+  left: 28rpx;
+  right: 28rpx;
+  bottom: 28rpx;
+  color: #fff;
+  font-size: 34rpx;
+  font-weight: 700;
+  text-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.28);
+}
+.hero {
+  padding: 42rpx 32rpx;
+  border-radius: 28rpx;
+  background: linear-gradient(135deg, #00bcd4, #26c6da);
+  color: #fff;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.title {
+  font-size: 46rpx;
+  font-weight: 700;
+}
+.sub {
+  margin-top: 14rpx;
+  opacity: 0.9;
+}
+.hero-badge {
+  padding: 12rpx 20rpx;
+  border-radius: 999rpx;
+  background: rgba(255, 255, 255, 0.2);
+  font-size: 24rpx;
+}
+.area-card {
+  margin-top: 24rpx;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 20rpx;
+}
+.area-label {
+  color: #00838f;
+  font-size: 24rpx;
+  margin-bottom: 8rpx;
+}
+.area-name {
+  color: #0f172a;
+  font-size: 32rpx;
+  font-weight: 800;
+  margin-bottom: 8rpx;
+}
+.switch-btn {
+  flex-shrink: 0;
+  padding: 12rpx 20rpx;
+  border-radius: 999rpx;
+  color: #fff;
+  background: #f97316;
+  font-size: 24rpx;
+  font-weight: 700;
+}
+.grid {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 20rpx;
+  margin-top: 24rpx;
+}
+.entry {
+  min-height: 168rpx;
+  color: #0f172a;
+}
+.entry-label {
+  font-size: 24rpx;
+  color: #00838f;
+  margin-bottom: 12rpx;
+}
+.entry-title {
+  font-size: 32rpx;
+  font-weight: 700;
+  margin-bottom: 14rpx;
+}
+.entry-personal {
+  background: linear-gradient(180deg, #fff, #e0f7fa);
+}
+.entry-company {
+  background: linear-gradient(180deg, #fff, #fff7ed);
+}
+.section {
+  margin-top: 28rpx;
+}
+.section-head {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 18rpx;
+}
+.section-title {
+  font-size: 34rpx;
+  font-weight: 700;
+}
+.section-sub,
+.section-more {
+  margin-top: 6rpx;
+  font-size: 24rpx;
+  color: #8a94a6;
+}
+.section-more {
+  color: #00838f;
+}
+.dish-scroll {
+  width: 100%;
+  white-space: nowrap;
+}
+.dish-row {
+  display: inline-flex;
+  gap: 18rpx;
+}
+.dish-card {
+  width: 220rpx;
+  padding: 16rpx;
+  border-radius: 24rpx;
+  background: #fff;
+  box-shadow: 0 12rpx 28rpx rgba(15, 23, 42, 0.06);
+}
+.dish-img {
+  width: 100%;
+  height: 150rpx;
+  border-radius: 18rpx;
+  background: #e0f7fa;
+}
+.dish-img-empty,
+.hot-img-empty {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #00838f;
+  font-weight: 700;
+}
+.dish-name {
+  margin-top: 14rpx;
+  font-weight: 700;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.dish-price {
+  margin-top: 8rpx;
+  color: #ef4444;
+  font-weight: 700;
+}
+.hot-list {
+  display: flex;
+  flex-direction: column;
+  gap: 16rpx;
+}
+.hot-item {
+  display: flex;
+  align-items: center;
+  gap: 18rpx;
+  padding: 18rpx;
+  border-radius: 24rpx;
+  background: #fff;
+}
+.hot-img {
+  width: 104rpx;
+  height: 104rpx;
+  border-radius: 18rpx;
+  background: #e0f7fa;
+  flex-shrink: 0;
+}
+.hot-main {
+  flex: 1;
+  min-width: 0;
+}
+.hot-name {
+  font-weight: 700;
+  margin-bottom: 8rpx;
+}
+.tip {
+  margin-top: 24rpx;
+}
+.login-banner {
+  position: fixed;
+  left: 24rpx;
+  right: 24rpx;
+  bottom: 28rpx;
+  padding: 20rpx 24rpx;
+  border-radius: 24rpx;
+  background: #111827;
+  color: #fff;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  box-shadow: 0 10rpx 30rpx rgba(15, 23, 42, 0.18);
+}
+.login-title {
+  font-size: 28rpx;
+  font-weight: 800;
+}
+.login-sub {
+  margin-top: 6rpx;
+  color: rgba(255, 255, 255, 0.72);
+  font-size: 23rpx;
+}
+.login-btn {
+  padding: 12rpx 24rpx;
+  border-radius: 999rpx;
+  color: #111827;
+  background: #fff;
+  font-weight: 700;
+}
+</style>

+ 327 - 0
src/pages/order/index.vue

@@ -0,0 +1,327 @@
+<template>
+  <view class="safe-page order-page">
+    <view class="tabs card">
+      <view v-for="tab in tabs" :key="tab.value" :class="['tab', scope === tab.value && 'active']" @click="switchScope(tab.value)">
+        {{ tab.label }}
+      </view>
+    </view>
+
+    <view v-if="loading" class="state card">订单加载中...</view>
+    <view v-else-if="!orders.length" class="card empty-card">
+      <EmptyState title="暂无订单" description="去订一份喜欢的餐吧" />
+      <view class="primary-btn empty-action" @click="goMeal">去订餐</view>
+    </view>
+    <view v-else class="order-list">
+      <view v-for="order in orders" :key="`${order.bizType}-${order.id}`" class="card order-card" @click="goDetail(order)">
+        <view class="order-head">
+          <view>
+            <view class="restaurant">{{ merchantName(order) }}</view>
+            <view class="muted small">{{ bizTypeLabel(order.bizType) }} · {{ order.createTime || order.createDate || '' }}</view>
+          </view>
+          <view class="status-tag" :class="order.status">{{ statusLabel(order) }}</view>
+        </view>
+
+        <view class="goods-list">
+          <view v-for="goods in orderGoods(order).slice(0, 3)" :key="goods.id || goods.spuId || goods.name" class="goods-row">
+            <view class="goods-main">
+              <view class="goods-name">{{ goods.name || goods.title || '订餐商品' }}</view>
+              <view v-if="goods.specText" class="muted tiny">{{ goods.specText }}</view>
+            </view>
+            <view class="muted">×{{ goods.quantity || 1 }}</view>
+            <view class="goods-price">¥{{ formatMoney(goods.price || 0) }}</view>
+          </view>
+        </view>
+
+        <view class="order-foot">
+          <text class="muted">{{ order.orderNo || order.unifiedOrderId || order.id }}</text>
+          <view class="amount">合计 ¥{{ formatMoney(order.payAmount || order.totalAmount || 0) }}</view>
+        </view>
+
+        <view v-if="canOperate(order)" class="actions" @click.stop>
+          <view v-if="order.status === 'pending_pay'" class="mini-action cancel" @click="cancelOrder(order)">取消订单</view>
+          <view v-if="order.status === 'pending_pay'" class="mini-action pay" @click="continueOrder(order)">{{ order.bizType === 'companyMeal' ? '去补差' : '去支付' }}</view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { onPullDownRefresh, onShow } from '@dcloudio/uni-app'
+import { ref } from 'vue'
+import EmptyState from '@/components/EmptyState.vue'
+import { getUnifiedTradeOrderList } from '@/api/modules/order'
+import type { OrderBizType, OrderGoods, OrderInfo, OrderMerchant } from '@/types/order'
+import { formatMoney } from '@/utils/money'
+import { requireLoginNavigate } from '@/utils/auth'
+import { invokeMealUnifiedOrderWechatPay } from '@/utils/unifiedOrderWechatPay'
+import { cancelMealUnifiedOrder } from '@/utils/orderCancelActions'
+
+type OrderScope = 'all' | OrderBizType
+
+const tabs: Array<{ label: string; value: OrderScope }> = [
+  { label: '全部', value: 'all' },
+  { label: '个人订餐', value: 'foodMeal' },
+  { label: '企业团餐', value: 'companyMeal' }
+]
+
+const scope = ref<OrderScope>('all')
+const orders = ref<OrderInfo[]>([])
+const loading = ref(false)
+const operating = ref(false)
+
+onShow(loadOrders)
+onPullDownRefresh(async () => {
+  try {
+    await loadOrders()
+  } finally {
+    uni.stopPullDownRefresh()
+  }
+})
+
+function switchScope(next: OrderScope) {
+  if (scope.value === next) return
+  scope.value = next
+  orders.value = []
+  loadOrders()
+}
+
+async function loadOrders() {
+  if (!requireLoginNavigate('/pages/order/index')) return
+  loading.value = true
+  try {
+    if (scope.value === 'all') {
+      const [personal, company] = await Promise.all([
+        getUnifiedTradeOrderList({ bizType: 'foodMeal', pageNo: 1, pageSize: 30 }),
+        getUnifiedTradeOrderList({ bizType: 'companyMeal', pageNo: 1, pageSize: 30 })
+      ])
+      orders.value = [
+        ...(personal.data?.records || []),
+        ...(company.data?.records || [])
+      ].sort(compareOrderTime)
+      return
+    }
+    const res = await getUnifiedTradeOrderList({ bizType: scope.value, pageNo: 1, pageSize: 30 })
+    orders.value = res.data?.records || []
+  } finally {
+    loading.value = false
+  }
+}
+
+function compareOrderTime(a: OrderInfo, b: OrderInfo) {
+  return timeValue(b) - timeValue(a)
+}
+
+function timeValue(order: OrderInfo) {
+  const time = order.createTime || order.createDate || ''
+  return time ? new Date(time.replace(/-/g, '/')).getTime() : 0
+}
+
+function merchants(order: OrderInfo): OrderMerchant[] {
+  if (!order.merchants) return []
+  return Array.isArray(order.merchants) ? order.merchants : [order.merchants]
+}
+
+function firstMerchant(order: OrderInfo) {
+  return merchants(order)[0]
+}
+
+function merchantName(order: OrderInfo) {
+  const merchant = firstMerchant(order)
+  return order.serviceArea?.name || order.serviceAreaName || merchant?.serviceArea?.name || merchant?.serviceAreaName || order.restaurant?.name || order.restaurantName || merchant?.merchantName || merchant?.name || merchant?.title || order.title || bizTypeLabel(order.bizType)
+}
+
+function orderGoods(order: OrderInfo): OrderGoods[] {
+  const merchant = firstMerchant(order)
+  return merchant?.products || merchant?.goods || []
+}
+
+function bizTypeLabel(bizType: OrderBizType) {
+  return bizType === 'companyMeal' ? '企业团餐' : '个人订餐'
+}
+
+function statusLabel(order: OrderInfo) {
+  if (order.statusText) return order.statusText
+  if (order.status === 'pending_pay') return order.bizType === 'companyMeal' ? '待补差' : '待付款'
+  if (order.status === 'pending_ship') return '待取餐'
+  if (order.status === 'completed') return '已完成'
+  if (order.status === 'cancelled') return '已取消'
+  if (order.status === 'refunding' || order.status === 'pending_receive') return '退款中'
+  if (order.status === 'refunded') return '已退款'
+  return '处理中'
+}
+
+function canOperate(order: OrderInfo) {
+  return order.status === 'pending_pay'
+}
+
+async function continueOrder(order: OrderInfo) {
+  if (operating.value) return
+  operating.value = true
+  try {
+    await invokeMealUnifiedOrderWechatPay(order)
+    uni.showToast({ title: '支付完成', icon: 'none' })
+    await loadOrders()
+  } catch {
+    uni.showToast({ title: '支付未完成,可稍后继续处理', icon: 'none' })
+  } finally {
+    operating.value = false
+  }
+}
+
+async function cancelOrder(order: OrderInfo) {
+  if (operating.value) return
+  const confirmed = await new Promise<boolean>(resolve => {
+    uni.showModal({
+      title: '取消订单',
+      content: '确认取消该订单吗?',
+      confirmText: '确认取消',
+      cancelText: '再想想',
+      success: res => resolve(res.confirm),
+      fail: () => resolve(false)
+    })
+  })
+  if (!confirmed) return
+  operating.value = true
+  try {
+    await cancelMealUnifiedOrder(order)
+    uni.showToast({ title: '订单已取消', icon: 'none' })
+    await loadOrders()
+  } finally {
+    operating.value = false
+  }
+}
+
+function goDetail(order: OrderInfo) {
+  const mode = order.bizType === 'companyMeal' ? 'company' : 'personal'
+  uni.navigateTo({ url: `/package-views/pages/order/detail?mode=${mode}&orderId=${encodeURIComponent(order.id)}` })
+}
+
+function goMeal() {
+  uni.switchTab({ url: '/pages/meal/index' })
+}
+</script>
+
+<style scoped lang="scss">
+.order-page {
+  padding-bottom: 40rpx;
+}
+.tabs {
+  display: flex;
+  padding: 8rpx;
+  gap: 8rpx;
+}
+.tab {
+  flex: 1;
+  text-align: center;
+  padding: 20rpx 0;
+  border-radius: 16rpx;
+  color: #64748b;
+}
+.active {
+  background: #e0f7fa;
+  color: #00838f;
+  font-weight: 700;
+}
+.state {
+  margin-top: 20rpx;
+  text-align: center;
+  color: #8a94a6;
+}
+.empty-card {
+  margin-top: 20rpx;
+}
+.empty-action {
+  margin-top: 8rpx;
+}
+.order-list {
+  display: flex;
+  flex-direction: column;
+  gap: 20rpx;
+  margin-top: 20rpx;
+}
+.order-head,
+.order-foot,
+.goods-row,
+.actions {
+  display: flex;
+  align-items: center;
+  gap: 20rpx;
+}
+.order-head,
+.order-foot {
+  justify-content: space-between;
+}
+.restaurant {
+  font-size: 32rpx;
+  font-weight: 700;
+}
+.small {
+  margin-top: 8rpx;
+  font-size: 24rpx;
+}
+.status-tag {
+  flex-shrink: 0;
+  padding: 8rpx 18rpx;
+  border-radius: 999rpx;
+  background: #e0f7fa;
+  color: #00838f;
+  font-size: 24rpx;
+}
+.status-tag.cancelled,
+.status-tag.completed,
+.status-tag.refunded {
+  background: #f3f4f6;
+  color: #6b7280;
+}
+.status-tag.pending_receive,
+.status-tag.refunding {
+  background: #fff7ed;
+  color: #ea580c;
+}
+.goods-list {
+  margin: 22rpx 0;
+  padding: 18rpx;
+  border-radius: 20rpx;
+  background: #f8fafc;
+  display: flex;
+  flex-direction: column;
+  gap: 14rpx;
+}
+.goods-main {
+  flex: 1;
+  min-width: 0;
+}
+.goods-name {
+  font-weight: 600;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.tiny {
+  margin-top: 6rpx;
+  font-size: 22rpx;
+}
+.goods-price,
+.amount {
+  color: #ef4444;
+  font-weight: 700;
+}
+.actions {
+  justify-content: flex-end;
+  margin-top: 22rpx;
+}
+.mini-action {
+  padding: 12rpx 24rpx;
+  border-radius: 999rpx;
+  font-size: 24rpx;
+}
+.cancel {
+  background: #f3f4f6;
+  color: #64748b;
+}
+.pay {
+  background: #e0f7fa;
+  color: #00838f;
+}
+</style>

+ 385 - 0
src/pages/profile/index.vue

@@ -0,0 +1,385 @@
+<template>
+  <scroll-view scroll-y class="profile-page" :show-scrollbar="false" enable-back-to-top>
+    <view class="profile-hero">
+      <view class="hero-head">
+        <view>
+          <view class="hero-title">我的</view>
+          <view class="hero-sub">订餐 · 订单 · 企业服务</view>
+        </view>
+        <view class="hero-chip" @click="goMeal">去订餐</view>
+      </view>
+
+      <view class="user-row" @click="onUserBlock">
+        <view class="avatar">{{ avatarText }}</view>
+        <view class="user-main">
+          <view class="name">{{ displayName }}</view>
+          <view class="user-tip">{{ profileTip }}</view>
+        </view>
+      </view>
+
+      <view class="stats">
+        <view class="stat" @click="goOrders">
+          <view class="stat-value">{{ stats.total }}</view>
+          <view class="stat-label">全部订单</view>
+        </view>
+        <view class="stat" @click="goOrders">
+          <view class="stat-value">{{ stats.pendingPay }}</view>
+          <view class="stat-label">待付款</view>
+        </view>
+        <view class="stat" @click="goOrders">
+          <view class="stat-value">{{ stats.company }}</view>
+          <view class="stat-label">企业团餐</view>
+        </view>
+      </view>
+    </view>
+
+    <view v-if="!auth.loggedIn" class="login-card card">
+      <view>
+        <view class="section-title">登录后使用完整订餐服务</view>
+        <view class="muted">查看订单、企业权益和补差支付进度</view>
+      </view>
+      <view class="login-btn" @click="goLogin">去登录</view>
+    </view>
+
+    <view class="section card">
+      <view class="section-title">我的服务</view>
+      <view class="service-grid">
+        <view v-for="item in serviceItems" :key="item.label" class="service-item" @click="openService(item.path, item.needLogin)">
+          <view class="service-icon">{{ item.icon }}</view>
+          <view class="service-label">{{ item.label }}</view>
+          <view class="service-sub">{{ item.sub }}</view>
+        </view>
+      </view>
+    </view>
+
+    <view class="section card">
+      <view class="section-title">常用功能</view>
+      <view class="list-row" @click="goOrders">
+        <text>我的订单</text>
+        <text class="arrow">›</text>
+      </view>
+      <view class="list-row" @click="goCompany">
+        <text>我的企业</text>
+        <text class="arrow">›</text>
+      </view>
+      <view class="list-row" @click="goApplications">
+        <text>加入申请记录</text>
+        <text class="arrow">›</text>
+      </view>
+      <view class="list-row" @click="goAddress">
+        <text>配送地址</text>
+        <text class="arrow">›</text>
+      </view>
+      <view class="list-row" @click="showMealTips">
+        <text>订餐说明</text>
+        <text class="arrow">›</text>
+      </view>
+      <view v-if="auth.loggedIn" class="list-row danger" @click="logout">
+        <text>退出登录</text>
+        <text class="arrow">›</text>
+      </view>
+    </view>
+
+    <view class="bottom-space" />
+  </scroll-view>
+</template>
+
+<script setup lang="ts">
+import { computed, reactive, ref } from 'vue'
+import { onShow } from '@dcloudio/uni-app'
+import { useAuthStore } from '@/store/modules/auth'
+import { useCompanyStore } from '@/store/modules/company'
+import { ROUTE_LOGIN_INDEX } from '@/constants/routes'
+import { getUnifiedTradeOrderList } from '@/api/modules/order'
+import { fetchMyCompanies } from '@/api/modules/companyMeal'
+import type { OrderInfo } from '@/types/order'
+
+const auth = useAuthStore()
+const company = useCompanyStore()
+const stats = reactive({ total: 0, pendingPay: 0, company: 0 })
+const companyLoading = ref(false)
+const hasCompany = computed(() => company.companies.length > 0)
+
+const serviceItems = computed(() => [
+  { icon: '餐', label: '个人订餐', sub: '今日菜单', path: '/pages/meal/index', needLogin: false },
+  hasCompany.value
+    ? { icon: '企', label: '企业团餐', sub: '补贴权益', path: '/package-views/pages/company/select', needLogin: true }
+    : { icon: '申', label: '申请加入企业', sub: companyLoading.value ? '加载中' : '等待审核', path: '/package-views/pages/company/apply', needLogin: true },
+  { icon: '单', label: '我的订单', sub: '支付取餐', path: '/pages/order/index', needLogin: true },
+  { icon: '址', label: '配送地址', sub: '默认地址', path: '/pages/address/list', needLogin: true }
+])
+const tabBarPages = ['/pages/meal/index', '/pages/order/index', '/pages/profile/index']
+
+const displayName = computed(() => (auth.loggedIn ? auth.userInfo?.nickname || '已登录用户' : '点击登录'))
+const avatarText = computed(() => auth.userInfo?.nickname?.slice(0, 1) || '我')
+const profileTip = computed(() => {
+  if (!auth.loggedIn) return '登录后可下单和查看订单'
+  return auth.userInfo?.phone || '欢迎使用订餐小程序'
+})
+
+onShow(async () => {
+  auth.initAuth()
+  if (auth.loggedIn) await loadCompanies()
+  else company.setCompanies([])
+  loadStats()
+})
+
+async function loadCompanies() {
+  companyLoading.value = true
+  try {
+    const res = await fetchMyCompanies()
+    company.setCompanies(res.data || [])
+  } catch {
+    company.setCompanies([])
+  } finally {
+    companyLoading.value = false
+  }
+}
+
+async function loadStats() {
+  stats.total = 0
+  stats.pendingPay = 0
+  stats.company = 0
+  if (!auth.loggedIn) return
+  try {
+    const [personal, company] = await Promise.all([
+      getUnifiedTradeOrderList({ bizType: 'foodMeal', pageNo: 1, pageSize: 50 }, { showLoading: false }),
+      getUnifiedTradeOrderList({ bizType: 'companyMeal', pageNo: 1, pageSize: 50 }, { showLoading: false })
+    ])
+    const personalOrders = personal.data || []
+    const companyOrders = company.data || []
+    const allOrders: OrderInfo[] = [...personalOrders, ...companyOrders]
+    stats.total = allOrders.length
+    stats.pendingPay = allOrders.filter(order => order.status === 'pending_pay').length
+    stats.company = companyOrders.length
+  } catch {
+    stats.total = 0
+    stats.pendingPay = 0
+    stats.company = 0
+  }
+}
+
+function onUserBlock() {
+  if (!auth.loggedIn) goLogin()
+}
+
+function goLogin() {
+  uni.navigateTo({ url: `${ROUTE_LOGIN_INDEX}?redirect=%2Fpages%2Fprofile%2Findex` })
+}
+
+function requireLogin() {
+  if (auth.loggedIn) return true
+  goLogin()
+  return false
+}
+
+function goOrders() {
+  if (!requireLogin()) return
+  uni.switchTab({ url: '/pages/order/index' })
+}
+
+function goMeal() {
+  uni.switchTab({ url: '/pages/meal/index' })
+}
+
+function goCompany() {
+  if (!requireLogin()) return
+  uni.navigateTo({ url: hasCompany.value ? '/package-views/pages/company/select' : '/package-views/pages/company/apply' })
+}
+
+function goApplications() {
+  if (!requireLogin()) return
+  uni.navigateTo({ url: '/package-views/pages/company/applications' })
+}
+
+function goAddress() {
+  if (!requireLogin()) return
+  uni.navigateTo({ url: '/pages/address/list' })
+}
+
+function openService(path: string, needLogin: boolean) {
+  if (needLogin && !requireLogin()) return
+  if (tabBarPages.includes(path)) {
+    uni.switchTab({ url: path })
+    return
+  }
+  uni.navigateTo({ url: path })
+}
+
+function showMealTips() {
+  uni.showModal({
+    title: '订餐说明',
+    content: '菜单、库存、订餐截止时间以后端配置为准;个人订餐和企业团餐订单均可在订单页查看处理。',
+    showCancel: false,
+    confirmText: '知道了'
+  })
+}
+
+function logout() {
+  auth.logout()
+  company.setCompanies([])
+  stats.total = 0
+  stats.pendingPay = 0
+  stats.company = 0
+  uni.showToast({ title: '已退出', icon: 'none' })
+}
+</script>
+
+<style scoped lang="scss">
+.profile-page {
+  min-height: 100vh;
+  background: #f6f8fb;
+}
+.profile-hero {
+  position: relative;
+  padding: 48rpx 28rpx 32rpx;
+  color: #fff;
+  background: linear-gradient(135deg, #00acc1, #26c6da 58%, #67e8f9);
+  border-bottom-left-radius: 36rpx;
+  border-bottom-right-radius: 36rpx;
+  overflow: hidden;
+}
+.hero-head,
+.user-row,
+.stats,
+.login-card,
+.list-row {
+  display: flex;
+  align-items: center;
+}
+.hero-head {
+  justify-content: space-between;
+}
+.hero-title {
+  font-size: 42rpx;
+  font-weight: 800;
+}
+.hero-sub {
+  margin-top: 8rpx;
+  opacity: 0.9;
+  font-size: 24rpx;
+}
+.hero-chip,
+.login-btn {
+  padding: 12rpx 22rpx;
+  border-radius: 999rpx;
+  background: rgba(255, 255, 255, 0.22);
+  color: #fff;
+  font-size: 24rpx;
+}
+.user-row {
+  gap: 22rpx;
+  margin-top: 36rpx;
+}
+.avatar {
+  width: 108rpx;
+  height: 108rpx;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.24);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 42rpx;
+  font-weight: 800;
+  border: 4rpx solid rgba(255, 255, 255, 0.4);
+}
+.user-main {
+  flex: 1;
+  min-width: 0;
+}
+.name {
+  font-size: 36rpx;
+  font-weight: 800;
+}
+.user-tip {
+  margin-top: 10rpx;
+  opacity: 0.9;
+  font-size: 24rpx;
+}
+.stats {
+  margin-top: 34rpx;
+  padding: 22rpx 0;
+  border-radius: 28rpx;
+  background: rgba(255, 255, 255, 0.18);
+}
+.stat {
+  flex: 1;
+  text-align: center;
+}
+.stat-value {
+  font-size: 36rpx;
+  font-weight: 800;
+}
+.stat-label {
+  margin-top: 8rpx;
+  font-size: 22rpx;
+  opacity: 0.9;
+}
+.login-card {
+  margin: -18rpx 24rpx 0;
+  position: relative;
+  z-index: 1;
+  justify-content: space-between;
+  gap: 20rpx;
+}
+.login-btn {
+  flex-shrink: 0;
+  background: linear-gradient(135deg, #00bcd4, #26c6da);
+}
+.section {
+  margin: 24rpx 24rpx 0;
+}
+.section-title {
+  font-size: 32rpx;
+  font-weight: 800;
+  margin-bottom: 20rpx;
+}
+.service-grid {
+  display: grid;
+  grid-template-columns: repeat(4, 1fr);
+  gap: 16rpx;
+}
+.service-item {
+  text-align: center;
+}
+.service-icon {
+  width: 72rpx;
+  height: 72rpx;
+  margin: 0 auto 12rpx;
+  border-radius: 24rpx;
+  background: #e0f7fa;
+  color: #00838f;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-weight: 800;
+}
+.service-label {
+  font-size: 24rpx;
+  font-weight: 700;
+}
+.service-sub {
+  margin-top: 6rpx;
+  color: #94a3b8;
+  font-size: 20rpx;
+}
+.list-row {
+  justify-content: space-between;
+  min-height: 88rpx;
+  border-top: 1px solid #eef2f7;
+  font-size: 28rpx;
+}
+.list-row:first-of-type {
+  border-top: 0;
+}
+.arrow {
+  color: #94a3b8;
+  font-size: 38rpx;
+}
+.danger {
+  color: #ef4444;
+}
+.bottom-space {
+  height: 48rpx;
+}
+</style>

BIN
src/static/tabbar/meal-active.png


BIN
src/static/tabbar/meal.png


BIN
src/static/tabbar/order-active.png


BIN
src/static/tabbar/order.png


BIN
src/static/tabbar/profile-active.png


BIN
src/static/tabbar/profile.png


+ 3 - 0
src/store/index.ts

@@ -0,0 +1,3 @@
+import { createPinia } from 'pinia'
+
+export const pinia = createPinia()

+ 34 - 0
src/store/modules/auth.ts

@@ -0,0 +1,34 @@
+import { defineStore } from 'pinia'
+import { clearAuthState, getAccessToken, getUserInfo, setAccessToken, setSsoToken, setUserInfo, type StoredUserInfo } from '@/utils/tokenStorage'
+
+export const useAuthStore = defineStore('auth', {
+  state: () => ({
+    token: '',
+    userInfo: null as StoredUserInfo | null
+  }),
+  getters: {
+    loggedIn: state => !!state.token
+  },
+  actions: {
+    initAuth() {
+      this.token = getAccessToken()
+      this.userInfo = getUserInfo()
+    },
+    setToken(token: string) {
+      this.token = token
+      setAccessToken(token)
+    },
+    setSsoToken(token: string) {
+      setSsoToken(token)
+    },
+    setUser(user: StoredUserInfo) {
+      this.userInfo = user
+      setUserInfo(user)
+    },
+    logout() {
+      this.token = ''
+      this.userInfo = null
+      clearAuthState()
+    }
+  }
+})

+ 33 - 0
src/store/modules/company.ts

@@ -0,0 +1,33 @@
+import { defineStore } from 'pinia'
+import type { FoodCompanyEmployeeCompany } from '@/types/companyMeal'
+
+const CURRENT_COMPANY_ID_KEY = 'meal_current_company_id'
+
+export const useCompanyStore = defineStore('company', {
+  state: () => ({
+    companies: [] as FoodCompanyEmployeeCompany[],
+    currentCompany: null as FoodCompanyEmployeeCompany | null,
+    currentCompanyId: uni.getStorageSync(CURRENT_COMPANY_ID_KEY) || ''
+  }),
+  actions: {
+    setCompanies(companies: FoodCompanyEmployeeCompany[]) {
+      this.companies = companies
+      const preferredCompanyId = this.currentCompanyId || this.currentCompany?.companyId || ''
+      const validCurrentCompany = companies.find(company => company.companyId === preferredCompanyId)
+      this.currentCompany = validCurrentCompany || companies[0] || null
+      this.currentCompanyId = this.currentCompany?.companyId || ''
+      if (this.currentCompanyId) uni.setStorageSync(CURRENT_COMPANY_ID_KEY, this.currentCompanyId)
+      else uni.removeStorageSync(CURRENT_COMPANY_ID_KEY)
+    },
+    setCurrentCompany(company: FoodCompanyEmployeeCompany) {
+      this.currentCompany = company
+      this.currentCompanyId = company.companyId
+      uni.setStorageSync(CURRENT_COMPANY_ID_KEY, this.currentCompanyId)
+    },
+    clearCurrentCompany() {
+      this.currentCompany = null
+      this.currentCompanyId = ''
+      uni.removeStorageSync(CURRENT_COMPANY_ID_KEY)
+    }
+  }
+})

+ 70 - 0
src/store/modules/meal.ts

@@ -0,0 +1,70 @@
+import { defineStore } from 'pinia'
+import type { FoodMealMenu, FoodMealServiceArea } from '@/types/meal'
+
+const CURRENT_SERVICE_AREA_ID_KEY = 'meal_current_service_area_id'
+const LEGACY_CURRENT_RESTAURANT_ID_KEY = 'meal_current_restaurant_id'
+
+export const useMealStore = defineStore('meal', {
+  state: () => ({
+    selectedDate: '',
+    selectedMealType: '',
+    menu: null as FoodMealMenu | null,
+    quantities: {} as Record<string, number>,
+    serviceAreas: [] as FoodMealServiceArea[],
+    currentServiceArea: null as FoodMealServiceArea | null
+  }),
+  getters: {
+    selectedItems: state => Object.entries(state.quantities).filter(([, quantity]) => quantity > 0),
+    currentServiceAreaId: state => state.currentServiceArea?.id || '',
+    restaurants: state => state.serviceAreas,
+    currentRestaurant: state => state.currentServiceArea,
+    currentRestaurantId: state => state.currentServiceArea?.id || ''
+  },
+  actions: {
+    setServiceAreas(serviceAreas: FoodMealServiceArea[]) {
+      this.serviceAreas = serviceAreas
+      const savedId = uni.getStorageSync(CURRENT_SERVICE_AREA_ID_KEY) || uni.getStorageSync(LEGACY_CURRENT_RESTAURANT_ID_KEY)
+      const saved = savedId ? serviceAreas.find(item => item.id === savedId) : null
+      const currentStillExists = this.currentServiceArea ? serviceAreas.find(item => item.id === this.currentServiceArea?.id) : null
+      this.currentServiceArea = saved || currentStillExists || serviceAreas[0] || null
+      if (this.currentServiceArea?.id) uni.setStorageSync(CURRENT_SERVICE_AREA_ID_KEY, this.currentServiceArea.id)
+    },
+    setRestaurants(serviceAreas: FoodMealServiceArea[]) {
+      this.setServiceAreas(serviceAreas)
+    },
+    setCurrentServiceArea(serviceArea: FoodMealServiceArea) {
+      if (this.currentServiceArea?.id !== serviceArea.id) this.clearServiceAreaRelatedState()
+      this.currentServiceArea = serviceArea
+      uni.setStorageSync(CURRENT_SERVICE_AREA_ID_KEY, serviceArea.id)
+    },
+    setCurrentRestaurant(serviceArea: FoodMealServiceArea) {
+      this.setCurrentServiceArea(serviceArea)
+    },
+    setDate(date: string) {
+      this.selectedDate = date
+    },
+    setMealType(mealType: string) {
+      this.selectedMealType = mealType
+    },
+    setMenu(menu: FoodMealMenu | null) {
+      this.menu = menu
+      this.quantities = {}
+    },
+    setQuantity(menuItemId: string, quantity: number) {
+      if (quantity <= 0) delete this.quantities[menuItemId]
+      else this.quantities[menuItemId] = quantity
+    },
+    clearCart() {
+      this.quantities = {}
+    },
+    clearServiceAreaRelatedState() {
+      this.selectedDate = ''
+      this.selectedMealType = ''
+      this.menu = null
+      this.quantities = {}
+    },
+    clearRestaurantRelatedState() {
+      this.clearServiceAreaRelatedState()
+    }
+  }
+})

+ 39 - 0
src/styles/common.scss

@@ -0,0 +1,39 @@
+page {
+  min-height: 100%;
+  background: #f5f7fa;
+  color: #1f2933;
+  font-size: 28rpx;
+}
+
+.safe-page {
+  min-height: 100vh;
+  padding: 24rpx;
+  box-sizing: border-box;
+}
+
+.card {
+  background: #fff;
+  border-radius: 20rpx;
+  padding: 24rpx;
+  box-shadow: 0 8rpx 24rpx rgba(15, 23, 42, 0.06);
+}
+
+.primary-btn {
+  height: 88rpx;
+  border-radius: 44rpx;
+  background: linear-gradient(135deg, #00bcd4, #26c6da);
+  color: #fff;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.price {
+  color: #ff6b35;
+  font-weight: 700;
+}
+
+.muted {
+  color: #8a94a6;
+}

+ 26 - 0
src/types/address.ts

@@ -0,0 +1,26 @@
+export type MemberAddress = {
+  id: string
+  name: string
+  phone: string
+  province: string
+  provinceCode?: string
+  city: string
+  cityCode?: string
+  district: string
+  districtCode?: string
+  detail: string
+  isDefault?: boolean
+}
+
+export type MemberAddressSaveParams = {
+  receiverName: string
+  receiverMobile: string
+  province: string
+  provinceCode?: string
+  city: string
+  cityCode?: string
+  district: string
+  districtCode?: string
+  detailAddress: string
+  isDefault?: number
+}

+ 12 - 0
src/types/common.ts

@@ -0,0 +1,12 @@
+export type ApiResponse<T = unknown> = {
+  code: number
+  msg: string
+  data: T
+}
+
+export type PageResp<T> = {
+  records: T[]
+  total: number
+  pageNo: number
+  pageSize: number
+}

+ 170 - 0
src/types/companyMeal.ts

@@ -0,0 +1,170 @@
+import type { PageResp } from './common'
+import type { FoodMealMenuItem, FoodMealRestaurant, FoodMealServiceArea } from './meal'
+
+export type FoodCompanyEmployeeCompany = {
+  companyId: string
+  companyCode?: string
+  companyName: string
+  employeeId: string
+  employeeNo?: string
+  employeeName?: string
+  mobile?: string
+  memberId?: string
+  accountId?: string
+  availableBalance?: number
+  frozenBalance?: number
+}
+
+export type FoodCompanySearch = {
+  id?: string
+  companyId: string
+  companyCode?: string
+  companyName: string
+  contactName?: string
+  contactPhone?: string
+  status?: number
+}
+
+export type FoodCompanyJoinApplyStatus = 'pending' | 'approved' | 'rejected'
+
+export type FoodCompanyJoinApply = {
+  id: string
+  createDate?: string
+  companyId: string
+  companyCode?: string
+  companyName: string
+  memberId?: string
+  memberNo?: string
+  employeeId?: string
+  employeeNo?: string
+  employeeName: string
+  mobile: string
+  applyReason?: string
+  applyTime?: string
+  status: FoodCompanyJoinApplyStatus
+  auditUserId?: string
+  auditUserName?: string
+  auditTime?: string
+  auditRemark?: string
+}
+
+export type FoodCompanyJoinApplyCreateParams = {
+  companyId: string
+  employeeName: string
+  mobile: string
+  employeeNo?: string
+  applyReason?: string
+  memberNo?: string
+}
+
+export type FoodCompanySubsidyRuleSummary = {
+  id: string
+  ruleName: string
+  subsidyMode: string
+  subsidyAmount?: number
+  mealType?: string
+}
+
+export type FoodCompanyMealBenefit = {
+  companyId: string
+  companyName: string
+  employeeId: string
+  employeeName: string
+  accountAvailableBalance?: number
+  accountFrozenBalance?: number
+  rules?: FoodCompanySubsidyRuleSummary[]
+}
+
+export type FoodCompanyMealTrialItem = FoodMealMenuItem & {
+  specId?: string
+  specName?: string
+  specDescription?: string
+  quantity: number
+  totalAmount: number
+  discountAmount: number
+  companyPayAmount: number
+  employeePayAmount: number
+}
+
+export type FoodCompanyMealTrial = {
+  companyId: string
+  companyName: string
+  employeeId: string
+  employeeName: string
+  originalAmount: number
+  discountAmount: number
+  payableAmount: number
+  companyPayAmount: number
+  employeePayAmount: number
+  accountAvailableBalance?: number
+  items: FoodCompanyMealTrialItem[]
+}
+
+export type FoodCompanyMealOrderItem = {
+  id: string
+  menuItemId: string
+  specId?: string
+  specName?: string
+  specDescription?: string
+  itemName: string
+  itemImage?: string
+  salePrice: number
+  quantity: number
+  totalAmount: number
+  discountAmount: number
+  companyPayAmount: number
+  employeePayAmount: number
+}
+
+export type FoodCompanyMealOrder = {
+  id: string
+  orderNo: string
+  companyId: string
+  companyName?: string
+  employeeId?: string
+  employeeName?: string
+  serviceAreaId?: string
+  serviceAreaName?: string
+  serviceArea?: FoodMealServiceArea
+  pickupLocation?: string
+  restaurantId?: string
+  restaurantName?: string
+  restaurant?: FoodMealRestaurant
+  menuId: string
+  mealDate: string
+  mealType: string
+  totalAmount: number
+  discountAmount: number
+  companyPayAmount: number
+  employeePayAmount: number
+  companyNetPayAmount: number
+  employeeNetPayAmount: number
+  orderStatus: string
+  payStatus: string
+  pickupCode?: string
+  payTime?: string
+  createDate?: string
+  cancelTime?: string
+  refundAmount?: number
+  refundTime?: string
+  payOrderId?: string
+  payOrderNo?: string
+  deliveryType?: string
+  addressId?: string
+  receiverName?: string
+  receiverMobile?: string
+  province?: string
+  provinceCode?: string
+  city?: string
+  cityCode?: string
+  district?: string
+  districtCode?: string
+  detailAddress?: string
+  fullAddress?: string
+  longitude?: number
+  latitude?: number
+  remark?: string
+  items?: FoodCompanyMealOrderItem[]
+}
+
+export type FoodCompanyMealOrderPage = PageResp<FoodCompanyMealOrder>

+ 4 - 0
src/types/index.ts

@@ -0,0 +1,4 @@
+export * from './common'
+export * from './meal'
+export * from './companyMeal'
+export * from './pay'

+ 215 - 0
src/types/meal.ts

@@ -0,0 +1,215 @@
+import type { PageResp } from './common'
+
+export type FoodMealType = { value: string; label: string }
+
+export type FoodMealDateStatusCode =
+  | 'orderable'
+  | 'expired'
+  | 'not_started'
+  | 'after_deadline'
+  | 'out_of_range'
+  | 'no_menu'
+  | 'invalid_date'
+  | 'unavailable'
+
+export type FoodMealDateStatus = {
+  mealDate: string
+  orderable: boolean
+  status: FoodMealDateStatusCode
+  reason?: string
+  deadlineTime?: string
+  serverTime?: string
+  deadlineRemainSeconds?: number | null
+}
+
+export type FoodMealServiceArea = {
+  id: string
+  name: string
+  icon?: string
+  locationLabel?: string
+  address?: string
+  floorLabel?: string
+  phone?: string
+  openHours?: string
+  openStatus?: string
+  openStatusText?: string
+  pickupLocation?: string
+  restaurantId?: string
+  restaurantName?: string
+}
+
+export type FoodMealRestaurant = FoodMealServiceArea
+
+export type FoodMealMenuItemSpec = {
+  id?: string
+  name: string
+  description?: string
+  salePrice?: number
+  stockQuantity?: number | null
+  soldQuantity?: number | null
+  remainingQuantity?: number | null
+  soldOut?: boolean
+  limitQuantityPerUser?: number | null
+  sortNo?: number | null
+}
+
+export type FoodMealMenuItem = {
+  id: string
+  menuId: string
+  itemName: string
+  itemImage?: string
+  salePrice: number
+  stockQuantity?: number | null
+  soldQuantity?: number | null
+  remainingQuantity?: number | null
+  soldOut?: boolean
+  tags?: string[]
+  images?: string[]
+  descriptionHtml?: string
+  specs?: FoodMealMenuItemSpec[]
+  limitQuantityPerUser?: number | null
+}
+
+export type FoodMealHotItem = {
+  itemType?: string
+  dishId?: string
+  packageId?: string
+  itemName: string
+  itemImage?: string
+  salePrice?: number
+  orderCount?: number
+  saleQuantity?: number
+}
+
+export type FoodMealMenu = {
+  id: string
+  serviceAreaId?: string
+  serviceAreaName?: string
+  restaurantId?: string
+  restaurantName?: string
+  menuDate: string
+  mealType: string
+  orderable?: boolean
+  notOrderableReason?: string
+  deadlineTime?: string
+  serverTime?: string
+  deadlineRemainSeconds?: number | null
+  pickupType?: 'pickup' | 'delivery'
+  pickupDate?: string
+  pickupLocation?: string
+  serviceArea?: FoodMealServiceArea
+  restaurant?: FoodMealRestaurant
+  items: FoodMealMenuItem[]
+}
+
+export type FoodMealMenuItemDetail = FoodMealMenuItem & {
+  serviceAreaId?: string
+  serviceAreaName?: string
+  serviceArea?: FoodMealServiceArea
+  restaurantId?: string
+  restaurantName?: string
+  restaurant?: FoodMealRestaurant
+  menuDate?: string
+  mealType?: string
+  orderable?: boolean
+  notOrderableReason?: string
+  deadlineTime?: string
+  deadlineRemainSeconds?: number | null
+  pickupType?: 'pickup' | 'delivery'
+  pickupDate?: string
+  pickupLocation?: string
+}
+
+export type FoodMealTrialItem = {
+  menuItemId: string
+  specId?: string
+  specName?: string
+  specDescription?: string
+  itemName: string
+  salePrice: number
+  quantity: number
+  totalAmount: number
+  stockQuantity?: number | null
+  soldQuantity?: number | null
+  remainingQuantity?: number | null
+  limitQuantityPerUser?: number | null
+}
+
+export type FoodMealTrial = {
+  menuId: string
+  mealDate: string
+  mealType: string
+  totalAmount: number
+  items: FoodMealTrialItem[]
+}
+
+export type FoodMealOrderItem = {
+  id: string
+  menuItemId: string
+  specId?: string
+  specName?: string
+  specDescription?: string
+  itemName: string
+  itemImage?: string
+  salePrice: number
+  quantity: number
+  totalAmount: number
+}
+
+export type FoodMealOrder = {
+  id: string
+  orderNo: string
+  serviceAreaId?: string
+  serviceAreaName?: string
+  serviceArea?: FoodMealServiceArea
+  pickupLocation?: string
+  restaurantId?: string
+  restaurantName?: string
+  restaurant?: FoodMealRestaurant
+  menuId: string
+  mealDate: string
+  mealType: string
+  totalAmount: number
+  userPayAmount: number
+  orderStatus: string
+  payStatus: string
+  pickupCode?: string
+  payTime?: string
+  createDate?: string
+  cancelTime?: string
+  cancelReason?: string
+  refundAmount?: number
+  refundApplyTime?: string
+  refundReason?: string
+  refundTime?: string
+  verifyTime?: string
+  deliveryType?: string
+  addressId?: string
+  receiverName?: string
+  receiverMobile?: string
+  province?: string
+  provinceCode?: string
+  city?: string
+  cityCode?: string
+  district?: string
+  districtCode?: string
+  detailAddress?: string
+  fullAddress?: string
+  longitude?: number
+  latitude?: number
+  remark?: string
+  items: FoodMealOrderItem[]
+}
+
+export type FoodMealOrderPage = PageResp<FoodMealOrder>
+
+export type FoodMealPayPrepare = Record<string, unknown> & {
+  orderId: string
+  payOrderId?: string
+  outTradeNo?: string
+  timeStamp?: string
+  nonceStr?: string
+  packageValue?: string
+  signType?: string
+  paySign?: string
+}

+ 72 - 0
src/types/order.ts

@@ -0,0 +1,72 @@
+export type OrderBizType = 'foodMeal' | 'companyMeal'
+
+export type OrderStatus =
+  | 'pending_pay'
+  | 'pending_ship'
+  | 'pending_receive'
+  | 'completed'
+  | 'cancelled'
+  | 'refunding'
+  | 'refunded'
+  | string
+
+export type OrderMerchant = {
+  id?: string
+  merchantId?: string
+  serviceAreaId?: string
+  serviceAreaName?: string
+  serviceArea?: {
+    id?: string
+    name?: string
+    pickupLocation?: string
+  }
+  pickupLocation?: string
+  name?: string
+  merchantName?: string
+  title?: string
+  logo?: string
+  image?: string
+  goods?: OrderGoods[]
+  products?: OrderGoods[]
+  subtotal?: number | string
+}
+
+export type OrderGoods = {
+  id?: string | number
+  spuId?: string
+  title?: string
+  name?: string
+  image?: string
+  price?: number | string
+  quantity?: number
+  specText?: string
+}
+
+export type OrderInfo = {
+  id: string
+  unifiedOrderId?: string
+  orderNo?: string
+  bizType: OrderBizType
+  status: OrderStatus
+  statusText?: string
+  serviceAreaId?: string
+  serviceAreaName?: string
+  serviceArea?: {
+    id?: string
+    name?: string
+    pickupLocation?: string
+  }
+  pickupLocation?: string
+  restaurantName?: string
+  restaurant?: {
+    id?: string
+    name?: string
+    pickupLocation?: string
+  }
+  title?: string
+  totalAmount?: number | string
+  payAmount?: number | string
+  createTime?: string
+  createDate?: string
+  merchants?: OrderMerchant[] | OrderMerchant
+}

+ 7 - 0
src/types/pay.ts

@@ -0,0 +1,7 @@
+export type WechatPayParams = {
+  timeStamp?: string
+  nonceStr?: string
+  packageValue?: string
+  signType?: string
+  paySign?: string
+}

+ 7 - 0
src/uni.scss

@@ -0,0 +1,7 @@
+$meal-primary: #00bcd4;
+$meal-primary-dark: #0097a7;
+$meal-bg: #f5f7fa;
+$meal-text: #1f2933;
+$meal-muted: #8a94a6;
+$meal-danger: #f56c6c;
+$meal-price: #ff6b35;

+ 52 - 0
src/utils/auth.ts

@@ -0,0 +1,52 @@
+import { getAccessToken } from './tokenStorage'
+import { useAuthStore } from '@/store/modules/auth'
+import { ROUTE_LOGIN_INDEX } from '@/constants/routes'
+
+const TAB_BAR_PAGES = ['/pages/meal/index', '/pages/order/index', '/pages/profile/index']
+
+const DEFAULT_LOGIN_PROMPT = {
+  title: '需要登录',
+  content: '该功能需登录后使用,是否前往登录?',
+  confirmText: '去登录',
+  cancelText: '稍后再说'
+}
+
+export function getToken() {
+  return getAccessToken()
+}
+
+export function isLoggedIn() {
+  const auth = useAuthStore()
+  if (!auth.token) auth.initAuth()
+  return auth.loggedIn
+}
+
+export function isTabBarPage(url: string) {
+  const path = url.split('?')[0]
+  return TAB_BAR_PAGES.includes(path)
+}
+
+function goLogin(redirect?: string) {
+  const target = `${ROUTE_LOGIN_INDEX}${redirect ? `?redirect=${encodeURIComponent(redirect)}` : ''}`
+  uni.navigateTo({
+    url: target,
+    fail: () => uni.reLaunch({ url: target })
+  })
+}
+
+export function requireLogin() {
+  if (isLoggedIn()) return true
+  uni.showModal({
+    ...DEFAULT_LOGIN_PROMPT,
+    success: res => {
+      if (res.confirm) goLogin()
+    }
+  })
+  return false
+}
+
+export function requireLoginNavigate(redirect?: string) {
+  if (isLoggedIn()) return true
+  goLogin(redirect)
+  return false
+}

+ 168 - 0
src/utils/device.ts

@@ -0,0 +1,168 @@
+/**
+ * 设备信息工具
+ */
+
+const DEVICE_ID_KEY = 'meal_device_id'
+
+/**
+ * 生成设备ID
+ */
+function generateDeviceId(): string {
+  return `device_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
+}
+
+/**
+ * 获取设备ID
+ */
+export function getDeviceId(): string {
+  let deviceId = uni.getStorageSync(DEVICE_ID_KEY) || ''
+  if (!deviceId) {
+    deviceId = generateDeviceId()
+    uni.setStorageSync(DEVICE_ID_KEY, deviceId)
+  }
+  return deviceId
+}
+
+/**
+ * 获取平台类型
+ */
+export function getPlatform(): 'android' | 'ios' | 'h5' | 'mp-weixin' | 'mp-alipay' {
+  // #ifdef APP-PLUS
+  // @ts-ignore
+  const platform = plus.os.name.toLowerCase()
+  return platform === 'ios' ? 'ios' : 'android'
+  // #endif
+
+  // #ifdef H5
+  return 'h5'
+  // #endif
+
+  // #ifdef MP-WEIXIN
+  return 'mp-weixin'
+  // #endif
+
+  // #ifdef MP-ALIPAY
+  return 'mp-alipay'
+  // #endif
+
+  return 'h5'
+}
+
+/**
+ * 获取APP类型
+ */
+export function getAppType(): string {
+  const platform = getPlatform()
+  return platform === 'android' || platform === 'ios' ? 'app' : platform
+}
+
+/**
+ * 获取运行时小程序 appid
+ */
+export function getRuntimeMiniAppId(): string {
+  // #ifdef MP-WEIXIN
+  try {
+    const accountInfo = uni.getAccountInfoSync()
+    return accountInfo?.miniProgram?.appId || ''
+  } catch {
+    return ''
+  }
+  // #endif
+  return ''
+}
+
+/**
+ * 与《移动端接口规范》对齐的请求头:X-Platform、X-Version(上传/普通请求统一带上,避免网关或统计侧拦截)。
+ */
+export function getMobileClientHeaders(): Record<string, string> {
+  const platform = getPlatform()
+  let xPlatform = 'H5'
+  if (platform === 'mp-weixin' || platform === 'mp-alipay') {
+    xPlatform = 'MINI'
+  } else if (platform === 'android' || platform === 'ios') {
+    xPlatform = 'APP'
+  }
+  const { version } = getRuntimeClientVersion()
+  const headers: Record<string, string> = {
+    'X-Platform': xPlatform,
+    'X-Version': version || '1.0.0'
+  }
+  const miniAppId = getRuntimeMiniAppId()
+  if (miniAppId) {
+    headers.APPID = miniAppId
+  }
+  return headers
+}
+
+/**
+ * 获取系统信息
+ */
+export function getSystemInfo(): UniApp.GetSystemInfoResult {
+  return uni.getSystemInfoSync()
+}
+
+/**
+ * 获取应用版本
+ */
+export function getAppVersion(): string {
+  // #ifdef APP-PLUS
+  // @ts-ignore
+  return plus.runtime.version
+  // #endif
+
+  // #ifndef APP-PLUS
+  return ''
+  // #endif
+}
+
+/**
+ * 小程序 / App 运行时版本号与整型构建号(非 H5 静态写死;与 manifest 发布配置、微信审核版本一致)。
+ */
+export function getRuntimeClientVersion(): { version: string; versionCode: number } {
+  let version = ''
+  let versionCode = 0
+
+  // #ifdef MP-WEIXIN
+  try {
+    const ac = uni.getAccountInfoSync()
+    const mp = ac?.miniProgram as { version?: string; versionCode?: number | string } | undefined
+    if (mp?.version) version = String(mp.version).trim()
+    const raw = mp?.versionCode
+    if (raw !== undefined && raw !== null && raw !== '') {
+      const n = typeof raw === 'number' ? raw : parseInt(String(raw), 10)
+      if (!Number.isNaN(n)) versionCode = n
+    }
+  } catch {
+    /* ignore */
+  }
+  // #endif
+
+  // #ifdef APP-PLUS
+  try {
+    // @ts-ignore
+    const v = plus.runtime.version
+    if (v) version = String(v).trim()
+    // @ts-ignore
+    const c = plus.runtime.versionCode
+    if (typeof c === 'number' && !Number.isNaN(c)) versionCode = c
+  } catch {
+    /* ignore */
+  }
+  // #endif
+
+  return { version, versionCode }
+}
+
+/**
+ * 获取网络类型
+ */
+export function getNetworkType(): Promise<string> {
+  return new Promise((resolve, reject) => {
+    uni.getNetworkType({
+      success: (res) => {
+        resolve(res.networkType)
+      },
+      fail: reject
+    })
+  })
+}

+ 34 - 0
src/utils/mealDisplay.ts

@@ -0,0 +1,34 @@
+const mealTypeMap: Record<string, string> = {
+  BREAKFAST: '早餐',
+  LUNCH: '午餐',
+  DINNER: '晚餐',
+  SNACK: '加餐'
+}
+
+const orderStatusMap: Record<string, string> = {
+  pending_pay: '待支付',
+  paid: '已支付',
+  cancelled: '已取消',
+  refunding: '退款中',
+  refunded: '已退款',
+  picked: '已取餐'
+}
+
+const payStatusMap: Record<string, string> = {
+  unpaid: '未支付',
+  paid: '已支付',
+  refunded: '已退款'
+}
+
+export function mealTypeLabel(value?: string) {
+  if (!value) return '-'
+  return mealTypeMap[value.toUpperCase()] || value
+}
+
+export function orderStatusLabel(value?: string) {
+  return value ? orderStatusMap[value] || value : '-'
+}
+
+export function payStatusLabel(value?: string) {
+  return value ? payStatusMap[value] || value : '-'
+}

+ 8 - 0
src/utils/money.ts

@@ -0,0 +1,8 @@
+export function toNumber(value: unknown) {
+  const n = Number(value ?? 0)
+  return Number.isFinite(n) ? n : 0
+}
+
+export function formatMoney(value: unknown) {
+  return toNumber(value).toFixed(2)
+}

+ 54 - 0
src/utils/needLoginError.ts

@@ -0,0 +1,54 @@
+import { ROUTE_LOGIN_INDEX } from '@/constants/routes'
+
+export const RELOGIN_MODAL_CONTENT = '登录已失效,请重新登录'
+
+export class NeedLoginError extends Error {
+  readonly needLogin = true
+
+  constructor(message?: string) {
+    super(message || RELOGIN_MODAL_CONTENT)
+    this.name = 'NeedLoginError'
+  }
+}
+
+export function isNeedLoginError(error: unknown): boolean {
+  return Boolean(
+    error &&
+      typeof error === 'object' &&
+      (error as NeedLoginError).needLogin === true
+  )
+}
+
+export function shouldSuppressAuthErrorToast(errorOrMessage: unknown): boolean {
+  if (isNeedLoginError(errorOrMessage)) return true
+  const msg =
+    typeof errorOrMessage === 'string'
+      ? errorOrMessage
+      : errorOrMessage instanceof Error
+        ? errorOrMessage.message
+        : ''
+  if (!msg) return false
+  return /未能读取到有效Token|请重新登录|登录已失效|登录超时|Token/i.test(msg)
+}
+
+let lastTokenExpirePromptAt = 0
+
+export function promptReLoginModal(): void {
+  const now = Date.now()
+  if (now - lastTokenExpirePromptAt < 3000) return
+  lastTokenExpirePromptAt = now
+  uni.showModal({
+    title: '提示',
+    content: RELOGIN_MODAL_CONTENT,
+    confirmText: '登录',
+    cancelText: '关闭',
+    success: res => {
+      if (res.confirm) {
+        uni.navigateTo({
+          url: ROUTE_LOGIN_INDEX,
+          fail: () => uni.reLaunch({ url: ROUTE_LOGIN_INDEX })
+        })
+      }
+    }
+  })
+}

+ 15 - 0
src/utils/orderCancelActions.ts

@@ -0,0 +1,15 @@
+import { cancelCompanyMealOrder } from '@/api/modules/companyMeal'
+import { cancelMealOrder } from '@/api/modules/meal'
+import type { OrderInfo } from '@/types/order'
+
+export async function cancelMealUnifiedOrder(order: OrderInfo, cancelReason = '用户取消') {
+  if (order.bizType === 'foodMeal') {
+    await cancelMealOrder({ orderId: order.id, cancelReason })
+    return
+  }
+  if (order.bizType === 'companyMeal') {
+    await cancelCompanyMealOrder({ orderId: order.id, cancelReason })
+    return
+  }
+  throw new Error('暂不支持该订单取消')
+}

+ 28 - 0
src/utils/pay.ts

@@ -0,0 +1,28 @@
+import type { WechatPayParams } from '@/types/pay'
+
+function normalizePayError(error: UniApp.GeneralCallbackResult) {
+  const errMsg = error.errMsg || ''
+  if (errMsg.includes('cancel')) return new Error('支付已取消,可在订单详情中继续支付')
+  return new Error('支付失败,可在订单详情中继续处理')
+}
+
+export function requestWechatPay(params: WechatPayParams) {
+  return new Promise<void>((resolve, reject) => {
+    // #ifdef MP-WEIXIN
+    uni.requestPayment({
+      provider: 'wxpay',
+      orderInfo: {},
+      timeStamp: params.timeStamp || '',
+      nonceStr: params.nonceStr || '',
+      package: params.packageValue || '',
+      signType: params.signType || 'RSA',
+      paySign: params.paySign || '',
+      success: () => resolve(),
+      fail: error => reject(normalizePayError(error))
+    } as UniApp.RequestPaymentOptions)
+    // #endif
+    // #ifndef MP-WEIXIN
+    reject(new Error('当前环境不支持微信支付,请在微信小程序中完成支付'))
+    // #endif
+  })
+}

+ 108 - 0
src/utils/request.ts

@@ -0,0 +1,108 @@
+import { apiConfig } from '@/config/api'
+import type { ApiResponse } from '@/types/common'
+import { clearAuthState, getAccessToken, getSsoToken } from './tokenStorage'
+import { getAppType, getDeviceId, getMobileClientHeaders } from './device'
+import { NeedLoginError, promptReLoginModal, shouldSuppressAuthErrorToast } from './needLoginError'
+
+export interface RequestConfig {
+  url: string
+  method?: 'GET' | 'POST' | 'PUT' | 'DELETE'
+  data?: unknown
+  params?: Record<string, unknown>
+  header?: Record<string, string>
+  showLoading?: boolean
+  loadingText?: string
+  showErrorToast?: boolean
+  skipAuth?: boolean
+}
+
+function buildConfig(config: RequestConfig): RequestConfig {
+  const token = config.skipAuth ? '' : getAccessToken()
+  const header: Record<string, string> = {
+    ...config.header,
+    ...getMobileClientHeaders(),
+    'X-Device-Id': getDeviceId(),
+    'X-App-Type': getAppType(),
+    'Content-Type': 'application/json'
+  }
+  if (token) {
+    const satoken = getSsoToken()
+    header.access_token = token
+    header.Authorization = `Bearer ${token}`
+    if (satoken) header.satoken = satoken
+  }
+  return { ...config, header }
+}
+
+function sanitizeRequestData(data: unknown) {
+  if (!data || typeof data !== 'object' || Array.isArray(data)) return data
+  return Object.fromEntries(
+    Object.entries(data as Record<string, unknown>).filter(([, value]) => value !== undefined && value !== null && value !== '')
+  )
+}
+
+function handleResponse<T>(response: UniApp.RequestSuccessCallbackResult, skipAuth?: boolean): ApiResponse<T> {
+  const res = response.data as ApiResponse<T>
+  if (res.code === 201) {
+    if (!skipAuth) {
+      clearAuthState()
+      promptReLoginModal()
+    }
+    throw new NeedLoginError(res.msg)
+  }
+  if (res.code !== 200) {
+    throw new Error(res.msg || '请求失败')
+  }
+  return res
+}
+
+export function request<T = unknown>(config: RequestConfig): Promise<ApiResponse<T>> {
+  return new Promise((resolve, reject) => {
+    const finalConfig = buildConfig(config)
+    if (finalConfig.showLoading) {
+      uni.showLoading({ title: finalConfig.loadingText || '加载中...', mask: true })
+    }
+    const method = finalConfig.method || 'GET'
+    const data = method === 'GET' ? sanitizeRequestData(finalConfig.params ?? finalConfig.data) : finalConfig.data
+    uni.request({
+      url: finalConfig.url.startsWith('http') ? finalConfig.url : `${apiConfig.baseURL}${finalConfig.url}`,
+      method,
+      data: data as string | AnyObject | ArrayBuffer | undefined,
+      header: finalConfig.header,
+      timeout: apiConfig.timeout,
+      success: res => {
+        if (finalConfig.showLoading) uni.hideLoading()
+        try {
+          resolve(handleResponse<T>(res, finalConfig.skipAuth))
+        } catch (error) {
+          if (finalConfig.showErrorToast !== false && !shouldSuppressAuthErrorToast(error)) {
+            uni.showToast({ title: (error as Error).message || '请求失败', icon: 'none' })
+          }
+          reject(error)
+        }
+      },
+      fail: error => {
+        if (finalConfig.showLoading) uni.hideLoading()
+        const msg = error.errMsg || '网络请求失败'
+        if (finalConfig.showErrorToast !== false) uni.showToast({ title: msg, icon: 'none' })
+        reject(new Error(msg))
+      }
+    })
+  })
+}
+
+export function get<T = unknown>(url: string, params?: Record<string, unknown>, config?: Partial<RequestConfig>) {
+  return request<T>({ url, method: 'GET', params, ...config })
+}
+
+export function post<T = unknown>(url: string, data?: unknown, config?: Partial<RequestConfig>) {
+  return request<T>({ url, method: 'POST', data, ...config })
+}
+
+export function put<T = unknown>(url: string, data?: unknown, config?: Partial<RequestConfig>) {
+  return request<T>({ url, method: 'PUT', data, ...config })
+}
+
+export function del<T = unknown>(url: string, config?: Partial<RequestConfig>) {
+  return request<T>({ url, method: 'DELETE', ...config })
+}

+ 53 - 0
src/utils/tokenStorage.ts

@@ -0,0 +1,53 @@
+const ACCESS_TOKEN_KEY = 'meal_access_token'
+const SSO_TOKEN_KEY = 'meal_sso_token'
+const USER_INFO_KEY = 'meal_user_info'
+
+export type StoredUserInfo = {
+  id?: string
+  nickname?: string
+  loginName?: string
+  avatar?: string
+  phone?: string
+}
+
+export function getAccessToken() {
+  return uni.getStorageSync(ACCESS_TOKEN_KEY) || ''
+}
+
+export function setAccessToken(token: string) {
+  uni.setStorageSync(ACCESS_TOKEN_KEY, token)
+}
+
+export function removeAccessToken() {
+  uni.removeStorageSync(ACCESS_TOKEN_KEY)
+}
+
+export function getSsoToken() {
+  return uni.getStorageSync(SSO_TOKEN_KEY) || ''
+}
+
+export function setSsoToken(token: string) {
+  uni.setStorageSync(SSO_TOKEN_KEY, token)
+}
+
+export function removeSsoToken() {
+  uni.removeStorageSync(SSO_TOKEN_KEY)
+}
+
+export function getUserInfo(): StoredUserInfo | null {
+  return uni.getStorageSync(USER_INFO_KEY) || null
+}
+
+export function setUserInfo(user: StoredUserInfo) {
+  uni.setStorageSync(USER_INFO_KEY, user)
+}
+
+export function removeUserInfo() {
+  uni.removeStorageSync(USER_INFO_KEY)
+}
+
+export function clearAuthState() {
+  removeAccessToken()
+  removeSsoToken()
+  removeUserInfo()
+}

+ 18 - 0
src/utils/unifiedOrderWechatPay.ts

@@ -0,0 +1,18 @@
+import { prepareCompanyMealPay } from '@/api/modules/companyMeal'
+import { prepareMealPay } from '@/api/modules/meal'
+import type { OrderInfo } from '@/types/order'
+import { requestWechatPay } from './pay'
+
+export async function invokeMealUnifiedOrderWechatPay(order: OrderInfo) {
+  if (order.bizType === 'foodMeal') {
+    const pay = await prepareMealPay({ orderId: order.id })
+    await requestWechatPay(pay.data)
+    return
+  }
+  if (order.bizType === 'companyMeal') {
+    const pay = await prepareCompanyMealPay({ orderId: order.id })
+    await requestWechatPay(pay.data)
+    return
+  }
+  throw new Error('暂不支持该订单支付')
+}

+ 45 - 0
tsconfig.json

@@ -0,0 +1,45 @@
+{
+    "extends": "@vue/tsconfig/tsconfig.json",
+    "compilerOptions": {
+        "verbatimModuleSyntax": true,
+        "target": "ES2020",
+        "module": "ESNext",
+        "lib": [
+            "ES2020",
+            "DOM",
+            "DOM.Iterable"
+        ],
+        "moduleResolution": "node",
+        "strict": true,
+        "jsx": "preserve",
+        "importHelpers": true,
+        "esModuleInterop": true,
+        "allowSyntheticDefaultImports": true,
+        "sourceMap": true,
+        "baseUrl": ".",
+        "types": [
+            "@dcloudio/types",
+            "node"
+        ],
+        "paths": {
+            "@/*": [
+                "./src/*"
+            ]
+        },
+        "skipLibCheck": true,
+        "resolveJsonModule": true,
+        "isolatedModules": true,
+        "noEmit": true
+    },
+    "include": [
+        "src/**/*.ts",
+        "src/**/*.d.ts",
+        "src/**/*.tsx",
+        "src/**/*.vue"
+    ],
+    "exclude": [
+        "node_modules",
+        "dist",
+        "**/*.js"
+    ]
+}

+ 32 - 0
vite.config.ts

@@ -0,0 +1,32 @@
+import { defineConfig } from 'vite'
+import uni from '@dcloudio/vite-plugin-uni'
+import { resolve } from 'node:path'
+
+export default defineConfig({
+  plugins: [uni()],
+  transpileDependencies: ['uview-plus'],
+  css: {
+    preprocessorOptions: {
+      scss: {
+        silenceDeprecations: ['legacy-js-api', 'color-functions', 'import']
+      }
+    }
+  },
+  resolve: {
+    dedupe: ['vue', 'pinia'],
+    alias: {
+      '@': resolve(__dirname, 'src')
+    }
+  },
+  server: {
+    port: 9010,
+    host: '0.0.0.0',
+    proxy: {
+      '/mobile': {
+        target: process.env.VITE_DEV_API_TARGET || 'http://127.0.0.1:8086',
+        changeOrigin: true,
+        secure: false
+      }
+    }
+  }
+})