From 3cd9c972c3a9336194b18f5518c10fa1a6125055 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Wed, 02 Apr 2025 19:47:19 +0800
Subject: [PATCH] Merge branch 'master' of http://139.196.74.78:10010/r/drone/command-center-dashboard

---
 src/option/system/dictbiz.js                                 |  416 
 src/utils/cesium/frustum/CreateFrustum.js                    |  486 
 src/router/avue-router.js                                    |  324 
 src/utils/rem.js                                             |    7 
 src/views/Home/Footer.vue                                    |  178 
 src/websocket/index.js                                       |  110 
 src/utils/cesium/compressImage.js                            |   74 
 src/api/system/menu.js                                       |  172 
 src/components/global/publicTitle.vue                        |   33 
 src/utils/staticData/device.js                               |  466 
 src/store/modules/user.js                                    |  788 
 src/api/base/region.js                                       |   84 
 src/store/index.js                                           |   38 
 src/utils/module.js                                          |   60 
 src/api/system/scope.js                                      |  154 
 src/api/work/process.js                                      |   46 
 src/api/work/work.js                                         |  130 
 src/views/Home/components/HomeLeft/InspectionRaskDetails.vue |  387 
 src/views/Home/useEventOperate/useEventOperate.js            |  381 
 src/api/system/client.js                                     |   78 
 src/utils/cesium/use-kmz-tsa.js                              | 1316 +-
 src/utils/cesium/kmz.js                                      |  359 
 src/api/report/report.js                                     |   38 
 src/mixins/index.js                                          |   86 
 src/option/tool/formsetting.js                               |  188 
 src/api/resource/attach.js                                   |   78 
 src/mockProdServer.js                                        |   12 
 src/config/website.js                                        |  154 
 src/router/views/index.js                                    |  102 
 src/utils/store.js                                           |  158 
 src/components/index.js                                      |   33 
 src/api/home/machineNest.js                                  |   85 
 src/api/home/index.js                                        |  173 
 src/utils/cesium/mapUtil.js                                  |  537 
 src/utils/util.js                                            |  604 
 src/api/home/aggregation.js                                  |   35 
 src/utils/date.js                                            |   82 
 src/api/tool/code.js                                         |  124 
 src/views/Home/Home.vue                                      |    2 
 src/api/common.js                                            |   16 
 src/router/page/index.js                                     |  137 
 src/views/Home/useUavHome/useUavHome.js                      |  273 
 src/api/system/user.js                                       |  240 
 src/utils/crypto.js                                          |  170 
 src/error.js                                                 |   46 
 src/api/resource/oss.js                                      |   94 
 src/views/Home/useEventOperate/EventPopUpBox.vue             |   55 
 src/option/job/jobinfo.js                                    | 1000 
 src/api/job/jobserver.js                                     |   90 
 src/api/logs.js                                              |  104 
 src/mixins/crud.js                                           |  430 
 src/store/modules/home.js                                    |   59 
 src/lang/index.js                                            |   46 
 src/views/Home/useUavHome/DevicePopUpBox.vue                 |    0 
 src/directive/selectLoad.js                                  |   18 
 src/utils/formatter.js                                       |   65 
 src/utils/websocket/connect-websocket.js                     |   12 
 src/utils/staticData/enums.js                                |  172 
 src/utils/cesium/AmapMercatorTilingScheme/index.js           |   66 
 src/utils/http/config.js                                     |  101 
 src/option/tool/codesetting.js                               |  456 
 src/utils/auth.js                                            |   26 
 src/utils/cesium/ImageTrailMaterial.js                       |  144 
 src/option/system/dict.js                                    |  414 
 src/api/system/dept.js                                       |  128 
 pnpm-lock.yaml                                               | 6793 +++++-------
 src/api/system/tenantdatasource.js                           |   78 
 src/utils/http/enums.js                                      |   26 
 src/store/getters.js                                         |   74 
 src/store/modules/tags.js                                    |   72 
 src/websocket/util/config.js                                 |   17 
 src/api/resource/sms.js                                      |  114 
 src/lang/zh.js                                               |  270 
 src/permission.js                                            |  110 
 src/api/system/param.js                                      |   78 
 src/components/basic-video/plugin.js                         |  162 
 src/api/system/tenantpackage.js                              |   78 
 src/api/user.js                                              |  290 
 src/utils/cesium/AmapMercatorTilingScheme/CoordTransform.js  |  302 
 src/api/tool/model.js                                        |  176 
 src/config/iconList.js                                       |  758 
 src/option/tool/code.js                                      | 1322 +-
 src/router/index.js                                          |   52 
 src/utils/flow.js                                            |   10 
 src/utils/websocket/drone-ws-control.js                      |  249 
 src/option/user/info.js                                      |  166 
 src/lang/en.js                                               |  270 
 src/main.js                                                  |  134 
 src/api/system/dict.js                                       |  142 
 src/utils/cesium/common.js                                   |  307 
 src/api/system/role.js                                       |  154 
 src/api/tool/codesetting.js                                  |  140 
 src/api/system/topmenu.js                                    |  122 
 src/debug.js                                                 |   50 
 src/option/job/jobserver.js                                  |  154 
 src/store/modules/common.js                                  |  182 
 src/utils/cesium-tsa.js                                      | 1958 +-
 src/utils/sm2.js                                             |   14 
 src/utils/func.js                                            |  556 
 src/api/flow/flow.js                                         |  196 
 src/const/tool/model.js                                      |  662 
 src/axios.js                                                 |  390 
 src/api/tool/datasource.js                                   |   78 
 src/directive/drag.js                                        |   67 
 src/api/desk/notice.js                                       |   98 
 src/api/system/dictbiz.js                                    |  142 
 src/utils/cesium/compressImage2.js                           |   60 
 src/utils/sensitive.js                                       |  144 
 src/utils/validate.js                                        |  356 
 src/config/env.js                                            |    4 
 src/store/modules/dict.js                                    |   64 
 src/api/system/post.js                                       |   94 
 package.json                                                 |    6 
 .prettierrc.json                                             |   23 
 src/api/system/tenant.js                                     |  196 
 src/store/modules/logs.js                                    |   92 
 src/api/job/jobinfo.js                                       |  124 
 117 files changed, 15,262 insertions(+), 15,854 deletions(-)

diff --git a/.prettierrc.json b/.prettierrc.json
index 53cd5bc..aaa321c 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -1,9 +1,24 @@
 {
-  "printWidth": 120,
+  "printWidth": 100,
   "tabWidth": 2,
-  "semi": true,
+  "semi": false,
   "singleAttributePerLine": false,
   "bracketSpacing": true,
   "singleQuote": true,
-  "arrowParens": "avoid"
-}
+  "arrowParens": "avoid",
+  "endOfLine": "crlf",
+  "bracketSameLine": false,
+  "proseWrap": "preserve",
+  "useTabs": true,
+  "trailingComma": "es5",
+  "overrides": [
+    {
+      "files": "*.scss",
+      "options": {
+        "parser": "scss",
+        "tabWidth": 4,
+        "singleQuote": false
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 0a13a79..de29db4 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
     "prod": "vite --mode production",
     "build:dev": "vite build --mode development",
     "build:prod": "vite build --mode production",
-    "serve": "vite preview --host"
+    "serve": "vite preview --host",
+    "format": "prettier --write \"src/**/*.+(js|ts|jsx|tsx)\""
   },
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
@@ -16,7 +17,6 @@
     "@smallwei/avue": "^3.6.2",
     "animate.css": "^4.1.1",
     "avue-plugin-ueditor": "^1.0.4",
-    "@turf/turf": "^6.5.0",
     "axios": "^1.8.3",
     "cesium": "^1.126.0",
     "codemirror": "^5.65.16",
@@ -52,4 +52,4 @@
     "vite-plugin-svg-icons": "^2.0.1",
     "vite-plugin-vue-setup-extend": "^0.4.0"
   }
-}
+}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2eaf77a..1017b5c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,2913 +1,185 @@
-lockfileVersion: '9.0'
+lockfileVersion: '6.0'
 
 settings:
   autoInstallPeers: true
   excludeLinksFromLockfile: false
 
-importers:
+dependencies:
+  '@element-plus/icons-vue':
+    specifier: ^2.3.1
+    version: 2.3.1(vue@3.5.13)
+  '@saber/nf-design-base-elp':
+    specifier: ^1.3.0
+    version: 1.3.0
+  '@saber/nf-form-design-elp':
+    specifier: ^1.4.1
+    version: 1.4.1(vue@3.5.13)
+  '@saber/nf-form-elp':
+    specifier: ^1.4.4
+    version: 1.4.4
+  '@smallwei/avue':
+    specifier: ^3.6.2
+    version: 3.6.2(element-plus@2.9.3)(vue@3.5.13)
+  '@turf/turf':
+    specifier: ^6.5.0
+    version: 6.5.0
+  animate.css:
+    specifier: ^4.1.1
+    version: 4.1.1
+  avue-plugin-ueditor:
+    specifier: ^1.0.4
+    version: 1.0.4(axios@1.8.3)(vue@3.5.13)
+  axios:
+    specifier: ^1.8.3
+    version: 1.8.3
+  cesium:
+    specifier: ^1.126.0
+    version: 1.126.0
+  codemirror:
+    specifier: ^5.65.16
+    version: 5.65.16
+  crypto-js:
+    specifier: ^4.1.1
+    version: 4.1.1
+  dayjs:
+    specifier: ^1.10.6
+    version: 1.10.6
+  disable-devtool:
+    specifier: ^0.3.8
+    version: 0.3.8
+  echarts:
+    specifier: ^5.6.0
+    version: 5.6.0
+  element-plus:
+    specifier: ^2.9.3
+    version: 2.9.3(vue@3.5.13)
+  highlight.js:
+    specifier: ^11.9.0
+    version: 11.9.0
+  js-base64:
+    specifier: ^3.7.4
+    version: 3.7.4
+  js-cookie:
+    specifier: ^3.0.0
+    version: 3.0.0
+  js-md5:
+    specifier: ^0.7.3
+    version: 0.7.3
+  lodash:
+    specifier: ^4.17.21
+    version: 4.17.21
+  nprogress:
+    specifier: ^0.2.0
+    version: 0.2.0
+  postcss-pxtorem:
+    specifier: ^6.1.0
+    version: 6.1.0(postcss@8.5.3)
+  reconnecting-websocket:
+    specifier: ^4.4.0
+    version: 4.4.0
+  sm-crypto:
+    specifier: ^0.3.13
+    version: 0.3.13
+  vue:
+    specifier: ^3.5.13
+    version: 3.5.13
+  vue-i18n:
+    specifier: ^9.1.9
+    version: 9.1.9(vue@3.5.13)
+  vue-router:
+    specifier: ^4.3.2
+    version: 4.3.2(vue@3.5.13)
+  vue3-clipboard:
+    specifier: ^1.0.0
+    version: 1.0.0(vue@3.5.13)
+  vuex:
+    specifier: ^4.1.0
+    version: 4.1.0(vue@3.5.13)
 
-  .:
-    dependencies:
-      '@element-plus/icons-vue':
-        specifier: ^2.3.1
-        version: 2.3.1(vue@3.5.13)
-      '@saber/nf-design-base-elp':
-        specifier: ^1.3.0
-        version: 1.3.0
-      '@saber/nf-form-design-elp':
-        specifier: ^1.4.1
-        version: 1.4.1(vue@3.5.13)
-      '@saber/nf-form-elp':
-        specifier: ^1.4.4
-        version: 1.4.7
-      '@smallwei/avue':
-        specifier: ^3.6.2
-        version: 3.6.3(element-plus@2.9.7(vue@3.5.13))(vue@3.5.13)
-      '@turf/turf':
-        specifier: ^6.5.0
-        version: 6.5.0
-      animate.css:
-        specifier: ^4.1.1
-        version: 4.1.1
-      avue-plugin-ueditor:
-        specifier: ^1.0.4
-        version: 1.0.4(axios@1.8.4)(vue@3.5.13)
-      axios:
-        specifier: ^1.8.3
-        version: 1.8.4
-      cesium:
-        specifier: ^1.126.0
-        version: 1.127.0
-      codemirror:
-        specifier: ^5.65.16
-        version: 5.65.19
-      crypto-js:
-        specifier: ^4.1.1
-        version: 4.2.0
-      dayjs:
-        specifier: ^1.10.6
-        version: 1.11.13
-      disable-devtool:
-        specifier: ^0.3.8
-        version: 0.3.8
-      echarts:
-        specifier: ^5.6.0
-        version: 5.6.0
-      element-plus:
-        specifier: ^2.9.3
-        version: 2.9.7(vue@3.5.13)
-      highlight.js:
-        specifier: ^11.9.0
-        version: 11.11.1
-      js-base64:
-        specifier: ^3.7.4
-        version: 3.7.7
-      js-cookie:
-        specifier: ^3.0.0
-        version: 3.0.5
-      js-md5:
-        specifier: ^0.7.3
-        version: 0.7.3
-      lodash:
-        specifier: ^4.17.21
-        version: 4.17.21
-      nprogress:
-        specifier: ^0.2.0
-        version: 0.2.0
-      postcss-pxtorem:
-        specifier: ^6.1.0
-        version: 6.1.0(postcss@5.2.18)
-      sm-crypto:
-        specifier: ^0.3.13
-        version: 0.3.13
-      vue:
-        specifier: ^3.5.13
-        version: 3.5.13
-      vue-i18n:
-        specifier: ^9.1.9
-        version: 9.14.3(vue@3.5.13)
-      vue-router:
-        specifier: ^4.3.2
-        version: 4.5.0(vue@3.5.13)
-      vue3-clipboard:
-        specifier: ^1.0.0
-        version: 1.0.0(vue@3.5.13)
-      vuex:
-        specifier: ^4.1.0
-        version: 4.1.0(vue@3.5.13)
-    devDependencies:
-      '@vitejs/plugin-vue':
-        specifier: ^5.0.4
-        version: 5.2.3(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0))(vue@3.5.13)
-      '@vue/compiler-sfc':
-        specifier: ^3.4.27
-        version: 3.5.13
-      prettier:
-        specifier: ^2.8.7
-        version: 2.8.8
-      sass:
-        specifier: ^1.85.1
-        version: 1.86.0
-      terser:
-        specifier: ^5.31.1
-        version: 5.39.0
-      unplugin-auto-import:
-        specifier: ^0.11.2
-        version: 0.11.5(@vueuse/core@9.13.0(vue@3.5.13))(rollup@4.37.0)
-      vite:
-        specifier: ^5.2.12
-        version: 5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)
-      vite-plugin-compression:
-        specifier: ^0.5.1
-        version: 0.5.1(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0))
-      vite-plugin-svg-icons:
-        specifier: ^2.0.1
-        version: 2.0.1(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0))
-      vite-plugin-vue-setup-extend:
-        specifier: ^0.4.0
-        version: 0.4.0(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0))
+devDependencies:
+  '@vitejs/plugin-vue':
+    specifier: ^5.0.4
+    version: 5.0.4(vite@5.2.12)(vue@3.5.13)
+  '@vue/compiler-sfc':
+    specifier: ^3.4.27
+    version: 3.4.27
+  prettier:
+    specifier: ^2.8.7
+    version: 2.8.7
+  sass:
+    specifier: ^1.85.1
+    version: 1.85.1
+  terser:
+    specifier: ^5.31.1
+    version: 5.31.1
+  unplugin-auto-import:
+    specifier: ^0.11.2
+    version: 0.11.2
+  vite:
+    specifier: ^5.2.12
+    version: 5.2.12(sass@1.85.1)(terser@5.31.1)
+  vite-plugin-compression:
+    specifier: ^0.5.1
+    version: 0.5.1(vite@5.2.12)
+  vite-plugin-svg-icons:
+    specifier: ^2.0.1
+    version: 2.0.1(vite@5.2.12)
+  vite-plugin-vue-setup-extend:
+    specifier: ^0.4.0
+    version: 0.4.0(vite@5.2.12)
 
 packages:
 
-  '@amap/amap-jsapi-loader@1.0.1':
+  /@amap/amap-jsapi-loader@1.0.1:
     resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==}
+    dev: false
 
-  '@antfu/utils@0.7.10':
-    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+  /@antfu/utils@0.5.2:
+    resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==}
+    dev: true
 
-  '@babel/helper-string-parser@7.25.9':
+  /@babel/helper-string-parser@7.25.9:
     resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.25.9':
+  /@babel/helper-validator-identifier@7.25.9:
     resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/parser@7.27.0':
+  /@babel/parser@7.27.0:
     resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
     engines: {node: '>=6.0.0'}
     hasBin: true
-
-  '@babel/runtime@7.27.0':
-    resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
-    engines: {node: '>=6.9.0'}
-
-  '@babel/types@7.27.0':
-    resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
-    engines: {node: '>=6.9.0'}
-
-  '@bpmn-io/diagram-js-ui@0.2.3':
-    resolution: {integrity: sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==}
-
-  '@cesium/engine@15.0.0':
-    resolution: {integrity: sha512-jimj7khIf/mBkejsMZ+n6Y9PPvXh4QmWKkz2ekFz59icDCeGj8ZJrzl5p0caqiK/372mnHOwmYFWYEwThEw2ew==}
-    engines: {node: '>=14.0.0'}
-
-  '@cesium/widgets@11.0.0':
-    resolution: {integrity: sha512-4ELgFuU2uwkvD6NI9MHIWNFKjmyI9wlDzZ9NuoPFSnUhf9XfVBI8sJekGx5dijxjK2S3aCuxB3dtUkdDZEsQmA==}
-    engines: {node: '>=14.0.0'}
-
-  '@ctrl/tinycolor@3.6.1':
-    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
-    engines: {node: '>=10'}
-
-  '@element-plus/icons-vue@2.3.1':
-    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
-    peerDependencies:
-      vue: ^3.2.0
-
-  '@esbuild/aix-ppc64@0.21.5':
-    resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [aix]
-
-  '@esbuild/android-arm64@0.21.5':
-    resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-
-  '@esbuild/android-arm@0.21.5':
-    resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-
-  '@esbuild/android-x64@0.21.5':
-    resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-
-  '@esbuild/darwin-arm64@0.21.5':
-    resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-
-  '@esbuild/darwin-x64@0.21.5':
-    resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-
-  '@esbuild/freebsd-arm64@0.21.5':
-    resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-
-  '@esbuild/freebsd-x64@0.21.5':
-    resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-
-  '@esbuild/linux-arm64@0.21.5':
-    resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-
-  '@esbuild/linux-arm@0.21.5':
-    resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-
-  '@esbuild/linux-ia32@0.21.5':
-    resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-
-  '@esbuild/linux-loong64@0.21.5':
-    resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-
-  '@esbuild/linux-mips64el@0.21.5':
-    resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-
-  '@esbuild/linux-ppc64@0.21.5':
-    resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-
-  '@esbuild/linux-riscv64@0.21.5':
-    resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-
-  '@esbuild/linux-s390x@0.21.5':
-    resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-
-  '@esbuild/linux-x64@0.21.5':
-    resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-
-  '@esbuild/netbsd-x64@0.21.5':
-    resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-
-  '@esbuild/openbsd-x64@0.21.5':
-    resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-
-  '@esbuild/sunos-x64@0.21.5':
-    resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-
-  '@esbuild/win32-arm64@0.21.5':
-    resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-
-  '@esbuild/win32-ia32@0.21.5':
-    resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-
-  '@esbuild/win32-x64@0.21.5':
-    resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-
-  '@floating-ui/core@1.6.9':
-    resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
-
-  '@floating-ui/dom@1.6.13':
-    resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
-
-  '@floating-ui/utils@0.2.9':
-    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
-
-  '@intlify/core-base@9.14.3':
-    resolution: {integrity: sha512-nbJ7pKTlXFnaXPblyfiH6awAx1C0PWNNuqXAR74yRwgi5A/Re/8/5fErLY0pv4R8+EHj3ZaThMHdnuC/5OBa6g==}
-    engines: {node: '>= 16'}
-
-  '@intlify/message-compiler@9.14.3':
-    resolution: {integrity: sha512-ANwC226BQdd+MpJ36rOYkChSESfPwu3Ss2Faw0RHTOknYLoHTX6V6e/JjIKVDMbzs0/H/df/rO6yU0SPiWHqNg==}
-    engines: {node: '>= 16'}
-
-  '@intlify/shared@9.14.3':
-    resolution: {integrity: sha512-hJXz9LA5VG7qNE00t50bdzDv8Z4q9fpcL81wj4y4duKavrv0KM8YNLTwXNEFINHjTsfrG9TXvPuEjVaAvZ7yWg==}
-    engines: {node: '>= 16'}
-
-  '@jridgewell/gen-mapping@0.3.8':
-    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
-    engines: {node: '>=6.0.0'}
-
-  '@jridgewell/resolve-uri@3.1.2':
-    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
-    engines: {node: '>=6.0.0'}
-
-  '@jridgewell/set-array@1.2.1':
-    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
-    engines: {node: '>=6.0.0'}
-
-  '@jridgewell/source-map@0.3.6':
-    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
-
-  '@jridgewell/sourcemap-codec@1.5.0':
-    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
-
-  '@jridgewell/trace-mapping@0.3.25':
-    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
-
-  '@nodelib/fs.scandir@2.1.5':
-    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
-    engines: {node: '>= 8'}
-
-  '@nodelib/fs.stat@2.0.5':
-    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
-    engines: {node: '>= 8'}
-
-  '@nodelib/fs.walk@1.2.8':
-    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
-    engines: {node: '>= 8'}
-
-  '@parcel/watcher-android-arm64@2.5.1':
-    resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm64]
-    os: [android]
-
-  '@parcel/watcher-darwin-arm64@2.5.1':
-    resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm64]
-    os: [darwin]
-
-  '@parcel/watcher-darwin-x64@2.5.1':
-    resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [x64]
-    os: [darwin]
-
-  '@parcel/watcher-freebsd-x64@2.5.1':
-    resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [x64]
-    os: [freebsd]
-
-  '@parcel/watcher-linux-arm-glibc@2.5.1':
-    resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm]
-    os: [linux]
-    libc: [glibc]
-
-  '@parcel/watcher-linux-arm-musl@2.5.1':
-    resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm]
-    os: [linux]
-    libc: [musl]
-
-  '@parcel/watcher-linux-arm64-glibc@2.5.1':
-    resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm64]
-    os: [linux]
-    libc: [glibc]
-
-  '@parcel/watcher-linux-arm64-musl@2.5.1':
-    resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm64]
-    os: [linux]
-    libc: [musl]
-
-  '@parcel/watcher-linux-x64-glibc@2.5.1':
-    resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [x64]
-    os: [linux]
-    libc: [glibc]
-
-  '@parcel/watcher-linux-x64-musl@2.5.1':
-    resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [x64]
-    os: [linux]
-    libc: [musl]
-
-  '@parcel/watcher-win32-arm64@2.5.1':
-    resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [arm64]
-    os: [win32]
-
-  '@parcel/watcher-win32-ia32@2.5.1':
-    resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [ia32]
-    os: [win32]
-
-  '@parcel/watcher-win32-x64@2.5.1':
-    resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
-    engines: {node: '>= 10.0.0'}
-    cpu: [x64]
-    os: [win32]
-
-  '@parcel/watcher@2.5.1':
-    resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
-    engines: {node: '>= 10.0.0'}
-
-  '@protobufjs/aspromise@1.1.2':
-    resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
-
-  '@protobufjs/base64@1.1.2':
-    resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
-
-  '@protobufjs/codegen@2.0.4':
-    resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
-
-  '@protobufjs/eventemitter@1.1.0':
-    resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
-
-  '@protobufjs/fetch@1.1.0':
-    resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
-
-  '@protobufjs/float@1.0.2':
-    resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
-
-  '@protobufjs/inquire@1.1.0':
-    resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
-
-  '@protobufjs/path@1.1.2':
-    resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
-
-  '@protobufjs/pool@1.1.0':
-    resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
-
-  '@protobufjs/utf8@1.1.0':
-    resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
-
-  '@rollup/pluginutils@5.1.4':
-    resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
-    engines: {node: '>=14.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
-    peerDependenciesMeta:
-      rollup:
-        optional: true
-
-  '@rollup/rollup-android-arm-eabi@4.37.0':
-    resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==}
-    cpu: [arm]
-    os: [android]
-
-  '@rollup/rollup-android-arm64@4.37.0':
-    resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==}
-    cpu: [arm64]
-    os: [android]
-
-  '@rollup/rollup-darwin-arm64@4.37.0':
-    resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==}
-    cpu: [arm64]
-    os: [darwin]
-
-  '@rollup/rollup-darwin-x64@4.37.0':
-    resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==}
-    cpu: [x64]
-    os: [darwin]
-
-  '@rollup/rollup-freebsd-arm64@4.37.0':
-    resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==}
-    cpu: [arm64]
-    os: [freebsd]
-
-  '@rollup/rollup-freebsd-x64@4.37.0':
-    resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==}
-    cpu: [x64]
-    os: [freebsd]
-
-  '@rollup/rollup-linux-arm-gnueabihf@4.37.0':
-    resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==}
-    cpu: [arm]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-arm-musleabihf@4.37.0':
-    resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==}
-    cpu: [arm]
-    os: [linux]
-    libc: [musl]
-
-  '@rollup/rollup-linux-arm64-gnu@4.37.0':
-    resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==}
-    cpu: [arm64]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-arm64-musl@4.37.0':
-    resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==}
-    cpu: [arm64]
-    os: [linux]
-    libc: [musl]
-
-  '@rollup/rollup-linux-loongarch64-gnu@4.37.0':
-    resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==}
-    cpu: [loong64]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
-    resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==}
-    cpu: [ppc64]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-riscv64-gnu@4.37.0':
-    resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==}
-    cpu: [riscv64]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-riscv64-musl@4.37.0':
-    resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==}
-    cpu: [riscv64]
-    os: [linux]
-    libc: [musl]
-
-  '@rollup/rollup-linux-s390x-gnu@4.37.0':
-    resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==}
-    cpu: [s390x]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-x64-gnu@4.37.0':
-    resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==}
-    cpu: [x64]
-    os: [linux]
-    libc: [glibc]
-
-  '@rollup/rollup-linux-x64-musl@4.37.0':
-    resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==}
-    cpu: [x64]
-    os: [linux]
-    libc: [musl]
-
-  '@rollup/rollup-win32-arm64-msvc@4.37.0':
-    resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==}
-    cpu: [arm64]
-    os: [win32]
-
-  '@rollup/rollup-win32-ia32-msvc@4.37.0':
-    resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==}
-    cpu: [ia32]
-    os: [win32]
-
-  '@rollup/rollup-win32-x64-msvc@4.37.0':
-    resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==}
-    cpu: [x64]
-    os: [win32]
-
-  '@saber/nf-design-base-elp@1.3.0':
-    resolution: {integrity: sha512-sKUkhErjggUjH+hoBTVpcUC7j38KAkGUloIVXIRl6YP1WT14QXvtf3iu8iCIOBO8iPKHgrBiq4h80UW9+qqbjQ==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-design-base-elp/-/1.3.0/nf-design-base-elp-1.3.0.tgz}
-
-  '@saber/nf-form-design-elp@1.4.1':
-    resolution: {integrity: sha512-O4/ZkOIyxqOplHsRlP/LfDlhCbHNtIrS6n+8+N+0JLYb76a/14X07abAHlpsAg2p0yY62OuuRBu8mpIvh6C40Q==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-design-elp/-/1.4.1/nf-form-design-elp-1.4.1.tgz}
-    engines: {node: ^18.0.0 || >=20.0.0}
-
-  '@saber/nf-form-elp@1.4.7':
-    resolution: {integrity: sha512-7//t1GSlUg3BUAQcfdN6Icd1GLhdDHDCpefPcF7lqrUTV96K6m6n9h7z4t7bS9wwcGh6AJFGY3Rolv9oTXiqjg==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-elp/-/1.4.7/nf-form-elp-1.4.7.tgz}
-    engines: {node: ^18.0.0 || >=20.0.0}
-
-  '@smallwei/avue@3.6.3':
-    resolution: {integrity: sha512-d0OiyA0i7W8PM4KhrSq+7TsrtWXghl+9MyB2oPEUYvDL4oWQqKOqXUyzK2bRgEnVktfXRv+Jrj1KLflb92gxGA==}
-    peerDependencies:
-      element-plus: '>=2.2.0'
-      vue: '>=3.2.0'
-
-  '@sxzz/popperjs-es@2.11.7':
-    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
-
-  '@transloadit/prettier-bytes@0.0.7':
-    resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
-
-  '@trysound/sax@0.2.0':
-    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
-    engines: {node: '>=10.13.0'}
-
-  '@turf/along@6.5.0':
-    resolution: {integrity: sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==}
-
-  '@turf/angle@6.5.0':
-    resolution: {integrity: sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==}
-
-  '@turf/area@6.5.0':
-    resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==}
-
-  '@turf/bbox-clip@6.5.0':
-    resolution: {integrity: sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==}
-
-  '@turf/bbox-polygon@6.5.0':
-    resolution: {integrity: sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==}
-
-  '@turf/bbox@6.5.0':
-    resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==}
-
-  '@turf/bearing@6.5.0':
-    resolution: {integrity: sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==}
-
-  '@turf/bezier-spline@6.5.0':
-    resolution: {integrity: sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==}
-
-  '@turf/boolean-clockwise@6.5.0':
-    resolution: {integrity: sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==}
-
-  '@turf/boolean-contains@6.5.0':
-    resolution: {integrity: sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==}
-
-  '@turf/boolean-crosses@6.5.0':
-    resolution: {integrity: sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==}
-
-  '@turf/boolean-disjoint@6.5.0':
-    resolution: {integrity: sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==}
-
-  '@turf/boolean-equal@6.5.0':
-    resolution: {integrity: sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==}
-
-  '@turf/boolean-intersects@6.5.0':
-    resolution: {integrity: sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==}
-
-  '@turf/boolean-overlap@6.5.0':
-    resolution: {integrity: sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==}
-
-  '@turf/boolean-parallel@6.5.0':
-    resolution: {integrity: sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==}
-
-  '@turf/boolean-point-in-polygon@6.5.0':
-    resolution: {integrity: sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==}
-
-  '@turf/boolean-point-on-line@6.5.0':
-    resolution: {integrity: sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==}
-
-  '@turf/boolean-within@6.5.0':
-    resolution: {integrity: sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==}
-
-  '@turf/buffer@6.5.0':
-    resolution: {integrity: sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==}
-
-  '@turf/center-mean@6.5.0':
-    resolution: {integrity: sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==}
-
-  '@turf/center-median@6.5.0':
-    resolution: {integrity: sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==}
-
-  '@turf/center-of-mass@6.5.0':
-    resolution: {integrity: sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==}
-
-  '@turf/center@6.5.0':
-    resolution: {integrity: sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==}
-
-  '@turf/centroid@6.5.0':
-    resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==}
-
-  '@turf/circle@6.5.0':
-    resolution: {integrity: sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==}
-
-  '@turf/clean-coords@6.5.0':
-    resolution: {integrity: sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==}
-
-  '@turf/clone@6.5.0':
-    resolution: {integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==}
-
-  '@turf/clusters-dbscan@6.5.0':
-    resolution: {integrity: sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==}
-
-  '@turf/clusters-kmeans@6.5.0':
-    resolution: {integrity: sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==}
-
-  '@turf/clusters@6.5.0':
-    resolution: {integrity: sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==}
-
-  '@turf/collect@6.5.0':
-    resolution: {integrity: sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==}
-
-  '@turf/combine@6.5.0':
-    resolution: {integrity: sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==}
-
-  '@turf/concave@6.5.0':
-    resolution: {integrity: sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==}
-
-  '@turf/convex@6.5.0':
-    resolution: {integrity: sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==}
-
-  '@turf/destination@6.5.0':
-    resolution: {integrity: sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==}
-
-  '@turf/difference@6.5.0':
-    resolution: {integrity: sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==}
-
-  '@turf/dissolve@6.5.0':
-    resolution: {integrity: sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==}
-
-  '@turf/distance-weight@6.5.0':
-    resolution: {integrity: sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==}
-
-  '@turf/distance@6.5.0':
-    resolution: {integrity: sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==}
-
-  '@turf/ellipse@6.5.0':
-    resolution: {integrity: sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==}
-
-  '@turf/envelope@6.5.0':
-    resolution: {integrity: sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==}
-
-  '@turf/explode@6.5.0':
-    resolution: {integrity: sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==}
-
-  '@turf/flatten@6.5.0':
-    resolution: {integrity: sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==}
-
-  '@turf/flip@6.5.0':
-    resolution: {integrity: sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==}
-
-  '@turf/great-circle@6.5.0':
-    resolution: {integrity: sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==}
-
-  '@turf/helpers@6.5.0':
-    resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==}
-
-  '@turf/hex-grid@6.5.0':
-    resolution: {integrity: sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==}
-
-  '@turf/interpolate@6.5.0':
-    resolution: {integrity: sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==}
-
-  '@turf/intersect@6.5.0':
-    resolution: {integrity: sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==}
-
-  '@turf/invariant@6.5.0':
-    resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==}
-
-  '@turf/isobands@6.5.0':
-    resolution: {integrity: sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==}
-
-  '@turf/isolines@6.5.0':
-    resolution: {integrity: sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==}
-
-  '@turf/kinks@6.5.0':
-    resolution: {integrity: sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==}
-
-  '@turf/length@6.5.0':
-    resolution: {integrity: sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==}
-
-  '@turf/line-arc@6.5.0':
-    resolution: {integrity: sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==}
-
-  '@turf/line-chunk@6.5.0':
-    resolution: {integrity: sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==}
-
-  '@turf/line-intersect@6.5.0':
-    resolution: {integrity: sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==}
-
-  '@turf/line-offset@6.5.0':
-    resolution: {integrity: sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==}
-
-  '@turf/line-overlap@6.5.0':
-    resolution: {integrity: sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==}
-
-  '@turf/line-segment@6.5.0':
-    resolution: {integrity: sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==}
-
-  '@turf/line-slice-along@6.5.0':
-    resolution: {integrity: sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==}
-
-  '@turf/line-slice@6.5.0':
-    resolution: {integrity: sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==}
-
-  '@turf/line-split@6.5.0':
-    resolution: {integrity: sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==}
-
-  '@turf/line-to-polygon@6.5.0':
-    resolution: {integrity: sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==}
-
-  '@turf/mask@6.5.0':
-    resolution: {integrity: sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==}
-
-  '@turf/meta@6.5.0':
-    resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==}
-
-  '@turf/midpoint@6.5.0':
-    resolution: {integrity: sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==}
-
-  '@turf/moran-index@6.5.0':
-    resolution: {integrity: sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==}
-
-  '@turf/nearest-point-on-line@6.5.0':
-    resolution: {integrity: sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==}
-
-  '@turf/nearest-point-to-line@6.5.0':
-    resolution: {integrity: sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==}
-
-  '@turf/nearest-point@6.5.0':
-    resolution: {integrity: sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==}
-
-  '@turf/planepoint@6.5.0':
-    resolution: {integrity: sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==}
-
-  '@turf/point-grid@6.5.0':
-    resolution: {integrity: sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==}
-
-  '@turf/point-on-feature@6.5.0':
-    resolution: {integrity: sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==}
-
-  '@turf/point-to-line-distance@6.5.0':
-    resolution: {integrity: sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==}
-
-  '@turf/points-within-polygon@6.5.0':
-    resolution: {integrity: sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==}
-
-  '@turf/polygon-smooth@6.5.0':
-    resolution: {integrity: sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==}
-
-  '@turf/polygon-tangents@6.5.0':
-    resolution: {integrity: sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==}
-
-  '@turf/polygon-to-line@6.5.0':
-    resolution: {integrity: sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==}
-
-  '@turf/polygonize@6.5.0':
-    resolution: {integrity: sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==}
-
-  '@turf/projection@6.5.0':
-    resolution: {integrity: sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==}
-
-  '@turf/random@6.5.0':
-    resolution: {integrity: sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==}
-
-  '@turf/rectangle-grid@6.5.0':
-    resolution: {integrity: sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==}
-
-  '@turf/rewind@6.5.0':
-    resolution: {integrity: sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==}
-
-  '@turf/rhumb-bearing@6.5.0':
-    resolution: {integrity: sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==}
-
-  '@turf/rhumb-destination@6.5.0':
-    resolution: {integrity: sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==}
-
-  '@turf/rhumb-distance@6.5.0':
-    resolution: {integrity: sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==}
-
-  '@turf/sample@6.5.0':
-    resolution: {integrity: sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==}
-
-  '@turf/sector@6.5.0':
-    resolution: {integrity: sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==}
-
-  '@turf/shortest-path@6.5.0':
-    resolution: {integrity: sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==}
-
-  '@turf/simplify@6.5.0':
-    resolution: {integrity: sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==}
-
-  '@turf/square-grid@6.5.0':
-    resolution: {integrity: sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==}
-
-  '@turf/square@6.5.0':
-    resolution: {integrity: sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==}
-
-  '@turf/standard-deviational-ellipse@6.5.0':
-    resolution: {integrity: sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==}
-
-  '@turf/tag@6.5.0':
-    resolution: {integrity: sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==}
-
-  '@turf/tesselate@6.5.0':
-    resolution: {integrity: sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==}
-
-  '@turf/tin@6.5.0':
-    resolution: {integrity: sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==}
-
-  '@turf/transform-rotate@6.5.0':
-    resolution: {integrity: sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==}
-
-  '@turf/transform-scale@6.5.0':
-    resolution: {integrity: sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==}
-
-  '@turf/transform-translate@6.5.0':
-    resolution: {integrity: sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==}
-
-  '@turf/triangle-grid@6.5.0':
-    resolution: {integrity: sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==}
-
-  '@turf/truncate@6.5.0':
-    resolution: {integrity: sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==}
-
-  '@turf/turf@6.5.0':
-    resolution: {integrity: sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==}
-
-  '@turf/union@6.5.0':
-    resolution: {integrity: sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==}
-
-  '@turf/unkink-polygon@6.5.0':
-    resolution: {integrity: sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==}
-
-  '@turf/voronoi@6.5.0':
-    resolution: {integrity: sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==}
-
-  '@tweenjs/tween.js@25.0.0':
-    resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==}
-
-  '@types/estree@1.0.6':
-    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
-
-  '@types/event-emitter@0.3.5':
-    resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==}
-
-  '@types/geojson@7946.0.8':
-    resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==}
-
-  '@types/lodash-es@4.17.12':
-    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
-
-  '@types/lodash@4.17.16':
-    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
-
-  '@types/node@22.13.13':
-    resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==}
-
-  '@types/svgo@2.6.4':
-    resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
-
-  '@types/trusted-types@2.0.7':
-    resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-
-  '@types/web-bluetooth@0.0.16':
-    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
-
-  '@uppy/companion-client@2.2.2':
-    resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==}
-
-  '@uppy/core@2.3.4':
-    resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==}
-
-  '@uppy/store-default@2.1.1':
-    resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==}
-
-  '@uppy/utils@4.1.3':
-    resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==}
-
-  '@uppy/xhr-upload@2.1.3':
-    resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==}
-    peerDependencies:
-      '@uppy/core': ^2.3.3
-
-  '@vitejs/plugin-vue@5.2.3':
-    resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    peerDependencies:
-      vite: ^5.0.0 || ^6.0.0
-      vue: ^3.2.25
-
-  '@vue/compiler-core@3.5.13':
-    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
-
-  '@vue/compiler-dom@3.5.13':
-    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
-
-  '@vue/compiler-sfc@3.5.13':
-    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
-
-  '@vue/compiler-ssr@3.5.13':
-    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
-
-  '@vue/devtools-api@6.6.4':
-    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
-
-  '@vue/reactivity@3.5.13':
-    resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
-
-  '@vue/runtime-core@3.5.13':
-    resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
-
-  '@vue/runtime-dom@3.5.13':
-    resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
-
-  '@vue/server-renderer@3.5.13':
-    resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
-    peerDependencies:
-      vue: 3.5.13
-
-  '@vue/shared@3.5.13':
-    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
-
-  '@vueuse/core@9.13.0':
-    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
-
-  '@vueuse/metadata@9.13.0':
-    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
-
-  '@vueuse/shared@9.13.0':
-    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
-
-  '@wangeditor/basic-modules@1.1.7':
-    resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
-    peerDependencies:
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      lodash.throttle: ^4.1.1
-      nanoid: ^3.2.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/code-highlight@1.0.3':
-    resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==}
-    peerDependencies:
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/core@1.1.19':
-    resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==}
-    peerDependencies:
-      '@uppy/core': ^2.1.1
-      '@uppy/xhr-upload': ^2.0.3
-      dom7: ^3.0.0
-      is-hotkey: ^0.2.0
-      lodash.camelcase: ^4.3.0
-      lodash.clonedeep: ^4.5.0
-      lodash.debounce: ^4.0.8
-      lodash.foreach: ^4.5.0
-      lodash.isequal: ^4.5.0
-      lodash.throttle: ^4.1.1
-      lodash.toarray: ^4.4.0
-      nanoid: ^3.2.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/editor-for-vue@5.1.12':
-    resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==}
-    peerDependencies:
-      '@wangeditor/editor': '>=5.1.0'
-      vue: ^3.0.5
-
-  '@wangeditor/editor@5.1.23':
-    resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==}
-
-  '@wangeditor/list-module@1.0.5':
-    resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==}
-    peerDependencies:
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/table-module@1.1.4':
-    resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==}
-    peerDependencies:
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      lodash.isequal: ^4.5.0
-      lodash.throttle: ^4.1.1
-      nanoid: ^3.2.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/upload-image-module@1.0.2':
-    resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==}
-    peerDependencies:
-      '@uppy/core': ^2.0.3
-      '@uppy/xhr-upload': ^2.0.3
-      '@wangeditor/basic-modules': 1.x
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      lodash.foreach: ^4.5.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@wangeditor/video-module@1.1.4':
-    resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==}
-    peerDependencies:
-      '@uppy/core': ^2.1.4
-      '@uppy/xhr-upload': ^2.0.7
-      '@wangeditor/core': 1.x
-      dom7: ^3.0.0
-      nanoid: ^3.2.0
-      slate: ^0.72.0
-      snabbdom: ^3.1.0
-
-  '@zip.js/zip.js@2.7.57':
-    resolution: {integrity: sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==}
-    engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
-
-  acorn@8.14.1:
-    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-
-  animate.css@4.1.1:
-    resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==}
-
-  ansi-regex@2.1.1:
-    resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
-    engines: {node: '>=0.10.0'}
-
-  ansi-styles@2.2.1:
-    resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
-    engines: {node: '>=0.10.0'}
-
-  ansi-styles@4.3.0:
-    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
-    engines: {node: '>=8'}
-
-  arr-diff@4.0.0:
-    resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
-    engines: {node: '>=0.10.0'}
-
-  arr-flatten@1.1.0:
-    resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
-    engines: {node: '>=0.10.0'}
-
-  arr-union@3.1.0:
-    resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
-    engines: {node: '>=0.10.0'}
-
-  array-buffer-byte-length@1.0.2:
-    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
-    engines: {node: '>= 0.4'}
-
-  array-unique@0.3.2:
-    resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
-    engines: {node: '>=0.10.0'}
-
-  arraybuffer.prototype.slice@1.0.4:
-    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
-    engines: {node: '>= 0.4'}
-
-  assign-symbols@1.0.0:
-    resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
-    engines: {node: '>=0.10.0'}
-
-  async-function@1.0.0:
-    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
-    engines: {node: '>= 0.4'}
-
-  async-validator@4.2.5:
-    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
-
-  asynckit@0.4.0:
-    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-
-  atob@2.1.2:
-    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
-    engines: {node: '>= 4.5.0'}
-    hasBin: true
-
-  autolinker@4.1.0:
-    resolution: {integrity: sha512-mYzdZMei1zIXcHVS/LjnuCJG+C/hNi8O+5m0R8YWtrIBWGrjL8CVzEZXxOfH0l1kioEXHNpUJRkgZdyL4GgIHQ==}
-
-  available-typed-arrays@1.0.7:
-    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
-    engines: {node: '>= 0.4'}
-
-  avue-plugin-ueditor@1.0.4:
-    resolution: {integrity: sha512-fFOFsduZI9yK3LE7FpLMqqLJoWp4xGTDj08wmSS2CkBL6H1+P8+7u9lEcvRejnvytUBhv87xKNhHdMuWru1Umg==}
-    peerDependencies:
-      axios: '>=0.18.0'
-      vue: '>=3.2.0'
-
-  axios@1.8.4:
-    resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
-
-  base@0.11.2:
-    resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
-    engines: {node: '>=0.10.0'}
-
-  big.js@5.2.2:
-    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
-
-  bitmap-sdf@1.0.4:
-    resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==}
-
-  bluebird@3.7.2:
-    resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
-
-  boolbase@1.0.0:
-    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
-
-  bpmn-js@11.5.0:
-    resolution: {integrity: sha512-Bdj53UvfiDtGE1wmiBmpgjl5RMLhCGV/C841dyC+t4kBHj7vApAeeHs2Qiycj390HO4B2U8UDROLT7yjdXEEUA==}
-
-  bpmn-moddle@8.1.0:
-    resolution: {integrity: sha512-yI5OAFfYVJwViKTsTsonVfCBPtB3MlefADUORwNIxxBOMp21vnoxuxsdgUWlPH/dvAEZh/+mr8UtqOBNu8NC5Q==}
-
-  braces@2.3.2:
-    resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
-    engines: {node: '>=0.10.0'}
-
-  braces@3.0.3:
-    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
-    engines: {node: '>=8'}
-
-  buffer-from@1.1.2:
-    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
-  cache-base@1.0.1:
-    resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
-    engines: {node: '>=0.10.0'}
-
-  call-bind-apply-helpers@1.0.2:
-    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
-    engines: {node: '>= 0.4'}
-
-  call-bind@1.0.8:
-    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
-    engines: {node: '>= 0.4'}
-
-  call-bound@1.0.4:
-    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
-    engines: {node: '>= 0.4'}
-
-  cesium@1.127.0:
-    resolution: {integrity: sha512-MRGkPb3ClEkAI9viZxxdD3LCu7ydOzOKdJ6/iPtBx1GUsPCZNbgB0IH7wmhwgbxA5sjv4/a90+mvR9CoLP1PWQ==}
-    engines: {node: '>=18.18.0'}
-
-  chalk@1.1.3:
-    resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
-    engines: {node: '>=0.10.0'}
-
-  chalk@4.1.2:
-    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
-    engines: {node: '>=10'}
-
-  chokidar@4.0.3:
-    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
-    engines: {node: '>= 14.16.0'}
-
-  class-utils@0.3.6:
-    resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
-    engines: {node: '>=0.10.0'}
-
-  clipboard@2.0.11:
-    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
-
-  clone@2.1.2:
-    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
-    engines: {node: '>=0.8'}
-
-  clsx@1.2.1:
-    resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
-    engines: {node: '>=6'}
-
-  codemirror@5.65.19:
-    resolution: {integrity: sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==}
-
-  collection-visit@1.0.0:
-    resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
-    engines: {node: '>=0.10.0'}
-
-  color-convert@2.0.1:
-    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
-    engines: {node: '>=7.0.0'}
-
-  color-name@1.1.4:
-    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
-  combined-stream@1.0.8:
-    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
-    engines: {node: '>= 0.8'}
-
-  commander@2.20.3:
-    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
-
-  commander@7.2.0:
-    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
-    engines: {node: '>= 10'}
-
-  component-emitter@1.3.1:
-    resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
-
-  component-event@0.2.1:
-    resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==}
-
-  compute-scroll-into-view@1.0.20:
-    resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
-
-  concaveman@1.2.1:
-    resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==}
-
-  confbox@0.1.8:
-    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
-
-  copy-descriptor@0.1.1:
-    resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
-    engines: {node: '>=0.10.0'}
-
-  cors@2.8.5:
-    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
-    engines: {node: '>= 0.10'}
-
-  countup.js@1.9.3:
-    resolution: {integrity: sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A==}
-
-  countup.js@2.8.0:
-    resolution: {integrity: sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==}
-
-  crypto-js@4.2.0:
-    resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
-
-  css-select@4.3.0:
-    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
-
-  css-tree@1.1.3:
-    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
-    engines: {node: '>=8.0.0'}
-
-  css-what@6.1.0:
-    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
-    engines: {node: '>= 6'}
-
-  csso@4.2.0:
-    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
-    engines: {node: '>=8.0.0'}
-
-  csstype@3.1.3:
-    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
-  d3-array@1.2.4:
-    resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
-
-  d3-geo@1.7.1:
-    resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==}
-
-  d3-voronoi@1.1.2:
-    resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==}
-
-  d@1.0.2:
-    resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
-    engines: {node: '>=0.12'}
-
-  data-view-buffer@1.0.2:
-    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
-    engines: {node: '>= 0.4'}
-
-  data-view-byte-length@1.0.2:
-    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
-    engines: {node: '>= 0.4'}
-
-  data-view-byte-offset@1.0.1:
-    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
-    engines: {node: '>= 0.4'}
-
-  dayjs@1.11.13:
-    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
-
-  debug@2.6.9:
-    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-
-  debug@4.4.0:
-    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-
-  decode-uri-component@0.2.2:
-    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
-    engines: {node: '>=0.10'}
-
-  deep-equal@1.1.2:
-    resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
-    engines: {node: '>= 0.4'}
-
-  define-data-property@1.1.4:
-    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
-    engines: {node: '>= 0.4'}
-
-  define-properties@1.2.1:
-    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
-    engines: {node: '>= 0.4'}
-
-  define-property@0.2.5:
-    resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
-    engines: {node: '>=0.10.0'}
-
-  define-property@1.0.0:
-    resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
-    engines: {node: '>=0.10.0'}
-
-  define-property@2.0.2:
-    resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
-    engines: {node: '>=0.10.0'}
-
-  delayed-stream@1.0.0:
-    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
-    engines: {node: '>=0.4.0'}
-
-  delegate@3.2.0:
-    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
-
-  density-clustering@1.3.0:
-    resolution: {integrity: sha512-icpmBubVTwLnsaor9qH/4tG5+7+f61VcqMN3V3pm9sxxSCt2Jcs0zWOgwZW9ARJYaKD3FumIgHiMOcIMRRAzFQ==}
-
-  detect-libc@1.0.3:
-    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
-    engines: {node: '>=0.10'}
-    hasBin: true
-
-  diagram-js-direct-editing@2.1.2:
-    resolution: {integrity: sha512-VpccLAnLqLF1cp3fk363QUbRVTd/qTcj2oOb+IqgcmOiWszJp7J9Ta6y5GjUvw48hDZpzCatlmWwA4CJ3MaYGQ==}
-    peerDependencies:
-      diagram-js: '*'
-
-  diagram-js@11.13.1:
-    resolution: {integrity: sha512-6kO0rBN6aBIQiMELfv1oX2Ohes/brlIPuOVZUYAioeWM0EyuazhAXgHeq8iKFt29daU9NGRr4n78esGx8QjtjQ==}
-
-  didi@9.0.2:
-    resolution: {integrity: sha512-q2+aj+lnJcUweV7A9pdUrwFr4LHVmRPwTmQLtHPFz4aT7IBoryN6Iy+jmFku+oIzr5ebBkvtBCOb87+dJhb7bg==}
-
-  disable-devtool@0.3.8:
-    resolution: {integrity: sha512-spwifiBbcgDTVEdzoWyH3NjZ1he/OgJmUNXvMgEffJ8Fh2B6mEJjCCEV25wlJSyNXEdGyzKFFRXh4kVDRK/wCg==}
-
-  dom-serializer@0.2.2:
-    resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
-
-  dom-serializer@1.4.1:
-    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
-
-  dom7@3.0.0:
-    resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
-
-  domelementtype@1.3.1:
-    resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
-
-  domelementtype@2.3.0:
-    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
-
-  domhandler@2.4.2:
-    resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
-
-  domhandler@4.3.1:
-    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
-    engines: {node: '>= 4'}
-
-  domify@1.4.2:
-    resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==}
-
-  dompurify@3.2.4:
-    resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==}
-
-  domutils@1.7.0:
-    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
-
-  domutils@2.8.0:
-    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
-
-  draco3d@1.5.7:
-    resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==}
-
-  dunder-proto@1.0.1:
-    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
-    engines: {node: '>= 0.4'}
-
-  earcut@2.2.4:
-    resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
-
-  earcut@3.0.1:
-    resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==}
-
-  echarts@5.6.0:
-    resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
-
-  element-plus@2.9.7:
-    resolution: {integrity: sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==}
-    peerDependencies:
-      vue: ^3.2.0
-
-  emojis-list@3.0.0:
-    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
-    engines: {node: '>= 4'}
-
-  entities@1.1.2:
-    resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
-
-  entities@2.2.0:
-    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
-
-  entities@4.5.0:
-    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
-    engines: {node: '>=0.12'}
-
-  es-abstract@1.23.9:
-    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
-    engines: {node: '>= 0.4'}
-
-  es-define-property@1.0.1:
-    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
-    engines: {node: '>= 0.4'}
-
-  es-errors@1.3.0:
-    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
-    engines: {node: '>= 0.4'}
-
-  es-object-atoms@1.1.1:
-    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
-    engines: {node: '>= 0.4'}
-
-  es-set-tostringtag@2.1.0:
-    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
-    engines: {node: '>= 0.4'}
-
-  es-to-primitive@1.3.0:
-    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
-    engines: {node: '>= 0.4'}
-
-  es5-ext@0.10.64:
-    resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
-    engines: {node: '>=0.10'}
-
-  es6-iterator@2.0.3:
-    resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
-
-  es6-symbol@3.1.4:
-    resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
-    engines: {node: '>=0.12'}
-
-  esbuild@0.21.5:
-    resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
-    engines: {node: '>=12'}
-    hasBin: true
-
-  escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
-  escape-string-regexp@1.0.5:
-    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
-    engines: {node: '>=0.8.0'}
-
-  escape-string-regexp@5.0.0:
-    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
-    engines: {node: '>=12'}
-
-  esniff@2.0.1:
-    resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
-    engines: {node: '>=0.10'}
-
-  estree-walker@2.0.2:
-    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-
-  etag@1.8.1:
-    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
-    engines: {node: '>= 0.6'}
-
-  event-emitter@0.3.5:
-    resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
-
-  expand-brackets@2.1.4:
-    resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
-    engines: {node: '>=0.10.0'}
-
-  ext@1.7.0:
-    resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
-
-  extend-shallow@2.0.1:
-    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
-    engines: {node: '>=0.10.0'}
-
-  extend-shallow@3.0.2:
-    resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
-    engines: {node: '>=0.10.0'}
-
-  extglob@2.0.4:
-    resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
-    engines: {node: '>=0.10.0'}
-
-  fast-glob@3.3.3:
-    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
-    engines: {node: '>=8.6.0'}
-
-  fastq@1.19.1:
-    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
-
-  fill-range@4.0.0:
-    resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
-    engines: {node: '>=0.10.0'}
-
-  fill-range@7.1.1:
-    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
-    engines: {node: '>=8'}
-
-  follow-redirects@1.15.9:
-    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      debug: '*'
-    peerDependenciesMeta:
-      debug:
-        optional: true
-
-  for-each@0.3.5:
-    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
-    engines: {node: '>= 0.4'}
-
-  for-in@1.0.2:
-    resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
-    engines: {node: '>=0.10.0'}
-
-  form-data@4.0.2:
-    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
-    engines: {node: '>= 6'}
-
-  fragment-cache@0.2.1:
-    resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
-    engines: {node: '>=0.10.0'}
-
-  fs-extra@10.1.0:
-    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
-    engines: {node: '>=12'}
-
-  fsevents@2.3.3:
-    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-
-  function-bind@1.1.2:
-    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
-  function.prototype.name@1.1.8:
-    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
-    engines: {node: '>= 0.4'}
-
-  functions-have-names@1.2.3:
-    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
-  geojson-equality@0.1.6:
-    resolution: {integrity: sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==}
-
-  geojson-rbush@3.2.0:
-    resolution: {integrity: sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==}
-
-  get-intrinsic@1.3.0:
-    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
-    engines: {node: '>= 0.4'}
-
-  get-proto@1.0.1:
-    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
-    engines: {node: '>= 0.4'}
-
-  get-symbol-description@1.1.0:
-    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
-    engines: {node: '>= 0.4'}
-
-  get-value@2.0.6:
-    resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
-    engines: {node: '>=0.10.0'}
-
-  glob-parent@5.1.2:
-    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
-    engines: {node: '>= 6'}
-
-  globalthis@1.0.4:
-    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
-    engines: {node: '>= 0.4'}
-
-  good-listener@1.2.2:
-    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
-
-  gopd@1.2.0:
-    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
-    engines: {node: '>= 0.4'}
-
-  graceful-fs@4.2.11:
-    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
-  grapheme-splitter@1.0.4:
-    resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
-
-  hammerjs@2.0.8:
-    resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==}
-    engines: {node: '>=0.8.0'}
-
-  has-ansi@2.0.0:
-    resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
-    engines: {node: '>=0.10.0'}
-
-  has-bigints@1.1.0:
-    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
-    engines: {node: '>= 0.4'}
-
-  has-flag@1.0.0:
-    resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
-    engines: {node: '>=0.10.0'}
-
-  has-flag@4.0.0:
-    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
-    engines: {node: '>=8'}
-
-  has-property-descriptors@1.0.2:
-    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
-  has-proto@1.2.0:
-    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
-    engines: {node: '>= 0.4'}
-
-  has-symbols@1.1.0:
-    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
-    engines: {node: '>= 0.4'}
-
-  has-tostringtag@1.0.2:
-    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
-    engines: {node: '>= 0.4'}
-
-  has-value@0.3.1:
-    resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
-    engines: {node: '>=0.10.0'}
-
-  has-value@1.0.0:
-    resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
-    engines: {node: '>=0.10.0'}
-
-  has-values@0.1.4:
-    resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
-    engines: {node: '>=0.10.0'}
-
-  has-values@1.0.0:
-    resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
-    engines: {node: '>=0.10.0'}
-
-  hasown@2.0.2:
-    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
-    engines: {node: '>= 0.4'}
-
-  he@1.2.0:
-    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
-    hasBin: true
-
-  highlight.js@11.11.1:
-    resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
-    engines: {node: '>=12.0.0'}
-
-  htm@3.1.1:
-    resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==}
-
-  html-void-elements@2.0.1:
-    resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
-
-  htmlparser2@3.10.1:
-    resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
-
-  i18next@20.6.1:
-    resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==}
-
-  ids@1.0.5:
-    resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==}
-
-  image-size@0.5.5:
-    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-
-  immer@9.0.21:
-    resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
-
-  immutable@5.1.1:
-    resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==}
-
-  inherits-browser@0.1.0:
-    resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==}
-
-  inherits@2.0.4:
-    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
-  internal-slot@1.1.0:
-    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
-    engines: {node: '>= 0.4'}
-
-  is-accessor-descriptor@1.0.1:
-    resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
-    engines: {node: '>= 0.10'}
-
-  is-arguments@1.2.0:
-    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
-    engines: {node: '>= 0.4'}
-
-  is-array-buffer@3.0.5:
-    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
-    engines: {node: '>= 0.4'}
-
-  is-async-function@2.1.1:
-    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
-    engines: {node: '>= 0.4'}
-
-  is-bigint@1.1.0:
-    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
-    engines: {node: '>= 0.4'}
-
-  is-boolean-object@1.2.2:
-    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
-    engines: {node: '>= 0.4'}
-
-  is-buffer@1.1.6:
-    resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
-
-  is-callable@1.2.7:
-    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
-    engines: {node: '>= 0.4'}
-
-  is-data-descriptor@1.0.1:
-    resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
-    engines: {node: '>= 0.4'}
-
-  is-data-view@1.0.2:
-    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
-    engines: {node: '>= 0.4'}
-
-  is-date-object@1.1.0:
-    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
-    engines: {node: '>= 0.4'}
-
-  is-descriptor@0.1.7:
-    resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
-    engines: {node: '>= 0.4'}
-
-  is-descriptor@1.0.3:
-    resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
-    engines: {node: '>= 0.4'}
-
-  is-extendable@0.1.1:
-    resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
-    engines: {node: '>=0.10.0'}
-
-  is-extendable@1.0.1:
-    resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
-    engines: {node: '>=0.10.0'}
-
-  is-extglob@2.1.1:
-    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
-    engines: {node: '>=0.10.0'}
-
-  is-finalizationregistry@1.1.1:
-    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
-    engines: {node: '>= 0.4'}
-
-  is-generator-function@1.1.0:
-    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
-    engines: {node: '>= 0.4'}
-
-  is-glob@4.0.3:
-    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
-    engines: {node: '>=0.10.0'}
-
-  is-hotkey@0.2.0:
-    resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
-
-  is-map@2.0.3:
-    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
-    engines: {node: '>= 0.4'}
-
-  is-number-object@1.1.1:
-    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
-    engines: {node: '>= 0.4'}
-
-  is-number@3.0.0:
-    resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
-    engines: {node: '>=0.10.0'}
-
-  is-number@7.0.0:
-    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
-    engines: {node: '>=0.12.0'}
-
-  is-plain-obj@1.1.0:
-    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
-    engines: {node: '>=0.10.0'}
-
-  is-plain-object@2.0.4:
-    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
-    engines: {node: '>=0.10.0'}
-
-  is-plain-object@5.0.0:
-    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
-    engines: {node: '>=0.10.0'}
-
-  is-regex@1.2.1:
-    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
-    engines: {node: '>= 0.4'}
-
-  is-set@2.0.3:
-    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
-    engines: {node: '>= 0.4'}
-
-  is-shared-array-buffer@1.0.4:
-    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
-    engines: {node: '>= 0.4'}
-
-  is-string@1.1.1:
-    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
-    engines: {node: '>= 0.4'}
-
-  is-symbol@1.1.1:
-    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
-    engines: {node: '>= 0.4'}
-
-  is-typed-array@1.1.15:
-    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
-    engines: {node: '>= 0.4'}
-
-  is-url@1.2.4:
-    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
-
-  is-weakmap@2.0.2:
-    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
-    engines: {node: '>= 0.4'}
-
-  is-weakref@1.1.1:
-    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
-    engines: {node: '>= 0.4'}
-
-  is-weakset@2.0.4:
-    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
-    engines: {node: '>= 0.4'}
-
-  is-windows@1.0.2:
-    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
-    engines: {node: '>=0.10.0'}
-
-  isarray@1.0.0:
-    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
-  isarray@2.0.5:
-    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
-  isobject@2.1.0:
-    resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
-    engines: {node: '>=0.10.0'}
-
-  isobject@3.0.1:
-    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
-    engines: {node: '>=0.10.0'}
-
-  js-base64@2.6.4:
-    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
-
-  js-base64@3.7.7:
-    resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
-
-  js-cookie@3.0.5:
-    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
-    engines: {node: '>=14'}
-
-  js-md5@0.7.3:
-    resolution: {integrity: sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==}
-
-  jsbn@1.1.0:
-    resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
-
-  jsep@1.4.0:
-    resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==}
-    engines: {node: '>= 10.16.0'}
-
-  json5@1.0.2:
-    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
-    hasBin: true
-
-  jsonfile@6.1.0:
-    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
-
-  kdbush@4.0.2:
-    resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
-
-  kind-of@3.2.2:
-    resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
-    engines: {node: '>=0.10.0'}
-
-  kind-of@4.0.0:
-    resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
-    engines: {node: '>=0.10.0'}
-
-  kind-of@5.1.0:
-    resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
-    engines: {node: '>=0.10.0'}
-
-  kind-of@6.0.3:
-    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
-    engines: {node: '>=0.10.0'}
-
-  ktx-parse@1.0.0:
-    resolution: {integrity: sha512-Z31kVizz4DF/6vo9YiSYVBhuXAfyQy9bGxlW3+mB5OELoZjfXVZQpRoctsx8IEDKxBd6SagXKo7qRvu38i8Jfg==}
-
-  lerc@2.0.0:
-    resolution: {integrity: sha512-7qo1Mq8ZNmaR4USHHm615nEW2lPeeWJ3bTyoqFbd35DLx0LUH7C6ptt5FDCTAlbIzs3+WKrk5SkJvw8AFDE2hg==}
-
-  loader-utils@1.4.2:
-    resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
-    engines: {node: '>=4.0.0'}
-
-  local-pkg@0.4.3:
-    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
-    engines: {node: '>=14'}
-
-  lodash-es@4.17.21:
-    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
-
-  lodash-unified@1.0.3:
-    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
-    peerDependencies:
-      '@types/lodash-es': '*'
-      lodash: '*'
-      lodash-es: '*'
-
-  lodash.camelcase@4.3.0:
-    resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
-
-  lodash.clonedeep@4.5.0:
-    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
-
-  lodash.debounce@4.0.8:
-    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
-
-  lodash.foreach@4.5.0:
-    resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
-
-  lodash.isequal@4.5.0:
-    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
-    deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
-
-  lodash.throttle@4.1.1:
-    resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
-
-  lodash.toarray@4.4.0:
-    resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==}
-
-  lodash@4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
-  long@5.3.1:
-    resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==}
-
-  magic-string@0.25.9:
-    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
-
-  magic-string@0.26.7:
-    resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
-    engines: {node: '>=12'}
-
-  magic-string@0.27.0:
-    resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
-    engines: {node: '>=12'}
-
-  magic-string@0.30.17:
-    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
-
-  map-cache@0.2.2:
-    resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
-    engines: {node: '>=0.10.0'}
-
-  map-visit@1.0.0:
-    resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
-    engines: {node: '>=0.10.0'}
-
-  math-intrinsics@1.1.0:
-    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
-    engines: {node: '>= 0.4'}
-
-  mdn-data@2.0.14:
-    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
-
-  memoize-one@6.0.0:
-    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
-
-  merge-options@1.0.1:
-    resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
-    engines: {node: '>=4'}
-
-  merge2@1.4.1:
-    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
-    engines: {node: '>= 8'}
-
-  mersenne-twister@1.1.0:
-    resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==}
-
-  meshoptimizer@0.22.0:
-    resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
-
-  micromatch@3.1.0:
-    resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
-    engines: {node: '>=0.10.0'}
-
-  micromatch@4.0.8:
-    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
-    engines: {node: '>=8.6'}
-
-  mime-db@1.52.0:
-    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
-    engines: {node: '>= 0.6'}
-
-  mime-match@1.0.2:
-    resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==}
-
-  mime-types@2.1.35:
-    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
-    engines: {node: '>= 0.6'}
-
-  min-dash@4.2.3:
-    resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==}
-
-  min-dom@4.2.1:
-    resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==}
-
-  minimist@1.2.8:
-    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
-  mixin-deep@1.3.2:
-    resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
-    engines: {node: '>=0.10.0'}
-
-  mlly@1.7.4:
-    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
-
-  moddle-xml@10.1.0:
-    resolution: {integrity: sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==}
-
-  moddle@6.2.3:
-    resolution: {integrity: sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==}
-
-  ms@2.0.0:
-    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-
-  ms@2.1.3:
-    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
-  namespace-emitter@2.0.1:
-    resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
-
-  nanoid@3.3.11:
-    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
-    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-    hasBin: true
-
-  nanomatch@1.2.13:
-    resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
-    engines: {node: '>=0.10.0'}
-
-  next-tick@1.1.0:
-    resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
-
-  node-addon-api@7.1.1:
-    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
-
-  normalize-wheel-es@1.2.0:
-    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
-
-  nosleep.js@0.12.0:
-    resolution: {integrity: sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==}
-
-  nprogress@0.2.0:
-    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
-
-  nth-check@2.1.1:
-    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
-
-  object-assign@4.1.1:
-    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
-    engines: {node: '>=0.10.0'}
-
-  object-copy@0.1.0:
-    resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
-    engines: {node: '>=0.10.0'}
-
-  object-inspect@1.13.4:
-    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
-    engines: {node: '>= 0.4'}
-
-  object-is@1.1.6:
-    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
-    engines: {node: '>= 0.4'}
-
-  object-keys@1.1.1:
-    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
-    engines: {node: '>= 0.4'}
-
-  object-refs@0.3.0:
-    resolution: {integrity: sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==}
-
-  object-visit@1.0.1:
-    resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
-    engines: {node: '>=0.10.0'}
-
-  object.assign@4.1.7:
-    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
-    engines: {node: '>= 0.4'}
-
-  object.pick@1.3.0:
-    resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
-    engines: {node: '>=0.10.0'}
-
-  own-keys@1.0.1:
-    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
-    engines: {node: '>= 0.4'}
-
-  pako@2.1.0:
-    resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
-
-  pascalcase@0.1.1:
-    resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
-    engines: {node: '>=0.10.0'}
-
-  path-intersection@2.2.1:
-    resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==}
-
-  pathe@0.2.0:
-    resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
-
-  pathe@1.1.2:
-    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
-
-  pathe@2.0.3:
-    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
-
-  picocolors@1.1.1:
-    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
-  picomatch@2.3.1:
-    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
-    engines: {node: '>=8.6'}
-
-  picomatch@4.0.2:
-    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
-    engines: {node: '>=12'}
-
-  pkg-types@1.3.1:
-    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
-
-  point-in-polygon@1.1.0:
-    resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
-
-  polygon-clipping@0.15.7:
-    resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==}
-
-  posix-character-classes@0.1.1:
-    resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
-    engines: {node: '>=0.10.0'}
-
-  possible-typed-array-names@1.1.0:
-    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
-    engines: {node: '>= 0.4'}
-
-  postcss-prefix-selector@1.16.1:
-    resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
-    peerDependencies:
-      postcss: '>4 <9'
-
-  postcss-pxtorem@6.1.0:
-    resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
-    peerDependencies:
-      postcss: ^8.0.0
-
-  postcss@5.2.18:
-    resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
-    engines: {node: '>=0.12'}
-
-  postcss@8.5.3:
-    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
-    engines: {node: ^10 || ^12 || >=14}
-
-  posthtml-parser@0.2.1:
-    resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
-
-  posthtml-rename-id@1.0.12:
-    resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
-
-  posthtml-render@1.4.0:
-    resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
-    engines: {node: '>=10'}
-
-  posthtml-svg-mode@1.0.3:
-    resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
-
-  posthtml@0.9.2:
-    resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
-    engines: {node: '>=0.10.0'}
-
-  preact@10.26.4:
-    resolution: {integrity: sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==}
-
-  prettier@2.8.8:
-    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-
-  prismjs@1.30.0:
-    resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
-    engines: {node: '>=6'}
-
-  protobufjs@7.4.0:
-    resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
-    engines: {node: '>=12.0.0'}
-
-  proxy-from-env@1.1.0:
-    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-
-  query-string@4.3.4:
-    resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
-    engines: {node: '>=0.10.0'}
-
-  queue-microtask@1.2.3:
-    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-
-  quickselect@1.1.1:
-    resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==}
-
-  quickselect@2.0.0:
-    resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
-
-  randomcolor@0.6.2:
-    resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==}
-
-  rbush@2.0.2:
-    resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==}
-
-  rbush@3.0.1:
-    resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==}
-
-  readable-stream@3.6.2:
-    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
-    engines: {node: '>= 6'}
-
-  readdirp@4.1.2:
-    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
-    engines: {node: '>= 14.18.0'}
-
-  reflect.getprototypeof@1.0.10:
-    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
-    engines: {node: '>= 0.4'}
-
-  regenerator-runtime@0.14.1:
-    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
-  regex-not@1.0.2:
-    resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
-    engines: {node: '>=0.10.0'}
-
-  regexp.prototype.flags@1.5.4:
-    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
-    engines: {node: '>= 0.4'}
-
-  repeat-element@1.1.4:
-    resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
-    engines: {node: '>=0.10.0'}
-
-  repeat-string@1.6.1:
-    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
-    engines: {node: '>=0.10'}
-
-  resolve-url@0.2.1:
-    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
-    deprecated: https://github.com/lydell/resolve-url#deprecated
-
-  ret@0.1.15:
-    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
-    engines: {node: '>=0.12'}
-
-  reusify@1.1.0:
-    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
-    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
-  robust-predicates@2.0.4:
-    resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==}
-
-  robust-predicates@3.0.2:
-    resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
-
-  rollup@4.37.0:
-    resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==}
-    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
-    hasBin: true
-
-  run-parallel@1.2.0:
-    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-
-  safe-array-concat@1.1.3:
-    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
-    engines: {node: '>=0.4'}
-
-  safe-buffer@5.2.1:
-    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
-  safe-push-apply@1.0.0:
-    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
-    engines: {node: '>= 0.4'}
-
-  safe-regex-test@1.1.0:
-    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
-    engines: {node: '>= 0.4'}
-
-  safe-regex@1.1.0:
-    resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
-
-  sass@1.86.0:
-    resolution: {integrity: sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==}
-    engines: {node: '>=14.0.0'}
-    hasBin: true
-
-  saxen@8.1.2:
-    resolution: {integrity: sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==}
-
-  scroll-into-view-if-needed@2.2.31:
-    resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
-
-  scule@1.3.0:
-    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
-
-  select@1.1.2:
-    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
-
-  set-function-length@1.2.2:
-    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
-    engines: {node: '>= 0.4'}
-
-  set-function-name@2.0.2:
-    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
-    engines: {node: '>= 0.4'}
-
-  set-proto@1.0.0:
-    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
-    engines: {node: '>= 0.4'}
-
-  set-value@2.0.1:
-    resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
-    engines: {node: '>=0.10.0'}
-
-  side-channel-list@1.0.0:
-    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
-    engines: {node: '>= 0.4'}
-
-  side-channel-map@1.0.1:
-    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
-    engines: {node: '>= 0.4'}
-
-  side-channel-weakmap@1.0.2:
-    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
-    engines: {node: '>= 0.4'}
-
-  side-channel@1.1.0:
-    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
-    engines: {node: '>= 0.4'}
-
-  signature_pad@5.0.7:
-    resolution: {integrity: sha512-j2C6NTZ3c99G3hvFTsg6oOWy/tmftgwIXrvsr3+99+5SuPW6OdSpo++ZUzLVNfNHYmp2Z2Al76YV/3RhS/nDJg==}
-
-  skmeans@0.9.7:
-    resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==}
-
-  slate-history@0.66.0:
-    resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==}
-    peerDependencies:
-      slate: '>=0.65.3'
-
-  slate@0.72.8:
-    resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==}
-
-  sm-crypto@0.3.13:
-    resolution: {integrity: sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==}
-
-  snabbdom@3.6.2:
-    resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==}
-    engines: {node: '>=12.17.0'}
-
-  snapdragon-node@2.1.1:
-    resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
-    engines: {node: '>=0.10.0'}
-
-  snapdragon-util@3.0.1:
-    resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
-    engines: {node: '>=0.10.0'}
-
-  snapdragon@0.8.2:
-    resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
-    engines: {node: '>=0.10.0'}
-
-  sortablejs@1.14.0:
-    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==}
-
-  source-map-js@1.2.1:
-    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
-    engines: {node: '>=0.10.0'}
-
-  source-map-resolve@0.5.3:
-    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
-    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
-
-  source-map-support@0.5.21:
-    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
-
-  source-map-url@0.4.1:
-    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
-    deprecated: See https://github.com/lydell/source-map-url#deprecated
-
-  source-map@0.5.7:
-    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
-    engines: {node: '>=0.10.0'}
-
-  source-map@0.6.1:
-    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
-    engines: {node: '>=0.10.0'}
-
-  sourcemap-codec@1.4.8:
-    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
-    deprecated: Please use @jridgewell/sourcemap-codec instead
-
-  splaytree@3.1.2:
-    resolution: {integrity: sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==}
-
-  split-string@3.1.0:
-    resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
-    engines: {node: '>=0.10.0'}
-
-  ssr-window@3.0.0:
-    resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==}
-
-  stable@0.1.8:
-    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
-    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
-
-  static-extend@0.1.2:
-    resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
-    engines: {node: '>=0.10.0'}
-
-  strict-uri-encode@1.1.0:
-    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
-    engines: {node: '>=0.10.0'}
-
-  string.prototype.trim@1.2.10:
-    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
-    engines: {node: '>= 0.4'}
-
-  string.prototype.trimend@1.0.9:
-    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
-    engines: {node: '>= 0.4'}
-
-  string.prototype.trimstart@1.0.8:
-    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
-    engines: {node: '>= 0.4'}
-
-  string_decoder@1.3.0:
-    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
-  strip-ansi@3.0.1:
-    resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
-    engines: {node: '>=0.10.0'}
-
-  strip-literal@1.3.0:
-    resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
-
-  supports-color@2.0.0:
-    resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
-    engines: {node: '>=0.8.0'}
-
-  supports-color@3.2.3:
-    resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
-    engines: {node: '>=0.8.0'}
-
-  supports-color@7.2.0:
-    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
-    engines: {node: '>=8'}
-
-  svg-baker@1.7.0:
-    resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
-
-  svgo@2.8.0:
-    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-
-  terser@5.39.0:
-    resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
-    engines: {node: '>=10'}
-    hasBin: true
-
-  tiny-emitter@2.1.0:
-    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
-
-  tiny-svg@3.1.3:
-    resolution: {integrity: sha512-9mwnPqXInRsBmH/DO6NMxBE++9LsqpVXQSSTZGc5bomoKKvL5OX/Hlotw7XVXP6XLRcHWIzZpxfovGqWKgCypQ==}
-
-  tiny-warning@1.0.3:
-    resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
-
-  tinyqueue@2.0.3:
-    resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==}
-
-  to-object-path@0.3.0:
-    resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
-    engines: {node: '>=0.10.0'}
-
-  to-regex-range@2.1.1:
-    resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
-    engines: {node: '>=0.10.0'}
-
-  to-regex-range@5.0.1:
-    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
-    engines: {node: '>=8.0'}
-
-  to-regex@3.0.2:
-    resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
-    engines: {node: '>=0.10.0'}
-
-  topojson-client@3.1.0:
-    resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==}
-    hasBin: true
-
-  topojson-server@3.0.1:
-    resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==}
-    hasBin: true
-
-  traverse@0.6.11:
-    resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
-    engines: {node: '>= 0.4'}
-
-  tslib@2.3.0:
-    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
-
-  tslib@2.8.1:
-    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
-  turf-jsts@1.2.3:
-    resolution: {integrity: sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==}
-
-  type@2.7.3:
-    resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
-
-  typed-array-buffer@1.0.3:
-    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
-    engines: {node: '>= 0.4'}
-
-  typed-array-byte-length@1.0.3:
-    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
-    engines: {node: '>= 0.4'}
-
-  typed-array-byte-offset@1.0.4:
-    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
-    engines: {node: '>= 0.4'}
-
-  typed-array-length@1.0.7:
-    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
-    engines: {node: '>= 0.4'}
-
-  typedarray.prototype.slice@1.0.5:
-    resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
-    engines: {node: '>= 0.4'}
-
-  ufo@1.5.4:
-    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
-
-  unbox-primitive@1.1.0:
-    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
-    engines: {node: '>= 0.4'}
-
-  undici-types@6.20.0:
-    resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
-
-  unimport@1.3.0:
-    resolution: {integrity: sha512-fOkrdxglsHd428yegH0wPH/6IfaSdDeMXtdRGn6en/ccyzc2aaoxiUTMrJyc6Bu+xoa18RJRPMfLUHEzjz8atw==}
-
-  union-value@1.0.1:
-    resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
-    engines: {node: '>=0.10.0'}
-
-  universalify@2.0.1:
-    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
-    engines: {node: '>= 10.0.0'}
-
-  unplugin-auto-import@0.11.5:
-    resolution: {integrity: sha512-nvbL2AQwLRR8wbHpJ6L1EBVNmjN045RSedTa4NtsGRkSQFXkI1iKHs4dTqJwcKZsnFrZOAKtLPiN1/oQTObLZw==}
-    engines: {node: '>=14'}
-    peerDependencies:
-      '@vueuse/core': '*'
-    peerDependenciesMeta:
-      '@vueuse/core':
-        optional: true
-
-  unplugin@1.16.1:
-    resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
-    engines: {node: '>=14.0.0'}
-
-  unset-value@1.0.0:
-    resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
-    engines: {node: '>=0.10.0'}
-
-  urijs@1.19.11:
-    resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==}
-
-  urix@0.1.0:
-    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
-    deprecated: Please see https://github.com/lydell/urix#deprecated
-
-  use@3.1.1:
-    resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
-    engines: {node: '>=0.10.0'}
-
-  util-deprecate@1.0.2:
-    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
-  vary@1.1.2:
-    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
-    engines: {node: '>= 0.8'}
-
-  vite-plugin-compression@0.5.1:
-    resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
-    peerDependencies:
-      vite: '>=2.0.0'
-
-  vite-plugin-svg-icons@2.0.1:
-    resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
-    peerDependencies:
-      vite: '>=2.0.0'
-
-  vite-plugin-vue-setup-extend@0.4.0:
-    resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==}
-    peerDependencies:
-      vite: '>=2.0.0'
-
-  vite@5.4.15:
-    resolution: {integrity: sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==}
-    engines: {node: ^18.0.0 || >=20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': ^18.0.0 || >=20.0.0
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      sass-embedded: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      sass-embedded:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-
-  vue-demi@0.14.10:
-    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
-    engines: {node: '>=12'}
-    hasBin: true
-    peerDependencies:
-      '@vue/composition-api': ^1.0.0-rc.1
-      vue: ^3.0.0-0 || ^2.6.0
-    peerDependenciesMeta:
-      '@vue/composition-api':
-        optional: true
-
-  vue-i18n@9.14.3:
-    resolution: {integrity: sha512-C+E0KE8ihKjdYCQx8oUkXX+8tBItrYNMnGJuzEPevBARQFUN2tKez6ZVOvBrWH0+KT5wEk3vOWjNk7ygb2u9ig==}
-    engines: {node: '>= 16'}
-    peerDependencies:
-      vue: ^3.0.0
-
-  vue-router@4.5.0:
-    resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
-    peerDependencies:
-      vue: ^3.2.0
-
-  vue3-clipboard@1.0.0:
-    resolution: {integrity: sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==}
-    peerDependencies:
-      vue: ^3.0.0
-
-  vue@3.5.13:
-    resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-
-  vuedraggable@4.1.0:
-    resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
-    peerDependencies:
-      vue: ^3.0.1
-
-  vuex@4.1.0:
-    resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==}
-    peerDependencies:
-      vue: ^3.2.0
-
-  webpack-virtual-modules@0.6.2:
-    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
-
-  which-boxed-primitive@1.1.1:
-    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
-    engines: {node: '>= 0.4'}
-
-  which-builtin-type@1.2.1:
-    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
-    engines: {node: '>= 0.4'}
-
-  which-collection@1.0.2:
-    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
-    engines: {node: '>= 0.4'}
-
-  which-typed-array@1.1.19:
-    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
-    engines: {node: '>= 0.4'}
-
-  wildcard@1.1.2:
-    resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==}
-
-  zrender@5.6.1:
-    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
-
-snapshots:
-
-  '@amap/amap-jsapi-loader@1.0.1': {}
-
-  '@antfu/utils@0.7.10': {}
-
-  '@babel/helper-string-parser@7.25.9': {}
-
-  '@babel/helper-validator-identifier@7.25.9': {}
-
-  '@babel/parser@7.27.0':
     dependencies:
       '@babel/types': 7.27.0
 
-  '@babel/runtime@7.27.0':
+  /@babel/runtime@7.27.0:
+    resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+    engines: {node: '>=6.9.0'}
     dependencies:
       regenerator-runtime: 0.14.1
+    dev: false
 
-  '@babel/types@7.27.0':
+  /@babel/types@7.27.0:
+    resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
+    engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/helper-string-parser': 7.25.9
       '@babel/helper-validator-identifier': 7.25.9
 
-  '@bpmn-io/diagram-js-ui@0.2.3':
+  /@bpmn-io/diagram-js-ui@0.2.3:
+    resolution: {integrity: sha512-OGyjZKvGK8tHSZ0l7RfeKhilGoOGtFDcoqSGYkX0uhFlo99OVZ9Jn1K7TJGzcE9BdKwvA5Y5kGqHEhdTxHvFfw==}
     dependencies:
       htm: 3.1.1
       preact: 10.26.4
+    dev: false
 
-  '@cesium/engine@15.0.0':
+  /@cesium/engine@14.0.0:
+    resolution: {integrity: sha512-nmW0uQCyg4CRqi3a8o30gU9S9bFm3TLh2fRO74iv+6a8FFArvZ1xF7IqG2tyRjSXkyH4c5vpavNRT3R51R8NyQ==}
+    engines: {node: '>=14.0.0'}
     dependencies:
       '@tweenjs/tween.js': 25.0.0
-      '@zip.js/zip.js': 2.7.57
+      '@zip.js/zip.js': 2.7.60
       autolinker: 4.1.0
       bitmap-sdf: 1.0.4
       dompurify: 3.2.4
@@ -2916,7 +188,7 @@
       grapheme-splitter: 1.0.4
       jsep: 1.4.0
       kdbush: 4.0.2
-      ktx-parse: 1.0.0
+      ktx-parse: 0.7.1
       lerc: 2.0.0
       mersenne-twister: 1.1.0
       meshoptimizer: 0.22.0
@@ -2925,184 +197,493 @@
       rbush: 3.0.1
       topojson-client: 3.1.0
       urijs: 1.19.11
+    dev: false
 
-  '@cesium/widgets@11.0.0':
+  /@cesium/widgets@10.2.0:
+    resolution: {integrity: sha512-f0Wrp3MG02P2KSAopVESHWOhF+2eK9cQR9prEYGWuPM3iF6YktKrZqXzNnsOxCw1KPup0aSXsCrFl2asT5jF9g==}
+    engines: {node: '>=14.0.0'}
     dependencies:
-      '@cesium/engine': 15.0.0
+      '@cesium/engine': 14.0.0
       nosleep.js: 0.12.0
+    dev: false
 
-  '@ctrl/tinycolor@3.6.1': {}
+  /@ctrl/tinycolor@3.6.1:
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+    dev: false
 
-  '@element-plus/icons-vue@2.3.1(vue@3.5.13)':
+  /@element-plus/icons-vue@2.3.1(vue@3.5.13):
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
     dependencies:
       vue: 3.5.13
+    dev: false
 
-  '@esbuild/aix-ppc64@0.21.5':
+  /@esbuild/aix-ppc64@0.20.2:
+    resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [aix]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-arm64@0.21.5':
+  /@esbuild/android-arm64@0.20.2:
+    resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-arm@0.21.5':
+  /@esbuild/android-arm@0.20.2:
+    resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/android-x64@0.21.5':
+  /@esbuild/android-x64@0.20.2:
+    resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/darwin-arm64@0.21.5':
+  /@esbuild/darwin-arm64@0.20.2:
+    resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/darwin-x64@0.21.5':
+  /@esbuild/darwin-x64@0.20.2:
+    resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/freebsd-arm64@0.21.5':
+  /@esbuild/freebsd-arm64@0.20.2:
+    resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/freebsd-x64@0.21.5':
+  /@esbuild/freebsd-x64@0.20.2:
+    resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-arm64@0.21.5':
+  /@esbuild/linux-arm64@0.20.2:
+    resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-arm@0.21.5':
+  /@esbuild/linux-arm@0.20.2:
+    resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-ia32@0.21.5':
+  /@esbuild/linux-ia32@0.20.2:
+    resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-loong64@0.21.5':
+  /@esbuild/linux-loong64@0.20.2:
+    resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-mips64el@0.21.5':
+  /@esbuild/linux-mips64el@0.20.2:
+    resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-ppc64@0.21.5':
+  /@esbuild/linux-ppc64@0.20.2:
+    resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-riscv64@0.21.5':
+  /@esbuild/linux-riscv64@0.20.2:
+    resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-s390x@0.21.5':
+  /@esbuild/linux-s390x@0.20.2:
+    resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/linux-x64@0.21.5':
+  /@esbuild/linux-x64@0.20.2:
+    resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/netbsd-x64@0.21.5':
+  /@esbuild/netbsd-x64@0.20.2:
+    resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/openbsd-x64@0.21.5':
+  /@esbuild/openbsd-x64@0.20.2:
+    resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/sunos-x64@0.21.5':
+  /@esbuild/sunos-x64@0.20.2:
+    resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-arm64@0.21.5':
+  /@esbuild/win32-arm64@0.20.2:
+    resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-ia32@0.21.5':
+  /@esbuild/win32-ia32@0.20.2:
+    resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@esbuild/win32-x64@0.21.5':
+  /@esbuild/win32-x64@0.20.2:
+    resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@floating-ui/core@1.6.9':
+  /@floating-ui/core@1.6.9:
+    resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
     dependencies:
       '@floating-ui/utils': 0.2.9
+    dev: false
 
-  '@floating-ui/dom@1.6.13':
+  /@floating-ui/dom@1.6.13:
+    resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
     dependencies:
       '@floating-ui/core': 1.6.9
       '@floating-ui/utils': 0.2.9
+    dev: false
 
-  '@floating-ui/utils@0.2.9': {}
+  /@floating-ui/utils@0.2.9:
+    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+    dev: false
 
-  '@intlify/core-base@9.14.3':
+  /@intlify/core-base@9.1.9:
+    resolution: {integrity: sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==}
+    engines: {node: '>= 10'}
     dependencies:
-      '@intlify/message-compiler': 9.14.3
-      '@intlify/shared': 9.14.3
+      '@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
+    dev: false
 
-  '@intlify/message-compiler@9.14.3':
+  /@intlify/devtools-if@9.1.9:
+    resolution: {integrity: sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==}
+    engines: {node: '>= 10'}
     dependencies:
-      '@intlify/shared': 9.14.3
-      source-map-js: 1.2.1
+      '@intlify/shared': 9.1.9
+    dev: false
 
-  '@intlify/shared@9.14.3': {}
+  /@intlify/message-compiler@9.1.9:
+    resolution: {integrity: sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==}
+    engines: {node: '>= 10'}
+    dependencies:
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/shared': 9.1.9
+      source-map: 0.6.1
+    dev: false
 
-  '@jridgewell/gen-mapping@0.3.8':
+  /@intlify/message-resolver@9.1.9:
+    resolution: {integrity: sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==}
+    engines: {node: '>= 10'}
+    dev: false
+
+  /@intlify/runtime@9.1.9:
+    resolution: {integrity: sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==}
+    engines: {node: '>= 10'}
+    dependencies:
+      '@intlify/message-compiler': 9.1.9
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/shared': 9.1.9
+    dev: false
+
+  /@intlify/shared@9.1.9:
+    resolution: {integrity: sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==}
+    engines: {node: '>= 10'}
+    dev: false
+
+  /@intlify/vue-devtools@9.1.9:
+    resolution: {integrity: sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==}
+    engines: {node: '>= 10'}
+    dependencies:
+      '@intlify/message-resolver': 9.1.9
+      '@intlify/runtime': 9.1.9
+      '@intlify/shared': 9.1.9
+    dev: false
+
+  /@jridgewell/gen-mapping@0.3.8:
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+    engines: {node: '>=6.0.0'}
     dependencies:
       '@jridgewell/set-array': 1.2.1
       '@jridgewell/sourcemap-codec': 1.5.0
       '@jridgewell/trace-mapping': 0.3.25
+    dev: true
 
-  '@jridgewell/resolve-uri@3.1.2': {}
+  /@jridgewell/resolve-uri@3.1.2:
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+    dev: true
 
-  '@jridgewell/set-array@1.2.1': {}
+  /@jridgewell/set-array@1.2.1:
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+    dev: true
 
-  '@jridgewell/source-map@0.3.6':
+  /@jridgewell/source-map@0.3.6:
+    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
     dependencies:
       '@jridgewell/gen-mapping': 0.3.8
       '@jridgewell/trace-mapping': 0.3.25
+    dev: true
 
-  '@jridgewell/sourcemap-codec@1.5.0': {}
+  /@jridgewell/sourcemap-codec@1.5.0:
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
 
-  '@jridgewell/trace-mapping@0.3.25':
+  /@jridgewell/trace-mapping@0.3.25:
+    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
     dependencies:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
+    dev: true
 
-  '@nodelib/fs.scandir@2.1.5':
+  /@nodelib/fs.scandir@2.1.5:
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       run-parallel: 1.2.0
+    dev: true
 
-  '@nodelib/fs.stat@2.0.5': {}
+  /@nodelib/fs.stat@2.0.5:
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+    dev: true
 
-  '@nodelib/fs.walk@1.2.8':
+  /@nodelib/fs.walk@1.2.8:
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
     dependencies:
       '@nodelib/fs.scandir': 2.1.5
       fastq: 1.19.1
+    dev: true
 
-  '@parcel/watcher-android-arm64@2.5.1':
+  /@parcel/watcher-android-arm64@2.5.1:
+    resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-darwin-arm64@2.5.1':
+  /@parcel/watcher-darwin-arm64@2.5.1:
+    resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-darwin-x64@2.5.1':
+  /@parcel/watcher-darwin-x64@2.5.1:
+    resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-freebsd-x64@2.5.1':
+  /@parcel/watcher-freebsd-x64@2.5.1:
+    resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-arm-glibc@2.5.1':
+  /@parcel/watcher-linux-arm-glibc@2.5.1:
+    resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-arm-musl@2.5.1':
+  /@parcel/watcher-linux-arm-musl@2.5.1:
+    resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-arm64-glibc@2.5.1':
+  /@parcel/watcher-linux-arm64-glibc@2.5.1:
+    resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-arm64-musl@2.5.1':
+  /@parcel/watcher-linux-arm64-musl@2.5.1:
+    resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-x64-glibc@2.5.1':
+  /@parcel/watcher-linux-x64-glibc@2.5.1:
+    resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-linux-x64-musl@2.5.1':
+  /@parcel/watcher-linux-x64-musl@2.5.1:
+    resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-win32-arm64@2.5.1':
+  /@parcel/watcher-win32-arm64@2.5.1:
+    resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-win32-ia32@2.5.1':
+  /@parcel/watcher-win32-ia32@2.5.1:
+    resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher-win32-x64@2.5.1':
+  /@parcel/watcher-win32-x64@2.5.1:
+    resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@parcel/watcher@2.5.1':
+  /@parcel/watcher@2.5.1:
+    resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+    engines: {node: '>= 10.0.0'}
+    requiresBuild: true
     dependencies:
       detect-libc: 1.0.3
       is-glob: 4.0.3
@@ -3122,221 +703,402 @@
       '@parcel/watcher-win32-arm64': 2.5.1
       '@parcel/watcher-win32-ia32': 2.5.1
       '@parcel/watcher-win32-x64': 2.5.1
+    dev: true
     optional: true
 
-  '@protobufjs/aspromise@1.1.2': {}
+  /@protobufjs/aspromise@1.1.2:
+    resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+    dev: false
 
-  '@protobufjs/base64@1.1.2': {}
+  /@protobufjs/base64@1.1.2:
+    resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+    dev: false
 
-  '@protobufjs/codegen@2.0.4': {}
+  /@protobufjs/codegen@2.0.4:
+    resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+    dev: false
 
-  '@protobufjs/eventemitter@1.1.0': {}
+  /@protobufjs/eventemitter@1.1.0:
+    resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+    dev: false
 
-  '@protobufjs/fetch@1.1.0':
+  /@protobufjs/fetch@1.1.0:
+    resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/inquire': 1.1.0
+    dev: false
 
-  '@protobufjs/float@1.0.2': {}
+  /@protobufjs/float@1.0.2:
+    resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+    dev: false
 
-  '@protobufjs/inquire@1.1.0': {}
+  /@protobufjs/inquire@1.1.0:
+    resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+    dev: false
 
-  '@protobufjs/path@1.1.2': {}
+  /@protobufjs/path@1.1.2:
+    resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+    dev: false
 
-  '@protobufjs/pool@1.1.0': {}
+  /@protobufjs/pool@1.1.0:
+    resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+    dev: false
 
-  '@protobufjs/utf8@1.1.0': {}
+  /@protobufjs/utf8@1.1.0:
+    resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+    dev: false
 
-  '@rollup/pluginutils@5.1.4(rollup@4.37.0)':
+  /@rollup/pluginutils@4.2.1:
+    resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+    engines: {node: '>= 8.0.0'}
     dependencies:
-      '@types/estree': 1.0.6
       estree-walker: 2.0.2
-      picomatch: 4.0.2
-    optionalDependencies:
-      rollup: 4.37.0
+      picomatch: 2.3.1
+    dev: true
 
-  '@rollup/rollup-android-arm-eabi@4.37.0':
+  /@rollup/rollup-android-arm-eabi@4.38.0:
+    resolution: {integrity: sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-android-arm64@4.37.0':
+  /@rollup/rollup-android-arm64@4.38.0:
+    resolution: {integrity: sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-darwin-arm64@4.37.0':
+  /@rollup/rollup-darwin-arm64@4.38.0:
+    resolution: {integrity: sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-darwin-x64@4.37.0':
+  /@rollup/rollup-darwin-x64@4.38.0:
+    resolution: {integrity: sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-freebsd-arm64@4.37.0':
+  /@rollup/rollup-freebsd-arm64@4.38.0:
+    resolution: {integrity: sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-freebsd-x64@4.37.0':
+  /@rollup/rollup-freebsd-x64@4.38.0:
+    resolution: {integrity: sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-arm-gnueabihf@4.37.0':
+  /@rollup/rollup-linux-arm-gnueabihf@4.38.0:
+    resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-arm-musleabihf@4.37.0':
+  /@rollup/rollup-linux-arm-musleabihf@4.38.0:
+    resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-arm64-gnu@4.37.0':
+  /@rollup/rollup-linux-arm64-gnu@4.38.0:
+    resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-arm64-musl@4.37.0':
+  /@rollup/rollup-linux-arm64-musl@4.38.0:
+    resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-loongarch64-gnu@4.37.0':
+  /@rollup/rollup-linux-loongarch64-gnu@4.38.0:
+    resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-powerpc64le-gnu@4.37.0':
+  /@rollup/rollup-linux-powerpc64le-gnu@4.38.0:
+    resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-riscv64-gnu@4.37.0':
+  /@rollup/rollup-linux-riscv64-gnu@4.38.0:
+    resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-riscv64-musl@4.37.0':
+  /@rollup/rollup-linux-riscv64-musl@4.38.0:
+    resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-s390x-gnu@4.37.0':
+  /@rollup/rollup-linux-s390x-gnu@4.38.0:
+    resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-x64-gnu@4.37.0':
+  /@rollup/rollup-linux-x64-gnu@4.38.0:
+    resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-linux-x64-musl@4.37.0':
+  /@rollup/rollup-linux-x64-musl@4.38.0:
+    resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-win32-arm64-msvc@4.37.0':
+  /@rollup/rollup-win32-arm64-msvc@4.38.0:
+    resolution: {integrity: sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-win32-ia32-msvc@4.37.0':
+  /@rollup/rollup-win32-ia32-msvc@4.38.0:
+    resolution: {integrity: sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@rollup/rollup-win32-x64-msvc@4.37.0':
+  /@rollup/rollup-win32-x64-msvc@4.38.0:
+    resolution: {integrity: sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  '@saber/nf-design-base-elp@1.3.0':
+  /@saber/nf-design-base-elp@1.3.0:
+    resolution: {integrity: sha512-sKUkhErjggUjH+hoBTVpcUC7j38KAkGUloIVXIRl6YP1WT14QXvtf3iu8iCIOBO8iPKHgrBiq4h80UW9+qqbjQ==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-design-base-elp/-/1.3.0/nf-design-base-elp-1.3.0.tgz}
     dependencies:
       bpmn-js: 11.5.0
-      codemirror: 5.65.19
+      codemirror: 5.65.16
       randomcolor: 0.6.2
+    dev: false
 
-  '@saber/nf-form-design-elp@1.4.1(vue@3.5.13)':
+  /@saber/nf-form-design-elp@1.4.1(vue@3.5.13):
+    resolution: {integrity: sha512-O4/ZkOIyxqOplHsRlP/LfDlhCbHNtIrS6n+8+N+0JLYb76a/14X07abAHlpsAg2p0yY62OuuRBu8mpIvh6C40Q==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-design-elp/-/1.4.1/nf-form-design-elp-1.4.1.tgz}
+    engines: {node: ^18.0.0 || >=20.0.0}
     dependencies:
       vuedraggable: 4.1.0(vue@3.5.13)
     transitivePeerDependencies:
       - vue
+    dev: false
 
-  '@saber/nf-form-elp@1.4.7':
+  /@saber/nf-form-elp@1.4.4:
+    resolution: {integrity: sha512-rf/tlTEBSBOaAX4PJgt11inONEe7dn4g0iJAgozqpKuwrfqgPRChr3N2b8Wkg9DJwBPR/RmIRQ0kHyRo5lKlug==, tarball: https://center.javablade.com/api/packages/blade/npm/%40saber%2Fnf-form-elp/-/1.4.4/nf-form-elp-1.4.4.tgz}
+    engines: {node: ^18.0.0 || >=20.0.0}
     dependencies:
       '@amap/amap-jsapi-loader': 1.0.1
       '@wangeditor/editor': 5.1.23
-      codemirror: 5.65.19
+      codemirror: 5.65.16
       countup.js: 2.8.0
       signature_pad: 5.0.7
+    dev: false
 
-  '@smallwei/avue@3.6.3(element-plus@2.9.7(vue@3.5.13))(vue@3.5.13)':
+  /@smallwei/avue@3.6.2(element-plus@2.9.3)(vue@3.5.13):
+    resolution: {integrity: sha512-Ifkt0o7KLsAMptfoNMG7qYS86OL2pEet761wWZyZGu8e48wuNNPOfqx5jnibGjx2oIoKtYUFh7tFdllOCth2EQ==}
+    peerDependencies:
+      element-plus: '>=2.2.0'
+      vue: '>=3.2.0'
     dependencies:
       '@element-plus/icons-vue': 2.3.1(vue@3.5.13)
       countup.js: 1.9.3
-      dayjs: 1.11.13
-      element-plus: 2.9.7(vue@3.5.13)
+      dayjs: 1.10.6
+      element-plus: 2.9.3(vue@3.5.13)
       lodash: 4.17.21
       vue: 3.5.13
+    dev: false
 
-  '@sxzz/popperjs-es@2.11.7': {}
+  /@sxzz/popperjs-es@2.11.7:
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+    dev: false
 
-  '@transloadit/prettier-bytes@0.0.7': {}
+  /@transloadit/prettier-bytes@0.0.7:
+    resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
+    dev: false
 
-  '@trysound/sax@0.2.0': {}
+  /@trysound/sax@0.2.0:
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+    dev: true
 
-  '@turf/along@6.5.0':
+  /@turf/along@6.5.0:
+    resolution: {integrity: sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/destination': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/angle@6.5.0':
+  /@turf/angle@6.5.0:
+    resolution: {integrity: sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/rhumb-bearing': 6.5.0
+    dev: false
 
-  '@turf/area@6.5.0':
+  /@turf/area@6.5.0:
+    resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/bbox-clip@6.5.0':
+  /@turf/bbox-clip@6.5.0:
+    resolution: {integrity: sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/bbox-polygon@6.5.0':
+  /@turf/bbox-polygon@6.5.0:
+    resolution: {integrity: sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/bbox@6.5.0':
+  /@turf/bbox@6.5.0:
+    resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/bearing@6.5.0':
+  /@turf/bearing@6.5.0:
+    resolution: {integrity: sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/bezier-spline@6.5.0':
+  /@turf/bezier-spline@6.5.0:
+    resolution: {integrity: sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/boolean-clockwise@6.5.0':
+  /@turf/boolean-clockwise@6.5.0:
+    resolution: {integrity: sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/boolean-contains@6.5.0':
+  /@turf/boolean-contains@6.5.0:
+    resolution: {integrity: sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/boolean-point-on-line': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/boolean-crosses@6.5.0':
+  /@turf/boolean-crosses@6.5.0:
+    resolution: {integrity: sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/line-intersect': 6.5.0
       '@turf/polygon-to-line': 6.5.0
+    dev: false
 
-  '@turf/boolean-disjoint@6.5.0':
+  /@turf/boolean-disjoint@6.5.0:
+    resolution: {integrity: sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/line-intersect': 6.5.0
       '@turf/meta': 6.5.0
       '@turf/polygon-to-line': 6.5.0
+    dev: false
 
-  '@turf/boolean-equal@6.5.0':
+  /@turf/boolean-equal@6.5.0:
+    resolution: {integrity: sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==}
     dependencies:
       '@turf/clean-coords': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       geojson-equality: 0.1.6
+    dev: false
 
-  '@turf/boolean-intersects@6.5.0':
+  /@turf/boolean-intersects@6.5.0:
+    resolution: {integrity: sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==}
     dependencies:
       '@turf/boolean-disjoint': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/boolean-overlap@6.5.0':
+  /@turf/boolean-overlap@6.5.0:
+    resolution: {integrity: sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
@@ -3344,33 +1106,43 @@
       '@turf/line-overlap': 6.5.0
       '@turf/meta': 6.5.0
       geojson-equality: 0.1.6
+    dev: false
 
-  '@turf/boolean-parallel@6.5.0':
+  /@turf/boolean-parallel@6.5.0:
+    resolution: {integrity: sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==}
     dependencies:
       '@turf/clean-coords': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/line-segment': 6.5.0
       '@turf/rhumb-bearing': 6.5.0
+    dev: false
 
-  '@turf/boolean-point-in-polygon@6.5.0':
+  /@turf/boolean-point-in-polygon@6.5.0:
+    resolution: {integrity: sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/boolean-point-on-line@6.5.0':
+  /@turf/boolean-point-on-line@6.5.0:
+    resolution: {integrity: sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/boolean-within@6.5.0':
+  /@turf/boolean-within@6.5.0:
+    resolution: {integrity: sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/boolean-point-on-line': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/buffer@6.5.0':
+  /@turf/buffer@6.5.0:
+    resolution: {integrity: sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/center': 6.5.0
@@ -3379,87 +1151,115 @@
       '@turf/projection': 6.5.0
       d3-geo: 1.7.1
       turf-jsts: 1.2.3
+    dev: false
 
-  '@turf/center-mean@6.5.0':
+  /@turf/center-mean@6.5.0:
+    resolution: {integrity: sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/center-median@6.5.0':
+  /@turf/center-median@6.5.0:
+    resolution: {integrity: sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==}
     dependencies:
       '@turf/center-mean': 6.5.0
       '@turf/centroid': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/center-of-mass@6.5.0':
+  /@turf/center-of-mass@6.5.0:
+    resolution: {integrity: sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==}
     dependencies:
       '@turf/centroid': 6.5.0
       '@turf/convex': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/center@6.5.0':
+  /@turf/center@6.5.0:
+    resolution: {integrity: sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/centroid@6.5.0':
+  /@turf/centroid@6.5.0:
+    resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/circle@6.5.0':
+  /@turf/circle@6.5.0:
+    resolution: {integrity: sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==}
     dependencies:
       '@turf/destination': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/clean-coords@6.5.0':
+  /@turf/clean-coords@6.5.0:
+    resolution: {integrity: sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/clone@6.5.0':
+  /@turf/clone@6.5.0:
+    resolution: {integrity: sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/clusters-dbscan@6.5.0':
+  /@turf/clusters-dbscan@6.5.0:
+    resolution: {integrity: sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
       density-clustering: 1.3.0
+    dev: false
 
-  '@turf/clusters-kmeans@6.5.0':
+  /@turf/clusters-kmeans@6.5.0:
+    resolution: {integrity: sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       skmeans: 0.9.7
+    dev: false
 
-  '@turf/clusters@6.5.0':
+  /@turf/clusters@6.5.0:
+    resolution: {integrity: sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/collect@6.5.0':
+  /@turf/collect@6.5.0:
+    resolution: {integrity: sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/helpers': 6.5.0
       rbush: 2.0.2
+    dev: false
 
-  '@turf/combine@6.5.0':
+  /@turf/combine@6.5.0:
+    resolution: {integrity: sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/concave@6.5.0':
+  /@turf/concave@6.5.0:
+    resolution: {integrity: sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/distance': 6.5.0
@@ -3469,87 +1269,117 @@
       '@turf/tin': 6.5.0
       topojson-client: 3.1.0
       topojson-server: 3.0.1
+    dev: false
 
-  '@turf/convex@6.5.0':
+  /@turf/convex@6.5.0:
+    resolution: {integrity: sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
       concaveman: 1.2.1
+    dev: false
 
-  '@turf/destination@6.5.0':
+  /@turf/destination@6.5.0:
+    resolution: {integrity: sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/difference@6.5.0':
+  /@turf/difference@6.5.0:
+    resolution: {integrity: sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       polygon-clipping: 0.15.7
+    dev: false
 
-  '@turf/dissolve@6.5.0':
+  /@turf/dissolve@6.5.0:
+    resolution: {integrity: sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       polygon-clipping: 0.15.7
+    dev: false
 
-  '@turf/distance-weight@6.5.0':
+  /@turf/distance-weight@6.5.0:
+    resolution: {integrity: sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==}
     dependencies:
       '@turf/centroid': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/distance@6.5.0':
+  /@turf/distance@6.5.0:
+    resolution: {integrity: sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/ellipse@6.5.0':
+  /@turf/ellipse@6.5.0:
+    resolution: {integrity: sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/rhumb-destination': 6.5.0
       '@turf/transform-rotate': 6.5.0
+    dev: false
 
-  '@turf/envelope@6.5.0':
+  /@turf/envelope@6.5.0:
+    resolution: {integrity: sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/bbox-polygon': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/explode@6.5.0':
+  /@turf/explode@6.5.0:
+    resolution: {integrity: sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/flatten@6.5.0':
+  /@turf/flatten@6.5.0:
+    resolution: {integrity: sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/flip@6.5.0':
+  /@turf/flip@6.5.0:
+    resolution: {integrity: sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/great-circle@6.5.0':
+  /@turf/great-circle@6.5.0:
+    resolution: {integrity: sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/helpers@6.5.0': {}
+  /@turf/helpers@6.5.0:
+    resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==}
+    dev: false
 
-  '@turf/hex-grid@6.5.0':
+  /@turf/hex-grid@6.5.0:
+    resolution: {integrity: sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==}
     dependencies:
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/intersect': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/interpolate@6.5.0':
+  /@turf/interpolate@6.5.0:
+    resolution: {integrity: sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/centroid': 6.5.0
@@ -3562,18 +1392,24 @@
       '@turf/point-grid': 6.5.0
       '@turf/square-grid': 6.5.0
       '@turf/triangle-grid': 6.5.0
+    dev: false
 
-  '@turf/intersect@6.5.0':
+  /@turf/intersect@6.5.0:
+    resolution: {integrity: sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       polygon-clipping: 0.15.7
+    dev: false
 
-  '@turf/invariant@6.5.0':
+  /@turf/invariant@6.5.0:
+    resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/isobands@6.5.0':
+  /@turf/isobands@6.5.0:
+    resolution: {integrity: sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==}
     dependencies:
       '@turf/area': 6.5.0
       '@turf/bbox': 6.5.0
@@ -3583,53 +1419,69 @@
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       object-assign: 4.1.1
+    dev: false
 
-  '@turf/isolines@6.5.0':
+  /@turf/isolines@6.5.0:
+    resolution: {integrity: sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       object-assign: 4.1.1
+    dev: false
 
-  '@turf/kinks@6.5.0':
+  /@turf/kinks@6.5.0:
+    resolution: {integrity: sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/length@6.5.0':
+  /@turf/length@6.5.0:
+    resolution: {integrity: sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==}
     dependencies:
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/line-arc@6.5.0':
+  /@turf/line-arc@6.5.0:
+    resolution: {integrity: sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==}
     dependencies:
       '@turf/circle': 6.5.0
       '@turf/destination': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/line-chunk@6.5.0':
+  /@turf/line-chunk@6.5.0:
+    resolution: {integrity: sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/length': 6.5.0
       '@turf/line-slice-along': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/line-intersect@6.5.0':
+  /@turf/line-intersect@6.5.0:
+    resolution: {integrity: sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/line-segment': 6.5.0
       '@turf/meta': 6.5.0
       geojson-rbush: 3.2.0
+    dev: false
 
-  '@turf/line-offset@6.5.0':
+  /@turf/line-offset@6.5.0:
+    resolution: {integrity: sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/line-overlap@6.5.0':
+  /@turf/line-overlap@6.5.0:
+    resolution: {integrity: sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==}
     dependencies:
       '@turf/boolean-point-on-line': 6.5.0
       '@turf/helpers': 6.5.0
@@ -3639,27 +1491,35 @@
       '@turf/nearest-point-on-line': 6.5.0
       deep-equal: 1.1.2
       geojson-rbush: 3.2.0
+    dev: false
 
-  '@turf/line-segment@6.5.0':
+  /@turf/line-segment@6.5.0:
+    resolution: {integrity: sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/line-slice-along@6.5.0':
+  /@turf/line-slice-along@6.5.0:
+    resolution: {integrity: sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/destination': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/line-slice@6.5.0':
+  /@turf/line-slice@6.5.0:
+    resolution: {integrity: sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/nearest-point-on-line': 6.5.0
+    dev: false
 
-  '@turf/line-split@6.5.0':
+  /@turf/line-split@6.5.0:
+    resolution: {integrity: sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/helpers': 6.5.0
@@ -3671,37 +1531,49 @@
       '@turf/square': 6.5.0
       '@turf/truncate': 6.5.0
       geojson-rbush: 3.2.0
+    dev: false
 
-  '@turf/line-to-polygon@6.5.0':
+  /@turf/line-to-polygon@6.5.0:
+    resolution: {integrity: sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/mask@6.5.0':
+  /@turf/mask@6.5.0:
+    resolution: {integrity: sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==}
     dependencies:
       '@turf/helpers': 6.5.0
       polygon-clipping: 0.15.7
+    dev: false
 
-  '@turf/meta@6.5.0':
+  /@turf/meta@6.5.0:
+    resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/midpoint@6.5.0':
+  /@turf/midpoint@6.5.0:
+    resolution: {integrity: sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/destination': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/moran-index@6.5.0':
+  /@turf/moran-index@6.5.0:
+    resolution: {integrity: sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==}
     dependencies:
       '@turf/distance-weight': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/nearest-point-on-line@6.5.0':
+  /@turf/nearest-point-on-line@6.5.0:
+    resolution: {integrity: sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/destination': 6.5.0
@@ -3710,43 +1582,55 @@
       '@turf/invariant': 6.5.0
       '@turf/line-intersect': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/nearest-point-to-line@6.5.0':
+  /@turf/nearest-point-to-line@6.5.0:
+    resolution: {integrity: sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       '@turf/point-to-line-distance': 6.5.0
       object-assign: 4.1.1
+    dev: false
 
-  '@turf/nearest-point@6.5.0':
+  /@turf/nearest-point@6.5.0:
+    resolution: {integrity: sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/planepoint@6.5.0':
+  /@turf/planepoint@6.5.0:
+    resolution: {integrity: sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/point-grid@6.5.0':
+  /@turf/point-grid@6.5.0:
+    resolution: {integrity: sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==}
     dependencies:
       '@turf/boolean-within': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/point-on-feature@6.5.0':
+  /@turf/point-on-feature@6.5.0:
+    resolution: {integrity: sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/center': 6.5.0
       '@turf/explode': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/nearest-point': 6.5.0
+    dev: false
 
-  '@turf/point-to-line-distance@6.5.0':
+  /@turf/point-to-line-distance@6.5.0:
+    resolution: {integrity: sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==}
     dependencies:
       '@turf/bearing': 6.5.0
       '@turf/distance': 6.5.0
@@ -3756,19 +1640,25 @@
       '@turf/projection': 6.5.0
       '@turf/rhumb-bearing': 6.5.0
       '@turf/rhumb-distance': 6.5.0
+    dev: false
 
-  '@turf/points-within-polygon@6.5.0':
+  /@turf/points-within-polygon@6.5.0:
+    resolution: {integrity: sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/polygon-smooth@6.5.0':
+  /@turf/polygon-smooth@6.5.0:
+    resolution: {integrity: sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/polygon-tangents@6.5.0':
+  /@turf/polygon-tangents@6.5.0:
+    resolution: {integrity: sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/boolean-within': 6.5.0
@@ -3776,72 +1666,96 @@
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/nearest-point': 6.5.0
+    dev: false
 
-  '@turf/polygon-to-line@6.5.0':
+  /@turf/polygon-to-line@6.5.0:
+    resolution: {integrity: sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/polygonize@6.5.0':
+  /@turf/polygonize@6.5.0:
+    resolution: {integrity: sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/envelope': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/projection@6.5.0':
+  /@turf/projection@6.5.0:
+    resolution: {integrity: sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/random@6.5.0':
+  /@turf/random@6.5.0:
+    resolution: {integrity: sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/rectangle-grid@6.5.0':
+  /@turf/rectangle-grid@6.5.0:
+    resolution: {integrity: sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==}
     dependencies:
       '@turf/boolean-intersects': 6.5.0
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/rewind@6.5.0':
+  /@turf/rewind@6.5.0:
+    resolution: {integrity: sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==}
     dependencies:
       '@turf/boolean-clockwise': 6.5.0
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/rhumb-bearing@6.5.0':
+  /@turf/rhumb-bearing@6.5.0:
+    resolution: {integrity: sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/rhumb-destination@6.5.0':
+  /@turf/rhumb-destination@6.5.0:
+    resolution: {integrity: sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/rhumb-distance@6.5.0':
+  /@turf/rhumb-distance@6.5.0:
+    resolution: {integrity: sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
+    dev: false
 
-  '@turf/sample@6.5.0':
+  /@turf/sample@6.5.0:
+    resolution: {integrity: sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/sector@6.5.0':
+  /@turf/sector@6.5.0:
+    resolution: {integrity: sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==}
     dependencies:
       '@turf/circle': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/line-arc': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/shortest-path@6.5.0':
+  /@turf/shortest-path@6.5.0:
+    resolution: {integrity: sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/bbox-polygon': 6.5.0
@@ -3852,25 +1766,33 @@
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       '@turf/transform-scale': 6.5.0
+    dev: false
 
-  '@turf/simplify@6.5.0':
+  /@turf/simplify@6.5.0:
+    resolution: {integrity: sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==}
     dependencies:
       '@turf/clean-coords': 6.5.0
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/square-grid@6.5.0':
+  /@turf/square-grid@6.5.0:
+    resolution: {integrity: sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/rectangle-grid': 6.5.0
+    dev: false
 
-  '@turf/square@6.5.0':
+  /@turf/square@6.5.0:
+    resolution: {integrity: sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==}
     dependencies:
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/standard-deviational-ellipse@6.5.0':
+  /@turf/standard-deviational-ellipse@6.5.0:
+    resolution: {integrity: sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==}
     dependencies:
       '@turf/center-mean': 6.5.0
       '@turf/ellipse': 6.5.0
@@ -3878,24 +1800,32 @@
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       '@turf/points-within-polygon': 6.5.0
+    dev: false
 
-  '@turf/tag@6.5.0':
+  /@turf/tag@6.5.0:
+    resolution: {integrity: sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==}
     dependencies:
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/tesselate@6.5.0':
+  /@turf/tesselate@6.5.0:
+    resolution: {integrity: sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==}
     dependencies:
       '@turf/helpers': 6.5.0
       earcut: 2.2.4
+    dev: false
 
-  '@turf/tin@6.5.0':
+  /@turf/tin@6.5.0:
+    resolution: {integrity: sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==}
     dependencies:
       '@turf/helpers': 6.5.0
+    dev: false
 
-  '@turf/transform-rotate@6.5.0':
+  /@turf/transform-rotate@6.5.0:
+    resolution: {integrity: sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==}
     dependencies:
       '@turf/centroid': 6.5.0
       '@turf/clone': 6.5.0
@@ -3905,8 +1835,10 @@
       '@turf/rhumb-bearing': 6.5.0
       '@turf/rhumb-destination': 6.5.0
       '@turf/rhumb-distance': 6.5.0
+    dev: false
 
-  '@turf/transform-scale@6.5.0':
+  /@turf/transform-scale@6.5.0:
+    resolution: {integrity: sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/center': 6.5.0
@@ -3918,27 +1850,35 @@
       '@turf/rhumb-bearing': 6.5.0
       '@turf/rhumb-destination': 6.5.0
       '@turf/rhumb-distance': 6.5.0
+    dev: false
 
-  '@turf/transform-translate@6.5.0':
+  /@turf/transform-translate@6.5.0:
+    resolution: {integrity: sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==}
     dependencies:
       '@turf/clone': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       '@turf/meta': 6.5.0
       '@turf/rhumb-destination': 6.5.0
+    dev: false
 
-  '@turf/triangle-grid@6.5.0':
+  /@turf/triangle-grid@6.5.0:
+    resolution: {integrity: sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==}
     dependencies:
       '@turf/distance': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/intersect': 6.5.0
+    dev: false
 
-  '@turf/truncate@6.5.0':
+  /@turf/truncate@6.5.0:
+    resolution: {integrity: sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
+    dev: false
 
-  '@turf/turf@6.5.0':
+  /@turf/turf@6.5.0:
+    resolution: {integrity: sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==}
     dependencies:
       '@turf/along': 6.5.0
       '@turf/angle': 6.5.0
@@ -4045,60 +1985,90 @@
       '@turf/union': 6.5.0
       '@turf/unkink-polygon': 6.5.0
       '@turf/voronoi': 6.5.0
+    dev: false
 
-  '@turf/union@6.5.0':
+  /@turf/union@6.5.0:
+    resolution: {integrity: sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       polygon-clipping: 0.15.7
+    dev: false
 
-  '@turf/unkink-polygon@6.5.0':
+  /@turf/unkink-polygon@6.5.0:
+    resolution: {integrity: sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==}
     dependencies:
       '@turf/area': 6.5.0
       '@turf/boolean-point-in-polygon': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
       rbush: 2.0.2
+    dev: false
 
-  '@turf/voronoi@6.5.0':
+  /@turf/voronoi@6.5.0:
+    resolution: {integrity: sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==}
     dependencies:
       '@turf/helpers': 6.5.0
       '@turf/invariant': 6.5.0
       d3-voronoi: 1.1.2
+    dev: false
 
-  '@tweenjs/tween.js@25.0.0': {}
+  /@tweenjs/tween.js@25.0.0:
+    resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==}
+    dev: false
 
-  '@types/estree@1.0.6': {}
+  /@types/estree@1.0.7:
+    resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+    dev: true
 
-  '@types/event-emitter@0.3.5': {}
+  /@types/event-emitter@0.3.5:
+    resolution: {integrity: sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==}
+    dev: false
 
-  '@types/geojson@7946.0.8': {}
+  /@types/geojson@7946.0.8:
+    resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==}
+    dev: false
 
-  '@types/lodash-es@4.17.12':
+  /@types/lodash-es@4.17.12:
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
     dependencies:
       '@types/lodash': 4.17.16
+    dev: false
 
-  '@types/lodash@4.17.16': {}
+  /@types/lodash@4.17.16:
+    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+    dev: false
 
-  '@types/node@22.13.13':
+  /@types/node@22.13.14:
+    resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==}
     dependencies:
       undici-types: 6.20.0
 
-  '@types/svgo@2.6.4':
+  /@types/svgo@2.6.4:
+    resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
     dependencies:
-      '@types/node': 22.13.13
+      '@types/node': 22.13.14
+    dev: true
 
-  '@types/trusted-types@2.0.7':
+  /@types/trusted-types@2.0.7:
+    resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+    requiresBuild: true
+    dev: false
     optional: true
 
-  '@types/web-bluetooth@0.0.16': {}
+  /@types/web-bluetooth@0.0.16:
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+    dev: false
 
-  '@uppy/companion-client@2.2.2':
+  /@uppy/companion-client@2.2.2:
+    resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==}
     dependencies:
       '@uppy/utils': 4.1.3
       namespace-emitter: 2.0.1
+    dev: false
 
-  '@uppy/core@2.3.4':
+  /@uppy/core@2.3.4:
+    resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==}
     dependencies:
       '@transloadit/prettier-bytes': 0.0.7
       '@uppy/store-default': 2.1.1
@@ -4108,26 +2078,52 @@
       namespace-emitter: 2.0.1
       nanoid: 3.3.11
       preact: 10.26.4
+    dev: false
 
-  '@uppy/store-default@2.1.1': {}
+  /@uppy/store-default@2.1.1:
+    resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==}
+    dev: false
 
-  '@uppy/utils@4.1.3':
+  /@uppy/utils@4.1.3:
+    resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==}
     dependencies:
       lodash.throttle: 4.1.1
+    dev: false
 
-  '@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4)':
+  /@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4):
+    resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==}
+    peerDependencies:
+      '@uppy/core': ^2.3.3
     dependencies:
       '@uppy/companion-client': 2.2.2
       '@uppy/core': 2.3.4
       '@uppy/utils': 4.1.3
       nanoid: 3.3.11
+    dev: false
 
-  '@vitejs/plugin-vue@5.2.3(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0))(vue@3.5.13)':
+  /@vitejs/plugin-vue@5.0.4(vite@5.2.12)(vue@3.5.13):
+    resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      vite: ^5.0.0
+      vue: ^3.2.25
     dependencies:
-      vite: 5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)
+      vite: 5.2.12(sass@1.85.1)(terser@5.31.1)
       vue: 3.5.13
+    dev: true
 
-  '@vue/compiler-core@3.5.13':
+  /@vue/compiler-core@3.4.27:
+    resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==}
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@vue/shared': 3.4.27
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+    dev: true
+
+  /@vue/compiler-core@3.5.13:
+    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
     dependencies:
       '@babel/parser': 7.27.0
       '@vue/shared': 3.5.13
@@ -4135,12 +2131,35 @@
       estree-walker: 2.0.2
       source-map-js: 1.2.1
 
-  '@vue/compiler-dom@3.5.13':
+  /@vue/compiler-dom@3.4.27:
+    resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==}
+    dependencies:
+      '@vue/compiler-core': 3.4.27
+      '@vue/shared': 3.4.27
+    dev: true
+
+  /@vue/compiler-dom@3.5.13:
+    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
     dependencies:
       '@vue/compiler-core': 3.5.13
       '@vue/shared': 3.5.13
 
-  '@vue/compiler-sfc@3.5.13':
+  /@vue/compiler-sfc@3.4.27:
+    resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==}
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@vue/compiler-core': 3.4.27
+      '@vue/compiler-dom': 3.4.27
+      '@vue/compiler-ssr': 3.4.27
+      '@vue/shared': 3.4.27
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.5.3
+      source-map-js: 1.2.1
+    dev: true
+
+  /@vue/compiler-sfc@3.5.13:
+    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
     dependencies:
       '@babel/parser': 7.27.0
       '@vue/compiler-core': 3.5.13
@@ -4152,38 +2171,60 @@
       postcss: 8.5.3
       source-map-js: 1.2.1
 
-  '@vue/compiler-ssr@3.5.13':
+  /@vue/compiler-ssr@3.4.27:
+    resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==}
+    dependencies:
+      '@vue/compiler-dom': 3.4.27
+      '@vue/shared': 3.4.27
+    dev: true
+
+  /@vue/compiler-ssr@3.5.13:
+    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
     dependencies:
       '@vue/compiler-dom': 3.5.13
       '@vue/shared': 3.5.13
 
-  '@vue/devtools-api@6.6.4': {}
+  /@vue/devtools-api@6.6.4:
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+    dev: false
 
-  '@vue/reactivity@3.5.13':
+  /@vue/reactivity@3.5.13:
+    resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
     dependencies:
       '@vue/shared': 3.5.13
 
-  '@vue/runtime-core@3.5.13':
+  /@vue/runtime-core@3.5.13:
+    resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
     dependencies:
       '@vue/reactivity': 3.5.13
       '@vue/shared': 3.5.13
 
-  '@vue/runtime-dom@3.5.13':
+  /@vue/runtime-dom@3.5.13:
+    resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
     dependencies:
       '@vue/reactivity': 3.5.13
       '@vue/runtime-core': 3.5.13
       '@vue/shared': 3.5.13
       csstype: 3.1.3
 
-  '@vue/server-renderer@3.5.13(vue@3.5.13)':
+  /@vue/server-renderer@3.5.13(vue@3.5.13):
+    resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
+    peerDependencies:
+      vue: 3.5.13
     dependencies:
       '@vue/compiler-ssr': 3.5.13
       '@vue/shared': 3.5.13
       vue: 3.5.13
 
-  '@vue/shared@3.5.13': {}
+  /@vue/shared@3.4.27:
+    resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==}
+    dev: true
 
-  '@vueuse/core@9.13.0(vue@3.5.13)':
+  /@vue/shared@3.5.13:
+    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+  /@vueuse/core@9.13.0(vue@3.5.13):
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
     dependencies:
       '@types/web-bluetooth': 0.0.16
       '@vueuse/metadata': 9.13.0
@@ -4192,35 +2233,72 @@
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
+    dev: false
 
-  '@vueuse/metadata@9.13.0': {}
+  /@vueuse/metadata@9.13.0:
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+    dev: false
 
-  '@vueuse/shared@9.13.0(vue@3.5.13)':
+  /@vueuse/shared@9.13.0(vue@3.5.13):
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
     dependencies:
       vue-demi: 0.14.10(vue@3.5.13)
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
+    dev: false
 
-  '@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.throttle: ^4.1.1
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       is-url: 1.2.4
       lodash.throttle: 4.1.1
       nanoid: 3.3.11
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==}
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       prismjs: 1.30.0
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==}
+    peerDependencies:
+      '@uppy/core': ^2.1.1
+      '@uppy/xhr-upload': ^2.0.3
+      dom7: ^3.0.0
+      is-hotkey: ^0.2.0
+      lodash.camelcase: ^4.3.0
+      lodash.clonedeep: ^4.5.0
+      lodash.debounce: ^4.0.8
+      lodash.foreach: ^4.5.0
+      lodash.isequal: ^4.5.0
+      lodash.throttle: ^4.1.1
+      lodash.toarray: ^4.4.0
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
       '@types/event-emitter': 0.3.5
       '@uppy/core': 2.3.4
@@ -4242,23 +2320,30 @@
       slate: 0.72.8
       slate-history: 0.66.0(slate@0.72.8)
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13)':
+  /@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13):
+    resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==}
+    peerDependencies:
+      '@wangeditor/editor': '>=5.1.0'
+      vue: ^3.0.5
     dependencies:
       '@wangeditor/editor': 5.1.23
       vue: 3.5.13
+    dev: false
 
-  '@wangeditor/editor@5.1.23':
+  /@wangeditor/editor@5.1.23:
+    resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==}
     dependencies:
       '@uppy/core': 2.3.4
       '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
-      '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       is-hotkey: 0.2.0
       lodash.camelcase: 4.3.0
@@ -4271,73 +2356,155 @@
       nanoid: 3.3.11
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==}
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==}
+    peerDependencies:
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.isequal: ^4.5.0
+      lodash.throttle: ^4.1.1
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       lodash.isequal: 4.5.0
       lodash.throttle: 4.1.1
       nanoid: 3.3.11
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==}
+    peerDependencies:
+      '@uppy/core': ^2.0.3
+      '@uppy/xhr-upload': ^2.0.3
+      '@wangeditor/basic-modules': 1.x
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      lodash.foreach: ^4.5.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
       '@uppy/core': 2.3.4
       '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
-      '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       lodash.foreach: 4.5.0
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)':
+  /@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2):
+    resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==}
+    peerDependencies:
+      '@uppy/core': ^2.1.4
+      '@uppy/xhr-upload': ^2.0.7
+      '@wangeditor/core': 1.x
+      dom7: ^3.0.0
+      nanoid: ^3.2.0
+      slate: ^0.72.0
+      snabbdom: ^3.1.0
     dependencies:
       '@uppy/core': 2.3.4
       '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
-      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
+      '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.2)
       dom7: 3.0.0
       nanoid: 3.3.11
       slate: 0.72.8
       snabbdom: 3.6.2
+    dev: false
 
-  '@zip.js/zip.js@2.7.57': {}
+  /@zip.js/zip.js@2.7.60:
+    resolution: {integrity: sha512-vA3rLyqdxBrVo1FWSsbyoecaqWTV+vgPRf0QKeM7kVDG0r+lHUqd7zQDv1TO9k4BcAoNzNDSNrrel24Mk6addA==}
+    engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
+    dev: false
 
-  acorn@8.14.1: {}
+  /acorn@8.14.1:
+    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
 
-  animate.css@4.1.1: {}
+  /animate.css@4.1.1:
+    resolution: {integrity: sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==}
+    dev: false
 
-  ansi-regex@2.1.1: {}
+  /ansi-regex@2.1.1:
+    resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  ansi-styles@2.2.1: {}
+  /ansi-styles@2.2.1:
+    resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  ansi-styles@4.3.0:
+  /ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
     dependencies:
       color-convert: 2.0.1
+    dev: true
 
-  arr-diff@4.0.0: {}
+  /anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+    dev: true
 
-  arr-flatten@1.1.0: {}
+  /arr-diff@4.0.0:
+    resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  arr-union@3.1.0: {}
+  /arr-flatten@1.1.0:
+    resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  array-buffer-byte-length@1.0.2:
+  /arr-union@3.1.0:
+    resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /array-buffer-byte-length@1.0.2:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       is-array-buffer: 3.0.5
+    dev: true
 
-  array-unique@0.3.2: {}
+  /array-unique@0.3.2:
+    resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  arraybuffer.prototype.slice@1.0.4:
+  /arraybuffer.prototype.slice@1.0.4:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       array-buffer-byte-length: 1.0.2
       call-bind: 1.0.8
@@ -4346,41 +2513,70 @@
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
       is-array-buffer: 3.0.5
+    dev: true
 
-  assign-symbols@1.0.0: {}
+  /assign-symbols@1.0.0:
+    resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  async-function@1.0.0: {}
+  /async-function@1.0.0:
+    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  async-validator@4.2.5: {}
+  /async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+    dev: false
 
-  asynckit@0.4.0: {}
+  /asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+    dev: false
 
-  atob@2.1.2: {}
+  /atob@2.1.2:
+    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+    engines: {node: '>= 4.5.0'}
+    hasBin: true
+    dev: true
 
-  autolinker@4.1.0:
+  /autolinker@4.1.0:
+    resolution: {integrity: sha512-mYzdZMei1zIXcHVS/LjnuCJG+C/hNi8O+5m0R8YWtrIBWGrjL8CVzEZXxOfH0l1kioEXHNpUJRkgZdyL4GgIHQ==}
     dependencies:
       tslib: 2.8.1
+    dev: false
 
-  available-typed-arrays@1.0.7:
+  /available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       possible-typed-array-names: 1.1.0
+    dev: true
 
-  avue-plugin-ueditor@1.0.4(axios@1.8.4)(vue@3.5.13):
+  /avue-plugin-ueditor@1.0.4(axios@1.8.3)(vue@3.5.13):
+    resolution: {integrity: sha512-fFOFsduZI9yK3LE7FpLMqqLJoWp4xGTDj08wmSS2CkBL6H1+P8+7u9lEcvRejnvytUBhv87xKNhHdMuWru1Umg==}
+    peerDependencies:
+      axios: '>=0.18.0'
+      vue: '>=3.2.0'
     dependencies:
       '@wangeditor/editor': 5.1.23
       '@wangeditor/editor-for-vue': 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13)
-      axios: 1.8.4
+      axios: 1.8.3
       vue: 3.5.13
+    dev: false
 
-  axios@1.8.4:
+  /axios@1.8.3:
+    resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==}
     dependencies:
       follow-redirects: 1.15.9
       form-data: 4.0.2
       proxy-from-env: 1.1.0
     transitivePeerDependencies:
       - debug
+    dev: false
 
-  base@0.11.2:
+  /base@0.11.2:
+    resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       cache-base: 1.0.1
       class-utils: 0.3.6
@@ -4389,16 +2585,31 @@
       isobject: 3.0.1
       mixin-deep: 1.3.2
       pascalcase: 0.1.1
+    dev: true
 
-  big.js@5.2.2: {}
+  /big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+    dev: true
 
-  bitmap-sdf@1.0.4: {}
+  /binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+    dev: true
 
-  bluebird@3.7.2: {}
+  /bitmap-sdf@1.0.4:
+    resolution: {integrity: sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==}
+    dev: false
 
-  boolbase@1.0.0: {}
+  /bluebird@3.7.2:
+    resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+    dev: true
 
-  bpmn-js@11.5.0:
+  /boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+    dev: true
+
+  /bpmn-js@11.5.0:
+    resolution: {integrity: sha512-Bdj53UvfiDtGE1wmiBmpgjl5RMLhCGV/C841dyC+t4kBHj7vApAeeHs2Qiycj390HO4B2U8UDROLT7yjdXEEUA==}
     dependencies:
       bpmn-moddle: 8.1.0
       diagram-js: 11.13.1
@@ -4409,14 +2620,19 @@
       min-dom: 4.2.1
       object-refs: 0.3.0
       tiny-svg: 3.1.3
+    dev: false
 
-  bpmn-moddle@8.1.0:
+  /bpmn-moddle@8.1.0:
+    resolution: {integrity: sha512-yI5OAFfYVJwViKTsTsonVfCBPtB3MlefADUORwNIxxBOMp21vnoxuxsdgUWlPH/dvAEZh/+mr8UtqOBNu8NC5Q==}
     dependencies:
       min-dash: 4.2.3
       moddle: 6.2.3
       moddle-xml: 10.1.0
+    dev: false
 
-  braces@2.3.2:
+  /braces@2.3.2:
+    resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       arr-flatten: 1.1.0
       array-unique: 0.3.2
@@ -4430,14 +2646,22 @@
       to-regex: 3.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  braces@3.0.3:
+  /braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
     dependencies:
       fill-range: 7.1.1
+    dev: true
 
-  buffer-from@1.1.2: {}
+  /buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+    dev: true
 
-  cache-base@1.0.1:
+  /cache-base@1.0.1:
+    resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       collection-visit: 1.0.0
       component-emitter: 1.3.1
@@ -4448,177 +2672,317 @@
       to-object-path: 0.3.0
       union-value: 1.0.1
       unset-value: 1.0.0
+    dev: true
 
-  call-bind-apply-helpers@1.0.2:
+  /call-bind-apply-helpers@1.0.2:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       function-bind: 1.1.2
 
-  call-bind@1.0.8:
+  /call-bind@1.0.8:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind-apply-helpers: 1.0.2
       es-define-property: 1.0.1
       get-intrinsic: 1.3.0
       set-function-length: 1.2.2
 
-  call-bound@1.0.4:
+  /call-bound@1.0.4:
+    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind-apply-helpers: 1.0.2
       get-intrinsic: 1.3.0
 
-  cesium@1.127.0:
+  /cesium@1.126.0:
+    resolution: {integrity: sha512-29Cy6eq9NzTbQUaOXQEnVJyYoHCeizrBTbbB76OClI5+FNq9saUUx+iQXg/J6r8vX+KWt6oD/lVpZ0QMcvAgog==}
+    engines: {node: '>=18.18.0'}
     dependencies:
-      '@cesium/engine': 15.0.0
-      '@cesium/widgets': 11.0.0
+      '@cesium/engine': 14.0.0
+      '@cesium/widgets': 10.2.0
+    dev: false
 
-  chalk@1.1.3:
+  /chalk@1.1.3:
+    resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       ansi-styles: 2.2.1
       escape-string-regexp: 1.0.5
       has-ansi: 2.0.0
       strip-ansi: 3.0.1
       supports-color: 2.0.0
+    dev: true
 
-  chalk@4.1.2:
+  /chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
     dependencies:
       ansi-styles: 4.3.0
       supports-color: 7.2.0
+    dev: true
 
-  chokidar@4.0.3:
+  /chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
+  /chokidar@4.0.3:
+    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+    engines: {node: '>= 14.16.0'}
     dependencies:
       readdirp: 4.1.2
+    dev: true
 
-  class-utils@0.3.6:
+  /class-utils@0.3.6:
+    resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       arr-union: 3.1.0
       define-property: 0.2.5
       isobject: 3.0.1
       static-extend: 0.1.2
+    dev: true
 
-  clipboard@2.0.11:
+  /clipboard@2.0.11:
+    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
     dependencies:
       good-listener: 1.2.2
       select: 1.1.2
       tiny-emitter: 2.1.0
+    dev: false
 
-  clone@2.1.2: {}
+  /clone@2.1.2:
+    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+    engines: {node: '>=0.8'}
+    dev: true
 
-  clsx@1.2.1: {}
+  /clsx@1.2.1:
+    resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+    engines: {node: '>=6'}
+    dev: false
 
-  codemirror@5.65.19: {}
+  /codemirror@5.65.16:
+    resolution: {integrity: sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==}
+    dev: false
 
-  collection-visit@1.0.0:
+  /collection-visit@1.0.0:
+    resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       map-visit: 1.0.0
       object-visit: 1.0.1
+    dev: true
 
-  color-convert@2.0.1:
+  /color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
     dependencies:
       color-name: 1.1.4
+    dev: true
 
-  color-name@1.1.4: {}
+  /color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+    dev: true
 
-  combined-stream@1.0.8:
+  /combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
     dependencies:
       delayed-stream: 1.0.0
+    dev: false
 
-  commander@2.20.3: {}
+  /commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
 
-  commander@7.2.0: {}
+  /commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+    dev: true
 
-  component-emitter@1.3.1: {}
+  /component-emitter@1.3.1:
+    resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+    dev: true
 
-  component-event@0.2.1: {}
+  /component-event@0.2.1:
+    resolution: {integrity: sha512-wGA++isMqiDq1jPYeyv2as/Bt/u+3iLW0rEa+8NQ82jAv3TgqMiCM+B2SaBdn2DfLilLjjq736YcezihRYhfxw==}
+    dev: false
 
-  compute-scroll-into-view@1.0.20: {}
+  /compute-scroll-into-view@1.0.20:
+    resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+    dev: false
 
-  concaveman@1.2.1:
+  /concaveman@1.2.1:
+    resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==}
     dependencies:
       point-in-polygon: 1.1.0
       rbush: 3.0.1
       robust-predicates: 2.0.4
       tinyqueue: 2.0.3
+    dev: false
 
-  confbox@0.1.8: {}
+  /confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+    dev: true
 
-  copy-descriptor@0.1.1: {}
+  /copy-descriptor@0.1.1:
+    resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  cors@2.8.5:
+  /cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
     dependencies:
       object-assign: 4.1.1
       vary: 1.1.2
+    dev: true
 
-  countup.js@1.9.3: {}
+  /countup.js@1.9.3:
+    resolution: {integrity: sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A==}
+    dev: false
 
-  countup.js@2.8.0: {}
+  /countup.js@2.8.0:
+    resolution: {integrity: sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==}
+    dev: false
 
-  crypto-js@4.2.0: {}
+  /crypto-js@4.1.1:
+    resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==}
+    dev: false
 
-  css-select@4.3.0:
+  /css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
     dependencies:
       boolbase: 1.0.0
       css-what: 6.1.0
       domhandler: 4.3.1
       domutils: 2.8.0
       nth-check: 2.1.1
+    dev: true
 
-  css-tree@1.1.3:
+  /css-tree@1.1.3:
+    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+    engines: {node: '>=8.0.0'}
     dependencies:
       mdn-data: 2.0.14
       source-map: 0.6.1
+    dev: true
 
-  css-what@6.1.0: {}
+  /css-what@6.1.0:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+    dev: true
 
-  csso@4.2.0:
+  /csso@4.2.0:
+    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+    engines: {node: '>=8.0.0'}
     dependencies:
       css-tree: 1.1.3
+    dev: true
 
-  csstype@3.1.3: {}
+  /csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 
-  d3-array@1.2.4: {}
+  /d3-array@1.2.4:
+    resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
+    dev: false
 
-  d3-geo@1.7.1:
+  /d3-geo@1.7.1:
+    resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==}
     dependencies:
       d3-array: 1.2.4
+    dev: false
 
-  d3-voronoi@1.1.2: {}
+  /d3-voronoi@1.1.2:
+    resolution: {integrity: sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==}
+    dev: false
 
-  d@1.0.2:
+  /d@1.0.2:
+    resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
+    engines: {node: '>=0.12'}
     dependencies:
       es5-ext: 0.10.64
       type: 2.7.3
+    dev: false
 
-  data-view-buffer@1.0.2:
+  /data-view-buffer@1.0.2:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       is-data-view: 1.0.2
+    dev: true
 
-  data-view-byte-length@1.0.2:
+  /data-view-byte-length@1.0.2:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       is-data-view: 1.0.2
+    dev: true
 
-  data-view-byte-offset@1.0.1:
+  /data-view-byte-offset@1.0.1:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       is-data-view: 1.0.2
+    dev: true
 
-  dayjs@1.11.13: {}
+  /dayjs@1.10.6:
+    resolution: {integrity: sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==}
+    dev: false
 
-  debug@2.6.9:
+  /dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+    dev: false
+
+  /debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
     dependencies:
       ms: 2.0.0
+    dev: true
 
-  debug@4.4.0:
+  /debug@4.4.0:
+    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
     dependencies:
       ms: 2.1.3
+    dev: true
 
-  decode-uri-component@0.2.2: {}
+  /decode-uri-component@0.2.2:
+    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+    engines: {node: '>=0.10'}
+    dev: true
 
-  deep-equal@1.1.2:
+  /deep-equal@1.1.2:
+    resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-arguments: 1.2.0
       is-date-object: 1.1.0
@@ -4626,48 +2990,79 @@
       object-is: 1.1.6
       object-keys: 1.1.1
       regexp.prototype.flags: 1.5.4
+    dev: false
 
-  define-data-property@1.1.4:
+  /define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-define-property: 1.0.1
       es-errors: 1.3.0
       gopd: 1.2.0
 
-  define-properties@1.2.1:
+  /define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       define-data-property: 1.1.4
       has-property-descriptors: 1.0.2
       object-keys: 1.1.1
 
-  define-property@0.2.5:
+  /define-property@0.2.5:
+    resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-descriptor: 0.1.7
+    dev: true
 
-  define-property@1.0.0:
+  /define-property@1.0.0:
+    resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-descriptor: 1.0.3
+    dev: true
 
-  define-property@2.0.2:
+  /define-property@2.0.2:
+    resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-descriptor: 1.0.3
       isobject: 3.0.1
+    dev: true
 
-  delayed-stream@1.0.0: {}
+  /delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+    dev: false
 
-  delegate@3.2.0: {}
+  /delegate@3.2.0:
+    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+    dev: false
 
-  density-clustering@1.3.0: {}
+  /density-clustering@1.3.0:
+    resolution: {integrity: sha512-icpmBubVTwLnsaor9qH/4tG5+7+f61VcqMN3V3pm9sxxSCt2Jcs0zWOgwZW9ARJYaKD3FumIgHiMOcIMRRAzFQ==}
+    dev: false
 
-  detect-libc@1.0.3:
+  /detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+    requiresBuild: true
+    dev: true
     optional: true
 
-  diagram-js-direct-editing@2.1.2(diagram-js@11.13.1):
+  /diagram-js-direct-editing@2.1.2(diagram-js@11.13.1):
+    resolution: {integrity: sha512-VpccLAnLqLF1cp3fk363QUbRVTd/qTcj2oOb+IqgcmOiWszJp7J9Ta6y5GjUvw48hDZpzCatlmWwA4CJ3MaYGQ==}
+    peerDependencies:
+      diagram-js: '*'
     dependencies:
       diagram-js: 11.13.1
       min-dash: 4.2.3
       min-dom: 4.2.1
+    dev: false
 
-  diagram-js@11.13.1:
+  /diagram-js@11.13.1:
+    resolution: {integrity: sha512-6kO0rBN6aBIQiMELfv1oX2Ohes/brlIPuOVZUYAioeWM0EyuazhAXgHeq8iKFt29daU9NGRr4n78esGx8QjtjQ==}
     dependencies:
       '@bpmn-io/diagram-js-ui': 0.2.3
       clsx: 1.2.1
@@ -4679,78 +3074,119 @@
       object-refs: 0.3.0
       path-intersection: 2.2.1
       tiny-svg: 3.1.3
+    dev: false
 
-  didi@9.0.2: {}
+  /didi@9.0.2:
+    resolution: {integrity: sha512-q2+aj+lnJcUweV7A9pdUrwFr4LHVmRPwTmQLtHPFz4aT7IBoryN6Iy+jmFku+oIzr5ebBkvtBCOb87+dJhb7bg==}
+    dev: false
 
-  disable-devtool@0.3.8: {}
+  /disable-devtool@0.3.8:
+    resolution: {integrity: sha512-spwifiBbcgDTVEdzoWyH3NjZ1he/OgJmUNXvMgEffJ8Fh2B6mEJjCCEV25wlJSyNXEdGyzKFFRXh4kVDRK/wCg==}
+    dev: false
 
-  dom-serializer@0.2.2:
+  /dom-serializer@0.2.2:
+    resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
     dependencies:
       domelementtype: 2.3.0
       entities: 2.2.0
+    dev: true
 
-  dom-serializer@1.4.1:
+  /dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
     dependencies:
       domelementtype: 2.3.0
       domhandler: 4.3.1
       entities: 2.2.0
+    dev: true
 
-  dom7@3.0.0:
+  /dom7@3.0.0:
+    resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==}
     dependencies:
       ssr-window: 3.0.0
+    dev: false
 
-  domelementtype@1.3.1: {}
+  /domelementtype@1.3.1:
+    resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+    dev: true
 
-  domelementtype@2.3.0: {}
+  /domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+    dev: true
 
-  domhandler@2.4.2:
+  /domhandler@2.4.2:
+    resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
     dependencies:
       domelementtype: 1.3.1
+    dev: true
 
-  domhandler@4.3.1:
+  /domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
     dependencies:
       domelementtype: 2.3.0
+    dev: true
 
-  domify@1.4.2: {}
+  /domify@1.4.2:
+    resolution: {integrity: sha512-m4yreHcUWHBncGVV7U+yQzc12vIlq0jMrtHZ5mW6dQMiL/7skSYNVX9wqKwOtyO9SGCgevrAFEgOCAHmamHTUA==}
+    dev: false
 
-  dompurify@3.2.4:
+  /dompurify@3.2.4:
+    resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==}
     optionalDependencies:
       '@types/trusted-types': 2.0.7
+    dev: false
 
-  domutils@1.7.0:
+  /domutils@1.7.0:
+    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
     dependencies:
       dom-serializer: 0.2.2
       domelementtype: 1.3.1
+    dev: true
 
-  domutils@2.8.0:
+  /domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
     dependencies:
       dom-serializer: 1.4.1
       domelementtype: 2.3.0
       domhandler: 4.3.1
+    dev: true
 
-  draco3d@1.5.7: {}
+  /draco3d@1.5.7:
+    resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==}
+    dev: false
 
-  dunder-proto@1.0.1:
+  /dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind-apply-helpers: 1.0.2
       es-errors: 1.3.0
       gopd: 1.2.0
 
-  earcut@2.2.4: {}
+  /earcut@2.2.4:
+    resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
+    dev: false
 
-  earcut@3.0.1: {}
+  /earcut@3.0.1:
+    resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==}
+    dev: false
 
-  echarts@5.6.0:
+  /echarts@5.6.0:
+    resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
     dependencies:
       tslib: 2.3.0
       zrender: 5.6.1
+    dev: false
 
-  element-plus@2.9.7(vue@3.5.13):
+  /element-plus@2.9.3(vue@3.5.13):
+    resolution: {integrity: sha512-6tSLp5XytDS4TMZ0P3aGZnr7MXTagfNycepNfIDitd9IgwM9y01+Ssu6mglNi8RiXYhek6LBWNOd/cvpIO12+w==}
+    peerDependencies:
+      vue: ^3.2.0
     dependencies:
       '@ctrl/tinycolor': 3.6.1
       '@element-plus/icons-vue': 2.3.1(vue@3.5.13)
       '@floating-ui/dom': 1.6.13
-      '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+      '@popperjs/core': /@sxzz/popperjs-es@2.11.7
       '@types/lodash': 4.17.16
       '@types/lodash-es': 4.17.12
       '@vueuse/core': 9.13.0(vue@3.5.13)
@@ -4765,16 +3201,28 @@
       vue: 3.5.13
     transitivePeerDependencies:
       - '@vue/composition-api'
+    dev: false
 
-  emojis-list@3.0.0: {}
+  /emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+    dev: true
 
-  entities@1.1.2: {}
+  /entities@1.1.2:
+    resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+    dev: true
 
-  entities@2.2.0: {}
+  /entities@2.2.0:
+    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+    dev: true
 
-  entities@4.5.0: {}
+  /entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
 
-  es-abstract@1.23.9:
+  /es-abstract@1.23.9:
+    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       array-buffer-byte-length: 1.0.2
       arraybuffer.prototype.slice: 1.0.4
@@ -4827,95 +3275,140 @@
       typed-array-length: 1.0.7
       unbox-primitive: 1.1.0
       which-typed-array: 1.1.19
+    dev: true
 
-  es-define-property@1.0.1: {}
+  /es-define-property@1.0.1:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
 
-  es-errors@1.3.0: {}
+  /es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
 
-  es-object-atoms@1.1.1:
+  /es-object-atoms@1.1.1:
+    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
 
-  es-set-tostringtag@2.1.0:
+  /es-set-tostringtag@2.1.0:
+    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
       has-tostringtag: 1.0.2
       hasown: 2.0.2
 
-  es-to-primitive@1.3.0:
+  /es-to-primitive@1.3.0:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-callable: 1.2.7
       is-date-object: 1.1.0
       is-symbol: 1.1.1
+    dev: true
 
-  es5-ext@0.10.64:
+  /es5-ext@0.10.64:
+    resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
+    engines: {node: '>=0.10'}
+    requiresBuild: true
     dependencies:
       es6-iterator: 2.0.3
       es6-symbol: 3.1.4
       esniff: 2.0.1
       next-tick: 1.1.0
+    dev: false
 
-  es6-iterator@2.0.3:
+  /es6-iterator@2.0.3:
+    resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
     dependencies:
       d: 1.0.2
       es5-ext: 0.10.64
       es6-symbol: 3.1.4
+    dev: false
 
-  es6-symbol@3.1.4:
+  /es6-symbol@3.1.4:
+    resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
+    engines: {node: '>=0.12'}
     dependencies:
       d: 1.0.2
       ext: 1.7.0
+    dev: false
 
-  esbuild@0.21.5:
+  /esbuild@0.20.2:
+    resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
     optionalDependencies:
-      '@esbuild/aix-ppc64': 0.21.5
-      '@esbuild/android-arm': 0.21.5
-      '@esbuild/android-arm64': 0.21.5
-      '@esbuild/android-x64': 0.21.5
-      '@esbuild/darwin-arm64': 0.21.5
-      '@esbuild/darwin-x64': 0.21.5
-      '@esbuild/freebsd-arm64': 0.21.5
-      '@esbuild/freebsd-x64': 0.21.5
-      '@esbuild/linux-arm': 0.21.5
-      '@esbuild/linux-arm64': 0.21.5
-      '@esbuild/linux-ia32': 0.21.5
-      '@esbuild/linux-loong64': 0.21.5
-      '@esbuild/linux-mips64el': 0.21.5
-      '@esbuild/linux-ppc64': 0.21.5
-      '@esbuild/linux-riscv64': 0.21.5
-      '@esbuild/linux-s390x': 0.21.5
-      '@esbuild/linux-x64': 0.21.5
-      '@esbuild/netbsd-x64': 0.21.5
-      '@esbuild/openbsd-x64': 0.21.5
-      '@esbuild/sunos-x64': 0.21.5
-      '@esbuild/win32-arm64': 0.21.5
-      '@esbuild/win32-ia32': 0.21.5
-      '@esbuild/win32-x64': 0.21.5
+      '@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
+    dev: true
 
-  escape-html@1.0.3: {}
+  /escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+    dev: false
 
-  escape-string-regexp@1.0.5: {}
+  /escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+    dev: true
 
-  escape-string-regexp@5.0.0: {}
+  /escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+    dev: true
 
-  esniff@2.0.1:
+  /esniff@2.0.1:
+    resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
+    engines: {node: '>=0.10'}
     dependencies:
       d: 1.0.2
       es5-ext: 0.10.64
       event-emitter: 0.3.5
       type: 2.7.3
+    dev: false
 
-  estree-walker@2.0.2: {}
+  /estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
 
-  etag@1.8.1: {}
+  /etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+    dev: true
 
-  event-emitter@0.3.5:
+  /event-emitter@0.3.5:
+    resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
     dependencies:
       d: 1.0.2
       es5-ext: 0.10.64
+    dev: false
 
-  expand-brackets@2.1.4:
+  /expand-brackets@2.1.4:
+    resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       debug: 2.6.9
       define-property: 0.2.5
@@ -4926,21 +3419,32 @@
       to-regex: 3.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  ext@1.7.0:
+  /ext@1.7.0:
+    resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
     dependencies:
       type: 2.7.3
+    dev: false
 
-  extend-shallow@2.0.1:
+  /extend-shallow@2.0.1:
+    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-extendable: 0.1.1
+    dev: true
 
-  extend-shallow@3.0.2:
+  /extend-shallow@3.0.2:
+    resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       assign-symbols: 1.0.0
       is-extendable: 1.0.1
+    dev: true
 
-  extglob@2.0.4:
+  /extglob@2.0.4:
+    resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       array-unique: 0.3.2
       define-property: 1.0.0
@@ -4952,61 +3456,105 @@
       to-regex: 3.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  fast-glob@3.3.3:
+  /fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
     dependencies:
       '@nodelib/fs.stat': 2.0.5
       '@nodelib/fs.walk': 1.2.8
       glob-parent: 5.1.2
       merge2: 1.4.1
       micromatch: 4.0.8
+    dev: true
 
-  fastq@1.19.1:
+  /fastq@1.19.1:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
     dependencies:
       reusify: 1.1.0
+    dev: true
 
-  fill-range@4.0.0:
+  /fill-range@4.0.0:
+    resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       extend-shallow: 2.0.1
       is-number: 3.0.0
       repeat-string: 1.6.1
       to-regex-range: 2.1.1
+    dev: true
 
-  fill-range@7.1.1:
+  /fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+    requiresBuild: true
     dependencies:
       to-regex-range: 5.0.1
+    dev: true
 
-  follow-redirects@1.15.9: {}
+  /follow-redirects@1.15.9:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+    dev: false
 
-  for-each@0.3.5:
+  /for-each@0.3.5:
+    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-callable: 1.2.7
+    dev: true
 
-  for-in@1.0.2: {}
+  /for-in@1.0.2:
+    resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  form-data@4.0.2:
+  /form-data@4.0.2:
+    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+    engines: {node: '>= 6'}
     dependencies:
       asynckit: 0.4.0
       combined-stream: 1.0.8
       es-set-tostringtag: 2.1.0
       mime-types: 2.1.35
+    dev: false
 
-  fragment-cache@0.2.1:
+  /fragment-cache@0.2.1:
+    resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       map-cache: 0.2.2
+    dev: true
 
-  fs-extra@10.1.0:
+  /fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
     dependencies:
       graceful-fs: 4.2.11
       jsonfile: 6.1.0
       universalify: 2.0.1
+    dev: true
 
-  fsevents@2.3.3:
+  /fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
     optional: true
 
-  function-bind@1.1.2: {}
+  /function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
 
-  function.prototype.name@1.1.8:
+  /function.prototype.name@1.1.8:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
@@ -5014,22 +3562,30 @@
       functions-have-names: 1.2.3
       hasown: 2.0.2
       is-callable: 1.2.7
+    dev: true
 
-  functions-have-names@1.2.3: {}
+  /functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
 
-  geojson-equality@0.1.6:
+  /geojson-equality@0.1.6:
+    resolution: {integrity: sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==}
     dependencies:
       deep-equal: 1.1.2
+    dev: false
 
-  geojson-rbush@3.2.0:
+  /geojson-rbush@3.2.0:
+    resolution: {integrity: sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==}
     dependencies:
       '@turf/bbox': 6.5.0
       '@turf/helpers': 6.5.0
       '@turf/meta': 6.5.0
       '@types/geojson': 7946.0.8
       rbush: 3.0.1
+    dev: false
 
-  get-intrinsic@1.3.0:
+  /get-intrinsic@1.3.0:
+    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind-apply-helpers: 1.0.2
       es-define-property: 1.0.1
@@ -5042,96 +3598,166 @@
       hasown: 2.0.2
       math-intrinsics: 1.1.0
 
-  get-proto@1.0.1:
+  /get-proto@1.0.1:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
     dependencies:
       dunder-proto: 1.0.1
       es-object-atoms: 1.1.1
 
-  get-symbol-description@1.1.0:
+  /get-symbol-description@1.1.0:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
+    dev: true
 
-  get-value@2.0.6: {}
+  /get-value@2.0.6:
+    resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  glob-parent@5.1.2:
+  /glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
     dependencies:
       is-glob: 4.0.3
+    dev: true
 
-  globalthis@1.0.4:
+  /globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       define-properties: 1.2.1
       gopd: 1.2.0
+    dev: true
 
-  good-listener@1.2.2:
+  /good-listener@1.2.2:
+    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
     dependencies:
       delegate: 3.2.0
+    dev: false
 
-  gopd@1.2.0: {}
+  /gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
 
-  graceful-fs@4.2.11: {}
+  /graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+    dev: true
 
-  grapheme-splitter@1.0.4: {}
+  /grapheme-splitter@1.0.4:
+    resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+    dev: false
 
-  hammerjs@2.0.8: {}
+  /hammerjs@2.0.8:
+    resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==}
+    engines: {node: '>=0.8.0'}
+    dev: false
 
-  has-ansi@2.0.0:
+  /has-ansi@2.0.0:
+    resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       ansi-regex: 2.1.1
+    dev: true
 
-  has-bigints@1.1.0: {}
+  /has-bigints@1.1.0:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  has-flag@1.0.0: {}
+  /has-flag@1.0.0:
+    resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  has-flag@4.0.0: {}
+  /has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+    dev: true
 
-  has-property-descriptors@1.0.2:
+  /has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
     dependencies:
       es-define-property: 1.0.1
 
-  has-proto@1.2.0:
+  /has-proto@1.2.0:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       dunder-proto: 1.0.1
+    dev: true
 
-  has-symbols@1.1.0: {}
+  /has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
 
-  has-tostringtag@1.0.2:
+  /has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       has-symbols: 1.1.0
 
-  has-value@0.3.1:
+  /has-value@0.3.1:
+    resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       get-value: 2.0.6
       has-values: 0.1.4
       isobject: 2.1.0
+    dev: true
 
-  has-value@1.0.0:
+  /has-value@1.0.0:
+    resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       get-value: 2.0.6
       has-values: 1.0.0
       isobject: 3.0.1
+    dev: true
 
-  has-values@0.1.4: {}
+  /has-values@0.1.4:
+    resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  has-values@1.0.0:
+  /has-values@1.0.0:
+    resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-number: 3.0.0
       kind-of: 4.0.0
+    dev: true
 
-  hasown@2.0.2:
+  /hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       function-bind: 1.1.2
 
-  he@1.2.0: {}
+  /he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+    dev: true
 
-  highlight.js@11.11.1: {}
+  /highlight.js@11.9.0:
+    resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
+    engines: {node: '>=12.0.0'}
+    dev: false
 
-  htm@3.1.1: {}
+  /htm@3.1.1:
+    resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==}
+    dev: false
 
-  html-void-elements@2.0.1: {}
+  /html-void-elements@2.0.1:
+    resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+    dev: false
 
-  htmlparser2@3.10.1:
+  /htmlparser2@3.10.1:
+    resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
     dependencies:
       domelementtype: 1.3.1
       domhandler: 2.4.2
@@ -5139,302 +3765,546 @@
       entities: 1.1.2
       inherits: 2.0.4
       readable-stream: 3.6.2
+    dev: true
 
-  i18next@20.6.1:
+  /i18next@20.6.1:
+    resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==}
     dependencies:
       '@babel/runtime': 7.27.0
+    dev: false
 
-  ids@1.0.5: {}
+  /ids@1.0.5:
+    resolution: {integrity: sha512-XQ0yom/4KWTL29sLG+tyuycy7UmeaM/79GRtSJq6IG9cJGIPeBz5kwDCguie3TwxaMNIc3WtPi0cTa1XYHicpw==}
+    dev: false
 
-  image-size@0.5.5: {}
+  /image-size@0.5.5:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+    dev: true
 
-  immer@9.0.21: {}
+  /immer@9.0.21:
+    resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+    dev: false
 
-  immutable@5.1.1: {}
+  /immutable@5.1.1:
+    resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==}
+    dev: true
 
-  inherits-browser@0.1.0: {}
+  /inherits-browser@0.1.0:
+    resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==}
+    dev: false
 
-  inherits@2.0.4: {}
+  /inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+    dev: true
 
-  internal-slot@1.1.0:
+  /internal-slot@1.1.0:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       hasown: 2.0.2
       side-channel: 1.1.0
+    dev: true
 
-  is-accessor-descriptor@1.0.1:
+  /is-accessor-descriptor@1.0.1:
+    resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+    engines: {node: '>= 0.10'}
     dependencies:
       hasown: 2.0.2
+    dev: true
 
-  is-arguments@1.2.0:
+  /is-arguments@1.2.0:
+    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
+    dev: false
 
-  is-array-buffer@3.0.5:
+  /is-array-buffer@3.0.5:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
       get-intrinsic: 1.3.0
+    dev: true
 
-  is-async-function@2.1.1:
+  /is-async-function@2.1.1:
+    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       async-function: 1.0.0
       call-bound: 1.0.4
       get-proto: 1.0.1
       has-tostringtag: 1.0.2
       safe-regex-test: 1.1.0
+    dev: true
 
-  is-bigint@1.1.0:
+  /is-bigint@1.1.0:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       has-bigints: 1.1.0
+    dev: true
 
-  is-boolean-object@1.2.2:
+  /is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+    dependencies:
+      binary-extensions: 2.3.0
+    dev: true
+
+  /is-boolean-object@1.2.2:
+    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
+    dev: true
 
-  is-buffer@1.1.6: {}
+  /is-buffer@1.1.6:
+    resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+    dev: true
 
-  is-callable@1.2.7: {}
+  /is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  is-data-descriptor@1.0.1:
+  /is-data-descriptor@1.0.1:
+    resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       hasown: 2.0.2
+    dev: true
 
-  is-data-view@1.0.2:
+  /is-data-view@1.0.2:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       get-intrinsic: 1.3.0
       is-typed-array: 1.1.15
+    dev: true
 
-  is-date-object@1.1.0:
+  /is-date-object@1.1.0:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
 
-  is-descriptor@0.1.7:
+  /is-descriptor@0.1.7:
+    resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-accessor-descriptor: 1.0.1
       is-data-descriptor: 1.0.1
+    dev: true
 
-  is-descriptor@1.0.3:
+  /is-descriptor@1.0.3:
+    resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-accessor-descriptor: 1.0.1
       is-data-descriptor: 1.0.1
+    dev: true
 
-  is-extendable@0.1.1: {}
+  /is-extendable@0.1.1:
+    resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  is-extendable@1.0.1:
+  /is-extendable@1.0.1:
+    resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-plain-object: 2.0.4
+    dev: true
 
-  is-extglob@2.1.1: {}
+  /is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+    requiresBuild: true
+    dev: true
 
-  is-finalizationregistry@1.1.1:
+  /is-finalizationregistry@1.1.1:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
+    dev: true
 
-  is-generator-function@1.1.0:
+  /is-generator-function@1.1.0:
+    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       get-proto: 1.0.1
       has-tostringtag: 1.0.2
       safe-regex-test: 1.1.0
+    dev: true
 
-  is-glob@4.0.3:
+  /is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-extglob: 2.1.1
+    dev: true
 
-  is-hotkey@0.2.0: {}
+  /is-hotkey@0.2.0:
+    resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
+    dev: false
 
-  is-map@2.0.3: {}
+  /is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  is-number-object@1.1.1:
+  /is-number-object@1.1.1:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
+    dev: true
 
-  is-number@3.0.0:
+  /is-number@3.0.0:
+    resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       kind-of: 3.2.2
+    dev: true
 
-  is-number@7.0.0: {}
+  /is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+    requiresBuild: true
+    dev: true
 
-  is-plain-obj@1.1.0: {}
+  /is-plain-obj@1.1.0:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  is-plain-object@2.0.4:
+  /is-plain-object@2.0.4:
+    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       isobject: 3.0.1
+    dev: true
 
-  is-plain-object@5.0.0: {}
+  /is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+    dev: false
 
-  is-regex@1.2.1:
+  /is-regex@1.2.1:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       gopd: 1.2.0
       has-tostringtag: 1.0.2
       hasown: 2.0.2
 
-  is-set@2.0.3: {}
+  /is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  is-shared-array-buffer@1.0.4:
+  /is-shared-array-buffer@1.0.4:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
+    dev: true
 
-  is-string@1.1.1:
+  /is-string@1.1.1:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-tostringtag: 1.0.2
+    dev: true
 
-  is-symbol@1.1.1:
+  /is-symbol@1.1.1:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-symbols: 1.1.0
       safe-regex-test: 1.1.0
+    dev: true
 
-  is-typed-array@1.1.15:
+  /is-typed-array@1.1.15:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       which-typed-array: 1.1.19
+    dev: true
 
-  is-url@1.2.4: {}
+  /is-url@1.2.4:
+    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+    dev: false
 
-  is-weakmap@2.0.2: {}
+  /is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  is-weakref@1.1.1:
+  /is-weakref@1.1.1:
+    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
+    dev: true
 
-  is-weakset@2.0.4:
+  /is-weakset@2.0.4:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       get-intrinsic: 1.3.0
+    dev: true
 
-  is-windows@1.0.2: {}
+  /is-windows@1.0.2:
+    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  isarray@1.0.0: {}
+  /isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+    dev: true
 
-  isarray@2.0.5: {}
+  /isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+    dev: true
 
-  isobject@2.1.0:
+  /isobject@2.1.0:
+    resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       isarray: 1.0.0
+    dev: true
 
-  isobject@3.0.1: {}
+  /isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  js-base64@2.6.4: {}
+  /js-base64@2.6.4:
+    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+    dev: true
 
-  js-base64@3.7.7: {}
+  /js-base64@3.7.4:
+    resolution: {integrity: sha512-wpM/wi20Tl+3ifTyi0RdDckS4YTD4Lf953mBRrpG8547T7hInHNPEj8+ck4gB8VDcGyeAWFK++Wb/fU1BeavKQ==}
+    dev: false
 
-  js-cookie@3.0.5: {}
+  /js-cookie@3.0.0:
+    resolution: {integrity: sha512-oUbbplKuH07/XX2YD2+Q+GMiPpnVXaRz8npE7suhBH9QEkJe2W7mQ6rwuMXHue3fpfcftQwzgyvGzIHyfCSngQ==}
+    engines: {node: '>=12'}
+    dev: false
 
-  js-md5@0.7.3: {}
+  /js-md5@0.7.3:
+    resolution: {integrity: sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==}
+    dev: false
 
-  jsbn@1.1.0: {}
+  /jsbn@1.1.0:
+    resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
+    dev: false
 
-  jsep@1.4.0: {}
+  /jsep@1.4.0:
+    resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==}
+    engines: {node: '>= 10.16.0'}
+    dev: false
 
-  json5@1.0.2:
+  /json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
     dependencies:
       minimist: 1.2.8
+    dev: true
 
-  jsonfile@6.1.0:
+  /jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
     dependencies:
       universalify: 2.0.1
     optionalDependencies:
       graceful-fs: 4.2.11
+    dev: true
 
-  kdbush@4.0.2: {}
+  /kdbush@4.0.2:
+    resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
+    dev: false
 
-  kind-of@3.2.2:
+  /kind-of@3.2.2:
+    resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-buffer: 1.1.6
+    dev: true
 
-  kind-of@4.0.0:
+  /kind-of@4.0.0:
+    resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-buffer: 1.1.6
+    dev: true
 
-  kind-of@5.1.0: {}
+  /kind-of@5.1.0:
+    resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  kind-of@6.0.3: {}
+  /kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  ktx-parse@1.0.0: {}
+  /ktx-parse@0.7.1:
+    resolution: {integrity: sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==}
+    dev: false
 
-  lerc@2.0.0: {}
+  /lerc@2.0.0:
+    resolution: {integrity: sha512-7qo1Mq8ZNmaR4USHHm615nEW2lPeeWJ3bTyoqFbd35DLx0LUH7C6ptt5FDCTAlbIzs3+WKrk5SkJvw8AFDE2hg==}
+    dev: false
 
-  loader-utils@1.4.2:
+  /loader-utils@1.4.2:
+    resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+    engines: {node: '>=4.0.0'}
     dependencies:
       big.js: 5.2.2
       emojis-list: 3.0.0
       json5: 1.0.2
+    dev: true
 
-  local-pkg@0.4.3: {}
+  /local-pkg@0.4.3:
+    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+    engines: {node: '>=14'}
+    dev: true
 
-  lodash-es@4.17.21: {}
+  /lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+    dev: false
 
-  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+  /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
     dependencies:
       '@types/lodash-es': 4.17.12
       lodash: 4.17.21
       lodash-es: 4.17.21
+    dev: false
 
-  lodash.camelcase@4.3.0: {}
+  /lodash.camelcase@4.3.0:
+    resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+    dev: false
 
-  lodash.clonedeep@4.5.0: {}
+  /lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+    dev: false
 
-  lodash.debounce@4.0.8: {}
+  /lodash.debounce@4.0.8:
+    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+    dev: false
 
-  lodash.foreach@4.5.0: {}
+  /lodash.foreach@4.5.0:
+    resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==}
+    dev: false
 
-  lodash.isequal@4.5.0: {}
+  /lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+    deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+    dev: false
 
-  lodash.throttle@4.1.1: {}
+  /lodash.throttle@4.1.1:
+    resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+    dev: false
 
-  lodash.toarray@4.4.0: {}
+  /lodash.toarray@4.4.0:
+    resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==}
+    dev: false
 
-  lodash@4.17.21: {}
+  /lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: false
 
-  long@5.3.1: {}
+  /long@5.3.1:
+    resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==}
+    dev: false
 
-  magic-string@0.25.9:
+  /magic-string@0.25.9:
+    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
     dependencies:
       sourcemap-codec: 1.4.8
+    dev: true
 
-  magic-string@0.26.7:
+  /magic-string@0.26.7:
+    resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+    engines: {node: '>=12'}
     dependencies:
       sourcemap-codec: 1.4.8
+    dev: true
 
-  magic-string@0.27.0:
+  /magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  magic-string@0.30.17:
-    dependencies:
-      '@jridgewell/sourcemap-codec': 1.5.0
+  /map-cache@0.2.2:
+    resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  map-cache@0.2.2: {}
-
-  map-visit@1.0.0:
+  /map-visit@1.0.0:
+    resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       object-visit: 1.0.1
+    dev: true
 
-  math-intrinsics@1.1.0: {}
+  /math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
 
-  mdn-data@2.0.14: {}
+  /mdn-data@2.0.14:
+    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+    dev: true
 
-  memoize-one@6.0.0: {}
+  /memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+    dev: false
 
-  merge-options@1.0.1:
+  /merge-options@1.0.1:
+    resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
+    engines: {node: '>=4'}
     dependencies:
       is-plain-obj: 1.1.0
+    dev: true
 
-  merge2@1.4.1: {}
+  /merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+    dev: true
 
-  mersenne-twister@1.1.0: {}
+  /mersenne-twister@1.1.0:
+    resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==}
+    dev: false
 
-  meshoptimizer@0.22.0: {}
+  /meshoptimizer@0.22.0:
+    resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
+    dev: false
 
-  micromatch@3.1.0:
+  /micromatch@3.1.0:
+    resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       arr-diff: 4.0.0
       array-unique: 0.3.2
@@ -5451,63 +4321,110 @@
       to-regex: 3.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  micromatch@4.0.8:
+  /micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
     dependencies:
       braces: 3.0.3
       picomatch: 2.3.1
+    dev: true
 
-  mime-db@1.52.0: {}
+  /mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+    dev: false
 
-  mime-match@1.0.2:
+  /mime-match@1.0.2:
+    resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==}
     dependencies:
       wildcard: 1.1.2
+    dev: false
 
-  mime-types@2.1.35:
+  /mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
     dependencies:
       mime-db: 1.52.0
+    dev: false
 
-  min-dash@4.2.3: {}
+  /min-dash@4.2.3:
+    resolution: {integrity: sha512-VLMYQI5+FcD9Ad24VcB08uA83B07OhueAlZ88jBK6PyupTvEJwllTMUqMy0wPGYs7pZUEtEEMWdHB63m3LtEcg==}
+    dev: false
 
-  min-dom@4.2.1:
+  /min-dom@4.2.1:
+    resolution: {integrity: sha512-TMoL8SEEIhUWYgkj7XMSgxmwSyGI+4fP2KFFGnN3FbHfbGHVdsLYSz8LoIsgPhz4dWRmLvxWWSMgzZMJW5sZuA==}
     dependencies:
       component-event: 0.2.1
       domify: 1.4.2
       min-dash: 4.2.3
+    dev: false
 
-  minimist@1.2.8: {}
+  /minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+    dev: true
 
-  mixin-deep@1.3.2:
+  /mixin-deep@1.3.2:
+    resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       for-in: 1.0.2
       is-extendable: 1.0.1
+    dev: true
 
-  mlly@1.7.4:
+  /mlly@0.5.17:
+    resolution: {integrity: sha512-Rn+ai4G+CQXptDFSRNnChEgNr+xAEauYhwRvpPl/UHStTlgkIftplgJRsA2OXPuoUn86K4XAjB26+x5CEvVb6A==}
+    dependencies:
+      acorn: 8.14.1
+      pathe: 1.1.2
+      pkg-types: 1.3.1
+      ufo: 1.5.4
+    dev: true
+
+  /mlly@1.7.4:
+    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
     dependencies:
       acorn: 8.14.1
       pathe: 2.0.3
       pkg-types: 1.3.1
       ufo: 1.5.4
+    dev: true
 
-  moddle-xml@10.1.0:
+  /moddle-xml@10.1.0:
+    resolution: {integrity: sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==}
     dependencies:
       min-dash: 4.2.3
       moddle: 6.2.3
       saxen: 8.1.2
+    dev: false
 
-  moddle@6.2.3:
+  /moddle@6.2.3:
+    resolution: {integrity: sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==}
     dependencies:
       min-dash: 4.2.3
+    dev: false
 
-  ms@2.0.0: {}
+  /ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+    dev: true
 
-  ms@2.1.3: {}
+  /ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+    dev: true
 
-  namespace-emitter@2.0.1: {}
+  /namespace-emitter@2.0.1:
+    resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
+    dev: false
 
-  nanoid@3.3.11: {}
+  /nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
 
-  nanomatch@1.2.13:
+  /nanomatch@1.2.13:
+    resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       arr-diff: 4.0.0
       array-unique: 0.3.2
@@ -5522,46 +4439,85 @@
       to-regex: 3.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  next-tick@1.1.0: {}
+  /next-tick@1.1.0:
+    resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
+    dev: false
 
-  node-addon-api@7.1.1:
+  /node-addon-api@7.1.1:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+    requiresBuild: true
+    dev: true
     optional: true
 
-  normalize-wheel-es@1.2.0: {}
+  /normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  nosleep.js@0.12.0: {}
+  /normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+    dev: false
 
-  nprogress@0.2.0: {}
+  /nosleep.js@0.12.0:
+    resolution: {integrity: sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==}
+    dev: false
 
-  nth-check@2.1.1:
+  /nprogress@0.2.0:
+    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+    dev: false
+
+  /nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
     dependencies:
       boolbase: 1.0.0
+    dev: true
 
-  object-assign@4.1.1: {}
+  /object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
 
-  object-copy@0.1.0:
+  /object-copy@0.1.0:
+    resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       copy-descriptor: 0.1.1
       define-property: 0.2.5
       kind-of: 3.2.2
+    dev: true
 
-  object-inspect@1.13.4: {}
+  /object-inspect@1.13.4:
+    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  object-is@1.1.6:
+  /object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       define-properties: 1.2.1
+    dev: false
 
-  object-keys@1.1.1: {}
+  /object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
 
-  object-refs@0.3.0: {}
+  /object-refs@0.3.0:
+    resolution: {integrity: sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==}
+    dev: false
 
-  object-visit@1.0.1:
+  /object-visit@1.0.1:
+    resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       isobject: 3.0.1
+    dev: true
 
-  object.assign@4.1.7:
+  /object.assign@4.1.7:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
@@ -5569,103 +4525,178 @@
       es-object-atoms: 1.1.1
       has-symbols: 1.1.0
       object-keys: 1.1.1
+    dev: true
 
-  object.pick@1.3.0:
+  /object.pick@1.3.0:
+    resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       isobject: 3.0.1
+    dev: true
 
-  own-keys@1.0.1:
+  /own-keys@1.0.1:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       get-intrinsic: 1.3.0
       object-keys: 1.1.1
       safe-push-apply: 1.0.0
+    dev: true
 
-  pako@2.1.0: {}
+  /pako@2.1.0:
+    resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+    dev: false
 
-  pascalcase@0.1.1: {}
+  /pascalcase@0.1.1:
+    resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  path-intersection@2.2.1: {}
+  /path-intersection@2.2.1:
+    resolution: {integrity: sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==}
+    dev: false
 
-  pathe@0.2.0: {}
+  /pathe@0.2.0:
+    resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+    dev: true
 
-  pathe@1.1.2: {}
+  /pathe@0.3.9:
+    resolution: {integrity: sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g==}
+    dev: true
 
-  pathe@2.0.3: {}
+  /pathe@1.1.2:
+    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+    dev: true
 
-  picocolors@1.1.1: {}
+  /pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+    dev: true
 
-  picomatch@2.3.1: {}
+  /picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
 
-  picomatch@4.0.2: {}
+  /picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+    dev: true
 
-  pkg-types@1.3.1:
+  /pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
     dependencies:
       confbox: 0.1.8
       mlly: 1.7.4
       pathe: 2.0.3
+    dev: true
 
-  point-in-polygon@1.1.0: {}
+  /point-in-polygon@1.1.0:
+    resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
+    dev: false
 
-  polygon-clipping@0.15.7:
+  /polygon-clipping@0.15.7:
+    resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==}
     dependencies:
       robust-predicates: 3.0.2
       splaytree: 3.1.2
+    dev: false
 
-  posix-character-classes@0.1.1: {}
+  /posix-character-classes@0.1.1:
+    resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  possible-typed-array-names@1.1.0: {}
+  /possible-typed-array-names@1.1.0:
+    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+    engines: {node: '>= 0.4'}
+    dev: true
 
-  postcss-prefix-selector@1.16.1(postcss@5.2.18):
+  /postcss-prefix-selector@1.16.1(postcss@5.2.18):
+    resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+    peerDependencies:
+      postcss: '>4 <9'
     dependencies:
       postcss: 5.2.18
+    dev: true
 
-  postcss-pxtorem@6.1.0(postcss@5.2.18):
+  /postcss-pxtorem@6.1.0(postcss@8.5.3):
+    resolution: {integrity: sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==}
+    peerDependencies:
+      postcss: ^8.0.0
     dependencies:
-      postcss: 5.2.18
+      postcss: 8.5.3
+    dev: false
 
-  postcss@5.2.18:
+  /postcss@5.2.18:
+    resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+    engines: {node: '>=0.12'}
     dependencies:
       chalk: 1.1.3
       js-base64: 2.6.4
       source-map: 0.5.7
       supports-color: 3.2.3
+    dev: true
 
-  postcss@8.5.3:
+  /postcss@8.5.3:
+    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+    engines: {node: ^10 || ^12 || >=14}
     dependencies:
       nanoid: 3.3.11
       picocolors: 1.1.1
       source-map-js: 1.2.1
 
-  posthtml-parser@0.2.1:
+  /posthtml-parser@0.2.1:
+    resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
     dependencies:
       htmlparser2: 3.10.1
       isobject: 2.1.0
+    dev: true
 
-  posthtml-rename-id@1.0.12:
+  /posthtml-rename-id@1.0.12:
+    resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
     dependencies:
       escape-string-regexp: 1.0.5
+    dev: true
 
-  posthtml-render@1.4.0: {}
+  /posthtml-render@1.4.0:
+    resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
+    engines: {node: '>=10'}
+    dev: true
 
-  posthtml-svg-mode@1.0.3:
+  /posthtml-svg-mode@1.0.3:
+    resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
     dependencies:
       merge-options: 1.0.1
       posthtml: 0.9.2
       posthtml-parser: 0.2.1
       posthtml-render: 1.4.0
+    dev: true
 
-  posthtml@0.9.2:
+  /posthtml@0.9.2:
+    resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       posthtml-parser: 0.2.1
       posthtml-render: 1.4.0
+    dev: true
 
-  preact@10.26.4: {}
+  /preact@10.26.4:
+    resolution: {integrity: sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==}
+    dev: false
 
-  prettier@2.8.8: {}
+  /prettier@2.8.7:
+    resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dev: true
 
-  prismjs@1.30.0: {}
+  /prismjs@1.30.0:
+    resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+    engines: {node: '>=6'}
+    dev: false
 
-  protobufjs@7.4.0:
+  /protobufjs@7.4.0:
+    resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
+    engines: {node: '>=12.0.0'}
+    requiresBuild: true
     dependencies:
       '@protobufjs/aspromise': 1.1.2
       '@protobufjs/base64': 1.1.2
@@ -5677,41 +4708,78 @@
       '@protobufjs/path': 1.1.2
       '@protobufjs/pool': 1.1.0
       '@protobufjs/utf8': 1.1.0
-      '@types/node': 22.13.13
+      '@types/node': 22.13.14
       long: 5.3.1
+    dev: false
 
-  proxy-from-env@1.1.0: {}
+  /proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+    dev: false
 
-  query-string@4.3.4:
+  /query-string@4.3.4:
+    resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       object-assign: 4.1.1
       strict-uri-encode: 1.1.0
+    dev: true
 
-  queue-microtask@1.2.3: {}
+  /queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+    dev: true
 
-  quickselect@1.1.1: {}
+  /quickselect@1.1.1:
+    resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==}
+    dev: false
 
-  quickselect@2.0.0: {}
+  /quickselect@2.0.0:
+    resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
+    dev: false
 
-  randomcolor@0.6.2: {}
+  /randomcolor@0.6.2:
+    resolution: {integrity: sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==}
+    dev: false
 
-  rbush@2.0.2:
+  /rbush@2.0.2:
+    resolution: {integrity: sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==}
     dependencies:
       quickselect: 1.1.1
+    dev: false
 
-  rbush@3.0.1:
+  /rbush@3.0.1:
+    resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==}
     dependencies:
       quickselect: 2.0.0
+    dev: false
 
-  readable-stream@3.6.2:
+  /readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
     dependencies:
       inherits: 2.0.4
       string_decoder: 1.3.0
       util-deprecate: 1.0.2
+    dev: true
 
-  readdirp@4.1.2: {}
+  /readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+    dependencies:
+      picomatch: 2.3.1
+    dev: true
 
-  reflect.getprototypeof@1.0.10:
+  /readdirp@4.1.2:
+    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+    engines: {node: '>= 14.18.0'}
+    dev: true
+
+  /reconnecting-websocket@4.4.0:
+    resolution: {integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==}
+    dev: false
+
+  /reflect.getprototypeof@1.0.10:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       define-properties: 1.2.1
@@ -5721,15 +4789,23 @@
       get-intrinsic: 1.3.0
       get-proto: 1.0.1
       which-builtin-type: 1.2.1
+    dev: true
 
-  regenerator-runtime@0.14.1: {}
+  /regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+    dev: false
 
-  regex-not@1.0.2:
+  /regex-not@1.0.2:
+    resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       extend-shallow: 3.0.2
       safe-regex: 1.1.0
+    dev: true
 
-  regexp.prototype.flags@1.5.4:
+  /regexp.prototype.flags@1.5.4:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       define-properties: 1.2.1
@@ -5738,94 +4814,146 @@
       gopd: 1.2.0
       set-function-name: 2.0.2
 
-  repeat-element@1.1.4: {}
+  /repeat-element@1.1.4:
+    resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  repeat-string@1.6.1: {}
+  /repeat-string@1.6.1:
+    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+    engines: {node: '>=0.10'}
+    dev: true
 
-  resolve-url@0.2.1: {}
+  /resolve-url@0.2.1:
+    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+    deprecated: https://github.com/lydell/resolve-url#deprecated
+    dev: true
 
-  ret@0.1.15: {}
+  /ret@0.1.15:
+    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+    engines: {node: '>=0.12'}
+    dev: true
 
-  reusify@1.1.0: {}
+  /reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+    dev: true
 
-  robust-predicates@2.0.4: {}
+  /robust-predicates@2.0.4:
+    resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==}
+    dev: false
 
-  robust-predicates@3.0.2: {}
+  /robust-predicates@3.0.2:
+    resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+    dev: false
 
-  rollup@4.37.0:
+  /rollup@4.38.0:
+    resolution: {integrity: sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
     dependencies:
-      '@types/estree': 1.0.6
+      '@types/estree': 1.0.7
     optionalDependencies:
-      '@rollup/rollup-android-arm-eabi': 4.37.0
-      '@rollup/rollup-android-arm64': 4.37.0
-      '@rollup/rollup-darwin-arm64': 4.37.0
-      '@rollup/rollup-darwin-x64': 4.37.0
-      '@rollup/rollup-freebsd-arm64': 4.37.0
-      '@rollup/rollup-freebsd-x64': 4.37.0
-      '@rollup/rollup-linux-arm-gnueabihf': 4.37.0
-      '@rollup/rollup-linux-arm-musleabihf': 4.37.0
-      '@rollup/rollup-linux-arm64-gnu': 4.37.0
-      '@rollup/rollup-linux-arm64-musl': 4.37.0
-      '@rollup/rollup-linux-loongarch64-gnu': 4.37.0
-      '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0
-      '@rollup/rollup-linux-riscv64-gnu': 4.37.0
-      '@rollup/rollup-linux-riscv64-musl': 4.37.0
-      '@rollup/rollup-linux-s390x-gnu': 4.37.0
-      '@rollup/rollup-linux-x64-gnu': 4.37.0
-      '@rollup/rollup-linux-x64-musl': 4.37.0
-      '@rollup/rollup-win32-arm64-msvc': 4.37.0
-      '@rollup/rollup-win32-ia32-msvc': 4.37.0
-      '@rollup/rollup-win32-x64-msvc': 4.37.0
+      '@rollup/rollup-android-arm-eabi': 4.38.0
+      '@rollup/rollup-android-arm64': 4.38.0
+      '@rollup/rollup-darwin-arm64': 4.38.0
+      '@rollup/rollup-darwin-x64': 4.38.0
+      '@rollup/rollup-freebsd-arm64': 4.38.0
+      '@rollup/rollup-freebsd-x64': 4.38.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.38.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.38.0
+      '@rollup/rollup-linux-arm64-gnu': 4.38.0
+      '@rollup/rollup-linux-arm64-musl': 4.38.0
+      '@rollup/rollup-linux-loongarch64-gnu': 4.38.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.38.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.38.0
+      '@rollup/rollup-linux-riscv64-musl': 4.38.0
+      '@rollup/rollup-linux-s390x-gnu': 4.38.0
+      '@rollup/rollup-linux-x64-gnu': 4.38.0
+      '@rollup/rollup-linux-x64-musl': 4.38.0
+      '@rollup/rollup-win32-arm64-msvc': 4.38.0
+      '@rollup/rollup-win32-ia32-msvc': 4.38.0
+      '@rollup/rollup-win32-x64-msvc': 4.38.0
       fsevents: 2.3.3
+    dev: true
 
-  run-parallel@1.2.0:
+  /run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
     dependencies:
       queue-microtask: 1.2.3
+    dev: true
 
-  safe-array-concat@1.1.3:
+  /safe-array-concat@1.1.3:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
       get-intrinsic: 1.3.0
       has-symbols: 1.1.0
       isarray: 2.0.5
+    dev: true
 
-  safe-buffer@5.2.1: {}
+  /safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+    dev: true
 
-  safe-push-apply@1.0.0:
+  /safe-push-apply@1.0.0:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       isarray: 2.0.5
+    dev: true
 
-  safe-regex-test@1.1.0:
+  /safe-regex-test@1.1.0:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       is-regex: 1.2.1
+    dev: true
 
-  safe-regex@1.1.0:
+  /safe-regex@1.1.0:
+    resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
     dependencies:
       ret: 0.1.15
+    dev: true
 
-  sass@1.86.0:
+  /sass@1.85.1:
+    resolution: {integrity: sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
     dependencies:
       chokidar: 4.0.3
       immutable: 5.1.1
       source-map-js: 1.2.1
     optionalDependencies:
       '@parcel/watcher': 2.5.1
+    dev: true
 
-  saxen@8.1.2: {}
+  /saxen@8.1.2:
+    resolution: {integrity: sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==}
+    dev: false
 
-  scroll-into-view-if-needed@2.2.31:
+  /scroll-into-view-if-needed@2.2.31:
+    resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
     dependencies:
       compute-scroll-into-view: 1.0.20
+    dev: false
 
-  scule@1.3.0: {}
+  /scule@0.3.2:
+    resolution: {integrity: sha512-zIvPdjOH8fv8CgrPT5eqtxHQXmPNnV/vHJYffZhE43KZkvULvpCTvOt1HPlFaCZx287INL9qaqrZg34e8NgI4g==}
+    dev: true
 
-  select@1.1.2: {}
+  /select@1.1.2:
+    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
+    dev: false
 
-  set-function-length@1.2.2:
+  /set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       define-data-property: 1.1.4
       es-errors: 1.3.0
@@ -5834,86 +4962,129 @@
       gopd: 1.2.0
       has-property-descriptors: 1.0.2
 
-  set-function-name@2.0.2:
+  /set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       define-data-property: 1.1.4
       es-errors: 1.3.0
       functions-have-names: 1.2.3
       has-property-descriptors: 1.0.2
 
-  set-proto@1.0.0:
+  /set-proto@1.0.0:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       dunder-proto: 1.0.1
       es-errors: 1.3.0
       es-object-atoms: 1.1.1
+    dev: true
 
-  set-value@2.0.1:
+  /set-value@2.0.1:
+    resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       extend-shallow: 2.0.1
       is-extendable: 0.1.1
       is-plain-object: 2.0.4
       split-string: 3.1.0
+    dev: true
 
-  side-channel-list@1.0.0:
+  /side-channel-list@1.0.0:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       object-inspect: 1.13.4
+    dev: true
 
-  side-channel-map@1.0.1:
+  /side-channel-map@1.0.1:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
       object-inspect: 1.13.4
+    dev: true
 
-  side-channel-weakmap@1.0.2:
+  /side-channel-weakmap@1.0.2:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       get-intrinsic: 1.3.0
       object-inspect: 1.13.4
       side-channel-map: 1.0.1
+    dev: true
 
-  side-channel@1.1.0:
+  /side-channel@1.1.0:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       es-errors: 1.3.0
       object-inspect: 1.13.4
       side-channel-list: 1.0.0
       side-channel-map: 1.0.1
       side-channel-weakmap: 1.0.2
+    dev: true
 
-  signature_pad@5.0.7: {}
+  /signature_pad@5.0.7:
+    resolution: {integrity: sha512-j2C6NTZ3c99G3hvFTsg6oOWy/tmftgwIXrvsr3+99+5SuPW6OdSpo++ZUzLVNfNHYmp2Z2Al76YV/3RhS/nDJg==}
+    dev: false
 
-  skmeans@0.9.7: {}
+  /skmeans@0.9.7:
+    resolution: {integrity: sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==}
+    dev: false
 
-  slate-history@0.66.0(slate@0.72.8):
+  /slate-history@0.66.0(slate@0.72.8):
+    resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==}
+    peerDependencies:
+      slate: '>=0.65.3'
     dependencies:
       is-plain-object: 5.0.0
       slate: 0.72.8
+    dev: false
 
-  slate@0.72.8:
+  /slate@0.72.8:
+    resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==}
     dependencies:
       immer: 9.0.21
       is-plain-object: 5.0.0
       tiny-warning: 1.0.3
+    dev: false
 
-  sm-crypto@0.3.13:
+  /sm-crypto@0.3.13:
+    resolution: {integrity: sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==}
     dependencies:
       jsbn: 1.1.0
+    dev: false
 
-  snabbdom@3.6.2: {}
+  /snabbdom@3.6.2:
+    resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==}
+    engines: {node: '>=12.17.0'}
+    dev: false
 
-  snapdragon-node@2.1.1:
+  /snapdragon-node@2.1.1:
+    resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       define-property: 1.0.0
       isobject: 3.0.1
       snapdragon-util: 3.0.1
+    dev: true
 
-  snapdragon-util@3.0.1:
+  /snapdragon-util@3.0.1:
+    resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       kind-of: 3.2.2
+    dev: true
 
-  snapdragon@0.8.2:
+  /snapdragon@0.8.2:
+    resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       base: 0.11.2
       debug: 2.6.9
@@ -5925,50 +5096,89 @@
       use: 3.1.1
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  sortablejs@1.14.0: {}
+  /sortablejs@1.14.0:
+    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==}
+    dev: false
 
-  source-map-js@1.2.1: {}
+  /source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
 
-  source-map-resolve@0.5.3:
+  /source-map-resolve@0.5.3:
+    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
     dependencies:
       atob: 2.1.2
       decode-uri-component: 0.2.2
       resolve-url: 0.2.1
       source-map-url: 0.4.1
       urix: 0.1.0
+    dev: true
 
-  source-map-support@0.5.21:
+  /source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
     dependencies:
       buffer-from: 1.1.2
       source-map: 0.6.1
+    dev: true
 
-  source-map-url@0.4.1: {}
+  /source-map-url@0.4.1:
+    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+    deprecated: See https://github.com/lydell/source-map-url#deprecated
+    dev: true
 
-  source-map@0.5.7: {}
+  /source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  source-map@0.6.1: {}
+  /source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
 
-  sourcemap-codec@1.4.8: {}
+  /sourcemap-codec@1.4.8:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+    dev: true
 
-  splaytree@3.1.2: {}
+  /splaytree@3.1.2:
+    resolution: {integrity: sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==}
+    dev: false
 
-  split-string@3.1.0:
+  /split-string@3.1.0:
+    resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       extend-shallow: 3.0.2
+    dev: true
 
-  ssr-window@3.0.0: {}
+  /ssr-window@3.0.0:
+    resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==}
+    dev: false
 
-  stable@0.1.8: {}
+  /stable@0.1.8:
+    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+    dev: true
 
-  static-extend@0.1.2:
+  /static-extend@0.1.2:
+    resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       define-property: 0.2.5
       object-copy: 0.1.0
+    dev: true
 
-  strict-uri-encode@1.1.0: {}
+  /strict-uri-encode@1.1.0:
+    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  string.prototype.trim@1.2.10:
+  /string.prototype.trim@1.2.10:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
@@ -5977,43 +5187,67 @@
       es-abstract: 1.23.9
       es-object-atoms: 1.1.1
       has-property-descriptors: 1.0.2
+    dev: true
 
-  string.prototype.trimend@1.0.9:
+  /string.prototype.trimend@1.0.9:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       call-bound: 1.0.4
       define-properties: 1.2.1
       es-object-atoms: 1.1.1
+    dev: true
 
-  string.prototype.trimstart@1.0.8:
+  /string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       define-properties: 1.2.1
       es-object-atoms: 1.1.1
+    dev: true
 
-  string_decoder@1.3.0:
+  /string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
     dependencies:
       safe-buffer: 5.2.1
+    dev: true
 
-  strip-ansi@3.0.1:
+  /strip-ansi@3.0.1:
+    resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       ansi-regex: 2.1.1
+    dev: true
 
-  strip-literal@1.3.0:
+  /strip-literal@0.4.2:
+    resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==}
     dependencies:
       acorn: 8.14.1
+    dev: true
 
-  supports-color@2.0.0: {}
+  /supports-color@2.0.0:
+    resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+    engines: {node: '>=0.8.0'}
+    dev: true
 
-  supports-color@3.2.3:
+  /supports-color@3.2.3:
+    resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+    engines: {node: '>=0.8.0'}
     dependencies:
       has-flag: 1.0.0
+    dev: true
 
-  supports-color@7.2.0:
+  /supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
     dependencies:
       has-flag: 4.0.0
+    dev: true
 
-  svg-baker@1.7.0:
+  /svg-baker@1.7.0:
+    resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
     dependencies:
       bluebird: 3.7.2
       clone: 2.1.2
@@ -6030,8 +5264,12 @@
       traverse: 0.6.11
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  svgo@2.8.0:
+  /svgo@2.8.0:
+    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
     dependencies:
       '@trysound/sax': 0.2.0
       commander: 7.2.0
@@ -6040,79 +5278,130 @@
       csso: 4.2.0
       picocolors: 1.1.1
       stable: 0.1.8
+    dev: true
 
-  terser@5.39.0:
+  /terser@5.31.1:
+    resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==}
+    engines: {node: '>=10'}
+    hasBin: true
     dependencies:
       '@jridgewell/source-map': 0.3.6
       acorn: 8.14.1
       commander: 2.20.3
       source-map-support: 0.5.21
+    dev: true
 
-  tiny-emitter@2.1.0: {}
+  /tiny-emitter@2.1.0:
+    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
+    dev: false
 
-  tiny-svg@3.1.3: {}
+  /tiny-svg@3.1.3:
+    resolution: {integrity: sha512-9mwnPqXInRsBmH/DO6NMxBE++9LsqpVXQSSTZGc5bomoKKvL5OX/Hlotw7XVXP6XLRcHWIzZpxfovGqWKgCypQ==}
+    dev: false
 
-  tiny-warning@1.0.3: {}
+  /tiny-warning@1.0.3:
+    resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+    dev: false
 
-  tinyqueue@2.0.3: {}
+  /tinyqueue@2.0.3:
+    resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==}
+    dev: false
 
-  to-object-path@0.3.0:
+  /to-object-path@0.3.0:
+    resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       kind-of: 3.2.2
+    dev: true
 
-  to-regex-range@2.1.1:
+  /to-regex-range@2.1.1:
+    resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       is-number: 3.0.0
       repeat-string: 1.6.1
+    dev: true
 
-  to-regex-range@5.0.1:
+  /to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+    requiresBuild: true
     dependencies:
       is-number: 7.0.0
+    dev: true
 
-  to-regex@3.0.2:
+  /to-regex@3.0.2:
+    resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       define-property: 2.0.2
       extend-shallow: 3.0.2
       regex-not: 1.0.2
       safe-regex: 1.1.0
+    dev: true
 
-  topojson-client@3.1.0:
+  /topojson-client@3.1.0:
+    resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==}
+    hasBin: true
     dependencies:
       commander: 2.20.3
+    dev: false
 
-  topojson-server@3.0.1:
+  /topojson-server@3.0.1:
+    resolution: {integrity: sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==}
+    hasBin: true
     dependencies:
       commander: 2.20.3
+    dev: false
 
-  traverse@0.6.11:
+  /traverse@0.6.11:
+    resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
+    engines: {node: '>= 0.4'}
     dependencies:
       gopd: 1.2.0
       typedarray.prototype.slice: 1.0.5
       which-typed-array: 1.1.19
+    dev: true
 
-  tslib@2.3.0: {}
+  /tslib@2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+    dev: false
 
-  tslib@2.8.1: {}
+  /tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+    dev: false
 
-  turf-jsts@1.2.3: {}
+  /turf-jsts@1.2.3:
+    resolution: {integrity: sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==}
+    dev: false
 
-  type@2.7.3: {}
+  /type@2.7.3:
+    resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+    dev: false
 
-  typed-array-buffer@1.0.3:
+  /typed-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       es-errors: 1.3.0
       is-typed-array: 1.1.15
+    dev: true
 
-  typed-array-byte-length@1.0.3:
+  /typed-array-byte-length@1.0.3:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       for-each: 0.3.5
       gopd: 1.2.0
       has-proto: 1.2.0
       is-typed-array: 1.1.15
+    dev: true
 
-  typed-array-byte-offset@1.0.4:
+  /typed-array-byte-offset@1.0.4:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
     dependencies:
       available-typed-arrays: 1.0.7
       call-bind: 1.0.8
@@ -6121,8 +5410,11 @@
       has-proto: 1.2.0
       is-typed-array: 1.1.15
       reflect.getprototypeof: 1.0.10
+    dev: true
 
-  typed-array-length@1.0.7:
+  /typed-array-length@1.0.7:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       for-each: 0.3.5
@@ -6130,8 +5422,11 @@
       is-typed-array: 1.1.15
       possible-typed-array-names: 1.1.0
       reflect.getprototypeof: 1.0.10
+    dev: true
 
-  typedarray.prototype.slice@1.0.5:
+  /typedarray.prototype.slice@1.0.5:
+    resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bind: 1.0.8
       define-properties: 1.2.1
@@ -6141,86 +5436,129 @@
       math-intrinsics: 1.1.0
       typed-array-buffer: 1.0.3
       typed-array-byte-offset: 1.0.4
+    dev: true
 
-  ufo@1.5.4: {}
+  /ufo@1.5.4:
+    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+    dev: true
 
-  unbox-primitive@1.1.0:
+  /unbox-primitive@1.1.0:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       has-bigints: 1.1.0
       has-symbols: 1.1.0
       which-boxed-primitive: 1.1.1
+    dev: true
 
-  undici-types@6.20.0: {}
+  /undici-types@6.20.0:
+    resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
 
-  unimport@1.3.0(rollup@4.37.0):
+  /unimport@0.6.8:
+    resolution: {integrity: sha512-MWkaPYvN0j+6jfEuiVFhfmy+aOtgAP11CozSbu/I3Cx+8ybjXIueB7GVlKofHabtjzSlPeAvWKJSFjHWsG2JaA==}
     dependencies:
-      '@rollup/pluginutils': 5.1.4(rollup@4.37.0)
+      '@rollup/pluginutils': 4.2.1
       escape-string-regexp: 5.0.0
       fast-glob: 3.3.3
       local-pkg: 0.4.3
-      magic-string: 0.27.0
-      mlly: 1.7.4
-      pathe: 1.1.2
-      pkg-types: 1.3.1
-      scule: 1.3.0
-      strip-literal: 1.3.0
-      unplugin: 1.16.1
-    transitivePeerDependencies:
-      - rollup
+      magic-string: 0.26.7
+      mlly: 0.5.17
+      pathe: 0.3.9
+      scule: 0.3.2
+      strip-literal: 0.4.2
+      unplugin: 0.9.6
+    dev: true
 
-  union-value@1.0.1:
+  /union-value@1.0.1:
+    resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       arr-union: 3.1.0
       get-value: 2.0.6
       is-extendable: 0.1.1
       set-value: 2.0.1
+    dev: true
 
-  universalify@2.0.1: {}
+  /universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+    dev: true
 
-  unplugin-auto-import@0.11.5(@vueuse/core@9.13.0(vue@3.5.13))(rollup@4.37.0):
+  /unplugin-auto-import@0.11.2:
+    resolution: {integrity: sha512-1+VwBfn9dtiYv9SQLKP1AvZolUbK9xTVeAT+iOcEk4EHSFUlmIqBVLEKI76cifSQTLOJ3rZyPrEgptf3SZNLlQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@vueuse/core':
+        optional: true
     dependencies:
-      '@antfu/utils': 0.7.10
-      '@rollup/pluginutils': 5.1.4(rollup@4.37.0)
+      '@antfu/utils': 0.5.2
+      '@rollup/pluginutils': 4.2.1
       local-pkg: 0.4.3
       magic-string: 0.26.7
-      unimport: 1.3.0(rollup@4.37.0)
-      unplugin: 1.16.1
-    optionalDependencies:
-      '@vueuse/core': 9.13.0(vue@3.5.13)
-    transitivePeerDependencies:
-      - rollup
+      unimport: 0.6.8
+      unplugin: 0.9.6
+    dev: true
 
-  unplugin@1.16.1:
+  /unplugin@0.9.6:
+    resolution: {integrity: sha512-YYLtfoNiie/lxswy1GOsKXgnLJTE27la/PeCGznSItk+8METYZErO+zzV9KQ/hXhPwzIJsfJ4s0m1Rl7ZCWZ4Q==}
     dependencies:
       acorn: 8.14.1
-      webpack-virtual-modules: 0.6.2
+      chokidar: 3.6.0
+      webpack-sources: 3.2.3
+      webpack-virtual-modules: 0.4.6
+    dev: true
 
-  unset-value@1.0.0:
+  /unset-value@1.0.0:
+    resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+    engines: {node: '>=0.10.0'}
     dependencies:
       has-value: 0.3.1
       isobject: 3.0.1
+    dev: true
 
-  urijs@1.19.11: {}
+  /urijs@1.19.11:
+    resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==}
+    dev: false
 
-  urix@0.1.0: {}
+  /urix@0.1.0:
+    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+    deprecated: Please see https://github.com/lydell/urix#deprecated
+    dev: true
 
-  use@3.1.1: {}
+  /use@3.1.1:
+    resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
 
-  util-deprecate@1.0.2: {}
+  /util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+    dev: true
 
-  vary@1.1.2: {}
+  /vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+    dev: true
 
-  vite-plugin-compression@0.5.1(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)):
+  /vite-plugin-compression@0.5.1(vite@5.2.12):
+    resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+    peerDependencies:
+      vite: '>=2.0.0'
     dependencies:
       chalk: 4.1.2
       debug: 4.4.0
       fs-extra: 10.1.0
-      vite: 5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)
+      vite: 5.2.12(sass@1.85.1)(terser@5.31.1)
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  vite-plugin-svg-icons@2.0.1(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)):
+  /vite-plugin-svg-icons@2.0.1(vite@5.2.12):
+    resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+    peerDependencies:
+      vite: '>=2.0.0'
     dependencies:
       '@types/svgo': 2.6.4
       cors: 2.8.5
@@ -6230,49 +5568,111 @@
       pathe: 0.2.0
       svg-baker: 1.7.0
       svgo: 2.8.0
-      vite: 5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)
+      vite: 5.2.12(sass@1.85.1)(terser@5.31.1)
     transitivePeerDependencies:
       - supports-color
+    dev: true
 
-  vite-plugin-vue-setup-extend@0.4.0(vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)):
+  /vite-plugin-vue-setup-extend@0.4.0(vite@5.2.12):
+    resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==}
+    peerDependencies:
+      vite: '>=2.0.0'
     dependencies:
-      '@vue/compiler-sfc': 3.5.13
+      '@vue/compiler-sfc': 3.4.27
       magic-string: 0.25.9
-      vite: 5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0)
+      vite: 5.2.12(sass@1.85.1)(terser@5.31.1)
+    dev: true
 
-  vite@5.4.15(@types/node@22.13.13)(sass@1.86.0)(terser@5.39.0):
+  /vite@5.2.12(sass@1.85.1)(terser@5.31.1):
+    resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    hasBin: true
+    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
     dependencies:
-      esbuild: 0.21.5
+      esbuild: 0.20.2
       postcss: 8.5.3
-      rollup: 4.37.0
+      rollup: 4.38.0
+      sass: 1.85.1
+      terser: 5.31.1
     optionalDependencies:
-      '@types/node': 22.13.13
       fsevents: 2.3.3
-      sass: 1.86.0
-      terser: 5.39.0
+    dev: true
 
-  vue-demi@0.14.10(vue@3.5.13):
+  /vue-demi@0.14.10(vue@3.5.13):
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
     dependencies:
       vue: 3.5.13
+    dev: false
 
-  vue-i18n@9.14.3(vue@3.5.13):
+  /vue-i18n@9.1.9(vue@3.5.13):
+    resolution: {integrity: sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==}
+    engines: {node: '>= 10'}
+    peerDependencies:
+      vue: ^3.0.0
     dependencies:
-      '@intlify/core-base': 9.14.3
-      '@intlify/shared': 9.14.3
+      '@intlify/core-base': 9.1.9
+      '@intlify/shared': 9.1.9
+      '@intlify/vue-devtools': 9.1.9
       '@vue/devtools-api': 6.6.4
       vue: 3.5.13
+    dev: false
 
-  vue-router@4.5.0(vue@3.5.13):
+  /vue-router@4.3.2(vue@3.5.13):
+    resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==}
+    peerDependencies:
+      vue: ^3.2.0
     dependencies:
       '@vue/devtools-api': 6.6.4
       vue: 3.5.13
+    dev: false
 
-  vue3-clipboard@1.0.0(vue@3.5.13):
+  /vue3-clipboard@1.0.0(vue@3.5.13):
+    resolution: {integrity: sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA==}
+    peerDependencies:
+      vue: ^3.0.0
     dependencies:
       clipboard: 2.0.11
       vue: 3.5.13
+    dev: false
 
-  vue@3.5.13:
+  /vue@3.5.13:
+    resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
     dependencies:
       '@vue/compiler-dom': 3.5.13
       '@vue/compiler-sfc': 3.5.13
@@ -6280,27 +5680,47 @@
       '@vue/server-renderer': 3.5.13(vue@3.5.13)
       '@vue/shared': 3.5.13
 
-  vuedraggable@4.1.0(vue@3.5.13):
+  /vuedraggable@4.1.0(vue@3.5.13):
+    resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
+    peerDependencies:
+      vue: ^3.0.1
     dependencies:
       sortablejs: 1.14.0
       vue: 3.5.13
+    dev: false
 
-  vuex@4.1.0(vue@3.5.13):
+  /vuex@4.1.0(vue@3.5.13):
+    resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==}
+    peerDependencies:
+      vue: ^3.2.0
     dependencies:
       '@vue/devtools-api': 6.6.4
       vue: 3.5.13
+    dev: false
 
-  webpack-virtual-modules@0.6.2: {}
+  /webpack-sources@3.2.3:
+    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+    engines: {node: '>=10.13.0'}
+    dev: true
 
-  which-boxed-primitive@1.1.1:
+  /webpack-virtual-modules@0.4.6:
+    resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==}
+    dev: true
+
+  /which-boxed-primitive@1.1.1:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-bigint: 1.1.0
       is-boolean-object: 1.2.2
       is-number-object: 1.1.1
       is-string: 1.1.1
       is-symbol: 1.1.1
+    dev: true
 
-  which-builtin-type@1.2.1:
+  /which-builtin-type@1.2.1:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
     dependencies:
       call-bound: 1.0.4
       function.prototype.name: 1.1.8
@@ -6315,15 +5735,21 @@
       which-boxed-primitive: 1.1.1
       which-collection: 1.0.2
       which-typed-array: 1.1.19
+    dev: true
 
-  which-collection@1.0.2:
+  /which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       is-map: 2.0.3
       is-set: 2.0.3
       is-weakmap: 2.0.2
       is-weakset: 2.0.4
+    dev: true
 
-  which-typed-array@1.1.19:
+  /which-typed-array@1.1.19:
+    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+    engines: {node: '>= 0.4'}
     dependencies:
       available-typed-arrays: 1.0.7
       call-bind: 1.0.8
@@ -6332,9 +5758,14 @@
       get-proto: 1.0.1
       gopd: 1.2.0
       has-tostringtag: 1.0.2
+    dev: true
 
-  wildcard@1.1.2: {}
+  /wildcard@1.1.2:
+    resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==}
+    dev: false
 
-  zrender@5.6.1:
+  /zrender@5.6.1:
+    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
     dependencies:
       tslib: 2.3.0
+    dev: false
diff --git a/src/api/base/region.js b/src/api/base/region.js
index 01bcd16..0f9340f 100644
--- a/src/api/base/region.js
+++ b/src/api/base/region.js
@@ -1,52 +1,52 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/region/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/region/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getLazyTree = (parentCode, params) => {
-  return request({
-    url: '/blade-system/region/lazy-tree',
-    method: 'get',
-    params: {
-      ...params,
-      parentCode,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/region/lazy-tree',
+		method: 'get',
+		params: {
+			...params,
+			parentCode,
+		},
+	})
+}
 
 export const getDetail = code => {
-  return request({
-    url: '/blade-system/region/detail',
-    method: 'get',
-    params: {
-      code,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/region/detail',
+		method: 'get',
+		params: {
+			code,
+		},
+	})
+}
 
 export const remove = id => {
-  return request({
-    url: '/blade-system/region/remove',
-    method: 'post',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/region/remove',
+		method: 'post',
+		params: {
+			id,
+		},
+	})
+}
 
 export const submit = row => {
-  return request({
-    url: '/blade-system/region/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/region/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/common.js b/src/api/common.js
index 4851b67..7926280 100644
--- a/src/api/common.js
+++ b/src/api/common.js
@@ -1,4 +1,4 @@
-import request from '@/axios';
+import request from '@/axios'
 
 /**
  * 文件流返回
@@ -6,10 +6,10 @@
  * @param params 接口参数
  */
 export const exportBlob = (url, params) => {
-  return request({
-    url: url,
-    params: params,
-    method: 'get',
-    responseType: 'blob',
-  });
-};
+	return request({
+		url: url,
+		params: params,
+		method: 'get',
+		responseType: 'blob',
+	})
+}
diff --git a/src/api/desk/notice.js b/src/api/desk/notice.js
index 708da65..28c9d74 100644
--- a/src/api/desk/notice.js
+++ b/src/api/desk/notice.js
@@ -1,59 +1,59 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-desk/notice/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-    cryptoToken: false,
-    cryptoData: false,
-  });
-};
+	return request({
+		url: '/blade-desk/notice/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+		cryptoToken: false,
+		cryptoData: false,
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-desk/notice/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-    cryptoToken: false,
-    cryptoData: false,
-  });
-};
+	return request({
+		url: '/blade-desk/notice/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+		cryptoToken: false,
+		cryptoData: false,
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-desk/notice/submit',
-    method: 'post',
-    data: row,
-    cryptoToken: false,
-    cryptoData: false,
-  });
-};
+	return request({
+		url: '/blade-desk/notice/submit',
+		method: 'post',
+		data: row,
+		cryptoToken: false,
+		cryptoData: false,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-desk/notice/submit',
-    method: 'post',
-    data: row,
-    cryptoToken: false,
-    cryptoData: false,
-  });
-};
+	return request({
+		url: '/blade-desk/notice/submit',
+		method: 'post',
+		data: row,
+		cryptoToken: false,
+		cryptoData: false,
+	})
+}
 
 export const getNotice = id => {
-  return request({
-    url: '/blade-desk/notice/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-    cryptoToken: false,
-    cryptoData: false,
-  });
-};
+	return request({
+		url: '/blade-desk/notice/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+		cryptoToken: false,
+		cryptoData: false,
+	})
+}
diff --git a/src/api/flow/flow.js b/src/api/flow/flow.js
index 24f8fd1..ad8d991 100644
--- a/src/api/flow/flow.js
+++ b/src/api/flow/flow.js
@@ -1,122 +1,122 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const modelList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/model/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/model/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const managerList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/manager/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/manager/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const followList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/follow/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/follow/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const removeModel = ids => {
-  return request({
-    url: '/blade-flow/model/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/model/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const deployModel = params => {
-  return request({
-    url: '/blade-flow/model/deploy',
-    method: 'post',
-    params,
-  });
-};
+	return request({
+		url: '/blade-flow/model/deploy',
+		method: 'post',
+		params,
+	})
+}
 
 export const changeState = params => {
-  return request({
-    url: '/blade-flow/manager/change-state',
-    method: 'post',
-    params,
-  });
-};
+	return request({
+		url: '/blade-flow/manager/change-state',
+		method: 'post',
+		params,
+	})
+}
 
 export const deployUpload = (category, tenantIds, files) => {
-  const formData = new FormData();
-  formData.append('category', category);
-  formData.append('tenantIds', tenantIds);
-  files.forEach(file => {
-    formData.append('files', file);
-  });
-  return request({
-    headers: {
-      'Content-Type': 'multipart/form-data',
-    },
-    url: '/blade-flow/manager/deploy-upload',
-    method: 'post',
-    data: formData,
-  });
-};
+	const formData = new FormData()
+	formData.append('category', category)
+	formData.append('tenantIds', tenantIds)
+	files.forEach(file => {
+		formData.append('files', file)
+	})
+	return request({
+		headers: {
+			'Content-Type': 'multipart/form-data',
+		},
+		url: '/blade-flow/manager/deploy-upload',
+		method: 'post',
+		data: formData,
+	})
+}
 
 export const deleteDeployment = deploymentIds => {
-  return request({
-    url: '/blade-flow/manager/delete-deployment',
-    method: 'post',
-    params: {
-      deploymentIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/manager/delete-deployment',
+		method: 'post',
+		params: {
+			deploymentIds,
+		},
+	})
+}
 
 export const deleteProcessInstance = params => {
-  return request({
-    url: '/blade-flow/follow/delete-process-instance',
-    method: 'post',
-    params,
-  });
-};
+	return request({
+		url: '/blade-flow/follow/delete-process-instance',
+		method: 'post',
+		params,
+	})
+}
 
 export const submitModel = data => {
-  return request({
-    url: '/blade-flow/model/submit',
-    method: 'post',
-    data,
-  });
-};
+	return request({
+		url: '/blade-flow/model/submit',
+		method: 'post',
+		data,
+	})
+}
 
 export const detail = params => {
-  return request({
-    url: '/blade-flow/model/detail',
-    method: 'get',
-    params,
-  });
-};
+	return request({
+		url: '/blade-flow/model/detail',
+		method: 'get',
+		params,
+	})
+}
 
 export const modelView = params => {
-  return request({
-    url: '/blade-flow/process/model-view',
-    method: 'get',
-    params,
-  });
-};
+	return request({
+		url: '/blade-flow/process/model-view',
+		method: 'get',
+		params,
+	})
+}
diff --git a/src/api/home/aggregation.js b/src/api/home/aggregation.js
index f68ed63..fd79d76 100644
--- a/src/api/home/aggregation.js
+++ b/src/api/home/aggregation.js
@@ -1,19 +1,34 @@
-import request from '@/axios';
+import request from '@/axios'
 
+export const getDeviceRegionCount = params => {
+	return request({
+		url: '/drone-device-core/manage/api/v1/devices/getDeviceRegionCount',
+		method: 'get',
+		params,
+	})
+}
 
-export const getDeviceRegionCount = (params) => {
+export const getDeviceRegion = params => {
+	return request({
+		url: '/drone-device-core/manage/api/v1/devices/getDeviceRegion',
+		method: 'get',
+		params,
+	})
+}
+
+// 事件聚合 和 事件散点
+export const getMapEvents = (data) => {
   return request({
-    url: '/drone-device-core/manage/api/v1/devices/getDeviceRegionCount',
-    method: 'get',
-    params
+    url: '/drone-device-core/jobEvent/mapEvents',
+    method: 'post',
+    data
   });
 };
-
-
-export const getDeviceRegion = (params) => {
+// 事件散点详情
+export const getEventDetails = (params) => {
   return request({
-    url: '/drone-device-core/manage/api/v1/devices/getDeviceRegion',
-    method: 'get',
+    url: '/drone-device-core/jobEvent/eventDetails',
+    method: 'post',
     params
   });
 };
diff --git a/src/api/home/index.js b/src/api/home/index.js
index b5af252..da21b03 100644
--- a/src/api/home/index.js
+++ b/src/api/home/index.js
@@ -1,110 +1,109 @@
-import request from '@/axios';
+import request from '@/axios'
 
 // 巡检总任务数量
-export const getTotalJobNum = (params) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/totalJobNum',
-    method: 'get',
-    params
-  });
-};
+export const getTotalJobNum = params => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/totalJobNum',
+		method: 'get',
+		params,
+	})
+}
 
 // 巡检任务item数量
-export const getJobStatistics = (data) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/jobStatistics',
-    method: 'post',
-    data
-  });
-};
+export const getJobStatistics = data => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/jobStatistics',
+		method: 'post',
+		data,
+	})
+}
 
 // 巡检任务柱状图数据
-export const getJobNumBar = (data) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/jobNumBar',
-    method: 'post',
-    data
-  });
-};
+export const getJobNumBar = data => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/jobNumBar',
+		method: 'post',
+		data,
+	})
+}
 // 事件概况总数
 export const getJobEventTotal = () => {
-  return request({
-    url: '/drone-device-core/jobEvent/total',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/drone-device-core/jobEvent/total',
+		method: 'get',
+	})
+}
 // 事件概况分类数
-export const getJobEventByStatus = (data) => {
-  return request({
-    url: '/drone-device-core/jobEvent/eventByStatus',
-    method: 'post',
-    data
-  });
-};
-export const getJobEventBrokerLine = (data) => {
-  return request({
-    url: '/drone-device-core/jobEvent/eventBrokerLine',
-    method: 'post',
-    data
-  });
-};
+export const getJobEventByStatus = data => {
+	return request({
+		url: '/drone-device-core/jobEvent/eventByStatus',
+		method: 'post',
+		data,
+	})
+}
+export const getJobEventBrokerLine = data => {
+	return request({
+		url: '/drone-device-core/jobEvent/eventBrokerLine',
+		method: 'post',
+		data,
+	})
+}
 
 // 任务成果
 export const getMediaFileCountBy = () => {
-  return request({
-    url: '/blade-resource/media/api/v1/workspaces/files/getMediaFileCountBy',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-resource/media/api/v1/workspaces/files/getMediaFileCountBy',
+		method: 'get',
+	})
+}
 
 // 降本增效
 export const optimizeCostEfficiency = () => {
-  return request({
-    url: '/drone-device-core/manage/api/v1/devices/optimizeCostEfficiency',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/drone-device-core/manage/api/v1/devices/optimizeCostEfficiency',
+		method: 'get',
+	})
+}
 
 // 历史巡检任务列表
-export const getBeforeJob = (data) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/beforeJob',
-    method: 'post',
-    data
-  });
-};
+export const getBeforeJob = data => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/beforeJob',
+		method: 'post',
+		data,
+	})
+}
 // 当前巡检任务列表
-export const getTodayJob = (data) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/todayJob',
-    method: 'post',
-    data
-  });
-};
+export const getTodayJob = data => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/todayJob',
+		method: 'post',
+		data,
+	})
+}
 
 // 巡检任务详情 柱状图
-export const jobNumBar = (data) => {
-  return request({
-    url: '/drone-device-core/wayline/waylineJobInfo/jobEventBar',
-    method: 'post',
-    data
-  });
-};
+export const jobNumBar = data => {
+	return request({
+		url: '/drone-device-core/wayline/waylineJobInfo/jobEventBar',
+		method: 'post',
+		data,
+	})
+}
 // 巡检任务详情 饼图
-export const eventNumPie = (data) => {
-  return request({
-    url: '/drone-device-core/jobEvent/eventNumPie',
-    method: 'post',
-    data
-  });
-};
+export const eventNumPie = data => {
+	return request({
+		url: '/drone-device-core/jobEvent/eventNumPie',
+		method: 'post',
+		data,
+	})
+}
 
 // 获取区域
-export const getRegion = (code) => {
-  return request({
-    url: '/blade-system/region/select',
-    method: 'get',
-    params:{code}
-  });
-};
-
+export const getRegion = code => {
+	return request({
+		url: '/blade-system/region/select',
+		method: 'get',
+		params: { code },
+	})
+}
diff --git a/src/api/home/machineNest.js b/src/api/home/machineNest.js
index 70bd5d2..f69f70d 100644
--- a/src/api/home/machineNest.js
+++ b/src/api/home/machineNest.js
@@ -1,49 +1,48 @@
-import request from '@/axios';
+import request from '@/axios'
 
 // 机巢统计
-export const getDeviceInfoNum = (params) => {
-  return request({
-    url: '/drone-device-core/manage/api/v1/devices/getDeviceInfoNum',
-    method: 'get',
-    params,
-  });
-};
+export const getDeviceInfoNum = params => {
+	return request({
+		url: '/drone-device-core/manage/api/v1/devices/getDeviceInfoNum',
+		method: 'get',
+		params,
+	})
+}
 // 机巢列表
-export const selectDevicePage = ({ nickname,is_execute, ...params}) => {
-  return request({
-    url: `/drone-device-core/manage/api/v1/devices/selectDevicePage?type=${params.type}&current=${params.current}&size=${params.size}`,
-    method: 'post',
-    data: {
-      nickname,
-      is_execute,
-    },
-  });
-};
+export const selectDevicePage = ({ nickname, is_execute, ...params }) => {
+	return request({
+		url: `/drone-device-core/manage/api/v1/devices/selectDevicePage?type=${params.type}&current=${params.current}&size=${params.size}`,
+		method: 'post',
+		data: {
+			nickname,
+			is_execute,
+		},
+	})
+}
 // 机巢数据
-export const getFlightStatistics = (dockSn) => {
-  return request({
-    url: `/drone-device-core/manage/api/v1/devices/getFlightStatistics?dockSn=${dockSn}`,
-    method: 'get',
-    params: {},
-  });
-};
+export const getFlightStatistics = dockSn => {
+	return request({
+		url: `/drone-device-core/manage/api/v1/devices/getFlightStatistics?dockSn=${dockSn}`,
+		method: 'get',
+		params: {},
+	})
+}
 // 机巢直播/无人机直播 均可使用
-export const liveStart = (deviceSn) => {
-  return request({
-    url: `/drone-device-core/manage/api/v1/live/streams/liveStart?deviceSn=${deviceSn}`,
-    method: 'post',
-    data: {},
-    headers: {
-      'areaCode': '',
-    },
-  });
-};
+export const liveStart = deviceSn => {
+	return request({
+		url: `/drone-device-core/manage/api/v1/live/streams/liveStart?deviceSn=${deviceSn}`,
+		method: 'post',
+		data: {},
+		headers: {
+			areaCode: '',
+		},
+	})
+}
 // 单个机巢获取机巢详情
-export const getDeviceDetail = (deviceSn) => {
-  return request({
-    url: `/drone-device-core/manage/api/v1/devices/getDeviceDetail?deviceSn=${deviceSn}`,
-    method: 'get',
-    params: {},
-  });
-};
-
+export const getDeviceDetail = deviceSn => {
+	return request({
+		url: `/drone-device-core/manage/api/v1/devices/getDeviceDetail?deviceSn=${deviceSn}`,
+		method: 'get',
+		params: {},
+	})
+}
diff --git a/src/api/job/jobinfo.js b/src/api/job/jobinfo.js
index bf6baf8..d72aec7 100644
--- a/src/api/job/jobinfo.js
+++ b/src/api/job/jobinfo.js
@@ -1,78 +1,78 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-job/job-info/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-info/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-job/job-info/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-info/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-job/job-info/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-info/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-job/job-info/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-info/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-job/job-info/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-info/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const change = row => {
-  return request({
-    url: '/blade-job/job-info/change',
-    method: 'post',
-    params: {
-      id: row.id,
-      enable: row.enable,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-info/change',
+		method: 'post',
+		params: {
+			id: row.id,
+			enable: row.enable,
+		},
+	})
+}
 
 export const run = row => {
-  return request({
-    url: '/blade-job/job-info/run',
-    method: 'post',
-    params: {
-      id: row.id,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-info/run',
+		method: 'post',
+		params: {
+			id: row.id,
+		},
+	})
+}
 
 export const sync = row => {
-  return request({
-    url: '/blade-job/job-info/sync',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-info/sync',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/job/jobserver.js b/src/api/job/jobserver.js
index 8ac8d9f..e527445 100644
--- a/src/api/job/jobserver.js
+++ b/src/api/job/jobserver.js
@@ -1,57 +1,57 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-job/job-server/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-server/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-job/job-server/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-server/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-job/job-server/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-job/job-server/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-job/job-server/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-server/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-job/job-server/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-server/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const sync = row => {
-  return request({
-    url: '/blade-job/job-server/sync',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-job/job-server/sync',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/logs.js b/src/api/logs.js
index 9368365..07213c8 100644
--- a/src/api/logs.js
+++ b/src/api/logs.js
@@ -1,62 +1,62 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getUsualList = (current, size) => {
-  return request({
-    url: '/blade-log/usual/list',
-    method: 'get',
-    params: {
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/usual/list',
+		method: 'get',
+		params: {
+			current,
+			size,
+		},
+	})
+}
 
 export const getApiList = (current, size) => {
-  return request({
-    url: '/blade-log/api/list',
-    method: 'get',
-    params: {
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/api/list',
+		method: 'get',
+		params: {
+			current,
+			size,
+		},
+	})
+}
 
 export const getErrorList = (current, size) => {
-  return request({
-    url: '/blade-log/error/list',
-    method: 'get',
-    params: {
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/error/list',
+		method: 'get',
+		params: {
+			current,
+			size,
+		},
+	})
+}
 
 export const getUsualLogs = id => {
-  return request({
-    url: '/blade-log/usual/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/usual/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 export const getApiLogs = id => {
-  return request({
-    url: '/blade-log/api/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/api/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 export const getErrorLogs = id => {
-  return request({
-    url: '/blade-log/error/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-log/error/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
diff --git a/src/api/report/report.js b/src/api/report/report.js
index 3ea1ced..560be29 100644
--- a/src/api/report/report.js
+++ b/src/api/report/report.js
@@ -1,22 +1,22 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-report/report/rest/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-report/report/rest/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 export const remove = ids => {
-  return request({
-    url: '/blade-report/report/rest/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-report/report/rest/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
diff --git a/src/api/resource/attach.js b/src/api/resource/attach.js
index a5954bf..8a05086 100644
--- a/src/api/resource/attach.js
+++ b/src/api/resource/attach.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-resource/attach/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/attach/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-resource/attach/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/attach/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-resource/attach/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/attach/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-resource/attach/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/attach/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-resource/attach/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/attach/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/resource/oss.js b/src/api/resource/oss.js
index c126296..7214c97 100644
--- a/src/api/resource/oss.js
+++ b/src/api/resource/oss.js
@@ -1,59 +1,59 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-resource/oss/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/oss/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-resource/oss/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/oss/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-resource/oss/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/oss/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-resource/oss/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/oss/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-resource/oss/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/oss/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const enable = id => {
-  return request({
-    url: '/blade-resource/oss/enable',
-    method: 'post',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/oss/enable',
+		method: 'post',
+		params: {
+			id,
+		},
+	})
+}
diff --git a/src/api/resource/sms.js b/src/api/resource/sms.js
index 2433398..7dd3dec 100644
--- a/src/api/resource/sms.js
+++ b/src/api/resource/sms.js
@@ -1,71 +1,71 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-resource/sms/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/sms/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-resource/sms/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/sms/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-resource/sms/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/sms/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-resource/sms/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/sms/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-resource/sms/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-resource/sms/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const enable = id => {
-  return request({
-    url: '/blade-resource/sms/enable',
-    method: 'post',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/sms/enable',
+		method: 'post',
+		params: {
+			id,
+		},
+	})
+}
 
 export const send = (code, phones, params) => {
-  return request({
-    url: '/blade-resource/sms/endpoint/send-message',
-    method: 'post',
-    params: {
-      code,
-      phones,
-      params,
-    },
-  });
-};
+	return request({
+		url: '/blade-resource/sms/endpoint/send-message',
+		method: 'post',
+		params: {
+			code,
+			phones,
+			params,
+		},
+	})
+}
diff --git a/src/api/system/client.js b/src/api/system/client.js
index 0912288..437e92e 100644
--- a/src/api/system/client.js
+++ b/src/api/system/client.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/client/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/client/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/client/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/client/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/client/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/client/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/client/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/client/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/client/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/client/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/system/dept.js b/src/api/system/dept.js
index ba96954..a3eda63 100644
--- a/src/api/system/dept.js
+++ b/src/api/system/dept.js
@@ -1,80 +1,80 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/dept/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getLazyList = (parentId, params) => {
-  return request({
-    url: '/blade-system/dept/lazy-list',
-    method: 'get',
-    params: {
-      ...params,
-      parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/lazy-list',
+		method: 'get',
+		params: {
+			...params,
+			parentId,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/dept/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/dept/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dept/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/dept/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dept/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getDept = id => {
-  return request({
-    url: '/blade-system/dept/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getDeptTree = tenantId => {
-  return request({
-    url: '/blade-system/dept/tree',
-    method: 'get',
-    params: {
-      tenantId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/tree',
+		method: 'get',
+		params: {
+			tenantId,
+		},
+	})
+}
 
 export const getDeptLazyTree = parentId => {
-  return request({
-    url: '/blade-system/dept/lazy-tree',
-    method: 'get',
-    params: {
-      parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dept/lazy-tree',
+		method: 'get',
+		params: {
+			parentId,
+		},
+	})
+}
diff --git a/src/api/system/dict.js b/src/api/system/dict.js
index 51daacc..f443a22 100644
--- a/src/api/system/dict.js
+++ b/src/api/system/dict.js
@@ -1,88 +1,88 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/dict/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getParentList = (current, size, params) => {
-  return request({
-    url: '/blade-system/dict/parent-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict/parent-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getChildList = (current, size, parentId, params) => {
-  return request({
-    url: '/blade-system/dict/child-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-      parentId: parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict/child-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+			parentId: parentId,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/dict/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/dict/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dict/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/dict/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dict/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getDict = id => {
-  return request({
-    url: '/blade-system/dict/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 export const getDictTree = () => {
-  return request({
-    url: '/blade-system/dict/tree?code=DICT',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-system/dict/tree?code=DICT',
+		method: 'get',
+	})
+}
 
 export const getDictionary = params => {
-  return request({
-    url: '/blade-system/dict/dictionary',
-    method: 'get',
-    params,
-  });
-};
+	return request({
+		url: '/blade-system/dict/dictionary',
+		method: 'get',
+		params,
+	})
+}
diff --git a/src/api/system/dictbiz.js b/src/api/system/dictbiz.js
index 6c7ee7e..5488f55 100644
--- a/src/api/system/dictbiz.js
+++ b/src/api/system/dictbiz.js
@@ -1,88 +1,88 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/dict-biz/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getParentList = (current, size, params) => {
-  return request({
-    url: '/blade-system/dict-biz/parent-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/parent-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getChildList = (current, size, parentId, params) => {
-  return request({
-    url: '/blade-system/dict-biz/child-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-      parentId: parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/child-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+			parentId: parentId,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/dict-biz/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/dict-biz/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/dict-biz/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getDict = id => {
-  return request({
-    url: '/blade-system/dict-biz/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 export const getDictTree = () => {
-  return request({
-    url: '/blade-system/dict-biz/tree?code=DICT',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/tree?code=DICT',
+		method: 'get',
+	})
+}
 
 export const getDictionary = params => {
-  return request({
-    url: '/blade-system/dict-biz/dictionary',
-    method: 'get',
-    params,
-  });
-};
+	return request({
+		url: '/blade-system/dict-biz/dictionary',
+		method: 'get',
+		params,
+	})
+}
diff --git a/src/api/system/menu.js b/src/api/system/menu.js
index 7050c95..d5cd3b2 100644
--- a/src/api/system/menu.js
+++ b/src/api/system/menu.js
@@ -1,108 +1,108 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/menu/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getLazyList = (parentId, params) => {
-  return request({
-    url: '/blade-system/menu/lazy-list',
-    method: 'get',
-    params: {
-      ...params,
-      parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/lazy-list',
+		method: 'get',
+		params: {
+			...params,
+			parentId,
+		},
+	})
+}
 
 export const getLazyMenuList = (parentId, params) => {
-  return request({
-    url: '/blade-system/menu/lazy-menu-list',
-    method: 'get',
-    params: {
-      ...params,
-      parentId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/lazy-menu-list',
+		method: 'get',
+		params: {
+			...params,
+			parentId,
+		},
+	})
+}
 
 export const getMenuList = (current, size, params) => {
-  return request({
-    url: '/blade-system/menu/menu-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/menu-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getMenuTree = tenantId => {
-  return request({
-    url: '/blade-system/menu/tree',
-    method: 'get',
-    params: {
-      tenantId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/tree',
+		method: 'get',
+		params: {
+			tenantId,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/menu/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/menu/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/menu/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/menu/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/menu/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getMenu = id => {
-  return request({
-    url: '/blade-system/menu/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getTopMenu = () =>
-  request({
-    url: '/blade-system/menu/top-menu',
-    method: 'get',
-  });
+	request({
+		url: '/blade-system/menu/top-menu',
+		method: 'get',
+	})
 
 export const getRoutes = topMenuId =>
-  request({
-    url: '/blade-system/menu/routes',
-    method: 'get',
-    params: {
-      topMenuId,
-    },
-  });
+	request({
+		url: '/blade-system/menu/routes',
+		method: 'get',
+		params: {
+			topMenuId,
+		},
+	})
diff --git a/src/api/system/param.js b/src/api/system/param.js
index be23977..baa2f2f 100644
--- a/src/api/system/param.js
+++ b/src/api/system/param.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/param/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/param/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/param/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/param/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/param/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/param/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/param/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/param/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/param/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/param/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/system/post.js b/src/api/system/post.js
index 01de371..7318b2a 100644
--- a/src/api/system/post.js
+++ b/src/api/system/post.js
@@ -1,59 +1,59 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/post/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/post/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getPostList = tenantId => {
-  return request({
-    url: '/blade-system/post/select',
-    method: 'get',
-    params: {
-      tenantId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/post/select',
+		method: 'get',
+		params: {
+			tenantId,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/post/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/post/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/post/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/post/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/post/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/post/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/post/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/post/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/system/role.js b/src/api/system/role.js
index 22dfe54..ffe2312 100644
--- a/src/api/system/role.js
+++ b/src/api/system/role.js
@@ -1,96 +1,96 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/role/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/role/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 export const grantTree = () => {
-  return request({
-    url: '/blade-system/menu/grant-tree',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-system/menu/grant-tree',
+		method: 'get',
+	})
+}
 
 export const grant = (roleIds, menuIds, dataScopeIds, apiScopeIds) => {
-  return request({
-    url: '/blade-system/role/grant',
-    method: 'post',
-    data: {
-      roleIds,
-      menuIds,
-      dataScopeIds,
-      apiScopeIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/role/grant',
+		method: 'post',
+		data: {
+			roleIds,
+			menuIds,
+			dataScopeIds,
+			apiScopeIds,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/role/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/role/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/role/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/role/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/role/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/role/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getRole = roleIds => {
-  return request({
-    url: '/blade-system/menu/role-tree-keys',
-    method: 'get',
-    params: {
-      roleIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/role-tree-keys',
+		method: 'get',
+		params: {
+			roleIds,
+		},
+	})
+}
 
 export const getRoleTree = tenantId => {
-  return request({
-    url: '/blade-system/role/tree',
-    method: 'get',
-    params: {
-      tenantId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/role/tree',
+		method: 'get',
+		params: {
+			tenantId,
+		},
+	})
+}
 
 export const getRoleTreeById = roleId => {
-  return request({
-    url: '/blade-system/role/tree-by-id',
-    method: 'get',
-    params: {
-      roleId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/role/tree-by-id',
+		method: 'get',
+		params: {
+			roleId,
+		},
+	})
+}
 
 export const getRoleAlias = () => {
-  return request({
-    url: '/blade-system/role/alias',
-    method: 'get',
-    params: {},
-  });
-};
+	return request({
+		url: '/blade-system/role/alias',
+		method: 'get',
+		params: {},
+	})
+}
diff --git a/src/api/system/scope.js b/src/api/system/scope.js
index efc098f..6a2bdd7 100644
--- a/src/api/system/scope.js
+++ b/src/api/system/scope.js
@@ -1,97 +1,97 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getListDataScope = (current, size, params) => {
-  return request({
-    url: '/blade-system/data-scope/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/data-scope/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const removeDataScope = ids => {
-  return request({
-    url: '/blade-system/data-scope/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/data-scope/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const addDataScope = row => {
-  return request({
-    url: '/blade-system/data-scope/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/data-scope/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const updateDataScope = row => {
-  return request({
-    url: '/blade-system/data-scope/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/data-scope/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getMenuDataScope = id => {
-  return request({
-    url: '/blade-system/data-scope/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/data-scope/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getListApiScope = (current, size, params) => {
-  return request({
-    url: '/blade-system/api-scope/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/api-scope/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const removeApiScope = ids => {
-  return request({
-    url: '/blade-system/api-scope/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/api-scope/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const addApiScope = row => {
-  return request({
-    url: '/blade-system/api-scope/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/api-scope/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const updateApiScope = row => {
-  return request({
-    url: '/blade-system/api-scope/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/api-scope/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getMenuApiScope = id => {
-  return request({
-    url: '/blade-system/api-scope/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/api-scope/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
diff --git a/src/api/system/tenant.js b/src/api/system/tenant.js
index be2c549..5d709f7 100644
--- a/src/api/system/tenant.js
+++ b/src/api/system/tenant.js
@@ -1,122 +1,122 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/tenant/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/tenant/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/tenant/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/tenant/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const setting = (ids, form) => {
-  return request({
-    url: '/blade-system/tenant/setting',
-    method: 'post',
-    params: {
-      ...form,
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/setting',
+		method: 'post',
+		params: {
+			...form,
+			ids,
+		},
+	})
+}
 
 export const datasource = (tenantId, datasourceId) => {
-  return request({
-    url: '/blade-system/tenant/datasource',
-    method: 'post',
-    params: {
-      tenantId,
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/datasource',
+		method: 'post',
+		params: {
+			tenantId,
+			datasourceId,
+		},
+	})
+}
 
 export const info = domain => {
-  return request({
-    url: '/blade-system/tenant/info',
-    method: 'get',
-    params: {
-      domain,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/info',
+		method: 'get',
+		params: {
+			domain,
+		},
+	})
+}
 
 export const packageInfo = tenantId => {
-  return request({
-    url: '/blade-system/tenant/package-detail',
-    method: 'get',
-    params: {
-      tenantId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/package-detail',
+		method: 'get',
+		params: {
+			tenantId,
+		},
+	})
+}
 
 export const packageSetting = (tenantId, packageId) => {
-  return request({
-    url: '/blade-system/tenant/package-setting',
-    method: 'post',
-    params: {
-      tenantId,
-      packageId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/package-setting',
+		method: 'post',
+		params: {
+			tenantId,
+			packageId,
+		},
+	})
+}
 
 export const recycle = ids => {
-  return request({
-    url: '/blade-system/tenant/recycle',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/recycle',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const pass = ids => {
-  return request({
-    url: '/blade-system/tenant/pass',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/pass',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/tenant/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
diff --git a/src/api/system/tenantdatasource.js b/src/api/system/tenantdatasource.js
index a56c985..4c7921a 100644
--- a/src/api/system/tenantdatasource.js
+++ b/src/api/system/tenantdatasource.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/tenant-datasource/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-datasource/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/tenant-datasource/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-datasource/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/tenant-datasource/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-datasource/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/tenant-datasource/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant-datasource/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/tenant-datasource/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant-datasource/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/system/tenantpackage.js b/src/api/system/tenantpackage.js
index cf6fb1a..16eebb0 100644
--- a/src/api/system/tenantpackage.js
+++ b/src/api/system/tenantpackage.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/tenant-package/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-package/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/tenant-package/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-package/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/tenant-package/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/tenant-package/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/tenant-package/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant-package/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/tenant-package/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/tenant-package/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/system/topmenu.js b/src/api/system/topmenu.js
index 961fabc..2471c3c 100644
--- a/src/api/system/topmenu.js
+++ b/src/api/system/topmenu.js
@@ -1,77 +1,77 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-system/topmenu/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-system/topmenu/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/topmenu/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/topmenu/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/topmenu/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const grantTree = () => {
-  return request({
-    url: '/blade-system/menu/grant-top-tree',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-system/menu/grant-top-tree',
+		method: 'get',
+	})
+}
 
 export const getTopTree = topMenuIds => {
-  return request({
-    url: '/blade-system/menu/top-tree-keys',
-    method: 'get',
-    params: {
-      topMenuIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/menu/top-tree-keys',
+		method: 'get',
+		params: {
+			topMenuIds,
+		},
+	})
+}
 
 export const grant = (topMenuIds, menuIds) => {
-  return request({
-    url: '/blade-system/topmenu/grant',
-    method: 'post',
-    data: {
-      topMenuIds,
-      menuIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/topmenu/grant',
+		method: 'post',
+		data: {
+			topMenuIds,
+			menuIds,
+		},
+	})
+}
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 63ecdf7..1066923 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -1,150 +1,150 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params, deptId) => {
-  return request({
-    url: '/blade-system/user/page',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-      deptId,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/page',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+			deptId,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-system/user/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-system/user/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/user/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-system/user/update',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/user/update',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const updatePlatform = (userId, userType, userExt) => {
-  return request({
-    url: '/blade-system/user/update-platform',
-    method: 'post',
-    params: {
-      userId,
-      userType,
-      userExt,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/update-platform',
+		method: 'post',
+		params: {
+			userId,
+			userType,
+			userExt,
+		},
+	})
+}
 
 export const getUser = id => {
-  return request({
-    url: '/blade-system/user/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getUserPlatform = id => {
-  return request({
-    url: '/blade-system/user/platform-detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/platform-detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getUserInfo = () => {
-  return request({
-    url: '/blade-system/user/info',
-    method: 'get',
-  });
-};
+	return request({
+		url: '/blade-system/user/info',
+		method: 'get',
+	})
+}
 
 export const resetPassword = userIds => {
-  return request({
-    url: '/blade-system/user/reset-password',
-    method: 'post',
-    params: {
-      userIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/reset-password',
+		method: 'post',
+		params: {
+			userIds,
+		},
+	})
+}
 
 export const updatePassword = (oldPassword, newPassword, newPassword1) => {
-  return request({
-    url: '/blade-system/user/update-password',
-    method: 'post',
-    params: {
-      oldPassword,
-      newPassword,
-      newPassword1,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/update-password',
+		method: 'post',
+		params: {
+			oldPassword,
+			newPassword,
+			newPassword1,
+		},
+	})
+}
 
 export const updateInfo = row => {
-  return request({
-    url: '/blade-system/user/update-info',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-system/user/update-info',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const grant = (userIds, roleIds) => {
-  return request({
-    url: '/blade-system/user/grant',
-    method: 'post',
-    params: {
-      userIds,
-      roleIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/grant',
+		method: 'post',
+		params: {
+			userIds,
+			roleIds,
+		},
+	})
+}
 
 export const unlock = userIds => {
-  return request({
-    url: '/blade-system/user/unlock',
-    method: 'post',
-    params: {
-      userIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/unlock',
+		method: 'post',
+		params: {
+			userIds,
+		},
+	})
+}
 
 export const auditPass = userIds => {
-  return request({
-    url: '/blade-system/user/audit-pass',
-    method: 'post',
-    params: {
-      userIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/audit-pass',
+		method: 'post',
+		params: {
+			userIds,
+		},
+	})
+}
 
 export const auditRefuse = userIds => {
-  return request({
-    url: '/blade-system/user/audit-refuse',
-    method: 'post',
-    params: {
-      userIds,
-    },
-  });
-};
+	return request({
+		url: '/blade-system/user/audit-refuse',
+		method: 'post',
+		params: {
+			userIds,
+		},
+	})
+}
diff --git a/src/api/tool/code.js b/src/api/tool/code.js
index b619f47..9ab0544 100644
--- a/src/api/tool/code.js
+++ b/src/api/tool/code.js
@@ -1,78 +1,78 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-develop/code/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const build = ids => {
-  return request({
-    url: '/blade-develop/code/gen-code',
-    method: 'post',
-    params: {
-      ids,
-      system: 'saber',
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code/gen-code',
+		method: 'post',
+		params: {
+			ids,
+			system: 'saber',
+		},
+	})
+}
 
 export const buildFast = form => {
-  return request({
-    url: '/blade-develop/code/gen-code-fast',
-    method: 'post',
-    data: form,
-  });
-};
+	return request({
+		url: '/blade-develop/code/gen-code-fast',
+		method: 'post',
+		data: form,
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-develop/code/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-develop/code/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/code/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-develop/code/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/code/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const copy = id => {
-  return request({
-    url: '/blade-develop/code/copy',
-    method: 'post',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code/copy',
+		method: 'post',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getCode = id => {
-  return request({
-    url: '/blade-develop/code/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
diff --git a/src/api/tool/codesetting.js b/src/api/tool/codesetting.js
index d4c8aaa..92f589c 100644
--- a/src/api/tool/codesetting.js
+++ b/src/api/tool/codesetting.js
@@ -1,88 +1,88 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-develop/code-setting/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-develop/code-setting/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-develop/code-setting/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-develop/code-setting/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-develop/code-setting/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const enable = id => {
-  return request({
-    url: '/blade-develop/code-setting/enable',
-    method: 'post',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/enable',
+		method: 'post',
+		params: {
+			id,
+		},
+	})
+}
 
 export const getEnableDetail = () => {
-  return request({
-    url: '/blade-develop/code-setting/enable-detail',
-    method: 'get',
-    params: {},
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/enable-detail',
+		method: 'get',
+		params: {},
+	})
+}
 
 export const getTableForm = tableName => {
-  return request({
-    url: '/blade-develop/code-setting/table-form',
-    method: 'get',
-    params: {
-      tableName,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/table-form',
+		method: 'get',
+		params: {
+			tableName,
+		},
+	})
+}
 
 export const getTablePrototype = (tableName, datasourceId) => {
-  return request({
-    url: '/blade-develop/code-setting/table-prototype',
-    method: 'get',
-    params: {
-      tableName,
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/code-setting/table-prototype',
+		method: 'get',
+		params: {
+			tableName,
+			datasourceId,
+		},
+	})
+}
diff --git a/src/api/tool/datasource.js b/src/api/tool/datasource.js
index b1e0ea8..27fa915 100644
--- a/src/api/tool/datasource.js
+++ b/src/api/tool/datasource.js
@@ -1,49 +1,49 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-develop/datasource/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/datasource/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-develop/datasource/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/datasource/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-develop/datasource/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/datasource/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-develop/datasource/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/datasource/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-develop/datasource/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/datasource/submit',
+		method: 'post',
+		data: row,
+	})
+}
diff --git a/src/api/tool/model.js b/src/api/tool/model.js
index 65c4284..62ea3da 100644
--- a/src/api/tool/model.js
+++ b/src/api/tool/model.js
@@ -1,110 +1,110 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const getList = (current, size, params) => {
-  return request({
-    url: '/blade-develop/model/list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const getDetail = id => {
-  return request({
-    url: '/blade-develop/model/detail',
-    method: 'get',
-    params: {
-      id,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/detail',
+		method: 'get',
+		params: {
+			id,
+		},
+	})
+}
 
 export const remove = ids => {
-  return request({
-    url: '/blade-develop/model/remove',
-    method: 'post',
-    params: {
-      ids,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/remove',
+		method: 'post',
+		params: {
+			ids,
+		},
+	})
+}
 
 export const add = row => {
-  return request({
-    url: '/blade-develop/model/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/model/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const update = row => {
-  return request({
-    url: '/blade-develop/model/submit',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/model/submit',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const getTableList = datasourceId => {
-  return request({
-    url: '/blade-develop/model/table-list',
-    method: 'get',
-    params: {
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/table-list',
+		method: 'get',
+		params: {
+			datasourceId,
+		},
+	})
+}
 
 export const getTableInfo = (modelId, datasourceId) => {
-  return request({
-    url: '/blade-develop/model/table-info',
-    method: 'get',
-    params: {
-      modelId,
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/table-info',
+		method: 'get',
+		params: {
+			modelId,
+			datasourceId,
+		},
+	})
+}
 
 export const getTableInfoByName = (tableName, datasourceId) => {
-  return request({
-    url: '/blade-develop/model/table-info',
-    method: 'get',
-    params: {
-      tableName,
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/table-info',
+		method: 'get',
+		params: {
+			tableName,
+			datasourceId,
+		},
+	})
+}
 
 export const getModelPrototype = (modelId, datasourceId) => {
-  return request({
-    url: '/blade-develop/model/model-prototype',
-    method: 'get',
-    params: {
-      modelId,
-      datasourceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model/model-prototype',
+		method: 'get',
+		params: {
+			modelId,
+			datasourceId,
+		},
+	})
+}
 
 export const submitModelPrototype = row => {
-  return request({
-    url: '/blade-develop/model-prototype/submit-list',
-    method: 'post',
-    data: row,
-  });
-};
+	return request({
+		url: '/blade-develop/model-prototype/submit-list',
+		method: 'post',
+		data: row,
+	})
+}
 
 export const prototypeDetail = modelId => {
-  return request({
-    url: '/blade-develop/model-prototype/select',
-    method: 'get',
-    params: {
-      modelId,
-    },
-  });
-};
+	return request({
+		url: '/blade-develop/model-prototype/select',
+		method: 'get',
+		params: {
+			modelId,
+		},
+	})
+}
diff --git a/src/api/user.js b/src/api/user.js
index 012ac71..b641d44 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -1,174 +1,174 @@
-import request from '@/axios';
+import request from '@/axios'
 
-import website from '@/config/website';
-import func from '@/utils/func';
+import website from '@/config/website'
+import func from '@/utils/func'
 
 export const loginByUsername = (tenantId, deptId, roleId, username, password, type, key, code) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': tenantId,
-      'Dept-Id': website.switchMode ? deptId : '',
-      'Role-Id': website.switchMode ? roleId : '',
-      'Captcha-Key': key,
-      'Captcha-Code': code,
-    },
-    params: {
-      tenantId,
-      username,
-      password,
-      grant_type: 'password',
-      scope: 'all',
-      type,
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': tenantId,
+			'Dept-Id': website.switchMode ? deptId : '',
+			'Role-Id': website.switchMode ? roleId : '',
+			'Captcha-Key': key,
+			'Captcha-Code': code,
+		},
+		params: {
+			tenantId,
+			username,
+			password,
+			grant_type: 'password',
+			scope: 'all',
+			type,
+		},
+	})
 
 export const loginBySocial = (tenantId, source, code, state) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': tenantId,
-    },
-    params: {
-      tenantId,
-      source,
-      code,
-      state,
-      grant_type: 'social',
-      scope: 'all',
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': tenantId,
+		},
+		params: {
+			tenantId,
+			source,
+			code,
+			state,
+			grant_type: 'social',
+			scope: 'all',
+		},
+	})
 
 export const loginBySso = (state, code) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': state,
-    },
-    params: {
-      tenantId: state,
-      code,
-      grant_type: 'authorization_code',
-      scope: 'all',
-      redirect_uri: website.oauth2.redirectUri,
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': state,
+		},
+		params: {
+			tenantId: state,
+			code,
+			grant_type: 'authorization_code',
+			scope: 'all',
+			redirect_uri: website.oauth2.redirectUri,
+		},
+	})
 
 export const loginByPhone = (tenantId, phone, id, value) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': tenantId,
-    },
-    params: {
-      tenantId,
-      phone,
-      id,
-      value,
-      grant_type: 'sms_code',
-      scope: 'all',
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': tenantId,
+		},
+		params: {
+			tenantId,
+			phone,
+			id,
+			value,
+			grant_type: 'sms_code',
+			scope: 'all',
+		},
+	})
 
 export const refreshToken = (refresh_token, tenantId, deptId, roleId) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': tenantId,
-      'Dept-Id': func.toStr(deptId),
-      'Role-Id': func.toStr(roleId),
-    },
-    params: {
-      tenantId,
-      refresh_token,
-      grant_type: 'refresh_token',
-      scope: 'all',
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': tenantId,
+			'Dept-Id': func.toStr(deptId),
+			'Role-Id': func.toStr(roleId),
+		},
+		params: {
+			tenantId,
+			refresh_token,
+			grant_type: 'refresh_token',
+			scope: 'all',
+		},
+	})
 
 export const registerUser = (tenantId, name, account, password, phone, email) =>
-  request({
-    url: '/blade-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Tenant-Id': tenantId,
-    },
-    params: {
-      name,
-      username: account,
-      account,
-      password,
-      phone,
-      email,
-      grant_type: 'register',
-      scope: 'all',
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/token',
+		method: 'post',
+		headers: {
+			'Tenant-Id': tenantId,
+		},
+		params: {
+			name,
+			username: account,
+			account,
+			password,
+			phone,
+			email,
+			grant_type: 'register',
+			scope: 'all',
+		},
+	})
 
 export const registerGuest = (form, oauthId) =>
-  request({
-    url: '/blade-system/user/register-guest',
-    method: 'post',
-    params: {
-      tenantId: form.tenantId,
-      name: form.name,
-      account: form.account,
-      password: form.password,
-      oauthId,
-    },
-  });
+	request({
+		url: '/blade-system/user/register-guest',
+		method: 'post',
+		params: {
+			tenantId: form.tenantId,
+			name: form.name,
+			account: form.account,
+			password: form.password,
+			oauthId,
+		},
+	})
 
 export const getButtons = () =>
-  request({
-    url: '/blade-system/menu/buttons',
-    method: 'get',
-  });
+	request({
+		url: '/blade-system/menu/buttons',
+		method: 'get',
+	})
 
 export const getCaptcha = () =>
-  request({
-    url: '/blade-auth/oauth/captcha',
-    method: 'get',
-    authorization: false,
-  });
+	request({
+		url: '/blade-auth/oauth/captcha',
+		method: 'get',
+		authorization: false,
+	})
 
 export const logout = () =>
-  request({
-    url: '/blade-auth/oauth/logout',
-    method: 'get',
-    authorization: false,
-  });
+	request({
+		url: '/blade-auth/oauth/logout',
+		method: 'get',
+		authorization: false,
+	})
 
 export const getUserInfo = () =>
-  request({
-    url: '/blade-auth/oauth/user-info',
-    method: 'get',
-  });
+	request({
+		url: '/blade-auth/oauth/user-info',
+		method: 'get',
+	})
 
 export const sendLogs = list =>
-  request({
-    url: '/blade-auth/oauth/logout',
-    method: 'post',
-    data: list,
-  });
+	request({
+		url: '/blade-auth/oauth/logout',
+		method: 'post',
+		data: list,
+	})
 
 export const clearCache = () =>
-  request({
-    url: '/blade-auth/oauth/clear-cache',
-    method: 'get',
-    authorization: false,
-  });
+	request({
+		url: '/blade-auth/oauth/clear-cache',
+		method: 'get',
+		authorization: false,
+	})
 
 export const sendSms = (tenantId, phone) =>
-  request({
-    url: '/blade-auth/oauth/sms/send-validate',
-    method: 'post',
-    params: {
-      tenantId,
-      phone,
-    },
-  });
+	request({
+		url: '/blade-auth/oauth/sms/send-validate',
+		method: 'post',
+		params: {
+			tenantId,
+			phone,
+		},
+	})
diff --git a/src/api/work/process.js b/src/api/work/process.js
index 4654a64..d54be02 100644
--- a/src/api/work/process.js
+++ b/src/api/work/process.js
@@ -1,33 +1,33 @@
-import request from '@/axios';
+import request from '@/axios'
 
 // =====================参数===========================
 
 export const historyFlowList = processInstanceId => {
-  return request({
-    url: '/blade-flow/process/history-flow-list',
-    method: 'get',
-    params: {
-      processInstanceId,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/process/history-flow-list',
+		method: 'get',
+		params: {
+			processInstanceId,
+		},
+	})
+}
 
 // =====================请假流程===========================
 
 export const leaveProcess = data => {
-  return request({
-    url: '/blade-desk/process/leave/start-process',
-    method: 'post',
-    data,
-  });
-};
+	return request({
+		url: '/blade-desk/process/leave/start-process',
+		method: 'post',
+		data,
+	})
+}
 
 export const leaveDetail = businessId => {
-  return request({
-    url: '/blade-desk/process/leave/detail',
-    method: 'get',
-    params: {
-      businessId,
-    },
-  });
-};
+	return request({
+		url: '/blade-desk/process/leave/detail',
+		method: 'get',
+		params: {
+			businessId,
+		},
+	})
+}
diff --git a/src/api/work/work.js b/src/api/work/work.js
index 360e396..a5264bb 100644
--- a/src/api/work/work.js
+++ b/src/api/work/work.js
@@ -1,79 +1,79 @@
-import request from '@/axios';
+import request from '@/axios'
 
 export const startList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/work/start-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/start-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const claimList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/work/claim-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/claim-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const todoList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/work/todo-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/todo-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const sendList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/work/send-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/send-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const doneList = (current, size, params) => {
-  return request({
-    url: '/blade-flow/work/done-list',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/done-list',
+		method: 'get',
+		params: {
+			...params,
+			current,
+			size,
+		},
+	})
+}
 
 export const claimTask = taskId => {
-  return request({
-    url: '/blade-flow/work/claim-task',
-    method: 'post',
-    params: {
-      taskId,
-    },
-  });
-};
+	return request({
+		url: '/blade-flow/work/claim-task',
+		method: 'post',
+		params: {
+			taskId,
+		},
+	})
+}
 
 export const completeTask = data => {
-  return request({
-    url: '/blade-flow/work/complete-task',
-    method: 'post',
-    data,
-  });
-};
+	return request({
+		url: '/blade-flow/work/complete-task',
+		method: 'post',
+		data,
+	})
+}
diff --git a/src/axios.js b/src/axios.js
index 3f0905f..0e56d22 100644
--- a/src/axios.js
+++ b/src/axios.js
@@ -5,222 +5,222 @@
  * isSerialize是否开启form表单提交
  * isToken是否需要token
  */
-import axios from 'axios';
-import store from '@/store/';
-import router from '@/router/';
-import { serialize } from '@/utils/util';
-import { getToken, removeToken, removeRefreshToken } from '@/utils/auth';
-import { isURL, validatenull } from '@/utils/validate';
-import { ElMessage } from 'element-plus';
-import website from '@/config/website';
-import NProgress from 'nprogress'; // progress bar
-import 'nprogress/nprogress.css'; // progress bar style
-import { Base64 } from 'js-base64';
-import { baseUrl } from '@/config/env';
-import crypto from '@/utils/crypto';
+import axios from 'axios'
+import store from '@/store/'
+import router from '@/router/'
+import { serialize } from '@/utils/util'
+import { getToken, removeToken, removeRefreshToken } from '@/utils/auth'
+import { isURL, validatenull } from '@/utils/validate'
+import { ElMessage } from 'element-plus'
+import website from '@/config/website'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import { Base64 } from 'js-base64'
+import { baseUrl } from '@/config/env'
+import crypto from '@/utils/crypto'
 
 // 全局未授权错误提示状态,只提示一次
-let isErrorShown = false;
+let isErrorShown = false
 // 全局锁机制相关变量
-let isRefreshing = false; // 标记当前是否正在刷新token
-let refreshTokenPromise = null; // 刷新token的Promise,避免重复请求
+let isRefreshing = false // 标记当前是否正在刷新token
+let refreshTokenPromise = null // 刷新token的Promise,避免重复请求
 
-axios.defaults.timeout = 10000;
+axios.defaults.timeout = 10000
 //返回其他状态码
 axios.defaults.validateStatus = function (status) {
-  return status >= 200 && status <= 500; // 默认的
-};
+	return status >= 200 && status <= 500 // 默认的
+}
 //跨域请求,允许保存cookie
-axios.defaults.withCredentials = true;
+axios.defaults.withCredentials = true
 // NProgress Configuration
 NProgress.configure({
-  showSpinner: false,
-});
+	showSpinner: false,
+})
 
 //http request拦截
 axios.interceptors.request.use(
-  config => {
-    // start progress bar
-    NProgress.start();
-    // 初始化错误提示状态
-    isErrorShown = false;
-    //地址为已经配置状态则不添加前缀
-    if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
-      config.url = baseUrl + config.url;
-    }
-    config.headers['areaCode'] = store.state.user.selectedAreaCode;
-    //安全请求header
-    config.headers['Blade-Requested-With'] = 'BladeHttpRequest';
-    //headers判断是否需要
-    const authorization = config.authorization === false;
-    if (!authorization) {
-      config.headers['Authorization'] = `Basic ${Base64.encode(
-        `${website.clientId}:${website.clientSecret}`
-      )}`;
-    }
-    // 根据后端要求,post的data为空的话传{}
-    if (config.method === 'post') {
-      config.data = config.data || {};
-    }
-    //headers判断请求是否携带token
-    const meta = config.meta || {};
-    const isToken = meta.isToken === false;
-    //headers传递token是否加密
-    const cryptoToken = config.cryptoToken === true;
-    //判断传递数据是否加密
-    const cryptoData = config.cryptoData === true;
-    const token = getToken();
-    if (token && !isToken) {
-      config.headers[website.tokenHeader] = cryptoToken
-        ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
-        : 'bearer ' + token;
-    }
-    // 开启报文加密
-    // if (cryptoData) {
-    //   if (config.params) {
-    //     const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey);
-    //     config.params = { data };
-    //   }
-    //   if (config.data) {
-    //     config.text = true;
-    //     config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey);
-    //   }
-    // }
-    //headers中配置text请求
-    if (config.text === true) {
-      config.headers['Content-Type'] = 'text/plain';
-    }
-    //headers中配置serialize为true开启序列化
-    if (config.method === 'post' && meta.isSerialize === true) {
-      config.data = serialize(config.data);
-    }
-    return config;
-  },
-  error => {
-    return Promise.reject(error);
-  }
-);
+	config => {
+		// start progress bar
+		NProgress.start()
+		// 初始化错误提示状态
+		isErrorShown = false
+		//地址为已经配置状态则不添加前缀
+		if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
+			config.url = baseUrl + config.url
+		}
+		config.headers['areaCode'] = store.state.user.selectedAreaCode
+		//安全请求header
+		config.headers['Blade-Requested-With'] = 'BladeHttpRequest'
+		//headers判断是否需要
+		const authorization = config.authorization === false
+		if (!authorization) {
+			config.headers['Authorization'] = `Basic ${Base64.encode(
+				`${website.clientId}:${website.clientSecret}`
+			)}`
+		}
+		// 根据后端要求,post的data为空的话传{}
+		if (config.method === 'post') {
+			config.data = config.data || {}
+		}
+		//headers判断请求是否携带token
+		const meta = config.meta || {}
+		const isToken = meta.isToken === false
+		//headers传递token是否加密
+		const cryptoToken = config.cryptoToken === true
+		//判断传递数据是否加密
+		const cryptoData = config.cryptoData === true
+		const token = getToken()
+		if (token && !isToken) {
+			config.headers[website.tokenHeader] = cryptoToken
+				? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
+				: 'bearer ' + token
+		}
+		// 开启报文加密
+		// if (cryptoData) {
+		//   if (config.params) {
+		//     const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey);
+		//     config.params = { data };
+		//   }
+		//   if (config.data) {
+		//     config.text = true;
+		//     config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey);
+		//   }
+		// }
+		//headers中配置text请求
+		if (config.text === true) {
+			config.headers['Content-Type'] = 'text/plain'
+		}
+		//headers中配置serialize为true开启序列化
+		if (config.method === 'post' && meta.isSerialize === true) {
+			config.data = serialize(config.data)
+		}
+		return config
+	},
+	error => {
+		return Promise.reject(error)
+	}
+)
 
 //http response拦截
 axios.interceptors.response.use(
-  res => {
-    NProgress.done();
-    //获取配置信息
-    const config = res.config;
-    const cryptoData = config.cryptoData === true;
-    //解析加密报文
-    if (cryptoData) {
-      res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey));
-    }
-    //获取状态信息
-    const status = res.data.error_code || res.data.code || res.status;
-    const statusWhiteList = website.statusWhiteList || [];
-    const message = res.data.msg || res.data.error_description || '系统错误';
-    //如果在白名单里则自行catch逻辑处理
-    if (statusWhiteList.includes(status)) return Promise.reject(res);
+	res => {
+		NProgress.done()
+		//获取配置信息
+		const config = res.config
+		const cryptoData = config.cryptoData === true
+		//解析加密报文
+		if (cryptoData) {
+			res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey))
+		}
+		//获取状态信息
+		const status = res.data.error_code || res.data.code || res.status
+		const statusWhiteList = website.statusWhiteList || []
+		const message = res.data.msg || res.data.error_description || '系统错误'
+		//如果在白名单里则自行catch逻辑处理
+		if (statusWhiteList.includes(status)) return Promise.reject(res)
 
-    // 如果是401并且没有重试过,尝试刷新token
-    if (status === 401 && !config._retry) {
-      config._retry = true;
+		// 如果是401并且没有重试过,尝试刷新token
+		if (status === 401 && !config._retry) {
+			config._retry = true
 
-      // 如果当前已经在刷新token,等待刷新完成
-      if (isRefreshing) {
-        return refreshTokenPromise.then(() => {
-          const meta = config.meta || {};
-          const isToken = meta.isToken === false;
-          const cryptoToken = config.cryptoToken === true;
-          const token = getToken();
-          if (token && !isToken) {
-            config.headers[website.tokenHeader] = cryptoToken
-              ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
-              : 'bearer ' + token;
-          }
-          return axios(config);
-        });
-      }
+			// 如果当前已经在刷新token,等待刷新完成
+			if (isRefreshing) {
+				return refreshTokenPromise.then(() => {
+					const meta = config.meta || {}
+					const isToken = meta.isToken === false
+					const cryptoToken = config.cryptoToken === true
+					const token = getToken()
+					if (token && !isToken) {
+						config.headers[website.tokenHeader] = cryptoToken
+							? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
+							: 'bearer ' + token
+					}
+					return axios(config)
+				})
+			}
 
-      // 开始刷新token
-      isRefreshing = true;
+			// 开始刷新token
+			isRefreshing = true
 
-      // 调用RefreshToken action来刷新token
-      refreshTokenPromise = store
-        .dispatch('RefreshToken')
-        .then(() => {
-          isRefreshing = false; // 重置刷新标志
-          const meta = config.meta || {};
-          const isToken = meta.isToken === false;
-          const cryptoToken = config.cryptoToken === true;
-          // 获取刷新后的token
-          const token = getToken();
-          if (token && !isToken) {
-            config.headers[website.tokenHeader] = cryptoToken
-              ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
-              : 'bearer ' + token;
-          }
-          return axios(config);
-        })
-        .catch(() => {
-          isRefreshing = false; // 重置刷新标志
-          // 首次报错时提示
-          if (!isErrorShown) {
-            isErrorShown = true;
-            ElMessage({
-              message: '用户令牌不可用,请重新登录',
-              type: 'error',
-            });
-          }
-          // 清除token信息
-          removeToken();
-          removeRefreshToken();
-          // 重定向到登录页
-          store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
-          return Promise.reject(new Error(message));
-        });
+			// 调用RefreshToken action来刷新token
+			refreshTokenPromise = store
+				.dispatch('RefreshToken')
+				.then(() => {
+					isRefreshing = false // 重置刷新标志
+					const meta = config.meta || {}
+					const isToken = meta.isToken === false
+					const cryptoToken = config.cryptoToken === true
+					// 获取刷新后的token
+					const token = getToken()
+					if (token && !isToken) {
+						config.headers[website.tokenHeader] = cryptoToken
+							? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
+							: 'bearer ' + token
+					}
+					return axios(config)
+				})
+				.catch(() => {
+					isRefreshing = false // 重置刷新标志
+					// 首次报错时提示
+					if (!isErrorShown) {
+						isErrorShown = true
+						ElMessage({
+							message: '用户令牌不可用,请重新登录',
+							type: 'error',
+						})
+					}
+					// 清除token信息
+					removeToken()
+					removeRefreshToken()
+					// 重定向到登录页
+					store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }))
+					return Promise.reject(new Error(message))
+				})
 
-      return refreshTokenPromise;
-    }
+			return refreshTokenPromise
+		}
 
-    // 如果是401并且已经重试过,直接跳转到登录页面
-    if (status === 401 && config._retry) {
-      if (!isErrorShown) {
-        isErrorShown = true;
-        ElMessage({
-          message: '用户令牌不可用,请重新登录',
-          type: 'error',
-        });
-      }
-      removeToken();
-      removeRefreshToken();
-      store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
-      return Promise.reject(new Error(message));
-    }
+		// 如果是401并且已经重试过,直接跳转到登录页面
+		if (status === 401 && config._retry) {
+			if (!isErrorShown) {
+				isErrorShown = true
+				ElMessage({
+					message: '用户令牌不可用,请重新登录',
+					type: 'error',
+				})
+			}
+			removeToken()
+			removeRefreshToken()
+			store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }))
+			return Promise.reject(new Error(message))
+		}
 
-    // 如果请求为oauth2错误码则首次报错时提示
-    if (status > 2000 && !validatenull(res.data.error_description)) {
-      if (!isErrorShown) {
-        isErrorShown = true;
-        ElMessage({
-          message: message,
-          type: 'error',
-        });
-      }
-      return Promise.reject(new Error(message));
-    }
+		// 如果请求为oauth2错误码则首次报错时提示
+		if (status > 2000 && !validatenull(res.data.error_description)) {
+			if (!isErrorShown) {
+				isErrorShown = true
+				ElMessage({
+					message: message,
+					type: 'error',
+				})
+			}
+			return Promise.reject(new Error(message))
+		}
 
-    // 如果请求为非200则默认统一处理
-    if (status !== 200) {
-      ElMessage({
-        message: message,
-        type: 'error',
-      });
-      return Promise.reject(new Error(message));
-    }
-    return res;
-  },
-  error => {
-    NProgress.done();
-    return Promise.reject(new Error(error));
-  }
-);
+		// 如果请求为非200则默认统一处理
+		if (status !== 200) {
+			ElMessage({
+				message: message,
+				type: 'error',
+			})
+			return Promise.reject(new Error(message))
+		}
+		return res
+	},
+	error => {
+		NProgress.done()
+		return Promise.reject(new Error(error))
+	}
+)
 
-export default axios;
+export default axios
diff --git a/src/components/basic-video/plugin.js b/src/components/basic-video/plugin.js
index a304bee..3ba258d 100644
--- a/src/components/basic-video/plugin.js
+++ b/src/components/basic-video/plugin.js
@@ -1,88 +1,88 @@
 export default class RecordVideo {
-  /**
-   * 构造函数
-   *
-   * @param  {Object}   videoObj 视频对象
-   */
-  constructor(videoObj) {
-    this.video = videoObj;
-    this.mediaRecorder = null;
-    this.chunks = [];
-  }
+	/**
+	 * 构造函数
+	 *
+	 * @param  {Object}   videoObj 视频对象
+	 */
+	constructor(videoObj) {
+		this.video = videoObj
+		this.mediaRecorder = null
+		this.chunks = []
+	}
 
-  /**
-   * 初始化
-   *
-   * @return {Object} promise
-   */
-  init() {
-    // 返回Promise对象
-    // resolve 正常处理
-    // reject 处理异常情况
-    return new Promise((resovle, reject) => {
-      navigator.mediaDevices
-        .getUserMedia({
-          audio: true,
-          video: true,
-          // video: {
-          //     width: this.videoWidth,
-          //     height: this.videoHeight
-          // }
-        })
-        // 返回一个媒体内容的流
-        .then(stream => {
-          // 检测是否支持 srcObject,该属性在新的浏览器支持
-          if ('srcObject' in this.video) {
-            this.video.srcObject = stream;
-          } else {
-            // 兼容旧的浏览器
-            this.video.src = window.URL.createObjectURL(stream);
-          }
+	/**
+	 * 初始化
+	 *
+	 * @return {Object} promise
+	 */
+	init() {
+		// 返回Promise对象
+		// resolve 正常处理
+		// reject 处理异常情况
+		return new Promise((resovle, reject) => {
+			navigator.mediaDevices
+				.getUserMedia({
+					audio: true,
+					video: true,
+					// video: {
+					//     width: this.videoWidth,
+					//     height: this.videoHeight
+					// }
+				})
+				// 返回一个媒体内容的流
+				.then(stream => {
+					// 检测是否支持 srcObject,该属性在新的浏览器支持
+					if ('srcObject' in this.video) {
+						this.video.srcObject = stream
+					} else {
+						// 兼容旧的浏览器
+						this.video.src = window.URL.createObjectURL(stream)
+					}
 
-          // 当视频的元数据已经加载时触发
-          this.video.addEventListener('loadmetadata', () => {
-            this.video.play();
-          });
-          this.mediaRecorder = new MediaRecorder(stream);
-          this.mediaRecorder.addEventListener('dataavailable', e => {
-            this.chunks.push(e.data);
-          });
-          resovle();
-        })
-        // 异常抓取,包括用于禁用麦克风、摄像头
-        .catch(error => {
-          reject(error);
-        });
-    });
-  }
+					// 当视频的元数据已经加载时触发
+					this.video.addEventListener('loadmetadata', () => {
+						this.video.play()
+					})
+					this.mediaRecorder = new MediaRecorder(stream)
+					this.mediaRecorder.addEventListener('dataavailable', e => {
+						this.chunks.push(e.data)
+					})
+					resovle()
+				})
+				// 异常抓取,包括用于禁用麦克风、摄像头
+				.catch(error => {
+					reject(error)
+				})
+		})
+	}
 
-  /**
-   * 视频开始录制
-   */
-  startRecord() {
-    if (this.mediaRecorder.state === 'inactive') {
-      this.mediaRecorder.start();
-    }
-  }
+	/**
+	 * 视频开始录制
+	 */
+	startRecord() {
+		if (this.mediaRecorder.state === 'inactive') {
+			this.mediaRecorder.start()
+		}
+	}
 
-  /**
-   * 视频结束录制
-   */
-  stopRecord() {
-    if (this.mediaRecorder.state === 'recording') {
-      this.mediaRecorder.stop();
-    }
-  }
+	/**
+	 * 视频结束录制
+	 */
+	stopRecord() {
+		if (this.mediaRecorder.state === 'recording') {
+			this.mediaRecorder.stop()
+		}
+	}
 
-  /**
-   * 检测当前浏览器对否支持
-   *
-   * @return {boolean} 当前浏览器是否支持
-   */
-  isSupport() {
-    const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia;
-    if (flag) {
-      return true;
-    }
-  }
+	/**
+	 * 检测当前浏览器对否支持
+	 *
+	 * @return {boolean} 当前浏览器是否支持
+	 */
+	isSupport() {
+		const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia
+		if (flag) {
+			return true
+		}
+	}
 }
diff --git a/src/components/global/publicTitle.vue b/src/components/global/publicTitle.vue
new file mode 100644
index 0000000..ded5b43
--- /dev/null
+++ b/src/components/global/publicTitle.vue
@@ -0,0 +1,33 @@
+<!--
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2024-10-25 18:41:39
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2025-04-02 18:26:00
+ * @FilePath: \command-center-dashboard\src\components\publicTitle\publicTitle.vue
+ * @Description: 
+ * 
+ * Copyright (c) 2024 by shuishen, All Rights Reserved. 
+-->
+<template>
+    <div class="title-box">
+        <div class="title">
+            <slot name="titleName"></slot>
+        </div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.title {
+    margin-left: 30px;
+    text-align: left;
+    font-size: 18px;
+    font-family: Alibaba PuHuiTi;
+    font-weight: 700;
+    font-style: italic;
+    color: transparent;
+    text-shadow: 0 2px 8px rgba(5, 28, 55, .42);
+    background-image: linear-gradient(180deg, rgba(14, 197, 236, .36) 5%, rgba(49, 190, 255, .36) 20%, #fff 40%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparen;
+}
+</style>
\ No newline at end of file
diff --git a/src/components/index.js b/src/components/index.js
index 3101eb5..7d7a74c 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,22 +1,15 @@
-/*
- * @Author: shuishen 1109946754@qq.com
- * @Date: 2024-10-25 15:20:05
- * @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-11-08 20:11:39
- * @FilePath: \bigScreen\src\components\index.js
- * @Description: 
- * 
- * Copyright (c) 2024 by shuishen, All Rights Reserved. 
- */
-/*
- **全局注册组件
- ** 放在components/global文件夹下
- */
 import { defineAsyncComponent } from 'vue'
-const components = import.meta.glob('./global/*.vue') // 异步方式
-export default function install (app) {
-  for (const [key, value] of Object.entries(components)) {
-    const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))
-    app.component(name, defineAsyncComponent(value))
-  }
+
+export default {
+	install(app) {
+		// 匹配当前目录下所有.vue文件(包括子目录)
+		const components = import.meta.glob('./global/*.vue', { eager: true })
+
+		for (const [path, module] of Object.entries(components)) {
+			// 提取组件名(去除路径和扩展名)
+			const name = path.split('/').pop()?.replace('.vue', '') || ''
+			// 注册组件
+			app.component(name, module.default)
+		}
+	},
 }
diff --git a/src/config/env.js b/src/config/env.js
index d882c76..d376ebf 100644
--- a/src/config/env.js
+++ b/src/config/env.js
@@ -1,2 +1,2 @@
-let baseUrl = import.meta.env.VITE_APP_API;
-export { baseUrl };
+let baseUrl = import.meta.env.VITE_APP_API
+export { baseUrl }
diff --git a/src/config/iconList.js b/src/config/iconList.js
index 1208c40..9712b7e 100644
--- a/src/config/iconList.js
+++ b/src/config/iconList.js
@@ -1,380 +1,380 @@
 export default [
-  {
-    label: '通用图标',
-    list: [
-      'iconfont iconicon_roundadd',
-      'iconfont iconicon_compile',
-      'iconfont iconicon_glass',
-      'iconfont iconicon_roundclose',
-      'iconfont iconicon_roundreduce',
-      'iconfont iconicon_delete',
-      'iconfont iconicon_shakehands',
-      'iconfont iconicon_task_done',
-      'iconfont iconicon_voipphone',
-      'iconfont iconicon_safety',
-      'iconfont iconicon_work',
-      'iconfont iconicon_study',
-      'iconfont iconicon_task',
-      'iconfont iconicon_subordinate',
-      'iconfont iconicon_star',
-      'iconfont iconicon_setting',
-      'iconfont iconicon_sms',
-      'iconfont iconicon_share',
-      'iconfont iconicon_secret',
-      'iconfont iconicon_scan_namecard',
-      'iconfont iconicon_principal',
-      'iconfont iconicon_group',
-      'iconfont iconicon_send',
-      'iconfont iconicon_scan',
-      'iconfont iconicon_search',
-      'iconfont iconicon_refresh',
-      'iconfont iconicon_savememo',
-      'iconfont iconicon_QRcode',
-      'iconfont iconicon_im_keyboard',
-      'iconfont iconicon_redpacket',
-      'iconfont iconicon_photo',
-      'iconfont iconicon_qq',
-      'iconfont iconicon_wechat',
-      'iconfont iconicon_phone',
-      'iconfont iconicon_namecard',
-      'iconfont iconicon_notice',
-      'iconfont iconicon_next_arrow',
-      'iconfont iconicon_left',
-      'iconfont iconicon_more',
-      'iconfont iconicon_details',
-      'iconfont iconicon_message',
-      'iconfont iconicon_mobilephone',
-      'iconfont iconicon_im_voice',
-      'iconfont iconicon_GPS',
-      'iconfont iconicon_ding',
-      'iconfont iconicon_exchange',
-      'iconfont iconicon_cspace',
-      'iconfont iconicon_doc',
-      'iconfont iconicon_dispose',
-      'iconfont iconicon_discovery',
-      'iconfont iconicon_community_line',
-      'iconfont iconicon_cloud_history',
-      'iconfont iconicon_coinpurse_line',
-      'iconfont iconicon_airplay',
-      'iconfont iconicon_at',
-      'iconfont iconicon_addressbook',
-      'iconfont iconicon_boss',
-      'iconfont iconicon_addperson',
-      'iconfont iconicon_affiliations_li',
-      'iconfont iconicon_addmessage',
-      'iconfont iconicon_addresslist',
-      'iconfont iconicon_add',
-      'iconfont icongithub',
-      'iconfont icongitee2',
-    ],
-  },
-  {
-    label: '系统图标',
-    list: [
-      'iconfont icon-zhongyingwen',
-      'iconfont icon-caidan',
-      'iconfont icon-rizhi1',
-      'iconfont icon-zhuti',
-      'iconfont icon-suoping',
-      'iconfont icon-bug',
-      'iconfont icon-qq1',
-      'iconfont icon-weixin1',
-      'iconfont icon-shouji',
-      'iconfont icon-mima',
-      'iconfont icon-yonghu',
-      'iconfont icon-yanzhengma',
-      'iconfont icon-canshu',
-      'iconfont icon-dongtai',
-      'iconfont icon-iconset0265',
-      'iconfont icon-shujuzhanshi2',
-      'iconfont icon-tuichuquanping',
-      'iconfont icon-rizhi',
-      'iconfont icon-cuowutishitubiao',
-      'iconfont icon-debug',
-      'iconfont icon-iconset0216',
-      'iconfont icon-quanxian',
-      'iconfont icon-quanxian',
-      'iconfont icon-shuaxin',
-      'iconfont icon-bofangqi-suoping',
-      'iconfont icon-quanping',
-      'iconfont icon-navicon',
-      'iconfont icon-biaodan',
-      'iconfont icon-liuliangyunpingtaitubiao08',
-      'iconfont icon-caidanguanli',
-      'iconfont icon-cuowu',
-      'iconfont icon-wxbgongju',
-      'iconfont icon-tuichu',
-      'iconfont icon-daohanglanmoshi02',
-      'iconfont icon-changyonglogo27',
-      'iconfont icon-biaoge',
-      'iconfont icon-baidu1',
-      'iconfont icon-tubiao',
-      'iconfont icon-souhu',
-      'iconfont icon-msnui-360',
-      'iconfont icon-iframe',
-      'iconfont icon-huanyingye',
-    ],
-  },
-  {
-    label: '业务图标',
-    list: [
-      'iconfont icon-zidingyi',
-      'iconfont icon-xiajiantou',
-      'iconfont icon-shangjiantou',
-      'iconfont icon-icon_loading',
-      'iconfont icon-biaodanzujian-shurukuang',
-      'iconfont icon-biaodanzujian-biaoge',
-      'iconfont icon-biaodanzujian-xialakuang',
-      'iconfont icon-tubiao-bingtu',
-      'iconfont icon-biaodanzujian-anniu',
-      'iconfont icon-gongyezujian-yibiaopan',
-      'iconfont icon-tubiao-qiapian',
-      'iconfont icon-gongyezujian-zhishideng',
-      'iconfont icon-tubiao-zhexiantu',
-      'iconfont icon-xingzhuang-juxing',
-      'iconfont icon-xingzhuang-jianxing',
-      'iconfont icon-gongyezujian-kaiguan',
-      'iconfont icon-tubiao-zhuzhuangtu',
-      'iconfont icon-xingzhuang-tupian',
-      'iconfont icon-xingzhuang-wenzi',
-      'iconfont icon-xingzhuang-tuoyuanxing',
-      'iconfont icon-xingzhuang-sanjiaoxing',
-      'iconfont icon-xingzhuang-xingxing',
-      'iconfont icon-guize',
-      'iconfont icon-shebeiguanli',
-      'iconfont icon-gongnengdingyi1',
-      'iconfont icon-jishufuwu1',
-      'iconfont icon-yunyingzhongxin',
-      'iconfont icon-yunyingguanli',
-      'iconfont icon-zuzhixiaxia',
-      'iconfont icon-zuzhizhankai',
-      'iconfont icon-zuzhiqunzu',
-      'iconfont icon-dakai',
-      'iconfont icon-yingwen',
-      'iconfont icon-zhongwen',
-      'iconfont icon-miwen',
-      'iconfont icon-xianhao',
-      'iconfont icon-kongxinduigou',
-      'iconfont icon-huixingzhen',
-      'iconfont icon-duigou',
-      'iconfont icon-xiayibu',
-      'iconfont icon-shangyibu',
-      'iconfont icon-kongjianxuanzhong',
-      'iconfont icon-kongjianweixuan',
-      'iconfont icon-kongjianyixuan',
-      'iconfont icon--diangan',
-      'iconfont icon-rongxuejirongjiechi',
-      'iconfont icon-lubiantingchechang',
-      'iconfont icon--lumingpai',
-      'iconfont icon-jietouzuoyi',
-      'iconfont icon--zhongdaweixian',
-      'iconfont icon--jiaotongbiaozhipai',
-      'iconfont icon-gongcezhishipai',
-      'iconfont icon-fangkuai',
-      'iconfont icon-fangkuai-',
-      'iconfont icon-shuaxin',
-      'iconfont icon-baocun',
-      'iconfont icon-fabu',
-      'iconfont icon-xiayibu1',
-      'iconfont icon-shangyibu1',
-      'iconfont icon-xiangxiazhanhang',
-      'iconfont icon-xiangshangzhanhang',
-      'iconfont icon-tupianjiazaishibai',
-      'iconfont icon-fuwudiqiu',
-      'iconfont icon-suoxiao',
-      'iconfont icon-fangda',
-      'iconfont icon-huanyuanhuabu',
-      'iconfont icon-quanping',
-      'iconfont icon-biaodanzujian-biaoge1',
-      'iconfont icon-APIshuchu',
-      'iconfont icon-APIjieru',
-      'iconfont icon-wenjianjia',
-      'iconfont icon-DOC',
-      'iconfont icon-BMP',
-      'iconfont icon-GIF',
-      'iconfont icon-JPG',
-      'iconfont icon-PNG',
-      'iconfont icon-weizhigeshi',
-      'iconfont icon-gengduo',
-      'iconfont icon-yunduanxiazai',
-      'iconfont icon-yunduanshangchuan',
-      'iconfont icon-dian',
-      'iconfont icon-mian',
-      'iconfont icon-xian',
-      'iconfont icon-shebeizhuangtai',
-      'iconfont icon-fenzuguanli',
-      'iconfont icon-kuaisubianpai',
-      'iconfont icon-APPkaifa',
-      'iconfont icon-wentijieda',
-      'iconfont icon-kefu',
-      'iconfont icon-ruanjiankaifabao',
-      'iconfont icon-sousuobianxiao',
-      'iconfont icon-sousuofangda',
-      'iconfont icon-dingwei',
-      'iconfont icon-wumoxing',
-      'iconfont icon-gaojing',
-      'iconfont icon-renwujincheng',
-      'iconfont icon-xiaoxitongzhi',
-      'iconfont icon-youhui',
-      'iconfont icon-gaojing1',
-      'iconfont icon-zhihangfankui',
-      'iconfont icon-gongdanqueren',
-      'iconfont icon-guangbo',
-      'iconfont icon-gongdan',
-      'iconfont icon-xiaoxi',
-      'iconfont icon-xinhao',
-      'iconfont icon-lanya',
-      'iconfont icon-Wi-Fi',
-      'iconfont icon-chaxun',
-      'iconfont icon-dianbiao',
-      'iconfont icon-anquan',
-      'iconfont icon-daibanshixiang',
-      'iconfont icon-bingxiang',
-      'iconfont icon-fanshe',
-      'iconfont icon-fengche',
-      'iconfont icon-guandao',
-      'iconfont icon-guize1',
-      'iconfont icon-guizeyinqing',
-      'iconfont icon-huowudui',
-      'iconfont icon-jianceqi',
-      'iconfont icon-jinggai',
-      'iconfont icon-liujisuan',
-      'iconfont icon-hanshu',
-      'iconfont icon-lianjieliu',
-      'iconfont icon-ludeng',
-      'iconfont icon-shexiangji',
-      'iconfont icon-rentijiance',
-      'iconfont icon-moshubang',
-      'iconfont icon-shujuwajue',
-      'iconfont icon-wangguan',
-      'iconfont icon-shenjing',
-      'iconfont icon-chucun',
-      'iconfont icon-wuguan',
-      'iconfont icon-yunduanshuaxin',
-      'iconfont icon-yunhang',
-      'iconfont icon-luyouqi',
-      'iconfont icon-bug',
-      'iconfont icon-get',
-      'iconfont icon-PIR',
-      'iconfont icon-zhexiantu',
-      'iconfont icon-shuibiao',
-      'iconfont icon-js',
-      'iconfont icon-zihangche',
-      'iconfont icon-liebiao',
-      'iconfont icon-qichedingwei',
-      'iconfont icon-dici',
-      'iconfont icon-mysql',
-      'iconfont icon-qiche',
-      'iconfont icon-shenjing1',
-      'iconfont icon-chengshi',
-      'iconfont icon-tixingshixin',
-      'iconfont icon-menci',
-      'iconfont icon-chazuo',
-      'iconfont icon-ranqijianceqi',
-      'iconfont icon-kaiguan',
-      'iconfont icon-chatou',
-      'iconfont icon-xiyiji',
-      'iconfont icon-yijiankaiguan',
-      'iconfont icon-yanwubaojingqi',
-      'iconfont icon-wuxiandianbo',
-      'iconfont icon-fuzhi',
-      'iconfont icon-shanchu',
-      'iconfont icon-bianjisekuai',
-      'iconfont icon-ishipinshixiao',
-      'iconfont icon-iframetianjia',
-      'iconfont icon-tupiantianjia',
-      'iconfont icon-liebiaomoshi_kuai',
-      'iconfont icon-qiapianmoshi_kuai',
-      'iconfont icon-fenlan',
-      'iconfont icon-fengexian',
-      'iconfont icon-dianzan',
-      'iconfont icon-charulianjie',
-      'iconfont icon-charutupian',
-      'iconfont icon-quxiaolianjie',
-      'iconfont icon-wuxupailie',
-      'iconfont icon-juzhongduiqi',
-      'iconfont icon-yinyong',
-      'iconfont icon-youxupailie',
-      'iconfont icon-youduiqi',
-      'iconfont icon-zitidaima',
-      'iconfont icon-xiaolian',
-      'iconfont icon-zitijiacu',
-      'iconfont icon-zitishanchuxian',
-      'iconfont icon-zitishangbiao',
-      'iconfont icon-zitibiaoti',
-      'iconfont icon-zitixiahuaxian',
-      'iconfont icon-zitixieti',
-      'iconfont icon-zitiyanse',
-      'iconfont icon-zuoduiqi',
-      'iconfont icon-zitiyulan',
-      'iconfont icon-zitixiabiao',
-      'iconfont icon-zuoyouduiqi',
-      'iconfont icon-tianxie',
-      'iconfont icon-huowudui1',
-      'iconfont icon-yingjian',
-      'iconfont icon-shebeikaifa',
-      'iconfont icon-dianzan_kuai',
-      'iconfont icon-zhihuan',
-      'iconfont icon-tuoguan',
-      'iconfont icon-duigoux',
-      'iconfont icon-guanbi1',
-      'iconfont icon-aixin_shixin',
-      'iconfont icon-ranqixieloubaojingqi',
-      'iconfont icon-dianbiao_shiti',
-      'iconfont icon-aixin',
-      'iconfont icon-shuibiao_shiti',
-      'iconfont icon-zhinengxiaofangshuan',
-      'iconfont icon-ranqibiao_shiti',
-      'iconfont icon-shexiangtou_shiti',
-      'iconfont icon-shexiangtou_guanbi',
-      'iconfont icon-shexiangtou',
-      'iconfont icon-shengyin_shiti',
-      'iconfont icon-shengyinkai',
-      'iconfont icon-shoucang_shixin',
-      'iconfont icon-shoucang',
-      'iconfont icon-shengyinwu',
-      'iconfont icon-shengyinjingyin',
-      'iconfont icon-zhunbeiliangchan',
-      'iconfont icon-shebeikaifa1',
-      'iconfont icon-kongxinwenhao',
-      'iconfont icon-cuowukongxin',
-      'iconfont icon-fangkuai1',
-      'iconfont icon-fangkuai2',
-      'iconfont icon-kongjianxuanzhong1',
-      'iconfont icon-kongxinduigou1',
-      'iconfont icon-xinxikongxin',
-      'iconfont icon-kongjian',
-      'iconfont icon-gaojingkongxin',
-      'iconfont icon-duigou_kuai',
-      'iconfont icon-cuocha_kuai',
-      'iconfont icon-jia_sekuai',
-      'iconfont icon-jian_sekuai',
-      'iconfont icon-tiaoshi',
-      'iconfont icon-fenxiangfangshi',
-      'iconfont icon-changjingguanli',
-      'iconfont icon-bianji',
-      'iconfont icon-guanlianshebei',
-      'iconfont icon-guanfangbanben',
-      'iconfont icon-gongnengdingyi',
-      'iconfont icon-jichuguanli',
-      'iconfont icon-jishufuwu',
-      'iconfont icon-hezuohuobanmiyueguanli',
-      'iconfont icon-ceshishenqing',
-      'iconfont icon-jiedianguanli',
-      'iconfont icon-jinggao',
-      'iconfont icon-peiwangyindao',
-      'iconfont icon-renjijiaohu',
-      'iconfont icon-shiyongwendang',
-      'iconfont icon-quanxianshenpi',
-      'iconfont icon-yishouquan',
-      'iconfont icon-tianshenpi',
-      'iconfont icon-shujukanban',
-      'iconfont icon-yingyongguanli',
-      'iconfont icon-yibiaopan',
-      'iconfont icon-zhanghaoquanxianguanli',
-      'iconfont icon-yuanquyunwei',
-      'iconfont icon-jizhanguanli',
-      'iconfont icon-guanbi',
-    ],
-  },
-];
+	{
+		label: '通用图标',
+		list: [
+			'iconfont iconicon_roundadd',
+			'iconfont iconicon_compile',
+			'iconfont iconicon_glass',
+			'iconfont iconicon_roundclose',
+			'iconfont iconicon_roundreduce',
+			'iconfont iconicon_delete',
+			'iconfont iconicon_shakehands',
+			'iconfont iconicon_task_done',
+			'iconfont iconicon_voipphone',
+			'iconfont iconicon_safety',
+			'iconfont iconicon_work',
+			'iconfont iconicon_study',
+			'iconfont iconicon_task',
+			'iconfont iconicon_subordinate',
+			'iconfont iconicon_star',
+			'iconfont iconicon_setting',
+			'iconfont iconicon_sms',
+			'iconfont iconicon_share',
+			'iconfont iconicon_secret',
+			'iconfont iconicon_scan_namecard',
+			'iconfont iconicon_principal',
+			'iconfont iconicon_group',
+			'iconfont iconicon_send',
+			'iconfont iconicon_scan',
+			'iconfont iconicon_search',
+			'iconfont iconicon_refresh',
+			'iconfont iconicon_savememo',
+			'iconfont iconicon_QRcode',
+			'iconfont iconicon_im_keyboard',
+			'iconfont iconicon_redpacket',
+			'iconfont iconicon_photo',
+			'iconfont iconicon_qq',
+			'iconfont iconicon_wechat',
+			'iconfont iconicon_phone',
+			'iconfont iconicon_namecard',
+			'iconfont iconicon_notice',
+			'iconfont iconicon_next_arrow',
+			'iconfont iconicon_left',
+			'iconfont iconicon_more',
+			'iconfont iconicon_details',
+			'iconfont iconicon_message',
+			'iconfont iconicon_mobilephone',
+			'iconfont iconicon_im_voice',
+			'iconfont iconicon_GPS',
+			'iconfont iconicon_ding',
+			'iconfont iconicon_exchange',
+			'iconfont iconicon_cspace',
+			'iconfont iconicon_doc',
+			'iconfont iconicon_dispose',
+			'iconfont iconicon_discovery',
+			'iconfont iconicon_community_line',
+			'iconfont iconicon_cloud_history',
+			'iconfont iconicon_coinpurse_line',
+			'iconfont iconicon_airplay',
+			'iconfont iconicon_at',
+			'iconfont iconicon_addressbook',
+			'iconfont iconicon_boss',
+			'iconfont iconicon_addperson',
+			'iconfont iconicon_affiliations_li',
+			'iconfont iconicon_addmessage',
+			'iconfont iconicon_addresslist',
+			'iconfont iconicon_add',
+			'iconfont icongithub',
+			'iconfont icongitee2',
+		],
+	},
+	{
+		label: '系统图标',
+		list: [
+			'iconfont icon-zhongyingwen',
+			'iconfont icon-caidan',
+			'iconfont icon-rizhi1',
+			'iconfont icon-zhuti',
+			'iconfont icon-suoping',
+			'iconfont icon-bug',
+			'iconfont icon-qq1',
+			'iconfont icon-weixin1',
+			'iconfont icon-shouji',
+			'iconfont icon-mima',
+			'iconfont icon-yonghu',
+			'iconfont icon-yanzhengma',
+			'iconfont icon-canshu',
+			'iconfont icon-dongtai',
+			'iconfont icon-iconset0265',
+			'iconfont icon-shujuzhanshi2',
+			'iconfont icon-tuichuquanping',
+			'iconfont icon-rizhi',
+			'iconfont icon-cuowutishitubiao',
+			'iconfont icon-debug',
+			'iconfont icon-iconset0216',
+			'iconfont icon-quanxian',
+			'iconfont icon-quanxian',
+			'iconfont icon-shuaxin',
+			'iconfont icon-bofangqi-suoping',
+			'iconfont icon-quanping',
+			'iconfont icon-navicon',
+			'iconfont icon-biaodan',
+			'iconfont icon-liuliangyunpingtaitubiao08',
+			'iconfont icon-caidanguanli',
+			'iconfont icon-cuowu',
+			'iconfont icon-wxbgongju',
+			'iconfont icon-tuichu',
+			'iconfont icon-daohanglanmoshi02',
+			'iconfont icon-changyonglogo27',
+			'iconfont icon-biaoge',
+			'iconfont icon-baidu1',
+			'iconfont icon-tubiao',
+			'iconfont icon-souhu',
+			'iconfont icon-msnui-360',
+			'iconfont icon-iframe',
+			'iconfont icon-huanyingye',
+		],
+	},
+	{
+		label: '业务图标',
+		list: [
+			'iconfont icon-zidingyi',
+			'iconfont icon-xiajiantou',
+			'iconfont icon-shangjiantou',
+			'iconfont icon-icon_loading',
+			'iconfont icon-biaodanzujian-shurukuang',
+			'iconfont icon-biaodanzujian-biaoge',
+			'iconfont icon-biaodanzujian-xialakuang',
+			'iconfont icon-tubiao-bingtu',
+			'iconfont icon-biaodanzujian-anniu',
+			'iconfont icon-gongyezujian-yibiaopan',
+			'iconfont icon-tubiao-qiapian',
+			'iconfont icon-gongyezujian-zhishideng',
+			'iconfont icon-tubiao-zhexiantu',
+			'iconfont icon-xingzhuang-juxing',
+			'iconfont icon-xingzhuang-jianxing',
+			'iconfont icon-gongyezujian-kaiguan',
+			'iconfont icon-tubiao-zhuzhuangtu',
+			'iconfont icon-xingzhuang-tupian',
+			'iconfont icon-xingzhuang-wenzi',
+			'iconfont icon-xingzhuang-tuoyuanxing',
+			'iconfont icon-xingzhuang-sanjiaoxing',
+			'iconfont icon-xingzhuang-xingxing',
+			'iconfont icon-guize',
+			'iconfont icon-shebeiguanli',
+			'iconfont icon-gongnengdingyi1',
+			'iconfont icon-jishufuwu1',
+			'iconfont icon-yunyingzhongxin',
+			'iconfont icon-yunyingguanli',
+			'iconfont icon-zuzhixiaxia',
+			'iconfont icon-zuzhizhankai',
+			'iconfont icon-zuzhiqunzu',
+			'iconfont icon-dakai',
+			'iconfont icon-yingwen',
+			'iconfont icon-zhongwen',
+			'iconfont icon-miwen',
+			'iconfont icon-xianhao',
+			'iconfont icon-kongxinduigou',
+			'iconfont icon-huixingzhen',
+			'iconfont icon-duigou',
+			'iconfont icon-xiayibu',
+			'iconfont icon-shangyibu',
+			'iconfont icon-kongjianxuanzhong',
+			'iconfont icon-kongjianweixuan',
+			'iconfont icon-kongjianyixuan',
+			'iconfont icon--diangan',
+			'iconfont icon-rongxuejirongjiechi',
+			'iconfont icon-lubiantingchechang',
+			'iconfont icon--lumingpai',
+			'iconfont icon-jietouzuoyi',
+			'iconfont icon--zhongdaweixian',
+			'iconfont icon--jiaotongbiaozhipai',
+			'iconfont icon-gongcezhishipai',
+			'iconfont icon-fangkuai',
+			'iconfont icon-fangkuai-',
+			'iconfont icon-shuaxin',
+			'iconfont icon-baocun',
+			'iconfont icon-fabu',
+			'iconfont icon-xiayibu1',
+			'iconfont icon-shangyibu1',
+			'iconfont icon-xiangxiazhanhang',
+			'iconfont icon-xiangshangzhanhang',
+			'iconfont icon-tupianjiazaishibai',
+			'iconfont icon-fuwudiqiu',
+			'iconfont icon-suoxiao',
+			'iconfont icon-fangda',
+			'iconfont icon-huanyuanhuabu',
+			'iconfont icon-quanping',
+			'iconfont icon-biaodanzujian-biaoge1',
+			'iconfont icon-APIshuchu',
+			'iconfont icon-APIjieru',
+			'iconfont icon-wenjianjia',
+			'iconfont icon-DOC',
+			'iconfont icon-BMP',
+			'iconfont icon-GIF',
+			'iconfont icon-JPG',
+			'iconfont icon-PNG',
+			'iconfont icon-weizhigeshi',
+			'iconfont icon-gengduo',
+			'iconfont icon-yunduanxiazai',
+			'iconfont icon-yunduanshangchuan',
+			'iconfont icon-dian',
+			'iconfont icon-mian',
+			'iconfont icon-xian',
+			'iconfont icon-shebeizhuangtai',
+			'iconfont icon-fenzuguanli',
+			'iconfont icon-kuaisubianpai',
+			'iconfont icon-APPkaifa',
+			'iconfont icon-wentijieda',
+			'iconfont icon-kefu',
+			'iconfont icon-ruanjiankaifabao',
+			'iconfont icon-sousuobianxiao',
+			'iconfont icon-sousuofangda',
+			'iconfont icon-dingwei',
+			'iconfont icon-wumoxing',
+			'iconfont icon-gaojing',
+			'iconfont icon-renwujincheng',
+			'iconfont icon-xiaoxitongzhi',
+			'iconfont icon-youhui',
+			'iconfont icon-gaojing1',
+			'iconfont icon-zhihangfankui',
+			'iconfont icon-gongdanqueren',
+			'iconfont icon-guangbo',
+			'iconfont icon-gongdan',
+			'iconfont icon-xiaoxi',
+			'iconfont icon-xinhao',
+			'iconfont icon-lanya',
+			'iconfont icon-Wi-Fi',
+			'iconfont icon-chaxun',
+			'iconfont icon-dianbiao',
+			'iconfont icon-anquan',
+			'iconfont icon-daibanshixiang',
+			'iconfont icon-bingxiang',
+			'iconfont icon-fanshe',
+			'iconfont icon-fengche',
+			'iconfont icon-guandao',
+			'iconfont icon-guize1',
+			'iconfont icon-guizeyinqing',
+			'iconfont icon-huowudui',
+			'iconfont icon-jianceqi',
+			'iconfont icon-jinggai',
+			'iconfont icon-liujisuan',
+			'iconfont icon-hanshu',
+			'iconfont icon-lianjieliu',
+			'iconfont icon-ludeng',
+			'iconfont icon-shexiangji',
+			'iconfont icon-rentijiance',
+			'iconfont icon-moshubang',
+			'iconfont icon-shujuwajue',
+			'iconfont icon-wangguan',
+			'iconfont icon-shenjing',
+			'iconfont icon-chucun',
+			'iconfont icon-wuguan',
+			'iconfont icon-yunduanshuaxin',
+			'iconfont icon-yunhang',
+			'iconfont icon-luyouqi',
+			'iconfont icon-bug',
+			'iconfont icon-get',
+			'iconfont icon-PIR',
+			'iconfont icon-zhexiantu',
+			'iconfont icon-shuibiao',
+			'iconfont icon-js',
+			'iconfont icon-zihangche',
+			'iconfont icon-liebiao',
+			'iconfont icon-qichedingwei',
+			'iconfont icon-dici',
+			'iconfont icon-mysql',
+			'iconfont icon-qiche',
+			'iconfont icon-shenjing1',
+			'iconfont icon-chengshi',
+			'iconfont icon-tixingshixin',
+			'iconfont icon-menci',
+			'iconfont icon-chazuo',
+			'iconfont icon-ranqijianceqi',
+			'iconfont icon-kaiguan',
+			'iconfont icon-chatou',
+			'iconfont icon-xiyiji',
+			'iconfont icon-yijiankaiguan',
+			'iconfont icon-yanwubaojingqi',
+			'iconfont icon-wuxiandianbo',
+			'iconfont icon-fuzhi',
+			'iconfont icon-shanchu',
+			'iconfont icon-bianjisekuai',
+			'iconfont icon-ishipinshixiao',
+			'iconfont icon-iframetianjia',
+			'iconfont icon-tupiantianjia',
+			'iconfont icon-liebiaomoshi_kuai',
+			'iconfont icon-qiapianmoshi_kuai',
+			'iconfont icon-fenlan',
+			'iconfont icon-fengexian',
+			'iconfont icon-dianzan',
+			'iconfont icon-charulianjie',
+			'iconfont icon-charutupian',
+			'iconfont icon-quxiaolianjie',
+			'iconfont icon-wuxupailie',
+			'iconfont icon-juzhongduiqi',
+			'iconfont icon-yinyong',
+			'iconfont icon-youxupailie',
+			'iconfont icon-youduiqi',
+			'iconfont icon-zitidaima',
+			'iconfont icon-xiaolian',
+			'iconfont icon-zitijiacu',
+			'iconfont icon-zitishanchuxian',
+			'iconfont icon-zitishangbiao',
+			'iconfont icon-zitibiaoti',
+			'iconfont icon-zitixiahuaxian',
+			'iconfont icon-zitixieti',
+			'iconfont icon-zitiyanse',
+			'iconfont icon-zuoduiqi',
+			'iconfont icon-zitiyulan',
+			'iconfont icon-zitixiabiao',
+			'iconfont icon-zuoyouduiqi',
+			'iconfont icon-tianxie',
+			'iconfont icon-huowudui1',
+			'iconfont icon-yingjian',
+			'iconfont icon-shebeikaifa',
+			'iconfont icon-dianzan_kuai',
+			'iconfont icon-zhihuan',
+			'iconfont icon-tuoguan',
+			'iconfont icon-duigoux',
+			'iconfont icon-guanbi1',
+			'iconfont icon-aixin_shixin',
+			'iconfont icon-ranqixieloubaojingqi',
+			'iconfont icon-dianbiao_shiti',
+			'iconfont icon-aixin',
+			'iconfont icon-shuibiao_shiti',
+			'iconfont icon-zhinengxiaofangshuan',
+			'iconfont icon-ranqibiao_shiti',
+			'iconfont icon-shexiangtou_shiti',
+			'iconfont icon-shexiangtou_guanbi',
+			'iconfont icon-shexiangtou',
+			'iconfont icon-shengyin_shiti',
+			'iconfont icon-shengyinkai',
+			'iconfont icon-shoucang_shixin',
+			'iconfont icon-shoucang',
+			'iconfont icon-shengyinwu',
+			'iconfont icon-shengyinjingyin',
+			'iconfont icon-zhunbeiliangchan',
+			'iconfont icon-shebeikaifa1',
+			'iconfont icon-kongxinwenhao',
+			'iconfont icon-cuowukongxin',
+			'iconfont icon-fangkuai1',
+			'iconfont icon-fangkuai2',
+			'iconfont icon-kongjianxuanzhong1',
+			'iconfont icon-kongxinduigou1',
+			'iconfont icon-xinxikongxin',
+			'iconfont icon-kongjian',
+			'iconfont icon-gaojingkongxin',
+			'iconfont icon-duigou_kuai',
+			'iconfont icon-cuocha_kuai',
+			'iconfont icon-jia_sekuai',
+			'iconfont icon-jian_sekuai',
+			'iconfont icon-tiaoshi',
+			'iconfont icon-fenxiangfangshi',
+			'iconfont icon-changjingguanli',
+			'iconfont icon-bianji',
+			'iconfont icon-guanlianshebei',
+			'iconfont icon-guanfangbanben',
+			'iconfont icon-gongnengdingyi',
+			'iconfont icon-jichuguanli',
+			'iconfont icon-jishufuwu',
+			'iconfont icon-hezuohuobanmiyueguanli',
+			'iconfont icon-ceshishenqing',
+			'iconfont icon-jiedianguanli',
+			'iconfont icon-jinggao',
+			'iconfont icon-peiwangyindao',
+			'iconfont icon-renjijiaohu',
+			'iconfont icon-shiyongwendang',
+			'iconfont icon-quanxianshenpi',
+			'iconfont icon-yishouquan',
+			'iconfont icon-tianshenpi',
+			'iconfont icon-shujukanban',
+			'iconfont icon-yingyongguanli',
+			'iconfont icon-yibiaopan',
+			'iconfont icon-zhanghaoquanxianguanli',
+			'iconfont icon-yuanquyunwei',
+			'iconfont icon-jizhanguanli',
+			'iconfont icon-guanbi',
+		],
+	},
+]
diff --git a/src/config/website.js b/src/config/website.js
index 824cc6e..1a6500a 100644
--- a/src/config/website.js
+++ b/src/config/website.js
@@ -2,80 +2,80 @@
  * 全局配置文件
  */
 export default {
-  title: '',
-  logo: 'S',
-  key: 'saber', //配置主键,目前用于存储
-  indexTitle: 'BladeX 微服务平台',
-  clientId: 'drone', // 客户端id
-  clientSecret: 'drone_secret', // 客户端密钥
-  tenantMode: false, // 是否开启租户模式
-  tenantId: '000000', // 管理组租户编号
-  captchaMode: false, // 是否开启验证码模式
-  switchMode: false, // 是否开启登录切换角色部门
-  lockPage: '/lock',
-  tokenTime: 3000,
-  tokenHeader: 'Blade-Auth',
-  //HTTP状态码白名单
-  statusWhiteList: [],
-  //配置首页不可关闭
-  setting: {
-    sidebar: 'vertical',
-    tag: true,
-    debug: true,
-    collapse: true,
-    search: true,
-    color: true,
-    lock: true,
-    screenshot: true,
-    fullscreen: true,
-    theme: true,
-    menu: true,
-  },
-  //首页配置
-  fistPage: {
-    name: '首页',
-    path: '/wel/index',
-  },
-  //配置菜单的属性
-  menu: {
-    iconDefault: 'icon-caidan',
-    label: 'name',
-    path: 'path',
-    icon: 'source',
-    children: 'children',
-    query: 'query',
-    href: 'path',
-    meta: 'meta',
-  },
-  //水印配置
-  watermark: {
-    mode: false,
-    text: 'BladeX',
-  },
-  //oauth2配置
-  oauth2: {
-    // 是否开启注册功能
-    registerMode: true,
-    // 使用后端工程 @org.springblade.test.Sm2KeyGenerator 获取
-    publicKey: '请配置国密sm2公钥',
-    // 第三方系统授权地址
-    authUrl: 'http://localhost/blade-auth/oauth/render',
-    // 单点登录系统认证
-    ssoMode: false, // 是否开启单点登录功能
-    ssoBaseUrl: 'http://localhost:8100', // 单点登录系统地址(cloud端口为8100,boot端口为80)
-    ssoAuthUrl: '/oauth/authorize?client_id=saber3&response_type=code&redirect_uri=', // 单点登录授权地址
-    ssoLogoutUrl: '/oauth/authorize/logout?redirect_uri=', // 单点登录退出地址
-    redirectUri: 'http://localhost:2888/login', // 单点登录回调地址(Saber服务的登录界面地址)
-  },
-  //设计器配置
-  design: {
-    // 流程设计器类型(true->nutflow,false->flowable)
-    designMode: true,
-    // 流程设计器地址(flowable模式)
-    designUrl: 'http://localhost:9999',
-    // 报表设计器地址(cloud端口为8108,boot端口为80)
-    reportUrl: 'http://localhost:8108/ureport',
-    // 规则设计引擎地址
-    edgeUrl: 'http://localhost:1880',
-  },
-};
+	title: '',
+	logo: 'S',
+	key: 'saber', //配置主键,目前用于存储
+	indexTitle: 'BladeX 微服务平台',
+	clientId: 'drone', // 客户端id
+	clientSecret: 'drone_secret', // 客户端密钥
+	tenantMode: false, // 是否开启租户模式
+	tenantId: '000000', // 管理组租户编号
+	captchaMode: false, // 是否开启验证码模式
+	switchMode: false, // 是否开启登录切换角色部门
+	lockPage: '/lock',
+	tokenTime: 3000,
+	tokenHeader: 'Blade-Auth',
+	//HTTP状态码白名单
+	statusWhiteList: [],
+	//配置首页不可关闭
+	setting: {
+		sidebar: 'vertical',
+		tag: true,
+		debug: true,
+		collapse: true,
+		search: true,
+		color: true,
+		lock: true,
+		screenshot: true,
+		fullscreen: true,
+		theme: true,
+		menu: true,
+	},
+	//首页配置
+	fistPage: {
+		name: '首页',
+		path: '/wel/index',
+	},
+	//配置菜单的属性
+	menu: {
+		iconDefault: 'icon-caidan',
+		label: 'name',
+		path: 'path',
+		icon: 'source',
+		children: 'children',
+		query: 'query',
+		href: 'path',
+		meta: 'meta',
+	},
+	//水印配置
+	watermark: {
+		mode: false,
+		text: 'BladeX',
+	},
+	//oauth2配置
+	oauth2: {
+		// 是否开启注册功能
+		registerMode: true,
+		// 使用后端工程 @org.springblade.test.Sm2KeyGenerator 获取
+		publicKey: '请配置国密sm2公钥',
+		// 第三方系统授权地址
+		authUrl: 'http://localhost/blade-auth/oauth/render',
+		// 单点登录系统认证
+		ssoMode: false, // 是否开启单点登录功能
+		ssoBaseUrl: 'http://localhost:8100', // 单点登录系统地址(cloud端口为8100,boot端口为80)
+		ssoAuthUrl: '/oauth/authorize?client_id=saber3&response_type=code&redirect_uri=', // 单点登录授权地址
+		ssoLogoutUrl: '/oauth/authorize/logout?redirect_uri=', // 单点登录退出地址
+		redirectUri: 'http://localhost:2888/login', // 单点登录回调地址(Saber服务的登录界面地址)
+	},
+	//设计器配置
+	design: {
+		// 流程设计器类型(true->nutflow,false->flowable)
+		designMode: true,
+		// 流程设计器地址(flowable模式)
+		designUrl: 'http://localhost:9999',
+		// 报表设计器地址(cloud端口为8108,boot端口为80)
+		reportUrl: 'http://localhost:8108/ureport',
+		// 规则设计引擎地址
+		edgeUrl: 'http://localhost:1880',
+	},
+}
diff --git a/src/const/tool/model.js b/src/const/tool/model.js
index 5bc4daa..89fde65 100644
--- a/src/const/tool/model.js
+++ b/src/const/tool/model.js
@@ -1,344 +1,344 @@
 export const switchDic = [
-  {
-    label: '',
-    value: 0,
-  },
-  {
-    label: '',
-    value: 1,
-  },
-];
+	{
+		label: '',
+		value: 0,
+	},
+	{
+		label: '',
+		value: 1,
+	},
+]
 
 export const entityDic = [
-  {
-    label: 'String',
-    value: 'java.lang.String',
-  },
-  {
-    label: 'Integer',
-    value: 'java.lang.Integer',
-  },
-  {
-    label: 'Long',
-    value: 'java.lang.Long',
-  },
-  {
-    label: 'Double',
-    value: 'java.lang.Double',
-  },
-  {
-    label: 'BigDecimal',
-    value: 'java.math.BigDecimal',
-  },
-  {
-    label: 'Boolean',
-    value: 'java.lang.Boolean',
-  },
-  {
-    label: 'Date',
-    value: 'java.util.Date',
-  },
-];
+	{
+		label: 'String',
+		value: 'java.lang.String',
+	},
+	{
+		label: 'Integer',
+		value: 'java.lang.Integer',
+	},
+	{
+		label: 'Long',
+		value: 'java.lang.Long',
+	},
+	{
+		label: 'Double',
+		value: 'java.lang.Double',
+	},
+	{
+		label: 'BigDecimal',
+		value: 'java.math.BigDecimal',
+	},
+	{
+		label: 'Boolean',
+		value: 'java.lang.Boolean',
+	},
+	{
+		label: 'Date',
+		value: 'java.util.Date',
+	},
+]
 
 export const componentDic = [
-  {
-    label: '单行文本',
-    value: 'input',
-  },
-  {
-    label: '多行文本',
-    value: 'textarea',
-  },
-  {
-    label: '富文本',
-    value: 'editor',
-  },
-  {
-    label: '下拉选项',
-    value: 'select',
-  },
-  {
-    label: '树形下拉选项',
-    value: 'tree',
-  },
-  {
-    label: '单选框',
-    value: 'radio',
-  },
-  {
-    label: '多选框',
-    value: 'checkbox',
-  },
-  {
-    label: '开关框',
-    value: 'switch',
-  },
-  {
-    label: '日期框',
-    value: 'date',
-  },
-];
+	{
+		label: '单行文本',
+		value: 'input',
+	},
+	{
+		label: '多行文本',
+		value: 'textarea',
+	},
+	{
+		label: '富文本',
+		value: 'editor',
+	},
+	{
+		label: '下拉选项',
+		value: 'select',
+	},
+	{
+		label: '树形下拉选项',
+		value: 'tree',
+	},
+	{
+		label: '单选框',
+		value: 'radio',
+	},
+	{
+		label: '多选框',
+		value: 'checkbox',
+	},
+	{
+		label: '开关框',
+		value: 'switch',
+	},
+	{
+		label: '日期框',
+		value: 'date',
+	},
+]
 
 export const queryDic = [
-  {
-    label: '等于',
-    value: 'equal',
-  },
-  {
-    label: '不等于',
-    value: 'notequal',
-  },
-  {
-    label: '大于',
-    value: 'gt',
-  },
-  {
-    label: '大于等于',
-    value: 'ge',
-  },
-  {
-    label: '小于',
-    value: 'lt',
-  },
-  {
-    label: '小于等于',
-    value: 'le',
-  },
-  {
-    label: '区间',
-    value: 'between',
-  },
-  {
-    label: '模糊',
-    value: 'like',
-  },
-  {
-    label: '左模糊',
-    value: 'likeleft',
-  },
-  {
-    label: '右模糊',
-    value: 'likeright',
-  },
-];
+	{
+		label: '等于',
+		value: 'equal',
+	},
+	{
+		label: '不等于',
+		value: 'notequal',
+	},
+	{
+		label: '大于',
+		value: 'gt',
+	},
+	{
+		label: '大于等于',
+		value: 'ge',
+	},
+	{
+		label: '小于',
+		value: 'lt',
+	},
+	{
+		label: '小于等于',
+		value: 'le',
+	},
+	{
+		label: '区间',
+		value: 'between',
+	},
+	{
+		label: '模糊',
+		value: 'like',
+	},
+	{
+		label: '左模糊',
+		value: 'likeleft',
+	},
+	{
+		label: '右模糊',
+		value: 'likeright',
+	},
+]
 
 export const templateDic = [
-  {
-    label: '单表',
-    value: 'crud',
-  },
-  {
-    label: '主子表',
-    value: 'sub',
-  },
-  {
-    label: '树表',
-    value: 'tree',
-  },
-];
+	{
+		label: '单表',
+		value: 'crud',
+	},
+	{
+		label: '主子表',
+		value: 'sub',
+	},
+	{
+		label: '树表',
+		value: 'tree',
+	},
+]
 
 export const option = {
-  height: 'auto',
-  searchShow: true,
-  searchMenuSpan: 6,
-  tip: false,
-  border: true,
-  index: true,
-  viewBtn: true,
-  grid: true,
-  selection: true,
-  menuWidth: 250,
-  column: [
-    {
-      label: '数据源',
-      prop: 'datasourceId',
-      search: true,
-      span: 24,
-      type: 'select',
-      dicUrl: '/blade-develop/datasource/select',
-      props: {
-        label: 'name',
-        value: 'id',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请选择数据源',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '物理表名',
-      prop: 'modelTable',
-      type: 'tree',
-      slot: true,
-      filterable: true,
-      dicData: [],
-      props: {
-        label: 'comment',
-        value: 'name',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请输入数据库表名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模型类名',
-      prop: 'modelClass',
-      addDisabled: true,
-      editDisabled: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入模型类名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模型名称',
-      prop: 'modelName',
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入模型名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模型编号',
-      prop: 'modelCode',
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入模型编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模型备注',
-      prop: 'modelRemark',
-      hide: true,
-      span: 24,
-    },
-  ],
-};
+	height: 'auto',
+	searchShow: true,
+	searchMenuSpan: 6,
+	tip: false,
+	border: true,
+	index: true,
+	viewBtn: true,
+	grid: true,
+	selection: true,
+	menuWidth: 250,
+	column: [
+		{
+			label: '数据源',
+			prop: 'datasourceId',
+			search: true,
+			span: 24,
+			type: 'select',
+			dicUrl: '/blade-develop/datasource/select',
+			props: {
+				label: 'name',
+				value: 'id',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请选择数据源',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '物理表名',
+			prop: 'modelTable',
+			type: 'tree',
+			slot: true,
+			filterable: true,
+			dicData: [],
+			props: {
+				label: 'comment',
+				value: 'name',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请输入数据库表名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模型类名',
+			prop: 'modelClass',
+			addDisabled: true,
+			editDisabled: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入模型类名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模型名称',
+			prop: 'modelName',
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入模型名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模型编号',
+			prop: 'modelCode',
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入模型编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模型备注',
+			prop: 'modelRemark',
+			hide: true,
+			span: 24,
+		},
+	],
+}
 
 export const optionModel = {
-  border: true,
-  index: true,
-  addBtn: false,
-  editBtn: false,
-  addRowBtn: false,
-  cellBtn: false,
-  cancelBtn: false,
-  tip: false,
-  menu: false,
-  selection: true,
-  column: [
-    {
-      label: '物理列名',
-      prop: 'jdbcName',
-    },
-    {
-      label: '物理类型',
-      prop: 'jdbcType',
-    },
-    {
-      label: '实体列名',
-      prop: 'propertyName',
-      cell: true,
-    },
-    {
-      label: '实体类型',
-      prop: 'propertyEntity',
-      type: 'select',
-      dicData: entityDic,
-      cell: true,
-    },
-    {
-      label: '字段说明',
-      prop: 'jdbcComment',
-      cell: true,
-    },
-    {
-      label: '列表显示',
-      prop: 'isList',
-      type: 'switch',
-      dicData: switchDic,
-      align: 'center',
-      width: 60,
-      cell: true,
-    },
-    {
-      label: '表单显示',
-      prop: 'isForm',
-      type: 'switch',
-      dicData: switchDic,
-      align: 'center',
-      width: 60,
-      cell: true,
-    },
-    {
-      label: '独占一行',
-      prop: 'isRow',
-      type: 'switch',
-      dicData: switchDic,
-      align: 'center',
-      width: 60,
-      cell: true,
-    },
-    {
-      label: '必填',
-      prop: 'isRequired',
-      type: 'switch',
-      dicData: switchDic,
-      align: 'center',
-      width: 60,
-      cell: true,
-    },
-    {
-      label: '组件类型',
-      prop: 'componentType',
-      type: 'select',
-      dicData: componentDic,
-      cell: true,
-    },
-    {
-      label: '字典编码',
-      prop: 'dictCode',
-      type: 'select',
-      dicUrl: '/blade-system/dict/select',
-      props: {
-        label: 'dictValue',
-        value: 'code',
-      },
-      cell: true,
-    },
-    {
-      label: '查询配置',
-      prop: 'isQuery',
-      type: 'switch',
-      dicData: switchDic,
-      align: 'center',
-      width: 60,
-      cell: true,
-    },
-    {
-      label: '查询类型',
-      prop: 'queryType',
-      type: 'select',
-      dicData: queryDic,
-      cell: true,
-    },
-  ],
-};
+	border: true,
+	index: true,
+	addBtn: false,
+	editBtn: false,
+	addRowBtn: false,
+	cellBtn: false,
+	cancelBtn: false,
+	tip: false,
+	menu: false,
+	selection: true,
+	column: [
+		{
+			label: '物理列名',
+			prop: 'jdbcName',
+		},
+		{
+			label: '物理类型',
+			prop: 'jdbcType',
+		},
+		{
+			label: '实体列名',
+			prop: 'propertyName',
+			cell: true,
+		},
+		{
+			label: '实体类型',
+			prop: 'propertyEntity',
+			type: 'select',
+			dicData: entityDic,
+			cell: true,
+		},
+		{
+			label: '字段说明',
+			prop: 'jdbcComment',
+			cell: true,
+		},
+		{
+			label: '列表显示',
+			prop: 'isList',
+			type: 'switch',
+			dicData: switchDic,
+			align: 'center',
+			width: 60,
+			cell: true,
+		},
+		{
+			label: '表单显示',
+			prop: 'isForm',
+			type: 'switch',
+			dicData: switchDic,
+			align: 'center',
+			width: 60,
+			cell: true,
+		},
+		{
+			label: '独占一行',
+			prop: 'isRow',
+			type: 'switch',
+			dicData: switchDic,
+			align: 'center',
+			width: 60,
+			cell: true,
+		},
+		{
+			label: '必填',
+			prop: 'isRequired',
+			type: 'switch',
+			dicData: switchDic,
+			align: 'center',
+			width: 60,
+			cell: true,
+		},
+		{
+			label: '组件类型',
+			prop: 'componentType',
+			type: 'select',
+			dicData: componentDic,
+			cell: true,
+		},
+		{
+			label: '字典编码',
+			prop: 'dictCode',
+			type: 'select',
+			dicUrl: '/blade-system/dict/select',
+			props: {
+				label: 'dictValue',
+				value: 'code',
+			},
+			cell: true,
+		},
+		{
+			label: '查询配置',
+			prop: 'isQuery',
+			type: 'switch',
+			dicData: switchDic,
+			align: 'center',
+			width: 60,
+			cell: true,
+		},
+		{
+			label: '查询类型',
+			prop: 'queryType',
+			type: 'select',
+			dicData: queryDic,
+			cell: true,
+		},
+	],
+}
diff --git a/src/debug.js b/src/debug.js
index 5ae2c82..0be8cc8 100644
--- a/src/debug.js
+++ b/src/debug.js
@@ -1,5 +1,5 @@
-import DisableDevtool from 'disable-devtool';
-import { ElMessageBox } from 'element-plus';
+import DisableDevtool from 'disable-devtool'
+import { ElMessageBox } from 'element-plus'
 
 /**
  * 安全警告的HTML模板, 使用Tailwind CSS样式
@@ -17,34 +17,34 @@
       如您频繁此类操作,系统将记录上报。
     </p>
   </div>
-</div>`;
+</div>`
 
 /**
  * Element Plus 消息框配置选项
  */
 const ALERT_OPTIONS = {
-  type: 'error',
-  showClose: false,
-  center: true,
-  closeOnClickModal: false,
-  closeOnPressEscape: false,
-  dangerouslyUseHTMLString: true,
-};
+	type: 'error',
+	showClose: false,
+	center: true,
+	closeOnClickModal: false,
+	closeOnPressEscape: false,
+	dangerouslyUseHTMLString: true,
+}
 
 export default () => {
-  if (import.meta.env.VITE_APP_DEBUG_SWITCH === 'false') return;
+	if (import.meta.env.VITE_APP_DEBUG_SWITCH === 'false') return
 
-  const debugKey = import.meta.env.VITE_APP_DEBUG_KEY;
-  let flag = false;
-  DisableDevtool({
-    md5: DisableDevtool.md5(debugKey),
-    disableMenu: false,
-    ondevtoolopen: (type, next) => {
-      if (!flag) ElMessageBox.alert(SECURITY_WARNING_TEMPLATE, '安全警告', ALERT_OPTIONS);
-      flag = true;
-      setTimeout(() => {
-        next();
-      }, 5000);
-    },
-  });
-};
+	const debugKey = import.meta.env.VITE_APP_DEBUG_KEY
+	let flag = false
+	DisableDevtool({
+		md5: DisableDevtool.md5(debugKey),
+		disableMenu: false,
+		ondevtoolopen: (type, next) => {
+			if (!flag) ElMessageBox.alert(SECURITY_WARNING_TEMPLATE, '安全警告', ALERT_OPTIONS)
+			flag = true
+			setTimeout(() => {
+				next()
+			}, 5000)
+		},
+	})
+}
diff --git a/src/directive/drag.js b/src/directive/drag.js
index f52959f..3f2b617 100644
--- a/src/directive/drag.js
+++ b/src/directive/drag.js
@@ -1,42 +1,41 @@
 const drag = {
-  mounted(el, binding) {
+	mounted(el, binding) {
+		const dragBox = document.querySelector('#' + binding.arg)
+		//鼠标点击距离box盒子left的距离
+		let spotToBoxLeft = 0
+		let spotToBoxTop = 0
 
-    const dragBox = document.querySelector('#' + binding.arg)
-    //鼠标点击距离box盒子left的距离
-    let spotToBoxLeft = 0
-    let spotToBoxTop = 0
+		const mouseupFun = e => {
+			window.removeEventListener('mousemove', mousemoveFun)
+			window.removeEventListener('mouseup', mouseupFun)
+		}
 
-    const mouseupFun = (e) => {
-      window.removeEventListener('mousemove', mousemoveFun)
-      window.removeEventListener('mouseup', mouseupFun)
-    }
+		const mousemoveFun = evt => {
+			console.log(66666)
+			//获取body宽高,获取拖动盒子的宽高
+			const { offsetWidth: bodyWidth, offsetHeight: bodyHeight } = document.body
+			const { offsetWidth: boxWidth, offsetHeight: boxHeight } = dragBox
+			//max取最大值,min取最小值
+			const left = Math.max(evt.clientX - spotToBoxLeft, 0)
+			const top = Math.max(evt.clientY - spotToBoxTop, 0)
+			dragBox.style.left = Math.min(left, bodyWidth - boxWidth) + 'px'
+			dragBox.style.top = Math.min(top, bodyHeight - boxHeight) + 'px'
+		}
 
-    const mousemoveFun = (evt) => {
-      console.log(66666);
-      //获取body宽高,获取拖动盒子的宽高
-      const {offsetWidth: bodyWidth, offsetHeight: bodyHeight} = document.body
-      const {offsetWidth: boxWidth, offsetHeight: boxHeight} = dragBox
-      //max取最大值,min取最小值
-      const left = Math.max(evt.clientX - spotToBoxLeft, 0)
-      const top = Math.max(evt.clientY - spotToBoxTop, 0)
-      dragBox.style.left = Math.min(left, bodyWidth - boxWidth) + 'px'
-      dragBox.style.top = Math.min(top, bodyHeight - boxHeight) + 'px'
-    }
+		el.__mousedownFun = evt => {
+			//鼠标坐标减去 box盒子相对于父盒子body 的距离
+			spotToBoxLeft = evt.clientX - dragBox.offsetLeft
+			spotToBoxTop = evt.clientY - dragBox.offsetTop
+			window.addEventListener('mousemove', mousemoveFun)
+			window.addEventListener('mouseup', mouseupFun)
+		}
+		el.addEventListener('mousedown', el.__mousedownFun)
+	},
 
-    el.__mousedownFun = (evt) => {
-      //鼠标坐标减去 box盒子相对于父盒子body 的距离
-      spotToBoxLeft = evt.clientX - dragBox.offsetLeft
-      spotToBoxTop = evt.clientY - dragBox.offsetTop
-      window.addEventListener('mousemove', mousemoveFun)
-      window.addEventListener('mouseup', mouseupFun)
-    }
-    el.addEventListener('mousedown', el.__mousedownFun);
-  },
-
-  // 绑定元素的父组件卸载前调用
-  beforeUnmount(el, binding,) {
-    el.removeEventListener('mousedown', el.__mousedownFun)
-  },
+	// 绑定元素的父组件卸载前调用
+	beforeUnmount(el, binding) {
+		el.removeEventListener('mousedown', el.__mousedownFun)
+	},
 }
 
 export default drag
diff --git a/src/directive/selectLoad.js b/src/directive/selectLoad.js
index f4568da..36f6c97 100644
--- a/src/directive/selectLoad.js
+++ b/src/directive/selectLoad.js
@@ -1,13 +1,13 @@
 const selectLoad = {
-  mounted(el, binding){
-    const dom = document.querySelector('.' + binding.arg)
-    const wrap = dom.querySelector('.el-scrollbar__wrap')
-    wrap.addEventListener('scroll', function () {
-      if (this.scrollHeight - this.scrollTop < this.clientHeight + 1) {
-        binding.value()
-      }
-    })
-  }
+	mounted(el, binding) {
+		const dom = document.querySelector('.' + binding.arg)
+		const wrap = dom.querySelector('.el-scrollbar__wrap')
+		wrap.addEventListener('scroll', function () {
+			if (this.scrollHeight - this.scrollTop < this.clientHeight + 1) {
+				binding.value()
+			}
+		})
+	},
 }
 
 export default selectLoad
diff --git a/src/error.js b/src/error.js
index d2b5611..9d9f268 100644
--- a/src/error.js
+++ b/src/error.js
@@ -1,25 +1,25 @@
-import store from './store';
+import store from './store'
 
 export default {
-  install: app => {
-    app.config.errorHandler = (err, vm, info) => {
-      store.commit('ADD_LOGS', {
-        type: 'error',
-        message: err.message,
-        stack: err.stack,
-        info,
-      });
-      if (process.env.NODE_ENV === 'development') {
-        console.group('>>>>>> 错误信息 >>>>>>');
-        console.log(info);
-        console.groupEnd();
-        console.group('>>>>>> Vue 实例 >>>>>>');
-        console.log(vm);
-        console.groupEnd();
-        console.group('>>>>>> Error >>>>>>');
-        console.log(err);
-        console.groupEnd();
-      }
-    };
-  },
-};
+	install: app => {
+		app.config.errorHandler = (err, vm, info) => {
+			store.commit('ADD_LOGS', {
+				type: 'error',
+				message: err.message,
+				stack: err.stack,
+				info,
+			})
+			if (process.env.NODE_ENV === 'development') {
+				console.group('>>>>>> 错误信息 >>>>>>')
+				console.log(info)
+				console.groupEnd()
+				console.group('>>>>>> Vue 实例 >>>>>>')
+				console.log(vm)
+				console.groupEnd()
+				console.group('>>>>>> Error >>>>>>')
+				console.log(err)
+				console.groupEnd()
+			}
+		}
+	},
+}
diff --git a/src/lang/en.js b/src/lang/en.js
index 815a033..ded202e 100644
--- a/src/lang/en.js
+++ b/src/lang/en.js
@@ -1,136 +1,136 @@
 export default {
-  title: 'BladeX Admin',
-  logoutTip: 'Exit the system, do you want to continue?',
-  submitText: 'submit',
-  cancelText: 'cancel',
-  search: 'Please input search content',
-  menuTip: 'none menu list',
-  common: {
-    condition: 'condition',
-    display: 'display',
-    hide: 'hide',
-  },
-  tip: {
-    select: 'Please select',
-    input: 'Please input',
-  },
-  upload: {
-    upload: 'upload',
-    tip: 'Drag files here,/',
-  },
-  date: {
-    start: 'Start date',
-    end: 'End date',
-    t: 'today',
-    y: 'yesterday',
-    n: 'nearly 7',
-    a: 'whole',
-  },
-  form: {
-    printBtn: 'print',
-    mockBtn: 'mock',
-    submitBtn: 'submit',
-    emptyBtn: 'empty',
-  },
-  crud: {
-    filter: {
-      addBtn: 'add',
-      clearBtn: 'clear',
-      resetBtn: 'reset',
-      cancelBtn: 'cancel',
-      submitBtn: 'submit',
-    },
-    column: {
-      name: 'name',
-      hide: 'hide',
-      fixed: 'fixed',
-      filters: 'filters',
-      sortable: 'sortable',
-      index: 'index',
-      width: 'width',
-    },
-    tipStartTitle: 'Currently selected',
-    tipEndTitle: 'items',
-    editTitle: 'edit',
-    copyTitle: 'copy',
-    addTitle: 'add',
-    viewTitle: 'view',
-    filterTitle: 'filter',
-    showTitle: 'showTitle',
-    menu: 'menu',
-    addBtn: 'add',
-    show: 'show',
-    hide: 'hide',
-    open: 'open',
-    shrink: 'shrink',
-    printBtn: 'print',
-    excelBtn: 'excel',
-    updateBtn: 'update',
-    cancelBtn: 'cancel',
-    searchBtn: 'search',
-    emptyBtn: 'empty',
-    menuBtn: 'menu',
-    saveBtn: 'save',
-    viewBtn: 'view',
-    editBtn: 'edit',
-    copyBtn: 'copy',
-    delBtn: 'delete',
-  },
-  login: {
-    title: 'Login ',
-    info: 'BladeX Development Platform',
-    tenantId: 'Please input tenantId',
-    name: 'Please input name',
-    username: 'Please input account',
-    email: 'Please input email',
-    password: 'Please input password',
-    password1: 'Please input confirm password',
-    wechat: 'Wechat',
-    qq: 'QQ',
-    github: 'github',
-    gitee: 'gitee',
-    phone: 'Please input a phone',
-    code: 'Please input a code',
-    submit: 'Login',
-    register: 'Register',
-    back: 'Back',
-    userLogin: 'userLogin',
-    phoneLogin: 'phoneLogin',
-    thirdLogin: 'thirdLogin',
-    ssoLogin: 'ssoLogin',
-    msgText: 'send code',
-    msgSuccess: 'reissued',
-  },
-  navbar: {
-    info: 'info',
-    logOut: 'logout',
-    userinfo: 'userinfo',
-    roleName: 'role name',
-    deptName: 'dept name',
-    currentDeptName: 'current role name',
-    currentRoleName: 'current dept name',
-    switchRoleTo: 'switch role to',
-    switchRole: 'switch role',
-    switchDeptTo: 'switch dept to',
-    switchDept: 'switch dept',
-    switchTip: 'whether to switch identities',
-    switchSuccess: 'switch success',
-    dashboard: 'dashboard',
-    lock: 'lock',
-    bug: 'none bug',
-    bugs: 'bug',
-    screenfullF: 'exit screenfull',
-    screenfull: 'screenfull',
-    language: 'language',
-    notice: 'notice',
-    theme: 'theme',
-    color: 'color',
-  },
-  tagsView: {
-    search: 'Search',
-    menu: 'menu',
-    clearCache: 'Clear Cache',
-    closeOthers: 'Close Others',
-    closeAll: 'Close All',
-  },
-};
+	title: 'BladeX Admin',
+	logoutTip: 'Exit the system, do you want to continue?',
+	submitText: 'submit',
+	cancelText: 'cancel',
+	search: 'Please input search content',
+	menuTip: 'none menu list',
+	common: {
+		condition: 'condition',
+		display: 'display',
+		hide: 'hide',
+	},
+	tip: {
+		select: 'Please select',
+		input: 'Please input',
+	},
+	upload: {
+		upload: 'upload',
+		tip: 'Drag files here,/',
+	},
+	date: {
+		start: 'Start date',
+		end: 'End date',
+		t: 'today',
+		y: 'yesterday',
+		n: 'nearly 7',
+		a: 'whole',
+	},
+	form: {
+		printBtn: 'print',
+		mockBtn: 'mock',
+		submitBtn: 'submit',
+		emptyBtn: 'empty',
+	},
+	crud: {
+		filter: {
+			addBtn: 'add',
+			clearBtn: 'clear',
+			resetBtn: 'reset',
+			cancelBtn: 'cancel',
+			submitBtn: 'submit',
+		},
+		column: {
+			name: 'name',
+			hide: 'hide',
+			fixed: 'fixed',
+			filters: 'filters',
+			sortable: 'sortable',
+			index: 'index',
+			width: 'width',
+		},
+		tipStartTitle: 'Currently selected',
+		tipEndTitle: 'items',
+		editTitle: 'edit',
+		copyTitle: 'copy',
+		addTitle: 'add',
+		viewTitle: 'view',
+		filterTitle: 'filter',
+		showTitle: 'showTitle',
+		menu: 'menu',
+		addBtn: 'add',
+		show: 'show',
+		hide: 'hide',
+		open: 'open',
+		shrink: 'shrink',
+		printBtn: 'print',
+		excelBtn: 'excel',
+		updateBtn: 'update',
+		cancelBtn: 'cancel',
+		searchBtn: 'search',
+		emptyBtn: 'empty',
+		menuBtn: 'menu',
+		saveBtn: 'save',
+		viewBtn: 'view',
+		editBtn: 'edit',
+		copyBtn: 'copy',
+		delBtn: 'delete',
+	},
+	login: {
+		title: 'Login ',
+		info: 'BladeX Development Platform',
+		tenantId: 'Please input tenantId',
+		name: 'Please input name',
+		username: 'Please input account',
+		email: 'Please input email',
+		password: 'Please input password',
+		password1: 'Please input confirm password',
+		wechat: 'Wechat',
+		qq: 'QQ',
+		github: 'github',
+		gitee: 'gitee',
+		phone: 'Please input a phone',
+		code: 'Please input a code',
+		submit: 'Login',
+		register: 'Register',
+		back: 'Back',
+		userLogin: 'userLogin',
+		phoneLogin: 'phoneLogin',
+		thirdLogin: 'thirdLogin',
+		ssoLogin: 'ssoLogin',
+		msgText: 'send code',
+		msgSuccess: 'reissued',
+	},
+	navbar: {
+		info: 'info',
+		logOut: 'logout',
+		userinfo: 'userinfo',
+		roleName: 'role name',
+		deptName: 'dept name',
+		currentDeptName: 'current role name',
+		currentRoleName: 'current dept name',
+		switchRoleTo: 'switch role to',
+		switchRole: 'switch role',
+		switchDeptTo: 'switch dept to',
+		switchDept: 'switch dept',
+		switchTip: 'whether to switch identities',
+		switchSuccess: 'switch success',
+		dashboard: 'dashboard',
+		lock: 'lock',
+		bug: 'none bug',
+		bugs: 'bug',
+		screenfullF: 'exit screenfull',
+		screenfull: 'screenfull',
+		language: 'language',
+		notice: 'notice',
+		theme: 'theme',
+		color: 'color',
+	},
+	tagsView: {
+		search: 'Search',
+		menu: 'menu',
+		clearCache: 'Clear Cache',
+		closeOthers: 'Close Others',
+		closeAll: 'Close All',
+	},
+}
diff --git a/src/lang/index.js b/src/lang/index.js
index 3d11bc5..ab0bf2a 100644
--- a/src/lang/index.js
+++ b/src/lang/index.js
@@ -1,26 +1,26 @@
-import { createI18n } from 'vue-i18n';
-import Store from '@/store';
-import elementEnLocale from 'element-plus/es/locale/lang/en';
-import elementZhLocale from 'element-plus/es/locale/lang/zh-cn';
-import enLocale from './en';
-import zhLocale from './zh';
-import AvueEnLocale from '@smallwei/avue/lib/locale/lang/en';
-import AvueZhLocale from '@smallwei/avue/lib/locale/lang/zh';
+import { createI18n } from 'vue-i18n'
+import Store from '@/store'
+import elementEnLocale from 'element-plus/es/locale/lang/en'
+import elementZhLocale from 'element-plus/es/locale/lang/zh-cn'
+import enLocale from './en'
+import zhLocale from './zh'
+import AvueEnLocale from '@smallwei/avue/lib/locale/lang/en'
+import AvueZhLocale from '@smallwei/avue/lib/locale/lang/zh'
 
 export const messages = {
-  en: {
-    ...enLocale,
-    ...AvueEnLocale,
-    ...elementEnLocale,
-  },
-  'zh-cn': {
-    ...zhLocale,
-    ...AvueZhLocale,
-    ...elementZhLocale,
-  },
-};
-export const language = Store.getters.language;
+	en: {
+		...enLocale,
+		...AvueEnLocale,
+		...elementEnLocale,
+	},
+	'zh-cn': {
+		...zhLocale,
+		...AvueZhLocale,
+		...elementZhLocale,
+	},
+}
+export const language = Store.getters.language
 export default createI18n({
-  locale: language,
-  messages,
-});
+	locale: language,
+	messages,
+})
diff --git a/src/lang/zh.js b/src/lang/zh.js
index f057c70..5adf31d 100644
--- a/src/lang/zh.js
+++ b/src/lang/zh.js
@@ -1,136 +1,136 @@
 export default {
-  title: '指挥调度平台',
-  confirmTip: '提示',
-  logoutTip: '退出系统, 是否继续?',
-  submitText: '确定',
-  cancelText: '取消',
-  search: '请输入搜索内容',
-  menuTip: '没有发现菜单',
-  common: {
-    condition: '条件',
-    display: '显示',
-    hide: '隐藏',
-  },
-  tip: {
-    select: '请选择',
-    input: '请输入',
-  },
-  upload: {
-    upload: '点击上传',
-    tip: '将文件拖到此处,或',
-  },
-  date: {
-    start: '开始日期',
-    end: '结束日期',
-    t: '今日',
-    y: '昨日',
-    n: '近7天',
-    a: '全部',
-  },
-  form: {
-    printBtn: '打 印',
-    mockBtn: '模 拟',
-    submitBtn: '提 交',
-    emptyBtn: '清 空',
-  },
-  crud: {
-    filter: {
-      addBtn: '新增条件',
-      clearBtn: '清空数据',
-      resetBtn: '清空条件',
-      cancelBtn: '取 消',
-      submitBtn: '确 定',
-    },
-    column: {
-      name: '列名',
-      hide: '隐藏',
-      fixed: '冻结',
-      filters: '过滤',
-      sortable: '排序',
-      index: '顺序',
-      width: '宽度',
-    },
-    tipStartTitle: '当前表格已选择',
-    tipEndTitle: '项',
-    editTitle: '编 辑',
-    copyTitle: '复 制',
-    addTitle: '新 增',
-    viewTitle: '查 看',
-    filterTitle: '过滤条件',
-    showTitle: '列显隐',
-    menu: '操作',
-    addBtn: '新 增',
-    show: '显 示',
-    hide: '隐 藏',
-    open: '展 开',
-    shrink: '收 缩',
-    printBtn: '打 印',
-    excelBtn: '导 出',
-    updateBtn: '修 改',
-    cancelBtn: '取 消',
-    searchBtn: '搜 索',
-    emptyBtn: '清 空',
-    menuBtn: '功 能',
-    saveBtn: '保 存',
-    viewBtn: '查 看',
-    editBtn: '编 辑',
-    copyBtn: '复 制',
-    delBtn: '删 除',
-  },
-  login: {
-    title: '登录 ',
-    info: 'BladeX 微服务平台',
-    tenantId: '请输入租户ID',
-    name: '请输入姓名',
-    username: '请输入账号',
-    email: '请输入邮箱',
-    password: '请输入密码',
-    password1: '请输入确认密码',
-    wechat: '微信',
-    qq: 'QQ',
-    github: 'github',
-    gitee: '码云',
-    phone: '请输入手机号',
-    code: '请输入验证码',
-    submit: '登录',
-    register: '注册',
-    back: '返回',
-    userLogin: '账号密码登录',
-    phoneLogin: '手机号登录',
-    thirdLogin: '第三方登录',
-    ssoLogin: '单点登录',
-    msgText: '发送验证码',
-    msgSuccess: '秒后重发',
-  },
-  navbar: {
-    logOut: '退出登录',
-    userinfo: '个人信息',
-    roleName: '所属角色',
-    deptName: '所属部门',
-    currentDeptName: '当前部门',
-    currentRoleName: '当前角色',
-    switchRoleTo: '角色切换至',
-    switchRole: '角色切换',
-    switchDeptTo: '部门切换至',
-    switchDept: '部门切换',
-    switchTip: '是否进行身份切换',
-    switchSuccess: '切换成功',
-    dashboard: '首页',
-    lock: '锁屏',
-    bug: '没有错误日志',
-    bugs: '条错误日志',
-    screenfullF: '退出全屏',
-    screenfull: '全屏',
-    language: '中英文',
-    notice: '消息通知',
-    theme: '主题',
-    color: '换色',
-  },
-  tagsView: {
-    search: '搜索',
-    menu: '更多',
-    clearCache: '清除缓存',
-    closeOthers: '关闭其它',
-    closeAll: '关闭所有',
-  },
-};
+	title: '指挥调度平台',
+	confirmTip: '提示',
+	logoutTip: '退出系统, 是否继续?',
+	submitText: '确定',
+	cancelText: '取消',
+	search: '请输入搜索内容',
+	menuTip: '没有发现菜单',
+	common: {
+		condition: '条件',
+		display: '显示',
+		hide: '隐藏',
+	},
+	tip: {
+		select: '请选择',
+		input: '请输入',
+	},
+	upload: {
+		upload: '点击上传',
+		tip: '将文件拖到此处,或',
+	},
+	date: {
+		start: '开始日期',
+		end: '结束日期',
+		t: '今日',
+		y: '昨日',
+		n: '近7天',
+		a: '全部',
+	},
+	form: {
+		printBtn: '打 印',
+		mockBtn: '模 拟',
+		submitBtn: '提 交',
+		emptyBtn: '清 空',
+	},
+	crud: {
+		filter: {
+			addBtn: '新增条件',
+			clearBtn: '清空数据',
+			resetBtn: '清空条件',
+			cancelBtn: '取 消',
+			submitBtn: '确 定',
+		},
+		column: {
+			name: '列名',
+			hide: '隐藏',
+			fixed: '冻结',
+			filters: '过滤',
+			sortable: '排序',
+			index: '顺序',
+			width: '宽度',
+		},
+		tipStartTitle: '当前表格已选择',
+		tipEndTitle: '项',
+		editTitle: '编 辑',
+		copyTitle: '复 制',
+		addTitle: '新 增',
+		viewTitle: '查 看',
+		filterTitle: '过滤条件',
+		showTitle: '列显隐',
+		menu: '操作',
+		addBtn: '新 增',
+		show: '显 示',
+		hide: '隐 藏',
+		open: '展 开',
+		shrink: '收 缩',
+		printBtn: '打 印',
+		excelBtn: '导 出',
+		updateBtn: '修 改',
+		cancelBtn: '取 消',
+		searchBtn: '搜 索',
+		emptyBtn: '清 空',
+		menuBtn: '功 能',
+		saveBtn: '保 存',
+		viewBtn: '查 看',
+		editBtn: '编 辑',
+		copyBtn: '复 制',
+		delBtn: '删 除',
+	},
+	login: {
+		title: '登录 ',
+		info: 'BladeX 微服务平台',
+		tenantId: '请输入租户ID',
+		name: '请输入姓名',
+		username: '请输入账号',
+		email: '请输入邮箱',
+		password: '请输入密码',
+		password1: '请输入确认密码',
+		wechat: '微信',
+		qq: 'QQ',
+		github: 'github',
+		gitee: '码云',
+		phone: '请输入手机号',
+		code: '请输入验证码',
+		submit: '登录',
+		register: '注册',
+		back: '返回',
+		userLogin: '账号密码登录',
+		phoneLogin: '手机号登录',
+		thirdLogin: '第三方登录',
+		ssoLogin: '单点登录',
+		msgText: '发送验证码',
+		msgSuccess: '秒后重发',
+	},
+	navbar: {
+		logOut: '退出登录',
+		userinfo: '个人信息',
+		roleName: '所属角色',
+		deptName: '所属部门',
+		currentDeptName: '当前部门',
+		currentRoleName: '当前角色',
+		switchRoleTo: '角色切换至',
+		switchRole: '角色切换',
+		switchDeptTo: '部门切换至',
+		switchDept: '部门切换',
+		switchTip: '是否进行身份切换',
+		switchSuccess: '切换成功',
+		dashboard: '首页',
+		lock: '锁屏',
+		bug: '没有错误日志',
+		bugs: '条错误日志',
+		screenfullF: '退出全屏',
+		screenfull: '全屏',
+		language: '中英文',
+		notice: '消息通知',
+		theme: '主题',
+		color: '换色',
+	},
+	tagsView: {
+		search: '搜索',
+		menu: '更多',
+		clearCache: '清除缓存',
+		closeOthers: '关闭其它',
+		closeAll: '关闭所有',
+	},
+}
diff --git a/src/main.js b/src/main.js
index e4cf81b..95595f8 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,83 +1,87 @@
-import { createApp } from 'vue';
-import website from './config/website';
-import axios from './axios';
-import router from './router/';
-import store from './store';
-import i18n from './lang/';
-import { language, messages } from './lang/';
-import * as ElementPlusIconsVue from '@element-plus/icons-vue';
-import ElementPlus from 'element-plus';
-import 'element-plus/dist/index.css';
-import Avue from '@smallwei/avue';
-import '@smallwei/avue/lib/index.css';
-import avueUeditor from 'avue-plugin-ueditor';
-import crudCommon from '@/mixins/crud.js';
-import { getScreen } from './utils/util';
-import './permission';
-import error from './error';
-import App from './App.vue';
-import 'animate.css';
-import dayjs from 'dayjs';
-import 'styles/common.scss';
+import { createApp } from 'vue'
+import website from './config/website'
+import axios from './axios'
+import router from './router/'
+import store from './store'
+import i18n from './lang/'
+import { language, messages } from './lang/'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import Avue from '@smallwei/avue'
+import '@smallwei/avue/lib/index.css'
+import avueUeditor from 'avue-plugin-ueditor'
+import crudCommon from '@/mixins/crud.js'
+import { getScreen } from './utils/util'
+import './permission'
+import error from './error'
+import App from './App.vue'
+import 'animate.css'
+import dayjs from 'dayjs'
+import 'styles/common.scss'
 // 系统组件
-import debug from './debug';
-import VueClipboard from 'vue3-clipboard';
-import highlight from './components/highlight/main.vue';
-import codeEditor from './components/code-editor/main.vue';
-import basicBlock from './components/basic-block/main.vue';
-import basicContainer from './components/basic-container/main.vue';
-import SvgIcon from './components/SvgIcon.vue';
-import thirdRegister from './components/third-register/main.vue';
-import flowDesign from './components/flow-design/main.vue';
-import flowDesignStep from './components/flow-design-step/main.vue';
+import debug from './debug'
+import VueClipboard from 'vue3-clipboard'
+import highlight from './components/highlight/main.vue'
+import codeEditor from './components/code-editor/main.vue'
+import basicBlock from './components/basic-block/main.vue'
+import basicContainer from './components/basic-container/main.vue'
+import SvgIcon from './components/SvgIcon.vue'
+import thirdRegister from './components/third-register/main.vue'
+import flowDesign from './components/flow-design/main.vue'
+import flowDesignStep from './components/flow-design-step/main.vue'
 // 业务组件
 // import codeSetting from './views/tool/codesetting.vue';
 // import formSetting from './views/tool/formsetting.vue';
 // import tenantPackage from './views/system/tenantpackage.vue';
 // import tenantDatasource from './views/system/tenantdatasource.vue';
-import { onResize, pxToRem } from '@/utils/rem';
+// 全局组件
+import globalComponents from '@/components'
+
+import { onResize, pxToRem } from '@/utils/rem'
 onResize()
 import 'virtual:svg-icons-register'
-window.$crudCommon = crudCommon;
-debug();
-window.axios = axios;
-const app = createApp(App);
+window.$crudCommon = crudCommon
+debug()
+window.axios = axios
+const app = createApp(App)
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
-  app.component(key, component);
+	app.component(key, component)
 }
-app.component('basicContainer', basicContainer);
-app.component('basicBlock', basicBlock);
-app.component('highlight', highlight);
-app.component('codeEditor', codeEditor);
-app.component('thirdRegister', thirdRegister);
-app.component('flowDesign', flowDesign);
-app.component('flowDesignStep', flowDesignStep);
-app.component('SvgIcon', SvgIcon);
+app.component('basicContainer', basicContainer)
+app.component('basicBlock', basicBlock)
+app.component('highlight', highlight)
+app.component('codeEditor', codeEditor)
+app.component('thirdRegister', thirdRegister)
+app.component('flowDesign', flowDesign)
+app.component('flowDesignStep', flowDesignStep)
+app.component('SvgIcon', SvgIcon)
 // app.component('codeSetting', codeSetting);
 // app.component('formSetting', formSetting);
 // app.component('tenantPackage', tenantPackage);
 // app.component('tenantDatasource', tenantDatasource);
-app.config.globalProperties.$app = app;
-app.config.globalProperties.$dayjs = dayjs;
-app.config.globalProperties.website = website;
-app.config.globalProperties.getScreen = getScreen;
-app.config.globalProperties.pxToRem = pxToRem;
+app.config.globalProperties.$app = app
+app.config.globalProperties.$dayjs = dayjs
+app.config.globalProperties.website = website
+app.config.globalProperties.getScreen = getScreen
+app.config.globalProperties.pxToRem = pxToRem
 
-app.use(error);
-app.use(i18n);
-app.use(store);
-app.use(router);
+app.use(error)
+app.use(i18n)
+app.use(store)
+app.use(router)
 app.use(ElementPlus, {
-  locale: messages[language],
-});
+	locale: messages[language],
+})
 app.use(Avue, {
-  axios,
-  calcHeight: 10,
-  locale: messages[language],
-});
-app.use(avueUeditor, { axios });
+	axios,
+	calcHeight: 10,
+	locale: messages[language],
+})
+app.use(avueUeditor, { axios })
 app.use(VueClipboard, {
-  autoSetContainer: true,
-  appendToBody: true, // 这可以帮助解决一些更复杂的使用场景下的问题
-});
-app.mount('#app');
+	autoSetContainer: true,
+	appendToBody: true, // 这可以帮助解决一些更复杂的使用场景下的问题
+})
+app.use(globalComponents)
+app.mount('#app')
diff --git a/src/mixins/crud.js b/src/mixins/crud.js
index f297a12..1dc7f54 100644
--- a/src/mixins/crud.js
+++ b/src/mixins/crud.js
@@ -1,217 +1,217 @@
-import { mapGetters } from 'vuex';
+import { mapGetters } from 'vuex'
 
 export default (app, option = {}) => {
-  let optionObj = import.meta.glob(`../option/**/**`)[`../option/${option.name}.js`];
-  let apiObj = import.meta.glob(`../api/**/**`)[`../api/${option.name}.js`];
-  let mixins = {
-    data() {
-      return {
-        data: [],
-        form: {},
-        params: {},
-        option: {},
-        api: {},
-        loading: false,
-        page: {},
-      };
-    },
-    created() {
-      optionObj().then(mode => (this.option = mode.default));
-      apiObj().then(mode => {
-        this.api = mode;
-        this.getList();
-      });
-    },
-    computed: {
-      ...mapGetters(['userInfo', 'permission', 'roles']),
-      ids() {
-        const ids = [];
-        this.selectionList.forEach(ele => {
-          ids.push(ele[this.rowKey]);
-        });
-        return ids.join(',');
-      },
-      bindVal() {
-        return {
-          ref: 'crud',
-          option: this.option,
-          data: this.data,
-          tableLoading: this.loading,
-        };
-      },
-      onEvent() {
-        return {
-          'size-change': this.sizeChange,
-          'current-change': this.currentChange,
-          'row-save': this.rowSave,
-          'row-update': this.rowUpdate,
-          'row-del': this.rowDel,
-          'refresh-change': this.refreshChange,
-          'search-reset': this.searchChange,
-          'search-change': this.searchChange,
-        };
-      },
-      rowKey() {
-        return option.rowKey || 'id';
-      },
-    },
-    methods: {
-      getList() {
-        const callback = () => {
-          this.loading = true;
-          this.data = [];
-          this.api[option.list || 'getList'](
-            this.page.currentPage,
-            this.page.pageSize,
-            this.params
-          ).then(res => {
-            this.loading = false;
-            let data;
-            if (option.res) {
-              data = option.res(res.data);
-            } else {
-              data = res.data.data;
-            }
-            this.page.total = data[option.total || 'total'];
-            const result = data[option.data || 'records'];
-            this.data = result;
-            if (this.listAfter) {
-              this.listAfter(data);
-            }
-          });
-        };
-        if (this.listBefore) {
-          this.listBefore();
-        }
-        callback();
-      },
-      rowSave(row, done, loading) {
-        const callback = () => {
-          delete this.form.params;
-          this.api[option.add || 'add'](this.form)
-            .then(data => {
-              this.getList();
-              if (this.addAfter) {
-                this.addAfter(data);
-              } else {
-                this.$message.success('新增成功');
-              }
-              done();
-            })
-            .catch(() => {
-              loading();
-            });
-        };
-        if (this.addBefore) {
-          this.addBefore();
-        }
-        callback();
-      },
-      rowUpdate(row, index, done, loading) {
-        const callback = () => {
-          delete this.form.params;
-          this.api[option.update || 'update'](this.form)
-            .then(data => {
-              this.getList();
-              if (this.updateAfter) {
-                this.updateAfter(data);
-              } else {
-                this.$message.success('更新成功');
-              }
-              done();
-            })
-            .catch(() => {
-              loading();
-            });
-        };
-        if (this.updateBefore) {
-          this.updateBefore();
-        }
-        callback();
-      },
-      rowDel(row, index) {
-        const callback = () => {
-          this.api[option.del || 'del'](row[this.rowKey], row).then(data => {
-            this.getList();
-            if (this.delAfter) {
-              this.delAfter(data, row, index);
-            } else {
-              this.$message.success('删除成功');
-            }
-          });
-        };
-        if (this.delBefore) {
-          this.delBefore();
-          callback();
-        } else {
-          this.$confirm('确定将选择数据删除?', '提示', {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning',
-          }).then(() => {
-            callback();
-          });
-        }
-      },
-      handleDelete() {
-        if (this.selectionList.length === 0) {
-          this.$message.warning('请选择至少一条数据');
-          return;
-        }
-        this.$confirm('确定将选择数据删除?', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        }).then(() => {
-          this.api[option.del || 'remove'](this.ids).then(data => {
-            this.getList();
-            if (this.delMultiAfter) {
-              this.delMultiAfter(data, this.ids);
-            } else {
-              this.$message.success('删除成功');
-            }
-          });
-        });
-      },
-      searchChange(params, done) {
-        if (done) done();
-        this.params = params;
-        this.page.currentPage = 1;
-        this.getList();
-      },
-      dateChange(date) {
-        if (date) {
-          this.params.createTime_dategt = date[0];
-          this.params.createTime_datelt = date[1];
-        } else {
-          delete this.params.createTime_dategt;
-          delete this.params.createTime_datelt;
-        }
-        this.page.currentPage = 1;
-        this.getList();
-      },
-      selectionChange(list) {
-        this.selectionList = list;
-      },
-      selectionClear() {
-        this.selectionList = [];
-        this.$refs.crud.toggleSelection();
-      },
-      refreshChange() {
-        this.getList();
-      },
-      sizeChange(val) {
-        this.page.currentPage = 1;
-        this.page.pageSize = val;
-        this.getList();
-      },
-      currentChange(val) {
-        this.page.currentPage = val;
-        this.getList();
-      },
-    },
-  };
-  app.mixins = app.mixins || [];
-  app.mixins.push(mixins);
-  return app;
-};
+	let optionObj = import.meta.glob(`../option/**/**`)[`../option/${option.name}.js`]
+	let apiObj = import.meta.glob(`../api/**/**`)[`../api/${option.name}.js`]
+	let mixins = {
+		data() {
+			return {
+				data: [],
+				form: {},
+				params: {},
+				option: {},
+				api: {},
+				loading: false,
+				page: {},
+			}
+		},
+		created() {
+			optionObj().then(mode => (this.option = mode.default))
+			apiObj().then(mode => {
+				this.api = mode
+				this.getList()
+			})
+		},
+		computed: {
+			...mapGetters(['userInfo', 'permission', 'roles']),
+			ids() {
+				const ids = []
+				this.selectionList.forEach(ele => {
+					ids.push(ele[this.rowKey])
+				})
+				return ids.join(',')
+			},
+			bindVal() {
+				return {
+					ref: 'crud',
+					option: this.option,
+					data: this.data,
+					tableLoading: this.loading,
+				}
+			},
+			onEvent() {
+				return {
+					'size-change': this.sizeChange,
+					'current-change': this.currentChange,
+					'row-save': this.rowSave,
+					'row-update': this.rowUpdate,
+					'row-del': this.rowDel,
+					'refresh-change': this.refreshChange,
+					'search-reset': this.searchChange,
+					'search-change': this.searchChange,
+				}
+			},
+			rowKey() {
+				return option.rowKey || 'id'
+			},
+		},
+		methods: {
+			getList() {
+				const callback = () => {
+					this.loading = true
+					this.data = []
+					this.api[option.list || 'getList'](
+						this.page.currentPage,
+						this.page.pageSize,
+						this.params
+					).then(res => {
+						this.loading = false
+						let data
+						if (option.res) {
+							data = option.res(res.data)
+						} else {
+							data = res.data.data
+						}
+						this.page.total = data[option.total || 'total']
+						const result = data[option.data || 'records']
+						this.data = result
+						if (this.listAfter) {
+							this.listAfter(data)
+						}
+					})
+				}
+				if (this.listBefore) {
+					this.listBefore()
+				}
+				callback()
+			},
+			rowSave(row, done, loading) {
+				const callback = () => {
+					delete this.form.params
+					this.api[option.add || 'add'](this.form)
+						.then(data => {
+							this.getList()
+							if (this.addAfter) {
+								this.addAfter(data)
+							} else {
+								this.$message.success('新增成功')
+							}
+							done()
+						})
+						.catch(() => {
+							loading()
+						})
+				}
+				if (this.addBefore) {
+					this.addBefore()
+				}
+				callback()
+			},
+			rowUpdate(row, index, done, loading) {
+				const callback = () => {
+					delete this.form.params
+					this.api[option.update || 'update'](this.form)
+						.then(data => {
+							this.getList()
+							if (this.updateAfter) {
+								this.updateAfter(data)
+							} else {
+								this.$message.success('更新成功')
+							}
+							done()
+						})
+						.catch(() => {
+							loading()
+						})
+				}
+				if (this.updateBefore) {
+					this.updateBefore()
+				}
+				callback()
+			},
+			rowDel(row, index) {
+				const callback = () => {
+					this.api[option.del || 'del'](row[this.rowKey], row).then(data => {
+						this.getList()
+						if (this.delAfter) {
+							this.delAfter(data, row, index)
+						} else {
+							this.$message.success('删除成功')
+						}
+					})
+				}
+				if (this.delBefore) {
+					this.delBefore()
+					callback()
+				} else {
+					this.$confirm('确定将选择数据删除?', '提示', {
+						confirmButtonText: '确定',
+						cancelButtonText: '取消',
+						type: 'warning',
+					}).then(() => {
+						callback()
+					})
+				}
+			},
+			handleDelete() {
+				if (this.selectionList.length === 0) {
+					this.$message.warning('请选择至少一条数据')
+					return
+				}
+				this.$confirm('确定将选择数据删除?', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning',
+				}).then(() => {
+					this.api[option.del || 'remove'](this.ids).then(data => {
+						this.getList()
+						if (this.delMultiAfter) {
+							this.delMultiAfter(data, this.ids)
+						} else {
+							this.$message.success('删除成功')
+						}
+					})
+				})
+			},
+			searchChange(params, done) {
+				if (done) done()
+				this.params = params
+				this.page.currentPage = 1
+				this.getList()
+			},
+			dateChange(date) {
+				if (date) {
+					this.params.createTime_dategt = date[0]
+					this.params.createTime_datelt = date[1]
+				} else {
+					delete this.params.createTime_dategt
+					delete this.params.createTime_datelt
+				}
+				this.page.currentPage = 1
+				this.getList()
+			},
+			selectionChange(list) {
+				this.selectionList = list
+			},
+			selectionClear() {
+				this.selectionList = []
+				this.$refs.crud.toggleSelection()
+			},
+			refreshChange() {
+				this.getList()
+			},
+			sizeChange(val) {
+				this.page.currentPage = 1
+				this.page.pageSize = val
+				this.getList()
+			},
+			currentChange(val) {
+				this.page.currentPage = val
+				this.getList()
+			},
+		},
+	}
+	app.mixins = app.mixins || []
+	app.mixins.push(mixins)
+	return app
+}
diff --git a/src/mixins/index.js b/src/mixins/index.js
index 5cf8ec5..34e62be 100644
--- a/src/mixins/index.js
+++ b/src/mixins/index.js
@@ -1,45 +1,45 @@
-import { validatenull } from '@/utils/validate';
-import { getStore } from '@/utils/store.js';
+import { validatenull } from '@/utils/validate'
+import { getStore } from '@/utils/store.js'
 
 export default {
-  data() {
-    return {
-      //刷新token锁
-      refreshLock: false,
-      //刷新token的时间
-      refreshTime: '',
-    };
-  },
-  created() {
-    //实时检测刷新token
-    //this.refreshToken();
-  },
-  methods: {
-    //实时检测刷新token
-    refreshToken() {
-      this.refreshTime = setInterval(() => {
-        const token =
-          getStore({
-            name: 'token',
-            debug: true,
-          }) || {};
-        let date1 = this.$dayjs(token.datetime);
-        let date2 = this.$dayjs();
-        const date = date2.diff(date1, 'seconds');
-        if (validatenull(date)) return;
-        if (date >= this.website.tokenTime && !this.refreshLock) {
-          this.refreshLock = true;
-          this.$store
-            .dispatch('RefreshToken')
-            .then(() => {
-              this.refreshLock = false;
-            })
-            .catch(err => {
-              console.log(err);
-              this.refreshLock = false;
-            });
-        }
-      }, 1000);
-    },
-  },
-};
+	data() {
+		return {
+			//刷新token锁
+			refreshLock: false,
+			//刷新token的时间
+			refreshTime: '',
+		}
+	},
+	created() {
+		//实时检测刷新token
+		//this.refreshToken();
+	},
+	methods: {
+		//实时检测刷新token
+		refreshToken() {
+			this.refreshTime = setInterval(() => {
+				const token =
+					getStore({
+						name: 'token',
+						debug: true,
+					}) || {}
+				let date1 = this.$dayjs(token.datetime)
+				let date2 = this.$dayjs()
+				const date = date2.diff(date1, 'seconds')
+				if (validatenull(date)) return
+				if (date >= this.website.tokenTime && !this.refreshLock) {
+					this.refreshLock = true
+					this.$store
+						.dispatch('RefreshToken')
+						.then(() => {
+							this.refreshLock = false
+						})
+						.catch(err => {
+							console.log(err)
+							this.refreshLock = false
+						})
+				}
+			}, 1000)
+		},
+	},
+}
diff --git a/src/mockProdServer.js b/src/mockProdServer.js
index d13afa4..1f8ac3e 100644
--- a/src/mockProdServer.js
+++ b/src/mockProdServer.js
@@ -1,9 +1,9 @@
-import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';
+import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
 
-import menuModule from '../mock/menu';
-import userModule from '../mock/user';
-import crudModule from '../mock/crud';
+import menuModule from '../mock/menu'
+import userModule from '../mock/user'
+import crudModule from '../mock/crud'
 
 export const setupProdMockServer = () => {
-  createProdMockServer([...menuModule, ...userModule, ...crudModule]);
-};
+	createProdMockServer([...menuModule, ...userModule, ...crudModule])
+}
diff --git a/src/option/job/jobinfo.js b/src/option/job/jobinfo.js
index b4de472..eaa46df 100644
--- a/src/option/job/jobinfo.js
+++ b/src/option/job/jobinfo.js
@@ -1,515 +1,515 @@
 export const timeExpressionTypeDic = [
-  {
-    label: 'API',
-    value: 1,
-  },
-  {
-    label: 'CRON',
-    value: 2,
-  },
-  {
-    label: '固定频率(毫秒)',
-    value: 3,
-  },
-  {
-    label: '固定延迟(毫秒)',
-    value: 4,
-  },
-  {
-    label: '工作流',
-    value: 5,
-  },
-];
+	{
+		label: 'API',
+		value: 1,
+	},
+	{
+		label: 'CRON',
+		value: 2,
+	},
+	{
+		label: '固定频率(毫秒)',
+		value: 3,
+	},
+	{
+		label: '固定延迟(毫秒)',
+		value: 4,
+	},
+	{
+		label: '工作流',
+		value: 5,
+	},
+]
 
 export const executeTypeDic = [
-  {
-    label: '单机执行',
-    value: 1,
-  },
-  {
-    label: '广播执行',
-    value: 2,
-  },
-  {
-    label: 'MapReduce',
-    value: 3,
-  },
-];
+	{
+		label: '单机执行',
+		value: 1,
+	},
+	{
+		label: '广播执行',
+		value: 2,
+	},
+	{
+		label: 'MapReduce',
+		value: 3,
+	},
+]
 
 export const processorTypeDic = [
-  {
-    label: '内建处理器',
-    value: 1,
-  },
-  {
-    label: '外部处理器(动态加载)',
-    value: 4,
-  },
-];
+	{
+		label: '内建处理器',
+		value: 1,
+	},
+	{
+		label: '外部处理器(动态加载)',
+		value: 4,
+	},
+]
 
 export const dispatchStrategyDic = [
-  {
-    label: 'HEALTH_FIRST',
-    value: 1,
-  },
-  {
-    label: 'RANDOM',
-    value: 2,
-  },
-];
+	{
+		label: 'HEALTH_FIRST',
+		value: 1,
+	},
+	{
+		label: 'RANDOM',
+		value: 2,
+	},
+]
 
 export const enableDic = [
-  {
-    label: '暂停',
-    value: 0,
-  },
-  {
-    label: '启用',
-    value: 1,
-  },
-];
+	{
+		label: '暂停',
+		value: 0,
+	},
+	{
+		label: '启用',
+		value: 1,
+	},
+]
 
 export const logTypeDic = [
-  {
-    label: 'ONLINE',
-    value: 1,
-  },
-  {
-    label: 'LOCAL',
-    value: 2,
-  },
-  {
-    label: 'STDOUT',
-    value: 3,
-  },
-  {
-    label: 'LOCAL_AND_ONLINE',
-    value: 4,
-  },
-  {
-    label: 'NULL',
-    value: 999,
-  },
-];
+	{
+		label: 'ONLINE',
+		value: 1,
+	},
+	{
+		label: 'LOCAL',
+		value: 2,
+	},
+	{
+		label: 'STDOUT',
+		value: 3,
+	},
+	{
+		label: 'LOCAL_AND_ONLINE',
+		value: 4,
+	},
+	{
+		label: 'NULL',
+		value: 999,
+	},
+]
 
 export const logLevelDic = [
-  {
-    label: 'DEBUG',
-    value: 1,
-  },
-  {
-    label: 'INFO',
-    value: 2,
-  },
-  {
-    label: 'WARN',
-    value: 3,
-  },
-  {
-    label: 'ERROR',
-    value: 4,
-  },
-  {
-    label: 'OFF',
-    value: 99,
-  },
-];
+	{
+		label: 'DEBUG',
+		value: 1,
+	},
+	{
+		label: 'INFO',
+		value: 2,
+	},
+	{
+		label: 'WARN',
+		value: 3,
+	},
+	{
+		label: 'ERROR',
+		value: 4,
+	},
+	{
+		label: 'OFF',
+		value: 99,
+	},
+]
 
 export default {
-  height: 'auto',
-  calcHeight: 30,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 6,
-  border: true,
-  index: true,
-  viewBtn: true,
-  selection: true,
-  grid: true,
-  labelWidth: 180,
-  menuWidth: 350,
-  dialogWidth: 1200,
-  dialogClickModal: false,
-  tabs: true,
-  column: [
-    {
-      label: '任务应用',
-      prop: 'jobServerId',
-      type: 'select',
-      dicUrl: '/blade-job/job-server/select',
-      props: {
-        label: 'jobAppName',
-        value: 'id',
-      },
-      search: true,
-      display: false,
-    },
-    {
-      label: '任务ID',
-      prop: 'jobId',
-      type: 'input',
-      search: true,
-      width: 80,
-      display: false,
-    },
-    {
-      label: '任务名称',
-      prop: 'jobName',
-      type: 'input',
-      search: true,
-      width: 200,
-      display: false,
-    },
-    {
-      label: '定时信息',
-      labelTip: '时间表达式类型',
-      prop: 'timeExpressionType',
-      type: 'select',
-      dicData: timeExpressionTypeDic,
-      rules: [
-        {
-          required: true,
-          message: '请选择定时信息',
-          trigger: 'blur',
-        },
-      ],
-      width: 120,
-      display: false,
-    },
-    {
-      label: '执行类型',
-      labelTip: '枚举值',
-      prop: 'executeType',
-      type: 'select',
-      dicData: executeTypeDic,
-      rules: [
-        {
-          required: true,
-          message: '请选择执行器类型',
-          trigger: 'blur',
-        },
-      ],
-      width: 110,
-      display: false,
-    },
-    {
-      label: '处理器类型',
-      labelTip: '枚举值',
-      prop: 'processorType',
-      type: 'select',
-      dicData: processorTypeDic,
-      rules: [
-        {
-          required: true,
-          message: '请选择处理器类型',
-          trigger: 'blur',
-        },
-      ],
-      width: 180,
-      display: false,
-    },
-    {
-      label: '任务状态',
-      labelTip: '未启用的任务不会被调度',
-      prop: 'enable',
-      type: 'switch',
-      dicData: enableDic,
-      slot: true,
-      width: 100,
-      display: false,
-    },
-  ],
-  group: [
-    {
-      label: '基础配置',
-      prop: 'modelSetting',
-      icon: 'el-icon-tickets',
-      column: [
-        {
-          label: '任务应用',
-          prop: 'jobServerId',
-          type: 'select',
-          dicUrl: '/blade-job/job-server/select',
-          props: {
-            label: 'jobAppName',
-            value: 'id',
-          },
-          editDisabled: true,
-          rules: [
-            {
-              required: true,
-              message: '请选择任务应用',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '任务状态',
-          labelTip: '未启用的任务不会被调度',
-          prop: 'enable',
-          type: 'switch',
-          value: 1,
-          rules: [
-            {
-              required: true,
-              message: '请选择是否开启',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '任务名称',
-          prop: 'jobName',
-          type: 'input',
-          rules: [
-            {
-              required: true,
-              message: '请输入任务名称',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '生命周期',
-          labelTip: '预留,用于指定定时调度任务的生效时间范围)',
-          prop: 'lifecycle',
-          type: 'datetimerange',
-          format: 'YYYY-MM-DD HH:mm:ss',
-          valueFormat: 'YYYY-MM-DD HH:mm:ss',
-          startPlaceholder: '任务开始时间',
-          endPlaceholder: '任务结束时间',
-        },
-        {
-          label: '定时类型',
-          labelTip: '时间表达式类型',
-          prop: 'timeExpressionType',
-          type: 'select',
-          dicData: timeExpressionTypeDic,
-          value: 2,
-          rules: [
-            {
-              required: true,
-              message: '请选择定时信息',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '时间表达式',
-          labelTip: '填写类型由 定时类型 决定,比如 CRON 需要填写 CRON 表达式',
-          prop: 'timeExpression',
-          type: 'input',
-        },
-        {
-          label: '执行类型',
-          labelTip: '枚举值',
-          prop: 'executeType',
-          type: 'select',
-          dicData: executeTypeDic,
-          value: 1,
-          rules: [
-            {
-              required: true,
-              message: '请选择执行器类型',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '运行时配置',
-          labelTip: '目前支持随机(RANDOM)和健康度优先(HEALTH_FIRST)',
-          prop: 'dispatchStrategy',
-          type: 'select',
-          dicData: dispatchStrategyDic,
-          value: 1,
-          rules: [
-            {
-              required: true,
-              message: '请选择运行时配置',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '处理器类型',
-          labelTip: '枚举值',
-          prop: 'processorType',
-          type: 'select',
-          dicData: processorTypeDic,
-          value: 1,
-          rules: [
-            {
-              required: true,
-              message: '请选择处理器类型',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '处理器参数',
-          labelTip:
-            '如Java处理器需要填写全限定类名,如:org.springblade.demo.MapReduceProcessorDemo',
-          prop: 'processorInfo',
-          type: 'input',
-          rules: [
-            {
-              required: true,
-              message: '请输入处理器参数',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '任务参数',
-          labelTip: '方法入参 TaskContext 对象的 json 字段',
-          prop: 'jobParams',
-          type: 'input',
-          span: 24,
-        },
-        {
-          label: '任务描述',
-          prop: 'jobDescription',
-          type: 'textarea',
-          minRows: 3,
-          span: 24,
-        },
-      ],
-    },
-    {
-      label: '高级配置',
-      prop: 'templateSetting',
-      icon: 'el-icon-copy-document',
-      column: [
-        {
-          label: '最大实例数',
-          labelTip:
-            '该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例)',
-          prop: 'maxInstanceNum',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '单机线程并发数',
-          labelTip: '该实例执行过程中每个 Worker 使用的线程数量',
-          prop: 'concurrency',
-          type: 'number',
-          value: 5,
-        },
-        {
-          label: '任务实例运行时间限制',
-          labelTip: '0 代表无任何限制,超时会被打断并判定为执行失败',
-          prop: 'instanceTimeLimit',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '任务实例重试次数',
-          labelTip: '任务实例重试次数,整个任务失败时重试,代价大,不推荐使用',
-          prop: 'instanceRetryNum',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '任务作业重试次数',
-          labelTip: 'Task 重试次数,每个子 Task 失败后单独重试,代价小,推荐使用',
-          prop: 'taskRetryNum',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '最低CPU核心',
-          labelTip:
-            '最小可用 CPU 核心数,CPU 可用核心数小于该值的 Worker 将不会执行该任务,0 代表无任何限制',
-          prop: 'minCpuCores',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '最低内存(GB)',
-          labelTip: '可用内存小于该值的Worker 将不会执行该任务,0 代表无任何限制',
-          prop: 'minMemorySpace',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '最低磁盘空间(GB)',
-          labelTip: '可用磁盘空间小于该值的Worker 将不会执行该任务,0 代表无任何限制',
-          prop: 'minDiskSpace',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '执行机器地址',
-          labelTip: '设置该参数后只有列表中的机器允许执行该任务,空代表不指定机器',
-          prop: 'designatedWorkers',
-          type: 'input',
-        },
-        {
-          label: '最大执行机器数量',
-          labelTip: '限定调动执行的机器数量,0代表无限制',
-          prop: 'maxWorkerCount',
-          type: 'number',
-          value: 0,
-        },
-      ],
-    },
-    {
-      label: '其他配置',
-      prop: 'codingSetting',
-      icon: 'el-icon-printer',
-      column: [
-        {
-          label: '报警人员ID列表',
-          labelTip: '接收报警的用户ID列表',
-          prop: 'notifyUserIds',
-          type: 'input',
-        },
-        {
-          label: '错误阈值',
-          labelTip: '错误阈值,0代表不限制',
-          prop: 'alertThreshold',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '统计窗口(s)',
-          labelTip: '统计的窗口长度(s),0代表不限制',
-          prop: 'statisticWindowLen',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '沉默窗口(s)',
-          labelTip: '沉默时间窗口(s),0代表不限制',
-          prop: 'silenceWindowLen',
-          type: 'number',
-          value: 0,
-        },
-        {
-          label: '日志配置',
-          labelTip: '日志配置',
-          prop: 'logType',
-          type: 'select',
-          value: 1,
-          dicData: logTypeDic,
-        },
-        {
-          label: '日志级别',
-          labelTip: '日志级别',
-          prop: 'logLevel',
-          type: 'select',
-          value: 2,
-          dicData: logLevelDic,
-        },
-        {
-          label: '扩展字段',
-          labelTip: '供开发者使用,用于功能扩展,powerjob 自身不会使用该字段',
-          prop: 'extra',
-          type: 'textarea',
-          minRows: 3,
-          span: 24,
-        },
-      ],
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 30,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 6,
+	border: true,
+	index: true,
+	viewBtn: true,
+	selection: true,
+	grid: true,
+	labelWidth: 180,
+	menuWidth: 350,
+	dialogWidth: 1200,
+	dialogClickModal: false,
+	tabs: true,
+	column: [
+		{
+			label: '任务应用',
+			prop: 'jobServerId',
+			type: 'select',
+			dicUrl: '/blade-job/job-server/select',
+			props: {
+				label: 'jobAppName',
+				value: 'id',
+			},
+			search: true,
+			display: false,
+		},
+		{
+			label: '任务ID',
+			prop: 'jobId',
+			type: 'input',
+			search: true,
+			width: 80,
+			display: false,
+		},
+		{
+			label: '任务名称',
+			prop: 'jobName',
+			type: 'input',
+			search: true,
+			width: 200,
+			display: false,
+		},
+		{
+			label: '定时信息',
+			labelTip: '时间表达式类型',
+			prop: 'timeExpressionType',
+			type: 'select',
+			dicData: timeExpressionTypeDic,
+			rules: [
+				{
+					required: true,
+					message: '请选择定时信息',
+					trigger: 'blur',
+				},
+			],
+			width: 120,
+			display: false,
+		},
+		{
+			label: '执行类型',
+			labelTip: '枚举值',
+			prop: 'executeType',
+			type: 'select',
+			dicData: executeTypeDic,
+			rules: [
+				{
+					required: true,
+					message: '请选择执行器类型',
+					trigger: 'blur',
+				},
+			],
+			width: 110,
+			display: false,
+		},
+		{
+			label: '处理器类型',
+			labelTip: '枚举值',
+			prop: 'processorType',
+			type: 'select',
+			dicData: processorTypeDic,
+			rules: [
+				{
+					required: true,
+					message: '请选择处理器类型',
+					trigger: 'blur',
+				},
+			],
+			width: 180,
+			display: false,
+		},
+		{
+			label: '任务状态',
+			labelTip: '未启用的任务不会被调度',
+			prop: 'enable',
+			type: 'switch',
+			dicData: enableDic,
+			slot: true,
+			width: 100,
+			display: false,
+		},
+	],
+	group: [
+		{
+			label: '基础配置',
+			prop: 'modelSetting',
+			icon: 'el-icon-tickets',
+			column: [
+				{
+					label: '任务应用',
+					prop: 'jobServerId',
+					type: 'select',
+					dicUrl: '/blade-job/job-server/select',
+					props: {
+						label: 'jobAppName',
+						value: 'id',
+					},
+					editDisabled: true,
+					rules: [
+						{
+							required: true,
+							message: '请选择任务应用',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '任务状态',
+					labelTip: '未启用的任务不会被调度',
+					prop: 'enable',
+					type: 'switch',
+					value: 1,
+					rules: [
+						{
+							required: true,
+							message: '请选择是否开启',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '任务名称',
+					prop: 'jobName',
+					type: 'input',
+					rules: [
+						{
+							required: true,
+							message: '请输入任务名称',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '生命周期',
+					labelTip: '预留,用于指定定时调度任务的生效时间范围)',
+					prop: 'lifecycle',
+					type: 'datetimerange',
+					format: 'YYYY-MM-DD HH:mm:ss',
+					valueFormat: 'YYYY-MM-DD HH:mm:ss',
+					startPlaceholder: '任务开始时间',
+					endPlaceholder: '任务结束时间',
+				},
+				{
+					label: '定时类型',
+					labelTip: '时间表达式类型',
+					prop: 'timeExpressionType',
+					type: 'select',
+					dicData: timeExpressionTypeDic,
+					value: 2,
+					rules: [
+						{
+							required: true,
+							message: '请选择定时信息',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '时间表达式',
+					labelTip: '填写类型由 定时类型 决定,比如 CRON 需要填写 CRON 表达式',
+					prop: 'timeExpression',
+					type: 'input',
+				},
+				{
+					label: '执行类型',
+					labelTip: '枚举值',
+					prop: 'executeType',
+					type: 'select',
+					dicData: executeTypeDic,
+					value: 1,
+					rules: [
+						{
+							required: true,
+							message: '请选择执行器类型',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '运行时配置',
+					labelTip: '目前支持随机(RANDOM)和健康度优先(HEALTH_FIRST)',
+					prop: 'dispatchStrategy',
+					type: 'select',
+					dicData: dispatchStrategyDic,
+					value: 1,
+					rules: [
+						{
+							required: true,
+							message: '请选择运行时配置',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '处理器类型',
+					labelTip: '枚举值',
+					prop: 'processorType',
+					type: 'select',
+					dicData: processorTypeDic,
+					value: 1,
+					rules: [
+						{
+							required: true,
+							message: '请选择处理器类型',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '处理器参数',
+					labelTip:
+						'如Java处理器需要填写全限定类名,如:org.springblade.demo.MapReduceProcessorDemo',
+					prop: 'processorInfo',
+					type: 'input',
+					rules: [
+						{
+							required: true,
+							message: '请输入处理器参数',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '任务参数',
+					labelTip: '方法入参 TaskContext 对象的 json 字段',
+					prop: 'jobParams',
+					type: 'input',
+					span: 24,
+				},
+				{
+					label: '任务描述',
+					prop: 'jobDescription',
+					type: 'textarea',
+					minRows: 3,
+					span: 24,
+				},
+			],
+		},
+		{
+			label: '高级配置',
+			prop: 'templateSetting',
+			icon: 'el-icon-copy-document',
+			column: [
+				{
+					label: '最大实例数',
+					labelTip:
+						'该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例)',
+					prop: 'maxInstanceNum',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '单机线程并发数',
+					labelTip: '该实例执行过程中每个 Worker 使用的线程数量',
+					prop: 'concurrency',
+					type: 'number',
+					value: 5,
+				},
+				{
+					label: '任务实例运行时间限制',
+					labelTip: '0 代表无任何限制,超时会被打断并判定为执行失败',
+					prop: 'instanceTimeLimit',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '任务实例重试次数',
+					labelTip: '任务实例重试次数,整个任务失败时重试,代价大,不推荐使用',
+					prop: 'instanceRetryNum',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '任务作业重试次数',
+					labelTip: 'Task 重试次数,每个子 Task 失败后单独重试,代价小,推荐使用',
+					prop: 'taskRetryNum',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '最低CPU核心',
+					labelTip:
+						'最小可用 CPU 核心数,CPU 可用核心数小于该值的 Worker 将不会执行该任务,0 代表无任何限制',
+					prop: 'minCpuCores',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '最低内存(GB)',
+					labelTip: '可用内存小于该值的Worker 将不会执行该任务,0 代表无任何限制',
+					prop: 'minMemorySpace',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '最低磁盘空间(GB)',
+					labelTip: '可用磁盘空间小于该值的Worker 将不会执行该任务,0 代表无任何限制',
+					prop: 'minDiskSpace',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '执行机器地址',
+					labelTip: '设置该参数后只有列表中的机器允许执行该任务,空代表不指定机器',
+					prop: 'designatedWorkers',
+					type: 'input',
+				},
+				{
+					label: '最大执行机器数量',
+					labelTip: '限定调动执行的机器数量,0代表无限制',
+					prop: 'maxWorkerCount',
+					type: 'number',
+					value: 0,
+				},
+			],
+		},
+		{
+			label: '其他配置',
+			prop: 'codingSetting',
+			icon: 'el-icon-printer',
+			column: [
+				{
+					label: '报警人员ID列表',
+					labelTip: '接收报警的用户ID列表',
+					prop: 'notifyUserIds',
+					type: 'input',
+				},
+				{
+					label: '错误阈值',
+					labelTip: '错误阈值,0代表不限制',
+					prop: 'alertThreshold',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '统计窗口(s)',
+					labelTip: '统计的窗口长度(s),0代表不限制',
+					prop: 'statisticWindowLen',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '沉默窗口(s)',
+					labelTip: '沉默时间窗口(s),0代表不限制',
+					prop: 'silenceWindowLen',
+					type: 'number',
+					value: 0,
+				},
+				{
+					label: '日志配置',
+					labelTip: '日志配置',
+					prop: 'logType',
+					type: 'select',
+					value: 1,
+					dicData: logTypeDic,
+				},
+				{
+					label: '日志级别',
+					labelTip: '日志级别',
+					prop: 'logLevel',
+					type: 'select',
+					value: 2,
+					dicData: logLevelDic,
+				},
+				{
+					label: '扩展字段',
+					labelTip: '供开发者使用,用于功能扩展,powerjob 自身不会使用该字段',
+					prop: 'extra',
+					type: 'textarea',
+					minRows: 3,
+					span: 24,
+				},
+			],
+		},
+	],
+}
diff --git a/src/option/job/jobserver.js b/src/option/job/jobserver.js
index 27914be..5e55403 100644
--- a/src/option/job/jobserver.js
+++ b/src/option/job/jobserver.js
@@ -1,78 +1,78 @@
 export default {
-  height: 'auto',
-  calcHeight: 30,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 6,
-  border: true,
-  index: true,
-  viewBtn: true,
-  selection: true,
-  grid: true,
-  labelWidth: 100,
-  menuWidth: 350,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '服务名称',
-      prop: 'jobServerName',
-      type: 'input',
-      span: 24,
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入服务名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '服务器地址',
-      prop: 'jobServerUrl',
-      type: 'input',
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入服务器地址',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '应用名称',
-      prop: 'jobAppName',
-      type: 'input',
-      span: 24,
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入应用名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '应用密码',
-      prop: 'jobAppPassword',
-      type: 'input',
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入应用密码',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '任务备注',
-      prop: 'jobRemark',
-      type: 'textarea',
-      minRows: 3,
-      span: 24,
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 30,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 6,
+	border: true,
+	index: true,
+	viewBtn: true,
+	selection: true,
+	grid: true,
+	labelWidth: 100,
+	menuWidth: 350,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '服务名称',
+			prop: 'jobServerName',
+			type: 'input',
+			span: 24,
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入服务名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '服务器地址',
+			prop: 'jobServerUrl',
+			type: 'input',
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入服务器地址',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '应用名称',
+			prop: 'jobAppName',
+			type: 'input',
+			span: 24,
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入应用名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '应用密码',
+			prop: 'jobAppPassword',
+			type: 'input',
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入应用密码',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '任务备注',
+			prop: 'jobRemark',
+			type: 'textarea',
+			minRows: 3,
+			span: 24,
+		},
+	],
+}
diff --git a/src/option/system/dict.js b/src/option/system/dict.js
index aac2d8a..b466bb5 100644
--- a/src/option/system/dict.js
+++ b/src/option/system/dict.js
@@ -1,210 +1,210 @@
 export const optionParent = {
-  height: 'auto',
-  calcHeight: 32,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 10,
-  border: true,
-  index: true,
-  selection: true,
-  viewBtn: true,
-  menuWidth: 250,
-  dialogWidth: 880,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '字典编号',
-      prop: 'code',
-      search: true,
-      slot: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典名称',
-      prop: 'dictValue',
-      search: true,
-      align: 'center',
-      rules: [
-        {
-          required: true,
-          message: '请输入字典名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典排序',
-      prop: 'sort',
-      type: 'number',
-      align: 'right',
-      width: 100,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典排序',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '封存',
-      prop: 'isSealed',
-      type: 'switch',
-      align: 'center',
-      width: 100,
-      dicData: [
-        {
-          label: '否',
-          value: 0,
-        },
-        {
-          label: '是',
-          value: 1,
-        },
-      ],
-      value: 0,
-      slot: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择封存',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典备注',
-      prop: 'remark',
-      hide: true,
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 32,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 10,
+	border: true,
+	index: true,
+	selection: true,
+	viewBtn: true,
+	menuWidth: 250,
+	dialogWidth: 880,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '字典编号',
+			prop: 'code',
+			search: true,
+			slot: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典名称',
+			prop: 'dictValue',
+			search: true,
+			align: 'center',
+			rules: [
+				{
+					required: true,
+					message: '请输入字典名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典排序',
+			prop: 'sort',
+			type: 'number',
+			align: 'right',
+			width: 100,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典排序',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '封存',
+			prop: 'isSealed',
+			type: 'switch',
+			align: 'center',
+			width: 100,
+			dicData: [
+				{
+					label: '否',
+					value: 0,
+				},
+				{
+					label: '是',
+					value: 1,
+				},
+			],
+			value: 0,
+			slot: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择封存',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典备注',
+			prop: 'remark',
+			hide: true,
+		},
+	],
+}
 
 export const optionChild = {
-  height: 'auto',
-  calcHeight: 95,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 10,
-  tree: true,
-  border: true,
-  index: true,
-  selection: true,
-  viewBtn: true,
-  menuWidth: 300,
-  dialogWidth: 880,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '字典编号',
-      prop: 'code',
-      addDisabled: true,
-      editDisabled: true,
-      search: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典名称',
-      prop: 'dictValue',
-      search: true,
-      align: 'center',
-      rules: [
-        {
-          required: true,
-          message: '请输入字典名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '上级字典',
-      prop: 'parentId',
-      type: 'tree',
-      dicData: [],
-      hide: true,
-      props: {
-        label: 'title',
-      },
-      addDisabled: true,
-      editDisabled: true,
-      rules: [
-        {
-          required: false,
-          message: '请选择上级字典',
-          trigger: 'click',
-        },
-      ],
-    },
-    {
-      label: '字典键值',
-      prop: 'dictKey',
-      width: 85,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典键值',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典排序',
-      prop: 'sort',
-      type: 'number',
-      align: 'right',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典排序',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '封存',
-      prop: 'isSealed',
-      type: 'switch',
-      align: 'center',
-      width: 80,
-      dicData: [
-        {
-          label: '否',
-          value: 0,
-        },
-        {
-          label: '是',
-          value: 1,
-        },
-      ],
-      value: 0,
-      slot: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择封存',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典备注',
-      prop: 'remark',
-      hide: true,
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 95,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 10,
+	tree: true,
+	border: true,
+	index: true,
+	selection: true,
+	viewBtn: true,
+	menuWidth: 300,
+	dialogWidth: 880,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '字典编号',
+			prop: 'code',
+			addDisabled: true,
+			editDisabled: true,
+			search: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典名称',
+			prop: 'dictValue',
+			search: true,
+			align: 'center',
+			rules: [
+				{
+					required: true,
+					message: '请输入字典名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '上级字典',
+			prop: 'parentId',
+			type: 'tree',
+			dicData: [],
+			hide: true,
+			props: {
+				label: 'title',
+			},
+			addDisabled: true,
+			editDisabled: true,
+			rules: [
+				{
+					required: false,
+					message: '请选择上级字典',
+					trigger: 'click',
+				},
+			],
+		},
+		{
+			label: '字典键值',
+			prop: 'dictKey',
+			width: 85,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典键值',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典排序',
+			prop: 'sort',
+			type: 'number',
+			align: 'right',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典排序',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '封存',
+			prop: 'isSealed',
+			type: 'switch',
+			align: 'center',
+			width: 80,
+			dicData: [
+				{
+					label: '否',
+					value: 0,
+				},
+				{
+					label: '是',
+					value: 1,
+				},
+			],
+			value: 0,
+			slot: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择封存',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典备注',
+			prop: 'remark',
+			hide: true,
+		},
+	],
+}
diff --git a/src/option/system/dictbiz.js b/src/option/system/dictbiz.js
index 18a884b..9db8ab3 100644
--- a/src/option/system/dictbiz.js
+++ b/src/option/system/dictbiz.js
@@ -1,211 +1,211 @@
 export const optionParent = {
-  height: 'auto',
-  calcHeight: 32,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 10,
-  border: true,
-  index: true,
-  selection: true,
-  viewBtn: true,
-  menuWidth: 250,
-  dialogWidth: 880,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '字典编号',
-      prop: 'code',
-      search: true,
-      slot: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典名称',
-      prop: 'dictValue',
-      search: true,
-      align: 'center',
-      rules: [
-        {
-          required: true,
-          message: '请输入字典名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典排序',
-      prop: 'sort',
-      type: 'number',
-      align: 'right',
-      width: 100,
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典排序',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '封存',
-      prop: 'isSealed',
-      type: 'switch',
-      align: 'center',
-      width: 100,
-      dicData: [
-        {
-          label: '否',
-          value: 0,
-        },
-        {
-          label: '是',
-          value: 1,
-        },
-      ],
-      value: 0,
-      slot: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择封存',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典备注',
-      prop: 'remark',
-      hide: true,
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 32,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 10,
+	border: true,
+	index: true,
+	selection: true,
+	viewBtn: true,
+	menuWidth: 250,
+	dialogWidth: 880,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '字典编号',
+			prop: 'code',
+			search: true,
+			slot: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典名称',
+			prop: 'dictValue',
+			search: true,
+			align: 'center',
+			rules: [
+				{
+					required: true,
+					message: '请输入字典名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典排序',
+			prop: 'sort',
+			type: 'number',
+			align: 'right',
+			width: 100,
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典排序',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '封存',
+			prop: 'isSealed',
+			type: 'switch',
+			align: 'center',
+			width: 100,
+			dicData: [
+				{
+					label: '否',
+					value: 0,
+				},
+				{
+					label: '是',
+					value: 1,
+				},
+			],
+			value: 0,
+			slot: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择封存',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典备注',
+			prop: 'remark',
+			hide: true,
+		},
+	],
+}
 
 export const optionChild = {
-  height: 'auto',
-  calcHeight: 95,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 10,
-  tree: true,
-  border: true,
-  index: true,
-  selection: true,
-  viewBtn: true,
-  menuWidth: 300,
-  dialogWidth: 880,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '字典编号',
-      prop: 'code',
-      addDisabled: true,
-      editDisabled: true,
-      search: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典名称',
-      prop: 'dictValue',
-      search: true,
-      align: 'center',
-      rules: [
-        {
-          required: true,
-          message: '请输入字典名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '上级字典',
-      prop: 'parentId',
-      type: 'tree',
-      dicData: [],
-      hide: true,
-      props: {
-        label: 'title',
-      },
-      addDisabled: true,
-      editDisabled: true,
-      rules: [
-        {
-          required: false,
-          message: '请选择上级字典',
-          trigger: 'click',
-        },
-      ],
-    },
-    {
-      label: '字典键值',
-      prop: 'dictKey',
-      width: 85,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典键值',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典排序',
-      prop: 'sort',
-      type: 'number',
-      align: 'right',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入字典排序',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '封存',
-      prop: 'isSealed',
-      type: 'switch',
-      align: 'center',
-      width: 80,
-      dicData: [
-        {
-          label: '否',
-          value: 0,
-        },
-        {
-          label: '是',
-          value: 1,
-        },
-      ],
-      value: 0,
-      slot: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择封存',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '字典备注',
-      prop: 'remark',
-      hide: true,
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 95,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 10,
+	tree: true,
+	border: true,
+	index: true,
+	selection: true,
+	viewBtn: true,
+	menuWidth: 300,
+	dialogWidth: 880,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '字典编号',
+			prop: 'code',
+			addDisabled: true,
+			editDisabled: true,
+			search: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典名称',
+			prop: 'dictValue',
+			search: true,
+			align: 'center',
+			rules: [
+				{
+					required: true,
+					message: '请输入字典名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '上级字典',
+			prop: 'parentId',
+			type: 'tree',
+			dicData: [],
+			hide: true,
+			props: {
+				label: 'title',
+			},
+			addDisabled: true,
+			editDisabled: true,
+			rules: [
+				{
+					required: false,
+					message: '请选择上级字典',
+					trigger: 'click',
+				},
+			],
+		},
+		{
+			label: '字典键值',
+			prop: 'dictKey',
+			width: 85,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典键值',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典排序',
+			prop: 'sort',
+			type: 'number',
+			align: 'right',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入字典排序',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '封存',
+			prop: 'isSealed',
+			type: 'switch',
+			align: 'center',
+			width: 80,
+			dicData: [
+				{
+					label: '否',
+					value: 0,
+				},
+				{
+					label: '是',
+					value: 1,
+				},
+			],
+			value: 0,
+			slot: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择封存',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '字典备注',
+			prop: 'remark',
+			hide: true,
+		},
+	],
+}
diff --git a/src/option/tool/code.js b/src/option/tool/code.js
index 2447102..6baaaed 100644
--- a/src/option/tool/code.js
+++ b/src/option/tool/code.js
@@ -1,665 +1,665 @@
-import { templateDic } from '@/const/tool/model';
+import { templateDic } from '@/const/tool/model'
 
 export const codeOption = {
-  height: 'auto',
-  calcHeight: 32,
-  dialogWidth: 900,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 6,
-  border: true,
-  index: true,
-  selection: true,
-  labelWidth: 120,
-  menuWidth: 350,
-  viewBtn: true,
-  dialogClickModal: false,
-  tabs: true,
-  column: [
-    {
-      label: '模块名',
-      prop: 'codeName',
-      search: true,
-      display: false,
-    },
-    {
-      label: '模版类型',
-      prop: 'templateType',
-      type: 'select',
-      dicData: templateDic,
-      display: false,
-    },
-    {
-      label: '表名',
-      prop: 'tableName',
-      search: true,
-      display: false,
-    },
-    {
-      label: '服务名',
-      prop: 'serviceName',
-      search: true,
-      display: false,
-    },
-    {
-      label: '包名',
-      prop: 'packageName',
-      display: false,
-    },
-  ],
-  group: [
-    {
-      label: '模型配置',
-      prop: 'modelSetting',
-      icon: 'el-icon-tickets',
-      column: [
-        {
-          label: '上级菜单',
-          prop: 'menuId',
-          type: 'tree',
-          dicData: [],
-          span: 24,
-          hide: true,
-          addDisabled: false,
-          props: {
-            label: 'title',
-          },
-          rules: [
-            {
-              required: true,
-              message: '请选择上级菜单',
-              trigger: 'click',
-            },
-          ],
-        },
-        {
-          label: '数据模型',
-          prop: 'modelId',
-          search: true,
-          span: 24,
-          type: 'select',
-          dicUrl: '/blade-develop/model/select',
-          props: {
-            label: 'modelName',
-            value: 'id',
-          },
-          rules: [
-            {
-              required: true,
-              message: '请选择数据模型',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '模块名',
-          prop: 'codeName',
-          search: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入模块名',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '表名',
-          prop: 'tableName',
-          rules: [
-            {
-              required: true,
-              message: '请输入表名',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '表前缀',
-          prop: 'tablePrefix',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入表前缀',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '主键名',
-          prop: 'pkName',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入主键名',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '服务名',
-          prop: 'serviceName',
-          search: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入服务名',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '包名',
-          prop: 'packageName',
-          overHidden: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入包名',
-              trigger: 'blur',
-            },
-          ],
-        },
-      ],
-    },
-    {
-      label: '模版配置',
-      prop: 'templateSetting',
-      icon: 'el-icon-copy-document',
-      column: [
-        {
-          label: '模版类型',
-          prop: 'templateType',
-          type: 'select',
-          dicData: templateDic,
-          value: 'crud',
-          rules: [
-            {
-              required: true,
-              message: '请选择模版类型',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '作者信息',
-          prop: 'author',
-          value: 'BladeX',
-          rules: [
-            {
-              required: true,
-              message: '请输入作者',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '子表模型',
-          prop: 'subModelId',
-          type: 'select',
-          dicUrl: '/blade-develop/model/select',
-          props: {
-            label: 'modelName',
-            value: 'id',
-          },
-          display: false,
-          hide: true,
-        },
-        {
-          label: '子表外键',
-          prop: 'subFkId',
-          display: false,
-          hide: true,
-        },
-        {
-          label: '树主键字段',
-          prop: 'treeId',
-          type: 'select',
-          dicData: [],
-          props: {
-            label: 'jdbcComment',
-            value: 'jdbcName',
-          },
-          display: false,
-          hide: true,
-        },
-        {
-          label: '树父主键字段',
-          prop: 'treePid',
-          type: 'select',
-          dicData: [],
-          props: {
-            label: 'jdbcComment',
-            value: 'jdbcName',
-          },
-          display: false,
-          hide: true,
-        },
-        {
-          label: '树名称字段',
-          prop: 'treeName',
-          type: 'select',
-          dicData: [],
-          props: {
-            label: 'jdbcComment',
-            value: 'jdbcName',
-          },
-          display: false,
-          hide: true,
-        },
-      ],
-    },
-    {
-      label: '生成配置',
-      prop: 'codingSetting',
-      icon: 'el-icon-printer',
-      column: [
-        {
-          label: '基础业务',
-          labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
-          prop: 'baseMode',
-          type: 'radio',
-          dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-          props: {
-            label: 'dictValue',
-            value: 'dictKey',
-          },
-          value: 2,
-          dataType: 'number',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请选择基础业务',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '包装器',
-          labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
-          prop: 'wrapMode',
-          type: 'radio',
-          dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-          props: {
-            label: 'dictValue',
-            value: 'dictKey',
-          },
-          value: 2,
-          dataType: 'number',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请选择包装器',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '远程调用',
-          labelTip: '配置是否使用Feign远程调用',
-          prop: 'feignMode',
-          type: 'radio',
-          dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-          props: {
-            label: 'dictValue',
-            value: 'dictKey',
-          },
-          value: 1,
-          dataType: 'number',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请选择基础业务',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '代码风格',
-          labelTip: '选择不同底层实现的代码模版',
-          prop: 'codeStyle',
-          type: 'radio',
-          dicData: [
-            {
-              label: 'saber3',
-              value: 'saber3',
-            },
-            {
-              label: 'element-plus',
-              value: 'element-plus',
-            },
-          ],
-          value: 'saber3',
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请选择代码风格',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '后端生成路径',
-          prop: 'apiPath',
-          span: 24,
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入后端生成路径',
-              trigger: 'blur',
-            },
-          ],
-        },
-        {
-          label: '前端生成路径',
-          prop: 'webPath',
-          span: 24,
-          hide: true,
-          rules: [
-            {
-              required: true,
-              message: '请输入前端生成路径',
-              trigger: 'blur',
-            },
-          ],
-        },
-      ],
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 32,
+	dialogWidth: 900,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 6,
+	border: true,
+	index: true,
+	selection: true,
+	labelWidth: 120,
+	menuWidth: 350,
+	viewBtn: true,
+	dialogClickModal: false,
+	tabs: true,
+	column: [
+		{
+			label: '模块名',
+			prop: 'codeName',
+			search: true,
+			display: false,
+		},
+		{
+			label: '模版类型',
+			prop: 'templateType',
+			type: 'select',
+			dicData: templateDic,
+			display: false,
+		},
+		{
+			label: '表名',
+			prop: 'tableName',
+			search: true,
+			display: false,
+		},
+		{
+			label: '服务名',
+			prop: 'serviceName',
+			search: true,
+			display: false,
+		},
+		{
+			label: '包名',
+			prop: 'packageName',
+			display: false,
+		},
+	],
+	group: [
+		{
+			label: '模型配置',
+			prop: 'modelSetting',
+			icon: 'el-icon-tickets',
+			column: [
+				{
+					label: '上级菜单',
+					prop: 'menuId',
+					type: 'tree',
+					dicData: [],
+					span: 24,
+					hide: true,
+					addDisabled: false,
+					props: {
+						label: 'title',
+					},
+					rules: [
+						{
+							required: true,
+							message: '请选择上级菜单',
+							trigger: 'click',
+						},
+					],
+				},
+				{
+					label: '数据模型',
+					prop: 'modelId',
+					search: true,
+					span: 24,
+					type: 'select',
+					dicUrl: '/blade-develop/model/select',
+					props: {
+						label: 'modelName',
+						value: 'id',
+					},
+					rules: [
+						{
+							required: true,
+							message: '请选择数据模型',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '模块名',
+					prop: 'codeName',
+					search: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入模块名',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '表名',
+					prop: 'tableName',
+					rules: [
+						{
+							required: true,
+							message: '请输入表名',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '表前缀',
+					prop: 'tablePrefix',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入表前缀',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '主键名',
+					prop: 'pkName',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入主键名',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '服务名',
+					prop: 'serviceName',
+					search: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入服务名',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '包名',
+					prop: 'packageName',
+					overHidden: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入包名',
+							trigger: 'blur',
+						},
+					],
+				},
+			],
+		},
+		{
+			label: '模版配置',
+			prop: 'templateSetting',
+			icon: 'el-icon-copy-document',
+			column: [
+				{
+					label: '模版类型',
+					prop: 'templateType',
+					type: 'select',
+					dicData: templateDic,
+					value: 'crud',
+					rules: [
+						{
+							required: true,
+							message: '请选择模版类型',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '作者信息',
+					prop: 'author',
+					value: 'BladeX',
+					rules: [
+						{
+							required: true,
+							message: '请输入作者',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '子表模型',
+					prop: 'subModelId',
+					type: 'select',
+					dicUrl: '/blade-develop/model/select',
+					props: {
+						label: 'modelName',
+						value: 'id',
+					},
+					display: false,
+					hide: true,
+				},
+				{
+					label: '子表外键',
+					prop: 'subFkId',
+					display: false,
+					hide: true,
+				},
+				{
+					label: '树主键字段',
+					prop: 'treeId',
+					type: 'select',
+					dicData: [],
+					props: {
+						label: 'jdbcComment',
+						value: 'jdbcName',
+					},
+					display: false,
+					hide: true,
+				},
+				{
+					label: '树父主键字段',
+					prop: 'treePid',
+					type: 'select',
+					dicData: [],
+					props: {
+						label: 'jdbcComment',
+						value: 'jdbcName',
+					},
+					display: false,
+					hide: true,
+				},
+				{
+					label: '树名称字段',
+					prop: 'treeName',
+					type: 'select',
+					dicData: [],
+					props: {
+						label: 'jdbcComment',
+						value: 'jdbcName',
+					},
+					display: false,
+					hide: true,
+				},
+			],
+		},
+		{
+			label: '生成配置',
+			prop: 'codingSetting',
+			icon: 'el-icon-printer',
+			column: [
+				{
+					label: '基础业务',
+					labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
+					prop: 'baseMode',
+					type: 'radio',
+					dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+					props: {
+						label: 'dictValue',
+						value: 'dictKey',
+					},
+					value: 2,
+					dataType: 'number',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请选择基础业务',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '包装器',
+					labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
+					prop: 'wrapMode',
+					type: 'radio',
+					dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+					props: {
+						label: 'dictValue',
+						value: 'dictKey',
+					},
+					value: 2,
+					dataType: 'number',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请选择包装器',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '远程调用',
+					labelTip: '配置是否使用Feign远程调用',
+					prop: 'feignMode',
+					type: 'radio',
+					dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+					props: {
+						label: 'dictValue',
+						value: 'dictKey',
+					},
+					value: 1,
+					dataType: 'number',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请选择基础业务',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '代码风格',
+					labelTip: '选择不同底层实现的代码模版',
+					prop: 'codeStyle',
+					type: 'radio',
+					dicData: [
+						{
+							label: 'saber3',
+							value: 'saber3',
+						},
+						{
+							label: 'element-plus',
+							value: 'element-plus',
+						},
+					],
+					value: 'saber3',
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请选择代码风格',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '后端生成路径',
+					prop: 'apiPath',
+					span: 24,
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入后端生成路径',
+							trigger: 'blur',
+						},
+					],
+				},
+				{
+					label: '前端生成路径',
+					prop: 'webPath',
+					span: 24,
+					hide: true,
+					rules: [
+						{
+							required: true,
+							message: '请输入前端生成路径',
+							trigger: 'blur',
+						},
+					],
+				},
+			],
+		},
+	],
+}
 
 export const genOption = {
-  labelWidth: 120,
-  column: [
-    {
-      label: '上级菜单',
-      prop: 'menuId',
-      type: 'tree',
-      dicData: [],
-      span: 24,
-      hide: true,
-      addDisabled: false,
-      props: {
-        label: 'title',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请选择上级菜单',
-          trigger: 'click',
-        },
-      ],
-    },
-    {
-      label: '数据源',
-      prop: 'datasourceId',
-      search: true,
-      span: 24,
-      type: 'select',
-      dicUrl: '/blade-develop/datasource/select',
-      props: {
-        label: 'name',
-        value: 'id',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请选择数据源',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '物理表名',
-      prop: 'modelTable',
-      type: 'tree',
-      slot: true,
-      filterable: true,
-      span: 24,
-      display: true,
-      dicData: [],
-      props: {
-        label: 'comment',
-        value: 'name',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请输入数据库表名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '表单设计',
-      prop: 'modelForm',
-      type: 'select',
-      props: {
-        label: 'name',
-        value: 'id',
-      },
-      dicData: [],
-      filterable: true,
-      display: false,
-      span: 24,
-    },
-    {
-      label: '模型类名',
-      prop: 'modelClass',
-      display: false,
-      disabled: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入模型类名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模型编号',
-      prop: 'modelCode',
-      display: false,
-      rules: [
-        {
-          required: true,
-          message: '请输入模型编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '模块名',
-      prop: 'codeName',
-      display: false,
-      rules: [
-        {
-          required: true,
-          message: '请输入模块名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '表名',
-      prop: 'tableName',
-      display: false,
-      rules: [
-        {
-          required: true,
-          message: '请输入表名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '表前缀',
-      prop: 'tablePrefix',
-      display: false,
-      rules: [
-        {
-          required: true,
-          message: '请输入表前缀',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '主键名',
-      prop: 'pkName',
-      display: false,
-      rules: [
-        {
-          required: true,
-          message: '请输入主键名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '服务名',
-      prop: 'serviceName',
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入服务名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '包名',
-      prop: 'packageName',
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入包名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '基础业务',
-      labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
-      prop: 'baseMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 2,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择基础业务',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '包装器',
-      labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
-      prop: 'wrapMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 2,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择包装器',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '远程调用',
-      labelTip: '配置是否使用Feign远程调用',
-      prop: 'feignMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 1,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择基础业务',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '代码风格',
-      labelTip: '选择不同底层实现的代码模版',
-      prop: 'codeStyle',
-      type: 'radio',
-      dicData: [
-        {
-          label: 'saber3',
-          value: 'saber3',
-        },
-        {
-          label: 'element-plus',
-          value: 'element-plus',
-        },
-      ],
-      value: 'saber3',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择代码风格',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '后端生成路径',
-      prop: 'apiPath',
-      span: 24,
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入后端生成路径',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '前端生成路径',
-      prop: 'webPath',
-      span: 24,
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入前端生成路径',
-          trigger: 'blur',
-        },
-      ],
-    },
-  ],
-};
+	labelWidth: 120,
+	column: [
+		{
+			label: '上级菜单',
+			prop: 'menuId',
+			type: 'tree',
+			dicData: [],
+			span: 24,
+			hide: true,
+			addDisabled: false,
+			props: {
+				label: 'title',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请选择上级菜单',
+					trigger: 'click',
+				},
+			],
+		},
+		{
+			label: '数据源',
+			prop: 'datasourceId',
+			search: true,
+			span: 24,
+			type: 'select',
+			dicUrl: '/blade-develop/datasource/select',
+			props: {
+				label: 'name',
+				value: 'id',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请选择数据源',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '物理表名',
+			prop: 'modelTable',
+			type: 'tree',
+			slot: true,
+			filterable: true,
+			span: 24,
+			display: true,
+			dicData: [],
+			props: {
+				label: 'comment',
+				value: 'name',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请输入数据库表名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '表单设计',
+			prop: 'modelForm',
+			type: 'select',
+			props: {
+				label: 'name',
+				value: 'id',
+			},
+			dicData: [],
+			filterable: true,
+			display: false,
+			span: 24,
+		},
+		{
+			label: '模型类名',
+			prop: 'modelClass',
+			display: false,
+			disabled: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入模型类名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模型编号',
+			prop: 'modelCode',
+			display: false,
+			rules: [
+				{
+					required: true,
+					message: '请输入模型编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '模块名',
+			prop: 'codeName',
+			display: false,
+			rules: [
+				{
+					required: true,
+					message: '请输入模块名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '表名',
+			prop: 'tableName',
+			display: false,
+			rules: [
+				{
+					required: true,
+					message: '请输入表名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '表前缀',
+			prop: 'tablePrefix',
+			display: false,
+			rules: [
+				{
+					required: true,
+					message: '请输入表前缀',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '主键名',
+			prop: 'pkName',
+			display: false,
+			rules: [
+				{
+					required: true,
+					message: '请输入主键名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '服务名',
+			prop: 'serviceName',
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入服务名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '包名',
+			prop: 'packageName',
+			overHidden: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入包名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '基础业务',
+			labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
+			prop: 'baseMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 2,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择基础业务',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '包装器',
+			labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
+			prop: 'wrapMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 2,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择包装器',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '远程调用',
+			labelTip: '配置是否使用Feign远程调用',
+			prop: 'feignMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 1,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择基础业务',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '代码风格',
+			labelTip: '选择不同底层实现的代码模版',
+			prop: 'codeStyle',
+			type: 'radio',
+			dicData: [
+				{
+					label: 'saber3',
+					value: 'saber3',
+				},
+				{
+					label: 'element-plus',
+					value: 'element-plus',
+				},
+			],
+			value: 'saber3',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择代码风格',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '后端生成路径',
+			prop: 'apiPath',
+			span: 24,
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入后端生成路径',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '前端生成路径',
+			prop: 'webPath',
+			span: 24,
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入前端生成路径',
+					trigger: 'blur',
+				},
+			],
+		},
+	],
+}
diff --git a/src/option/tool/codesetting.js b/src/option/tool/codesetting.js
index 2d53d2c..b71966a 100644
--- a/src/option/tool/codesetting.js
+++ b/src/option/tool/codesetting.js
@@ -1,229 +1,229 @@
 export default {
-  height: 'auto',
-  calcHeight: 50,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 6,
-  border: true,
-  index: true,
-  viewBtn: true,
-  grid: true,
-  selection: true,
-  labelWidth: 120,
-  searchLabelWidth: 100,
-  menuWidth: 320,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '配置名称',
-      labelTip: '用于定义本配置的代表名称,实际不参与代码生成',
-      prop: 'name',
-      gridRow: true,
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入配置名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '配置编号',
-      labelTip: '用于定义本配置的代表编号,实际不参与代码生成',
-      prop: 'code',
-      gridRow: true,
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入配置编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '上级菜单',
-      prop: 'menuId',
-      type: 'tree',
-      dicData: [],
-      span: 24,
-      hide: true,
-      addDisabled: false,
-      props: {
-        label: 'title',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请选择上级菜单',
-          trigger: 'click',
-        },
-      ],
-    },
-    {
-      label: '是否启用',
-      prop: 'status',
-      span: 24,
-      width: 85,
-      align: 'center',
-      slot: true,
-      gridRow: true,
-      addDisplay: false,
-      editDisplay: false,
-      viewDisplay: false,
-    },
-    {
-      label: '配置参数',
-      prop: 'settings',
-      display: false,
-      gridRow: true,
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入服务名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '服务名',
-      prop: 'serviceName',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入服务名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '包名',
-      prop: 'packageName',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入包名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '基础业务',
-      labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
-      prop: 'baseMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 2,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择基础业务',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '包装器',
-      labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
-      prop: 'wrapMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 2,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择包装器',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '远程调用',
-      labelTip: '配置是否使用Feign远程调用',
-      prop: 'feignMode',
-      type: 'radio',
-      dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-      props: {
-        label: 'dictValue',
-        value: 'dictKey',
-      },
-      value: 1,
-      dataType: 'number',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择基础业务',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '代码风格',
-      labelTip: '选择不同底层实现的代码模版',
-      prop: 'codeStyle',
-      type: 'radio',
-      dicData: [
-        {
-          label: 'saber3',
-          value: 'saber3',
-        },
-        {
-          label: 'element-plus',
-          value: 'element-plus',
-        },
-      ],
-      value: 'saber3',
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请选择代码风格',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '后端生成路径',
-      prop: 'apiPath',
-      span: 24,
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入后端生成路径',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '前端生成路径',
-      prop: 'webPath',
-      span: 24,
-      hide: true,
-      rules: [
-        {
-          required: true,
-          message: '请输入前端生成路径',
-          trigger: 'blur',
-        },
-      ],
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 50,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 6,
+	border: true,
+	index: true,
+	viewBtn: true,
+	grid: true,
+	selection: true,
+	labelWidth: 120,
+	searchLabelWidth: 100,
+	menuWidth: 320,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '配置名称',
+			labelTip: '用于定义本配置的代表名称,实际不参与代码生成',
+			prop: 'name',
+			gridRow: true,
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入配置名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '配置编号',
+			labelTip: '用于定义本配置的代表编号,实际不参与代码生成',
+			prop: 'code',
+			gridRow: true,
+			search: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入配置编号',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '上级菜单',
+			prop: 'menuId',
+			type: 'tree',
+			dicData: [],
+			span: 24,
+			hide: true,
+			addDisabled: false,
+			props: {
+				label: 'title',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请选择上级菜单',
+					trigger: 'click',
+				},
+			],
+		},
+		{
+			label: '是否启用',
+			prop: 'status',
+			span: 24,
+			width: 85,
+			align: 'center',
+			slot: true,
+			gridRow: true,
+			addDisplay: false,
+			editDisplay: false,
+			viewDisplay: false,
+		},
+		{
+			label: '配置参数',
+			prop: 'settings',
+			display: false,
+			gridRow: true,
+			overHidden: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入服务名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '服务名',
+			prop: 'serviceName',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入服务名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '包名',
+			prop: 'packageName',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入包名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '基础业务',
+			labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
+			prop: 'baseMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 2,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择基础业务',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '包装器',
+			labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
+			prop: 'wrapMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 2,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择包装器',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '远程调用',
+			labelTip: '配置是否使用Feign远程调用',
+			prop: 'feignMode',
+			type: 'radio',
+			dicUrl: '/blade-system/dict/dictionary?code=yes_no',
+			props: {
+				label: 'dictValue',
+				value: 'dictKey',
+			},
+			value: 1,
+			dataType: 'number',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择基础业务',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '代码风格',
+			labelTip: '选择不同底层实现的代码模版',
+			prop: 'codeStyle',
+			type: 'radio',
+			dicData: [
+				{
+					label: 'saber3',
+					value: 'saber3',
+				},
+				{
+					label: 'element-plus',
+					value: 'element-plus',
+				},
+			],
+			value: 'saber3',
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请选择代码风格',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '后端生成路径',
+			prop: 'apiPath',
+			span: 24,
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入后端生成路径',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '前端生成路径',
+			prop: 'webPath',
+			span: 24,
+			hide: true,
+			rules: [
+				{
+					required: true,
+					message: '请输入前端生成路径',
+					trigger: 'blur',
+				},
+			],
+		},
+	],
+}
diff --git a/src/option/tool/formsetting.js b/src/option/tool/formsetting.js
index 9fb0b62..038ff49 100644
--- a/src/option/tool/formsetting.js
+++ b/src/option/tool/formsetting.js
@@ -1,95 +1,95 @@
 export default {
-  height: 'auto',
-  calcHeight: 50,
-  tip: false,
-  searchShow: true,
-  searchMenuSpan: 6,
-  border: true,
-  index: true,
-  viewBtn: true,
-  grid: true,
-  selection: true,
-  labelWidth: 120,
-  searchLabelWidth: 100,
-  menuWidth: 320,
-  dialogWidth: 500,
-  dialogClickModal: false,
-  column: [
-    {
-      label: '数据源',
-      labelTip: '数据源管理配置的数据源列表',
-      prop: 'datasourceId',
-      hide: true,
-      editDisplay: false,
-      viewDisplay: false,
-      span: 24,
-      type: 'select',
-      dicUrl: '/blade-develop/datasource/select',
-      props: {
-        label: 'name',
-        value: 'id',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请选择数据源',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '物理表名',
-      labelTip: '从数据源列表选择的物理表名',
-      filterable: true,
-      prop: 'modelTable',
-      type: 'tree',
-      span: 24,
-      hide: true,
-      editDisplay: false,
-      viewDisplay: false,
-      dicData: [],
-      props: {
-        label: 'comment',
-        value: 'name',
-      },
-      rules: [
-        {
-          required: true,
-          message: '请输入数据库表名',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '表单名称',
-      labelTip: '用于定义本配置的代表名称,默认为数据库表说明',
-      prop: 'name',
-      gridRow: true,
-      search: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入表单名称',
-          trigger: 'blur',
-        },
-      ],
-    },
-    {
-      label: '关联表名',
-      labelTip: '用于定义本配置的代表编号,默认为数据库表名,在代码快速生成时会关联匹配',
-      prop: 'code',
-      gridRow: true,
-      search: true,
-      disabled: true,
-      span: 24,
-      rules: [
-        {
-          required: true,
-          message: '请输入表单编号',
-          trigger: 'blur',
-        },
-      ],
-    },
-  ],
-};
+	height: 'auto',
+	calcHeight: 50,
+	tip: false,
+	searchShow: true,
+	searchMenuSpan: 6,
+	border: true,
+	index: true,
+	viewBtn: true,
+	grid: true,
+	selection: true,
+	labelWidth: 120,
+	searchLabelWidth: 100,
+	menuWidth: 320,
+	dialogWidth: 500,
+	dialogClickModal: false,
+	column: [
+		{
+			label: '数据源',
+			labelTip: '数据源管理配置的数据源列表',
+			prop: 'datasourceId',
+			hide: true,
+			editDisplay: false,
+			viewDisplay: false,
+			span: 24,
+			type: 'select',
+			dicUrl: '/blade-develop/datasource/select',
+			props: {
+				label: 'name',
+				value: 'id',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请选择数据源',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '物理表名',
+			labelTip: '从数据源列表选择的物理表名',
+			filterable: true,
+			prop: 'modelTable',
+			type: 'tree',
+			span: 24,
+			hide: true,
+			editDisplay: false,
+			viewDisplay: false,
+			dicData: [],
+			props: {
+				label: 'comment',
+				value: 'name',
+			},
+			rules: [
+				{
+					required: true,
+					message: '请输入数据库表名',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '表单名称',
+			labelTip: '用于定义本配置的代表名称,默认为数据库表说明',
+			prop: 'name',
+			gridRow: true,
+			search: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入表单名称',
+					trigger: 'blur',
+				},
+			],
+		},
+		{
+			label: '关联表名',
+			labelTip: '用于定义本配置的代表编号,默认为数据库表名,在代码快速生成时会关联匹配',
+			prop: 'code',
+			gridRow: true,
+			search: true,
+			disabled: true,
+			span: 24,
+			rules: [
+				{
+					required: true,
+					message: '请输入表单编号',
+					trigger: 'blur',
+				},
+			],
+		},
+	],
+}
diff --git a/src/option/user/info.js b/src/option/user/info.js
index 77eae60..42be014 100644
--- a/src/option/user/info.js
+++ b/src/option/user/info.js
@@ -1,84 +1,84 @@
 export default {
-  tabs: true,
-  tabsActive: 1,
-  group: [
-    {
-      label: '个人信息',
-      prop: 'info',
-      column: [
-        {
-          label: '头像',
-          type: 'upload',
-          listType: 'picture-img',
-          propsHttp: {
-            res: 'data',
-            url: 'link',
-          },
-          action: '/blade-resource/oss/endpoint/put-file',
-          tip: '只能上传jpg/png用户头像,且不超过500kb',
-          span: 12,
-          row: true,
-          prop: 'avatar',
-        },
-        {
-          prefixIcon: 'el-icon-bell',
-          label: '姓名',
-          span: 12,
-          row: true,
-          prop: 'realName',
-        },
-        {
-          prefixIcon: 'el-icon-user',
-          label: '用户名',
-          span: 12,
-          row: true,
-          prop: 'name',
-        },
-        {
-          prefixIcon: 'el-icon-iphone',
-          label: '手机号',
-          span: 12,
-          row: true,
-          prop: 'phone',
-        },
-        {
-          prefixIcon: 'el-icon-message',
-          label: '邮箱',
-          prop: 'email',
-          span: 12,
-          row: true,
-        },
-      ],
-    },
-    {
-      label: '修改密码',
-      prop: 'password',
-      column: [
-        {
-          prefixIcon: 'el-icon-lock',
-          label: '原密码',
-          span: 12,
-          row: true,
-          type: 'password',
-          prop: 'oldPassword',
-        },
-        {
-          prefixIcon: 'el-icon-lock',
-          label: '新密码',
-          span: 12,
-          row: true,
-          type: 'password',
-          prop: 'newPassword',
-        },
-        {
-          prefixIcon: 'el-icon-lock',
-          label: '确认密码',
-          span: 12,
-          row: true,
-          type: 'password',
-          prop: 'newPassword1',
-        },
-      ],
-    },
-  ],
-};
+	tabs: true,
+	tabsActive: 1,
+	group: [
+		{
+			label: '个人信息',
+			prop: 'info',
+			column: [
+				{
+					label: '头像',
+					type: 'upload',
+					listType: 'picture-img',
+					propsHttp: {
+						res: 'data',
+						url: 'link',
+					},
+					action: '/blade-resource/oss/endpoint/put-file',
+					tip: '只能上传jpg/png用户头像,且不超过500kb',
+					span: 12,
+					row: true,
+					prop: 'avatar',
+				},
+				{
+					prefixIcon: 'el-icon-bell',
+					label: '姓名',
+					span: 12,
+					row: true,
+					prop: 'realName',
+				},
+				{
+					prefixIcon: 'el-icon-user',
+					label: '用户名',
+					span: 12,
+					row: true,
+					prop: 'name',
+				},
+				{
+					prefixIcon: 'el-icon-iphone',
+					label: '手机号',
+					span: 12,
+					row: true,
+					prop: 'phone',
+				},
+				{
+					prefixIcon: 'el-icon-message',
+					label: '邮箱',
+					prop: 'email',
+					span: 12,
+					row: true,
+				},
+			],
+		},
+		{
+			label: '修改密码',
+			prop: 'password',
+			column: [
+				{
+					prefixIcon: 'el-icon-lock',
+					label: '原密码',
+					span: 12,
+					row: true,
+					type: 'password',
+					prop: 'oldPassword',
+				},
+				{
+					prefixIcon: 'el-icon-lock',
+					label: '新密码',
+					span: 12,
+					row: true,
+					type: 'password',
+					prop: 'newPassword',
+				},
+				{
+					prefixIcon: 'el-icon-lock',
+					label: '确认密码',
+					span: 12,
+					row: true,
+					type: 'password',
+					prop: 'newPassword1',
+				},
+			],
+		},
+	],
+}
diff --git a/src/permission.js b/src/permission.js
index cabf2b8..bb7604b 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -1,58 +1,58 @@
-import router from './router/';
-import store from './store';
-import { getToken } from '@/utils/auth';
-import NProgress from 'nprogress'; // progress bar
-import 'nprogress/nprogress.css'; // progress bar style
-NProgress.configure({ showSpinner: false });
-const lockPage = '/lock'; //锁屏页
+import router from './router/'
+import store from './store'
+import { getToken } from '@/utils/auth'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+NProgress.configure({ showSpinner: false })
+const lockPage = '/lock' //锁屏页
 router.beforeEach((to, from, next) => {
-  const meta = to.meta || {};
-  const isMenu = meta.menu === undefined ? to.query.menu : meta.menu;
-  store.commit('SET_IS_MENU', isMenu === undefined);
-  if (getToken()) {
-    if (store.getters.isLock && to.path !== lockPage) {
-      //如果系统激活锁屏,全部跳转到锁屏页
-      next({ path: lockPage });
-    } else if (to.path === '/login') {
-      //如果登录成功访问登录页跳转到主页
-      next({ path: '/' });
-    } else {
-      if (store.getters.token.length === 0) {
-        store.dispatch('FedLogOut').then(() => {
-          next({ path: '/login' });
-        });
-      } else {
-        const meta = to.meta || {};
-        const query = to.query || {};
-        if (meta.target) {
-          window.open(query.url.replace(/#/g, '&'));
-          return;
-        } else if (meta.isTab !== false) {
-          store.commit('ADD_TAG', {
-            name: query.name || to.name,
-            path: to.path,
-            fullPath: to.path,
-            params: to.params,
-            query: to.query,
-            meta: meta,
-          });
-        }
-        next();
-      }
-    }
-  } else {
-    //判断是否需要认证,没有登录访问去登录页
-    if (meta.isAuth === false) {
-      next();
-    } else {
-      next('/login');
-    }
-  }
-});
+	const meta = to.meta || {}
+	const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
+	store.commit('SET_IS_MENU', isMenu === undefined)
+	if (getToken()) {
+		if (store.getters.isLock && to.path !== lockPage) {
+			//如果系统激活锁屏,全部跳转到锁屏页
+			next({ path: lockPage })
+		} else if (to.path === '/login') {
+			//如果登录成功访问登录页跳转到主页
+			next({ path: '/' })
+		} else {
+			if (store.getters.token.length === 0) {
+				store.dispatch('FedLogOut').then(() => {
+					next({ path: '/login' })
+				})
+			} else {
+				const meta = to.meta || {}
+				const query = to.query || {}
+				if (meta.target) {
+					window.open(query.url.replace(/#/g, '&'))
+					return
+				} else if (meta.isTab !== false) {
+					store.commit('ADD_TAG', {
+						name: query.name || to.name,
+						path: to.path,
+						fullPath: to.path,
+						params: to.params,
+						query: to.query,
+						meta: meta,
+					})
+				}
+				next()
+			}
+		}
+	} else {
+		//判断是否需要认证,没有登录访问去登录页
+		if (meta.isAuth === false) {
+			next()
+		} else {
+			next('/login')
+		}
+	}
+})
 
 router.afterEach(to => {
-  NProgress.done();
-  let title = router.$avueRouter.generateTitle(to, { label: 'name' });
-  router.$avueRouter.setTitle(title);
-  store.commit('SET_IS_SEARCH', false);
-});
+	NProgress.done()
+	let title = router.$avueRouter.generateTitle(to, { label: 'name' })
+	router.$avueRouter.setTitle(title)
+	store.commit('SET_IS_SEARCH', false)
+})
diff --git a/src/router/avue-router.js b/src/router/avue-router.js
index 4797812..e0fa674 100644
--- a/src/router/avue-router.js
+++ b/src/router/avue-router.js
@@ -1,171 +1,171 @@
-import website from '@/config/website';
+import website from '@/config/website'
 
-const modules = import.meta.glob('../**/**/*.vue');
+const modules = import.meta.glob('../**/**/*.vue')
 
 function isURL(s) {
-  return /^http[s]?:\/\/.*/.test(s);
+	return /^http[s]?:\/\/.*/.test(s)
 }
 
 let RouterPlugin = function () {
-  this.$router = null;
-  this.$store = null;
-};
+	this.$router = null
+	this.$store = null
+}
 RouterPlugin.install = function (option = {}) {
-  this.$router = option.router;
-  this.$store = option.store;
-  let i18n = option.i18n.global;
-  this.$router.$avueRouter = {
-    safe: this,
-    // 设置标题
-    setTitle: title => {
-      const defaultTitle = i18n.t('title');
-      title = title ? `${title} | ${defaultTitle}` : defaultTitle;
-      document.title = title;
-    },
-    closeTag: value => {
-      let tag = value || this.$store.getters.tag;
-      if (typeof value === 'string') {
-        tag = this.$store.getters.tagList.find(ele => ele.fullPath === value);
-      }
-      this.$store.commit('DEL_TAG', tag);
-    },
-    generateTitle: (item, props = {}) => {
-      let query = item[props.query || 'query'] || {};
-      let title = query.name || item[props.label || 'label'];
-      let meta = item[props.meta || 'meta'] || {};
-      let key = meta.i18n;
-      if (key) {
-        const hasKey = i18n.te('route.' + key);
-        if (hasKey) return i18n.t('route.' + key);
-      }
-      return title ? title.split(',')[0] : title;
-    },
-    //动态路由
-    formatRoutes: function (aMenu = [], first) {
-      const aRouter = [];
-      const propsDefault = website.menu;
+	this.$router = option.router
+	this.$store = option.store
+	let i18n = option.i18n.global
+	this.$router.$avueRouter = {
+		safe: this,
+		// 设置标题
+		setTitle: title => {
+			const defaultTitle = i18n.t('title')
+			title = title ? `${title} | ${defaultTitle}` : defaultTitle
+			document.title = title
+		},
+		closeTag: value => {
+			let tag = value || this.$store.getters.tag
+			if (typeof value === 'string') {
+				tag = this.$store.getters.tagList.find(ele => ele.fullPath === value)
+			}
+			this.$store.commit('DEL_TAG', tag)
+		},
+		generateTitle: (item, props = {}) => {
+			let query = item[props.query || 'query'] || {}
+			let title = query.name || item[props.label || 'label']
+			let meta = item[props.meta || 'meta'] || {}
+			let key = meta.i18n
+			if (key) {
+				const hasKey = i18n.te('route.' + key)
+				if (hasKey) return i18n.t('route.' + key)
+			}
+			return title ? title.split(',')[0] : title
+		},
+		//动态路由
+		formatRoutes: function (aMenu = [], first) {
+			const aRouter = []
+			const propsDefault = website.menu
 
-      if (aMenu && aMenu.length === 0) return;
-      for (let i = 0; i < aMenu.length; i++) {
-        const oMenu = aMenu[i];
-        let path = oMenu[propsDefault.path],
-          isComponent = true,
-          component = oMenu.component,
-          name = oMenu[propsDefault.label] + ',' + oMenu.id,
-          icon = oMenu[propsDefault.icon],
-          children = oMenu[propsDefault.children],
-          query = oMenu[propsDefault.query],
-          meta = oMenu[propsDefault.meta];
-        if (option.keepAlive) {
-          meta.keepAlive = option.keepAlive;
-        }
-        const isChild = !!(children && children.length !== 0);
-        const oRouter = {
-          path: path,
-          component: (() => {
-            // 判断是否为首路由
-            if (first) {
-              return modules[
-                option.store.getters.isMacOs || !website.setting.menu
-                  ? '../page/index/layout.vue'
-                  : '../page/index/index.vue'
-              ];
-              // 判断是否为多层路由
-            } else if (isChild && !first) {
-              return modules['../page/index/layout.vue'];
-              // 判断是否为最终的页面视图
-            } else {
-              let result = modules[`../${component}.vue`];
-              if (result) result().then(mod => (mod.default.name = path));
-              else {
-                isComponent = false;
-              }
-              return result;
-            }
-          })(),
-          name,
-          icon,
-          meta,
-          query,
-          redirect: (() => {
-            if (!isChild && first) return `${path}`;
-            else return '';
-          })(),
-          // 处理是否为一级路由
-          children: !isChild
-            ? (() => {
-                if (first) {
-                  oMenu[propsDefault.path] = `${path}`;
-                  let result = modules[`../${component}.vue`];
-                  if (result) result().then(mod => (mod.default.name = path));
-                  else {
-                    isComponent = false;
-                  }
-                  return [
-                    {
-                      component: result,
-                      icon: icon,
-                      name: name,
-                      meta: meta,
-                      query: query,
-                      path: '',
-                    },
-                  ];
-                }
-                return [];
-              })()
-            : (() => {
-                return this.formatRoutes(children, false);
-              })(),
-        };
-        if (!isURL(path) && isComponent) aRouter.push(oRouter);
-      }
-      if (first) {
-        aRouter.forEach(ele => this.safe.$router.addRoute(ele));
-      } else {
-        return aRouter;
-      }
-    },
-  };
-};
+			if (aMenu && aMenu.length === 0) return
+			for (let i = 0; i < aMenu.length; i++) {
+				const oMenu = aMenu[i]
+				let path = oMenu[propsDefault.path],
+					isComponent = true,
+					component = oMenu.component,
+					name = oMenu[propsDefault.label] + ',' + oMenu.id,
+					icon = oMenu[propsDefault.icon],
+					children = oMenu[propsDefault.children],
+					query = oMenu[propsDefault.query],
+					meta = oMenu[propsDefault.meta]
+				if (option.keepAlive) {
+					meta.keepAlive = option.keepAlive
+				}
+				const isChild = !!(children && children.length !== 0)
+				const oRouter = {
+					path: path,
+					component: (() => {
+						// 判断是否为首路由
+						if (first) {
+							return modules[
+								option.store.getters.isMacOs || !website.setting.menu
+									? '../page/index/layout.vue'
+									: '../page/index/index.vue'
+							]
+							// 判断是否为多层路由
+						} else if (isChild && !first) {
+							return modules['../page/index/layout.vue']
+							// 判断是否为最终的页面视图
+						} else {
+							let result = modules[`../${component}.vue`]
+							if (result) result().then(mod => (mod.default.name = path))
+							else {
+								isComponent = false
+							}
+							return result
+						}
+					})(),
+					name,
+					icon,
+					meta,
+					query,
+					redirect: (() => {
+						if (!isChild && first) return `${path}`
+						else return ''
+					})(),
+					// 处理是否为一级路由
+					children: !isChild
+						? (() => {
+								if (first) {
+									oMenu[propsDefault.path] = `${path}`
+									let result = modules[`../${component}.vue`]
+									if (result) result().then(mod => (mod.default.name = path))
+									else {
+										isComponent = false
+									}
+									return [
+										{
+											component: result,
+											icon: icon,
+											name: name,
+											meta: meta,
+											query: query,
+											path: '',
+										},
+									]
+								}
+								return []
+						  })()
+						: (() => {
+								return this.formatRoutes(children, false)
+						  })(),
+				}
+				if (!isURL(path) && isComponent) aRouter.push(oRouter)
+			}
+			if (first) {
+				aRouter.forEach(ele => this.safe.$router.addRoute(ele))
+			} else {
+				return aRouter
+			}
+		},
+	}
+}
 export const formatPath = (ele, first) => {
-  const propsDefault = website.menu;
-  const icon = ele[propsDefault.icon];
-  ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon;
-  ele.meta = {
-    keepAlive: ele.isOpen === 2,
-  };
-  const iframeComponent = 'components/iframe/main';
-  const iframeSrc = href => {
-    return href.replace(/&/g, '#');
-  };
-  const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0);
-  if (!isChild && first) {
-    ele.component = 'views' + ele[propsDefault.path];
-    if (isURL(ele[propsDefault.href])) {
-      let href = ele[propsDefault.href];
-      ele.component = iframeComponent;
-      ele[propsDefault.query] = {
-        url: iframeSrc(href),
-      };
-    }
-  } else {
-    ele[propsDefault.children] &&
-      ele[propsDefault.children].forEach(child => {
-        child.component = 'views' + child[propsDefault.path];
-        child.meta = {
-          keepAlive: child.isOpen === 2,
-        };
-        if (isURL(child[propsDefault.href])) {
-          let href = child[propsDefault.href];
-          child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code;
-          child.component = iframeComponent;
-          child[propsDefault.query] = {
-            url: iframeSrc(href),
-          };
-        }
-        formatPath(child);
-      });
-  }
-};
-export default RouterPlugin;
+	const propsDefault = website.menu
+	const icon = ele[propsDefault.icon]
+	ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon
+	ele.meta = {
+		keepAlive: ele.isOpen === 2,
+	}
+	const iframeComponent = 'components/iframe/main'
+	const iframeSrc = href => {
+		return href.replace(/&/g, '#')
+	}
+	const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0)
+	if (!isChild && first) {
+		ele.component = 'views' + ele[propsDefault.path]
+		if (isURL(ele[propsDefault.href])) {
+			let href = ele[propsDefault.href]
+			ele.component = iframeComponent
+			ele[propsDefault.query] = {
+				url: iframeSrc(href),
+			}
+		}
+	} else {
+		ele[propsDefault.children] &&
+			ele[propsDefault.children].forEach(child => {
+				child.component = 'views' + child[propsDefault.path]
+				child.meta = {
+					keepAlive: child.isOpen === 2,
+				}
+				if (isURL(child[propsDefault.href])) {
+					let href = child[propsDefault.href]
+					child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code
+					child.component = iframeComponent
+					child[propsDefault.query] = {
+						url: iframeSrc(href),
+					}
+				}
+				formatPath(child)
+			})
+	}
+}
+export default RouterPlugin
diff --git a/src/router/index.js b/src/router/index.js
index 14a8359..f814696 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,34 +1,34 @@
-import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router';
-import PageRouter from './page/';
-import ViewsRouter from './views/';
-import AvueRouter from './avue-router';
-import i18n from '@/lang';
-import Store from '@/store/';
+import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'
+import PageRouter from './page/'
+import ViewsRouter from './views/'
+import AvueRouter from './avue-router'
+import i18n from '@/lang'
+import Store from '@/store/'
 //创建路由
 const Router = createRouter({
-  base: import.meta.env.VITE_APP_BASE,
-  history: createWebHashHistory(import.meta.env.VITE_APP_BASE),
-  routes: [...PageRouter, ...ViewsRouter],
-});
+	base: import.meta.env.VITE_APP_BASE,
+	history: createWebHashHistory(import.meta.env.VITE_APP_BASE),
+	routes: [...PageRouter, ...ViewsRouter],
+})
 AvueRouter.install({
-  store: Store,
-  router: Router,
-  i18n: i18n,
-});
+	store: Store,
+	router: Router,
+	i18n: i18n,
+})
 
-Router.$avueRouter.formatRoutes(Store.getters.menuAll, true);
+Router.$avueRouter.formatRoutes(Store.getters.menuAll, true)
 
 export function resetRouter() {
-  // 重置路由 比如用于身份验证失败,需要重新登录时 先清空当前的路有权限
-  const newRouter = createRouter({
-    history: createWebHashHistory(import.meta.env.VITE_APP_BASE),
-  });
-  Router.matcher = newRouter.matcher; // reset router
-  AvueRouter.install(Vue, {
-    router: Router,
-    store: Store,
-    i18n: i18n,
-  });
+	// 重置路由 比如用于身份验证失败,需要重新登录时 先清空当前的路有权限
+	const newRouter = createRouter({
+		history: createWebHashHistory(import.meta.env.VITE_APP_BASE),
+	})
+	Router.matcher = newRouter.matcher // reset router
+	AvueRouter.install(Vue, {
+		router: Router,
+		store: Store,
+		i18n: i18n,
+	})
 }
 
-export default Router;
+export default Router
diff --git a/src/router/page/index.js b/src/router/page/index.js
index a937446..09a943f 100644
--- a/src/router/page/index.js
+++ b/src/router/page/index.js
@@ -1,72 +1,69 @@
-import Store from '@/store/';
+import Store from '@/store/'
 
 export default [
-  {
-    path: '/login',
-    name: '登录页',
-    component: () =>
-      import('@/page/login/index.vue'),
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/oauth/redirect/:source',
-    name: '第三方登录',
-    component: () =>
-      import('@/page/login/index.vue'),
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/lock',
-    name: '锁屏页',
-    component: () =>
-      import('@/page/lock/index.vue'),
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/404',
-    component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/404.vue'),
-    name: '404',
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/403',
-    component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/403.vue'),
-    name: '403',
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/500',
-    component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/500.vue'),
-    name: '500',
-    meta: {
-      keepAlive: true,
-      isTab: false,
-      isAuth: false,
-    },
-  },
-  {
-    path: '/',
-    name: '主页',
-    redirect: '/index',
-  },
-];
+	{
+		path: '/login',
+		name: '登录页',
+		component: () => import('@/page/login/index.vue'),
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/oauth/redirect/:source',
+		name: '第三方登录',
+		component: () => import('@/page/login/index.vue'),
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/lock',
+		name: '锁屏页',
+		component: () => import('@/page/lock/index.vue'),
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/404',
+		component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/404.vue'),
+		name: '404',
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/403',
+		component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/403.vue'),
+		name: '403',
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/500',
+		component: () => import(/* webpackChunkName: "page" */ '@/components/error-page/500.vue'),
+		name: '500',
+		meta: {
+			keepAlive: true,
+			isTab: false,
+			isAuth: false,
+		},
+	},
+	{
+		path: '/',
+		name: '主页',
+		redirect: '/index',
+	},
+]
diff --git a/src/router/views/index.js b/src/router/views/index.js
index 500ca0f..b75a3e2 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -1,51 +1,55 @@
-import Index from '@/layout/index.vue';
-import Store from '@/store/';
-import Layout from '@/page/index/layout.vue';
+import Index from '@/layout/index.vue'
+import Store from '@/store/'
+import Layout from '@/page/index/layout.vue'
 
 export default [
-  {
-    path: '/',
-    component: () => import('@/layout/index.vue'),
-    redirect: '/index',
-    children: [
-      {
-        path: 'index',
-        name: '首页',
-        meta: {
-          i18n: 'dashboard',
-        },
-        component: () => import(/* webpackChunkName: "home" */ '@/views/Home/Home.vue'),
-      },
-      {
-        path: 'signMachineNest',
-        name: '单个机巢详情',
-        meta: {
-          i18n: 'dashboard',
-          menu: false,
-        },
-        component: () => import(/* webpackChunkName: "TaskManage" */ '@/views/SignMachineNest/SignMachineNest.vue'),
-      },
-      {
-        path: 'taskManage',
-        name: '任务管理',
-        meta: {
-          i18n: 'dashboard',
-          menu: false,
-        },
-        component: () => import(/* webpackChunkName: "TaskManage" */ '@/views/TaskManage/TaskManage.vue'),
-      },
-    ],
-  },
-  {
-    path: '/info',
-    component: () => import('@/layout/index.vue'),
-    redirect: '/info/index',
-    children: [
-      {
-        path: 'index',
-        name: '个人信息',
-        component: () => import('@/views/System/Userinfo.vue'),
-      },
-    ],
-  },
-];
+	{
+		path: '/',
+		component: () => import('@/layout/index.vue'),
+		redirect: '/index',
+		children: [
+			{
+				path: 'index',
+				name: '首页',
+				meta: {
+					i18n: 'dashboard',
+				},
+				component: () => import(/* webpackChunkName: "home" */ '@/views/Home/Home.vue'),
+			},
+			{
+				path: 'signMachineNest',
+				name: '单个机巢详情',
+				meta: {
+					i18n: 'dashboard',
+					menu: false,
+				},
+				component: () =>
+					import(
+						/* webpackChunkName: "TaskManage" */ '@/views/SignMachineNest/SignMachineNest.vue'
+					),
+			},
+			{
+				path: 'taskManage',
+				name: '任务管理',
+				meta: {
+					i18n: 'dashboard',
+					menu: false,
+				},
+				component: () =>
+					import(/* webpackChunkName: "TaskManage" */ '@/views/TaskManage/TaskManage.vue'),
+			},
+		],
+	},
+	{
+		path: '/info',
+		component: () => import('@/layout/index.vue'),
+		redirect: '/info/index',
+		children: [
+			{
+				path: 'index',
+				name: '个人信息',
+				component: () => import('@/views/System/Userinfo.vue'),
+			},
+		],
+	},
+]
diff --git a/src/store/getters.js b/src/store/getters.js
index 22252dc..ae01a4a 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -1,38 +1,38 @@
 const getters = {
-  tag: state => state.tags.tag,
-  language: state => state.common.language,
-  setting: state => state.common.setting,
-  userInfo: state => state.user.userInfo,
-  colorName: state => state.common.colorName,
-  themeName: state => state.common.themeName,
-  isMacOs: (state, getters) => getters.themeName === 'mac-os',
-  isRefresh: state => state.common.isRefresh,
-  isSearch: state => state.common.isSearch,
-  isHorizontal: state => state.common.setting.sidebar === 'horizontal',
-  isCollapse: state => state.common.isCollapse,
-  isLock: state => state.common.isLock,
-  isFullScren: state => state.common.isFullScren,
-  isMenu: state => state.common.isMenu,
-  lockPasswd: state => state.common.lockPasswd,
-  tagList: state => state.tags.tagList,
-  tagsKeep: (state, getters) => {
-    return getters.tagList
-      .filter(ele => {
-        return (ele.meta || {}).keepAlive;
-      })
-      .map(ele => ele.fullPath);
-  },
-  tagWel: state => state.tags.tagWel,
-  token: state => state.user.token,
-  roles: state => state.user.roles,
-  permission: state => state.user.permission,
-  menuId: state => state.user.menuId,
-  menu: state => state.user.menu,
-  menuAll: state => state.user.menuAll,
-  logsList: state => state.logs.logsList,
-  logsLen: state => state.logs.logsList.length || 0,
-  logsFlag: (state, getters) => getters.logsLen === 0,
-  flowRoutes: state => state.dict.flowRoutes,
-  singleUavHome: state => state.home.singleUavHome,
-};
-export default getters;
+	tag: state => state.tags.tag,
+	language: state => state.common.language,
+	setting: state => state.common.setting,
+	userInfo: state => state.user.userInfo,
+	colorName: state => state.common.colorName,
+	themeName: state => state.common.themeName,
+	isMacOs: (state, getters) => getters.themeName === 'mac-os',
+	isRefresh: state => state.common.isRefresh,
+	isSearch: state => state.common.isSearch,
+	isHorizontal: state => state.common.setting.sidebar === 'horizontal',
+	isCollapse: state => state.common.isCollapse,
+	isLock: state => state.common.isLock,
+	isFullScren: state => state.common.isFullScren,
+	isMenu: state => state.common.isMenu,
+	lockPasswd: state => state.common.lockPasswd,
+	tagList: state => state.tags.tagList,
+	tagsKeep: (state, getters) => {
+		return getters.tagList
+			.filter(ele => {
+				return (ele.meta || {}).keepAlive
+			})
+			.map(ele => ele.fullPath)
+	},
+	tagWel: state => state.tags.tagWel,
+	token: state => state.user.token,
+	roles: state => state.user.roles,
+	permission: state => state.user.permission,
+	menuId: state => state.user.menuId,
+	menu: state => state.user.menu,
+	menuAll: state => state.user.menuAll,
+	logsList: state => state.logs.logsList,
+	logsLen: state => state.logs.logsList.length || 0,
+	logsFlag: (state, getters) => getters.logsLen === 0,
+	flowRoutes: state => state.dict.flowRoutes,
+	singleUavHome: state => state.home.singleUavHome,
+}
+export default getters
diff --git a/src/store/index.js b/src/store/index.js
index dda64e4..fabcab1 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1,22 +1,22 @@
-import { createStore } from 'vuex';
-import user from './modules/user';
-import common from './modules/common';
-import tags from './modules/tags';
-import logs from './modules/logs';
-import dict from './modules/dict';
-import getters from './getters';
-import home from '@/store/modules/home';
+import { createStore } from 'vuex'
+import user from './modules/user'
+import common from './modules/common'
+import tags from './modules/tags'
+import logs from './modules/logs'
+import dict from './modules/dict'
+import getters from './getters'
+import home from '@/store/modules/home'
 
 const store = createStore({
-  modules: {
-    user,
-    common,
-    logs,
-    tags,
-    dict,
-    home,
-  },
-  getters,
-});
+	modules: {
+		user,
+		common,
+		logs,
+		tags,
+		dict,
+		home,
+	},
+	getters,
+})
 
-export default store;
+export default store
diff --git a/src/store/modules/common.js b/src/store/modules/common.js
index 327732f..f798337 100644
--- a/src/store/modules/common.js
+++ b/src/store/modules/common.js
@@ -1,93 +1,93 @@
-import { setStore, getStore, removeStore } from 'utils/store';
-import website from '@/config/website';
+import { setStore, getStore, removeStore } from 'utils/store'
+import website from '@/config/website'
 
 const common = {
-  state: {
-    language: getStore({ name: 'language' }) || 'zh-cn',
-    isCollapse: false,
-    isFullScren: false,
-    isMenu: true,
-    isSearch: false,
-    isRefresh: true,
-    isLock: getStore({ name: 'isLock' }),
-    colorName: getStore({ name: 'colorName' }) || '#2C77F1',
-    themeName: getStore({ name: 'themeName' }) || 'theme-go',
-    lockPasswd: getStore({ name: 'lockPasswd' }) || '',
-    website: website,
-    setting: website.setting,
-    // 地图设置
-    mapSetting: {
-      mode: 3, // 0为标准地图, 1为卫星地图
-      roadLine: true,
-      visual: '3D',
-      isDark: false,
-    },
-  },
-  mutations: {
-    SET_LANGUAGE: (state, language) => {
-      state.language = language;
-      setStore({
-        name: 'language',
-        content: state.language,
-      });
-    },
-    SET_COLLAPSE: state => {
-      state.isCollapse = !state.isCollapse;
-    },
-    SET_IS_MENU: (state, menu) => {
-      state.isMenu = menu;
-    },
-    SET_IS_REFRESH: (state, refresh) => {
-      state.isRefresh = refresh;
-    },
-    SET_IS_SEARCH: (state, search) => {
-      state.isSearch = search;
-    },
-    SET_FULLSCREN: state => {
-      state.isFullScren = !state.isFullScren;
-    },
-    SET_LOCK: state => {
-      state.isLock = true;
-      setStore({
-        name: 'isLock',
-        content: state.isLock,
-        type: 'session',
-      });
-    },
-    SET_COLOR_NAME: (state, colorName) => {
-      state.colorName = colorName;
-      setStore({
-        name: 'colorName',
-        content: state.colorName,
-      });
-    },
-    SET_THEME_NAME: (state, themeName) => {
-      state.themeName = themeName;
-      setStore({
-        name: 'themeName',
-        content: state.themeName,
-      });
-    },
-    SET_LOCK_PASSWD: (state, lockPasswd) => {
-      state.lockPasswd = lockPasswd;
-      setStore({
-        name: 'lockPasswd',
-        content: state.lockPasswd,
-        type: 'session',
-      });
-    },
-    CLEAR_LOCK: state => {
-      state.isLock = false;
-      state.lockPasswd = '';
-      removeStore({
-        name: 'lockPasswd',
-        type: 'session',
-      });
-      removeStore({
-        name: 'isLock',
-        type: 'session',
-      });
-    },
-  },
-};
-export default common;
+	state: {
+		language: getStore({ name: 'language' }) || 'zh-cn',
+		isCollapse: false,
+		isFullScren: false,
+		isMenu: true,
+		isSearch: false,
+		isRefresh: true,
+		isLock: getStore({ name: 'isLock' }),
+		colorName: getStore({ name: 'colorName' }) || '#2C77F1',
+		themeName: getStore({ name: 'themeName' }) || 'theme-go',
+		lockPasswd: getStore({ name: 'lockPasswd' }) || '',
+		website: website,
+		setting: website.setting,
+		// 地图设置
+		mapSetting: {
+			mode: 3, // 0为标准地图, 1为卫星地图
+			roadLine: true,
+			visual: '3D',
+			isDark: false,
+		},
+	},
+	mutations: {
+		SET_LANGUAGE: (state, language) => {
+			state.language = language
+			setStore({
+				name: 'language',
+				content: state.language,
+			})
+		},
+		SET_COLLAPSE: state => {
+			state.isCollapse = !state.isCollapse
+		},
+		SET_IS_MENU: (state, menu) => {
+			state.isMenu = menu
+		},
+		SET_IS_REFRESH: (state, refresh) => {
+			state.isRefresh = refresh
+		},
+		SET_IS_SEARCH: (state, search) => {
+			state.isSearch = search
+		},
+		SET_FULLSCREN: state => {
+			state.isFullScren = !state.isFullScren
+		},
+		SET_LOCK: state => {
+			state.isLock = true
+			setStore({
+				name: 'isLock',
+				content: state.isLock,
+				type: 'session',
+			})
+		},
+		SET_COLOR_NAME: (state, colorName) => {
+			state.colorName = colorName
+			setStore({
+				name: 'colorName',
+				content: state.colorName,
+			})
+		},
+		SET_THEME_NAME: (state, themeName) => {
+			state.themeName = themeName
+			setStore({
+				name: 'themeName',
+				content: state.themeName,
+			})
+		},
+		SET_LOCK_PASSWD: (state, lockPasswd) => {
+			state.lockPasswd = lockPasswd
+			setStore({
+				name: 'lockPasswd',
+				content: state.lockPasswd,
+				type: 'session',
+			})
+		},
+		CLEAR_LOCK: state => {
+			state.isLock = false
+			state.lockPasswd = ''
+			removeStore({
+				name: 'lockPasswd',
+				type: 'session',
+			})
+			removeStore({
+				name: 'isLock',
+				type: 'session',
+			})
+		},
+	},
+}
+export default common
diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js
index 69894ed..a7fdac5 100644
--- a/src/store/modules/dict.js
+++ b/src/store/modules/dict.js
@@ -1,36 +1,36 @@
-import { getStore, setStore } from '@/utils/store';
+import { getStore, setStore } from '@/utils/store'
 
-import { getDictionary } from '@/api/system/dict';
+import { getDictionary } from '@/api/system/dict'
 
 const dict = {
-  state: {
-    flowRoutes: getStore({ name: 'flowRoutes' }) || {},
-  },
-  actions: {
-    FlowRoutes({ commit }) {
-      return new Promise((resolve, reject) => {
-        getDictionary({ code: 'flow' })
-          .then(res => {
-            commit('SET_FLOW_ROUTES', res.data.data);
-            resolve();
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    },
-  },
-  mutations: {
-    SET_FLOW_ROUTES: (state, data) => {
-      state.flowRoutes = data.map(item => {
-        return {
-          routeKey: `${item.code}_${item.dictKey}`,
-          routeValue: item.remark,
-        };
-      });
-      setStore({ name: 'flowRoutes', content: state.flowRoutes });
-    },
-  },
-};
+	state: {
+		flowRoutes: getStore({ name: 'flowRoutes' }) || {},
+	},
+	actions: {
+		FlowRoutes({ commit }) {
+			return new Promise((resolve, reject) => {
+				getDictionary({ code: 'flow' })
+					.then(res => {
+						commit('SET_FLOW_ROUTES', res.data.data)
+						resolve()
+					})
+					.catch(error => {
+						reject(error)
+					})
+			})
+		},
+	},
+	mutations: {
+		SET_FLOW_ROUTES: (state, data) => {
+			state.flowRoutes = data.map(item => {
+				return {
+					routeKey: `${item.code}_${item.dictKey}`,
+					routeValue: item.remark,
+				}
+			})
+			setStore({ name: 'flowRoutes', content: state.flowRoutes })
+		},
+	},
+}
 
-export default dict;
+export default dict
diff --git a/src/store/modules/home.js b/src/store/modules/home.js
index 0a4e0c3..3c93ae4 100644
--- a/src/store/modules/home.js
+++ b/src/store/modules/home.js
@@ -1,4 +1,4 @@
-import { set } from "lodash";
+import { set } from 'lodash'
 import { EDeviceTypeName } from '@/utils/staticData/enums'
 
 const home = {
@@ -66,33 +66,32 @@
     },
     setDockOnfo: (state, info) => {
       if (Object.keys(info.host).length === 0) return
-  
-      if (!state.deviceState.dockInfo[info.sn]) {
-        state.deviceState.dockInfo[info.sn] = {}
-      }
-      state.deviceState.currentSn = info.sn
-      state.deviceState.currentType = EDeviceTypeName.Dock
-      const dock = state.deviceState.dockInfo[info.sn]
-      if (info.host.mode_code !== undefined) {
-        dock.basic_osd = info.host
-        state.deviceState.drone_charge_state_new =
-          dock.basic_osd.drone_charge_state
-        return
-      }
-      if (info.host.sdr) {
-        dock.link_osd = info.host
-        return
-      }
-      if (info.host.job_number !== undefined) {
-        dock.work_osd = info.host
-      }
-    },
-  },
-  getters:{
-    test(state) {
-      return state.singleUavHome.id.toString() + '65'
-    }
-  }
-};
 
-export default home;
+			if (!state.deviceState.dockInfo[info.sn]) {
+				state.deviceState.dockInfo[info.sn] = {}
+			}
+			state.deviceState.currentSn = info.sn
+			state.deviceState.currentType = EDeviceTypeName.Dock
+			const dock = state.deviceState.dockInfo[info.sn]
+			if (info.host.mode_code !== undefined) {
+				dock.basic_osd = info.host
+				state.deviceState.drone_charge_state_new = dock.basic_osd.drone_charge_state
+				return
+			}
+			if (info.host.sdr) {
+				dock.link_osd = info.host
+				return
+			}
+			if (info.host.job_number !== undefined) {
+				dock.work_osd = info.host
+			}
+		},
+	},
+	getters: {
+		test(state) {
+			return state.singleUavHome.id.toString() + '65'
+		},
+	},
+}
+
+export default home
diff --git a/src/store/modules/logs.js b/src/store/modules/logs.js
index b9d7d86..04734d6 100644
--- a/src/store/modules/logs.js
+++ b/src/store/modules/logs.js
@@ -1,49 +1,49 @@
-import { setStore, getStore } from 'utils/store';
-import dayjs from 'dayjs';
-import { sendLogs } from '@/api/user';
+import { setStore, getStore } from 'utils/store'
+import dayjs from 'dayjs'
+import { sendLogs } from '@/api/user'
 
 const logs = {
-  state: {
-    logsList: getStore({ name: 'logsList' }) || [],
-  },
-  actions: {
-    //发送错误日志
-    SendLogs({ state, commit }) {
-      return new Promise((resolve, reject) => {
-        sendLogs(state.logsList)
-          .then(() => {
-            commit('CLEAR_LOGS');
-            resolve();
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    },
-  },
-  mutations: {
-    ADD_LOGS: (state, { type, message, stack, info }) => {
-      state.logsList.push(
-        Object.assign(
-          {
-            url: window.location.href,
-            time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
-          },
-          {
-            type,
-            message,
-            stack,
-            info: info.toString(),
-          }
-        )
-      );
-      setStore({ name: 'logsList', content: state.logsList });
-    },
-    CLEAR_LOGS: state => {
-      state.logsList = [];
-      setStore({ name: 'logsList', content: state.logsList });
-    },
-  },
-};
+	state: {
+		logsList: getStore({ name: 'logsList' }) || [],
+	},
+	actions: {
+		//发送错误日志
+		SendLogs({ state, commit }) {
+			return new Promise((resolve, reject) => {
+				sendLogs(state.logsList)
+					.then(() => {
+						commit('CLEAR_LOGS')
+						resolve()
+					})
+					.catch(error => {
+						reject(error)
+					})
+			})
+		},
+	},
+	mutations: {
+		ADD_LOGS: (state, { type, message, stack, info }) => {
+			state.logsList.push(
+				Object.assign(
+					{
+						url: window.location.href,
+						time: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+					},
+					{
+						type,
+						message,
+						stack,
+						info: info.toString(),
+					}
+				)
+			)
+			setStore({ name: 'logsList', content: state.logsList })
+		},
+		CLEAR_LOGS: state => {
+			state.logsList = []
+			setStore({ name: 'logsList', content: state.logsList })
+		},
+	},
+}
 
-export default logs;
+export default logs
diff --git a/src/store/modules/tags.js b/src/store/modules/tags.js
index 1ec92a0..819c900 100644
--- a/src/store/modules/tags.js
+++ b/src/store/modules/tags.js
@@ -1,38 +1,38 @@
-import { setStore, getStore } from 'utils/store';
-import website from '@/config/website';
+import { setStore, getStore } from 'utils/store'
+import website from '@/config/website'
 
-const tagWel = website.fistPage;
+const tagWel = website.fistPage
 const navs = {
-  state: {
-    tagList: getStore({ name: 'tagList' }) || [],
-    tag: getStore({ name: 'tag' }) || {},
-    tagWel: tagWel,
-  },
-  mutations: {
-    ADD_TAG: (state, action) => {
-      if (typeof action.name == 'function') action.name = action.name(action.query);
-      state.tag = action;
-      setStore({ name: 'tag', content: state.tag });
-      if (state.tagList.some(ele => ele.fullPath == action.fullPath)) return;
-      state.tagList.push(action);
-      setStore({ name: 'tagList', content: state.tagList });
-    },
-    DEL_TAG: (state, action) => {
-      state.tagList = state.tagList.filter(item => {
-        return item.fullPath !== action.fullPath;
-      });
-      setStore({ name: 'tagList', content: state.tagList });
-    },
-    DEL_ALL_TAG: (state, tagList = []) => {
-      state.tagList = tagList;
-      setStore({ name: 'tagList', content: state.tagList });
-    },
-    DEL_TAG_OTHER: state => {
-      state.tagList = state.tagList.filter(item => {
-        return [state.tag.fullPath, website.fistPage.path].includes(item.fullPath);
-      });
-      setStore({ name: 'tagList', content: state.tagList });
-    },
-  },
-};
-export default navs;
+	state: {
+		tagList: getStore({ name: 'tagList' }) || [],
+		tag: getStore({ name: 'tag' }) || {},
+		tagWel: tagWel,
+	},
+	mutations: {
+		ADD_TAG: (state, action) => {
+			if (typeof action.name == 'function') action.name = action.name(action.query)
+			state.tag = action
+			setStore({ name: 'tag', content: state.tag })
+			if (state.tagList.some(ele => ele.fullPath == action.fullPath)) return
+			state.tagList.push(action)
+			setStore({ name: 'tagList', content: state.tagList })
+		},
+		DEL_TAG: (state, action) => {
+			state.tagList = state.tagList.filter(item => {
+				return item.fullPath !== action.fullPath
+			})
+			setStore({ name: 'tagList', content: state.tagList })
+		},
+		DEL_ALL_TAG: (state, tagList = []) => {
+			state.tagList = tagList
+			setStore({ name: 'tagList', content: state.tagList })
+		},
+		DEL_TAG_OTHER: state => {
+			state.tagList = state.tagList.filter(item => {
+				return [state.tag.fullPath, website.fistPage.path].includes(item.fullPath)
+			})
+			setStore({ name: 'tagList', content: state.tagList })
+		},
+	},
+}
+export default navs
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index de265d8..16ec216 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,401 +1,401 @@
-import { ELocalStorageKey } from '@/utils/http/enums';
+import { ELocalStorageKey } from '@/utils/http/enums'
 import {
-  setToken,
-  setRefreshToken,
-  removeToken,
-  removeRefreshToken,
-  getRefreshToken,
-} from '@/utils/auth';
-import { setStore, getStore } from '@/utils/store';
-import { validatenull } from '@/utils/validate';
-import { deepClone } from '@/utils/util';
+	setToken,
+	setRefreshToken,
+	removeToken,
+	removeRefreshToken,
+	getRefreshToken,
+} from '@/utils/auth'
+import { setStore, getStore } from '@/utils/store'
+import { validatenull } from '@/utils/validate'
+import { deepClone } from '@/utils/util'
 import {
-  loginByUsername,
-  loginBySocial,
-  loginBySso,
-  loginByPhone,
-  getUserInfo,
-  logout,
-  refreshToken,
-  getButtons,
-  registerUser,
-} from '@/api/user';
-import { getRoutes, getTopMenu } from '@/api/system/menu';
-import { formatPath } from '@/router/avue-router';
-import { ElMessage } from 'element-plus';
-import { encrypt } from '@/utils/sm2';
-import md5 from 'js-md5';
+	loginByUsername,
+	loginBySocial,
+	loginBySso,
+	loginByPhone,
+	getUserInfo,
+	logout,
+	refreshToken,
+	getButtons,
+	registerUser,
+} from '@/api/user'
+import { getRoutes, getTopMenu } from '@/api/system/menu'
+import { formatPath } from '@/router/avue-router'
+import { ElMessage } from 'element-plus'
+import { encrypt } from '@/utils/sm2'
+import md5 from 'js-md5'
 
 const userInfoData = getStore({ name: 'userInfo' }) || {}
 const user = {
-  state: {
-    // 当前选中的请求头
-    selectedAreaCode: userInfoData?.detail?.areaCode || '',
-    tenantId: getStore({ name: 'tenantId' }) || '',
-    userInfo: userInfoData,
-    permission: getStore({ name: 'permission' }) || {},
-    roles: [],
-    menuId: {},
-    menu: getStore({ name: 'menu' }) || [],
-    menuAll: getStore({ name: 'menuAll' }) || [],
-    token: getStore({ name: 'token' }) || '',
-    refreshToken: getStore({ name: 'refreshToken' }) || '',
-  },
-  actions: {
-    //根据用户名登录
-    LoginByUsername({ commit }, userInfo = {}) {
-      return new Promise((resolve, reject) => {
-        loginByUsername(
-          userInfo.tenantId,
-          userInfo.deptId,
-          userInfo.roleId,
-          userInfo.username,
-          md5(userInfo.password),
-          userInfo.type,
-          userInfo.key,
-          userInfo.code
-        )
-          .then(res => {
-            const data = res.data;
-            if (data.error_description) {
-              ElMessage({
-                message: data.error_description,
-                type: 'error',
-              });
-            } else {
-              commit('SET_TOKEN', data.access_token);
-              commit('SET_REFRESH_TOKEN', data.refresh_token);
-              commit('SET_TENANT_ID', data.tenant_id);
-              commit('SET_USER_INFO', data);
-              commit('DEL_ALL_TAG');
-              commit('CLEAR_LOCK');
-            }
-            resolve();
-          })
-          .catch(err => {
-            reject(err);
-          });
-      });
-    },
-    //根据第三方信息登录
-    LoginBySocial({ commit }, userInfo) {
-      return new Promise((resolve, reject) => {
-        loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state)
-          .then(res => {
-            const data = res.data;
-            if (data.error_description) {
-              ElMessage({
-                message: data.error_description,
-                type: 'error',
-              });
-            } else {
-              commit('SET_TOKEN', data.access_token);
-              commit('SET_REFRESH_TOKEN', data.refresh_token);
-              commit('SET_USER_INFO', data);
-              commit('SET_TENANT_ID', data.tenant_id);
-              commit('DEL_ALL_TAG');
-              commit('CLEAR_LOCK');
-            }
-            resolve();
-          })
-          .catch(err => {
-            reject(err);
-          });
-      });
-    },
-    //根据单点信息登录
-    LoginBySso({ commit }, userInfo) {
-      return new Promise((resolve, reject) => {
-        loginBySso(userInfo.state, userInfo.code)
-          .then(res => {
-            const data = res.data;
-            if (data.error_description) {
-              ElMessage({
-                message: data.error_description,
-                type: 'error',
-              });
-            } else {
-              commit('SET_TOKEN', data.access_token);
-              commit('SET_REFRESH_TOKEN', data.refresh_token);
-              commit('SET_USER_INFO', data);
-              commit('SET_TENANT_ID', data.tenant_id);
-              commit('DEL_ALL_TAG');
-              commit('CLEAR_LOCK');
-            }
-            resolve();
-          })
-          .catch(err => {
-            reject(err);
-          });
-      });
-    },
-    //根据手机信息登录
-    LoginByPhone({ commit }, userInfo) {
-      return new Promise((resolve, reject) => {
-        loginByPhone(
-          userInfo.tenantId,
-          encrypt(userInfo.phone),
-          userInfo.codeId,
-          userInfo.codeValue
-        )
-          .then(res => {
-            const data = res.data;
-            if (data.error_description) {
-              ElMessage({
-                message: data.error_description,
-                type: 'error',
-              });
-            } else {
-              commit('SET_TOKEN', data.access_token);
-              commit('SET_REFRESH_TOKEN', data.refresh_token);
-              commit('SET_USER_INFO', data);
-              commit('SET_TENANT_ID', data.tenant_id);
-              commit('DEL_ALL_TAG');
-              commit('CLEAR_LOCK');
-            }
-            resolve();
-          })
-          .catch(err => {
-            reject(err);
-          });
-      });
-    },
-    //用户注册
-    RegisterUser({ commit }, userInfo = {}) {
-      return new Promise((resolve, reject) => {
-        registerUser(
-          userInfo.tenantId,
-          userInfo.name,
-          userInfo.account,
-          encrypt(userInfo.password),
-          userInfo.phone,
-          userInfo.email
-        ).then(res => {
-          const data = res.data;
-          if (data.error_description) {
-            ElMessage({
-              message: data.error_description,
-              type: 'error',
-            });
-            reject(data.error_description);
-          } else {
-            commit('SET_TOKEN', data.access_token);
-            commit('SET_REFRESH_TOKEN', data.refresh_token);
-            commit('SET_USER_INFO', data);
-            commit('SET_TENANT_ID', data.tenant_id);
-            commit('DEL_ALL_TAG');
-            commit('CLEAR_LOCK');
-          }
-          resolve();
-        });
-      });
-    },
-    GetUserInfo({ commit }) {
-      return new Promise((resolve, reject) => {
-        getUserInfo()
-          .then(res => {
-            const data = res.data.data;
-            commit('SET_ROLES', data.roles);
-            resolve(data);
-          })
-          .catch(err => {
-            reject(err);
-          });
-      });
-    },
-    //刷新token
-    RefreshToken({ state, commit }, userInfo) {
-      return new Promise((resolve, reject) => {
-        refreshToken(
-          getRefreshToken(),
-          state.tenantId,
-          !validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id,
-          !validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id
-        )
-          .then(res => {
-            const data = res.data;
-            commit('SET_TOKEN', data.access_token);
-            commit('SET_REFRESH_TOKEN', data.refresh_token);
-            commit('SET_USER_INFO', data);
-            resolve();
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    },
-    // 登出
-    LogOut({ commit }) {
-      return new Promise((resolve, reject) => {
-        logout()
-          .then(() => {
-            commit('SET_TOKEN', '');
-            commit('SET_MENU_ALL_NULL', []);
-            commit('SET_MENU', []);
-            commit('SET_ROLES', []);
-            commit('DEL_ALL_TAG', []);
-            commit('CLEAR_LOCK');
-            removeToken();
-            removeRefreshToken();
-            removeToken();
-            resolve();
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    },
-    //注销session
-    FedLogOut({ commit }) {
-      return new Promise(resolve => {
-        commit('SET_TOKEN', '');
-        commit('SET_MENU_ALL_NULL', []);
-        commit('SET_MENU', []);
-        commit('SET_ROLES', []);
-        commit('DEL_ALL_TAG', []);
-        commit('CLEAR_LOCK');
-        removeToken();
-        removeRefreshToken();
-        removeToken();
-        resolve();
-      });
-    },
-    GetTopMenu() {
-      return new Promise(resolve => {
-        getTopMenu().then(res => {
-          const data = res.data.data || [];
-          resolve(data);
-        });
-      });
-    },
-    GetMenu({ commit, dispatch }, tenantId) {
-      return new Promise(resolve => {
-        getRoutes(tenantId).then(res => {
-          const data = res.data.data;
-          let menu = deepClone(data);
-          menu.forEach(ele => formatPath(ele, true));
-          commit('SET_MENU', menu);
-          commit('SET_MENU_ALL', menu);
-          dispatch('GetButtons');
-          resolve(menu);
-        });
-      });
-    },
-    GetButtons({ commit }) {
-      return new Promise(resolve => {
-        getButtons().then(res => {
-          const data = res.data.data;
-          commit('SET_PERMISSION', data);
-          resolve();
-        });
-      });
-    },
-  },
-  mutations: {
-    setSelectedAreaCode:(state, code) =>{
-      state.selectedAreaCode = code
-    },
-    SET_TOKEN: (state, token) => {
-      setToken(token);
-      state.token = token;
-      setStore({ name: 'token', content: state.token });
-      console.log('顶顶顶111',token)
-      window.localStorage.setItem(ELocalStorageKey.Token, token);
-    },
-    SET_REFRESH_TOKEN: (state, refreshToken) => {
-      setRefreshToken(refreshToken);
-      state.refreshToken = refreshToken;
-      setStore({ name: 'refreshToken', content: state.refreshToken });
-    },
-    SET_MENU_ID(state, menuId) {
-      state.menuId = menuId;
-    },
-    SET_TENANT_ID: (state, tenantId) => {
-      state.tenantId = tenantId;
-      setStore({ name: 'tenantId', content: state.tenantId });
-    },
-    SET_USER_INFO: (state, userInfo) => {
-      if (validatenull(userInfo.user_id) && validatenull(userInfo.account)) {
-        state.userInfo = { user_name: 'unauth', role_name: 'unauth', authority: 'unauth' };
-      } else {
-        if (validatenull(userInfo.avatar)) {
-          userInfo.avatar = '/img/bg/img-logo.png';
-        }
-        if (!validatenull(userInfo.role_name)) {
-          userInfo.roleName = userInfo.role_name;
-          userInfo.authority = userInfo.role_name;
-        }
-        if (!validatenull(userInfo.user_id)) {
-          userInfo.userId = userInfo.user_id;
-        }
-        if (!validatenull(userInfo.user_name)) {
-          userInfo.userName = userInfo.user_name;
-        }
-        if (!validatenull(userInfo.tenant_id)) {
-          userInfo.tenantId = userInfo.tenant_id;
-        }
-        if (!validatenull(userInfo.dept_id)) {
-          userInfo.deptId = userInfo.dept_id;
-        }
-        if (!validatenull(userInfo.role_id)) {
-          userInfo.roleId = userInfo.role_id;
-        }
-        if (!validatenull(userInfo.oauth_id)) {
-          userInfo.oauthId = userInfo.oauth_id;
-        }
-        userInfo.selectedAreaCode = userInfo?.detail?.areaCode || '';
-        state.userInfo = userInfo;
-      }
-      setStore({ name: 'userInfo', content: state.userInfo });
-    },
-    SET_MENU_ALL: (state, menuAll) => {
-      let menu = state.menuAll;
-      menuAll.forEach(ele => {
-        let index = menu.findIndex(item => item.path === ele.path);
-        if (index === -1) {
-          menu.push(ele);
-        } else {
-          menu[index] = ele;
-        }
-      });
-      state.menuAll = menu;
-      setStore({ name: 'menuAll', content: state.menuAll });
-    },
-    SET_MENU_ALL_NULL: state => {
-      state.menuAll = [];
-      setStore({ name: 'menuAll', content: state.menuAll });
-    },
-    SET_MENU: (state, menu) => {
-      state.menu = menu;
-      setStore({ name: 'menu', content: state.menu });
-    },
-    SET_ROLES: (state, roles) => {
-      state.roles = roles;
-    },
-    SET_PERMISSION: (state, permission) => {
-      let result = [];
+	state: {
+		// 当前选中的请求头
+		selectedAreaCode: userInfoData?.detail?.areaCode || '',
+		tenantId: getStore({ name: 'tenantId' }) || '',
+		userInfo: userInfoData,
+		permission: getStore({ name: 'permission' }) || {},
+		roles: [],
+		menuId: {},
+		menu: getStore({ name: 'menu' }) || [],
+		menuAll: getStore({ name: 'menuAll' }) || [],
+		token: getStore({ name: 'token' }) || '',
+		refreshToken: getStore({ name: 'refreshToken' }) || '',
+	},
+	actions: {
+		//根据用户名登录
+		LoginByUsername({ commit }, userInfo = {}) {
+			return new Promise((resolve, reject) => {
+				loginByUsername(
+					userInfo.tenantId,
+					userInfo.deptId,
+					userInfo.roleId,
+					userInfo.username,
+					md5(userInfo.password),
+					userInfo.type,
+					userInfo.key,
+					userInfo.code
+				)
+					.then(res => {
+						const data = res.data
+						if (data.error_description) {
+							ElMessage({
+								message: data.error_description,
+								type: 'error',
+							})
+						} else {
+							commit('SET_TOKEN', data.access_token)
+							commit('SET_REFRESH_TOKEN', data.refresh_token)
+							commit('SET_TENANT_ID', data.tenant_id)
+							commit('SET_USER_INFO', data)
+							commit('DEL_ALL_TAG')
+							commit('CLEAR_LOCK')
+						}
+						resolve()
+					})
+					.catch(err => {
+						reject(err)
+					})
+			})
+		},
+		//根据第三方信息登录
+		LoginBySocial({ commit }, userInfo) {
+			return new Promise((resolve, reject) => {
+				loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state)
+					.then(res => {
+						const data = res.data
+						if (data.error_description) {
+							ElMessage({
+								message: data.error_description,
+								type: 'error',
+							})
+						} else {
+							commit('SET_TOKEN', data.access_token)
+							commit('SET_REFRESH_TOKEN', data.refresh_token)
+							commit('SET_USER_INFO', data)
+							commit('SET_TENANT_ID', data.tenant_id)
+							commit('DEL_ALL_TAG')
+							commit('CLEAR_LOCK')
+						}
+						resolve()
+					})
+					.catch(err => {
+						reject(err)
+					})
+			})
+		},
+		//根据单点信息登录
+		LoginBySso({ commit }, userInfo) {
+			return new Promise((resolve, reject) => {
+				loginBySso(userInfo.state, userInfo.code)
+					.then(res => {
+						const data = res.data
+						if (data.error_description) {
+							ElMessage({
+								message: data.error_description,
+								type: 'error',
+							})
+						} else {
+							commit('SET_TOKEN', data.access_token)
+							commit('SET_REFRESH_TOKEN', data.refresh_token)
+							commit('SET_USER_INFO', data)
+							commit('SET_TENANT_ID', data.tenant_id)
+							commit('DEL_ALL_TAG')
+							commit('CLEAR_LOCK')
+						}
+						resolve()
+					})
+					.catch(err => {
+						reject(err)
+					})
+			})
+		},
+		//根据手机信息登录
+		LoginByPhone({ commit }, userInfo) {
+			return new Promise((resolve, reject) => {
+				loginByPhone(
+					userInfo.tenantId,
+					encrypt(userInfo.phone),
+					userInfo.codeId,
+					userInfo.codeValue
+				)
+					.then(res => {
+						const data = res.data
+						if (data.error_description) {
+							ElMessage({
+								message: data.error_description,
+								type: 'error',
+							})
+						} else {
+							commit('SET_TOKEN', data.access_token)
+							commit('SET_REFRESH_TOKEN', data.refresh_token)
+							commit('SET_USER_INFO', data)
+							commit('SET_TENANT_ID', data.tenant_id)
+							commit('DEL_ALL_TAG')
+							commit('CLEAR_LOCK')
+						}
+						resolve()
+					})
+					.catch(err => {
+						reject(err)
+					})
+			})
+		},
+		//用户注册
+		RegisterUser({ commit }, userInfo = {}) {
+			return new Promise((resolve, reject) => {
+				registerUser(
+					userInfo.tenantId,
+					userInfo.name,
+					userInfo.account,
+					encrypt(userInfo.password),
+					userInfo.phone,
+					userInfo.email
+				).then(res => {
+					const data = res.data
+					if (data.error_description) {
+						ElMessage({
+							message: data.error_description,
+							type: 'error',
+						})
+						reject(data.error_description)
+					} else {
+						commit('SET_TOKEN', data.access_token)
+						commit('SET_REFRESH_TOKEN', data.refresh_token)
+						commit('SET_USER_INFO', data)
+						commit('SET_TENANT_ID', data.tenant_id)
+						commit('DEL_ALL_TAG')
+						commit('CLEAR_LOCK')
+					}
+					resolve()
+				})
+			})
+		},
+		GetUserInfo({ commit }) {
+			return new Promise((resolve, reject) => {
+				getUserInfo()
+					.then(res => {
+						const data = res.data.data
+						commit('SET_ROLES', data.roles)
+						resolve(data)
+					})
+					.catch(err => {
+						reject(err)
+					})
+			})
+		},
+		//刷新token
+		RefreshToken({ state, commit }, userInfo) {
+			return new Promise((resolve, reject) => {
+				refreshToken(
+					getRefreshToken(),
+					state.tenantId,
+					!validatenull(userInfo) ? userInfo.deptId : state.userInfo.dept_id,
+					!validatenull(userInfo) ? userInfo.roleId : state.userInfo.role_id
+				)
+					.then(res => {
+						const data = res.data
+						commit('SET_TOKEN', data.access_token)
+						commit('SET_REFRESH_TOKEN', data.refresh_token)
+						commit('SET_USER_INFO', data)
+						resolve()
+					})
+					.catch(error => {
+						reject(error)
+					})
+			})
+		},
+		// 登出
+		LogOut({ commit }) {
+			return new Promise((resolve, reject) => {
+				logout()
+					.then(() => {
+						commit('SET_TOKEN', '')
+						commit('SET_MENU_ALL_NULL', [])
+						commit('SET_MENU', [])
+						commit('SET_ROLES', [])
+						commit('DEL_ALL_TAG', [])
+						commit('CLEAR_LOCK')
+						removeToken()
+						removeRefreshToken()
+						removeToken()
+						resolve()
+					})
+					.catch(error => {
+						reject(error)
+					})
+			})
+		},
+		//注销session
+		FedLogOut({ commit }) {
+			return new Promise(resolve => {
+				commit('SET_TOKEN', '')
+				commit('SET_MENU_ALL_NULL', [])
+				commit('SET_MENU', [])
+				commit('SET_ROLES', [])
+				commit('DEL_ALL_TAG', [])
+				commit('CLEAR_LOCK')
+				removeToken()
+				removeRefreshToken()
+				removeToken()
+				resolve()
+			})
+		},
+		GetTopMenu() {
+			return new Promise(resolve => {
+				getTopMenu().then(res => {
+					const data = res.data.data || []
+					resolve(data)
+				})
+			})
+		},
+		GetMenu({ commit, dispatch }, tenantId) {
+			return new Promise(resolve => {
+				getRoutes(tenantId).then(res => {
+					const data = res.data.data
+					let menu = deepClone(data)
+					menu.forEach(ele => formatPath(ele, true))
+					commit('SET_MENU', menu)
+					commit('SET_MENU_ALL', menu)
+					dispatch('GetButtons')
+					resolve(menu)
+				})
+			})
+		},
+		GetButtons({ commit }) {
+			return new Promise(resolve => {
+				getButtons().then(res => {
+					const data = res.data.data
+					commit('SET_PERMISSION', data)
+					resolve()
+				})
+			})
+		},
+	},
+	mutations: {
+		setSelectedAreaCode: (state, code) => {
+			state.selectedAreaCode = code
+		},
+		SET_TOKEN: (state, token) => {
+			setToken(token)
+			state.token = token
+			setStore({ name: 'token', content: state.token })
+			console.log('顶顶顶111', token)
+			window.localStorage.setItem(ELocalStorageKey.Token, token)
+		},
+		SET_REFRESH_TOKEN: (state, refreshToken) => {
+			setRefreshToken(refreshToken)
+			state.refreshToken = refreshToken
+			setStore({ name: 'refreshToken', content: state.refreshToken })
+		},
+		SET_MENU_ID(state, menuId) {
+			state.menuId = menuId
+		},
+		SET_TENANT_ID: (state, tenantId) => {
+			state.tenantId = tenantId
+			setStore({ name: 'tenantId', content: state.tenantId })
+		},
+		SET_USER_INFO: (state, userInfo) => {
+			if (validatenull(userInfo.user_id) && validatenull(userInfo.account)) {
+				state.userInfo = { user_name: 'unauth', role_name: 'unauth', authority: 'unauth' }
+			} else {
+				if (validatenull(userInfo.avatar)) {
+					userInfo.avatar = '/img/bg/img-logo.png'
+				}
+				if (!validatenull(userInfo.role_name)) {
+					userInfo.roleName = userInfo.role_name
+					userInfo.authority = userInfo.role_name
+				}
+				if (!validatenull(userInfo.user_id)) {
+					userInfo.userId = userInfo.user_id
+				}
+				if (!validatenull(userInfo.user_name)) {
+					userInfo.userName = userInfo.user_name
+				}
+				if (!validatenull(userInfo.tenant_id)) {
+					userInfo.tenantId = userInfo.tenant_id
+				}
+				if (!validatenull(userInfo.dept_id)) {
+					userInfo.deptId = userInfo.dept_id
+				}
+				if (!validatenull(userInfo.role_id)) {
+					userInfo.roleId = userInfo.role_id
+				}
+				if (!validatenull(userInfo.oauth_id)) {
+					userInfo.oauthId = userInfo.oauth_id
+				}
+				userInfo.selectedAreaCode = userInfo?.detail?.areaCode || ''
+				state.userInfo = userInfo
+			}
+			setStore({ name: 'userInfo', content: state.userInfo })
+		},
+		SET_MENU_ALL: (state, menuAll) => {
+			let menu = state.menuAll
+			menuAll.forEach(ele => {
+				let index = menu.findIndex(item => item.path === ele.path)
+				if (index === -1) {
+					menu.push(ele)
+				} else {
+					menu[index] = ele
+				}
+			})
+			state.menuAll = menu
+			setStore({ name: 'menuAll', content: state.menuAll })
+		},
+		SET_MENU_ALL_NULL: state => {
+			state.menuAll = []
+			setStore({ name: 'menuAll', content: state.menuAll })
+		},
+		SET_MENU: (state, menu) => {
+			state.menu = menu
+			setStore({ name: 'menu', content: state.menu })
+		},
+		SET_ROLES: (state, roles) => {
+			state.roles = roles
+		},
+		SET_PERMISSION: (state, permission) => {
+			let result = []
 
-      function getCode(list) {
-        list.forEach(ele => {
-          if (typeof ele === 'object') {
-            const children = ele.children;
-            const code = ele.code;
-            if (children && children.length > 0) {
-              getCode(children);
-            } else {
-              result.push(code);
-            }
-          }
-        });
-      }
+			function getCode(list) {
+				list.forEach(ele => {
+					if (typeof ele === 'object') {
+						const children = ele.children
+						const code = ele.code
+						if (children && children.length > 0) {
+							getCode(children)
+						} else {
+							result.push(code)
+						}
+					}
+				})
+			}
 
-      getCode(permission);
-      state.permission = {};
-      result.forEach(ele => {
-        state.permission[ele] = true;
-      });
-      setStore({ name: 'permission', content: state.permission, type: 'session' });
-    },
-  },
-};
-export default user;
+			getCode(permission)
+			state.permission = {}
+			result.forEach(ele => {
+				state.permission[ele] = true
+			})
+			setStore({ name: 'permission', content: state.permission, type: 'session' })
+		},
+	},
+}
+export default user
diff --git a/src/utils/auth.js b/src/utils/auth.js
index 123d7e5..72ce4cd 100644
--- a/src/utils/auth.js
+++ b/src/utils/auth.js
@@ -1,32 +1,32 @@
-import Cookies from 'js-cookie';
+import Cookies from 'js-cookie'
 
-const TokenKey = 'saber3-access-token';
-const RefreshTokenKey = 'saber3-refresh-token';
-const SessionId = 'JSESSIONID';
-const UserId = 'b-user-id';
+const TokenKey = 'saber3-access-token'
+const RefreshTokenKey = 'saber3-refresh-token'
+const SessionId = 'JSESSIONID'
+const UserId = 'b-user-id'
 
 export function getToken() {
-  return Cookies.get(TokenKey);
+	return Cookies.get(TokenKey)
 }
 
 export function setToken(token) {
-  return Cookies.set(TokenKey, token);
+	return Cookies.set(TokenKey, token)
 }
 
 export function getRefreshToken() {
-  return Cookies.get(RefreshTokenKey);
+	return Cookies.get(RefreshTokenKey)
 }
 
 export function setRefreshToken(token) {
-  return Cookies.set(RefreshTokenKey, token);
+	return Cookies.set(RefreshTokenKey, token)
 }
 
 export function removeToken() {
-  Cookies.remove(SessionId);
-  Cookies.remove(UserId);
-  return Cookies.remove(TokenKey);
+	Cookies.remove(SessionId)
+	Cookies.remove(UserId)
+	return Cookies.remove(TokenKey)
 }
 
 export function removeRefreshToken() {
-  return Cookies.remove(RefreshTokenKey);
+	return Cookies.remove(RefreshTokenKey)
 }
diff --git a/src/utils/cesium-tsa.js b/src/utils/cesium-tsa.js
index 06bb067..8e75522 100644
--- a/src/utils/cesium-tsa.js
+++ b/src/utils/cesium-tsa.js
@@ -1,1137 +1,1131 @@
-import * as Cesium from 'cesium';
-import AmapMercatorTilingScheme from './cesium/AmapMercatorTilingScheme/index';
-import store from '@/store';
-import { Terrain } from 'cesium';
-
+import * as Cesium from 'cesium'
+import AmapMercatorTilingScheme from './cesium/AmapMercatorTilingScheme/index'
+import store from '@/store'
+import { Terrain } from 'cesium'
 
 // vite env
-const { VITE_APP_BASE } = import.meta.env;
+const { VITE_APP_BASE } = import.meta.env
 
-
-window.CESIUM_BASE_URL = `${VITE_APP_BASE}cesiumPu`;
+window.CESIUM_BASE_URL = `${VITE_APP_BASE}cesiumPu`
 // 定义全局的viewer变量防止重复生成
-let viewer = null;
-let globalBaseMapLayers = [];
+let viewer = null
+let globalBaseMapLayers = []
 
-window.globalCesium = Cesium;
-window.$viewer = null;
+window.globalCesium = Cesium
+window.$viewer = null
 
-let customEntityDataSources = {};
+let customEntityDataSources = {}
 
-let customMapLayer = {};
+let customMapLayer = {}
 let handlerEvents = {
-  handler: null,
-};
+	handler: null,
+}
 
 export default function cesiumOperation() {
-  const TDT_Token = 'c6eea7dad4fa1e2d1e32ec0e7c9735db';
-  // 天地图地图
-  const TDT_IMG_C =
-    'https://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
-    '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
-    '&style=default&format=tiles&tk=' +
-    TDT_Token;
-  // 天地图注记
-  const TDT_ZJ =
-    'https://{s}.tianditu.gov.cn/cia_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
-    '&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
-    '&style=default&format=tiles&tk=' +
-    TDT_Token;
-  // 标准地图注记
-  const TID_STAND =
-    'https://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0' +
-    '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
-    '&style=default&format=tiles&tk=' +
-    TDT_Token;
-  // 天地图图层变量
-  const imageryProvider_tdt = new Cesium.WebMapTileServiceImageryProvider({
-    url: TDT_IMG_C,
-    layer: 'tdtImg_c',
-    style: 'default',
-    format: 'tiles',
-    tileMatrixSetID: 'c',
-    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
-    tilingScheme: new Cesium.GeographicTilingScheme(),
-    tileMatrixLabels: [
-      '1',
-      '2',
-      '3',
-      '4',
-      '5',
-      '6',
-      '7',
-      '8',
-      '9',
-      '10',
-      '11',
-      '12',
-      '13',
-      '14',
-      '15',
-      '16',
-      '17',
-      '18',
-      '19',
-    ],
-    maximumLevel: 17,
-  });
-  // 标准地图图层变量
-  const imageryProvider_stand = new Cesium.UrlTemplateImageryProvider({
-    url: 'https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
-    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
-    // format: 'image/jpeg',
-    // show: true,
-    maximumLevel: 18,
-    credit: 'stand_tc',
-  });
-  // 标准地图图层注解
-  const imageryProvider_standZh = new Cesium.UrlTemplateImageryProvider({
-    url: 'https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
-    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
-    maximumLevel: 18,
-    credit: 'stand_zj',
-  });
-  // 天地图中文注记加载
-  const annotation = new Cesium.WebMapTileServiceImageryProvider({
-    url: TDT_ZJ,
-    layer: 'tdtZwImg_c',
-    style: 'default',
-    format: 'tiles',
-    tileMatrixSetID: 'c',
-    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
-    tilingScheme: new Cesium.GeographicTilingScheme(),
-    tileMatrixLabels: [
-      '1',
-      '2',
-      '3',
-      '4',
-      '5',
-      '6',
-      '7',
-      '8',
-      '9',
-      '10',
-      '11',
-      '12',
-      '13',
-      '14',
-      '15',
-      '16',
-      '17',
-      '18',
-      '19',
-    ],
-    maximumLevel: 50,
-  });
+	const TDT_Token = 'c6eea7dad4fa1e2d1e32ec0e7c9735db'
+	// 天地图地图
+	const TDT_IMG_C =
+		'https://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
+		'&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
+		'&style=default&format=tiles&tk=' +
+		TDT_Token
+	// 天地图注记
+	const TDT_ZJ =
+		'https://{s}.tianditu.gov.cn/cia_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
+		'&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
+		'&style=default&format=tiles&tk=' +
+		TDT_Token
+	// 标准地图注记
+	const TID_STAND =
+		'https://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0' +
+		'&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
+		'&style=default&format=tiles&tk=' +
+		TDT_Token
+	// 天地图图层变量
+	const imageryProvider_tdt = new Cesium.WebMapTileServiceImageryProvider({
+		url: TDT_IMG_C,
+		layer: 'tdtImg_c',
+		style: 'default',
+		format: 'tiles',
+		tileMatrixSetID: 'c',
+		subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
+		tilingScheme: new Cesium.GeographicTilingScheme(),
+		tileMatrixLabels: [
+			'1',
+			'2',
+			'3',
+			'4',
+			'5',
+			'6',
+			'7',
+			'8',
+			'9',
+			'10',
+			'11',
+			'12',
+			'13',
+			'14',
+			'15',
+			'16',
+			'17',
+			'18',
+			'19',
+		],
+		maximumLevel: 17,
+	})
+	// 标准地图图层变量
+	const imageryProvider_stand = new Cesium.UrlTemplateImageryProvider({
+		url: 'https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
+		subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+		// format: 'image/jpeg',
+		// show: true,
+		maximumLevel: 18,
+		credit: 'stand_tc',
+	})
+	// 标准地图图层注解
+	const imageryProvider_standZh = new Cesium.UrlTemplateImageryProvider({
+		url: 'https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
+		subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+		maximumLevel: 18,
+		credit: 'stand_zj',
+	})
+	// 天地图中文注记加载
+	const annotation = new Cesium.WebMapTileServiceImageryProvider({
+		url: TDT_ZJ,
+		layer: 'tdtZwImg_c',
+		style: 'default',
+		format: 'tiles',
+		tileMatrixSetID: 'c',
+		subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
+		tilingScheme: new Cesium.GeographicTilingScheme(),
+		tileMatrixLabels: [
+			'1',
+			'2',
+			'3',
+			'4',
+			'5',
+			'6',
+			'7',
+			'8',
+			'9',
+			'10',
+			'11',
+			'12',
+			'13',
+			'14',
+			'15',
+			'16',
+			'17',
+			'18',
+			'19',
+		],
+		maximumLevel: 50,
+	})
 
-  // 高德地图图层变量
-  //高德矢量地图数据图层,自带注记
-  const imageryProvider_ammapSL = new Cesium.UrlTemplateImageryProvider({
-    url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
-    layer: 'tdtVecBasicLayer',
-    style: 'default',
-    format: 'image/png',
-    tileMatrixSetID: 'GoogleMapsCompatible',
-    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
-    maximumLevel: 18,
-    tilingScheme: new AmapMercatorTilingScheme(),
-    credit: 'amap_SL',
-  });
+	// 高德地图图层变量
+	//高德矢量地图数据图层,自带注记
+	const imageryProvider_ammapSL = new Cesium.UrlTemplateImageryProvider({
+		url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
+		layer: 'tdtVecBasicLayer',
+		style: 'default',
+		format: 'image/png',
+		tileMatrixSetID: 'GoogleMapsCompatible',
+		subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+		maximumLevel: 18,
+		tilingScheme: new AmapMercatorTilingScheme(),
+		credit: 'amap_SL',
+	})
 
-  //高德影像地图数据图层,自带注记
-  const imageryProvider_ammap = new Cesium.UrlTemplateImageryProvider({
-    url: 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
-    layer: 'tdtVecBasicLayer',
-    style: 'default',
-    format: 'image/png',
-    tileMatrixSetID: 'GoogleMapsCompatible',
-    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
-    maximumLevel: 18,
-    tilingScheme: new AmapMercatorTilingScheme(),
-    credit: 'amap_stand',
-  });
-  // 高德影像地图数据图层,注记
-  const imageryProvider_ammapBz = new Cesium.UrlTemplateImageryProvider({
-    url: 'https://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
-    tilingScheme: new AmapMercatorTilingScheme(),
-    minimumLevel: 3,
-  });
+	//高德影像地图数据图层,自带注记
+	const imageryProvider_ammap = new Cesium.UrlTemplateImageryProvider({
+		url: 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
+		layer: 'tdtVecBasicLayer',
+		style: 'default',
+		format: 'image/png',
+		tileMatrixSetID: 'GoogleMapsCompatible',
+		subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+		maximumLevel: 18,
+		tilingScheme: new AmapMercatorTilingScheme(),
+		credit: 'amap_stand',
+	})
+	// 高德影像地图数据图层,注记
+	const imageryProvider_ammapBz = new Cesium.UrlTemplateImageryProvider({
+		url: 'https://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
+		tilingScheme: new AmapMercatorTilingScheme(),
+		minimumLevel: 3,
+	})
 
-  Cesium.Ion.defaultAccessToken =
-    'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkMzg4MDk5YS05MWEzLTQ3NTYtOTYzNS04Yzk4MjU2MjI5N2YiLCJpZCI6MjE3OTM4LCJpYXQiOjE3MTY3NzIzOTR9.q1rzR7SRtIulQKTtJuv5HPUbp1av5E9RaOe-6voPDGc';
-  const _init = async id => {
-    const cesiumToken =
-      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkYTZlNGNlYS01NTU1LTQ1MGEtYmNlZS0yNTE2NDk5YWM2MjEiLCJpZCI6MTc5Njk2LCJpYXQiOjE3MDA1NDcwMjV9.qcl4AH2731cfFd0-I1ZLUINPXqvglLkDFD-UGR2zU5M';
-    Cesium.Ion.defaultAccessToken = cesiumToken;
-    Cesium.Camera.DEFAULT_VIEW_FACTOR = -0.45;
-    // 西南东北,默认显示中国
-    Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(66, 4, 135, 53.55);
-    viewer = new Cesium.Viewer(id, {
-      terrain: Terrain.fromWorldTerrain(),
-      infoBox: false, // 禁用沙箱,解决控制台报错
-      animation: false, // 左下角的动画仪表盘
-      baseLayerPicker: false, // 右上角的图层选择按钮
-      geocoder: false, // 搜索框
-      homeButton: false, // home按钮
-      sceneModePicker: false, // 模式切换按钮
-      timeline: false, // 底部的时间轴
-      navigationHelpButton: false, // 右上角的帮助按钮,
-      selectionIndicator: false, // 是否显示选择指示器
-      baseLayer: false,
-      fullscreenButton: false,
-    });
+	Cesium.Ion.defaultAccessToken =
+		'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkMzg4MDk5YS05MWEzLTQ3NTYtOTYzNS04Yzk4MjU2MjI5N2YiLCJpZCI6MjE3OTM4LCJpYXQiOjE3MTY3NzIzOTR9.q1rzR7SRtIulQKTtJuv5HPUbp1av5E9RaOe-6voPDGc'
+	const _init = async id => {
+		const cesiumToken =
+			'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkYTZlNGNlYS01NTU1LTQ1MGEtYmNlZS0yNTE2NDk5YWM2MjEiLCJpZCI6MTc5Njk2LCJpYXQiOjE3MDA1NDcwMjV9.qcl4AH2731cfFd0-I1ZLUINPXqvglLkDFD-UGR2zU5M'
+		Cesium.Ion.defaultAccessToken = cesiumToken
+		Cesium.Camera.DEFAULT_VIEW_FACTOR = -0.45
+		// 西南东北,默认显示中国
+		Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(66, 4, 135, 53.55)
+		viewer = new Cesium.Viewer(id, {
+			terrain: Terrain.fromWorldTerrain(),
+			infoBox: false, // 禁用沙箱,解决控制台报错
+			animation: false, // 左下角的动画仪表盘
+			baseLayerPicker: false, // 右上角的图层选择按钮
+			geocoder: false, // 搜索框
+			homeButton: false, // home按钮
+			sceneModePicker: false, // 模式切换按钮
+			timeline: false, // 底部的时间轴
+			navigationHelpButton: false, // 右上角的帮助按钮,
+			selectionIndicator: false, // 是否显示选择指示器
+			baseLayer: false,
+			fullscreenButton: false,
+		})
 
-    // viewer.scene.globe.depthTestAgainstTerrain = true;
+		// viewer.scene.globe.depthTestAgainstTerrain = true;
 
-    viewer.imageryLayers.removeAll();
+		viewer.imageryLayers.removeAll()
 
-    globalBaseMapLayers = [];
+		globalBaseMapLayers = []
 
-    viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
-      Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
-    ); // 禁用双击
-    viewer.scene.screenSpaceCameraController.minimumZoomDistance = 100;
-    viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000;
-    // viewer.scene.camera.setView({
-    //   destination: Cesium.Cartesian3.fromDegrees(115.856725497,28.624514734, 8000)
-    // });
-    // // 添加地形数据
+		viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
+			Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
+		) // 禁用双击
+		viewer.scene.screenSpaceCameraController.minimumZoomDistance = 100
+		viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000
+		// viewer.scene.camera.setView({
+		//   destination: Cesium.Cartesian3.fromDegrees(115.856725497,28.624514734, 8000)
+		// });
+		// // 添加地形数据
 
-    // viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
-    //   url: 'https://data.marsgis.cn/terrain',
-    // });
+		// viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
+		//   url: 'https://data.marsgis.cn/terrain',
+		// });
 
-    // viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
-    //   url: Cesium.IonResource.fromAssetId(1),
-    //   requestWaterMask: false,
-    //   requestVertexNormals: true,
-    // })
+		// viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
+		//   url: Cesium.IonResource.fromAssetId(1),
+		//   requestWaterMask: false,
+		//   requestVertexNormals: true,
+		// })
 
-    window.$viewer = viewer;
-    loadLAYER();
-  };
+		window.$viewer = viewer
+		loadLAYER()
+	}
 
-  const loadLAYER = () => {
-    let mapLayers = [];
+	const loadLAYER = () => {
+		let mapLayers = []
 
-    globalBaseMapLayers.length &&
-      globalBaseMapLayers.forEach(item => {
-        if (item.mapLayer) item.mapLayer.show = false;
-      });
+		globalBaseMapLayers.length &&
+			globalBaseMapLayers.forEach(item => {
+				if (item.mapLayer) item.mapLayer.show = false
+			})
 
+		// 高德影像地图数据图层
+		if (store.state.common.mapSetting.mode === 3) {
+			mapLayers.push(
+				...[
+					{ key: 'imageryProvider_ammap', layer: imageryProvider_ammap },
+					{ key: 'imageryProvider_ammapBz', layer: imageryProvider_ammapBz },
+				]
+			)
+		}
+		// 高德地图矢量图层加载
+		if (store.state.common.mapSetting.mode === 2) {
+			mapLayers.push({
+				key: 'imageryProvider_ammapSL',
+				layer: imageryProvider_ammapSL,
+			})
+		}
 
-    // 高德影像地图数据图层
-    if (store.state.common.mapSetting.mode === 3) {
-      mapLayers.push(
-        ...[
-          { key: 'imageryProvider_ammap', layer: imageryProvider_ammap },
-          { key: 'imageryProvider_ammapBz', layer: imageryProvider_ammapBz },
-        ]
-      );
-    }
-    // 高德地图矢量图层加载
-    if (store.state.common.mapSetting.mode === 2) {
-      mapLayers.push({
-        key: 'imageryProvider_ammapSL',
-        layer: imageryProvider_ammapSL,
-      });
-    }
+		// 标准地图加载
+		if (store.state.common.mapSetting.mode === 0) {
+			mapLayers.push(
+				...[
+					{ key: 'imageryProvider_standZh', layer: imageryProvider_standZh },
+					{ key: 'imageryProvider_stand', layer: imageryProvider_stand },
+				]
+			)
+		}
 
-    // 标准地图加载
-    if (store.state.common.mapSetting.mode === 0) {
-      mapLayers.push(
-        ...[
-          { key: 'imageryProvider_standZh', layer: imageryProvider_standZh },
-          { key: 'imageryProvider_stand', layer: imageryProvider_stand },
-        ]
-      );
-    }
+		// 路线图加载
+		if (
+			store.state.common.mapSetting.roadLine === true &&
+			store.state.common.mapSetting.mode === 1
+		) {
+			mapLayers.push({ key: 'annotation', layer: annotation })
+		}
 
-    // 路线图加载
-    if (
-      store.state.common.mapSetting.roadLine === true &&
-      store.state.common.mapSetting.mode === 1
-    ) {
-      mapLayers.push({ key: 'annotation', layer: annotation });
-    }
+		// 天地图图层加载
+		if (store.state.common.mapSetting.mode === 1) {
+			mapLayers.push({
+				key: 'imageryProvider_tdt',
+				layer: imageryProvider_tdt,
+			})
+		}
 
-    // 天地图图层加载
-    if (store.state.common.mapSetting.mode === 1) {
-      mapLayers.push({
-        key: 'imageryProvider_tdt',
-        layer: imageryProvider_tdt,
-      });
-    }
+		// 创建一个Set来快速查找array2中的id
+		let keyBaseMap = new Set(globalBaseMapLayers.map(item => item.key))
+		let keyMapLayers = new Set(mapLayers.map(item => item.key))
 
-    // 创建一个Set来快速查找array2中的id
-    let keyBaseMap = new Set(globalBaseMapLayers.map(item => item.key));
-    let keyMapLayers = new Set(mapLayers.map(item => item.key));
+		let keyExistBaseMap = mapLayers.filter(item => !keyBaseMap.has(item.key))
 
-    let keyExistBaseMap = mapLayers.filter(item => !keyBaseMap.has(item.key));
+		let keyNoExistBaseMap = globalBaseMapLayers.filter(item => keyMapLayers.has(item.key))
 
-    let keyNoExistBaseMap = globalBaseMapLayers.filter(item => keyMapLayers.has(item.key));
+		keyExistBaseMap.length &&
+			keyExistBaseMap.forEach(item => {
+				let curLayer = {
+					key: item.key,
+					mapLayer: viewer?.imageryLayers.addImageryProvider(item.layer),
+				}
 
-    keyExistBaseMap.length &&
-      keyExistBaseMap.forEach(item => {
-        let curLayer = {
-          key: item.key,
-          mapLayer: viewer?.imageryLayers.addImageryProvider(item.layer),
-        };
+				if (curLayer.mapLayer) curLayer.mapLayer.show = true
 
-        if (curLayer.mapLayer) curLayer.mapLayer.show = true;
+				viewer?.imageryLayers.lowerToBottom(curLayer.mapLayer)
 
-        viewer?.imageryLayers.lowerToBottom(curLayer.mapLayer);
+				globalBaseMapLayers.push(curLayer)
+			})
 
-        globalBaseMapLayers.push(curLayer);
-      });
+		keyNoExistBaseMap.length &&
+			keyNoExistBaseMap.forEach(item => {
+				if (item.mapLayer) item.mapLayer.show = true
 
-    keyNoExistBaseMap.length &&
-      keyNoExistBaseMap.forEach(item => {
-        if (item.mapLayer) item.mapLayer.show = true;
+				viewer?.imageryLayers.lowerToBottom(item.mapLayer)
+			})
+		// 2D/3D切换
+		switchModel(store.state.common.mapSetting.visual)
+	}
 
-        viewer?.imageryLayers.lowerToBottom(item.mapLayer);
-      });
-    // 2D/3D切换
-    switchModel(store.state.common.mapSetting.visual);
-  };
+	const addCustomLayers = (layerName, options) => {
+		if (options.type == 'arcgis') {
+			var imageryProvider = new Cesium.WebMapTileServiceImageryProvider({
+				url: options.src,
+				layer: options.title,
+				style: 'default',
+				format: 'image/png',
+				tileMatrixSetID: 'default',
+				tilingScheme: new Cesium.GeographicTilingScheme(),
+				tileMatrixLabels: [
+					'0',
+					'1',
+					'2',
+					'3',
+					'4',
+					'5',
+					'6',
+					'7',
+					'8',
+					'9',
+					'10',
+					'11',
+					'12',
+					'13',
+					'14',
+					'15',
+					'16',
+					'17',
+					'18',
+					'19',
+				],
+			})
 
-  const addCustomLayers = (layerName, options) => {
-    if (options.type == 'arcgis') {
-      var imageryProvider = new Cesium.WebMapTileServiceImageryProvider({
-        url: options.src,
-        layer: options.title,
-        style: 'default',
-        format: 'image/png',
-        tileMatrixSetID: 'default',
-        tilingScheme: new Cesium.GeographicTilingScheme(),
-        tileMatrixLabels: [
-          '0',
-          '1',
-          '2',
-          '3',
-          '4',
-          '5',
-          '6',
-          '7',
-          '8',
-          '9',
-          '10',
-          '11',
-          '12',
-          '13',
-          '14',
-          '15',
-          '16',
-          '17',
-          '18',
-          '19',
-        ],
-      });
+			customMapLayer[layerName] = viewer?.imageryLayers.addImageryProvider(imageryProvider)
 
-      customMapLayer[layerName] = viewer?.imageryLayers.addImageryProvider(imageryProvider);
+			// const layerProvider = new Cesium.ArcGisMapServerImageryProvider({
+			//   url: options.src,
+			//   tilingScheme: new Cesium.GeographicTilingScheme()
+			// })
+			// customMapLayer[layerName] = viewer?.imageryLayers.addImageryProvider(layerProvider)
+		}
+	}
 
-      // const layerProvider = new Cesium.ArcGisMapServerImageryProvider({
-      //   url: options.src,
-      //   tilingScheme: new Cesium.GeographicTilingScheme()
-      // })
-      // customMapLayer[layerName] = viewer?.imageryLayers.addImageryProvider(layerProvider)
-    }
-  };
+	const removeCustomLayers = (layerName = '') => {
+		if (layerName) {
+			if (customMapLayer[layerName]) {
+				viewer?.imageryLayers.remove(customMapLayer[layerName])
 
-  const removeCustomLayers = (layerName = '') => {
-    if (layerName) {
-      if (customMapLayer[layerName]) {
-        viewer?.imageryLayers.remove(customMapLayer[layerName]);
+				delete customMapLayer[layerName]
+			}
+		} else {
+			for (let k in customMapLayer) {
+				viewer?.imageryLayers.remove(customMapLayer[k])
+			}
 
-        delete customMapLayer[layerName];
-      }
-    } else {
-      for (let k in customMapLayer) {
-        viewer?.imageryLayers.remove(customMapLayer[k]);
-      }
+			customMapLayer = {}
+		}
+	}
 
-      customMapLayer = {};
-    }
-  };
+	// 切换不同背景图层
+	const patternMap = () => {
+		const imageryLayers = viewer?.scene.imageryLayers
+		// 切换为标准图层
+		if (store.state.common.mapSetting.mode === 0) {
+			const tdtImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtImg_c')
+			const tdtZwImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtZwImg_c')
+			viewer?.imageryLayers.remove(tdtImg_c)
+			viewer?.imageryLayers.remove(tdtZwImg_c)
+		} else {
+			const tdtStand_c = imageryLayers?._layers.find(
+				v => v.imageryProvider.credit?.html === 'stand_tc'
+			)
+			const tdtStand_zj = imageryLayers?._layers.find(
+				v => v.imageryProvider.credit?.html === 'stand_zj'
+			)
+			viewer?.imageryLayers.remove(tdtStand_c)
+			viewer?.imageryLayers.remove(tdtStand_zj)
+		}
+		loadLAYER()
+	}
 
-  // 切换不同背景图层
-  const patternMap = () => {
-    const imageryLayers = viewer?.scene.imageryLayers;
-    // 切换为标准图层
-    if (store.state.common.mapSetting.mode === 0) {
-      const tdtImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtImg_c');
-      const tdtZwImg_c = imageryLayers?._layers.find(
-        v => v.imageryProvider._layer === 'tdtZwImg_c'
-      );
-      viewer?.imageryLayers.remove(tdtImg_c);
-      viewer?.imageryLayers.remove(tdtZwImg_c);
-    } else {
-      const tdtStand_c = imageryLayers?._layers.find(
-        v => v.imageryProvider.credit?.html === 'stand_tc'
-      );
-      const tdtStand_zj = imageryLayers?._layers.find(
-        v => v.imageryProvider.credit?.html === 'stand_zj'
-      );
-      viewer?.imageryLayers.remove(tdtStand_c);
-      viewer?.imageryLayers.remove(tdtStand_zj);
-    }
-    loadLAYER();
-  };
+	// 生成或删除路网图层
+	const roadPattern = flag => {
+		if (store.state.common.mapSetting.mode === 0) return
+		const imageryLayers = viewer?.scene.imageryLayers
+		const tdtZwImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtZwImg_c')
+		if (!flag) {
+			viewer?.imageryLayers.remove(tdtZwImg_c)
+		} else {
+			viewer?.imageryLayers.addImageryProvider(annotation)
+		}
+	}
 
-  // 生成或删除路网图层
-  const roadPattern = flag => {
-    if (store.state.common.mapSetting.mode === 0) return;
-    const imageryLayers = viewer?.scene.imageryLayers;
-    const tdtZwImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtZwImg_c');
-    if (!flag) {
-      viewer?.imageryLayers.remove(tdtZwImg_c);
-    } else {
-      viewer?.imageryLayers.addImageryProvider(annotation);
-    }
-  };
+	// 二维三维切换
+	// 切换为二三维模式
+	const switchModel = type => {
+		switch (type) {
+			case '2D':
+				viewer?.scene.morphTo2D(0)
+				// viewer?.scene.camera.setView({
+				//   orientation: {
+				//     pitch: Cesium.Math.toRadians(-60),
+				//     heading: Cesium.Math.toRadians(0),
+				//   },
+				// });
+				break
+			case '3D':
+				viewer?.scene.morphTo3D(0)
+				// viewer?.scene.camera.setView({
+				//   orientation: {
+				//     pitch: Cesium.Math.toRadians(-90),
+				//     heading: Cesium.Math.toRadians(0),
+				//   },
+				// });
+				break
+			default:
+				break
+		}
+	}
 
-  // 二维三维切换
-  // 切换为二三维模式
-  const switchModel = type => {
-    switch (type) {
-      case '2D':
-        viewer?.scene.morphTo2D(0);
-        // viewer?.scene.camera.setView({
-        //   orientation: {
-        //     pitch: Cesium.Math.toRadians(-60),
-        //     heading: Cesium.Math.toRadians(0),
-        //   },
-        // });
-        break;
-      case '3D':
-        viewer?.scene.morphTo3D(0);
-        // viewer?.scene.camera.setView({
-        //   orientation: {
-        //     pitch: Cesium.Math.toRadians(-90),
-        //     heading: Cesium.Math.toRadians(0),
-        //   },
-        // });
-        break;
-      default:
-        break;
-    }
-  };
+	/**
+	 * @description: 地图暗黑模式切换
+	 * @param {*} viewer 地图实例
+	 * @param {*} options 配置项
+	 * @return {*}
+	 */
+	const darkMap = (viewer, isDark = false, options) => {
+		const defaultOptions = {
+			brightness: 1,
+			contrast: 1,
+			gamma: 1,
+			hue: 0,
+			saturation: 1,
+		}
 
-  /**
-   * @description: 地图暗黑模式切换
-   * @param {*} viewer 地图实例
-   * @param {*} options 配置项
-   * @return {*}
-   */
-  const darkMap = (viewer, isDark = false, options) => {
-    const defaultOptions = {
-      brightness: 1,
-      contrast: 1,
-      gamma: 1,
-      hue: 0,
-      saturation: 1,
-    };
+		!isDark && Object.assign(options, defaultOptions)
 
-    !isDark && Object.assign(options, defaultOptions);
+		const baseLayer = viewer.imageryLayers.get(0)
+		baseLayer.brightness = options.brightness || 0
+		baseLayer.contrast = options.contrast || 0
+		baseLayer.gamma = options.gamma || 2
+		baseLayer.hue = options.hue || 0
+		baseLayer.saturation = options.saturation || 0
 
-    const baseLayer = viewer.imageryLayers.get(0);
-    baseLayer.brightness = options.brightness || 0;
-    baseLayer.contrast = options.contrast || 0;
-    baseLayer.gamma = options.gamma || 2;
-    baseLayer.hue = options.hue || 0;
-    baseLayer.saturation = options.saturation || 0;
-
-    const baseFragShader = viewer.scene.globe._surfaceShaderSet.baseFragmentShaderSource.sources;
-    for (let i = 0; i < baseFragShader.length; i++) {
-      const strS = 'color = czm_saturation(color, textureSaturation);\n#endif\n';
-      let strT = 'color = czm_saturation(color, textureSaturation);\n#endif\n';
-      if (options.invertColor) {
-        strT += `
+		const baseFragShader = viewer.scene.globe._surfaceShaderSet.baseFragmentShaderSource.sources
+		for (let i = 0; i < baseFragShader.length; i++) {
+			const strS = 'color = czm_saturation(color, textureSaturation);\n#endif\n'
+			let strT = 'color = czm_saturation(color, textureSaturation);\n#endif\n'
+			if (options.invertColor) {
+				strT += `
         color.r = 1.0 - color.r;
         color.g = 1.0 - color.g;
         color.b = 1.0 - color.b;
-        `;
-      }
-      if (options.filterRGB.length > 0) {
-        strT += `
+        `
+			}
+			if (options.filterRGB.length > 0) {
+				strT += `
         color.r = color.r * ${options.filterRGB[0]}.0/255.0;
         color.g = color.g * ${options.filterRGB[1]}.0/255.0;
         color.b = color.b * ${options.filterRGB[2]}.0/255.0;
-        `;
-      }
-      if (!isDark) {
-        //恢复默认
-        baseFragShader[i] = baseFragShader[i].replace(strT, strS);
-      } else {
-        // 替换为暗黑模式
-        baseFragShader[i] = baseFragShader[i].replace(strS, strT);
-      }
-    }
-  };
+        `
+			}
+			if (!isDark) {
+				//恢复默认
+				baseFragShader[i] = baseFragShader[i].replace(strT, strS)
+			} else {
+				// 替换为暗黑模式
+				baseFragShader[i] = baseFragShader[i].replace(strS, strT)
+			}
+		}
+	}
 
-  const switchDarkModel = () => {
-    const isDark = store.state.common.mapSetting.isDark;
-    darkMap(viewer, isDark, {
-      //反色
-      invertColor: true,
-      //滤色值  [176, 224, 230]
-      filterRGB: [60, 145, 172],
-    });
-  };
+	const switchDarkModel = () => {
+		const isDark = store.state.common.mapSetting.isDark
+		darkMap(viewer, isDark, {
+			//反色
+			invertColor: true,
+			//滤色值  [176, 224, 230]
+			filterRGB: [60, 145, 172],
+		})
+	}
 
-  //移除DataSource中所有实体
-  const removeAllDataSource = () => {
-    viewer?.dataSources.removeAll();
-  };
+	//移除DataSource中所有实体
+	const removeAllDataSource = () => {
+		viewer?.dataSources.removeAll()
+	}
 
-  // 清除所有标记点
-  const removeAllPoint = () => {
-    if (viewer) {
-      viewer?.entities?.removeAll();
-      // viewer?.scene?.primitives?.removeAll();
-    }
-  };
+	// 清除所有标记点
+	const removeAllPoint = () => {
+		if (viewer) {
+			viewer?.entities?.removeAll()
+			// viewer?.scene?.primitives?.removeAll();
+		}
+	}
 
-  // 通过点ID删除
-  const removeById = id => {
-    viewer?.entities.removeById(id);
-    const pointEntity = viewer?.entities.getById(id);
-    if (pointEntity && pointEntity !== undefined) {
-      viewer?.entities.remove(pointEntity);
-    }
-  };
+	// 通过点ID删除
+	const removeById = id => {
+		viewer?.entities.removeById(id)
+		const pointEntity = viewer?.entities.getById(id)
+		if (pointEntity && pointEntity !== undefined) {
+			viewer?.entities.remove(pointEntity)
+		}
+	}
 
-  // 通过点ID获取实体
-  const getEntityById = id => {
-    const pointEntity = viewer?.entities.getById(id);
-    return pointEntity;
-  };
+	// 通过点ID获取实体
+	const getEntityById = id => {
+		const pointEntity = viewer?.entities.getById(id)
+		return pointEntity
+	}
 
-  // 添加标记点
-  const addPoint = pointOption => {
-    if (!pointOption.longitude && !pointOption.latitude) return;
-    const position = Cesium.Cartesian3.fromDegrees(
-      pointOption.longitude,
-      pointOption.latitude,
-      pointOption?.altitude || 0
-    );
-    viewer?.entities.add({
-      position,
-      billboard: pointOption.billboard,
-      point: pointOption.point,
-      label: pointOption.label,
-      id: pointOption.id,
-    });
-  };
+	// 添加标记点
+	const addPoint = pointOption => {
+		if (!pointOption.longitude && !pointOption.latitude) return
+		const position = Cesium.Cartesian3.fromDegrees(
+			pointOption.longitude,
+			pointOption.latitude,
+			pointOption?.altitude || 0
+		)
+		viewer?.entities.add({
+			position,
+			billboard: pointOption.billboard,
+			point: pointOption.point,
+			label: pointOption.label,
+			id: pointOption.id,
+		})
+	}
 
-  const addPolyline = pointOption => {
-    return viewer?.entities.add({
-      polyline: pointOption.polyline,
-      id: pointOption.id,
-    });
-  };
+	const addPolyline = pointOption => {
+		return viewer?.entities.add({
+			polyline: pointOption.polyline,
+			id: pointOption.id,
+		})
+	}
 
-  // 更新图片实体位置
-  function updateEntityPosition(longitude, latitude, id, params) {
-    const entity = getEntityById(id);
-    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude);
-    const heading = Cesium.Math.toRadians(-params.heading);
-    if (Cesium.defined(entity)) {
-      entity.position = position;
-      entity.billboard.rotation = heading;
-    }
-  }
+	// 更新图片实体位置
+	function updateEntityPosition(longitude, latitude, id, params) {
+		const entity = getEntityById(id)
+		const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+		const heading = Cesium.Math.toRadians(-params.heading)
+		if (Cesium.defined(entity)) {
+			entity.position = position
+			entity.billboard.rotation = heading
+		}
+	}
 
-  // 飞行 flyto
-  const flyTo = (pointOption, time = 4, height = 3000, orientation = {}) => {
-    if (!pointOption.longitude && !pointOption.latitude) return;
-    const destination = Cesium.Cartesian3.fromDegrees(
-      pointOption.longitude,
-      pointOption.latitude,
-      height
-    );
-    const duration = time;
-    viewer?.camera.flyTo({
-      destination,
-      duration,
-      orientation,
-    });
-  };
+	// 飞行 flyto
+	const flyTo = (pointOption, time = 4, height = 3000, orientation = {}) => {
+		if (!pointOption.longitude && !pointOption.latitude) return
+		const destination = Cesium.Cartesian3.fromDegrees(
+			pointOption.longitude,
+			pointOption.latitude,
+			height
+		)
+		const duration = time
+		viewer?.camera.flyTo({
+			destination,
+			duration,
+			orientation,
+		})
+	}
 
-  // 鼠标点击事件
-  const addLeftClickEvent = (sid, cb, eventKey = 'handler') => {
-    if (handlerEvents.handler) removeLeftClickEvent();
-    if (handlerEvents[eventKey]) removeLeftClickEvent(eventKey);
+	// 鼠标点击事件
+	const addLeftClickEvent = (sid, cb, eventKey = 'handler') => {
+		if (handlerEvents.handler) removeLeftClickEvent()
+		if (handlerEvents[eventKey]) removeLeftClickEvent(eventKey)
 
-    handlerEvents[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
-    handlerEvents[eventKey].setInputAction(function (click) {
-      const pick = viewer?.scene.pick(click.position);
+		handlerEvents[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
+		handlerEvents[eventKey].setInputAction(function (click) {
+			const pick = viewer?.scene.pick(click.position)
 
-      if (pick && pick.primitive && pick.primitive?.customParams?.type == '3DTileset') {
-        return cb(click, pick, viewer, handlerEvents[eventKey]);
-      }
+			if (pick && pick.primitive && pick.primitive?.customParams?.type == '3DTileset') {
+				return cb(click, pick, viewer, handlerEvents[eventKey])
+			}
 
-      if (pick && pick.id && (pick.id._id === sid || pick.id._id.includes(sid))) {
-        cb(click, pick, viewer, handlerEvents[eventKey]);
-      }
+			if (pick && pick.id && (pick.id._id === sid || pick.id._id.includes(sid))) {
+				cb(click, pick, viewer, handlerEvents[eventKey])
+			}
 
-      if (sid === null) {
-        cb(click, pick, viewer, handlerEvents[eventKey]);
-      }
-    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-  };
+			if (sid === null) {
+				cb(click, pick, viewer, handlerEvents[eventKey])
+			}
+		}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
+	}
 
-  // 移除鼠标点击事件
-  const removeLeftClickEvent = (eventKey = 'handler') => {
-    if (handlerEvents[eventKey] == null) return;
-    handlerEvents[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
+	// 移除鼠标点击事件
+	const removeLeftClickEvent = (eventKey = 'handler') => {
+		if (handlerEvents[eventKey] == null) return
+		handlerEvents[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
 
-    handlerEvents[eventKey] = null;
-  };
+		handlerEvents[eventKey] = null
+	}
 
-  // 鼠标左键按下事件
-  let leftDownClickHandler = { handler: null };
-  const addLeftDownClickEvent = (sid, cb, eventKey = 'handler') => {
-    if (leftDownClickHandler.handler) removeLeftDownClickEvent();
-    if (leftDownClickHandler[eventKey]) removeLeftDownClickEvent(eventKey);
+	// 鼠标左键按下事件
+	let leftDownClickHandler = { handler: null }
+	const addLeftDownClickEvent = (sid, cb, eventKey = 'handler') => {
+		if (leftDownClickHandler.handler) removeLeftDownClickEvent()
+		if (leftDownClickHandler[eventKey]) removeLeftDownClickEvent(eventKey)
 
-    leftDownClickHandler[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
+		leftDownClickHandler[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
 
-    leftDownClickHandler[eventKey].setInputAction(function (click) {
-      const pick = viewer?.scene.pick(click.position);
-      cb(click, pick, viewer);
-    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
-  };
+		leftDownClickHandler[eventKey].setInputAction(function (click) {
+			const pick = viewer?.scene.pick(click.position)
+			cb(click, pick, viewer)
+		}, Cesium.ScreenSpaceEventType.LEFT_DOWN)
+	}
 
-  // 移除鼠标左键按下事件
-  const removeLeftDownClickEvent = (eventKey = 'handler') => {
-    if (leftDownClickHandler[eventKey] == null) return;
-    leftDownClickHandler[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
+	// 移除鼠标左键按下事件
+	const removeLeftDownClickEvent = (eventKey = 'handler') => {
+		if (leftDownClickHandler[eventKey] == null) return
+		leftDownClickHandler[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
 
-    leftDownClickHandler[eventKey] = null;
-  };
+		leftDownClickHandler[eventKey] = null
+	}
 
-  // 鼠标右击事件
-  let leftUpClickHandler = { handler: null };
-  const addLeftUpClickEvent = (sid, cb, eventKey = 'handler') => {
-    if (leftUpClickHandler.handler) removeLeftUpClickEvent();
-    if (leftUpClickHandler[eventKey]) removeLeftUpClickEvent(eventKey);
+	// 鼠标右击事件
+	let leftUpClickHandler = { handler: null }
+	const addLeftUpClickEvent = (sid, cb, eventKey = 'handler') => {
+		if (leftUpClickHandler.handler) removeLeftUpClickEvent()
+		if (leftUpClickHandler[eventKey]) removeLeftUpClickEvent(eventKey)
 
-    leftUpClickHandler[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
+		leftUpClickHandler[eventKey] = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
 
-    leftUpClickHandler[eventKey].setInputAction(function (click) {
-      const pick = viewer?.scene.pick(click.position);
-      cb(click, pick, viewer);
-    }, Cesium.ScreenSpaceEventType.LEFT_UP);
-  };
+		leftUpClickHandler[eventKey].setInputAction(function (click) {
+			const pick = viewer?.scene.pick(click.position)
+			cb(click, pick, viewer)
+		}, Cesium.ScreenSpaceEventType.LEFT_UP)
+	}
 
-  // 移除鼠标右键事件
-  const removeLeftUpClickEvent = (eventKey = 'handler') => {
-    if (leftUpClickHandler[eventKey] == null) return;
-    leftUpClickHandler[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
+	// 移除鼠标右键事件
+	const removeLeftUpClickEvent = (eventKey = 'handler') => {
+		if (leftUpClickHandler[eventKey] == null) return
+		leftUpClickHandler[eventKey].removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
 
-    leftUpClickHandler[eventKey] = null;
-  };
+		leftUpClickHandler[eventKey] = null
+	}
 
-  // 鼠标右击事件
-  let rightClickHandler;
-  const addRightClickEvent = (sid, cb) => {
-    if (rightClickHandler) removeRightClickEvent();
+	// 鼠标右击事件
+	let rightClickHandler
+	const addRightClickEvent = (sid, cb) => {
+		if (rightClickHandler) removeRightClickEvent()
 
-    rightClickHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
+		rightClickHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
 
-    rightClickHandler.setInputAction(function (click) {
-      const pick = viewer?.scene.pick(click.position);
-      cb(click, pick, viewer);
-    }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
-  };
+		rightClickHandler.setInputAction(function (click) {
+			const pick = viewer?.scene.pick(click.position)
+			cb(click, pick, viewer)
+		}, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
+	}
 
-  // 移除鼠标右键事件
-  const removeRightClickEvent = () => {
-    if (!rightClickHandler) return;
-    rightClickHandler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+	// 移除鼠标右键事件
+	const removeRightClickEvent = () => {
+		if (!rightClickHandler) return
+		rightClickHandler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)
 
-    rightClickHandler = null;
-  };
+		rightClickHandler = null
+	}
 
-  // 鼠标移动事件
-  let LeftMounseHandler;
-  const addLeftmounseEvent = (sid, cb) => {
-    if (LeftMounseHandler) removeLeftmounseEvent();
-    LeftMounseHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
-    LeftMounseHandler.setInputAction(function (event) {
-      const cartesian3 = viewer?.scene.globe.pick(
-        viewer?.camera.getPickRay(event.startPosition),
-        viewer?.scene
-      );
-      cb(cartesian3, viewer);
-    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
-  };
+	// 鼠标移动事件
+	let LeftMounseHandler
+	const addLeftmounseEvent = (sid, cb) => {
+		if (LeftMounseHandler) removeLeftmounseEvent()
+		LeftMounseHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
+		LeftMounseHandler.setInputAction(function (event) {
+			const cartesian3 = viewer?.scene.globe.pick(
+				viewer?.camera.getPickRay(event.startPosition),
+				viewer?.scene
+			)
+			cb(cartesian3, viewer)
+		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
+	}
 
-  // 移除鼠标移动事件
-  const removeLeftmounseEvent = () => {
-    if (LeftMounseHandler == null) return;
-    LeftMounseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+	// 移除鼠标移动事件
+	const removeLeftmounseEvent = () => {
+		if (LeftMounseHandler == null) return
+		LeftMounseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
 
-    LeftMounseHandler = null;
-  };
+		LeftMounseHandler = null
+	}
 
-  let MounseHandler;
-  const addMounseHandler = (sid, cb) => {
-    if (MounseHandler == null) removeMounseEvent();
+	let MounseHandler
+	const addMounseHandler = (sid, cb) => {
+		if (MounseHandler == null) removeMounseEvent()
 
-    MounseHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
+		MounseHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
 
-    MounseHandler.setInputAction(function (movement) {
-      let mouseInfo = _getMouseInfo(movement.endPosition);
+		MounseHandler.setInputAction(function (movement) {
+			let mouseInfo = _getMouseInfo(movement.endPosition)
 
-      cb(mouseInfo, viewer);
-    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
-  };
+			cb(mouseInfo, viewer)
+		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
+	}
 
-  const _getMouseInfo = position => {
-    let scene = viewer.scene;
-    let target = scene.pick(position);
-    let cartesian = undefined;
-    let surfaceCartesian = undefined;
-    let wgs84Position = undefined;
-    let wgs84SurfacePosition = undefined;
-    if (scene.pickPositionSupported) {
-      cartesian = scene.pickPosition(position);
-    }
-    if (cartesian) {
-      let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian);
-      if (c) {
-        wgs84Position = {
-          lng: Cesium.Math.toDegrees(c.longitude),
-          lat: Cesium.Math.toDegrees(c.latitude),
-          alt: c.height,
-        };
-      }
-    }
-    if (
-      scene.mode === Cesium.SceneMode.SCENE3D &&
-      !(viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider)
-    ) {
-      let ray = scene.camera.getPickRay(position);
-      surfaceCartesian = scene.globe.pick(ray, scene);
-    } else {
-      surfaceCartesian = scene.camera.pickEllipsoid(position, Cesium.Ellipsoid.WGS84);
-    }
-    if (surfaceCartesian) {
-      let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(surfaceCartesian);
-      if (c) {
-        wgs84SurfacePosition = {
-          lng: Cesium.Math.toDegrees(c.longitude),
-          lat: Cesium.Math.toDegrees(c.latitude),
-          alt: c.height,
-        };
-      }
-    }
+	const _getMouseInfo = position => {
+		let scene = viewer.scene
+		let target = scene.pick(position)
+		let cartesian = undefined
+		let surfaceCartesian = undefined
+		let wgs84Position = undefined
+		let wgs84SurfacePosition = undefined
+		if (scene.pickPositionSupported) {
+			cartesian = scene.pickPosition(position)
+		}
+		if (cartesian) {
+			let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian)
+			if (c) {
+				wgs84Position = {
+					lng: Cesium.Math.toDegrees(c.longitude),
+					lat: Cesium.Math.toDegrees(c.latitude),
+					alt: c.height,
+				}
+			}
+		}
+		if (
+			scene.mode === Cesium.SceneMode.SCENE3D &&
+			!(viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider)
+		) {
+			let ray = scene.camera.getPickRay(position)
+			surfaceCartesian = scene.globe.pick(ray, scene)
+		} else {
+			surfaceCartesian = scene.camera.pickEllipsoid(position, Cesium.Ellipsoid.WGS84)
+		}
+		if (surfaceCartesian) {
+			let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(surfaceCartesian)
+			if (c) {
+				wgs84SurfacePosition = {
+					lng: Cesium.Math.toDegrees(c.longitude),
+					lat: Cesium.Math.toDegrees(c.latitude),
+					alt: c.height,
+				}
+			}
+		}
 
-    return {
-      target: target,
-      windowPosition: position,
-      position: cartesian,
-      wgs84Position: wgs84Position,
-      surfacePosition: surfaceCartesian,
-      wgs84SurfacePosition: wgs84SurfacePosition,
-    };
-  };
+		return {
+			target: target,
+			windowPosition: position,
+			position: cartesian,
+			wgs84Position: wgs84Position,
+			surfacePosition: surfaceCartesian,
+			wgs84SurfacePosition: wgs84SurfacePosition,
+		}
+	}
 
-  // 移除鼠标移动事件
-  const removeMounseEvent = () => {
-    if (MounseHandler == null) return;
-    MounseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+	// 移除鼠标移动事件
+	const removeMounseEvent = () => {
+		if (MounseHandler == null) return
+		MounseHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
 
-    MounseHandler = null;
-  };
+		MounseHandler = null
+	}
 
-  // 视角变化时间
-  let mapViewHandler = null;
-  const addCameraMoveEvent = cb => {
-    if (mapViewHandler) removeCameraMoveEvent();
+	// 视角变化时间
+	let mapViewHandler = null
+	const addCameraMoveEvent = cb => {
+		if (mapViewHandler) removeCameraMoveEvent()
 
-    mapViewHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
-    mapViewHandler.setInputAction(event => {
-      cb(event);
-    }, Cesium.ScreenSpaceEventType.WHEEL);
-  };
+		mapViewHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
+		mapViewHandler.setInputAction(event => {
+			cb(event)
+		}, Cesium.ScreenSpaceEventType.WHEEL)
+	}
 
-  const removeCameraMoveEvent = () => {
-    if (mapViewHandler == null) return;
-    mapViewHandler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL);
-    mapViewHandler = null;
-  };
+	const removeCameraMoveEvent = () => {
+		if (mapViewHandler == null) return
+		mapViewHandler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL)
+		mapViewHandler = null
+	}
 
-  // 添加entity
-  const addCustomEntityDataSource = (sourceName, entities) => {
-    if (!customEntityDataSources[sourceName]) {
-      customEntityDataSources[sourceName] = new Cesium.CustomDataSource();
-      window.$viewer?.dataSources.add(customEntityDataSources[sourceName]);
-    }
+	// 添加entity
+	const addCustomEntityDataSource = (sourceName, entities) => {
+		if (!customEntityDataSources[sourceName]) {
+			customEntityDataSources[sourceName] = new Cesium.CustomDataSource()
+			window.$viewer?.dataSources.add(customEntityDataSources[sourceName])
+		}
 
-    let entity = customEntityDataSources[sourceName].entities.add(entities);
+		let entity = customEntityDataSources[sourceName].entities.add(entities)
 
-    return entity;
-  };
+		return entity
+	}
 
-  const clearCustomEntityDataSource = sourceName => {
-    if (customEntityDataSources[sourceName]) {
-      customEntityDataSources[sourceName]?.entities.removeAll();
-    }
-  };
+	const clearCustomEntityDataSource = sourceName => {
+		if (customEntityDataSources[sourceName]) {
+			customEntityDataSources[sourceName]?.entities.removeAll()
+		}
+	}
 
-  const removeAllCustomEntityDataSource = sourceName => {
-    if (customEntityDataSources[sourceName]) {
-      customEntityDataSources[sourceName]?.entities.removeAll();
-      window.$viewer.dataSources.remove(customEntityDataSources[sourceName]);
-      delete customEntityDataSources[sourceName];
-    }
-  };
+	const removeAllCustomEntityDataSource = sourceName => {
+		if (customEntityDataSources[sourceName]) {
+			customEntityDataSources[sourceName]?.entities.removeAll()
+			window.$viewer.dataSources.remove(customEntityDataSources[sourceName])
+			delete customEntityDataSources[sourceName]
+		}
+	}
 
-  // 添加entity
-  const addCustomImageryProviderDataSource = imageryLayers => {
-    return viewer?.imageryLayers.addImageryProvider(imageryLayers);
-  };
+	// 添加entity
+	const addCustomImageryProviderDataSource = imageryLayers => {
+		return viewer?.imageryLayers.addImageryProvider(imageryLayers)
+	}
 
-  const showCustomImageryProviderDataSource = (imageryLayers, show) => {
-    if (imageryLayers) {
-      imageryLayers.show = show;
-    }
-  };
+	const showCustomImageryProviderDataSource = (imageryLayers, show) => {
+		if (imageryLayers) {
+			imageryLayers.show = show
+		}
+	}
 
-  const removeAllCustomImageryProviderDataSource = imageryLayers => {
-    if (imageryLayers) {
-      viewer?.imageryLayers.remove(imageryLayers);
-    }
-  };
+	const removeAllCustomImageryProviderDataSource = imageryLayers => {
+		if (imageryLayers) {
+			viewer?.imageryLayers.remove(imageryLayers)
+		}
+	}
 
-  // 添加范围的圆
-  const addEllipse = ({ longitude, latitude, dist = 7000 }) => {
-    if (!longitude && !latitude) return;
-    // 定义起点位置
-    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude);
-    // 画圆
+	// 添加范围的圆
+	const addEllipse = ({ longitude, latitude, dist = 7000 }) => {
+		if (!longitude && !latitude) return
+		// 定义起点位置
+		const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+		// 画圆
 
-    viewer?.entities.add({
-      position,
-      id: 'rangeEllipse',
-      name: 'rangeEllipse',
-      ellipse: {
-        semiMinorAxis: dist,
-        semiMajorAxis: dist,
-        outline: true,
-        material: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3),
-      },
-    });
-    // 添加距离虚线
-    // addDistLine({ longitude, latitude, dist });
-  };
+		viewer?.entities.add({
+			position,
+			id: 'rangeEllipse',
+			name: 'rangeEllipse',
+			ellipse: {
+				semiMinorAxis: dist,
+				semiMajorAxis: dist,
+				outline: true,
+				material: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3),
+			},
+		})
+		// 添加距离虚线
+		// addDistLine({ longitude, latitude, dist });
+	}
 
-  const addDistLine = ({ longitude, latitude, dist = 7 }) => {
-    // 定义起点位置
-    const startPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude);
-    // 计算目标位置(7公里处)
-    const offsetCartesian = Cesium.Cartesian3.fromDegrees(
-      longitude,
-      latitude +
-        Cesium.Math.toDegrees(
-          dist / (Cesium.Ellipsoid.WGS84.maximumRadius * Math.cos(Cesium.Math.toRadians(latitude)))
-        ) // 7公里的偏移
-    );
-    // 将目标位置转换为经纬度
-    // const offsetCartographic = Cesium.Cartographic.fromCartesian(offsetCartesian);
-    // const offsetLongitude = Cesium.Math.toDegrees(offsetCartographic.longitude);
-    // const offsetLatitude = Cesium.Math.toDegrees(offsetCartographic.latitude);
-    addPolyline({
-      id: 'dist_line',
-      polyline: {
-        width: 5,
-        positions: [startPosition, offsetCartesian],
-        material: new Cesium.PolylineGlowMaterialProperty({
-          glowPower: 0.2,
-          taperPower: 0.5,
-          color: Cesium.Color.CORNFLOWERBLUE,
-        }),
-      },
-    });
-  };
+	const addDistLine = ({ longitude, latitude, dist = 7 }) => {
+		// 定义起点位置
+		const startPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+		// 计算目标位置(7公里处)
+		const offsetCartesian = Cesium.Cartesian3.fromDegrees(
+			longitude,
+			latitude +
+				Cesium.Math.toDegrees(
+					dist / (Cesium.Ellipsoid.WGS84.maximumRadius * Math.cos(Cesium.Math.toRadians(latitude)))
+				) // 7公里的偏移
+		)
+		// 将目标位置转换为经纬度
+		// const offsetCartographic = Cesium.Cartographic.fromCartesian(offsetCartesian);
+		// const offsetLongitude = Cesium.Math.toDegrees(offsetCartographic.longitude);
+		// const offsetLatitude = Cesium.Math.toDegrees(offsetCartographic.latitude);
+		addPolyline({
+			id: 'dist_line',
+			polyline: {
+				width: 5,
+				positions: [startPosition, offsetCartesian],
+				material: new Cesium.PolylineGlowMaterialProperty({
+					glowPower: 0.2,
+					taperPower: 0.5,
+					color: Cesium.Color.CORNFLOWERBLUE,
+				}),
+			},
+		})
+	}
 
-  // 添加圆
-  const addCircle = option => {
-    if (!option.longitude && !option.latitude) return;
-    // 定义起点位置
-    const { longitude, latitude } = option;
-    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude);
-    viewer.entities.add({
-      position,
-      id: option.id,
-      ellipse: {
-        semiMinorAxis: option.radius,
-        semiMajorAxis: option.radius,
-        height: option.height || 120,
-        material: Cesium.Color.fromCssColorString(option.color).withAlpha(0.1),
-        outline: true,
-        outlineColor: Cesium.Color.fromCssColorString(option.color),
-        outlineWidth: 3,
-      },
-    });
-  };
+	// 添加圆
+	const addCircle = option => {
+		if (!option.longitude && !option.latitude) return
+		// 定义起点位置
+		const { longitude, latitude } = option
+		const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+		viewer.entities.add({
+			position,
+			id: option.id,
+			ellipse: {
+				semiMinorAxis: option.radius,
+				semiMajorAxis: option.radius,
+				height: option.height || 120,
+				material: Cesium.Color.fromCssColorString(option.color).withAlpha(0.1),
+				outline: true,
+				outlineColor: Cesium.Color.fromCssColorString(option.color),
+				outlineWidth: 3,
+			},
+		})
+	}
 
-  //
-  /**
-   * @description: 添加矩形
-   * @param {*} option { id: string, color: string, positions: array[ lng,lat,height ] }
-   * @return {*} void 0
-   */
-  const addPolygon = option => {
-    if (option.positions.length === 0) return;
+	//
+	/**
+	 * @description: 添加矩形
+	 * @param {*} option { id: string, color: string, positions: array[ lng,lat,height ] }
+	 * @return {*} void 0
+	 */
+	const addPolygon = option => {
+		if (option.positions.length === 0) return
 
-    let zIndex = {};
+		let zIndex = {}
 
-    if (option.zIndex) {
-      zIndex = {
-        zIndex: option.zIndex,
-      };
-    }
+		if (option.zIndex) {
+			zIndex = {
+				zIndex: option.zIndex,
+			}
+		}
 
-    // 定义起点位置
-    viewer.entities.add({
-      id: option.id,
-      polygon: {
-        hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(option.positions),
-        material: Cesium.Color.fromCssColorString(option.color).withAlpha(0.1),
-        extrudedHeight: 0,
-        outline: true,
-        outlineColor: Cesium.Color.fromCssColorString(option.color),
-        outlineWidth: 3,
-      },
-      ...zIndex,
-    });
-  };
+		// 定义起点位置
+		viewer.entities.add({
+			id: option.id,
+			polygon: {
+				hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(option.positions),
+				material: Cesium.Color.fromCssColorString(option.color).withAlpha(0.1),
+				extrudedHeight: 0,
+				outline: true,
+				outlineColor: Cesium.Color.fromCssColorString(option.color),
+				outlineWidth: 3,
+			},
+			...zIndex,
+		})
+	}
 
-  // Cesium矢量切片是否加载完成
-  const isLoadingCompleted = () => {
-    return new Promise((resolve, reject) => {
-      const helper = new Cesium.EventHelper();
-      helper.add(viewer?.scene.globe.tileLoadProgressEvent, function (e) {
-        if (e === 0) {
-          resolve(true);
-        }
-      });
-    });
-  };
+	// Cesium矢量切片是否加载完成
+	const isLoadingCompleted = () => {
+		return new Promise((resolve, reject) => {
+			const helper = new Cesium.EventHelper()
+			helper.add(viewer?.scene.globe.tileLoadProgressEvent, function (e) {
+				if (e === 0) {
+					resolve(true)
+				}
+			})
+		})
+	}
 
-  // 获取屏幕四个角经纬度
-  const getScreenCorner = () => {
-    const camera = viewer.scene.camera;
-    const canvas = viewer.canvas;
+	// 获取屏幕四个角经纬度
+	const getScreenCorner = () => {
+		const camera = viewer.scene.camera
+		const canvas = viewer.canvas
 
-    // 获取屏幕左下角和右上角的世界坐标
-    const leftBottom = new Cesium.Cartesian2(0, canvas.clientHeight);
-    const rightTop = new Cesium.Cartesian2(canvas.clientWidth, 0);
+		// 获取屏幕左下角和右上角的世界坐标
+		const leftBottom = new Cesium.Cartesian2(0, canvas.clientHeight)
+		const rightTop = new Cesium.Cartesian2(canvas.clientWidth, 0)
 
-    // 将屏幕坐标转为世界坐标
-    const leftBottomWorld = camera.pickEllipsoid(leftBottom, viewer.scene.globe.ellipsoid);
-    const rightTopWorld = camera.pickEllipsoid(rightTop, viewer.scene.globe.ellipsoid);
+		// 将屏幕坐标转为世界坐标
+		const leftBottomWorld = camera.pickEllipsoid(leftBottom, viewer.scene.globe.ellipsoid)
+		const rightTopWorld = camera.pickEllipsoid(rightTop, viewer.scene.globe.ellipsoid)
 
-    // 将世界坐标转为经纬度
-    const leftBottomCartographic =
-      viewer.scene.globe.ellipsoid.cartesianToCartographic(leftBottomWorld);
-    const rightTopCartographic =
-      viewer.scene.globe.ellipsoid.cartesianToCartographic(rightTopWorld);
+		// 将世界坐标转为经纬度
+		const leftBottomCartographic =
+			viewer.scene.globe.ellipsoid.cartesianToCartographic(leftBottomWorld)
+		const rightTopCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(rightTopWorld)
 
-    // 获取经纬度
-    const leftBottomLonLat = [
-      Cesium.Math.toDegrees(leftBottomCartographic.longitude),
-      Cesium.Math.toDegrees(leftBottomCartographic.latitude),
-    ];
-    const rightTopLonLat = [
-      Cesium.Math.toDegrees(rightTopCartographic.longitude),
-      Cesium.Math.toDegrees(rightTopCartographic.latitude),
-    ];
+		// 获取经纬度
+		const leftBottomLonLat = [
+			Cesium.Math.toDegrees(leftBottomCartographic.longitude),
+			Cesium.Math.toDegrees(leftBottomCartographic.latitude),
+		]
+		const rightTopLonLat = [
+			Cesium.Math.toDegrees(rightTopCartographic.longitude),
+			Cesium.Math.toDegrees(rightTopCartographic.latitude),
+		]
 
-    // 返回四个角的经纬度
-    return {
-      lb: leftBottomLonLat,
-      rb: [rightTopLonLat[0], leftBottomLonLat[1]], // 右下角
-      rt: rightTopLonLat,
-      lt: [leftBottomLonLat[0], rightTopLonLat[1]], // 左上角
-    };
-  };
+		// 返回四个角的经纬度
+		return {
+			lb: leftBottomLonLat,
+			rb: [rightTopLonLat[0], leftBottomLonLat[1]], // 右下角
+			rt: rightTopLonLat,
+			lt: [leftBottomLonLat[0], rightTopLonLat[1]], // 左上角
+		}
+	}
 
-  // 加载3D建筑模型
-  let tileset = null;
+	// 加载3D建筑模型
+	let tileset = null
 
-  function setBuilding3dModel() {
-    try {
-      const resource = Cesium.IonResource.fromAssetId(96188);
-      tileset = new Cesium.Cesium3DTileset({
-        url: resource,
-      });
+	function setBuilding3dModel() {
+		try {
+			const resource = Cesium.IonResource.fromAssetId(96188)
+			tileset = new Cesium.Cesium3DTileset({
+				url: resource,
+			})
 
-      tileset.customParams = {
-        type: '3DTileset',
-      };
+			tileset.customParams = {
+				type: '3DTileset',
+			}
 
-      viewer.scene.primitives.add(tileset);
-    } catch (error) {
-      console.log(`Error loading tileset: ${error}`);
-    }
-  }
+			viewer.scene.primitives.add(tileset)
+		} catch (error) {
+			console.log(`Error loading tileset: ${error}`)
+		}
+	}
 
-  function removeBuilding3dModel() {
-    if (tileset) {
-      viewer.scene.primitives.remove(tileset);
-    }
-  }
+	function removeBuilding3dModel() {
+		if (tileset) {
+			viewer.scene.primitives.remove(tileset)
+		}
+	}
 
-  const viewerDestory = () => {
-    viewer && viewer.destroy();
-    viewer = null;
-    window.$viewer = null
-  };
+	const viewerDestory = () => {
+		viewer && viewer.destroy()
+		viewer = null
+		window.$viewer = null
+	}
 
-  let tilesetArr = [];
+	let tilesetArr = []
 
-  const add3Dtileset = () => {
-    let url = '/3Dtile/kjds/tileset.json';
+	const add3Dtileset = () => {
+		let url = '/3Dtile/kjds/tileset.json'
 
-    let tileset = new Cesium.Cesium3DTileset({
-      url: url,
-    });
+		let tileset = new Cesium.Cesium3DTileset({
+			url: url,
+		})
 
-    tileset.customParams = {
-      type: '3DTileset',
-    };
+		tileset.customParams = {
+			type: '3DTileset',
+		}
 
-    tilesetArr.push(tileset);
+		tilesetArr.push(tileset)
 
-    tilesetArr.forEach(i => viewer?.scene.primitives.add(i));
-  };
+		tilesetArr.forEach(i => viewer?.scene.primitives.add(i))
+	}
 
-  const remove3Dtileset = () => {
-    if (tilesetArr.length > 0) {
-      tilesetArr.forEach(i => viewer.scene.primitives.remove(i));
-    }
+	const remove3Dtileset = () => {
+		if (tilesetArr.length > 0) {
+			tilesetArr.forEach(i => viewer.scene.primitives.remove(i))
+		}
 
-    tilesetArr = [];
-  };
+		tilesetArr = []
+	}
 
-  let pointEditHandler;
-  // 航点航线编辑相关事件
-  const pointInitEvent = (lefet_down, mouse_move, left_up) => {
-    if (!pointEditHandler) {
-      pointEditHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
-    }
+	let pointEditHandler
+	// 航点航线编辑相关事件
+	const pointInitEvent = (lefet_down, mouse_move, left_up) => {
+		if (!pointEditHandler) {
+			pointEditHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
+		}
 
-    const events = {
-      lefet_down,
-      mouse_move,
-      left_up,
-    };
+		const events = {
+			lefet_down,
+			mouse_move,
+			left_up,
+		}
 
-    pointEditBindEvent(events);
-    pointEditBindEvent(events, Cesium.KeyboardEventModifier.CTRL);
-    pointEditBindEvent(events, Cesium.KeyboardEventModifier.ALT);
-    pointEditBindEvent(events, Cesium.KeyboardEventModifier.SHIFT);
-    pointEditBindEvent(events, Cesium.KeyboardEventModifier.META);
-  };
+		pointEditBindEvent(events)
+		pointEditBindEvent(events, Cesium.KeyboardEventModifier.CTRL)
+		pointEditBindEvent(events, Cesium.KeyboardEventModifier.ALT)
+		pointEditBindEvent(events, Cesium.KeyboardEventModifier.SHIFT)
+		pointEditBindEvent(events, Cesium.KeyboardEventModifier.META)
+	}
 
-  const pointEditBindEvent = (events, e) => {
-    if (pointEditHandler) {
-      pointEditHandler.setInputAction(
-        events.lefet_down(e),
-        Cesium.ScreenSpaceEventType.LEFT_DOWN,
-        e
-      );
-      pointEditHandler.setInputAction(
-        events.mouse_move(e),
-        Cesium.ScreenSpaceEventType.MOUSE_MOVE,
-        e
-      );
-      pointEditHandler.setInputAction(events.left_up(e), Cesium.ScreenSpaceEventType.LEFT_UP, e);
-    }
-  };
+	const pointEditBindEvent = (events, e) => {
+		if (pointEditHandler) {
+			pointEditHandler.setInputAction(
+				events.lefet_down(e),
+				Cesium.ScreenSpaceEventType.LEFT_DOWN,
+				e
+			)
+			pointEditHandler.setInputAction(
+				events.mouse_move(e),
+				Cesium.ScreenSpaceEventType.MOUSE_MOVE,
+				e
+			)
+			pointEditHandler.setInputAction(events.left_up(e), Cesium.ScreenSpaceEventType.LEFT_UP, e)
+		}
+	}
 
-  const pointUnInitEvent = () => {
-    pointEditUnBindEvent();
-    pointEditUnBindEvent(Cesium.KeyboardEventModifier.CTRL);
-    pointEditUnBindEvent(Cesium.KeyboardEventModifier.ALT);
-    pointEditUnBindEvent(Cesium.KeyboardEventModifier.SHIFT);
-    pointEditUnBindEvent(Cesium.KeyboardEventModifier.META);
+	const pointUnInitEvent = () => {
+		pointEditUnBindEvent()
+		pointEditUnBindEvent(Cesium.KeyboardEventModifier.CTRL)
+		pointEditUnBindEvent(Cesium.KeyboardEventModifier.ALT)
+		pointEditUnBindEvent(Cesium.KeyboardEventModifier.SHIFT)
+		pointEditUnBindEvent(Cesium.KeyboardEventModifier.META)
 
-    pointEditHandler = null;
-  };
+		pointEditHandler = null
+	}
 
-  const pointEditUnBindEvent = e => {
-    pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN, e);
-    pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE, e);
-    pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP, e);
-  };
+	const pointEditUnBindEvent = e => {
+		pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN, e)
+		pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE, e)
+		pointEditHandler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP, e)
+	}
 
-  return {
-    _init,
-    patternMap,
-    loadLAYER,
-    roadPattern,
-    switchModel,
-    switchDarkModel,
-    removeAllDataSource,
-    removeAllPoint,
-    removeById,
-    getEntityById,
-    addPoint,
-    addPolyline,
-    updateEntityPosition,
-    flyTo,
-    addLeftClickEvent,
-    removeLeftClickEvent,
-    addRightClickEvent,
-    removeRightClickEvent,
-    addLeftmounseEvent,
-    removeLeftmounseEvent,
+	return {
+		_init,
+		patternMap,
+		loadLAYER,
+		roadPattern,
+		switchModel,
+		switchDarkModel,
+		removeAllDataSource,
+		removeAllPoint,
+		removeById,
+		getEntityById,
+		addPoint,
+		addPolyline,
+		updateEntityPosition,
+		flyTo,
+		addLeftClickEvent,
+		removeLeftClickEvent,
+		addRightClickEvent,
+		removeRightClickEvent,
+		addLeftmounseEvent,
+		removeLeftmounseEvent,
 
-    addLeftUpClickEvent,
-    removeLeftUpClickEvent,
+		addLeftUpClickEvent,
+		removeLeftUpClickEvent,
 
-    addLeftDownClickEvent,
-    removeLeftDownClickEvent,
+		addLeftDownClickEvent,
+		removeLeftDownClickEvent,
 
-    addMounseHandler,
-    removeMounseEvent,
+		addMounseHandler,
+		removeMounseEvent,
 
-    addCameraMoveEvent,
-    removeCameraMoveEvent,
-    addCircle,
-    addPolygon,
-    addEllipse,
-    isLoadingCompleted,
-    getScreenCorner,
-    setBuilding3dModel,
-    removeBuilding3dModel,
+		addCameraMoveEvent,
+		removeCameraMoveEvent,
+		addCircle,
+		addPolygon,
+		addEllipse,
+		isLoadingCompleted,
+		getScreenCorner,
+		setBuilding3dModel,
+		removeBuilding3dModel,
 
-    viewerDestory,
+		viewerDestory,
 
-    globalCesium: window.globalCesium || Cesium,
+		globalCesium: window.globalCesium || Cesium,
 
-    addCustomEntityDataSource,
-    clearCustomEntityDataSource,
-    removeAllCustomEntityDataSource,
-    _getMouseInfo,
+		addCustomEntityDataSource,
+		clearCustomEntityDataSource,
+		removeAllCustomEntityDataSource,
+		_getMouseInfo,
 
-    addCustomImageryProviderDataSource,
-    showCustomImageryProviderDataSource,
-    removeAllCustomImageryProviderDataSource,
+		addCustomImageryProviderDataSource,
+		showCustomImageryProviderDataSource,
+		removeAllCustomImageryProviderDataSource,
 
-    addCustomLayers,
-    removeCustomLayers,
-    add3Dtileset,
-    remove3Dtileset,
+		addCustomLayers,
+		removeCustomLayers,
+		add3Dtileset,
+		remove3Dtileset,
 
-    // 航线规划---航点航线
-    pointInitEvent,
-    pointUnInitEvent,
-  };
+		// 航线规划---航点航线
+		pointInitEvent,
+		pointUnInitEvent,
+	}
 }
diff --git a/src/utils/cesium/AmapMercatorTilingScheme/CoordTransform.js b/src/utils/cesium/AmapMercatorTilingScheme/CoordTransform.js
index 5b1b4a5..dfc7074 100644
--- a/src/utils/cesium/AmapMercatorTilingScheme/CoordTransform.js
+++ b/src/utils/cesium/AmapMercatorTilingScheme/CoordTransform.js
@@ -1,178 +1,148 @@
 // 定义一些常量
-const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0;
-const PI = 3.1415926535897932384626;
-const RADIUS = 6378245.0;
-const EE = 0.00669342162296594323;
+const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0
+const PI = 3.1415926535897932384626
+const RADIUS = 6378245.0
+const EE = 0.00669342162296594323
 
 class CoordTransform {
-    /**
-     * BD-09(百度坐标系) To GCJ-02(火星坐标系)
-     * @param lng
-     * @param lat
-     * @returns {number[]}
-     */
-    static BD09ToGCJ02(lng, lat) {
-        let x = +lng - 0.0065;
-        let y = +lat - 0.006;
-        let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR);
-        let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR);
-        let gg_lng = z * Math.cos(theta);
-        let gg_lat = z * Math.sin(theta);
-        return [gg_lng, gg_lat];
-    }
+	/**
+	 * BD-09(百度坐标系) To GCJ-02(火星坐标系)
+	 * @param lng
+	 * @param lat
+	 * @returns {number[]}
+	 */
+	static BD09ToGCJ02(lng, lat) {
+		let x = +lng - 0.0065
+		let y = +lat - 0.006
+		let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR)
+		let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR)
+		let gg_lng = z * Math.cos(theta)
+		let gg_lat = z * Math.sin(theta)
+		return [gg_lng, gg_lat]
+	}
 
-    /**
-     * GCJ-02(火星坐标系) To BD-09(百度坐标系)
-     * @param lng
-     * @param lat
-     * @returns {number[]}
-     * @constructor
-     */
-    static GCJ02ToBD09(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        let z =
-            Math.sqrt(lng * lng + lat * lat) +
-            0.00002 * Math.sin(lat * BD_FACTOR);
-        let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR);
-        let bd_lng = z * Math.cos(theta) + 0.0065;
-        let bd_lat = z * Math.sin(theta) + 0.006;
-        return [bd_lng, bd_lat];
-    }
+	/**
+	 * GCJ-02(火星坐标系) To BD-09(百度坐标系)
+	 * @param lng
+	 * @param lat
+	 * @returns {number[]}
+	 * @constructor
+	 */
+	static GCJ02ToBD09(lng, lat) {
+		lat = +lat
+		lng = +lng
+		let z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * BD_FACTOR)
+		let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR)
+		let bd_lng = z * Math.cos(theta) + 0.0065
+		let bd_lat = z * Math.sin(theta) + 0.006
+		return [bd_lng, bd_lat]
+	}
 
-    /**
-     * WGS-84(世界大地坐标系) To GCJ-02(火星坐标系)
-     * @param lng
-     * @param lat
-     * @returns {number[]}
-     */
-    static WGS84ToGCJ02(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        if (this.out_of_china(lng, lat)) {
-            return [lng, lat];
-        } else {
-            let d = this.delta(lng, lat);
-            return [lng + d[0], lat + d[1]];
-        }
-    }
+	/**
+	 * WGS-84(世界大地坐标系) To GCJ-02(火星坐标系)
+	 * @param lng
+	 * @param lat
+	 * @returns {number[]}
+	 */
+	static WGS84ToGCJ02(lng, lat) {
+		lat = +lat
+		lng = +lng
+		if (this.out_of_china(lng, lat)) {
+			return [lng, lat]
+		} else {
+			let d = this.delta(lng, lat)
+			return [lng + d[0], lat + d[1]]
+		}
+	}
 
-    /**
-     * GCJ-02(火星坐标系) To WGS-84(世界大地坐标系)
-     * @param lng
-     * @param lat
-     * @returns {number[]}
-     * @constructor
-     */
-    static GCJ02ToWGS84(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        if (this.out_of_china(lng, lat)) {
-            return [lng, lat];
-        } else {
-            let d = this.delta(lng, lat);
-            let mgLng = lng + d[0];
-            let mgLat = lat + d[1];
-            return [lng * 2 - mgLng, lat * 2 - mgLat];
-        }
-    }
+	/**
+	 * GCJ-02(火星坐标系) To WGS-84(世界大地坐标系)
+	 * @param lng
+	 * @param lat
+	 * @returns {number[]}
+	 * @constructor
+	 */
+	static GCJ02ToWGS84(lng, lat) {
+		lat = +lat
+		lng = +lng
+		if (this.out_of_china(lng, lat)) {
+			return [lng, lat]
+		} else {
+			let d = this.delta(lng, lat)
+			let mgLng = lng + d[0]
+			let mgLat = lat + d[1]
+			return [lng * 2 - mgLng, lat * 2 - mgLat]
+		}
+	}
 
-    /**
-     *
-     * @param lng
-     * @param lat
-     * @returns {number[]}
-     */
-    static delta(lng, lat) {
-        let dLng = this.transformLng(lng - 105, lat - 35);
-        let dLat = this.transformLat(lng - 105, lat - 35);
-        const radLat = (lat / 180) * PI;
-        let magic = Math.sin(radLat);
-        magic = 1 - EE * magic * magic;
-        const sqrtMagic = Math.sqrt(magic);
-        dLng = (dLng * 180) / ((RADIUS / sqrtMagic) * Math.cos(radLat) * PI);
-        dLat =
-            (dLat * 180) / (((RADIUS * (1 - EE)) / (magic * sqrtMagic)) * PI);
-        return [dLng, dLat];
-    }
+	/**
+	 *
+	 * @param lng
+	 * @param lat
+	 * @returns {number[]}
+	 */
+	static delta(lng, lat) {
+		let dLng = this.transformLng(lng - 105, lat - 35)
+		let dLat = this.transformLat(lng - 105, lat - 35)
+		const radLat = (lat / 180) * PI
+		let magic = Math.sin(radLat)
+		magic = 1 - EE * magic * magic
+		const sqrtMagic = Math.sqrt(magic)
+		dLng = (dLng * 180) / ((RADIUS / sqrtMagic) * Math.cos(radLat) * PI)
+		dLat = (dLat * 180) / (((RADIUS * (1 - EE)) / (magic * sqrtMagic)) * PI)
+		return [dLng, dLat]
+	}
 
-    /**
-     *
-     * @param lng
-     * @param lat
-     * @returns {number}
-     */
-    static transformLng(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        let ret =
-            300.0 +
-            lng +
-            2.0 * lat +
-            0.1 * lng * lng +
-            0.1 * lng * lat +
-            0.1 * Math.sqrt(Math.abs(lng));
-        ret +=
-            ((20.0 * Math.sin(6.0 * lng * PI) +
-                20.0 * Math.sin(2.0 * lng * PI)) *
-                2.0) /
-            3.0;
-        ret +=
-            ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) *
-                2.0) /
-            3.0;
-        ret +=
-            ((150.0 * Math.sin((lng / 12.0) * PI) +
-                300.0 * Math.sin((lng / 30.0) * PI)) *
-                2.0) /
-            3.0;
-        return ret;
-    }
+	/**
+	 *
+	 * @param lng
+	 * @param lat
+	 * @returns {number}
+	 */
+	static transformLng(lng, lat) {
+		lat = +lat
+		lng = +lng
+		let ret =
+			300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng))
+		ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0
+		ret += ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) / 3.0
+		ret += ((150.0 * Math.sin((lng / 12.0) * PI) + 300.0 * Math.sin((lng / 30.0) * PI)) * 2.0) / 3.0
+		return ret
+	}
 
-    /**
-     *
-     * @param lng
-     * @param lat
-     * @returns {number}
-     */
-    static transformLat(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        let ret =
-            -100.0 +
-            2.0 * lng +
-            3.0 * lat +
-            0.2 * lat * lat +
-            0.1 * lng * lat +
-            0.2 * Math.sqrt(Math.abs(lng));
-        ret +=
-            ((20.0 * Math.sin(6.0 * lng * PI) +
-                20.0 * Math.sin(2.0 * lng * PI)) *
-                2.0) /
-            3.0;
-        ret +=
-            ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) *
-                2.0) /
-            3.0;
-        ret +=
-            ((160.0 * Math.sin((lat / 12.0) * PI) +
-                320 * Math.sin((lat * PI) / 30.0)) *
-                2.0) /
-            3.0;
-        return ret;
-    }
+	/**
+	 *
+	 * @param lng
+	 * @param lat
+	 * @returns {number}
+	 */
+	static transformLat(lng, lat) {
+		lat = +lat
+		lng = +lng
+		let ret =
+			-100.0 +
+			2.0 * lng +
+			3.0 * lat +
+			0.2 * lat * lat +
+			0.1 * lng * lat +
+			0.2 * Math.sqrt(Math.abs(lng))
+		ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0
+		ret += ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) / 3.0
+		ret += ((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) * 2.0) / 3.0
+		return ret
+	}
 
-    /**
-     * 判断是否在国内。不在国内不做偏移
-     * @param lng
-     * @param lat
-     * @returns {boolean}
-     */
-    static out_of_china(lng, lat) {
-        lat = +lat;
-        lng = +lng;
-        return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
-    }
+	/**
+	 * 判断是否在国内。不在国内不做偏移
+	 * @param lng
+	 * @param lat
+	 * @returns {boolean}
+	 */
+	static out_of_china(lng, lat) {
+		lat = +lat
+		lng = +lng
+		return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)
+	}
 }
 
-export default CoordTransform;
+export default CoordTransform
diff --git a/src/utils/cesium/AmapMercatorTilingScheme/index.js b/src/utils/cesium/AmapMercatorTilingScheme/index.js
index 6b81249..dee4295 100644
--- a/src/utils/cesium/AmapMercatorTilingScheme/index.js
+++ b/src/utils/cesium/AmapMercatorTilingScheme/index.js
@@ -8,46 +8,40 @@
  * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
  */
 import {
-    WebMercatorProjection,
-    WebMercatorTilingScheme,
-    Math,
-    Cartographic,
-    Cartesian2,
-} from 'cesium';
-import CoordTransform from './CoordTransform';
+	WebMercatorProjection,
+	WebMercatorTilingScheme,
+	Math,
+	Cartographic,
+	Cartesian2,
+} from 'cesium'
+import CoordTransform from './CoordTransform'
 
 class AmapMercatorTilingScheme extends WebMercatorTilingScheme {
-    constructor() {
-        super();
+	constructor() {
+		super()
 
-        let projection = new WebMercatorProjection();
+		let projection = new WebMercatorProjection()
 
-        this._projection.project = function (cartographic, result) {
-            result = CoordTransform.WGS84ToGCJ02(
-                Math.toDegrees(cartographic.longitude),
-                Math.toDegrees(cartographic.latitude),
-            );
-            result = projection.project(
-                new Cartographic(
-                    Math.toRadians(result[0]),
-                    Math.toRadians(result[1]),
-                ),
-            );
-            return new Cartesian2(result.x, result.y);
-        };
+		this._projection.project = function (cartographic, result) {
+			result = CoordTransform.WGS84ToGCJ02(
+				Math.toDegrees(cartographic.longitude),
+				Math.toDegrees(cartographic.latitude)
+			)
+			result = projection.project(
+				new Cartographic(Math.toRadians(result[0]), Math.toRadians(result[1]))
+			)
+			return new Cartesian2(result.x, result.y)
+		}
 
-        this._projection.unproject = function (cartesian, result) {
-            let cartographic = projection.unproject(cartesian);
-            result = CoordTransform.GCJ02ToWGS84(
-                Math.toDegrees(cartographic.longitude),
-                Math.toDegrees(cartographic.latitude),
-            );
-            return new Cartographic(
-                Math.toRadians(result[0]),
-                Math.toRadians(result[1]),
-            );
-        };
-    }
+		this._projection.unproject = function (cartesian, result) {
+			let cartographic = projection.unproject(cartesian)
+			result = CoordTransform.GCJ02ToWGS84(
+				Math.toDegrees(cartographic.longitude),
+				Math.toDegrees(cartographic.latitude)
+			)
+			return new Cartographic(Math.toRadians(result[0]), Math.toRadians(result[1]))
+		}
+	}
 }
 
-export default AmapMercatorTilingScheme;
+export default AmapMercatorTilingScheme
diff --git a/src/utils/cesium/ImageTrailMaterial.js b/src/utils/cesium/ImageTrailMaterial.js
index 1e1092c..272ed12 100644
--- a/src/utils/cesium/ImageTrailMaterial.js
+++ b/src/utils/cesium/ImageTrailMaterial.js
@@ -1,85 +1,80 @@
-import * as Cesium from 'cesium';
+import * as Cesium from 'cesium'
 /**
  * 定义Cesium材质对象
  */
 class ImageTrailMaterial {
-    constructor(options = {}) {
-        this._definitionChanged = new Cesium.Event();
-        this._color = void 0;
-        this._colorSubscription = void 0;
-        this._speed = void 0;
-        this._speedSubscription = void 0;
-        this._image = void 0;
-        this._imageSubscription = void 0;
-        this._repeat = void 0;
-        this._repeatSubscription = void 0;
-        this.color = options.color || Cesium.Color.fromBytes(0, 0, 255, 255);
-        this.speed = options.speed || 1;
-        this.image = options.image;
-        this.repeat = new Cesium.Cartesian2(
-            options.repeat?.x || 1,
-            options.repeat?.y || 1,
-        );
-    }
+	constructor(options = {}) {
+		this._definitionChanged = new Cesium.Event()
+		this._color = void 0
+		this._colorSubscription = void 0
+		this._speed = void 0
+		this._speedSubscription = void 0
+		this._image = void 0
+		this._imageSubscription = void 0
+		this._repeat = void 0
+		this._repeatSubscription = void 0
+		this.color = options.color || Cesium.Color.fromBytes(0, 0, 255, 255)
+		this.speed = options.speed || 1
+		this.image = options.image
+		this.repeat = new Cesium.Cartesian2(options.repeat?.x || 1, options.repeat?.y || 1)
+	}
 
-    get isConstant() {
-        return false;
-    }
+	get isConstant() {
+		return false
+	}
 
-    get definitionChanged() {
-        return this._definitionChanged;
-    }
+	get definitionChanged() {
+		return this._definitionChanged
+	}
 
-    getType() {
-        return Cesium.Material.ImageTrailMaterialType;
-    }
+	getType() {
+		return Cesium.Material.ImageTrailMaterialType
+	}
 
-    getValue(time, result) {
-        if (!result) {
-            result = {};
-        }
-        result.color = Cesium.Property.getValueOrUndefined(this._color, time);
-        result.image = Cesium.Property.getValueOrUndefined(this._image, time);
-        result.repeat = Cesium.Property.getValueOrUndefined(this._repeat, time);
-        result.speed = this._speed;
-        return result;
-    }
+	getValue(time, result) {
+		if (!result) {
+			result = {}
+		}
+		result.color = Cesium.Property.getValueOrUndefined(this._color, time)
+		result.image = Cesium.Property.getValueOrUndefined(this._image, time)
+		result.repeat = Cesium.Property.getValueOrUndefined(this._repeat, time)
+		result.speed = this._speed
+		return result
+	}
 
-    equals(other) {
-        return (
-            this === other ||
-            (other instanceof ImageTrailMaterial &&
-                Cesium.Property.equals(this._color, other._color) &&
-                Cesium.Property.equals(this._image, other._image) &&
-                Cesium.Property.equals(this._repeat, other._repeat) &&
-                Cesium.Property.equals(this._speed, other._speed))
-        );
-    }
+	equals(other) {
+		return (
+			this === other ||
+			(other instanceof ImageTrailMaterial &&
+				Cesium.Property.equals(this._color, other._color) &&
+				Cesium.Property.equals(this._image, other._image) &&
+				Cesium.Property.equals(this._repeat, other._repeat) &&
+				Cesium.Property.equals(this._speed, other._speed))
+		)
+	}
 }
 
 Object.defineProperties(ImageTrailMaterial.prototype, {
-    color: Cesium.createPropertyDescriptor('color'),
-    speed: Cesium.createPropertyDescriptor('speed'),
-    image: Cesium.createPropertyDescriptor('image'),
-    repeat: Cesium.createPropertyDescriptor('repeat'),
-});
+	color: Cesium.createPropertyDescriptor('color'),
+	speed: Cesium.createPropertyDescriptor('speed'),
+	image: Cesium.createPropertyDescriptor('image'),
+	repeat: Cesium.createPropertyDescriptor('repeat'),
+})
 //材质类型
-Cesium.Material.ImageTrailMaterialType = 'PolylineImageTrail';
+Cesium.Material.ImageTrailMaterialType = 'PolylineImageTrail'
 //添加材质到缓冲区中
-Cesium.Material._materialCache.addMaterial(
-    Cesium.Material.ImageTrailMaterialType,
-    {
-        fabric: {
-            type: Cesium.Material.ImageTrailMaterialType,
-            //uniform变量
-            uniforms: {
-                color: new Cesium.Color(1.0, 0.0, 0.0, 0.7),
-                image: Cesium.Material.DefaultImageId,
-                speed: 1,
-                repeat: new Cesium.Cartesian2(1, 1),
-            },
-            //
-            source: `
+Cesium.Material._materialCache.addMaterial(Cesium.Material.ImageTrailMaterialType, {
+	fabric: {
+		type: Cesium.Material.ImageTrailMaterialType,
+		//uniform变量
+		uniforms: {
+			color: new Cesium.Color(1.0, 0.0, 0.0, 0.7),
+			image: Cesium.Material.DefaultImageId,
+			speed: 1,
+			repeat: new Cesium.Cartesian2(1, 1),
+		},
+		//
+		source: `
                     uniform sampler2D image; 
                     uniform float speed;
                     uniform vec4 color;
@@ -95,13 +90,12 @@
                         return material;
                     }
                     `,
-        },
-        translucent: function () {
-            return true;
-        },
-    },
-);
-export default ImageTrailMaterial;
+	},
+	translucent: function () {
+		return true
+	},
+})
+export default ImageTrailMaterial
 
 //之前的航线材质编写
 // source: `
diff --git a/src/utils/cesium/common.js b/src/utils/cesium/common.js
index b93ec12..db8e80d 100644
--- a/src/utils/cesium/common.js
+++ b/src/utils/cesium/common.js
@@ -6,189 +6,154 @@
  * @FilePath: /bigScreen/src/utils/cesium/common.js
  * @Description:
  */
-import * as Cesium from 'cesium';
-import JsZip from 'jszip';
-import _ from 'lodash';
-import axios from 'axios';
-import { analyzeKmzFile, XMLToJSON } from './kmz';
-import { getCenterPoint, getLnglatDist, getShortestDistance } from './mapUtil';
+import * as Cesium from 'cesium'
+import JsZip from 'jszip'
+import _ from 'lodash'
+import axios from 'axios'
+import { analyzeKmzFile, XMLToJSON } from './kmz'
+import { getCenterPoint, getLnglatDist, getShortestDistance } from './mapUtil'
 
 // 图斑航线计算
 export const polygonRoutePlanning = (polygonList, startPostion) => {
-    // 起始点位
-    const { longitude, latitude } = startPostion;
-    // 计算中心点
-    const polygonCenterArr = polygonList.map((polygon) => {
-        const newPolygon = [
-            ...new Set(polygon.map((lnglat) => lnglat.join(','))),
-        ];
-        return {
-            center: getCenterPoint(polygon),
-            polygon: newPolygon.map((item) => item.split(',')),
-        };
-    });
-    // 机场到中心点的距离排序
-    const airportDistanceArr = polygonCenterArr.sort((prev, next) => {
-        const prevDistance = getLnglatDist(
-            longitude,
-            latitude,
-            prev.center.lng,
-            prev.center.lat,
-        );
-        const nextDistance = getLnglatDist(
-            longitude,
-            latitude,
-            next.center.lng,
-            next.center.lat,
-        );
-        return prevDistance - nextDistance;
-    });
+	// 起始点位
+	const { longitude, latitude } = startPostion
+	// 计算中心点
+	const polygonCenterArr = polygonList.map(polygon => {
+		const newPolygon = [...new Set(polygon.map(lnglat => lnglat.join(',')))]
+		return {
+			center: getCenterPoint(polygon),
+			polygon: newPolygon.map(item => item.split(',')),
+		}
+	})
+	// 机场到中心点的距离排序
+	const airportDistanceArr = polygonCenterArr.sort((prev, next) => {
+		const prevDistance = getLnglatDist(longitude, latitude, prev.center.lng, prev.center.lat)
+		const nextDistance = getLnglatDist(longitude, latitude, next.center.lng, next.center.lat)
+		return prevDistance - nextDistance
+	})
 
-    const sortPolygon = [];
-    function getFirstPolygon(arr, start) {
-        const { slongitude, slatitude } = start;
-        // 机场到中心点的距离排序
-        const airportDistanceArr = arr.sort((prev, next) => {
-            const prevDistance = getLnglatDist(
-                slongitude,
-                slatitude,
-                prev.center.lng,
-                prev.center.lat,
-            );
-            const nextDistance = getLnglatDist(
-                slongitude,
-                slatitude,
-                next.center.lng,
-                next.center.lat,
-            );
-            return prevDistance - nextDistance;
-        });
-        const polygon = _.cloneDeep(airportDistanceArr[0]);
-        if (polygon === void 0) return;
-        sortPolygon.push(polygon);
-        airportDistanceArr.splice(0, 1);
-        if (airportDistanceArr.length > 0) {
-            getFirstPolygon(airportDistanceArr, {
-                slongitude: polygon.center.lng,
-                slatitude: polygon.center.lat,
-            });
-        }
-    }
-    getFirstPolygon(polygonCenterArr, {
-        slongitude: longitude,
-        slatitude: latitude,
-    });
-    // 计算图斑内点位飞行顺序
-    let result = [[longitude, latitude]];
-    sortPolygon.forEach((item, index) => {
-        const { polygon } = item;
-        // 取出当前图斑之前最后一个点
-        const prevPolygon = result[result.length - 1];
-        const [slng, slat] = prevPolygon;
-        const nextPolygon = airportDistanceArr[index + 1];
-        // 求出距离上一个点最近的点,作为第一个点
-        const sequence = polygon.sort((prev, next) => {
-            const [prevLng, prevLat] = prev;
-            const [nextLng, nextLat] = next;
-            const prevDistance = getLnglatDist(slng, slat, prevLng, prevLat);
-            const nextDistance = getLnglatDist(slng, slat, nextLng, nextLat);
-            return prevDistance - nextDistance;
-        });
-        // 第一个点位
-        const firstLnglat = [...sequence[0]];
-        // 去除第一个点位
-        const cloneSequence = _.cloneDeep(sequence);
-        cloneSequence.splice(0, 1);
-        if (nextPolygon) {
-            // 获取两个经纬度组两个最近的点位
-            const { index: lnglatIndex } = getShortestDistance(
-                cloneSequence,
-                nextPolygon.polygon,
-            );
-            const lastLnglat = _.cloneDeep(cloneSequence[lnglatIndex[0]]);
-            // 删除飞行的最后一个点
-            cloneSequence.splice(lnglatIndex[0], 1);
-            const centerLnglatList = cloneSequence.sort((prev, next) => {
-                const [prevLng, prevLat] = prev;
-                const [nextLng, nextLat] = next;
-                const prevDistance = getLnglatDist(
-                    longitude,
-                    latitude,
-                    prevLng,
-                    prevLat,
-                );
-                const nextDistance = getLnglatDist(
-                    longitude,
-                    latitude,
-                    nextLng,
-                    nextLat,
-                );
-                return prevDistance - nextDistance;
-            });
-            result = [...result, firstLnglat, ...centerLnglatList, lastLnglat];
-        } else {
-            // const last = polygon.sort((prev, next) => {
-            //   const [prevLng, prevLat] = prev;
-            //   const [nextLng, nextLat] = next;
-            //   const prevDistance = getLnglatDist(longitude, latitude, prevLng, prevLat);
-            //   const nextDistance = getLnglatDist(longitude, latitude, nextLng, nextLat);
-            //   return prevDistance - nextDistance;
-            // });
-            result = [...result, ...sequence];
-            // result = [...result, ...last]
-        }
-    });
-    return result;
-};
+	const sortPolygon = []
+	function getFirstPolygon(arr, start) {
+		const { slongitude, slatitude } = start
+		// 机场到中心点的距离排序
+		const airportDistanceArr = arr.sort((prev, next) => {
+			const prevDistance = getLnglatDist(slongitude, slatitude, prev.center.lng, prev.center.lat)
+			const nextDistance = getLnglatDist(slongitude, slatitude, next.center.lng, next.center.lat)
+			return prevDistance - nextDistance
+		})
+		const polygon = _.cloneDeep(airportDistanceArr[0])
+		if (polygon === void 0) return
+		sortPolygon.push(polygon)
+		airportDistanceArr.splice(0, 1)
+		if (airportDistanceArr.length > 0) {
+			getFirstPolygon(airportDistanceArr, {
+				slongitude: polygon.center.lng,
+				slatitude: polygon.center.lat,
+			})
+		}
+	}
+	getFirstPolygon(polygonCenterArr, {
+		slongitude: longitude,
+		slatitude: latitude,
+	})
+	// 计算图斑内点位飞行顺序
+	let result = [[longitude, latitude]]
+	sortPolygon.forEach((item, index) => {
+		const { polygon } = item
+		// 取出当前图斑之前最后一个点
+		const prevPolygon = result[result.length - 1]
+		const [slng, slat] = prevPolygon
+		const nextPolygon = airportDistanceArr[index + 1]
+		// 求出距离上一个点最近的点,作为第一个点
+		const sequence = polygon.sort((prev, next) => {
+			const [prevLng, prevLat] = prev
+			const [nextLng, nextLat] = next
+			const prevDistance = getLnglatDist(slng, slat, prevLng, prevLat)
+			const nextDistance = getLnglatDist(slng, slat, nextLng, nextLat)
+			return prevDistance - nextDistance
+		})
+		// 第一个点位
+		const firstLnglat = [...sequence[0]]
+		// 去除第一个点位
+		const cloneSequence = _.cloneDeep(sequence)
+		cloneSequence.splice(0, 1)
+		if (nextPolygon) {
+			// 获取两个经纬度组两个最近的点位
+			const { index: lnglatIndex } = getShortestDistance(cloneSequence, nextPolygon.polygon)
+			const lastLnglat = _.cloneDeep(cloneSequence[lnglatIndex[0]])
+			// 删除飞行的最后一个点
+			cloneSequence.splice(lnglatIndex[0], 1)
+			const centerLnglatList = cloneSequence.sort((prev, next) => {
+				const [prevLng, prevLat] = prev
+				const [nextLng, nextLat] = next
+				const prevDistance = getLnglatDist(longitude, latitude, prevLng, prevLat)
+				const nextDistance = getLnglatDist(longitude, latitude, nextLng, nextLat)
+				return prevDistance - nextDistance
+			})
+			result = [...result, firstLnglat, ...centerLnglatList, lastLnglat]
+		} else {
+			// const last = polygon.sort((prev, next) => {
+			//   const [prevLng, prevLat] = prev;
+			//   const [nextLng, nextLat] = next;
+			//   const prevDistance = getLnglatDist(longitude, latitude, prevLng, prevLat);
+			//   const nextDistance = getLnglatDist(longitude, latitude, nextLng, nextLat);
+			//   return prevDistance - nextDistance;
+			// });
+			result = [...result, ...sequence]
+			// result = [...result, ...last]
+		}
+	})
+	return result
+}
 
-export const getWaylineFilePoints = async (fileUrl) => {
-    const fileRes = await analyzeKmzFile(fileUrl);
-    const waylineContent = await fileRes['fileInfoObj']?.['wpmz/waylines.wpml'];
-    const xml = XMLToJSON(waylineContent);
-    const placemarkArr = xml?.Document?.Folder.Placemark;
-    const points = placemarkArr.map((placemark) => {
-        const lnglat = placemark.Point.coordinates?.['#text'].split(',');
-        return {
-            longitude: lnglat[0],
-            latitude: lnglat[1],
-        };
-    });
-    return points;
-};
+export const getWaylineFilePoints = async fileUrl => {
+	const fileRes = await analyzeKmzFile(fileUrl)
+	const waylineContent = await fileRes['fileInfoObj']?.['wpmz/waylines.wpml']
+	const xml = XMLToJSON(waylineContent)
+	const placemarkArr = xml?.Document?.Folder.Placemark
+	const points = placemarkArr.map(placemark => {
+		const lnglat = placemark.Point.coordinates?.['#text'].split(',')
+		return {
+			longitude: lnglat[0],
+			latitude: lnglat[1],
+		}
+	})
+	return points
+}
 
 // 传入方向,计算移动点位经纬度
 export function movePosition(lon, lat, heading, direction) {
-    // 计算朝向角度的弧度值(Cesium 是基于地理坐标系,heading=0 指向正北)
-    const headingRad = Cesium.Math.toRadians(heading);
-    const moveStep = 0.00005; // 移动步长
-    let newLon = lon;
-    let newLat = lat;
+	// 计算朝向角度的弧度值(Cesium 是基于地理坐标系,heading=0 指向正北)
+	const headingRad = Cesium.Math.toRadians(heading)
+	const moveStep = 0.00005 // 移动步长
+	let newLon = lon
+	let newLat = lat
 
-    switch (direction) {
-        case "W": // 向前(heading 方向)
-            newLon += moveStep * Math.sin(headingRad);
-            newLat += moveStep * Math.cos(headingRad);
-            break;
+	switch (direction) {
+		case 'W': // 向前(heading 方向)
+			newLon += moveStep * Math.sin(headingRad)
+			newLat += moveStep * Math.cos(headingRad)
+			break
 
-        case "S": // 向后(反方向)
-            newLon -= moveStep * Math.sin(headingRad);
-            newLat -= moveStep * Math.cos(headingRad);
-            break;
+		case 'S': // 向后(反方向)
+			newLon -= moveStep * Math.sin(headingRad)
+			newLat -= moveStep * Math.cos(headingRad)
+			break
 
-        case "D": // 向右(heading + 90°)
-            newLon += moveStep * Math.cos(headingRad);
-            newLat -= moveStep * Math.sin(headingRad);
-            break;
+		case 'D': // 向右(heading + 90°)
+			newLon += moveStep * Math.cos(headingRad)
+			newLat -= moveStep * Math.sin(headingRad)
+			break
 
-        case "A": // 向左(heading - 90°)
-            newLon -= moveStep * Math.cos(headingRad);
-            newLat += moveStep * Math.sin(headingRad);
-            break;
+		case 'A': // 向左(heading - 90°)
+			newLon -= moveStep * Math.cos(headingRad)
+			newLat += moveStep * Math.sin(headingRad)
+			break
 
-        default:
-            console.warn("无效方向");
-            return null;
-    }
+		default:
+			console.warn('无效方向')
+			return null
+	}
 
-    return { longitude: newLon, latitude: newLat };
+	return { longitude: newLon, latitude: newLat }
 }
diff --git a/src/utils/cesium/compressImage.js b/src/utils/cesium/compressImage.js
index 7c99c18..0b09680 100644
--- a/src/utils/cesium/compressImage.js
+++ b/src/utils/cesium/compressImage.js
@@ -7,49 +7,49 @@
  * @return {*}
  */
 function compressImage(src, quality, maxWidth, callback) {
-    const img = new Image();
-    img.setAttribute('crossOrigin', 'Anonymous');
-    img.onload = function () {
-        const canvas = document.createElement('canvas');
-        const ctx = canvas.getContext('2d');
-        let width = img.width;
-        let height = img.height;
+	const img = new Image()
+	img.setAttribute('crossOrigin', 'Anonymous')
+	img.onload = function () {
+		const canvas = document.createElement('canvas')
+		const ctx = canvas.getContext('2d')
+		let width = img.width
+		let height = img.height
 
-        if (width > maxWidth) {
-            height *= maxWidth / width;
-            width = maxWidth;
-        }
+		if (width > maxWidth) {
+			height *= maxWidth / width
+			width = maxWidth
+		}
 
-        canvas.width = width;
-        canvas.height = height;
-        ctx.drawImage(img, 0, 0, width, height);
+		canvas.width = width
+		canvas.height = height
+		ctx.drawImage(img, 0, 0, width, height)
 
-        const newData = canvas.toDataURL('image/jpeg', quality);
-        // 使用atob()将base64转换为二进制字符串
-        const binaryString = window.atob(newData.split(',')[1]);
-        const mimeString = newData.split(',')[0].split(':')[1].split(';')[0];
-        // 创建Blob对象
-        const array = [];
-        for (let i = 0; i < binaryString.length; i++) {
-            array.push(binaryString.charCodeAt(i));
-        }
-        const blob = new Blob([new Uint8Array(array)], { type: mimeString });
+		const newData = canvas.toDataURL('image/jpeg', quality)
+		// 使用atob()将base64转换为二进制字符串
+		const binaryString = window.atob(newData.split(',')[1])
+		const mimeString = newData.split(',')[0].split(':')[1].split(';')[0]
+		// 创建Blob对象
+		const array = []
+		for (let i = 0; i < binaryString.length; i++) {
+			array.push(binaryString.charCodeAt(i))
+		}
+		const blob = new Blob([new Uint8Array(array)], { type: mimeString })
 
-        callback(blob);
-    };
-    img.src = src;
+		callback(blob)
+	}
+	img.src = src
 
-    return src;
+	return src
 }
 
 export default function imageCompress(src, quality, maxWidth) {
-    // 使用例子
-    return compressImage(src, quality, maxWidth, function (blob) {
-        // 创建一个新的图片URL
-        const imageUrl = URL.createObjectURL(blob);
-        // 可以在这里使用imageUrl,比如设置为img元素的src
-        // document.getElementById('your-image-element').src = imageUrl;
-        // 当不需要这个URL的时候,释放它
-        URL.revokeObjectURL(imageUrl);
-    });
+	// 使用例子
+	return compressImage(src, quality, maxWidth, function (blob) {
+		// 创建一个新的图片URL
+		const imageUrl = URL.createObjectURL(blob)
+		// 可以在这里使用imageUrl,比如设置为img元素的src
+		// document.getElementById('your-image-element').src = imageUrl;
+		// 当不需要这个URL的时候,释放它
+		URL.revokeObjectURL(imageUrl)
+	})
 }
diff --git a/src/utils/cesium/compressImage2.js b/src/utils/cesium/compressImage2.js
index 0fa39fc..e28a427 100644
--- a/src/utils/cesium/compressImage2.js
+++ b/src/utils/cesium/compressImage2.js
@@ -8,39 +8,39 @@
  * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
  */
 export default function compressImage(
-    src,
-    maxWidth,
-    maxHeight,
-    outputFormat = 'image/jpeg',
-    quality = 0.7,
+	src,
+	maxWidth,
+	maxHeight,
+	outputFormat = 'image/jpeg',
+	quality = 0.7
 ) {
-    return new Promise((resolve, reject) => {
-        const image = new Image();
-        image.setAttribute('crossOrigin', 'Anonymous');
-        image.src = src;
-        image.onload = () => {
-            let width = image.width;
-            let height = image.height;
+	return new Promise((resolve, reject) => {
+		const image = new Image()
+		image.setAttribute('crossOrigin', 'Anonymous')
+		image.src = src
+		image.onload = () => {
+			let width = image.width
+			let height = image.height
 
-            if (width > maxWidth) {
-                height *= maxWidth / width;
-                width = maxWidth;
-            }
+			if (width > maxWidth) {
+				height *= maxWidth / width
+				width = maxWidth
+			}
 
-            if (height > maxHeight) {
-                width *= maxHeight / height;
-                height = maxHeight;
-            }
+			if (height > maxHeight) {
+				width *= maxHeight / height
+				height = maxHeight
+			}
 
-            const canvas = document.createElement('canvas');
-            canvas.width = width;
-            canvas.height = height;
-            const ctx = canvas.getContext('2d');
-            ctx.drawImage(image, 0, 0, width, height);
+			const canvas = document.createElement('canvas')
+			canvas.width = width
+			canvas.height = height
+			const ctx = canvas.getContext('2d')
+			ctx.drawImage(image, 0, 0, width, height)
 
-            const newDataUrl = canvas.toDataURL(outputFormat, quality);
-            resolve(newDataUrl);
-        };
-        image.onerror = reject;
-    });
+			const newDataUrl = canvas.toDataURL(outputFormat, quality)
+			resolve(newDataUrl)
+		}
+		image.onerror = reject
+	})
 }
diff --git a/src/utils/cesium/frustum/CreateFrustum.js b/src/utils/cesium/frustum/CreateFrustum.js
index 745a1ca..00a8423 100644
--- a/src/utils/cesium/frustum/CreateFrustum.js
+++ b/src/utils/cesium/frustum/CreateFrustum.js
@@ -1,275 +1,255 @@
 // * 创建视锥
-import * as Cesium from 'cesium';
+import * as Cesium from 'cesium'
 
 /* eslint-disable new-cap */
 /* eslint-disable no-undef */
 export default class CreateFrustum {
-  constructor(viewer, options) {
-    this.position = options.position;
-    this.viewer = viewer;
-    this.fov = options.fov || 0;
-    this.near = options.near || 0;
-    this.far = options.far || 0;
-    this.heading = options.heading || 0;
-    this.pitch = options.pitch || 0;
-    this.roll = options.roll || 0;
-    this.width = options.width;
-    this.height = options.height;
-    this.add();
-  }
+	constructor(viewer, options) {
+		this.position = options.position
+		this.viewer = viewer
+		this.fov = options.fov || 0
+		this.near = options.near || 0
+		this.far = options.far || 0
+		this.heading = options.heading || 0
+		this.pitch = options.pitch || 0
+		this.roll = options.roll || 0
+		this.width = options.width
+		this.height = options.height
+		this.add()
+	}
 
-  UpdateWidth(value) {
-    this.width = value;
-    this.add();
-  }
-  UpdateHeight(value) {
-    this.height = value;
-    this.add();
-  }
-  UpdateFov(value) {
-    this.fov = value;
-    this.add();
-  }
-  UpdateNear(value) {
-    this.near = value;
-    this.add();
-  }
-  UpdateFar(value) {
-    this.far = value;
-    this.add();
-  }
-  UpdateHeading(value) {
-    this.heading = value;
-    this.add();
-  }
-  UpdatePitch(value) {
-    this.pitch = value;
-    this.add();
-  }
-  UpdateRoll(value) {
-    this.roll = value;
-    this.add();
-  }
-  UpdataPosition(position) {
-    if (!position) return;
-    this.position = position;
-    this.add();
-  }
+	UpdateWidth(value) {
+		this.width = value
+		this.add()
+	}
+	UpdateHeight(value) {
+		this.height = value
+		this.add()
+	}
+	UpdateFov(value) {
+		this.fov = value
+		this.add()
+	}
+	UpdateNear(value) {
+		this.near = value
+		this.add()
+	}
+	UpdateFar(value) {
+		this.far = value
+		this.add()
+	}
+	UpdateHeading(value) {
+		this.heading = value
+		this.add()
+	}
+	UpdatePitch(value) {
+		this.pitch = value
+		this.add()
+	}
+	UpdateRoll(value) {
+		this.roll = value
+		this.add()
+	}
+	UpdataPosition(position) {
+		if (!position) return
+		this.position = position
+		this.add()
+	}
 
-  // 更新视锥体的姿态
-  Update(position, headingPitchRoll) {
-    this.position = Cesium.Cartesian3.fromDegrees(
-      position.longitude,
-      position.latitude,
-      position.altitude,
-    );
-    this.orientation = Cesium.Transforms.headingPitchRollQuaternion(
-      this.position,
-      new Cesium.HeadingPitchRoll.fromDegrees(
-        headingPitchRoll.heading,
-        headingPitchRoll.pitch,
-        headingPitchRoll.roll,
-      ),
-    );
-    this.add();
-  }
+	// 更新视锥体的姿态
+	Update(position, headingPitchRoll) {
+		this.position = Cesium.Cartesian3.fromDegrees(
+			position.longitude,
+			position.latitude,
+			position.altitude
+		)
+		this.orientation = Cesium.Transforms.headingPitchRollQuaternion(
+			this.position,
+			new Cesium.HeadingPitchRoll.fromDegrees(
+				headingPitchRoll.heading,
+				headingPitchRoll.pitch,
+				headingPitchRoll.roll
+			)
+		)
+		this.add()
+	}
 
-  // 创建视锥体和轮廓线
-  add() {
-    this.clear();
-    this.addFrustum();
-    this.addOutline();
-    this.addCenterline();
-  }
+	// 创建视锥体和轮廓线
+	add() {
+		this.clear()
+		this.addFrustum()
+		this.addOutline()
+		this.addCenterline()
+	}
 
-  // 清除视锥体和轮廓线
-  clear() {
-    this.clearFrustum();
-    this.clearOutline();
-    this.clearCenterline();
-  }
+	// 清除视锥体和轮廓线
+	clear() {
+		this.clearFrustum()
+		this.clearOutline()
+		this.clearCenterline()
+	}
 
-  // 清除视锥体
-  clearFrustum() {
-    if (this.frustumPrimitive) {
-      this.viewer.scene.primitives.remove(this.frustumPrimitive);
-      this.frustumPrimitive = null;
-    }
-  }
+	// 清除视锥体
+	clearFrustum() {
+		if (this.frustumPrimitive) {
+			this.viewer.scene.primitives.remove(this.frustumPrimitive)
+			this.frustumPrimitive = null
+		}
+	}
 
-  // 清除轮廓线
-  clearOutline() {
-    if (this.outlinePrimitive) {
-      this.viewer.scene.primitives.remove(this.outlinePrimitive);
-      this.outlinePrimitive = null;
-    }
-  }
+	// 清除轮廓线
+	clearOutline() {
+		if (this.outlinePrimitive) {
+			this.viewer.scene.primitives.remove(this.outlinePrimitive)
+			this.outlinePrimitive = null
+		}
+	}
 
-  clearCenterline() {
-    if (this.centerDataSource) {
-      this.centerDataSource.entities.removeAll();
-      this.viewer.dataSources.remove(this.centerDataSource);
-      this.centerDataSource = null;
-    }
-  }
+	clearCenterline() {
+		if (this.centerDataSource) {
+			this.centerDataSource.entities.removeAll()
+			this.viewer.dataSources.remove(this.centerDataSource)
+			this.centerDataSource = null
+		}
+	}
 
-  // 创建视锥体
-  addFrustum() {
-    const frustum = new Cesium.PerspectiveFrustum({
-      // 查看的视场角,绕Z轴旋转,以弧度方式输入
-      fov: Cesium.Math.toRadians(this.fov),
-      // 视锥体的宽度/高度
-      aspectRatio: this.width / this.height,
-      // 近面距视点的距离
-      near: this.near,
-      // 远面距视点的距离
-      far: this.far,
-    });
-    const position = Cesium.Cartesian3.fromDegrees(
-      this.position.longitude,
-      this.position.latitude,
-      this.position.altitude,
-    );
-    const geometry = new Cesium.FrustumGeometry({
-      frustum: frustum,
-      origin: position,
-      orientation: Cesium.Transforms.headingPitchRollQuaternion(
-        position,
-        new Cesium.HeadingPitchRoll.fromDegrees(
-          this.heading,
-          this.pitch,
-          this.roll,
-        ),
-      ),
-      vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
-    });
-    const instance = new Cesium.GeometryInstance({
-      geometry: geometry,
-      attributes: {
-        color: Cesium.ColorGeometryInstanceAttribute.fromColor(
-          Cesium.Color.fromBytes(0, 213, 144, 20),
-        ),
-      },
-    });
-    const primitive = new Cesium.Primitive({
-      geometryInstances: instance,
-      appearance: new Cesium.PerInstanceColorAppearance({
-        closed: true,
-        flat: true,
-      }),
-      asynchronous: false,
-    });
-    this.frustumPrimitive = this.viewer.scene.primitives.add(primitive);
-  }
+	// 创建视锥体
+	addFrustum() {
+		const frustum = new Cesium.PerspectiveFrustum({
+			// 查看的视场角,绕Z轴旋转,以弧度方式输入
+			fov: Cesium.Math.toRadians(this.fov),
+			// 视锥体的宽度/高度
+			aspectRatio: this.width / this.height,
+			// 近面距视点的距离
+			near: this.near,
+			// 远面距视点的距离
+			far: this.far,
+		})
+		const position = Cesium.Cartesian3.fromDegrees(
+			this.position.longitude,
+			this.position.latitude,
+			this.position.altitude
+		)
+		const geometry = new Cesium.FrustumGeometry({
+			frustum: frustum,
+			origin: position,
+			orientation: Cesium.Transforms.headingPitchRollQuaternion(
+				position,
+				new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+			),
+			vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
+		})
+		const instance = new Cesium.GeometryInstance({
+			geometry: geometry,
+			attributes: {
+				color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+					Cesium.Color.fromBytes(0, 213, 144, 20)
+				),
+			},
+		})
+		const primitive = new Cesium.Primitive({
+			geometryInstances: instance,
+			appearance: new Cesium.PerInstanceColorAppearance({
+				closed: true,
+				flat: true,
+			}),
+			asynchronous: false,
+		})
+		this.frustumPrimitive = this.viewer.scene.primitives.add(primitive)
+	}
 
-  // 创建轮廓线
-  addOutline() {
-    const frustum = new Cesium.PerspectiveFrustum({
-      // 查看的视场角度,绕Z轴旋转,以弧度方式输入
-      // The angle of the field of view (FOV), in radians.
-      // This angle will be used as the horizontal FOV if the width is greater than the height, otherwise it will be the vertical FOV.
-      fov: Cesium.Math.toRadians(this.fov),
-      // 视锥体的宽度/高度
-      aspectRatio: this.width / this.height,
-      // 近面距视点的距离
-      near: this.near,
-      // 远面距视点的距离
-      far: this.far,
-    });
-    const position = Cesium.Cartesian3.fromDegrees(
-      this.position.longitude,
-      this.position.latitude,
-      this.position.altitude,
-    );
-    const geometry = new Cesium.FrustumOutlineGeometry({
-      frustum: frustum,
-      origin: position,
-      orientation: Cesium.Transforms.headingPitchRollQuaternion(
-        position,
-        new Cesium.HeadingPitchRoll.fromDegrees(
-          this.heading,
-          this.pitch,
-          this.roll,
-        ),
-      ),
-      vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
-    });
-    const instance = new Cesium.GeometryInstance({
-      geometry: geometry,
-      attributes: {
-        color: Cesium.ColorGeometryInstanceAttribute.fromColor(
-          Cesium.Color.fromBytes(0, 213, 144, 255),
-        ),
-      },
-    });
-    const primitive = new Cesium.Primitive({
-      geometryInstances: instance,
-      appearance: new Cesium.PerInstanceColorAppearance({
-        closed: true,
-        flat: true,
-      }),
-      asynchronous: false,
-    });
-    this.outlinePrimitive = this.viewer.scene.primitives.add(primitive);
-  }
+	// 创建轮廓线
+	addOutline() {
+		const frustum = new Cesium.PerspectiveFrustum({
+			// 查看的视场角度,绕Z轴旋转,以弧度方式输入
+			// The angle of the field of view (FOV), in radians.
+			// This angle will be used as the horizontal FOV if the width is greater than the height, otherwise it will be the vertical FOV.
+			fov: Cesium.Math.toRadians(this.fov),
+			// 视锥体的宽度/高度
+			aspectRatio: this.width / this.height,
+			// 近面距视点的距离
+			near: this.near,
+			// 远面距视点的距离
+			far: this.far,
+		})
+		const position = Cesium.Cartesian3.fromDegrees(
+			this.position.longitude,
+			this.position.latitude,
+			this.position.altitude
+		)
+		const geometry = new Cesium.FrustumOutlineGeometry({
+			frustum: frustum,
+			origin: position,
+			orientation: Cesium.Transforms.headingPitchRollQuaternion(
+				position,
+				new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+			),
+			vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
+		})
+		const instance = new Cesium.GeometryInstance({
+			geometry: geometry,
+			attributes: {
+				color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+					Cesium.Color.fromBytes(0, 213, 144, 255)
+				),
+			},
+		})
+		const primitive = new Cesium.Primitive({
+			geometryInstances: instance,
+			appearance: new Cesium.PerInstanceColorAppearance({
+				closed: true,
+				flat: true,
+			}),
+			asynchronous: false,
+		})
+		this.outlinePrimitive = this.viewer.scene.primitives.add(primitive)
+	}
 
-  addCenterline() {
-    this.centerDataSource = new Cesium.CustomDataSource();
-    this.viewer.dataSources.add(this.centerDataSource);
+	addCenterline() {
+		this.centerDataSource = new Cesium.CustomDataSource()
+		this.viewer.dataSources.add(this.centerDataSource)
 
-    const position = Cesium.Cartesian3.fromDegrees(
-      this.position.longitude,
-      this.position.latitude,
-      this.position.altitude,
-    );
+		const position = Cesium.Cartesian3.fromDegrees(
+			this.position.longitude,
+			this.position.latitude,
+			this.position.altitude
+		)
 
-    let matrix = Cesium.Matrix3.fromQuaternion(
-      Cesium.Transforms.headingPitchRollQuaternion(
-        position,
-        new Cesium.HeadingPitchRoll.fromDegrees(
-          this.heading,
-          this.pitch,
-          this.roll,
-        ),
-      ),
-      new Cesium.Matrix3(),
-    );
+		let matrix = Cesium.Matrix3.fromQuaternion(
+			Cesium.Transforms.headingPitchRollQuaternion(
+				position,
+				new Cesium.HeadingPitchRoll.fromDegrees(this.heading, this.pitch, this.roll)
+			),
+			new Cesium.Matrix3()
+		)
 
-    let right1 = Cesium.Matrix3.getColumn(matrix, 0, new Cesium.Cartesian3());
-    let up1 = Cesium.Matrix3.getColumn(matrix, 1, new Cesium.Cartesian3());
-    let direction = Cesium.Matrix3.getColumn(
-      matrix,
-      2,
-      new Cesium.Cartesian3(),
-    );
+		let right1 = Cesium.Matrix3.getColumn(matrix, 0, new Cesium.Cartesian3())
+		let up1 = Cesium.Matrix3.getColumn(matrix, 1, new Cesium.Cartesian3())
+		let direction = Cesium.Matrix3.getColumn(matrix, 2, new Cesium.Cartesian3())
 
-    // const direction = new Cartesian3(-0.10668226241650887, 0.8103322335050215, -0.5761775474872814)
+		// const direction = new Cartesian3(-0.10668226241650887, 0.8103322335050215, -0.5761775474872814)
 
-    let frontDirect = Cesium.Cartesian3.multiplyByScalar(
-      direction,
-      this.far,
-      new Cesium.Cartesian3(),
-    );
-    let bottomCenter = Cesium.Cartesian3.add(
-      position,
-      frontDirect,
-      new Cesium.Cartesian3(),
-    );
+		let frontDirect = Cesium.Cartesian3.multiplyByScalar(
+			direction,
+			this.far,
+			new Cesium.Cartesian3()
+		)
+		let bottomCenter = Cesium.Cartesian3.add(position, frontDirect, new Cesium.Cartesian3())
 
-    // 创建Entity来显示中心线
-    this.centerDataSource.entities.add({
-      name: 'Center Line of Frustum',
-      polyline: {
-        positions: [position, bottomCenter],
-        width: 1,
-        // material: Cesium.Color.RED.withAlpha(0.5)
-        material: new Cesium.PolylineDashMaterialProperty({
-          color: Cesium.Color.fromBytes(0, 213, 144, 255),
-          dashLength: 30.0,
-          gapColor: Cesium.Color.TRANSPARENT,
-          gapWidth: 1.0,
-        }),
-      },
-    });
-  }
+		// 创建Entity来显示中心线
+		this.centerDataSource.entities.add({
+			name: 'Center Line of Frustum',
+			polyline: {
+				positions: [position, bottomCenter],
+				width: 1,
+				// material: Cesium.Color.RED.withAlpha(0.5)
+				material: new Cesium.PolylineDashMaterialProperty({
+					color: Cesium.Color.fromBytes(0, 213, 144, 255),
+					dashLength: 30.0,
+					gapColor: Cesium.Color.TRANSPARENT,
+					gapWidth: 1.0,
+				}),
+			},
+		})
+	}
 }
diff --git a/src/utils/cesium/kmz.js b/src/utils/cesium/kmz.js
index 66e63a8..4ef1af9 100644
--- a/src/utils/cesium/kmz.js
+++ b/src/utils/cesium/kmz.js
@@ -1,91 +1,82 @@
-import axios from 'axios';
-import JsZip from 'jszip';
+import axios from 'axios'
+import JsZip from 'jszip'
 
-const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates'];
+const noWmpl = ['Folder', 'Placemark', 'Point', 'coordinates']
 
 /**
  * @description: 读取kmz文件解析出kml文件
  * @param {string} filePath 文件地址
  * @return {*}
  */
-export const analyzeKmzFile = (filePath) => {
-  return (
-    axios({
-      url: filePath,
-      method: 'get',
-      responseType: 'arraybuffer',
-      authorization: false
-    })
-      // .get(filePath, { responseType: 'arraybuffer' },)
-      .then((fileRes) => fileRes.data)
-      .then((kmzData) => JsZip.loadAsync(kmzData)) // 解压kmz文件
-      .then((zipFile) => {
-        const files = {};
-        Object.keys(zipFile.files).forEach((key) => {
-          files[key] = zipFile.files[key].async('text');
-        });
-        return {
-          zip: zipFile,
-          fileInfoObj: files,
-        };
-      })
-  );
-};
+export const analyzeKmzFile = filePath => {
+	return (
+		axios({
+			url: filePath,
+			method: 'get',
+			responseType: 'arraybuffer',
+			authorization: false,
+		})
+			// .get(filePath, { responseType: 'arraybuffer' },)
+			.then(fileRes => fileRes.data)
+			.then(kmzData => JsZip.loadAsync(kmzData)) // 解压kmz文件
+			.then(zipFile => {
+				const files = {}
+				Object.keys(zipFile.files).forEach(key => {
+					files[key] = zipFile.files[key].async('text')
+				})
+				return {
+					zip: zipFile,
+					fileInfoObj: files,
+				}
+			})
+	)
+}
 
 export const getKmlParams = (source, isWpml, params) => {
-  let regx = null;
-  if (isWpml) {
-    if (params.mode) {
-      regx = new RegExp(
-        `<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
-        params.mode,
-      );
-    } else {
-      regx = new RegExp(
-        `<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
-      );
-    }
-  } else {
-    if (params.mode) {
-      regx = new RegExp(
-        `<${params.name}>${params.findRegx}<\\/${params.name}>`,
-        params.mode,
-      );
-    } else {
-      regx = new RegExp(
-        `<${params.name}>${params.findRegx}<\\/${params.name}>`,
-      );
-    }
-  }
-  return source?.match(regx);
-};
+	let regx = null
+	if (isWpml) {
+		if (params.mode) {
+			regx = new RegExp(
+				`<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`,
+				params.mode
+			)
+		} else {
+			regx = new RegExp(`<wpml:${params.name}>${params.findRegx}<\\/wpml:${params.name}>`)
+		}
+	} else {
+		if (params.mode) {
+			regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`, params.mode)
+		} else {
+			regx = new RegExp(`<${params.name}>${params.findRegx}<\\/${params.name}>`)
+		}
+	}
+	return source?.match(regx)
+}
 
-export const generateKmlFormat = (settingParmas) => {
-  let paramGroup = '';
-  Object.keys(settingParmas).forEach((key) => {
-    if (
-      Object.prototype.toString.call(settingParmas[key]) === '[object Object]'
-    ) {
-      let parmaStr = '';
-      Object.keys(settingParmas[key]).forEach((v) => {
-        const xml = noWmpl.includes(key)
-          ? `<${v}>${settingParmas[key][v]}</${v}>`
-          : `<wpml:${v}>${settingParmas[key][v]}</wpml:${v}>`;
-        parmaStr += xml;
-      });
-      const xml = noWmpl.includes(key)
-        ? `<${key}>${parmaStr}</${key}>`
-        : `<wpml:${key}>${parmaStr}</wpml:${key}>`;
-      paramGroup += xml;
-    } else {
-      const xml = noWmpl.includes(key)
-        ? `<${key}>${settingParmas[key]}</${key}>`
-        : `<wpml:${key}>${settingParmas[key]}</wpml:${key}>`;
-      paramGroup += xml;
-    }
-  });
-  return paramGroup;
-};
+export const generateKmlFormat = settingParmas => {
+	let paramGroup = ''
+	Object.keys(settingParmas).forEach(key => {
+		if (Object.prototype.toString.call(settingParmas[key]) === '[object Object]') {
+			let parmaStr = ''
+			Object.keys(settingParmas[key]).forEach(v => {
+				const xml = noWmpl.includes(key)
+					? `<${v}>${settingParmas[key][v]}</${v}>`
+					: `<wpml:${v}>${settingParmas[key][v]}</wpml:${v}>`
+				parmaStr += xml
+			})
+			const xml = noWmpl.includes(key)
+				? `<${key}>${parmaStr}</${key}>`
+				: `<wpml:${key}>${parmaStr}</wpml:${key}>`
+			paramGroup += xml
+		} else {
+			const xml = noWmpl.includes(key)
+				? `<${key}>${settingParmas[key]}</${key}>`
+				: `<wpml:${key}>${settingParmas[key]}</wpml:${key}>`
+			paramGroup += xml
+		}
+	})
+	return paramGroup
+}
 
 /**
  * @description: JSON转XML
@@ -94,125 +85,125 @@
  * @return {*} string
  */
 export const JSONToXML = (obj, rootName, isEnd) => {
-  let xml = '';
+	let xml = ''
 
-  const buildXml = (obj, rootName) => {
-    let xml = '';
-    if (Array.isArray(obj)) {
-      obj.forEach((item) => {
-        const str = !noWmpl.includes(rootName) && isEnd ? 'wpml:' : '';
-        xml += `<${str}${rootName}>${buildXml(item)}</${str}${rootName}>`;
-      });
-    } else if (typeof obj === 'object') {
-      Object.keys(obj).forEach((key) => {
-        if (key === '#text') {
-          xml += obj[key];
-        } else {
-          const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : '';
-          if (key === 'Placemark') {
-            xml += `${buildXml(obj[key], key)}`;
-          } else if (key === 'action') {
-            if (Array.isArray(obj[key])) {
-              xml += `${buildXml(obj[key], key)}`;
-            } else {
-              xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`;
-            }
-          } else {
-            xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`;
-          }
-        }
-      });
-    } else {
-      xml += obj;
-    }
-    return xml;
-  };
+	const buildXml = (obj, rootName) => {
+		let xml = ''
+		if (Array.isArray(obj)) {
+			obj.forEach(item => {
+				const str = !noWmpl.includes(rootName) && isEnd ? 'wpml:' : ''
+				xml += `<${str}${rootName}>${buildXml(item)}</${str}${rootName}>`
+			})
+		} else if (typeof obj === 'object') {
+			Object.keys(obj).forEach(key => {
+				if (key === '#text') {
+					xml += obj[key]
+				} else {
+					const str = !noWmpl.includes(key) && isEnd ? 'wpml:' : ''
+					if (key === 'Placemark') {
+						xml += `${buildXml(obj[key], key)}`
+					} else if (key === 'action') {
+						if (Array.isArray(obj[key])) {
+							xml += `${buildXml(obj[key], key)}`
+						} else {
+							xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
+						}
+					} else {
+						xml += `<${str}${key}>${buildXml(obj[key], key)}</${str}${key}>`
+					}
+				}
+			})
+		} else {
+			xml += obj
+		}
+		return xml
+	}
 
-  const header = isEnd ? '<?xml version="1.0" encoding="UTF-8"?>' : '';
-  xml += `${header}
+	const header = isEnd ? '<?xml version="1.0" encoding="UTF-8"?>' : ''
+	xml += `${header}
   <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.5">
     <Document>
       ${buildXml(obj, rootName)}
     </Document>
-  </kml>`;
-  return xml;
-};
+  </kml>`
+	return xml
+}
 
-export const getTagNameFromXml = (xmlString) => {
-  const parser = new DOMParser();
-  const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
-  const element = xmlDoc.documentElement;
-  if (element && element.tagName) {
-    return element.tagName; // 返回的是类似 "WPML:USEGLOBALHEADINGPARAM" 的全大写形式
-  }
-  return null;
-};
+export const getTagNameFromXml = xmlString => {
+	const parser = new DOMParser()
+	const xmlDoc = parser.parseFromString(xmlString, 'text/xml')
+	const element = xmlDoc.documentElement
+	if (element && element.tagName) {
+		return element.tagName // 返回的是类似 "WPML:USEGLOBALHEADINGPARAM" 的全大写形式
+	}
+	return null
+}
 
 // 将xml转为json
-const deepParse = (xml) => {
-  let obj = {};
-  // 如果是文档节点,遍历其子节点
-  if (xml.nodeType === 1) {
-    // element node
-    // 处理子节点
-    if (xml.childNodes.length > 0) {
-      for (let i = 0; i < xml.childNodes.length; i++) {
-        const item = xml.childNodes[i];
-        const nodeName = item.nodeName.replace('wpml:', '');
+const deepParse = xml => {
+	let obj = {}
+	// 如果是文档节点,遍历其子节点
+	if (xml.nodeType === 1) {
+		// element node
+		// 处理子节点
+		if (xml.childNodes.length > 0) {
+			for (let i = 0; i < xml.childNodes.length; i++) {
+				const item = xml.childNodes[i]
+				const nodeName = item.nodeName.replace('wpml:', '')
 
-        // 检查是否是文本节点
-        if (item.nodeType === 3) {
-          // text node
-          // 处理文本节点的内容
-          if (item.nodeValue.trim() !== '') {
-            obj[nodeName] = item.nodeValue.trim();
-          }
-        } else if (item.nodeType === 1) {
-          // element node
-          // 递归调用处理子节点
-          if (obj[nodeName] === undefined) {
-            const nodeValue = deepParse(item);
-            if (nodeValue[nodeName] === undefined) {
-              obj[nodeName] = nodeValue;
-            } else {
-              obj[nodeName] = nodeValue[nodeName];
-            }
-          } else {
-            if (!obj[nodeName].push) {
-              const old = obj[nodeName];
-              obj[nodeName] = [];
-              obj[nodeName].push(old);
-            }
-            const nodeValue = deepParse(item);
-            if (nodeValue[nodeName] === undefined) {
-              obj[nodeName].push(nodeValue);
-            }
-          }
-        }
-      }
-    }
-  } else if (xml.nodeType === 3) {
-    // text node
-    // 处理文本节点的内容
-    obj = xml.nodeValue.trim();
-  }
-  return obj;
-};
+				// 检查是否是文本节点
+				if (item.nodeType === 3) {
+					// text node
+					// 处理文本节点的内容
+					if (item.nodeValue.trim() !== '') {
+						obj[nodeName] = item.nodeValue.trim()
+					}
+				} else if (item.nodeType === 1) {
+					// element node
+					// 递归调用处理子节点
+					if (obj[nodeName] === undefined) {
+						const nodeValue = deepParse(item)
+						if (nodeValue[nodeName] === undefined) {
+							obj[nodeName] = nodeValue
+						} else {
+							obj[nodeName] = nodeValue[nodeName]
+						}
+					} else {
+						if (!obj[nodeName].push) {
+							const old = obj[nodeName]
+							obj[nodeName] = []
+							obj[nodeName].push(old)
+						}
+						const nodeValue = deepParse(item)
+						if (nodeValue[nodeName] === undefined) {
+							obj[nodeName].push(nodeValue)
+						}
+					}
+				}
+			}
+		}
+	} else if (xml.nodeType === 3) {
+		// text node
+		// 处理文本节点的内容
+		obj = xml.nodeValue.trim()
+	}
+	return obj
+}
 
 /**
  * @description: XML转JSON
  * @param {string} xmlStr xml字符串
  * @return {*} string
  */
-export const XMLToJSON = (xmlStr) => {
-  const parser = new DOMParser();
-  const xmlDoc = parser.parseFromString(xmlStr, 'text/xml');
-  const xmlObj = deepParse(xmlDoc.documentElement);
-  if (Reflect.has(xmlObj, 'Document')) {
-    return xmlObj;
-  } else {
-    return {
-      Document: xmlObj,
-    };
-  }
-};
+export const XMLToJSON = xmlStr => {
+	const parser = new DOMParser()
+	const xmlDoc = parser.parseFromString(xmlStr, 'text/xml')
+	const xmlObj = deepParse(xmlDoc.documentElement)
+	if (Reflect.has(xmlObj, 'Document')) {
+		return xmlObj
+	} else {
+		return {
+			Document: xmlObj,
+		}
+	}
+}
diff --git a/src/utils/cesium/mapUtil.js b/src/utils/cesium/mapUtil.js
index 9d3433a..176ecca 100644
--- a/src/utils/cesium/mapUtil.js
+++ b/src/utils/cesium/mapUtil.js
@@ -1,148 +1,134 @@
-import * as Cesium from 'cesium';
-import * as turf from '@turf/turf';
+import * as Cesium from 'cesium'
+import * as turf from '@turf/turf'
 
 export const getLngLatDistance = (lat1, lng1, lat2, lng2) => {
-  const radLat1 = (lat1 * Math.PI) / 180.0
-  const radLat2 = (lat2 * Math.PI) / 180.0
-  const a = radLat1 - radLat2
-  const b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0
-  let s =
-    2 *
-    Math.asin(
-      Math.sqrt(
-        Math.pow(Math.sin(a / 2), 2) +
-        Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2),
-      ),
-    )
-  s = s * 6378.137 // EARTH_RADIUS;
-  s = Math.round(s * 10000) / 10000
-  return s * 1000
+	const radLat1 = (lat1 * Math.PI) / 180.0
+	const radLat2 = (lat2 * Math.PI) / 180.0
+	const a = radLat1 - radLat2
+	const b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0
+	let s =
+		2 *
+		Math.asin(
+			Math.sqrt(
+				Math.pow(Math.sin(a / 2), 2) +
+					Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)
+			)
+		)
+	s = s * 6378.137 // EARTH_RADIUS;
+	s = Math.round(s * 10000) / 10000
+	return s * 1000
 }
 
 // 获取限polyline长度
-export const getPolylineLength = (entity) => {
-  let length = 0
+export const getPolylineLength = entity => {
+	let length = 0
 
-  // 获取Polyline的所有顶点位置
-  const positions = entity.polyline.positions.getValue()
+	// 获取Polyline的所有顶点位置
+	const positions = entity.polyline.positions.getValue()
 
-  for (let i = 0; i < positions.length - 1; ++i) {
-    const startPosition = positions[i]
-    const endPosition = positions[i + 1]
+	for (let i = 0; i < positions.length - 1; ++i) {
+		const startPosition = positions[i]
+		const endPosition = positions[i + 1]
 
-    // 使用Cesium提供的distanceBetween函数计算两个顶点之间的距离
-    const distance = Cesium.Cartesian3.distance(startPosition, endPosition)
+		// 使用Cesium提供的distanceBetween函数计算两个顶点之间的距离
+		const distance = Cesium.Cartesian3.distance(startPosition, endPosition)
 
-    // 将每个顶点之间的距离相加得到总长度
-    length += distance
-  }
+		// 将每个顶点之间的距离相加得到总长度
+		length += distance
+	}
 
-  return length
+	return length
 }
 
 // 创建三角广告牌
 export const createTriangleMarker = (title, color) => {
-  // 创建canvas绘制广告牌
-  const billboard = document.createElement('canvas')
-  billboard.width = 30
-  billboard.height = 30
-  const ctx = billboard.getContext('2d')
-  ctx.beginPath()
-  ctx.moveTo(0, 0)
-  ctx.lineTo(30, 0)
-  ctx.lineTo(15, 22)
-  ctx.fillStyle = color
-  ctx.fill()
-  ctx.font = '18px serif'
-  ctx.fillStyle = '#ffffff'
-  ctx.fillText(title, 10, 15)
-  ctx.closePath()
-  return billboard
+	// 创建canvas绘制广告牌
+	const billboard = document.createElement('canvas')
+	billboard.width = 30
+	billboard.height = 30
+	const ctx = billboard.getContext('2d')
+	ctx.beginPath()
+	ctx.moveTo(0, 0)
+	ctx.lineTo(30, 0)
+	ctx.lineTo(15, 22)
+	ctx.fillStyle = color
+	ctx.fill()
+	ctx.font = '18px serif'
+	ctx.fillStyle = '#ffffff'
+	ctx.fillText(title, 10, 15)
+	ctx.closePath()
+	return billboard
 }
 
 export const createCircleBillboard = (title, color) => {
-  const billboard = document.createElement('canvas')
-  const ctx = billboard.getContext('2d')
-  ctx.beginPath()
-  ctx.ellipse(150, 90, 11, 11, 0, 0, Math.PI * 2)
-  ctx.fillStyle = color
-  ctx.fill()
-  ctx.font = 'bold 15px serif'
-  ctx.textAlign = 'center'
-  ctx.fillStyle = '#ffffff'
-  ctx.fillText(title, 150, 95)
-  ctx.closePath()
-  return billboard
+	const billboard = document.createElement('canvas')
+	const ctx = billboard.getContext('2d')
+	ctx.beginPath()
+	ctx.ellipse(150, 90, 11, 11, 0, 0, Math.PI * 2)
+	ctx.fillStyle = color
+	ctx.fill()
+	ctx.font = 'bold 15px serif'
+	ctx.textAlign = 'center'
+	ctx.fillStyle = '#ffffff'
+	ctx.fillText(title, 150, 95)
+	ctx.closePath()
+	return billboard
 }
 
 // 获取当前经纬度海拔
 export const getHaeHeight = (start, end) => {
-  const ellipsoid = Cesium.Ellipsoid.WGS84 // 选择合适的椭圆体模型
-  // const { longitude, latitude, height } = start
-  // const { longitude: endLng, latitude: endLat, height: endHeight } = end
-  // const startC3Position = new Cesium.Cartographic(longitude, latitude, height)
-  // const endC3Position = new Cesium.Cartographic(endLng, endLat, endHeight)
-  // const startCartesianPosition = ellipsoid.cartographicToCartesian(startC3Position)
-  // const endCartesianPosition = ellipsoid.cartographicToCartesian(endC3Position)
-  // // 计算两个位置之间的距离
-  // const distance = new Cesium.EllipsoidGeodesic(startCartesianPosition, endCartesianPosition, ellipsoid)
-  // return distance
-  const { longitude, latitude, height } = end
-  const cartographic = Cesium.Cartographic.fromDegrees(
-    longitude,
-    latitude,
-    height,
-  )
-  const cartesianPosition = ellipsoid.cartographicToCartesian(cartographic)
-  const haeHeight = ellipsoid.cartesianToCartographic(cartesianPosition).height
-  return haeHeight
+	const ellipsoid = Cesium.Ellipsoid.WGS84 // 选择合适的椭圆体模型
+	// const { longitude, latitude, height } = start
+	// const { longitude: endLng, latitude: endLat, height: endHeight } = end
+	// const startC3Position = new Cesium.Cartographic(longitude, latitude, height)
+	// const endC3Position = new Cesium.Cartographic(endLng, endLat, endHeight)
+	// const startCartesianPosition = ellipsoid.cartographicToCartesian(startC3Position)
+	// const endCartesianPosition = ellipsoid.cartographicToCartesian(endC3Position)
+	// // 计算两个位置之间的距离
+	// const distance = new Cesium.EllipsoidGeodesic(startCartesianPosition, endCartesianPosition, ellipsoid)
+	// return distance
+	const { longitude, latitude, height } = end
+	const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height)
+	const cartesianPosition = ellipsoid.cartographicToCartesian(cartographic)
+	const haeHeight = ellipsoid.cartesianToCartographic(cartesianPosition).height
+	return haeHeight
 }
 
 // Cesium Cartesian3 转正常经纬度
 export const cartesian3Convert = (cartesian3Position, viewer) => {
-  // 转换为经纬度
-  const ellipsoid = viewer.scene.globe.ellipsoid
-  const cartographicPosition = Cesium.Cartographic.fromCartesian(
-    cartesian3Position,
-    ellipsoid,
-  )
-  const longitude = Cesium.Math.toDegrees(cartographicPosition.longitude)
-  const latitude = Cesium.Math.toDegrees(cartographicPosition.latitude)
-  const height = cartographicPosition.height
+	// 转换为经纬度
+	const ellipsoid = viewer.scene.globe.ellipsoid
+	const cartographicPosition = Cesium.Cartographic.fromCartesian(cartesian3Position, ellipsoid)
+	const longitude = Cesium.Math.toDegrees(cartographicPosition.longitude)
+	const latitude = Cesium.Math.toDegrees(cartographicPosition.latitude)
+	const height = cartographicPosition.height
 
-  //   console.log('经度: ' + longitude);
-  //   console.log('纬度: ' + latitude);
-  //   console.log('高度: ' + height);
+	//   console.log('经度: ' + longitude);
+	//   console.log('纬度: ' + latitude);
+	//   console.log('高度: ' + height);
 
-  return {
-    longitude,
-    latitude,
-    height,
-  }
+	return {
+		longitude,
+		latitude,
+		height,
+	}
 }
 
 // Cesium Cartesian2 转正常经纬度
 export const cartesian2Convert = (position, viewer) => {
-  const ellipsoid = viewer.scene.globe.ellipsoid
-  const c3Position = viewer.scene.globe.pick(
-    viewer.camera.getPickRay(position),
-    viewer.scene,
-  )
-  const c2Postion = ellipsoid.cartesianToCartographic(c3Position)
-  const longitude = Cesium.Math.toDegrees(c2Postion.longitude)
-  const latitude = Cesium.Math.toDegrees(c2Postion.latitude)
-  return { longitude, latitude }
+	const ellipsoid = viewer.scene.globe.ellipsoid
+	const c3Position = viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene)
+	const c2Postion = ellipsoid.cartesianToCartographic(c3Position)
+	const longitude = Cesium.Math.toDegrees(c2Postion.longitude)
+	const latitude = Cesium.Math.toDegrees(c2Postion.latitude)
+	return { longitude, latitude }
 }
 
 // 根据经纬度获取距离
 export const getLnglatDist = (lng1, lat1, lng2, lat2) => {
-  const start = new Cesium.Cartesian3.fromDegrees(
-    Number(lng1),
-    Number(lat1),
-    0,
-  )
-  const end = new Cesium.Cartesian3.fromDegrees(Number(lng2), Number(lat2), 0)
-  return Cesium.Cartesian3.distance(start, end)
+	const start = new Cesium.Cartesian3.fromDegrees(Number(lng1), Number(lat1), 0)
+	const end = new Cesium.Cartesian3.fromDegrees(Number(lng2), Number(lat2), 0)
+	return Cesium.Cartesian3.distance(start, end)
 }
 
 /**
@@ -150,37 +136,37 @@
  * @param coordinateList {Array<Array<Object>>} [[{lat, lng}]]
  * @return { Object } {lat lng}
  */
-export const getCenterPoint = (coordinateList) => {
-  coordinateList = coordinateList.map((item) => {
-    const [lng, lat] = item
-    return [{ lat, lng }]
-  })
-  const geoCoordinateListFlat = coordinateList.reduce((s, v) => {
-    return (s = s.concat(v))
-  }, [])
-  const total = geoCoordinateListFlat.length
-  let X = 0
-  let Y = 0
-  let Z = 0
-  for (const g of geoCoordinateListFlat) {
-    const lat = (g.lat * Math.PI) / 180
-    const lon = (g.lng * Math.PI) / 180
-    const x = Math.cos(lat) * Math.cos(lon)
-    const y = Math.cos(lat) * Math.sin(lon)
-    const z = Math.sin(lat)
-    X += x
-    Y += y
-    Z += z
-  }
+export const getCenterPoint = coordinateList => {
+	coordinateList = coordinateList.map(item => {
+		const [lng, lat] = item
+		return [{ lat, lng }]
+	})
+	const geoCoordinateListFlat = coordinateList.reduce((s, v) => {
+		return (s = s.concat(v))
+	}, [])
+	const total = geoCoordinateListFlat.length
+	let X = 0
+	let Y = 0
+	let Z = 0
+	for (const g of geoCoordinateListFlat) {
+		const lat = (g.lat * Math.PI) / 180
+		const lon = (g.lng * Math.PI) / 180
+		const x = Math.cos(lat) * Math.cos(lon)
+		const y = Math.cos(lat) * Math.sin(lon)
+		const z = Math.sin(lat)
+		X += x
+		Y += y
+		Z += z
+	}
 
-  X = X / total
-  Y = Y / total
-  Z = Z / total
-  const Lon = Math.atan2(Y, X)
-  const Hyp = Math.sqrt(X * X + Y * Y)
-  const Lat = Math.atan2(Z, Hyp)
+	X = X / total
+	Y = Y / total
+	Z = Z / total
+	const Lon = Math.atan2(Y, X)
+	const Hyp = Math.sqrt(X * X + Y * Y)
+	const Lat = Math.atan2(Z, Hyp)
 
-  return { lng: (Lon * 180) / Math.PI, lat: (Lat * 180) / Math.PI }
+	return { lng: (Lon * 180) / Math.PI, lat: (Lat * 180) / Math.PI }
 }
 
 /**
@@ -190,183 +176,174 @@
  * @return {*} { index: 1 }
  */
 export const getShortestDistance = (lnglat1, lnglat2) => {
-  const arr = []
-  lnglat1.forEach((v, i) => {
-    const [lng, lat] = v
-    lnglat2.forEach((s, i2) => {
-      const [vLng, vLat] = s
-      const distance = getLnglatDist(lng, lat, vLng, vLat)
-      arr.push({
-        distance,
-        index: [i, i2],
-        lnglat: [v, s],
-      })
-    })
-  })
-  const newArr = arr.sort((a, b) => a.distance - b.distance)
-  return newArr[0]
+	const arr = []
+	lnglat1.forEach((v, i) => {
+		const [lng, lat] = v
+		lnglat2.forEach((s, i2) => {
+			const [vLng, vLat] = s
+			const distance = getLnglatDist(lng, lat, vLng, vLat)
+			arr.push({
+				distance,
+				index: [i, i2],
+				lnglat: [v, s],
+			})
+		})
+	})
+	const newArr = arr.sort((a, b) => a.distance - b.distance)
+	return newArr[0]
 }
 
 // 获取当前经纬度地形数据
 export const getLnglatAltitude = (longitude, latitude, viewer) => {
-  return new Promise((resolve, reject) => {
-    // 假设 viewer 已经初始化并且 terrainProvider 是有效的
-    const terrainProvider = viewer?.terrainProvider
+	return new Promise((resolve, reject) => {
+		// 假设 viewer 已经初始化并且 terrainProvider 是有效的
+		const terrainProvider = viewer?.terrainProvider
 
-    // 创建 Cartographic 对象
-    const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude)
+		// 创建 Cartographic 对象
+		const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude)
 
-    // 获取地形数据的Promise
-    const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [
-      cartographic,
-    ])
+		// 获取地形数据的Promise
+		const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [cartographic])
 
-    // 使用 Cesium.when 处理 Promise
-    promise
-      .then(function (updatedPositions) {
-        // updatedPositions 是一个数组,包含更新后的 Cartographic 对象
-        const updatedPosition = updatedPositions[0]
-        const height = updatedPosition.height
+		// 使用 Cesium.when 处理 Promise
+		promise
+			.then(function (updatedPositions) {
+				// updatedPositions 是一个数组,包含更新后的 Cartographic 对象
+				const updatedPosition = updatedPositions[0]
+				const height = updatedPosition.height
 
-        resolve({
-          longitude,
-          latitude,
-          height,
-        })
-        // 在这里,你可以使用 height 值进行后续操作
-      })
-      .catch(function (error) {
-        // console.error('获取高程时发生错误:', error);
-        reject(error)
-      })
-  })
+				resolve({
+					longitude,
+					latitude,
+					height,
+				})
+				// 在这里,你可以使用 height 值进行后续操作
+			})
+			.catch(function (error) {
+				// console.error('获取高程时发生错误:', error);
+				reject(error)
+			})
+	})
 }
 
 // 批量获取经纬度对应高度信息
 export const getPositionsHeight = (data, viewer, droneHeight = null) => {
-  return new Promise((resolve, reject) => {
-    if (!data || !data.length) {
-      resolve([])
+	return new Promise((resolve, reject) => {
+		if (!data || !data.length) {
+			resolve([])
 
-      return
-    }
+			return
+		}
 
-    // 假设 viewer 已经初始化并且 terrainProvider 是有效的
-    const terrainProvider = viewer?.terrainProvider
+		// 假设 viewer 已经初始化并且 terrainProvider 是有效的
+		const terrainProvider = viewer?.terrainProvider
 
-    // 创建 Cartographic 对象
-    const cartographics = data.map((item) => {
-      const [lng, lat] = item?.['Point']?.['coordinates']?.['#text'].split(',')
+		// 创建 Cartographic 对象
+		const cartographics = data.map(item => {
+			const [lng, lat] = item?.['Point']?.['coordinates']?.['#text'].split(',')
 
-      return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
-    })
+			return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
+		})
 
-    // 获取地形数据的Promise
-    const promise = Cesium.sampleTerrainMostDetailed(
-      terrainProvider,
-      cartographics,
-    )
+		// 获取地形数据的Promise
+		const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics)
 
-    // 使用 Cesium.when 处理 Promise
-    promise
-      .then(function (updatedPositions) {
-        // updatedPositions 是一个数组,包含更新后的 Cartographic 对象
-        const newPosition = updatedPositions.map((item, index) => {
-          const longitude = Cesium.Math.toDegrees(item.longitude)
-          const latitude = Cesium.Math.toDegrees(item.latitude)
+		// 使用 Cesium.when 处理 Promise
+		promise
+			.then(function (updatedPositions) {
+				// updatedPositions 是一个数组,包含更新后的 Cartographic 对象
+				const newPosition = updatedPositions.map((item, index) => {
+					const longitude = Cesium.Math.toDegrees(item.longitude)
+					const latitude = Cesium.Math.toDegrees(item.latitude)
 
-          let FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height)
+					let FinalHeight =
+						Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height)
 
-          if (droneHeight) {
-            FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + droneHeight
-          }
+					if (droneHeight) {
+						FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + droneHeight
+					}
 
-          return {
-            ...data[index],
-            longitude,
-            latitude,
-            FinalHeight,
-            customHeight: Number(item.height),
-          }
-        })
+					return {
+						...data[index],
+						longitude,
+						latitude,
+						FinalHeight,
+						customHeight: Number(item.height),
+					}
+				})
 
-        resolve(newPosition)
-        // 在这里,你可以使用 height 值进行后续操作
-      })
-      .catch(function (error) {
-        // console.error('获取高程时发生错误:', error);
-        reject(error)
-      })
-  })
+				resolve(newPosition)
+				// 在这里,你可以使用 height 值进行后续操作
+			})
+			.catch(function (error) {
+				// console.error('获取高程时发生错误:', error);
+				reject(error)
+			})
+	})
 }
 
 // 获取面中最高点
 export const getPolygonMaxHeight = (turfPolygon, viewer) => {
-  return new Promise((resolve, reject) => {
-    const turfExtent = turf.bbox(turfPolygon)
+	return new Promise((resolve, reject) => {
+		const turfExtent = turf.bbox(turfPolygon)
 
-    const turfSamplePoints = turf.pointGrid(turfExtent, 0.01, {
-      units: 'kilometers',
-      mask: turfPolygon,
-    })
+		const turfSamplePoints = turf.pointGrid(turfExtent, 0.01, {
+			units: 'kilometers',
+			mask: turfPolygon,
+		})
 
-    // 假设 viewer 已经初始化并且 terrainProvider 是有效的
-    const terrainProvider = viewer?.terrainProvider
+		// 假设 viewer 已经初始化并且 terrainProvider 是有效的
+		const terrainProvider = viewer?.terrainProvider
 
-    const cesiumSamplePoints = []
-    for (let i = 0; i < turfSamplePoints.features.length; i++) {
-      const coord = turfSamplePoints.features[i].geometry.coordinates
-      cesiumSamplePoints.push(
-        Cesium.Cartographic.fromDegrees(coord[0], coord[1]),
-      )
-    }
+		const cesiumSamplePoints = []
+		for (let i = 0; i < turfSamplePoints.features.length; i++) {
+			const coord = turfSamplePoints.features[i].geometry.coordinates
+			cesiumSamplePoints.push(Cesium.Cartographic.fromDegrees(coord[0], coord[1]))
+		}
 
-    // 获取地形数据的Promise
-    const promise = Cesium.sampleTerrainMostDetailed(
-      terrainProvider,
-      cesiumSamplePoints,
-    )
+		// 获取地形数据的Promise
+		const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cesiumSamplePoints)
 
-    promise
-      .then(function (updatedPositions) {
-        const newPosition = updatedPositions.map((item) => Number(item.height))
+		promise
+			.then(function (updatedPositions) {
+				const newPosition = updatedPositions.map(item => Number(item.height))
 
-        resolve(Math.max(...newPosition))
-      })
-      .catch(function (error) {
-        reject(error)
-      })
-  })
+				resolve(Math.max(...newPosition))
+			})
+			.catch(function (error) {
+				reject(error)
+			})
+	})
 }
 
 // 展示当前的高度
-export const getWaylineShowHeight = (positions) => {
-  const { lng, lat } = getCenterPoint(positions)
-  let maxDist = 0
-  positions.forEach((item) => {
-    const [lng1, lat1] = item
-    let pointsDist = getLnglatDist(lng1, lat1, lng, lat)
-    if (pointsDist > maxDist) {
-      maxDist = pointsDist
-    }
-  })
-  return {
-    lng,
-    lat,
-    showHeight: maxDist * 8,
-  }
+export const getWaylineShowHeight = positions => {
+	const { lng, lat } = getCenterPoint(positions)
+	let maxDist = 0
+	positions.forEach(item => {
+		const [lng1, lat1] = item
+		let pointsDist = getLnglatDist(lng1, lat1, lng, lat)
+		if (pointsDist > maxDist) {
+			maxDist = pointsDist
+		}
+	})
+	return {
+		lng,
+		lat,
+		showHeight: maxDist * 8,
+	}
 }
 
 // 获取当前面是否有交叉点
-export const isIntersection = (coordinates) => {
-  const polyDikuai = turf.polygon([coordinates])
-  const result = turf.kinks(polyDikuai)
-  const resultFeatures = result.features
-  if (resultFeatures.length == 0) {
-    //无相交
-    return false
-  } else {
-    //有相交
-    return true
-  }
+export const isIntersection = coordinates => {
+	const polyDikuai = turf.polygon([coordinates])
+	const result = turf.kinks(polyDikuai)
+	const resultFeatures = result.features
+	if (resultFeatures.length == 0) {
+		//无相交
+		return false
+	} else {
+		//有相交
+		return true
+	}
 }
diff --git a/src/utils/cesium/use-kmz-tsa.js b/src/utils/cesium/use-kmz-tsa.js
index 6d914a3..c24de6a 100644
--- a/src/utils/cesium/use-kmz-tsa.js
+++ b/src/utils/cesium/use-kmz-tsa.js
@@ -1,685 +1,675 @@
-import _ from 'lodash';
-import JSZIP from 'jszip';
-import { JSONToXML } from './kmz';
-import { getDateFromTimestamp } from '@/utils/date';
+import _ from 'lodash'
+import JSZIP from 'jszip'
+import { JSONToXML } from './kmz'
+import { getDateFromTimestamp } from '@/utils/date'
 
 export default function kmzFile() {
-  // 云台信息
-  const droneModel = {
-    52: '0',
-    53: '1',
-    66: '0',
-    67: '1',
-    80: '0',
-    81: '1',
-  };
-  // 创建图斑航线
-  const create = async (waylineBasicInfo, lnglats, spotList) => {
-    try {
-      const date = new Date();
-      const username = window.localStorage.getItem('bs_username');
-      const updateTime = date.getTime();
-      const fileName = '图斑航线规划_' + date.getTime();
-      // 无人机机型、云台型号、航线高度
-      const { droneEnumValue, payloadEnumValue, height } = waylineBasicInfo;
-      const defaultHeight = height || 100;
-      // 起始点位 (参考点位-具体以机场为准)
-      const startPoint = lnglats[0];
-      const takeOffPoint = [startPoint[1], startPoint[0], 0].join(',');
-      // template.xml对象模版
-      const fileTemplate = {
-        author: { '#text': username },
-        createTime: { '#text': updateTime },
-        updateTime: { '#text': updateTime },
-        missionConfig: {
-          // 飞向首航点模式
-          flyToWaylineMode: { '#text': 'safely' },
-          // 航线结束动作
-          finishAction: { '#text': 'goHome' },
-          // 失控是否继续执行航线
-          exitOnRCLost: { '#text': 'goContinue' },
-          // 失控动作类型
-          executeRCLostAction: { '#text': 'goBack' },
-          // 安全起飞高度
-          takeOffSecurityHeight: { '#text': 20 },
-          // 参考起飞点
-          takeOffRefPoint: { '#text': takeOffPoint },
-          // 参考起飞点海拔高度
-          takeOffRefPointAGLHeight: { '#text': 0 },
-          // 全局航线过渡速度
-          globalTransitionalSpeed: { '#text': 10 },
-          // 全局返航高度
-          globalRTHHeight: { '#text': defaultHeight },
-          // 无人机参数
-          droneInfo: {
-            droneEnumValue: { '#text': droneEnumValue },
-            droneSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-          },
-          // 云台参数
-          payloadInfo: {
-            payloadEnumValue: { '#text': payloadEnumValue },
-            payloadSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-            payloadPositionIndex: { '#text': 0 },
-          },
-        },
-        Folder: {
-          // 预定义模板类型 - 航点飞行
-          templateType: { '#text': 'waypoint' },
-          // 是否使用全局航线过渡速度
-          useGlobalTransitionalSpeed: { '#text': 0 },
-          templateId: { '#text': 0 },
-          // 坐标系参数信息
-          waylineCoordinateSysParam: {
-            // 经纬度坐标系 - 固定值
-            coordinateMode: { '#text': 'WGS84' },
-            // 航点高程参考平面	- 相对高度
-            heightMode: { '#text': 'relativeToStartPoint' },
-          },
-          // 全局航线飞行速度
-          autoFlightSpeed: { '#text': 10 },
-          // 云台俯仰角控制模式
-          gimbalPitchMode: { '#text': 'usePointSetting' },
-          // 全局高度
-          globalHeight: { '#text': '100' },
-          // 全局偏航角模式参数 - 可使用当前默认值
-          globalWaypointHeadingParam: {
-            waypointHeadingMode: { '#text': 'followWayline' },
-            waypointHeadingAngle: { '#text': 0 },
-            waypointPoiPoint: {
-              '#text': '0.000000,0.000000,0.000000',
-            },
-            waypointHeadingPathMode: { '#text': 'followBadArc' },
-            waypointHeadingPoiIndex: { '#text': 0 },
-          },
-          // 全局航点类型 - 直线飞行,飞行器到点停
-          globalWaypointTurnMode: {
-            '#text': 'toPointAndStopWithDiscontinuityCurvature',
-          },
-          // 全局航段轨迹是否尽量贴合直线
-          globalUseStraightLine: { '#text': 1 },
-          // 航点点位信息 - 位置、事件等
-          Placemark: [],
-          // payloadParam: {
-          //   payloadPositionIndex: { '#text': 0 },
-          //   focusMode: { '#text': 'firstPoint' },
-          //   meteringMode: { '#text': 'average' },
-          //   returnMode: { '#text': 'singleReturnFirst' },
-          //   samplingRate: { '#text': '240000' },
-          //   scanningMode: { '#text': 'repetitive' },
-          //   imageFormat: { '#text': 'wide,zoom' },
-          // },
-        },
-      };
-      // 航点创建
-      const polygonNo = {
-        no: '',
-        index: 0,
-      };
-      lnglats.forEach((lnglat, index) => {
-        const obj = spotList.find((spot) =>
-          spot.dkfw.find((item) => _.isEqual(item, lnglat)),
-        );
-        let fileSuffix = '';
-        if (obj) {
-          if (polygonNo.no === obj.dkbh) {
-            polygonNo.index++;
-          } else {
-            polygonNo.no = obj.dkbh;
-            polygonNo.index = 1;
-          }
-          fileSuffix = `图斑航线拍摄(${obj.dkbh}-${polygonNo.index})`;
-        } else {
-          fileSuffix = '图斑航线拍摄(起点)';
-        }
-        const placemark = {
-          Point: {
-            // 航点经纬度
-            coordinates: { '#text': `${lnglat[0]},${lnglat[1]}` },
-          },
-          // 航点index
-          index: { '#text': index },
-          // 全局航线高度(椭球高)
-          ellipsoidHeight: { '#text': defaultHeight },
-          // 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
-          height: { '#text': defaultHeight },
-          // 航点飞行速度
-          waypointSpeed: { '#text': 10 },
-          // 沿航线方向 - 可使用当前默认值
-          waypointHeadingParam: {
-            waypointHeadingMode: { '#text': 'followWayline' },
-            waypointHeadingAngle: { '#text': 0 },
-            waypointPoiPoint: {
-              '#text': '0.000000,0.000000,0.000000',
-            },
-            waypointHeadingPathMode: { '#text': 'followBadArc' },
-            waypointHeadingPoiIndex: { '#text': 0 },
-          },
-          // 航点类型
-          waypointTurnParam: {
-            waypointTurnMode: {
-              '#text': 'toPointAndStopWithDiscontinuityCurvature',
-            },
-            waypointTurnDampingDist: { '#text': 0.2 },
-          },
-          // 是否全局参数
-          useGlobalHeight: { '#text': 1 },
-          useGlobalSpeed: { '#text': 1 },
-          useGlobalHeadingParam: { '#text': 1 },
-          useGlobalTurnParam: { '#text': 1 },
-          useStraightLine: { '#text': 1 },
-          // 事件组
-          actionGroup: {
-            actionGroupId: { '#text': index },
-            actionGroupStartIndex: { '#text': index },
-            actionGroupEndIndex: { '#text': index },
-            actionGroupMode: { '#text': 'sequence' },
-            actionTrigger: {
-              actionTriggerType: { '#text': 'reachPoint' },
-            },
-            // 单个事件 - 如果是多个事件action可改成数组 action: [{}]
-            action: {
-              actionId: { '#text': 0 },
-              actionActuatorFunc: { '#text': 'takePhoto' },
-              actionActuatorFuncParam: {
-                fileSuffix: { '#text': fileSuffix },
-                payloadPositionIndex: { '#text': '0' },
-                useGlobalPayloadLensIndex: { '#text': '1' },
-              },
-            },
-          },
-        };
-        fileTemplate.Folder.Placemark.push(placemark);
-      });
-      const fileWaylines = waylinesContext(fileTemplate);
+	// 云台信息
+	const droneModel = {
+		52: '0',
+		53: '1',
+		66: '0',
+		67: '1',
+		80: '0',
+		81: '1',
+	}
+	// 创建图斑航线
+	const create = async (waylineBasicInfo, lnglats, spotList) => {
+		try {
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const fileName = '图斑航线规划_' + date.getTime()
+			// 无人机机型、云台型号、航线高度
+			const { droneEnumValue, payloadEnumValue, height } = waylineBasicInfo
+			const defaultHeight = height || 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const startPoint = lnglats[0]
+			const takeOffPoint = [startPoint[1], startPoint[0], 0].join(',')
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'goContinue' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 20 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点海拔高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: { '#text': 'relativeToStartPoint' },
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': 'usePointSetting' },
+					// 全局高度
+					globalHeight: { '#text': '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					// payloadParam: {
+					//   payloadPositionIndex: { '#text': 0 },
+					//   focusMode: { '#text': 'firstPoint' },
+					//   meteringMode: { '#text': 'average' },
+					//   returnMode: { '#text': 'singleReturnFirst' },
+					//   samplingRate: { '#text': '240000' },
+					//   scanningMode: { '#text': 'repetitive' },
+					//   imageFormat: { '#text': 'wide,zoom' },
+					// },
+				},
+			}
+			// 航点创建
+			const polygonNo = {
+				no: '',
+				index: 0,
+			}
+			lnglats.forEach((lnglat, index) => {
+				const obj = spotList.find(spot => spot.dkfw.find(item => _.isEqual(item, lnglat)))
+				let fileSuffix = ''
+				if (obj) {
+					if (polygonNo.no === obj.dkbh) {
+						polygonNo.index++
+					} else {
+						polygonNo.no = obj.dkbh
+						polygonNo.index = 1
+					}
+					fileSuffix = `图斑航线拍摄(${obj.dkbh}-${polygonNo.index})`
+				} else {
+					fileSuffix = '图斑航线拍摄(起点)'
+				}
+				const placemark = {
+					Point: {
+						// 航点经纬度
+						coordinates: { '#text': `${lnglat[0]},${lnglat[1]}` },
+					},
+					// 航点index
+					index: { '#text': index },
+					// 全局航线高度(椭球高)
+					ellipsoidHeight: { '#text': defaultHeight },
+					// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+					height: { '#text': defaultHeight },
+					// 航点飞行速度
+					waypointSpeed: { '#text': 10 },
+					// 沿航线方向 - 可使用当前默认值
+					waypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 航点类型
+					waypointTurnParam: {
+						waypointTurnMode: {
+							'#text': 'toPointAndStopWithDiscontinuityCurvature',
+						},
+						waypointTurnDampingDist: { '#text': 0.2 },
+					},
+					// 是否全局参数
+					useGlobalHeight: { '#text': 1 },
+					useGlobalSpeed: { '#text': 1 },
+					useGlobalHeadingParam: { '#text': 1 },
+					useGlobalTurnParam: { '#text': 1 },
+					useStraightLine: { '#text': 1 },
+					// 事件组
+					actionGroup: {
+						actionGroupId: { '#text': index },
+						actionGroupStartIndex: { '#text': index },
+						actionGroupEndIndex: { '#text': index },
+						actionGroupMode: { '#text': 'sequence' },
+						actionTrigger: {
+							actionTriggerType: { '#text': 'reachPoint' },
+						},
+						// 单个事件 - 如果是多个事件action可改成数组 action: [{}]
+						action: {
+							actionId: { '#text': 0 },
+							actionActuatorFunc: { '#text': 'takePhoto' },
+							actionActuatorFuncParam: {
+								fileSuffix: { '#text': fileSuffix },
+								payloadPositionIndex: { '#text': '0' },
+								useGlobalPayloadLensIndex: { '#text': '1' },
+							},
+						},
+					},
+				}
+				fileTemplate.Folder.Placemark.push(placemark)
+			})
+			const fileWaylines = waylinesContext(fileTemplate)
 
-      return {
-        fileName,
-        template: fileTemplate,
-        waylines: fileWaylines,
-      };
-    } catch (error) {
-      console.log(error);
-      return false;
-    }
-  };
+			return {
+				fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return false
+		}
+	}
 
-  // 创建正常航线
-  const createNoramlWaylines = (waylineBasicInfo, lnglats) => {
-    try {
-      const date = new Date();
-      const username = window.localStorage.getItem('bs_username');
-      const updateTime = date.getTime();
-      const { year, month, day, hours, minutes } =
-        getDateFromTimestamp(updateTime);
-      const fileName = '新建航线_' + year + month + day + hours + minutes;
-      // 无人机机型、云台型号、航线高度
-      const { droneEnumValue, payloadEnumValue, height, waylineName } =
-        waylineBasicInfo;
-      const defaultHeight = height || 100;
-      // 起始点位 (参考点位-具体以机场为准)
-      const startPoint = lnglats[0];
-      const takeOffPoint = [startPoint.latitude, startPoint.longitude, 0].join(
-        ',',
-      );
-      // template.xml对象模版
-      const fileTemplate = {
-        author: { '#text': username },
-        createTime: { '#text': updateTime },
-        updateTime: { '#text': updateTime },
-        missionConfig: {
-          // 飞向首航点模式
-          flyToWaylineMode: { '#text': 'safely' },
-          // 航线结束动作
-          finishAction: { '#text': 'goHome' },
-          // 失控是否继续执行航线
-          exitOnRCLost: { '#text': 'goContinue' },
-          // 失控动作类型
-          executeRCLostAction: { '#text': 'goBack' },
-          // 安全起飞高度
-          takeOffSecurityHeight: { '#text': 20 },
-          // 参考起飞点
-          takeOffRefPoint: { '#text': takeOffPoint },
-          // 参考起飞点海拔高度
-          takeOffRefPointAGLHeight: { '#text': 0 },
-          // 全局航线过渡速度
-          globalTransitionalSpeed: { '#text': 10 },
-          // 全局返航高度
-          globalRTHHeight: { '#text': defaultHeight },
-          // 无人机参数
-          droneInfo: {
-            droneEnumValue: { '#text': droneEnumValue },
-            droneSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-          },
-          // 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
-          autoRerouteInfo: {
-            missionAutoRerouteMode: { '#text': 1 },
-            transitionalAutoRerouteMode: { '#text': 1 },
-          },
-          // 云台参数
-          payloadInfo: {
-            payloadEnumValue: { '#text': payloadEnumValue },
-            payloadSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-            payloadPositionIndex: { '#text': 0 },
-          },
-        },
-        Folder: {
-          // 预定义模板类型 - 航点飞行
-          templateType: { '#text': 'waypoint' },
-          // 是否使用全局航线过渡速度
-          useGlobalTransitionalSpeed: { '#text': 0 },
-          templateId: { '#text': 0 },
-          // 坐标系参数信息
-          waylineCoordinateSysParam: {
-            // 经纬度坐标系 - 固定值
-            coordinateMode: { '#text': 'WGS84' },
-            // 航点高程参考平面	- 相对高度
-            heightMode: { '#text': 'relativeToStartPoint' },
-          },
-          // 全局航线飞行速度
-          autoFlightSpeed: { '#text': 10 },
-          // 云台俯仰角控制模式
-          gimbalPitchMode: { '#text': 'usePointSetting' },
-          // 全局高度
-          globalHeight: { '#text': '100' },
-          // 全局偏航角模式参数 - 可使用当前默认值
-          globalWaypointHeadingParam: {
-            waypointHeadingMode: { '#text': 'followWayline' },
-            waypointHeadingAngle: { '#text': 0 },
-            waypointPoiPoint: {
-              '#text': '0.000000,0.000000,0.000000',
-            },
-            waypointHeadingPathMode: { '#text': 'followBadArc' },
-            waypointHeadingPoiIndex: { '#text': 0 },
-          },
-          // 全局航点类型 - 直线飞行,飞行器到点停
-          globalWaypointTurnMode: {
-            '#text': 'toPointAndStopWithDiscontinuityCurvature',
-          },
-          // 全局航段轨迹是否尽量贴合直线
-          globalUseStraightLine: { '#text': 1 },
-          // 航点点位信息 - 位置、事件等
-          Placemark: [],
-          payloadParam: {
-            payloadPositionIndex: { '#text': 0 },
-            focusMode: { '#text': 'firstPoint' },
-            meteringMode: { '#text': 'average' },
-            returnMode: { '#text': 'singleReturnFirst' },
-            samplingRate: { '#text': '240000' },
-            scanningMode: { '#text': 'repetitive' },
-            imageFormat: { '#text': 'wide,zoom' },
-          },
-        },
-      };
-      lnglats.forEach((lnglat, index) => {
-        const placemark = {
-          Point: {
-            // 航点经纬度
-            coordinates: {
-              '#text': `${lnglat.longitude},${lnglat.latitude}`,
-            },
-          },
-          // 航点index
-          index: { '#text': index },
-          // 全局航线高度(椭球高)
-          ellipsoidHeight: { '#text': lnglat.height },
-          // 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
-          height: { '#text': lnglat.height },
-          // 航点飞行速度
-          waypointSpeed: { '#text': lnglat?.speed || 10 },
-          // 沿航线方向 - 可使用当前默认值
-          waypointHeadingParam: {
-            waypointHeadingMode: { '#text': 'followWayline' },
-            waypointHeadingAngle: { '#text': 0 },
-            waypointPoiPoint: {
-              '#text': '0.000000,0.000000,0.000000',
-            },
-            waypointHeadingPathMode: { '#text': 'followBadArc' },
-            waypointHeadingPoiIndex: { '#text': 0 },
-          },
-          // 航点类型
-          waypointTurnParam: {
-            waypointTurnMode: {
-              '#text': 'toPointAndStopWithDiscontinuityCurvature',
-            },
-            waypointTurnDampingDist: { '#text': 0.2 },
-          },
-          // 是否全局参数
-          useGlobalHeight: { '#text': 1 },
-          useGlobalSpeed: { '#text': 0 },
-          useGlobalHeadingParam: { '#text': 1 },
-          useGlobalTurnParam: { '#text': 1 },
-          useStraightLine: { '#text': 1 },
-        };
-        if (lnglat?.actions) {
-          const actionGroup = {
-            actionGroupId: { '#text': index },
-            actionGroupStartIndex: { '#text': index },
-            actionGroupEndIndex: { '#text': index },
-            actionGroupMode: { '#text': 'sequence' },
-            actionTrigger: {
-              actionTriggerType: { '#text': 'reachPoint' },
-            },
-            // 单个事件 - 如果是多个事件action可改成数组 action: [{}]
-            // action: [{
-            //   actionId: { '#text': 0 },
-            //   actionActuatorFunc: { '#text': '' },
-            //   actionActuatorFuncParam: {},
-            // }],
-            action: [],
-          };
-          lnglat?.actions.forEach((action, index) => {
-            const singleAction = {
-              actionId: { '#text': index },
-              actionActuatorFunc: { '#text': '' },
-              actionActuatorFuncParam: {},
-            };
-            // actionGroup.action['actionActuatorFunc'] = { '#text': action.key }
-            // action.params.forEach(p => {
-            //   if (p.value || p.value !== '') {
-            //     actionGroup.action['actionActuatorFuncParam'][p.key] = { '#text': p.value }
-            //   }
-            // })
-            singleAction['actionActuatorFunc'] = {
-              '#text': action.key,
-            };
-            action.params.forEach((p) => {
-              if (p.value || p.value !== '') {
-                singleAction['actionActuatorFuncParam'][p.key] = {
-                  '#text': p.value,
-                };
-              }
-            });
-            if (lnglat?.actions.length > 1) {
-              actionGroup.action.push(singleAction);
-            } else {
-              actionGroup.action = singleAction;
-            }
-          });
-          placemark.actionGroup = actionGroup;
-        }
-        fileTemplate.Folder.Placemark.push(placemark);
-      });
-      const fileWaylines = waylinesContext(fileTemplate);
-      return {
-        fileName: waylineName || fileName,
-        template: fileTemplate,
-        waylines: fileWaylines,
-      };
-    } catch (error) {
-      console.log(error);
-      return error;
-    }
-  };
+	// 创建正常航线
+	const createNoramlWaylines = (waylineBasicInfo, lnglats) => {
+		try {
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const { year, month, day, hours, minutes } = getDateFromTimestamp(updateTime)
+			const fileName = '新建航线_' + year + month + day + hours + minutes
+			// 无人机机型、云台型号、航线高度
+			const { droneEnumValue, payloadEnumValue, height, waylineName } = waylineBasicInfo
+			const defaultHeight = height || 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const startPoint = lnglats[0]
+			const takeOffPoint = [startPoint.latitude, startPoint.longitude, 0].join(',')
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'goContinue' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 20 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点海拔高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
+					autoRerouteInfo: {
+						missionAutoRerouteMode: { '#text': 1 },
+						transitionalAutoRerouteMode: { '#text': 1 },
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: { '#text': 'relativeToStartPoint' },
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': 'usePointSetting' },
+					// 全局高度
+					globalHeight: { '#text': '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					payloadParam: {
+						payloadPositionIndex: { '#text': 0 },
+						focusMode: { '#text': 'firstPoint' },
+						meteringMode: { '#text': 'average' },
+						returnMode: { '#text': 'singleReturnFirst' },
+						samplingRate: { '#text': '240000' },
+						scanningMode: { '#text': 'repetitive' },
+						imageFormat: { '#text': 'wide,zoom' },
+					},
+				},
+			}
+			lnglats.forEach((lnglat, index) => {
+				const placemark = {
+					Point: {
+						// 航点经纬度
+						coordinates: {
+							'#text': `${lnglat.longitude},${lnglat.latitude}`,
+						},
+					},
+					// 航点index
+					index: { '#text': index },
+					// 全局航线高度(椭球高)
+					ellipsoidHeight: { '#text': lnglat.height },
+					// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+					height: { '#text': lnglat.height },
+					// 航点飞行速度
+					waypointSpeed: { '#text': lnglat?.speed || 10 },
+					// 沿航线方向 - 可使用当前默认值
+					waypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 航点类型
+					waypointTurnParam: {
+						waypointTurnMode: {
+							'#text': 'toPointAndStopWithDiscontinuityCurvature',
+						},
+						waypointTurnDampingDist: { '#text': 0.2 },
+					},
+					// 是否全局参数
+					useGlobalHeight: { '#text': 1 },
+					useGlobalSpeed: { '#text': 0 },
+					useGlobalHeadingParam: { '#text': 1 },
+					useGlobalTurnParam: { '#text': 1 },
+					useStraightLine: { '#text': 1 },
+				}
+				if (lnglat?.actions) {
+					const actionGroup = {
+						actionGroupId: { '#text': index },
+						actionGroupStartIndex: { '#text': index },
+						actionGroupEndIndex: { '#text': index },
+						actionGroupMode: { '#text': 'sequence' },
+						actionTrigger: {
+							actionTriggerType: { '#text': 'reachPoint' },
+						},
+						// 单个事件 - 如果是多个事件action可改成数组 action: [{}]
+						// action: [{
+						//   actionId: { '#text': 0 },
+						//   actionActuatorFunc: { '#text': '' },
+						//   actionActuatorFuncParam: {},
+						// }],
+						action: [],
+					}
+					lnglat?.actions.forEach((action, index) => {
+						const singleAction = {
+							actionId: { '#text': index },
+							actionActuatorFunc: { '#text': '' },
+							actionActuatorFuncParam: {},
+						}
+						// actionGroup.action['actionActuatorFunc'] = { '#text': action.key }
+						// action.params.forEach(p => {
+						//   if (p.value || p.value !== '') {
+						//     actionGroup.action['actionActuatorFuncParam'][p.key] = { '#text': p.value }
+						//   }
+						// })
+						singleAction['actionActuatorFunc'] = {
+							'#text': action.key,
+						}
+						action.params.forEach(p => {
+							if (p.value || p.value !== '') {
+								singleAction['actionActuatorFuncParam'][p.key] = {
+									'#text': p.value,
+								}
+							}
+						})
+						if (lnglat?.actions.length > 1) {
+							actionGroup.action.push(singleAction)
+						} else {
+							actionGroup.action = singleAction
+						}
+					})
+					placemark.actionGroup = actionGroup
+				}
+				fileTemplate.Folder.Placemark.push(placemark)
+			})
+			const fileWaylines = waylinesContext(fileTemplate)
+			return {
+				fileName: waylineName || fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return error
+		}
+	}
 
-  // 创建面状航线
-  const createPlanarWayline = (waylineBasicInfo, lnglats) => {};
+	// 创建面状航线
+	const createPlanarWayline = (waylineBasicInfo, lnglats) => {}
 
-  // 创建点状航线
-  const createPointWayLines = (
-    waylineBasicInfo,
-    points,
-    settingInfo,
-    dockPosition,
-  ) => {
-    try {
-      const { droneEnumValue, payloadEnumValue, waylineName } =
-        waylineBasicInfo;
+	// 创建点状航线
+	const createPointWayLines = (waylineBasicInfo, points, settingInfo, dockPosition) => {
+		try {
+			const { droneEnumValue, payloadEnumValue, waylineName } = waylineBasicInfo
 
-      const { imageFormat, heightMode, globalHeight, autoFlightSpeed,gimbalPitchMode,
-        waypointTurnMode,waypointHeadingMode,finishAction,globalTransitionalSpeed  } =
-        settingInfo;
+			const {
+				imageFormat,
+				heightMode,
+				globalHeight,
+				autoFlightSpeed,
+				gimbalPitchMode,
+				waypointTurnMode,
+				waypointHeadingMode,
+				finishAction,
+				globalTransitionalSpeed,
+			} = settingInfo
 
-      const date = new Date();
-      const username = window.localStorage.getItem('bs_username');
-      const updateTime = date.getTime();
-      const { year, month, day, hours, minutes } =
-        getDateFromTimestamp(updateTime);
-      const fileName = '新建航线_' + year + month + day + hours + minutes;
-      // 无人机机型、云台型号、航线高度
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const { year, month, day, hours, minutes } = getDateFromTimestamp(updateTime)
+			const fileName = '新建航线_' + year + month + day + hours + minutes
+			// 无人机机型、云台型号、航线高度
 
-      const defaultHeight = 100;
-      // 起始点位 (参考点位-具体以机场为准)
-      const takeOffPoint = [
-        dockPosition.latitude,
-        dockPosition.longitude,
-        0,
-      ].join(',');
+			const defaultHeight = 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const takeOffPoint = [dockPosition.latitude, dockPosition.longitude, 0].join(',')
 
-      // template.xml对象模版
-      const fileTemplate = {
-        author: { '#text': username },
-        createTime: { '#text': updateTime },
-        updateTime: { '#text': updateTime },
-        missionConfig: {
-          // 飞向首航点模式
-          flyToWaylineMode: { '#text': 'safely' },
-          // 航线结束动作
-          finishAction: { '#text': finishAction || 'goHome' },
-          // 失控是否继续执行航线
-          exitOnRCLost: { '#text': 'executeLostAction' },
-          // 失控动作类型
-          executeRCLostAction: { '#text': 'goBack' },
-          // 安全起飞高度
-          takeOffSecurityHeight: { '#text': 120 },
-          // 参考起飞点
-          takeOffRefPoint: { '#text': takeOffPoint },
-          // 参考起飞点海拔高度
-          takeOffRefPointAGLHeight: { '#text': 0 },
-          // 全局航线过渡速度
-          globalTransitionalSpeed: { '#text': globalTransitionalSpeed || 10 },
-          // 全局返航高度
-          globalRTHHeight: { '#text': defaultHeight },
-          // 无人机参数
-          droneInfo: {
-            droneEnumValue: { '#text': droneEnumValue },
-            droneSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-          },
-          // 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
-          autoRerouteInfo: {
-            missionAutoRerouteMode: { '#text': 1 },
-            transitionalAutoRerouteMode: { '#text': 1 },
-          },
-          // 云台参数
-          payloadInfo: {
-            payloadEnumValue: { '#text': payloadEnumValue },
-            payloadSubEnumValue: {
-              '#text': droneModel[payloadEnumValue],
-            },
-            payloadPositionIndex: { '#text': 0 },
-          },
-        },
-        Folder: {
-          // 预定义模板类型 - 航点飞行
-          templateType: { '#text': 'waypoint' },
-          // 是否使用全局航线过渡速度
-          useGlobalTransitionalSpeed: { '#text': 0 },
-          templateId: { '#text': 0 },
-          // 坐标系参数信息
-          waylineCoordinateSysParam: {
-            // 经纬度坐标系 - 固定值
-            coordinateMode: { '#text': 'WGS84' },
-            // 航点高程参考平面	- 相对高度
-            heightMode: heightMode,
-          },
-          // 全局航线飞行速度
-          autoFlightSpeed: { '#text': autoFlightSpeed || 10 },
-          // 云台俯仰角控制模式
-          gimbalPitchMode: { '#text': gimbalPitchMode || 'manual' },
-          // 全局高度
-          globalHeight: { '#text': globalHeight || '100' },
-          // 全局偏航角模式参数 - 可使用当前默认值
-          globalWaypointHeadingParam: {
-            waypointHeadingMode: { '#text': waypointHeadingMode || 'followWayline' },
-            waypointHeadingAngle: { '#text': 0 },
-            waypointPoiPoint: {
-              '#text': '0.000000,0.000000,0.000000',
-            },
-            waypointHeadingPathMode: { '#text': 'followBadArc' },
-            waypointHeadingPoiIndex: { '#text': 0 },
-          },
-          // 全局航点类型 - 直线飞行,飞行器到点停
-          globalWaypointTurnMode: {
-            '#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
-          },
-          // 全局航段轨迹是否尽量贴合直线
-          globalUseStraightLine: { '#text': 1 },
-          // 航点点位信息 - 位置、事件等
-          Placemark: [],
-          payloadParam: {
-            payloadPositionIndex: { '#text': 0 },
-            focusMode: { '#text': 'firstPoint' },
-            meteringMode: { '#text': 'average' },
-            returnMode: { '#text': 'singleReturnFirst' },
-            samplingRate: { '#text': '240000' },
-            scanningMode: { '#text': 'repetitive' },
-            imageFormat: imageFormat,
-          },
-        },
-      };
-      points.length &&
-        points.forEach((detail, ind) => {
-          const { Point, index, height, ellipsoidHeight, actionGroup,waypointSpeed } = detail;
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': finishAction || 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'executeLostAction' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 120 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点海拔高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': globalTransitionalSpeed || 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
+					autoRerouteInfo: {
+						missionAutoRerouteMode: { '#text': 1 },
+						transitionalAutoRerouteMode: { '#text': 1 },
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: heightMode,
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': autoFlightSpeed || 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': gimbalPitchMode || 'manual' },
+					// 全局高度
+					globalHeight: { '#text': globalHeight || '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': waypointHeadingMode || 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					payloadParam: {
+						payloadPositionIndex: { '#text': 0 },
+						focusMode: { '#text': 'firstPoint' },
+						meteringMode: { '#text': 'average' },
+						returnMode: { '#text': 'singleReturnFirst' },
+						samplingRate: { '#text': '240000' },
+						scanningMode: { '#text': 'repetitive' },
+						imageFormat: imageFormat,
+					},
+				},
+			}
+			points.length &&
+				points.forEach((detail, ind) => {
+					const { Point, index, height, ellipsoidHeight, actionGroup, waypointSpeed } = detail
 
-          const placemark = {
-            Point,
-            // 航点index
-            index,
-            // 全局航线高度(椭球高)
-            ellipsoidHeight,
-            // 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
-            height,
-            // 航点飞行速度
-            waypointSpeed: { '#text': waypointSpeed ||  10 },
-            // 沿航线方向 - 可使用当前默认值
-            waypointHeadingParam: {
-              waypointHeadingMode: { '#text': waypointHeadingMode || 'followWayline' },
-              waypointHeadingAngle: { '#text': 0 },
-              waypointPoiPoint: {
-                '#text': '0.000000,0.000000,0.000000',
-              },
-              waypointHeadingPathMode: { '#text': 'followBadArc' },
-              waypointHeadingPoiIndex: { '#text': 0 },
-            },
-            // 航点类型
-            waypointTurnParam: {
-              waypointTurnMode: {
-                '#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
-              },
-              waypointTurnDampingDist: { '#text': 0.2 },
-            },
-            // 是否全局参数
-            useGlobalHeight: { '#text': 1 },
-            useGlobalSpeed: { '#text': 0 },
-            useGlobalHeadingParam: { '#text': 1 },
-            useGlobalTurnParam: { '#text': 1 },
-            useStraightLine: { '#text': 1 },
-          };
-          if (actionGroup) {
-            placemark.actionGroup = actionGroup;
-          }
+					const placemark = {
+						Point,
+						// 航点index
+						index,
+						// 全局航线高度(椭球高)
+						ellipsoidHeight,
+						// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+						height,
+						// 航点飞行速度
+						waypointSpeed: { '#text': waypointSpeed || 10 },
+						// 沿航线方向 - 可使用当前默认值
+						waypointHeadingParam: {
+							waypointHeadingMode: {
+								'#text': waypointHeadingMode || 'followWayline',
+							},
+							waypointHeadingAngle: { '#text': 0 },
+							waypointPoiPoint: {
+								'#text': '0.000000,0.000000,0.000000',
+							},
+							waypointHeadingPathMode: { '#text': 'followBadArc' },
+							waypointHeadingPoiIndex: { '#text': 0 },
+						},
+						// 航点类型
+						waypointTurnParam: {
+							waypointTurnMode: {
+								'#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
+							},
+							waypointTurnDampingDist: { '#text': 0.2 },
+						},
+						// 是否全局参数
+						useGlobalHeight: { '#text': 1 },
+						useGlobalSpeed: { '#text': 0 },
+						useGlobalHeadingParam: { '#text': 1 },
+						useGlobalTurnParam: { '#text': 1 },
+						useStraightLine: { '#text': 1 },
+					}
+					if (actionGroup) {
+						placemark.actionGroup = actionGroup
+					}
 
-          fileTemplate.Folder.Placemark.push(placemark);
-        });
+					fileTemplate.Folder.Placemark.push(placemark)
+				})
 
-      const fileWaylines = waylinesContext(fileTemplate);
-      return {
-        fileName: waylineName || fileName,
-        template: fileTemplate,
-        waylines: fileWaylines,
-      };
-    } catch (error) {
-      console.log(error);
-      return error;
-    }
-  };
+			const fileWaylines = waylinesContext(fileTemplate)
+			return {
+				fileName: waylineName || fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return error
+		}
+	}
 
-  const save = async (fileInfo) => {
-    const JsZip = new JSZIP();
-    const { fileName, template, waylines } = fileInfo;
-    const templateXml = JSONToXML(template, '', true);
-    const waylinesWpml = JSONToXML(waylines, '', true);
-    JsZip.file('wpmz/template.kml', templateXml);
-    JsZip.file('wpmz/waylines.wpml', waylinesWpml);
-    const fileBlob = await JsZip.generateAsync({ type: 'blob' });
-    // saveAs(kmzFile, `${fileName}.kmz`)
-    return fileBlob;
-  };
+	const save = async fileInfo => {
+		const JsZip = new JSZIP()
+		const { fileName, template, waylines } = fileInfo
+		const templateXml = JSONToXML(template, '', true)
+		const waylinesWpml = JSONToXML(waylines, '', true)
+		JsZip.file('wpmz/template.kml', templateXml)
+		JsZip.file('wpmz/waylines.wpml', waylinesWpml)
+		const fileBlob = await JsZip.generateAsync({ type: 'blob' })
+		// saveAs(kmzFile, `${fileName}.kmz`)
+		return fileBlob
+	}
 
-  const waylinesContext = (templateJson) => {
-    const waylinesObj = {
-      // 标准模版
-      missionConfig: {
-        flyToWaylineMode: null,
-        finishAction: null,
-        exitOnRCLost: null,
-        executeRCLostAction: null,
-        takeOffSecurityHeight: null,
-        globalTransitionalSpeed: null,
-        globalRTHHeight: null,
-        droneInfo: null,
-        payloadInfo: null,
-      },
-      Folder: {
-        templateId: null,
-        executeHeightMode: null,
-        waylineId: null,
-        autoFlightSpeed: null,
-        /*
+	const waylinesContext = templateJson => {
+		const waylinesObj = {
+			// 标准模版
+			missionConfig: {
+				flyToWaylineMode: null,
+				finishAction: null,
+				exitOnRCLost: null,
+				executeRCLostAction: null,
+				takeOffSecurityHeight: null,
+				globalTransitionalSpeed: null,
+				globalRTHHeight: null,
+				droneInfo: null,
+				payloadInfo: null,
+			},
+			Folder: {
+				templateId: null,
+				executeHeightMode: null,
+				waylineId: null,
+				autoFlightSpeed: null,
+				/*
           waylines.wpml和template.xml的Placemark通用
           不同点:
             waylineId = templateId
             ellipsoidHeight、 height 替换成 executeHeight
         */
-        Placemark: null,
-      },
-    };
-    Object.keys(waylinesObj).forEach((key) => {
-      if (
-        Object.prototype.toString.call(waylinesObj[key]) === '[object Object]'
-      ) {
-        Object.keys(waylinesObj[key]).forEach((item) => {
-          waylinesObj[key][item] = templateJson[key][item];
-          if (item === 'executeHeightMode') {
-            waylinesObj[key][item] =
-              templateJson[key].waylineCoordinateSysParam.heightMode;
-          }
-          if (item === 'waylineId') {
-            waylinesObj[key][item] = templateJson[key].templateId;
-          }
-          if (item === 'Placemark') {
-            const placemarks = _.cloneDeep(templateJson[key][item]);
-            placemarks.forEach((placemark) => {
-              placemark.executeHeight = {
-                '#text': placemark.ellipsoidHeight?.['#text'] || '',
-              };
-              delete placemark.ellipsoidHeight;
-              delete placemark.height;
-            });
-            waylinesObj[key][item] = placemarks;
-          }
-        });
-      } else {
-        waylinesObj[key] = templateJson[key];
-      }
-    });
-    return waylinesObj;
-  };
+				Placemark: null,
+			},
+		}
+		Object.keys(waylinesObj).forEach(key => {
+			if (Object.prototype.toString.call(waylinesObj[key]) === '[object Object]') {
+				Object.keys(waylinesObj[key]).forEach(item => {
+					waylinesObj[key][item] = templateJson[key][item]
+					if (item === 'executeHeightMode') {
+						waylinesObj[key][item] = templateJson[key].waylineCoordinateSysParam.heightMode
+					}
+					if (item === 'waylineId') {
+						waylinesObj[key][item] = templateJson[key].templateId
+					}
+					if (item === 'Placemark') {
+						const placemarks = _.cloneDeep(templateJson[key][item])
+						placemarks.forEach(placemark => {
+							placemark.executeHeight = {
+								'#text': placemark.ellipsoidHeight?.['#text'] || '',
+							}
+							delete placemark.ellipsoidHeight
+							delete placemark.height
+						})
+						waylinesObj[key][item] = placemarks
+					}
+				})
+			} else {
+				waylinesObj[key] = templateJson[key]
+			}
+		})
+		return waylinesObj
+	}
 
-  return {
-    create,
-    createNoramlWaylines,
-    createPlanarWayline,
-    createPointWayLines,
-    save,
-  };
+	return {
+		create,
+		createNoramlWaylines,
+		createPlanarWayline,
+		createPointWayLines,
+		save,
+	}
 }
diff --git a/src/utils/crypto.js b/src/utils/crypto.js
index 4bbd03a..8293bbf 100644
--- a/src/utils/crypto.js
+++ b/src/utils/crypto.js
@@ -1,94 +1,94 @@
-import CryptoJS from 'crypto-js';
+import CryptoJS from 'crypto-js'
 
 export default class crypto {
-  /**
-   * token加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
-   * @type {string}
-   */
-  static cryptoKey = '请配置cryptoKey';
-  /**
-   * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
-   * @type {string}
-   */
-  static aesKey = '请配置aesKey';
-  /**
-   * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
-   * @type {string}
-   */
-  static desKey = '请配置desKey';
+	/**
+	 * token加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
+	 * @type {string}
+	 */
+	static cryptoKey = '请配置cryptoKey'
+	/**
+	 * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
+	 * @type {string}
+	 */
+	static aesKey = '请配置aesKey'
+	/**
+	 * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致
+	 * @type {string}
+	 */
+	static desKey = '请配置desKey'
 
-  /**
-   * aes 加密方法
-   * @param data
-   * @returns {*}
-   */
-  static encrypt(data) {
-    return this.encryptAES(data, this.aesKey);
-  }
+	/**
+	 * aes 加密方法
+	 * @param data
+	 * @returns {*}
+	 */
+	static encrypt(data) {
+		return this.encryptAES(data, this.aesKey)
+	}
 
-  /**
-   * aes 解密方法
-   * @param data
-   * @returns {*}
-   */
-  static decrypt(data) {
-    return this.decryptAES(data, this.aesKey);
-  }
+	/**
+	 * aes 解密方法
+	 * @param data
+	 * @returns {*}
+	 */
+	static decrypt(data) {
+		return this.decryptAES(data, this.aesKey)
+	}
 
-  /**
-   * aes 加密方法,同java:AesUtil.encryptToBase64(text, aesKey);
-   */
-  static encryptAES(data, key) {
-    const dataBytes = CryptoJS.enc.Utf8.parse(data);
-    const keyBytes = CryptoJS.enc.Utf8.parse(key);
-    const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, {
-      iv: keyBytes,
-      mode: CryptoJS.mode.CBC,
-      padding: CryptoJS.pad.Pkcs7,
-    });
-    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
-  }
+	/**
+	 * aes 加密方法,同java:AesUtil.encryptToBase64(text, aesKey);
+	 */
+	static encryptAES(data, key) {
+		const dataBytes = CryptoJS.enc.Utf8.parse(data)
+		const keyBytes = CryptoJS.enc.Utf8.parse(key)
+		const encrypted = CryptoJS.AES.encrypt(dataBytes, keyBytes, {
+			iv: keyBytes,
+			mode: CryptoJS.mode.CBC,
+			padding: CryptoJS.pad.Pkcs7,
+		})
+		return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
+	}
 
-  /**
-   * aes 解密方法,同java:AesUtil.decryptFormBase64ToString(encrypt, aesKey);
-   */
-  static decryptAES(data, key) {
-    const keyBytes = CryptoJS.enc.Utf8.parse(key);
-    const decrypted = CryptoJS.AES.decrypt(data, keyBytes, {
-      iv: keyBytes,
-      mode: CryptoJS.mode.CBC,
-      padding: CryptoJS.pad.Pkcs7,
-    });
-    return CryptoJS.enc.Utf8.stringify(decrypted);
-  }
+	/**
+	 * aes 解密方法,同java:AesUtil.decryptFormBase64ToString(encrypt, aesKey);
+	 */
+	static decryptAES(data, key) {
+		const keyBytes = CryptoJS.enc.Utf8.parse(key)
+		const decrypted = CryptoJS.AES.decrypt(data, keyBytes, {
+			iv: keyBytes,
+			mode: CryptoJS.mode.CBC,
+			padding: CryptoJS.pad.Pkcs7,
+		})
+		return CryptoJS.enc.Utf8.stringify(decrypted)
+	}
 
-  /**
-   * des 加密方法,同java:DesUtil.encryptToBase64(text, desKey)
-   */
-  static encryptDES(data, key) {
-    const keyHex = CryptoJS.enc.Utf8.parse(key);
-    const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
-      mode: CryptoJS.mode.ECB,
-      padding: CryptoJS.pad.Pkcs7,
-    });
-    return encrypted.toString();
-  }
+	/**
+	 * des 加密方法,同java:DesUtil.encryptToBase64(text, desKey)
+	 */
+	static encryptDES(data, key) {
+		const keyHex = CryptoJS.enc.Utf8.parse(key)
+		const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
+			mode: CryptoJS.mode.ECB,
+			padding: CryptoJS.pad.Pkcs7,
+		})
+		return encrypted.toString()
+	}
 
-  /**
-   * des 解密方法,同java:DesUtil.decryptFormBase64(encryptBase64, desKey);
-   */
-  static decryptDES(data, key) {
-    const keyHex = CryptoJS.enc.Utf8.parse(key);
-    const decrypted = CryptoJS.DES.decrypt(
-      {
-        ciphertext: CryptoJS.enc.Base64.parse(data),
-      },
-      keyHex,
-      {
-        mode: CryptoJS.mode.ECB,
-        padding: CryptoJS.pad.Pkcs7,
-      }
-    );
-    return decrypted.toString(CryptoJS.enc.Utf8);
-  }
+	/**
+	 * des 解密方法,同java:DesUtil.decryptFormBase64(encryptBase64, desKey);
+	 */
+	static decryptDES(data, key) {
+		const keyHex = CryptoJS.enc.Utf8.parse(key)
+		const decrypted = CryptoJS.DES.decrypt(
+			{
+				ciphertext: CryptoJS.enc.Base64.parse(data),
+			},
+			keyHex,
+			{
+				mode: CryptoJS.mode.ECB,
+				padding: CryptoJS.pad.Pkcs7,
+			}
+		)
+		return decrypted.toString(CryptoJS.enc.Utf8)
+	}
 }
diff --git a/src/utils/date.js b/src/utils/date.js
index 35d9eb7..0c54b10 100644
--- a/src/utils/date.js
+++ b/src/utils/date.js
@@ -1,58 +1,58 @@
 export const calcDate = (date1, date2) => {
-  let date3 = date2 - date1;
+	let date3 = date2 - date1
 
-  let days = Math.floor(date3 / (24 * 3600 * 1000));
+	let days = Math.floor(date3 / (24 * 3600 * 1000))
 
-  let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
-  let hours = Math.floor(leave1 / (3600 * 1000));
+	let leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数
+	let hours = Math.floor(leave1 / (3600 * 1000))
 
-  let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
-  let minutes = Math.floor(leave2 / (60 * 1000));
+	let leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数
+	let minutes = Math.floor(leave2 / (60 * 1000))
 
-  let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
-  let seconds = Math.round(date3 / 1000);
-  return {
-    leave1,
-    leave2,
-    leave3,
-    days: days,
-    hours: hours,
-    minutes: minutes,
-    seconds: seconds,
-  };
-};
+	let leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数
+	let seconds = Math.round(date3 / 1000)
+	return {
+		leave1,
+		leave2,
+		leave3,
+		days: days,
+		hours: hours,
+		minutes: minutes,
+		seconds: seconds,
+	}
+}
 
 /**
  * 日期格式化
  */
 export function dateFormat(date, format) {
-  format = format || 'yyyy-MM-dd hh:mm:ss';
-  if (date !== 'Invalid Date') {
-    let o = {
-      'M+': date.getMonth() + 1, //month
-      'd+': date.getDate(), //day
-      'h+': date.getHours(), //hour
-      'm+': date.getMinutes(), //minute
-      's+': date.getSeconds(), //second
-      'q+': Math.floor((date.getMonth() + 3) / 3), //quarter
-      S: date.getMilliseconds(), //millisecond
-    };
-    if (/(y+)/.test(format))
-      format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
-    for (let k in o)
-      if (new RegExp('(' + k + ')').test(format))
-        format = format.replace(
-          RegExp.$1,
-          RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
-        );
-    return format;
-  }
-  return '';
+	format = format || 'yyyy-MM-dd hh:mm:ss'
+	if (date !== 'Invalid Date') {
+		let o = {
+			'M+': date.getMonth() + 1, //month
+			'd+': date.getDate(), //day
+			'h+': date.getHours(), //hour
+			'm+': date.getMinutes(), //minute
+			's+': date.getSeconds(), //second
+			'q+': Math.floor((date.getMonth() + 3) / 3), //quarter
+			S: date.getMilliseconds(), //millisecond
+		}
+		if (/(y+)/.test(format))
+			format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
+		for (let k in o)
+			if (new RegExp('(' + k + ')').test(format))
+				format = format.replace(
+					RegExp.$1,
+					RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
+				)
+		return format
+	}
+	return ''
 }
 
 /**
  * 当前时间戳
  */
 export function dateNow() {
-  return dateFormat(new Date(), 'yyyyMMddhhmmss');
+	return dateFormat(new Date(), 'yyyyMMddhhmmss')
 }
diff --git a/src/utils/flow.js b/src/utils/flow.js
index 7c9e918..5528893 100644
--- a/src/utils/flow.js
+++ b/src/utils/flow.js
@@ -4,7 +4,7 @@
  * @returns {string}
  */
 export function flowCategory(category) {
-  return `flow_${category}`;
+	return `flow_${category}`
 }
 
 /**
@@ -13,8 +13,8 @@
  * @param key
  */
 export function flowRoute(routes, key) {
-  const data = routes.filter(d => {
-    return d.routeKey === key;
-  });
-  return data.length === 0 ? [] : data[0].routeValue;
+	const data = routes.filter(d => {
+		return d.routeKey === key
+	})
+	return data.length === 0 ? [] : data[0].routeValue
 }
diff --git a/src/utils/formatter.js b/src/utils/formatter.js
index 003fae2..69ba132 100644
--- a/src/utils/formatter.js
+++ b/src/utils/formatter.js
@@ -1,39 +1,42 @@
-import {validatenull} from "@/utils/validate";
+import { validatenull } from '@/utils/validate'
 
 /**
  * 格式化工具类
  */
 export default class formatter {
-  static prettyCode(str) {
-    try {
-      // 为空则返回空
-      if (validatenull(str)) {
-        return '';
-      }
-      // 解析并格式化JSON字符串
-      str = JSON.stringify(JSON.parse(str), null, 2);
+	static prettyCode(str) {
+		try {
+			// 为空则返回空
+			if (validatenull(str)) {
+				return ''
+			}
+			// 解析并格式化JSON字符串
+			str = JSON.stringify(JSON.parse(str), null, 2)
 
-      // 使用HTML实体进行替换(不改变&符号)
-      str = str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+			// 使用HTML实体进行替换(不改变&符号)
+			str = str.replace(/</g, '&lt;').replace(/>/g, '&gt;')
 
-      // 返回格式化的字符串,并添加样式类
-      return str.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
-        let cls = 'number';
-        if (/^"/.test(match)) {
-          if (/:$/.test(match)) {
-            cls = 'key';
-          } else {
-            cls = 'string';
-          }
-        } else if (/true|false/.test(match)) {
-          cls = 'boolean';
-        } else if (/null/.test(match)) {
-          cls = 'null';
-        }
-        return match;
-      });
-    } catch (e) {
-      return str;
-    }
-  }
+			// 返回格式化的字符串,并添加样式类
+			return str.replace(
+				/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
+				function (match) {
+					let cls = 'number'
+					if (/^"/.test(match)) {
+						if (/:$/.test(match)) {
+							cls = 'key'
+						} else {
+							cls = 'string'
+						}
+					} else if (/true|false/.test(match)) {
+						cls = 'boolean'
+					} else if (/null/.test(match)) {
+						cls = 'null'
+					}
+					return match
+				}
+			)
+		} catch (e) {
+			return str
+		}
+	}
 }
diff --git a/src/utils/func.js b/src/utils/func.js
index ac6fe0e..fdcdf39 100644
--- a/src/utils/func.js
+++ b/src/utils/func.js
@@ -2,309 +2,309 @@
  * 通用工具类
  */
 export default class func {
-  /**
-   * 不为空
-   * @param val
-   * @returns {boolean}
-   */
-  static notEmpty(val) {
-    return !this.isEmpty(val);
-  }
+	/**
+	 * 不为空
+	 * @param val
+	 * @returns {boolean}
+	 */
+	static notEmpty(val) {
+		return !this.isEmpty(val)
+	}
 
-  /**
-   * 是否为定义
-   * @param val
-   * @returns {boolean}
-   */
-  static isUndefined(val) {
-    return val === null || typeof val === 'undefined';
-  }
+	/**
+	 * 是否为定义
+	 * @param val
+	 * @returns {boolean}
+	 */
+	static isUndefined(val) {
+		return val === null || typeof val === 'undefined'
+	}
 
-  /**
-   * 为空
-   * @param val
-   * @returns {boolean}
-   */
-  static isEmpty(val) {
-    if (
-      val === null ||
-      typeof val === 'undefined' ||
-      (typeof val === 'string' && val === '' && val !== 'undefined')
-    ) {
-      return true;
-    }
-    return false;
-  }
+	/**
+	 * 为空
+	 * @param val
+	 * @returns {boolean}
+	 */
+	static isEmpty(val) {
+		if (
+			val === null ||
+			typeof val === 'undefined' ||
+			(typeof val === 'string' && val === '' && val !== 'undefined')
+		) {
+			return true
+		}
+		return false
+	}
 
-  /**
-   * 强转int型
-   * @param val
-   * @param defaultValue
-   * @returns {number}
-   */
-  static toInt(val, defaultValue) {
-    if (this.isEmpty(val)) {
-      return defaultValue === undefined ? -1 : defaultValue;
-    }
-    const num = parseInt(val, 0);
-    return Number.isNaN(num) ? (defaultValue === undefined ? -1 : defaultValue) : num;
-  }
+	/**
+	 * 强转int型
+	 * @param val
+	 * @param defaultValue
+	 * @returns {number}
+	 */
+	static toInt(val, defaultValue) {
+		if (this.isEmpty(val)) {
+			return defaultValue === undefined ? -1 : defaultValue
+		}
+		const num = parseInt(val, 0)
+		return Number.isNaN(num) ? (defaultValue === undefined ? -1 : defaultValue) : num
+	}
 
-  /**
-   * 转为数字型(转换失败则返回原值)
-   * @param val
-   */
-  static toNumber(val) {
-    if (this.isEmpty(val)) {
-      return '';
-    }
-    const num = parseFloat(val);
-    return Number.isNaN(num) ? val : num;
-  }
+	/**
+	 * 转为数字型(转换失败则返回原值)
+	 * @param val
+	 */
+	static toNumber(val) {
+		if (this.isEmpty(val)) {
+			return ''
+		}
+		const num = parseFloat(val)
+		return Number.isNaN(num) ? val : num
+	}
 
-  /**
-   * Json强转为Form类型
-   * @param obj
-   * @returns {FormData}
-   */
-  static toFormData(obj) {
-    const data = new FormData();
-    Object.keys(obj).forEach(key => {
-      data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key]);
-    });
-    return data;
-  }
+	/**
+	 * Json强转为Form类型
+	 * @param obj
+	 * @returns {FormData}
+	 */
+	static toFormData(obj) {
+		const data = new FormData()
+		Object.keys(obj).forEach(key => {
+			data.append(key, Array.isArray(obj[key]) ? obj[key].join(',') : obj[key])
+		})
+		return data
+	}
 
-  /**
-   * date类转为字符串格式
-   * @param date
-   * @param format
-   * @returns {null}
-   */
-  static format(date, format = 'YYYY-MM-DD HH:mm:ss') {
-    return date ? date.format(format) : null;
-  }
+	/**
+	 * date类转为字符串格式
+	 * @param date
+	 * @param format
+	 * @returns {null}
+	 */
+	static format(date, format = 'YYYY-MM-DD HH:mm:ss') {
+		return date ? date.format(format) : null
+	}
 
-  /**
-   * data类格式化
-   * @param timestamp
-   * @returns {string}
-   */
-  static formatDateTime(timestamp) {
-    return this.formatDate(new Date(timestamp));
-  }
+	/**
+	 * data类格式化
+	 * @param timestamp
+	 * @returns {string}
+	 */
+	static formatDateTime(timestamp) {
+		return this.formatDate(new Date(timestamp))
+	}
 
-  /**
-   * data类格式化
-   * @param date
-   * @returns {string}
-   */
-  static formatDate(date) {
-    const pad = num => (num < 10 ? '0' + num : num);
+	/**
+	 * data类格式化
+	 * @param date
+	 * @returns {string}
+	 */
+	static formatDate(date) {
+		const pad = num => (num < 10 ? '0' + num : num)
 
-    const year = date.getFullYear();
-    const month = pad(date.getMonth() + 1); // 月份从0开始,所以+1
-    const day = pad(date.getDate());
-    const hour = pad(date.getHours());
-    const minute = pad(date.getMinutes());
-    const second = pad(date.getSeconds());
+		const year = date.getFullYear()
+		const month = pad(date.getMonth() + 1) // 月份从0开始,所以+1
+		const day = pad(date.getDate())
+		const hour = pad(date.getHours())
+		const minute = pad(date.getMinutes())
+		const second = pad(date.getSeconds())
 
-    return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
-  }
+		return `${year}-${month}-${day} ${hour}:${minute}:${second}`
+	}
 
-  /**
-   * 格式化时区解决时间差问题
-   * @param datetime
-   * @returns {string}
-   */
-  static toLocalISOString(datetime) {
-    let timezoneOffset = datetime.getTimezoneOffset() * 60000; // 获取当前时区与UTC的时间差(以毫秒为单位)
-    let localDatetime = new Date(datetime - timezoneOffset); // 调整时间,得到当前时区时间
-    return localDatetime.toISOString();
-  }
+	/**
+	 * 格式化时区解决时间差问题
+	 * @param datetime
+	 * @returns {string}
+	 */
+	static toLocalISOString(datetime) {
+		let timezoneOffset = datetime.getTimezoneOffset() * 60000 // 获取当前时区与UTC的时间差(以毫秒为单位)
+		let localDatetime = new Date(datetime - timezoneOffset) // 调整时间,得到当前时区时间
+		return localDatetime.toISOString()
+	}
 
-  /**
-   * 根据逗号联合
-   * @param arr
-   * @returns {string}
-   */
-  static join(arr) {
-    return Array.isArray(arr) ? arr.join(',') : arr;
-  }
+	/**
+	 * 根据逗号联合
+	 * @param arr
+	 * @returns {string}
+	 */
+	static join(arr) {
+		return Array.isArray(arr) ? arr.join(',') : arr
+	}
 
-  /**
-   * 根据逗号分隔
-   * @param str
-   * @returns {string}
-   */
-  static split(str) {
-    return str ? String(str).split(',') : '';
-  }
+	/**
+	 * 根据逗号分隔
+	 * @param str
+	 * @returns {string}
+	 */
+	static split(str) {
+		return str ? String(str).split(',') : ''
+	}
 
-  /**
-   * 转换空字符串
-   * @param str
-   * @returns {string|*}
-   */
-  static toStr(str) {
-    if (typeof str === 'undefined' || str === null) {
-      return '';
-    }
-    return str;
-  }
+	/**
+	 * 转换空字符串
+	 * @param str
+	 * @returns {string|*}
+	 */
+	static toStr(str) {
+		if (typeof str === 'undefined' || str === null) {
+			return ''
+		}
+		return str
+	}
 
-  /**
-   * 判断是否为数组
-   * @param param
-   * @returns {boolean}
-   */
-  static isArrayAndNotEmpty(param) {
-    return Array.isArray(param) && param.length > 0;
-  }
+	/**
+	 * 判断是否为数组
+	 * @param param
+	 * @returns {boolean}
+	 */
+	static isArrayAndNotEmpty(param) {
+		return Array.isArray(param) && param.length > 0
+	}
 
-  /**
-   * 格式化URL
-   * @param url
-   * @returns {*|string}
-   */
-  static formatUrl(url) {
-    if (!url) return url;
-    if (url.startsWith('http://') || url.startsWith('https://')) {
-      return url;
-    } else {
-      return `http://${url}`;
-    }
-  }
+	/**
+	 * 格式化URL
+	 * @param url
+	 * @returns {*|string}
+	 */
+	static formatUrl(url) {
+		if (!url) return url
+		if (url.startsWith('http://') || url.startsWith('https://')) {
+			return url
+		} else {
+			return `http://${url}`
+		}
+	}
 
-  /**
-   * bytes转换为kb单位
-   * @param bytes
-   * @returns {string}
-   */
-  static bytesToKB(bytes) {
-    const kb = bytes / 1024;
-    return kb.toFixed(2);
-  }
+	/**
+	 * bytes转换为kb单位
+	 * @param bytes
+	 * @returns {string}
+	 */
+	static bytesToKB(bytes) {
+		const kb = bytes / 1024
+		return kb.toFixed(2)
+	}
 
-  /**
-   * json数组转换成key value字符串
-   * @param jsonArray "[{enumKey: 'key', enumValue: 'value'}]"
-   * @returns {*}
-   */
-  static jsonArrayToKeyValue(jsonArray) {
-    if (this.isEmpty(jsonArray)) {
-      return '';
-    }
-    return jsonArray.map(item => `${item.enumKey}:${item.enumValue}`).join(';');
-  }
+	/**
+	 * json数组转换成key value字符串
+	 * @param jsonArray "[{enumKey: 'key', enumValue: 'value'}]"
+	 * @returns {*}
+	 */
+	static jsonArrayToKeyValue(jsonArray) {
+		if (this.isEmpty(jsonArray)) {
+			return ''
+		}
+		return jsonArray.map(item => `${item.enumKey}:${item.enumValue}`).join(';')
+	}
 
-  /**
-   * key value字符串转换成json数组
-   * @param keyValue key:value;key:value
-   * @returns {*[]}
-   */
-  static keyValueToJsonArray(keyValue) {
-    if (this.isEmpty(keyValue)) {
-      return [];
-    }
-    return keyValue.split(';').map((kv, index) => {
-      const [key, value] = kv.split(':');
-      return {
-        id: index,
-        enumKey: key,
-        enumValue: value,
-      };
-    });
-  }
+	/**
+	 * key value字符串转换成json数组
+	 * @param keyValue key:value;key:value
+	 * @returns {*[]}
+	 */
+	static keyValueToJsonArray(keyValue) {
+		if (this.isEmpty(keyValue)) {
+			return []
+		}
+		return keyValue.split(';').map((kv, index) => {
+			const [key, value] = kv.split(':')
+			return {
+				id: index,
+				enumKey: key,
+				enumValue: value,
+			}
+		})
+	}
 
-  /**
-   * 检查字符串str中是否包含子字符串val
-   * @param {string} str 要检查的字符串
-   * @param {string} val 要查找的子字符串
-   * @return {boolean} 如果str包含val则返回true,否则返回false
-   */
-  static contains(str, val) {
-    // 检查str是否为字符串且不为空
-    if (typeof str === 'string' && str.length > 0) {
-      return str.includes(val);
-    }
-    return false;
-  }
+	/**
+	 * 检查字符串str中是否包含子字符串val
+	 * @param {string} str 要检查的字符串
+	 * @param {string} val 要查找的子字符串
+	 * @return {boolean} 如果str包含val则返回true,否则返回false
+	 */
+	static contains(str, val) {
+		// 检查str是否为字符串且不为空
+		if (typeof str === 'string' && str.length > 0) {
+			return str.includes(val)
+		}
+		return false
+	}
 
-  /**
-   * 截取字符串
-   * @param str 字符串
-   * @param len 截取长度
-   * @returns {*|string}
-   */
-  static truncateString(str, len = 20) {
-    if (str.length > len) {
-      return str.slice(0, len) + '...';
-    }
-    return str;
-  }
+	/**
+	 * 截取字符串
+	 * @param str 字符串
+	 * @param len 截取长度
+	 * @returns {*|string}
+	 */
+	static truncateString(str, len = 20) {
+		if (str.length > len) {
+			return str.slice(0, len) + '...'
+		}
+		return str
+	}
 
-  /**
-   * 驼峰转下划线
-   * @param str
-   * @returns {*}
-   */
-  static camelCaseString(str) {
-    return str.replace(/_([a-z])/g, g => g[1].toUpperCase());
-  }
+	/**
+	 * 驼峰转下划线
+	 * @param str
+	 * @returns {*}
+	 */
+	static camelCaseString(str) {
+		return str.replace(/_([a-z])/g, g => g[1].toUpperCase())
+	}
 
-  /**
-   * 生成随机字符串
-   * @param length 长度
-   * @returns {string}
-   */
-  static strGenerate(length) {
-    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-    const maxLength = 256;
-    if (length > maxLength) {
-      throw new Error(`长度最大值不能超过 ${maxLength}`);
-    }
+	/**
+	 * 生成随机字符串
+	 * @param length 长度
+	 * @returns {string}
+	 */
+	static strGenerate(length) {
+		const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+		const maxLength = 256
+		if (length > maxLength) {
+			throw new Error(`长度最大值不能超过 ${maxLength}`)
+		}
 
-    return Array.from({ length }, () =>
-      characters.charAt(Math.floor(Math.random() * characters.length))
-    ).join('');
-  }
+		return Array.from({ length }, () =>
+			characters.charAt(Math.floor(Math.random() * characters.length))
+		).join('')
+	}
 
-  /**
-   * 生成UUID
-   * @returns {string}
-   */
-  static generateUUID() {
-    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
-      const r = (Math.random() * 16) | 0,
-        v = c === 'x' ? r : (r & 0x3) | 0x8;
-      return v.toString(16);
-    });
-  }
+	/**
+	 * 生成UUID
+	 * @returns {string}
+	 */
+	static generateUUID() {
+		return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+			const r = (Math.random() * 16) | 0,
+				v = c === 'x' ? r : (r & 0x3) | 0x8
+			return v.toString(16)
+		})
+	}
 
-  /**
-   * 过滤空对象
-   * @param obj
-   * @returns {Object}
-   */
-  static filterEmptyObject(obj) {
-    return Object.fromEntries(
-      Object.entries(obj).filter(
-        ([, value]) => value !== '' && value !== null && value !== undefined
-      )
-    );
-  }
+	/**
+	 * 过滤空对象
+	 * @param obj
+	 * @returns {Object}
+	 */
+	static filterEmptyObject(obj) {
+		return Object.fromEntries(
+			Object.entries(obj).filter(
+				([, value]) => value !== '' && value !== null && value !== undefined
+			)
+		)
+	}
 
-  /**
-   * 获取用户租户ID
-   * @param userInfo
-   * @returns {string}
-   */
-  static getUserTenantId(userInfo) {
-    if (userInfo && userInfo.tenant_id) {
-      return userInfo.tenant_id;
-    } else if (userInfo && userInfo.tenantId) {
-      return userInfo.tenantId;
-    }
-  }
+	/**
+	 * 获取用户租户ID
+	 * @param userInfo
+	 * @returns {string}
+	 */
+	static getUserTenantId(userInfo) {
+		if (userInfo && userInfo.tenant_id) {
+			return userInfo.tenant_id
+		} else if (userInfo && userInfo.tenantId) {
+			return userInfo.tenantId
+		}
+	}
 }
diff --git a/src/utils/http/config.js b/src/utils/http/config.js
index 41da14e..2930d33 100644
--- a/src/utils/http/config.js
+++ b/src/utils/http/config.js
@@ -1,52 +1,55 @@
 export const CURRENT_CONFIG = {
-  // license
-  appId: '136971', // You need to go to the development website to apply.
-  appKey: '3e56cb20958060caeb1071cdb32400e', // You need to go to the development website to apply.
-  appLicense:
-      'eS2rczbPpEUZZkOuek7hB1fugv3TE0RdKyEU319A2cxmVKs7Bc11RadcPcHnQJjBq/Peja5R6bp2IILCypa2lskCUGXkXHmqxdPIVTyMQpkZtjM+eXLut/VHPdXVZOvYxKFMVel6jfEyd4rWL9jBI1N34rCvwSgad6T49mRC8R0=', // You need to go to the development website to apply
-  // http
-  // http://172.16.13.64:8100
-  // baseURL: 'http://192.168.1.133:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
-  // baseURL: 'http://192.168.1.133:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
-  baseURL: 'http://192.168.1.198:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
-  // ws: 'ws//127.0.0.1:6789/api/v1/ws',
-  // ws://192.168.1.198:1883/
-  websocketURL: 'ws://192.168.1.198:6789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
-  // websocketURL: 'ws://192.168.1.133:6789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
-  // websocketURL: 'wss://dev.jxpskj.com:36789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
+	// license
+	appId: '136971', // You need to go to the development website to apply.
+	appKey: '3e56cb20958060caeb1071cdb32400e', // You need to go to the development website to apply.
+	appLicense:
+		'eS2rczbPpEUZZkOuek7hB1fugv3TE0RdKyEU319A2cxmVKs7Bc11RadcPcHnQJjBq/Peja5R6bp2IILCypa2lskCUGXkXHmqxdPIVTyMQpkZtjM+eXLut/VHPdXVZOvYxKFMVel6jfEyd4rWL9jBI1N34rCvwSgad6T49mRC8R0=', // You need to go to the development website to apply
+	// http
+	// http://172.16.13.64:8100
+	// baseURL: 'http://192.168.1.133:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
+	// baseURL: 'http://192.168.1.133:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
+	baseURL: 'http://192.168.1.198:6789', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
+	// ws: 'ws//127.0.0.1:6789/api/v1/ws',
+	// ws://192.168.1.198:1883/
+	websocketURL: 'ws://192.168.1.198:6789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
+	// websocketURL: 'ws://192.168.1.133:6789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
+	// websocketURL: 'wss://dev.jxpskj.com:36789/api/v1/ws', // Example: 'ws://192.168.1.198:6789/api/v1/ws'
 
-  // livestreaming
-  // RTMP  Note: This IP is the address of the streaming server. If you want to see livestream on web page, you need to convert the RTMP stream to WebRTC stream.
-  // rtmpURL: 'rtmp://www.yb.zhbhd.top:30005/uav/', // Example: 'rtmp://192.168.1.1/live/'
-  rtmpURL: import.meta.env.VITE_APP_ENV === 'production'?'rtmp://101.132.85.201/live/':'rtmp://139.196.74.78/live/',
-  rtmpURL2: 'rtmp://www.ainfo.top:735/uav/', // Example: 'rtmp://192.168.1.1/live/'
-  // GB28181 Note:If you don't know what these parameters mean, you can go to Pilot2 and select the GB28181 page in the cloud platform. Where the parameters same as these parameters.
-  // gbServerIp: '171.34.76.175',
-  // gbServerPort: '15060',
-  // gbServerId: '34020000002000000001',
-  // gbPassword: '12345678',
-  // gbAgentId: '34020000001320000001',
-  // gbAgentPort: '8080',
-  // gbAgentChannel: '34020000001320000001',
-  gbServerIp: '139.196.74.78',
-  gbServerPort: '8116',
-  gbServerId: '41010500002000000001',
-  gbAgentId: '41010500002000000002',
-  gbPassword: '12345678',
-  gbAgentPort: '7080',
-  gbAgentChannel: '41010500002000000003',
-  // RTSP
-  rtspUserName: 'Please enter the username.',
-  rtspPassword: 'Please enter the password.',
-  rtspPort: '8554',
-  // Agora
-  agoraAPPID: '0a472a3b0f1543ab9e66d1ad4e6a91c8',
-  agoraToken:
-      '007eJxTYLgR7L7yzoUww9Lj530XRDExB/68L/1CN1Ps7vnJmn/vWfQqMBgkmpgbJRonGaQZmpoYJyZZppqZpRgmppikmiVaGiZbrDzKnNoQyMhg98uLmZEBAkF8ZobEzAoGBgB1nB/x',
-  agoraChannel: 'aix',
+	// livestreaming
+	// RTMP  Note: This IP is the address of the streaming server. If you want to see livestream on web page, you need to convert the RTMP stream to WebRTC stream.
+	// rtmpURL: 'rtmp://www.yb.zhbhd.top:30005/uav/', // Example: 'rtmp://192.168.1.1/live/'
+	rtmpURL:
+		import.meta.env.VITE_APP_ENV === 'production'
+			? 'rtmp://101.132.85.201/live/'
+			: 'rtmp://139.196.74.78/live/',
+	rtmpURL2: 'rtmp://www.ainfo.top:735/uav/', // Example: 'rtmp://192.168.1.1/live/'
+	// GB28181 Note:If you don't know what these parameters mean, you can go to Pilot2 and select the GB28181 page in the cloud platform. Where the parameters same as these parameters.
+	// gbServerIp: '171.34.76.175',
+	// gbServerPort: '15060',
+	// gbServerId: '34020000002000000001',
+	// gbPassword: '12345678',
+	// gbAgentId: '34020000001320000001',
+	// gbAgentPort: '8080',
+	// gbAgentChannel: '34020000001320000001',
+	gbServerIp: '139.196.74.78',
+	gbServerPort: '8116',
+	gbServerId: '41010500002000000001',
+	gbAgentId: '41010500002000000002',
+	gbPassword: '12345678',
+	gbAgentPort: '7080',
+	gbAgentChannel: '41010500002000000003',
+	// RTSP
+	rtspUserName: 'Please enter the username.',
+	rtspPassword: 'Please enter the password.',
+	rtspPort: '8554',
+	// Agora
+	agoraAPPID: '0a472a3b0f1543ab9e66d1ad4e6a91c8',
+	agoraToken:
+		'007eJxTYLgR7L7yzoUww9Lj530XRDExB/68L/1CN1Ps7vnJmn/vWfQqMBgkmpgbJRonGaQZmpoYJyZZppqZpRgmppikmiVaGiZbrDzKnNoQyMhg98uLmZEBAkF8ZobEzAoGBgB1nB/x',
+	agoraChannel: 'aix',
 
-  // map
-  // You can apply on the AMap website.
-  amapKey: '5221d3ca929a7bf59c301be186c03791',
-  amapSearchKey: '6c3ea75b215f0c0efcbcfdf13273991b',
-};
+	// map
+	// You can apply on the AMap website.
+	amapKey: '5221d3ca929a7bf59c301be186c03791',
+	amapSearchKey: '6c3ea75b215f0c0efcbcfdf13273991b',
+}
diff --git a/src/utils/http/enums.js b/src/utils/http/enums.js
index aef42ef..932d2c4 100644
--- a/src/utils/http/enums.js
+++ b/src/utils/http/enums.js
@@ -1,14 +1,14 @@
 export const ELocalStorageKey = {
-  Username: 'bs_username',
-  WorkspaceId: 'bs_workspace_id',
-  NormalToken: 'x-auth-token',
-  Token: 'bs_x-auth-token',
-  PlatformName: 'bs_platform_name',
-  WorkspaceName: 'bs_workspace_name',
-  WorkspaceDesc: 'bs_workspace_desc',
-  Flag: 'bs_flag',
-  UserId: 'bs_user_id',
-  Device: 'bs_device',
-  GatewayOnline: 'bs_gateway_online',
-  UserInfo: 'bs_user_info',
-};
\ No newline at end of file
+	Username: 'bs_username',
+	WorkspaceId: 'bs_workspace_id',
+	NormalToken: 'x-auth-token',
+	Token: 'bs_x-auth-token',
+	PlatformName: 'bs_platform_name',
+	WorkspaceName: 'bs_workspace_name',
+	WorkspaceDesc: 'bs_workspace_desc',
+	Flag: 'bs_flag',
+	UserId: 'bs_user_id',
+	Device: 'bs_device',
+	GatewayOnline: 'bs_gateway_online',
+	UserInfo: 'bs_user_info',
+}
diff --git a/src/utils/module.js b/src/utils/module.js
index 6b34053..f3c21a7 100644
--- a/src/utils/module.js
+++ b/src/utils/module.js
@@ -1,39 +1,39 @@
-let flowInstance = null;
-let formInstance = null;
-let formDesignInstance = null;
+let flowInstance = null
+let formInstance = null
+let formDesignInstance = null
 
 export function loadFlowModule(app) {
-  if (!flowInstance) {
-    flowInstance = import('@saber/nf-design-base-elp')
-      .then(module => {
-        app.use(module.default);
-        return module;
-      })
-      .catch(error => console.error('failed to load module:', error));
-  }
-  return flowInstance;
+	if (!flowInstance) {
+		flowInstance = import('@saber/nf-design-base-elp')
+			.then(module => {
+				app.use(module.default)
+				return module
+			})
+			.catch(error => console.error('failed to load module:', error))
+	}
+	return flowInstance
 }
 
 export function loadFormModule(app) {
-  if (!formInstance) {
-    formInstance = import('@saber/nf-form-elp')
-      .then(module => {
-        app.use(module.default);
-        return module;
-      })
-      .catch(error => console.error('failed to load module:', error));
-  }
-  return formInstance;
+	if (!formInstance) {
+		formInstance = import('@saber/nf-form-elp')
+			.then(module => {
+				app.use(module.default)
+				return module
+			})
+			.catch(error => console.error('failed to load module:', error))
+	}
+	return formInstance
 }
 
 export function loadFormDesignModule(app) {
-  if (!formDesignInstance) {
-    formDesignInstance = import('@saber/nf-form-design-elp')
-      .then(module => {
-        app.use(module.default);
-        return module;
-      })
-      .catch(error => console.error('failed to load module:', error));
-  }
-  return formDesignInstance;
+	if (!formDesignInstance) {
+		formDesignInstance = import('@saber/nf-form-design-elp')
+			.then(module => {
+				app.use(module.default)
+				return module
+			})
+			.catch(error => console.error('failed to load module:', error))
+	}
+	return formDesignInstance
 }
diff --git a/src/utils/rem.js b/src/utils/rem.js
index 1062416..741e12b 100644
--- a/src/utils/rem.js
+++ b/src/utils/rem.js
@@ -1,5 +1,5 @@
 export function onResize() {
-	const resize = ()=> {
+	const resize = () => {
 		const scale = document.documentElement.clientWidth / 192
 		document.documentElement.style.fontSize = scale + 'px'
 	}
@@ -8,6 +8,5 @@
 }
 
 export const pxToRem = width => {
-	return width * 0.1 + 'rem';
-};
-
+	return width * 0.1 + 'rem'
+}
diff --git a/src/utils/sensitive.js b/src/utils/sensitive.js
index 91c4226..8fcf1e8 100644
--- a/src/utils/sensitive.js
+++ b/src/utils/sensitive.js
@@ -1,81 +1,81 @@
 export const sensitive = {
-  /**
-   * 初始化敏感数据管理器
-   * @param {Object} config 配置项
-   * @param {Array} config.fields 需要脱敏的字段列表
-   * @returns {Object} 敏感数据管理器实例
-   */
-  create(config = {}) {
-    const sensitiveFields = config.fields || [];
-    let initialMaskedData = {};
+	/**
+	 * 初始化敏感数据管理器
+	 * @param {Object} config 配置项
+	 * @param {Array} config.fields 需要脱敏的字段列表
+	 * @returns {Object} 敏感数据管理器实例
+	 */
+	create(config = {}) {
+		const sensitiveFields = config.fields || []
+		let initialMaskedData = {}
 
-    return {
-      /**
-       * 保存初始的脱敏数据
-       * @param {Object} data 包含脱敏数据的对象
-       */
-      saveInitialData(data) {
-        initialMaskedData = {};
-        sensitiveFields.forEach(field => {
-          if (data[field]) {
-            initialMaskedData[field] = data[field];
-          }
-        });
-      },
+		return {
+			/**
+			 * 保存初始的脱敏数据
+			 * @param {Object} data 包含脱敏数据的对象
+			 */
+			saveInitialData(data) {
+				initialMaskedData = {}
+				sensitiveFields.forEach(field => {
+					if (data[field]) {
+						initialMaskedData[field] = data[field]
+					}
+				})
+			},
 
-      /**
-       * 获取要提交的数据,过滤掉未修改的敏感字段
-       * @param {Object} formData 表单数据
-       * @returns {Object} 过滤后的提交数据
-       */
-      getSubmitData(formData) {
-        const submitData = { ...formData };
+			/**
+			 * 获取要提交的数据,过滤掉未修改的敏感字段
+			 * @param {Object} formData 表单数据
+			 * @returns {Object} 过滤后的提交数据
+			 */
+			getSubmitData(formData) {
+				const submitData = { ...formData }
 
-        sensitiveFields.forEach(field => {
-          // 如果敏感字段的值与初始值相同,删除该字段
-          if (submitData[field] === initialMaskedData[field]) {
-            delete submitData[field];
-          }
-        });
+				sensitiveFields.forEach(field => {
+					// 如果敏感字段的值与初始值相同,删除该字段
+					if (submitData[field] === initialMaskedData[field]) {
+						delete submitData[field]
+					}
+				})
 
-        return submitData;
-      },
+				return submitData
+			},
 
-      /**
-       * 更新脱敏数据
-       * @param {Object} newMaskedData 新的脱敏数据
-       */
-      updateMaskedData(newMaskedData) {
-        Object.assign(initialMaskedData, newMaskedData);
-      },
+			/**
+			 * 更新脱敏数据
+			 * @param {Object} newMaskedData 新的脱敏数据
+			 */
+			updateMaskedData(newMaskedData) {
+				Object.assign(initialMaskedData, newMaskedData)
+			},
 
-      /**
-       * 判断敏感数据是否被修改
-       * @returns {boolean}
-       */
-      isModified(formData) {
-        return sensitiveFields.some(field => formData[field] !== initialMaskedData[field]);
-      },
+			/**
+			 * 判断敏感数据是否被修改
+			 * @returns {boolean}
+			 */
+			isModified(formData) {
+				return sensitiveFields.some(field => formData[field] !== initialMaskedData[field])
+			},
 
-      /**
-       * 获取已修改的敏感字段列表
-       * @returns {Array}
-       */
-      getModifiedFields(formData) {
-        return sensitiveFields.filter(field => formData[field] !== initialMaskedData[field]);
-      },
+			/**
+			 * 获取已修改的敏感字段列表
+			 * @returns {Array}
+			 */
+			getModifiedFields(formData) {
+				return sensitiveFields.filter(field => formData[field] !== initialMaskedData[field])
+			},
 
-      /**
-       * 重置为初始状态
-       * @param {Object} formData 表单数据对象
-       */
-      reset(formData) {
-        sensitiveFields.forEach(field => {
-          if (initialMaskedData[field]) {
-            formData[field] = initialMaskedData[field];
-          }
-        });
-      },
-    };
-  },
-};
+			/**
+			 * 重置为初始状态
+			 * @param {Object} formData 表单数据对象
+			 */
+			reset(formData) {
+				sensitiveFields.forEach(field => {
+					if (initialMaskedData[field]) {
+						formData[field] = initialMaskedData[field]
+					}
+				})
+			},
+		}
+	},
+}
diff --git a/src/utils/sm2.js b/src/utils/sm2.js
index 9df9880..c090592 100644
--- a/src/utils/sm2.js
+++ b/src/utils/sm2.js
@@ -1,5 +1,5 @@
-import website from '@/config/website';
-import smCrypto from 'sm-crypto';
+import website from '@/config/website'
+import smCrypto from 'sm-crypto'
 
 /**
  * sm2 加密方法
@@ -7,9 +7,9 @@
  * @returns {*}
  */
 export function encrypt(data) {
-  try {
-    return smCrypto.sm2.doEncrypt(data, website.oauth2.publicKey, 0);
-  } catch {
-    return '';
-  }
+	try {
+		return smCrypto.sm2.doEncrypt(data, website.oauth2.publicKey, 0)
+	} catch {
+		return ''
+	}
 }
diff --git a/src/utils/staticData/device.js b/src/utils/staticData/device.js
index c1f74d8..fd3c571 100644
--- a/src/utils/staticData/device.js
+++ b/src/utils/staticData/device.js
@@ -2,274 +2,274 @@
 
 // domain
 export const DOMAIN = {
-  DRONE: '0', // 飞行器
-  PAYLOAD: '1', // 负载
-  RC: '2', // 遥控
-  DOCK: '3', // 机场
-};
+	DRONE: '0', // 飞行器
+	PAYLOAD: '1', // 负载
+	RC: '2', // 遥控
+	DOCK: '3', // 机场
+}
 
 // 设备sub_type 从0升序
 export const DEVICE_SUB_TYPE = {
-  ZERO: 0,
-  ONE: 1,
-  TWO: 2,
-  THREE: 3,
-  UNKNOWN: 65535,
-};
+	ZERO: 0,
+	ONE: 1,
+	TWO: 2,
+	THREE: 3,
+	UNKNOWN: 65535,
+}
 
 // DJI飞机类型
 export const DRONE_TYPE = {
-  M30: 67,
-  M300: 60,
-  Mavic3EnterpriseAdvanced: 77,
-  M350: 89,
-};
+	M30: 67,
+	M300: 60,
+	Mavic3EnterpriseAdvanced: 77,
+	M350: 89,
+}
 
 // DJI负载类型枚举值
 export const PAYLOAD_TYPE = {
-  FPV: 39,
-  H20: 42,
-  H20T: 43,
-  H20N: 61,
-  EP600: 50,
-  EP800: 90742,
-  M30D: 52,
-  M30T: 53,
-  XT2: 26,
-  XTS: 41,
-  Z30: 20,
-  DockTopCamera: 165,
-  M3E: 66,
-  M3T: 67,
-  // UNKNOWN = 65535
-};
+	FPV: 39,
+	H20: 42,
+	H20T: 43,
+	H20N: 61,
+	EP600: 50,
+	EP800: 90742,
+	M30D: 52,
+	M30T: 53,
+	XT2: 26,
+	XTS: 41,
+	Z30: 20,
+	DockTopCamera: 165,
+	M3E: 66,
+	M3T: 67,
+	// UNKNOWN = 65535
+}
 // RC type
 export const RC_TYPE = {
-  RC: 56,
-  RCPlus: 119,
-  RC144: 144,
-};
+	RC: 56,
+	RCPlus: 119,
+	RC144: 144,
+}
 
 // DOCK type
 export const DOCK_TYPE = {
-  Dock: 1,
-};
+	Dock: 1,
+}
 export const DEVICE_MODEL_KEY = {
-  M30: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ZERO}`,
-  M30T: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ONE}`,
-  M3E: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ZERO}`,
-  M3T: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ONE}`,
-  M300: `${DOMAIN.DRONE}-${DRONE_TYPE.M300}-${DEVICE_SUB_TYPE.ZERO}`,
-  M350: `${DOMAIN.DRONE}-${DRONE_TYPE.M350}-${DEVICE_SUB_TYPE.ZERO}`,
-  FPV: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.FPV}-${DEVICE_SUB_TYPE.ZERO}`,
-  H20: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20}-${DEVICE_SUB_TYPE.ZERO}`,
-  H20T: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20T}-${DEVICE_SUB_TYPE.ZERO}`,
-  H20N: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20N}-${DEVICE_SUB_TYPE.ZERO}`,
-  EP600: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP600}-${DEVICE_SUB_TYPE.UNKNOWN}`,
-  EP800: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP800}-${DEVICE_SUB_TYPE.ZERO}`,
-  M30Camera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30D}-${DEVICE_SUB_TYPE.ZERO}`,
-  M30TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30T}-${DEVICE_SUB_TYPE.ZERO}`,
-  M3ECamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3E}-${DEVICE_SUB_TYPE.ZERO}`,
-  M3TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3T}-${DEVICE_SUB_TYPE.ZERO}`,
-  XT2: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XT2}-${DEVICE_SUB_TYPE.ZERO}`,
-  XTS: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XTS}-${DEVICE_SUB_TYPE.ZERO}`,
-  Z30: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.Z30}-${DEVICE_SUB_TYPE.ZERO}`,
-  DockTopCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.DockTopCamera}-${DEVICE_SUB_TYPE.ZERO}`,
-  RC: `${DOMAIN.RC}-${RC_TYPE.RC}-${DEVICE_SUB_TYPE.ZERO}`,
-  RCPlus: `${DOMAIN.RC}-${RC_TYPE.RCPlus}-${DEVICE_SUB_TYPE.ZERO}`,
-  Dock: `${DOMAIN.DOCK}-${DOCK_TYPE.Dock}-${DEVICE_SUB_TYPE.ZERO}`,
-};
+	M30: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ZERO}`,
+	M30T: `${DOMAIN.DRONE}-${DRONE_TYPE.M30}-${DEVICE_SUB_TYPE.ONE}`,
+	M3E: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ZERO}`,
+	M3T: `${DOMAIN.DRONE}-${DRONE_TYPE.Mavic3EnterpriseAdvanced}-${DEVICE_SUB_TYPE.ONE}`,
+	M300: `${DOMAIN.DRONE}-${DRONE_TYPE.M300}-${DEVICE_SUB_TYPE.ZERO}`,
+	M350: `${DOMAIN.DRONE}-${DRONE_TYPE.M350}-${DEVICE_SUB_TYPE.ZERO}`,
+	FPV: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.FPV}-${DEVICE_SUB_TYPE.ZERO}`,
+	H20: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20}-${DEVICE_SUB_TYPE.ZERO}`,
+	H20T: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20T}-${DEVICE_SUB_TYPE.ZERO}`,
+	H20N: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.H20N}-${DEVICE_SUB_TYPE.ZERO}`,
+	EP600: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP600}-${DEVICE_SUB_TYPE.UNKNOWN}`,
+	EP800: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.EP800}-${DEVICE_SUB_TYPE.ZERO}`,
+	M30Camera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30D}-${DEVICE_SUB_TYPE.ZERO}`,
+	M30TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M30T}-${DEVICE_SUB_TYPE.ZERO}`,
+	M3ECamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3E}-${DEVICE_SUB_TYPE.ZERO}`,
+	M3TCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.M3T}-${DEVICE_SUB_TYPE.ZERO}`,
+	XT2: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XT2}-${DEVICE_SUB_TYPE.ZERO}`,
+	XTS: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.XTS}-${DEVICE_SUB_TYPE.ZERO}`,
+	Z30: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.Z30}-${DEVICE_SUB_TYPE.ZERO}`,
+	DockTopCamera: `${DOMAIN.PAYLOAD}-${PAYLOAD_TYPE.DockTopCamera}-${DEVICE_SUB_TYPE.ZERO}`,
+	RC: `${DOMAIN.RC}-${RC_TYPE.RC}-${DEVICE_SUB_TYPE.ZERO}`,
+	RCPlus: `${DOMAIN.RC}-${RC_TYPE.RCPlus}-${DEVICE_SUB_TYPE.ZERO}`,
+	Dock: `${DOMAIN.DOCK}-${DOCK_TYPE.Dock}-${DEVICE_SUB_TYPE.ZERO}`,
+}
 
 export const DEVICE_NAME = {
-  // drone
-  [DEVICE_MODEL_KEY.M30]: 'M30',
-  [DEVICE_MODEL_KEY.M30T]: 'M30T',
-  [DEVICE_MODEL_KEY.M3E]: 'Mavic 3E',
-  [DEVICE_MODEL_KEY.M3T]: 'Mavic 3T',
-  // [DEVICE_MODEL_KEY.M3M]: 'Mavic 3M',
-  [DEVICE_MODEL_KEY.M300]: 'M300 RTK',
-  [DEVICE_MODEL_KEY.M350]: 'M350 RTK',
+	// drone
+	[DEVICE_MODEL_KEY.M30]: 'M30',
+	[DEVICE_MODEL_KEY.M30T]: 'M30T',
+	[DEVICE_MODEL_KEY.M3E]: 'Mavic 3E',
+	[DEVICE_MODEL_KEY.M3T]: 'Mavic 3T',
+	// [DEVICE_MODEL_KEY.M3M]: 'Mavic 3M',
+	[DEVICE_MODEL_KEY.M300]: 'M300 RTK',
+	[DEVICE_MODEL_KEY.M350]: 'M350 RTK',
 
-  // payload
-  [DEVICE_MODEL_KEY.FPV]: 'FPV',
-  [DEVICE_MODEL_KEY.H20]: 'H20',
-  [DEVICE_MODEL_KEY.H20T]: 'H20T',
-  [DEVICE_MODEL_KEY.H20N]: 'H20N',
-  [DEVICE_MODEL_KEY.EP600]: 'P1',
-  [DEVICE_MODEL_KEY.EP800]: 'L1',
-  [DEVICE_MODEL_KEY.M30Camera]: 'M30 Camera',
-  [DEVICE_MODEL_KEY.M30TCamera]: 'M30T Camera',
-  [DEVICE_MODEL_KEY.M3ECamera]: 'Mavic 3E',
-  [DEVICE_MODEL_KEY.M3TCamera]: 'Mavic 3T',
-  // [DEVICE_MODEL_KEY.M3MCamera]: 'Mavic 3M',
-  [DEVICE_MODEL_KEY.XT2]: 'XT2',
-  [DEVICE_MODEL_KEY.XTS]: 'XTS',
-  [DEVICE_MODEL_KEY.Z30]: 'Z30',
-  [DEVICE_MODEL_KEY.DockTopCamera]: 'Dock Camera',
+	// payload
+	[DEVICE_MODEL_KEY.FPV]: 'FPV',
+	[DEVICE_MODEL_KEY.H20]: 'H20',
+	[DEVICE_MODEL_KEY.H20T]: 'H20T',
+	[DEVICE_MODEL_KEY.H20N]: 'H20N',
+	[DEVICE_MODEL_KEY.EP600]: 'P1',
+	[DEVICE_MODEL_KEY.EP800]: 'L1',
+	[DEVICE_MODEL_KEY.M30Camera]: 'M30 Camera',
+	[DEVICE_MODEL_KEY.M30TCamera]: 'M30T Camera',
+	[DEVICE_MODEL_KEY.M3ECamera]: 'Mavic 3E',
+	[DEVICE_MODEL_KEY.M3TCamera]: 'Mavic 3T',
+	// [DEVICE_MODEL_KEY.M3MCamera]: 'Mavic 3M',
+	[DEVICE_MODEL_KEY.XT2]: 'XT2',
+	[DEVICE_MODEL_KEY.XTS]: 'XTS',
+	[DEVICE_MODEL_KEY.Z30]: 'Z30',
+	[DEVICE_MODEL_KEY.DockTopCamera]: 'Dock Camera',
 
-  // rc
-  [DEVICE_MODEL_KEY.RC]: 'RC',
-  [DEVICE_MODEL_KEY.RCPlus]: 'RC Plus',
+	// rc
+	[DEVICE_MODEL_KEY.RC]: 'RC',
+	[DEVICE_MODEL_KEY.RCPlus]: 'RC Plus',
 
-  // dock
-  [DEVICE_MODEL_KEY.Dock]: 'Dock',
-};
+	// dock
+	[DEVICE_MODEL_KEY.Dock]: 'Dock',
+}
 
 export const ControlSource = {
-  A: 'A',
-  B: 'B',
-};
+	A: 'A',
+	B: 'B',
+}
 
 export const RainfallEnum = {
-  正常: 0,
-  小雨: 1,
-  中雨: 2,
-  大雨: 3,
-  0: '正常',
-  1: '小雨',
-  2: '中雨',
-  3: '大雨',
-};
+	正常: 0,
+	小雨: 1,
+	中雨: 2,
+	大雨: 3,
+	0: '正常',
+	1: '小雨',
+	2: '中雨',
+	3: '大雨',
+}
 
 export const DroneInDockEnum = {
-  舱外: 0,
-  舱内: 1,
-  0: '舱外',
-  1: '舱内',
-};
+	舱外: 0,
+	舱内: 1,
+	0: '舱外',
+	1: '舱内',
+}
 
 export const EModeText = {
-  待机: 0,
-  起飞准备: 1,
-  起飞准备完毕: 2,
-  手动飞行: 3,
-  自动起飞: 4,
-  航线飞行: 5,
-  全景拍照: 6,
-  智能跟随: 7,
-  'ADS-B躲避': 8,
-  自动返航: 9,
-  自动降落: 10,
-  强制降落: 11,
-  三桨叶降落: 12,
-  升级中: 13,
-  未连接: 14,
-  APAS: 15,
-  虚拟摇杆状态: 16,
-  指令飞行: 17,
-  0: '待机',
-  1: '起飞准备',
-  2: '起飞准备完毕',
-  3: '手动飞行',
-  4: '自动起飞',
-  5: '航线飞行',
-  6: '全景拍照',
-  7: '智能跟随',
-  8: 'ADS-B躲避',
-  9: '自动返航',
-  10: '自动降落',
-  11: '强制降落',
-  12: '三桨叶降落',
-  13: '升级中',
-  14: '未连接',
-  15: 'APAS',
-  16: '虚拟摇杆状态',
-  17: '指令飞行',
-};
+	待机: 0,
+	起飞准备: 1,
+	起飞准备完毕: 2,
+	手动飞行: 3,
+	自动起飞: 4,
+	航线飞行: 5,
+	全景拍照: 6,
+	智能跟随: 7,
+	'ADS-B躲避': 8,
+	自动返航: 9,
+	自动降落: 10,
+	强制降落: 11,
+	三桨叶降落: 12,
+	升级中: 13,
+	未连接: 14,
+	APAS: 15,
+	虚拟摇杆状态: 16,
+	指令飞行: 17,
+	0: '待机',
+	1: '起飞准备',
+	2: '起飞准备完毕',
+	3: '手动飞行',
+	4: '自动起飞',
+	5: '航线飞行',
+	6: '全景拍照',
+	7: '智能跟随',
+	8: 'ADS-B躲避',
+	9: '自动返航',
+	10: '自动降落',
+	11: '强制降落',
+	12: '三桨叶降落',
+	13: '升级中',
+	14: '未连接',
+	15: 'APAS',
+	16: '虚拟摇杆状态',
+	17: '指令飞行',
+}
 
 export const EModeCode = {
-  Standby: 0,
-  Preparing: 1,
-  Ready: 2,
-  Manual: 3,
-  Automatic: 4,
-  Waypoint: 5,
-  Panoramic: 6,
-  Active_Track: 7,
-  ADS_B: 8,
-  Return_To_Home: 9,
-  Landing: 10,
-  Forced_Landing: 11,
-  Three_Blades_Landing: 12,
-  Upgrading: 13,
-  Disconnected: 14,
-};
+	Standby: 0,
+	Preparing: 1,
+	Ready: 2,
+	Manual: 3,
+	Automatic: 4,
+	Waypoint: 5,
+	Panoramic: 6,
+	Active_Track: 7,
+	ADS_B: 8,
+	Return_To_Home: 9,
+	Landing: 10,
+	Forced_Landing: 11,
+	Three_Blades_Landing: 12,
+	Upgrading: 13,
+	Disconnected: 14,
+}
 
 export const EGear = {
-  A: 0,
-  P: 1,
-  NAV: 2,
-  FPV: 3,
-  FARM: 4,
-  S: 5,
-  F: 6,
-  M: 7,
-  G: 8,
-  T: 9,
-  0: 'A',
-  1: 'P',
-  2: 'NAV',
-  3: 'FPV',
-  4: 'FARM',
-  5: 'S',
-  6: 'F',
-  7: 'M',
-  8: 'G',
-  9: 'T',
-};
+	A: 0,
+	P: 1,
+	NAV: 2,
+	FPV: 3,
+	FARM: 4,
+	S: 5,
+	F: 6,
+	M: 7,
+	G: 8,
+	T: 9,
+	0: 'A',
+	1: 'P',
+	2: 'NAV',
+	3: 'FPV',
+	4: 'FARM',
+	5: 'S',
+	6: 'F',
+	7: 'M',
+	8: 'G',
+	9: 'T',
+}
 
 export const EDeviceType = {
-  M30: '0-67-0',
-  M30T: '0-67-1',
-  M300: '0-60-0',
-  M350: DEVICE_MODEL_KEY.M350,
-  Z30: '1-20-0',
-  XT2: '1-26-0',
-  FPV: '1-39-0',
-  XTS: '1-41-0',
-  H20: '1-42-0',
-  H20T: '1-43-0',
-  P1: '1-50-65535',
-  M30_Camera: '1-52-0',
-  M30T_Camera: '1-53-0',
-  H20N: '1-61-0',
-  DJI_Dock_Camera: '1-165-0',
-  L1: '1-90742-0',
-  M3E: '0-77-0',
-  M3D: '0-91-0',
-  M3TD: '0-91-1',
-  M3E_Camera: '1-66-0',
-  M3T_Camera: '0-67-1',
-  M3D_Camera: '1-80-0',
-  M3TD_Camera: '1-81-0'
-};
+	M30: '0-67-0',
+	M30T: '0-67-1',
+	M300: '0-60-0',
+	M350: DEVICE_MODEL_KEY.M350,
+	Z30: '1-20-0',
+	XT2: '1-26-0',
+	FPV: '1-39-0',
+	XTS: '1-41-0',
+	H20: '1-42-0',
+	H20T: '1-43-0',
+	P1: '1-50-65535',
+	M30_Camera: '1-52-0',
+	M30T_Camera: '1-53-0',
+	H20N: '1-61-0',
+	DJI_Dock_Camera: '1-165-0',
+	L1: '1-90742-0',
+	M3E: '0-77-0',
+	M3D: '0-91-0',
+	M3TD: '0-91-1',
+	M3E_Camera: '1-66-0',
+	M3T_Camera: '0-67-1',
+	M3D_Camera: '1-80-0',
+	M3TD_Camera: '1-81-0',
+}
 
 export const EDockModeText = {
-  已断开连接: -1,
-  设备空闲中: 0,
-  现场调试: 1,
-  远程调试: 2,
-  固件升级中: 3,
-  设备工作中: 4,
-  '-1': '已断开连接',
-  0: '设备空闲中',
-  1: '现场调试',
-  2: '远程调试',
-  3: '固件升级中',
-  4: '设备工作中',
-};
+	已断开连接: -1,
+	设备空闲中: 0,
+	现场调试: 1,
+	远程调试: 2,
+	固件升级中: 3,
+	设备工作中: 4,
+	'-1': '已断开连接',
+	0: '设备空闲中',
+	1: '现场调试',
+	2: '远程调试',
+	3: '固件升级中',
+	4: '设备工作中',
+}
 
 export const EDockModeCode = {
-  Disconnected: '-1',
-  Idle: 0,
-  Debugging: 1,
-  Remote_Debugging: 2,
-  Upgrading: 3,
-  Working: 4,
-  '-1': 'Disconnected',
-  0: 'Idle',
-  1: 'Debugging',
-  2: 'Remote_Debugging',
-  3: 'Upgrading',
-  4: 'Working',
-};
\ No newline at end of file
+	Disconnected: '-1',
+	Idle: 0,
+	Debugging: 1,
+	Remote_Debugging: 2,
+	Upgrading: 3,
+	Working: 4,
+	'-1': 'Disconnected',
+	0: 'Idle',
+	1: 'Debugging',
+	2: 'Remote_Debugging',
+	3: 'Upgrading',
+	4: 'Working',
+}
diff --git a/src/utils/staticData/enums.js b/src/utils/staticData/enums.js
index 76ef2c1..6b29538 100644
--- a/src/utils/staticData/enums.js
+++ b/src/utils/staticData/enums.js
@@ -1,111 +1,111 @@
-export const ERouterName = {};
+export const ERouterName = {}
 
 export const ELocalStorageKey = {
-  Username: 'username',
-  WorkspaceId: 'workspace_id',
-  Token: 'x-auth-token',
-  PlatformName: 'platform_name',
-  WorkspaceName: 'workspace_name',
-  WorkspaceDesc: 'workspace_desc',
-  Flag: 'flag',
-  UserId: 'user_id',
-  Device: 'device',
-  GatewayOnline: 'gateway_online',
-  UserInfo: 'user_info',
-};
+	Username: 'username',
+	WorkspaceId: 'workspace_id',
+	Token: 'x-auth-token',
+	PlatformName: 'platform_name',
+	WorkspaceName: 'workspace_name',
+	WorkspaceDesc: 'workspace_desc',
+	Flag: 'flag',
+	UserId: 'user_id',
+	Device: 'device',
+	GatewayOnline: 'gateway_online',
+	UserInfo: 'user_info',
+}
 
 export const EBizCode = {
-  GatewayOsd: 'gateway_osd',
-  DeviceOsd: 'device_osd',
-  DockOsd: 'dock_osd',
-  MapElementCreate: 'map_element_create',
-  MapElementUpdate: 'map_element_update',
-  MapElementDelete: 'map_element_delete',
-  DeviceOnline: 'device_online',
-  DeviceOffline: 'device_offline',
-  DeviceHms: 'device_hms',
+	GatewayOsd: 'gateway_osd',
+	DeviceOsd: 'device_osd',
+	DockOsd: 'dock_osd',
+	MapElementCreate: 'map_element_create',
+	MapElementUpdate: 'map_element_update',
+	MapElementDelete: 'map_element_delete',
+	DeviceOnline: 'device_online',
+	DeviceOffline: 'device_offline',
+	DeviceHms: 'device_hms',
 
-  PsdkWidgetValues: 'psdk_widget_values', // psdk 负载设备属性值
+	PsdkWidgetValues: 'psdk_widget_values', // psdk 负载设备属性值
 
-  VideoSurveillance: 'live_status', // 视频监控
+	VideoSurveillance: 'live_status', // 视频监控
 
-  SpeakerAudioPlayStartProgress: 'speaker_audio_play_start_progress', // 喊话器-音频播放进度通知
+	SpeakerAudioPlayStartProgress: 'speaker_audio_play_start_progress', // 喊话器-音频播放进度通知
 
-  // 机场任务
-  FlightTaskProgress: 'flighttask_progress', // 机场任务执行进度
-  FlightTaskMediaProgress: 'file_upload_callback', // 机场任务媒体上传进度
-  FlightTaskMediaHighestPriority: 'highest_priority_upload_flighttask_media', // 机场任务媒体优先级上报
+	// 机场任务
+	FlightTaskProgress: 'flighttask_progress', // 机场任务执行进度
+	FlightTaskMediaProgress: 'file_upload_callback', // 机场任务媒体上传进度
+	FlightTaskMediaHighestPriority: 'highest_priority_upload_flighttask_media', // 机场任务媒体优先级上报
 
-  // 设备指令
-  DeviceReboot: 'device_reboot', // 机场重启
-  DroneOpen: 'drone_open', // 飞行器开机
-  DroneClose: 'drone_close', // 飞行器关机
-  DeviceFormat: 'device_format', // 机场数据格式化
-  DroneFormat: 'drone_format', // 飞行器数据格式化
-  CoverOpen: 'cover_open', // 打开舱盖
-  CoverClose: 'cover_close', // 关闭舱盖
-  PutterOpen: 'putter_open', // 推杆展开
-  PutterClose: 'putter_close', // 推杆闭合
-  ChargeOpen: 'charge_open', // 打开充电
-  ChargeClose: 'charge_close', // 关闭充电
+	// 设备指令
+	DeviceReboot: 'device_reboot', // 机场重启
+	DroneOpen: 'drone_open', // 飞行器开机
+	DroneClose: 'drone_close', // 飞行器关机
+	DeviceFormat: 'device_format', // 机场数据格式化
+	DroneFormat: 'drone_format', // 飞行器数据格式化
+	CoverOpen: 'cover_open', // 打开舱盖
+	CoverClose: 'cover_close', // 关闭舱盖
+	PutterOpen: 'putter_open', // 推杆展开
+	PutterClose: 'putter_close', // 推杆闭合
+	ChargeOpen: 'charge_open', // 打开充电
+	ChargeClose: 'charge_close', // 关闭充电
 
-  // 设备升级
-  DeviceUpgrade: 'ota_progress', // 设备升级
+	// 设备升级
+	DeviceUpgrade: 'ota_progress', // 设备升级
 
-  // 设备日志
-  DeviceLogUploadProgress: 'fileupload_progress', // 设备日志上传
+	// 设备日志
+	DeviceLogUploadProgress: 'fileupload_progress', // 设备日志上传
 
-  // 飞行指令消息
-  ControlSourceChange: 'control_source_change', // 控制权更新
-  FlyToPointProgress: 'fly_to_point_progress', // 飞向目标点
-  TakeoffToPointProgress: 'takeoff_to_point_progress', // 一键起飞
-  JoystickInvalidNotify: 'joystick_invalid_notify', // 设备端退出drc模式
-  DrcStatusNotify: 'drc_status_notify', // 飞行控制模式状态
-};
+	// 飞行指令消息
+	ControlSourceChange: 'control_source_change', // 控制权更新
+	FlyToPointProgress: 'fly_to_point_progress', // 飞向目标点
+	TakeoffToPointProgress: 'takeoff_to_point_progress', // 一键起飞
+	JoystickInvalidNotify: 'joystick_invalid_notify', // 设备端退出drc模式
+	DrcStatusNotify: 'drc_status_notify', // 飞行控制模式状态
+}
 
 export const EBizCodeMessage = {
-  [EBizCode.DeviceOnline]: '设备在线',
-  [EBizCode.DeviceOffline]: '设备离线',
+	[EBizCode.DeviceOnline]: '设备在线',
+	[EBizCode.DeviceOffline]: '设备离线',
 
-  [EBizCode.DeviceOsd]: '设备osd',
-  [EBizCode.GatewayOsd]: '网关osd',
-  [EBizCode.DockOsd]: '机场osd',
+	[EBizCode.DeviceOsd]: '设备osd',
+	[EBizCode.GatewayOsd]: '网关osd',
+	[EBizCode.DockOsd]: '机场osd',
 
-  [EBizCode.MapElementCreate]: '地图元素创建',
-  [EBizCode.MapElementUpdate]: '地图元素更新',
-  [EBizCode.MapElementDelete]: '地图元素删除',
+	[EBizCode.MapElementCreate]: '地图元素创建',
+	[EBizCode.MapElementUpdate]: '地图元素更新',
+	[EBizCode.MapElementDelete]: '地图元素删除',
 
-  [EBizCode.FlightTaskProgress]: '机场任务执行进度',
+	[EBizCode.FlightTaskProgress]: '机场任务执行进度',
 
-  [EBizCode.DeviceHms]: '设备hms',
-  [EBizCode.DeviceReboot]: '设备重启',
-  [EBizCode.DroneOpen]: '机场打开',
-  [EBizCode.DroneClose]: '机场关闭',
+	[EBizCode.DeviceHms]: '设备hms',
+	[EBizCode.DeviceReboot]: '设备重启',
+	[EBizCode.DroneOpen]: '机场打开',
+	[EBizCode.DroneClose]: '机场关闭',
 
-  [EBizCode.PutterOpen]: '推杆展开',
-  [EBizCode.PutterClose]: '推杆闭合',
+	[EBizCode.PutterOpen]: '推杆展开',
+	[EBizCode.PutterClose]: '推杆闭合',
 
-  [EBizCode.ChargeOpen]: '打开充电',
-  [EBizCode.ChargeClose]: '关闭充电',
+	[EBizCode.ChargeOpen]: '打开充电',
+	[EBizCode.ChargeClose]: '关闭充电',
 
-  [EBizCode.ControlSourceChange]: '控制权更新',
-  [EBizCode.FlyToPointProgress]: '飞向目标点',
-  [EBizCode.TakeoffToPointProgress]: '一键起飞',
-  [EBizCode.DrcStatusNotify]: '飞行控制模式状态',
-  [EBizCode.JoystickInvalidNotify]: '设备端退出drc模式',
-};
+	[EBizCode.ControlSourceChange]: '控制权更新',
+	[EBizCode.FlyToPointProgress]: '飞向目标点',
+	[EBizCode.TakeoffToPointProgress]: '一键起飞',
+	[EBizCode.DrcStatusNotify]: '飞行控制模式状态',
+	[EBizCode.JoystickInvalidNotify]: '设备端退出drc模式',
+}
 
 export const EDeviceTypeName = {
-  Aircraft: 0,
-  Gateway: 2,
-  Dock: 3,
-};
+	Aircraft: 0,
+	Gateway: 2,
+	Dock: 3,
+}
 
 export const EHmsLevel = {
-  NOTICE: 0,
-  CAUTION: 1,
-  WARN: 2,
-  0: 'NOTICE',
-  1: 'CAUTION',
-  2: 'WARN',
-};
+	NOTICE: 0,
+	CAUTION: 1,
+	WARN: 2,
+	0: 'NOTICE',
+	1: 'CAUTION',
+	2: 'WARN',
+}
diff --git a/src/utils/store.js b/src/utils/store.js
index d007dc9..4be5b31 100644
--- a/src/utils/store.js
+++ b/src/utils/store.js
@@ -1,103 +1,103 @@
-import { validatenull } from 'utils/validate';
-import website from '@/config/website';
+import { validatenull } from 'utils/validate'
+import website from '@/config/website'
 
-const keyName = website.key + '-';
+const keyName = website.key + '-'
 /**
  * 存储localStorage
  */
 export const setStore = (params = {}) => {
-  let { name, content, type } = params;
-  name = keyName + name;
-  let obj = {
-    dataType: typeof content,
-    content: content,
-    type: type,
-    datetime: new Date().getTime(),
-  };
-  if (type) window.sessionStorage.setItem(name, JSON.stringify(obj));
-  else window.localStorage.setItem(name, JSON.stringify(obj));
-};
+	let { name, content, type } = params
+	name = keyName + name
+	let obj = {
+		dataType: typeof content,
+		content: content,
+		type: type,
+		datetime: new Date().getTime(),
+	}
+	if (type) window.sessionStorage.setItem(name, JSON.stringify(obj))
+	else window.localStorage.setItem(name, JSON.stringify(obj))
+}
 /**
  * 获取localStorage
  */
 
 export const getStore = (params = {}) => {
-  let { name, debug } = params;
-  name = keyName + name;
-  let obj = {},
-    content;
-  obj = window.sessionStorage.getItem(name);
-  if (validatenull(obj)) obj = window.localStorage.getItem(name);
-  if (validatenull(obj)) return;
-  try {
-    obj = JSON.parse(obj);
-  } catch {
-    return obj;
-  }
-  if (debug) {
-    return obj;
-  }
-  if (obj.dataType == 'string') {
-    content = obj.content;
-  } else if (obj.dataType == 'number') {
-    content = Number(obj.content);
-  } else if (obj.dataType == 'boolean') {
-    content = eval(obj.content);
-  } else if (obj.dataType == 'object') {
-    content = obj.content;
-  }
-  return content;
-};
+	let { name, debug } = params
+	name = keyName + name
+	let obj = {},
+		content
+	obj = window.sessionStorage.getItem(name)
+	if (validatenull(obj)) obj = window.localStorage.getItem(name)
+	if (validatenull(obj)) return
+	try {
+		obj = JSON.parse(obj)
+	} catch {
+		return obj
+	}
+	if (debug) {
+		return obj
+	}
+	if (obj.dataType == 'string') {
+		content = obj.content
+	} else if (obj.dataType == 'number') {
+		content = Number(obj.content)
+	} else if (obj.dataType == 'boolean') {
+		content = eval(obj.content)
+	} else if (obj.dataType == 'object') {
+		content = obj.content
+	}
+	return content
+}
 /**
  * 删除localStorage
  */
 export const removeStore = (params = {}) => {
-  let { name, type } = params;
-  name = keyName + name;
-  if (type) {
-    window.sessionStorage.removeItem(name);
-  } else {
-    window.localStorage.removeItem(name);
-  }
-};
+	let { name, type } = params
+	name = keyName + name
+	if (type) {
+		window.sessionStorage.removeItem(name)
+	} else {
+		window.localStorage.removeItem(name)
+	}
+}
 
 /**
  * 获取全部localStorage
  */
 export const getAllStore = (params = {}) => {
-  let list = [];
-  let { type } = params;
-  if (type) {
-    for (let i = 0; i <= window.sessionStorage.length; i++) {
-      list.push({
-        name: window.sessionStorage.key(i),
-        content: getStore({
-          name: window.sessionStorage.key(i),
-          type: 'session',
-        }),
-      });
-    }
-  } else {
-    for (let i = 0; i <= window.localStorage.length; i++) {
-      list.push({
-        name: window.localStorage.key(i),
-        content: getStore({
-          name: window.localStorage.key(i),
-        }),
-      });
-    }
-  }
-  return list;
-};
+	let list = []
+	let { type } = params
+	if (type) {
+		for (let i = 0; i <= window.sessionStorage.length; i++) {
+			list.push({
+				name: window.sessionStorage.key(i),
+				content: getStore({
+					name: window.sessionStorage.key(i),
+					type: 'session',
+				}),
+			})
+		}
+	} else {
+		for (let i = 0; i <= window.localStorage.length; i++) {
+			list.push({
+				name: window.localStorage.key(i),
+				content: getStore({
+					name: window.localStorage.key(i),
+				}),
+			})
+		}
+	}
+	return list
+}
 
 /**
  * 清空全部localStorage
  */
 export const clearStore = (params = {}) => {
-  let { type } = params;
-  if (type) {
-    window.sessionStorage.clear();
-  } else {
-    window.localStorage.clear();
-  }
-};
+	let { type } = params
+	if (type) {
+		window.sessionStorage.clear()
+	} else {
+		window.localStorage.clear()
+	}
+}
diff --git a/src/utils/util.js b/src/utils/util.js
index 7de4a4e..8a7051b 100644
--- a/src/utils/util.js
+++ b/src/utils/util.js
@@ -1,176 +1,176 @@
-import { validatenull } from './validate';
-import sha256 from 'crypto-js/sha256';
-import Base64 from 'crypto-js/enc-base64';
+import { validatenull } from './validate'
+import sha256 from 'crypto-js/sha256'
+import Base64 from 'crypto-js/enc-base64'
 //表单序列化
 export const serialize = data => {
-  let list = [];
-  Object.keys(data).forEach(ele => {
-    list.push(`${ele}=${data[ele]}`);
-  });
-  return list.join('&');
-};
+	let list = []
+	Object.keys(data).forEach(ele => {
+		list.push(`${ele}=${data[ele]}`)
+	})
+	return list.join('&')
+}
 export const getObjType = obj => {
-  var toString = Object.prototype.toString;
-  var map = {
-    '[object Boolean]': 'boolean',
-    '[object Number]': 'number',
-    '[object String]': 'string',
-    '[object Function]': 'function',
-    '[object Array]': 'array',
-    '[object Date]': 'date',
-    '[object RegExp]': 'regExp',
-    '[object Undefined]': 'undefined',
-    '[object Null]': 'null',
-    '[object Object]': 'object',
-  };
-  if (obj instanceof Element) {
-    return 'element';
-  }
-  return map[toString.call(obj)];
-};
+	var toString = Object.prototype.toString
+	var map = {
+		'[object Boolean]': 'boolean',
+		'[object Number]': 'number',
+		'[object String]': 'string',
+		'[object Function]': 'function',
+		'[object Array]': 'array',
+		'[object Date]': 'date',
+		'[object RegExp]': 'regExp',
+		'[object Undefined]': 'undefined',
+		'[object Null]': 'null',
+		'[object Object]': 'object',
+	}
+	if (obj instanceof Element) {
+		return 'element'
+	}
+	return map[toString.call(obj)]
+}
 /**
  * 对象深拷贝
  */
 export const deepClone = data => {
-  var type = getObjType(data);
-  var obj;
-  if (type === 'array') {
-    obj = [];
-  } else if (type === 'object') {
-    obj = {};
-  } else {
-    //不再具有下一层次
-    return data;
-  }
-  if (type === 'array') {
-    for (var i = 0, len = data.length; i < len; i++) {
-      obj.push(deepClone(data[i]));
-    }
-  } else if (type === 'object') {
-    for (var key in data) {
-      obj[key] = deepClone(data[key]);
-    }
-  }
-  return obj;
-};
+	var type = getObjType(data)
+	var obj
+	if (type === 'array') {
+		obj = []
+	} else if (type === 'object') {
+		obj = {}
+	} else {
+		//不再具有下一层次
+		return data
+	}
+	if (type === 'array') {
+		for (var i = 0, len = data.length; i < len; i++) {
+			obj.push(deepClone(data[i]))
+		}
+	} else if (type === 'object') {
+		for (var key in data) {
+			obj[key] = deepClone(data[key])
+		}
+	}
+	return obj
+}
 /**
  * 设置灰度模式
  */
 export const toggleGrayMode = status => {
-  if (status) {
-    document.body.className = document.body.className + ' grayMode';
-  } else {
-    document.body.className = document.body.className.replace(' grayMode', '');
-  }
-};
+	if (status) {
+		document.body.className = document.body.className + ' grayMode'
+	} else {
+		document.body.className = document.body.className.replace(' grayMode', '')
+	}
+}
 /**
  * 设置主题
  */
 export const setTheme = name => {
-  document.body.className = name;
-};
+	document.body.className = name
+}
 
 /**
  * 加密处理
  */
 export const encryption = params => {
-  let { data = {}, type, param, key } = params;
-  let result = JSON.parse(JSON.stringify(data));
-  if (type == 'Base64') {
-    param.forEach(ele => {
-      result[ele] = Base64.stringify(result[ele]);
-    });
-  } else if (type == 'Aes') {
-    param.forEach(ele => {
-      result[ele] = sha256(result[ele], key);
-    });
-  }
-  return result;
-};
+	let { data = {}, type, param, key } = params
+	let result = JSON.parse(JSON.stringify(data))
+	if (type == 'Base64') {
+		param.forEach(ele => {
+			result[ele] = Base64.stringify(result[ele])
+		})
+	} else if (type == 'Aes') {
+		param.forEach(ele => {
+			result[ele] = sha256(result[ele], key)
+		})
+	}
+	return result
+}
 
 /**
  * 浏览器判断是否全屏
  */
 export const fullscreenToggel = () => {
-  if (fullscreenEnable()) {
-    exitFullScreen();
-  } else {
-    reqFullScreen();
-  }
-};
+	if (fullscreenEnable()) {
+		exitFullScreen()
+	} else {
+		reqFullScreen()
+	}
+}
 /**
  * esc监听全屏
  */
 export const listenfullscreen = callback => {
-  function listen() {
-    callback();
-  }
+	function listen() {
+		callback()
+	}
 
-  document.addEventListener('fullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('mozfullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('webkitfullscreenchange', function () {
-    listen();
-  });
-  document.addEventListener('msfullscreenchange', function () {
-    listen();
-  });
-};
+	document.addEventListener('fullscreenchange', function () {
+		listen()
+	})
+	document.addEventListener('mozfullscreenchange', function () {
+		listen()
+	})
+	document.addEventListener('webkitfullscreenchange', function () {
+		listen()
+	})
+	document.addEventListener('msfullscreenchange', function () {
+		listen()
+	})
+}
 /**
  * 浏览器判断是否全屏
  */
 export const fullscreenEnable = () => {
-  var isFullscreen =
-    document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen;
-  return isFullscreen;
-};
+	var isFullscreen =
+		document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen
+	return isFullscreen
+}
 
 /**
  * 浏览器全屏
  */
 export const reqFullScreen = () => {
-  if (document.documentElement.requestFullScreen) {
-    document.documentElement.requestFullScreen();
-  } else if (document.documentElement.webkitRequestFullScreen) {
-    document.documentElement.webkitRequestFullScreen();
-  } else if (document.documentElement.mozRequestFullScreen) {
-    document.documentElement.mozRequestFullScreen();
-  }
-};
+	if (document.documentElement.requestFullScreen) {
+		document.documentElement.requestFullScreen()
+	} else if (document.documentElement.webkitRequestFullScreen) {
+		document.documentElement.webkitRequestFullScreen()
+	} else if (document.documentElement.mozRequestFullScreen) {
+		document.documentElement.mozRequestFullScreen()
+	}
+}
 /**
  * 浏览器退出全屏
  */
 export const exitFullScreen = () => {
-  if (document.documentElement.requestFullScreen) {
-    document.exitFullScreen();
-  } else if (document.documentElement.webkitRequestFullScreen) {
-    document.webkitCancelFullScreen();
-  } else if (document.documentElement.mozRequestFullScreen) {
-    document.mozCancelFullScreen();
-  }
-};
+	if (document.documentElement.requestFullScreen) {
+		document.exitFullScreen()
+	} else if (document.documentElement.webkitRequestFullScreen) {
+		document.webkitCancelFullScreen()
+	} else if (document.documentElement.mozRequestFullScreen) {
+		document.mozCancelFullScreen()
+	}
+}
 /**
  * 递归寻找子类的父类
  */
 
 export const findParent = (menu, id) => {
-  for (let i = 0; i < menu.length; i++) {
-    if (menu[i].children.length != 0) {
-      for (let j = 0; j < menu[i].children.length; j++) {
-        if (menu[i].children[j].id == id) {
-          return menu[i];
-        } else {
-          if (menu[i].children[j].children.length != 0) {
-            return findParent(menu[i].children[j].children, id);
-          }
-        }
-      }
-    }
-  }
-};
+	for (let i = 0; i < menu.length; i++) {
+		if (menu[i].children.length != 0) {
+			for (let j = 0; j < menu[i].children.length; j++) {
+				if (menu[i].children[j].id == id) {
+					return menu[i]
+				} else {
+					if (menu[i].children[j].children.length != 0) {
+						return findParent(menu[i].children[j].children, id)
+					}
+				}
+			}
+		}
+	}
+}
 /**
  * 判断2个对象属性和值是否相等
  */
@@ -180,157 +180,157 @@
  */
 
 export const loadStyle = url => {
-  const link = document.createElement('link');
-  link.type = 'text/css';
-  link.rel = 'stylesheet';
-  link.href = url;
-  const head = document.getElementsByTagName('head')[0];
-  head.appendChild(link);
-};
+	const link = document.createElement('link')
+	link.type = 'text/css'
+	link.rel = 'stylesheet'
+	link.href = url
+	const head = document.getElementsByTagName('head')[0]
+	head.appendChild(link)
+}
 /**
  * 判断路由是否相等
  */
 export const diff = (obj1, obj2) => {
-  delete obj1.close;
-  var o1 = obj1 instanceof Object;
-  var o2 = obj2 instanceof Object;
-  if (!o1 || !o2) {
-    /*  判断不是对象  */
-    return obj1 === obj2;
-  }
+	delete obj1.close
+	var o1 = obj1 instanceof Object
+	var o2 = obj2 instanceof Object
+	if (!o1 || !o2) {
+		/*  判断不是对象  */
+		return obj1 === obj2
+	}
 
-  if (Object.keys(obj1).length !== Object.keys(obj2).length) {
-    return false;
-    //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
-  }
+	if (Object.keys(obj1).length !== Object.keys(obj2).length) {
+		return false
+		//Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
+	}
 
-  for (var attr in obj1) {
-    var t1 = obj1[attr] instanceof Object;
-    var t2 = obj2[attr] instanceof Object;
-    if (t1 && t2) {
-      return diff(obj1[attr], obj2[attr]);
-    } else if (obj1[attr] !== obj2[attr]) {
-      return false;
-    }
-  }
-  return true;
-};
+	for (var attr in obj1) {
+		var t1 = obj1[attr] instanceof Object
+		var t2 = obj2[attr] instanceof Object
+		if (t1 && t2) {
+			return diff(obj1[attr], obj2[attr])
+		} else if (obj1[attr] !== obj2[attr]) {
+			return false
+		}
+	}
+	return true
+}
 /**
  * 根据字典的value显示label
  */
 export const findByvalue = (dic, value) => {
-  let result = '';
-  if (validatenull(dic)) return value;
-  if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') {
-    let index = 0;
-    index = findArray(dic, value);
-    if (index != -1) {
-      result = dic[index].label;
-    } else {
-      result = value;
-    }
-  } else if (value instanceof Array) {
-    result = [];
-    let index = 0;
-    value.forEach(ele => {
-      index = findArray(dic, ele);
-      if (index != -1) {
-        result.push(dic[index].label);
-      } else {
-        result.push(value);
-      }
-    });
-    result = result.toString();
-  }
-  return result;
-};
+	let result = ''
+	if (validatenull(dic)) return value
+	if (typeof value == 'string' || typeof value == 'number' || typeof value == 'boolean') {
+		let index = 0
+		index = findArray(dic, value)
+		if (index != -1) {
+			result = dic[index].label
+		} else {
+			result = value
+		}
+	} else if (value instanceof Array) {
+		result = []
+		let index = 0
+		value.forEach(ele => {
+			index = findArray(dic, ele)
+			if (index != -1) {
+				result.push(dic[index].label)
+			} else {
+				result.push(value)
+			}
+		})
+		result = result.toString()
+	}
+	return result
+}
 /**
  * 根据字典的value查找对应的index
  */
 export const findArray = (dic, value) => {
-  for (let i = 0; i < dic.length; i++) {
-    if (dic[i].value == value) {
-      return i;
-    }
-  }
-  return -1;
-};
+	for (let i = 0; i < dic.length; i++) {
+		if (dic[i].value == value) {
+			return i
+		}
+	}
+	return -1
+}
 /**
  * 生成随机len位数字
  */
 export const randomLenNum = (len, date) => {
-  let random = '';
-  random = Math.ceil(Math.random() * 100000000000000)
-    .toString()
-    .substr(0, len ? len : 4);
-  if (date) random = random + Date.now();
-  return random;
-};
+	let random = ''
+	random = Math.ceil(Math.random() * 100000000000000)
+		.toString()
+		.substr(0, len ? len : 4)
+	if (date) random = random + Date.now()
+	return random
+}
 /**
  * 打开小窗口
  */
 export const openWindow = (url, title, w, h) => {
-  // Fixes dual-screen position                            Most browsers       Firefox
-  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left;
-  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top;
+	// Fixes dual-screen position                            Most browsers       Firefox
+	const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
+	const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
 
-  const width = window.innerWidth
-    ? window.innerWidth
-    : document.documentElement.clientWidth
-    ? document.documentElement.clientWidth
-    : screen.width;
-  const height = window.innerHeight
-    ? window.innerHeight
-    : document.documentElement.clientHeight
-    ? document.documentElement.clientHeight
-    : screen.height;
+	const width = window.innerWidth
+		? window.innerWidth
+		: document.documentElement.clientWidth
+		? document.documentElement.clientWidth
+		: screen.width
+	const height = window.innerHeight
+		? window.innerHeight
+		: document.documentElement.clientHeight
+		? document.documentElement.clientHeight
+		: screen.height
 
-  const left = width / 2 - w / 2 + dualScreenLeft;
-  const top = height / 2 - h / 2 + dualScreenTop;
-  const newWindow = window.open(
-    url,
-    title,
-    'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' +
-      w +
-      ', height=' +
-      h +
-      ', top=' +
-      top +
-      ', left=' +
-      left
-  );
+	const left = width / 2 - w / 2 + dualScreenLeft
+	const top = height / 2 - h / 2 + dualScreenTop
+	const newWindow = window.open(
+		url,
+		title,
+		'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' +
+			w +
+			', height=' +
+			h +
+			', top=' +
+			top +
+			', left=' +
+			left
+	)
 
-  // Puts focus on the newWindow
-  if (window.focus) {
-    newWindow.focus();
-  }
-};
+	// Puts focus on the newWindow
+	if (window.focus) {
+		newWindow.focus()
+	}
+}
 
 export const getScreen = isCollapse => {
-  if (document.body.clientWidth <= 768) {
-    return !isCollapse;
-  } else {
-    return isCollapse;
-  }
-};
+	if (document.body.clientWidth <= 768) {
+		return !isCollapse
+	} else {
+		return isCollapse
+	}
+}
 
 /**
  * 获取顶部地址栏地址
  */
 export const getTopUrl = () => {
-  return window.location.href.split('/#/')[0];
-};
+	return window.location.href.split('/#/')[0]
+}
 
 /**
  * 获取url参数
  * @param name 参数名
  */
 export const getQueryString = name => {
-  let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
-  let r = window.location.search.substr(1).match(reg);
-  if (r != null) return unescape(decodeURI(r[2]));
-  return null;
-};
+	let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
+	let r = window.location.search.substr(1).match(reg)
+	if (r != null) return unescape(decodeURI(r[2]))
+	return null
+}
 
 /**
  * 下载文件
@@ -338,29 +338,29 @@
  * @param {String} name - 文件名,eg: test.png
  */
 export const downloadFileBlob = (path, name) => {
-  const xhr = new XMLHttpRequest();
-  xhr.open('get', path);
-  xhr.responseType = 'blob';
-  xhr.send();
-  xhr.onload = function () {
-    if (this.status === 200 || this.status === 304) {
-      // 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob
-      if ('msSaveOrOpenBlob' in navigator) {
-        navigator.msSaveOrOpenBlob(this.response, name);
-        return;
-      }
-      const url = URL.createObjectURL(this.response);
-      const a = document.createElement('a');
-      a.style.display = 'none';
-      a.href = url;
-      a.download = name;
-      document.body.appendChild(a);
-      a.click();
-      document.body.removeChild(a);
-      URL.revokeObjectURL(url);
-    }
-  };
-};
+	const xhr = new XMLHttpRequest()
+	xhr.open('get', path)
+	xhr.responseType = 'blob'
+	xhr.send()
+	xhr.onload = function () {
+		if (this.status === 200 || this.status === 304) {
+			// 如果是IE10及以上,不支持download属性,采用msSaveOrOpenBlob方法,但是IE10以下也不支持msSaveOrOpenBlob
+			if ('msSaveOrOpenBlob' in navigator) {
+				navigator.msSaveOrOpenBlob(this.response, name)
+				return
+			}
+			const url = URL.createObjectURL(this.response)
+			const a = document.createElement('a')
+			a.style.display = 'none'
+			a.href = url
+			a.download = name
+			document.body.appendChild(a)
+			a.click()
+			document.body.removeChild(a)
+			URL.revokeObjectURL(url)
+		}
+	}
+}
 
 /**
  * 下载文件
@@ -368,26 +368,26 @@
  * @param {String} name - 文件名,eg: test.png
  */
 export const downloadFileBase64 = (path, name) => {
-  const xhr = new XMLHttpRequest();
-  xhr.open('get', path);
-  xhr.responseType = 'blob';
-  xhr.send();
-  xhr.onload = function () {
-    if (this.status === 200 || this.status === 304) {
-      const fileReader = new FileReader();
-      fileReader.readAsDataURL(this.response);
-      fileReader.onload = function () {
-        const a = document.createElement('a');
-        a.style.display = 'none';
-        a.href = this.result;
-        a.download = name;
-        document.body.appendChild(a);
-        a.click();
-        document.body.removeChild(a);
-      };
-    }
-  };
-};
+	const xhr = new XMLHttpRequest()
+	xhr.open('get', path)
+	xhr.responseType = 'blob'
+	xhr.send()
+	xhr.onload = function () {
+		if (this.status === 200 || this.status === 304) {
+			const fileReader = new FileReader()
+			fileReader.readAsDataURL(this.response)
+			fileReader.onload = function () {
+				const a = document.createElement('a')
+				a.style.display = 'none'
+				a.href = this.result
+				a.download = name
+				document.body.appendChild(a)
+				a.click()
+				document.body.removeChild(a)
+			}
+		}
+	}
+}
 
 /**
  * 下载excel
@@ -395,8 +395,8 @@
  * @param {String} filename 文件名称
  */
 export const downloadXls = (fileArrayBuffer, filename) => {
-  downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8');
-};
+	downloadFile(fileArrayBuffer, filename, 'application/vnd.ms-excel,charset=utf-8')
+}
 
 /**
  * 下载json
@@ -404,8 +404,8 @@
  * @param {String} filename 文件名称
  */
 export const downloadJson = (fileArrayBuffer, filename) => {
-  downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8');
-};
+	downloadFile(fileArrayBuffer, filename, 'application/json,charset=utf-8')
+}
 
 /**
  * 下载文件
@@ -414,20 +414,20 @@
  * @param mimeType 文件类型
  */
 export const downloadFile = (fileArrayBuffer, filename, mimeType = 'application/octet-stream') => {
-  let data = new Blob([fileArrayBuffer], { type: mimeType });
-  if (typeof window.chrome !== 'undefined') {
-    // Chrome
-    let link = document.createElement('a');
-    link.href = window.URL.createObjectURL(data);
-    link.download = filename;
-    link.click();
-  } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
-    // IE
-    let blob = new Blob([data], { type: 'application/force-download' });
-    window.navigator.msSaveBlob(blob, filename);
-  } else {
-    // Firefox
-    let file = new File([data], filename, { type: 'application/force-download' });
-    window.open(URL.createObjectURL(file));
-  }
-};
+	let data = new Blob([fileArrayBuffer], { type: mimeType })
+	if (typeof window.chrome !== 'undefined') {
+		// Chrome
+		let link = document.createElement('a')
+		link.href = window.URL.createObjectURL(data)
+		link.download = filename
+		link.click()
+	} else if (typeof window.navigator.msSaveBlob !== 'undefined') {
+		// IE
+		let blob = new Blob([data], { type: 'application/force-download' })
+		window.navigator.msSaveBlob(blob, filename)
+	} else {
+		// Firefox
+		let file = new File([data], filename, { type: 'application/force-download' })
+		window.open(URL.createObjectURL(file))
+	}
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
index cc55c08..d3b3f5e 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -3,15 +3,15 @@
  */
 
 export function isvalidUsername(str) {
-  const valid_map = ['admin', 'editor'];
-  return valid_map.indexOf(str.trim()) >= 0;
+	const valid_map = ['admin', 'editor']
+	return valid_map.indexOf(str.trim()) >= 0
 }
 
 /* 合法uri*/
 export function validateURL(textval) {
-  const urlregex =
-    /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
-  return urlregex.test(textval);
+	const urlregex =
+		/^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+	return urlregex.test(textval)
 }
 
 /**
@@ -19,7 +19,7 @@
  * @param {*} s
  */
 export function isEmail(s) {
-  return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s);
+	return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
 }
 
 /**
@@ -27,7 +27,7 @@
  * @param {*} s
  */
 export function isMobile(s) {
-  return /^1[0-9]{10}$/.test(s);
+	return /^1[0-9]{10}$/.test(s)
 }
 
 /**
@@ -35,7 +35,7 @@
  * @param {*} s
  */
 export function isPhone(s) {
-  return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s);
+	return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
 }
 
 /**
@@ -43,40 +43,40 @@
  * @param {*} s
  */
 export function isURL(s) {
-  return /^http[s]?:\/\/.*/.test(s);
+	return /^http[s]?:\/\/.*/.test(s)
 }
 
 /* 小写字母*/
 export function validateLowerCase(str) {
-  const reg = /^[a-z]+$/;
-  return reg.test(str);
+	const reg = /^[a-z]+$/
+	return reg.test(str)
 }
 
 /* 大写字母*/
 export function validateUpperCase(str) {
-  const reg = /^[A-Z]+$/;
-  return reg.test(str);
+	const reg = /^[A-Z]+$/
+	return reg.test(str)
 }
 
 /* 大小写字母*/
 export function validatAlphabets(str) {
-  const reg = /^[A-Za-z]+$/;
-  return reg.test(str);
+	const reg = /^[A-Za-z]+$/
+	return reg.test(str)
 }
 
 /*验证pad还是pc*/
 export const vaildatePc = function () {
-  const userAgentInfo = navigator.userAgent;
-  const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
-  let flag = true;
-  for (var v = 0; v < Agents.length; v++) {
-    if (userAgentInfo.indexOf(Agents[v]) > 0) {
-      flag = false;
-      break;
-    }
-  }
-  return flag;
-};
+	const userAgentInfo = navigator.userAgent
+	const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']
+	let flag = true
+	for (var v = 0; v < Agents.length; v++) {
+		if (userAgentInfo.indexOf(Agents[v]) > 0) {
+			flag = false
+			break
+		}
+	}
+	return flag
+}
 
 /**
  * validate email
@@ -84,178 +84,178 @@
  * @returns {boolean}
  */
 export function validateEmail(email) {
-  const re =
-    /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
-  return re.test(email);
+	const re =
+		/^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+	return re.test(email)
 }
 
 /**
  * 判断身份证号码
  */
 export function cardid(code) {
-  let list = [];
-  let result = true;
-  let msg = '';
-  var city = {
-    11: '北京',
-    12: '天津',
-    13: '河北',
-    14: '山西',
-    15: '内蒙古',
-    21: '辽宁',
-    22: '吉林',
-    23: '黑龙江 ',
-    31: '上海',
-    32: '江苏',
-    33: '浙江',
-    34: '安徽',
-    35: '福建',
-    36: '江西',
-    37: '山东',
-    41: '河南',
-    42: '湖北 ',
-    43: '湖南',
-    44: '广东',
-    45: '广西',
-    46: '海南',
-    50: '重庆',
-    51: '四川',
-    52: '贵州',
-    53: '云南',
-    54: '西藏 ',
-    61: '陕西',
-    62: '甘肃',
-    63: '青海',
-    64: '宁夏',
-    65: '新疆',
-    71: '台湾',
-    81: '香港',
-    82: '澳门',
-    91: '国外 ',
-  };
-  if (!validatenull(code)) {
-    if (code.length === 18) {
-      if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
-        msg = '证件号码格式错误';
-      } else if (!city[code.substr(0, 2)]) {
-        msg = '地址编码错误';
-      } else {
-        //18位身份证需要验证最后一位校验位
-        code = code.split('');
-        //∑(ai×Wi)(mod 11)
-        //加权因子
-        var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
-        //校验位
-        var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x'];
-        var sum = 0;
-        var ai = 0;
-        var wi = 0;
-        for (var i = 0; i < 17; i++) {
-          ai = code[i];
-          wi = factor[i];
-          sum += ai * wi;
-        }
-        if (parity[sum % 11] !== code[17]) {
-          msg = '证件号码校验位错误';
-        } else {
-          result = false;
-        }
-      }
-    } else {
-      msg = '证件号码长度不为18位';
-    }
-  } else {
-    msg = '证件号码不能为空';
-  }
-  list.push(result);
-  list.push(msg);
-  return list;
+	let list = []
+	let result = true
+	let msg = ''
+	var city = {
+		11: '北京',
+		12: '天津',
+		13: '河北',
+		14: '山西',
+		15: '内蒙古',
+		21: '辽宁',
+		22: '吉林',
+		23: '黑龙江 ',
+		31: '上海',
+		32: '江苏',
+		33: '浙江',
+		34: '安徽',
+		35: '福建',
+		36: '江西',
+		37: '山东',
+		41: '河南',
+		42: '湖北 ',
+		43: '湖南',
+		44: '广东',
+		45: '广西',
+		46: '海南',
+		50: '重庆',
+		51: '四川',
+		52: '贵州',
+		53: '云南',
+		54: '西藏 ',
+		61: '陕西',
+		62: '甘肃',
+		63: '青海',
+		64: '宁夏',
+		65: '新疆',
+		71: '台湾',
+		81: '香港',
+		82: '澳门',
+		91: '国外 ',
+	}
+	if (!validatenull(code)) {
+		if (code.length === 18) {
+			if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) {
+				msg = '证件号码格式错误'
+			} else if (!city[code.substr(0, 2)]) {
+				msg = '地址编码错误'
+			} else {
+				//18位身份证需要验证最后一位校验位
+				code = code.split('')
+				//∑(ai×Wi)(mod 11)
+				//加权因子
+				var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
+				//校验位
+				var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x']
+				var sum = 0
+				var ai = 0
+				var wi = 0
+				for (var i = 0; i < 17; i++) {
+					ai = code[i]
+					wi = factor[i]
+					sum += ai * wi
+				}
+				if (parity[sum % 11] !== code[17]) {
+					msg = '证件号码校验位错误'
+				} else {
+					result = false
+				}
+			}
+		} else {
+			msg = '证件号码长度不为18位'
+		}
+	} else {
+		msg = '证件号码不能为空'
+	}
+	list.push(result)
+	list.push(msg)
+	return list
 }
 
 /**
  * 判断手机号码是否正确
  */
 export function isvalidatemobile(phone) {
-  let list = [];
-  let result = true;
-  let msg = '';
-  var isPhone = /^0\d{2,3}-?\d{7,8}$/;
-  //增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678]
-  if (!validatenull(phone)) {
-    if (phone.length === 11) {
-      if (isPhone.test(phone)) {
-        msg = '手机号码格式不正确';
-      } else {
-        result = false;
-      }
-    } else {
-      msg = '手机号码长度不为11位';
-    }
-  } else {
-    msg = '手机号码不能为空';
-  }
-  list.push(result);
-  list.push(msg);
-  return list;
+	let list = []
+	let result = true
+	let msg = ''
+	var isPhone = /^0\d{2,3}-?\d{7,8}$/
+	//增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678]
+	if (!validatenull(phone)) {
+		if (phone.length === 11) {
+			if (isPhone.test(phone)) {
+				msg = '手机号码格式不正确'
+			} else {
+				result = false
+			}
+		} else {
+			msg = '手机号码长度不为11位'
+		}
+	} else {
+		msg = '手机号码不能为空'
+	}
+	list.push(result)
+	list.push(msg)
+	return list
 }
 
 /**
  * 判断姓名是否正确
  */
 export function validatename(name) {
-  var regName = /^[\u4e00-\u9fa5]{2,4}$/;
-  if (!regName.test(name)) return false;
-  return true;
+	var regName = /^[\u4e00-\u9fa5]{2,4}$/
+	if (!regName.test(name)) return false
+	return true
 }
 
 /**
  * 判断是否为整数
  */
 export function validatenum(num, type) {
-  let regName = /[^\d.]/g;
-  if (type === 1) {
-    if (!regName.test(num)) return false;
-  } else if (type === 2) {
-    regName = /[^\d]/g;
-    if (!regName.test(num)) return false;
-  }
-  return true;
+	let regName = /[^\d.]/g
+	if (type === 1) {
+		if (!regName.test(num)) return false
+	} else if (type === 2) {
+		regName = /[^\d]/g
+		if (!regName.test(num)) return false
+	}
+	return true
 }
 
 /**
  * 判断是否为小数
  */
 export function validatenumord(num, type) {
-  let regName = /[^\d.]/g;
-  if (type === 1) {
-    if (!regName.test(num)) return false;
-  } else if (type === 2) {
-    regName = /[^\d.]/g;
-    if (!regName.test(num)) return false;
-  }
-  return true;
+	let regName = /[^\d.]/g
+	if (type === 1) {
+		if (!regName.test(num)) return false
+	} else if (type === 2) {
+		regName = /[^\d.]/g
+		if (!regName.test(num)) return false
+	}
+	return true
 }
 
 /**
  * 判断是否为空
  */
 export function validatenull(val) {
-  if (typeof val == 'boolean') {
-    return false;
-  }
-  if (typeof val == 'number') {
-    return false;
-  }
-  if (val instanceof Array) {
-    if (val.length === 0) return true;
-  } else if (val instanceof Object) {
-    if (JSON.stringify(val) === '{}') return true;
-  } else {
-    if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '')
-      return true;
-    return false;
-  }
-  return false;
+	if (typeof val == 'boolean') {
+		return false
+	}
+	if (typeof val == 'number') {
+		return false
+	}
+	if (val instanceof Array) {
+		if (val.length === 0) return true
+	} else if (val instanceof Object) {
+		if (JSON.stringify(val) === '{}') return true
+	} else {
+		if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '')
+			return true
+		return false
+	}
+	return false
 }
 
 /**
@@ -264,22 +264,22 @@
  * @returns {boolean} - 如果是对象或可解析的 JSON 字符串,返回 true;否则返回 false
  */
 export function validatejson(val) {
-  // 直接判断是否为对象(排除 null 和数组)
-  if (val !== null && typeof val === 'object') {
-    return true;
-  }
+	// 直接判断是否为对象(排除 null 和数组)
+	if (val !== null && typeof val === 'object') {
+		return true
+	}
 
-  // 尝试解析字符串为 JSON
-  if (typeof val === 'string') {
-    try {
-      const obj = JSON.parse(val);
-      // 解析后还需判断是否为对象或数组
-      return obj !== null && typeof obj === 'object';
-    } catch (e) {
-      return false;
-    }
-  }
+	// 尝试解析字符串为 JSON
+	if (typeof val === 'string') {
+		try {
+			const obj = JSON.parse(val)
+			// 解析后还需判断是否为对象或数组
+			return obj !== null && typeof obj === 'object'
+		} catch (e) {
+			return false
+		}
+	}
 
-  // 非对象、非数组、非字符串,或者字符串不是 JSON
-  return false;
+	// 非对象、非数组、非字符串,或者字符串不是 JSON
+	return false
 }
diff --git a/src/utils/websocket/connect-websocket.js b/src/utils/websocket/connect-websocket.js
index 1108462..d98941d 100644
--- a/src/utils/websocket/connect-websocket.js
+++ b/src/utils/websocket/connect-websocket.js
@@ -1,15 +1,15 @@
-import ConnectWebSocket from '@/websocket';
-import { getWebsocketUrl } from '@/websocket/util/config';
+import ConnectWebSocket from '@/websocket'
+import { getWebsocketUrl } from '@/websocket/util/config'
 
 /**
  * 接收一个message函数
  * @param messageHandler
  */
 export function useConnectWebSocket(messageHandler, url) {
-    const webSocket = new ConnectWebSocket(url || getWebsocketUrl());
+	const webSocket = new ConnectWebSocket(url || getWebsocketUrl())
 
-    webSocket?.registerMessageHandler(messageHandler);
-    webSocket?.initSocket();
+	webSocket?.registerMessageHandler(messageHandler)
+	webSocket?.initSocket()
 
-    return webSocket;
+	return webSocket
 }
diff --git a/src/utils/websocket/drone-ws-control.js b/src/utils/websocket/drone-ws-control.js
index f4e56fd..9e5be0f 100644
--- a/src/utils/websocket/drone-ws-control.js
+++ b/src/utils/websocket/drone-ws-control.js
@@ -1,145 +1,118 @@
 // import { EventBus } from '@/eventBus/event-bus';
-import { EBizCode, EBizCodeMessage } from '@/utils/staticData/enums';
-import { ControlSource } from '@/utils/staticData/device';
+import { EBizCode, EBizCodeMessage } from '@/utils/staticData/enums'
+import { ControlSource } from '@/utils/staticData/device'
 
 export default {
-    data() {
-        return {
-            droneControlSource: '',
-            payloadControlSource: '',
-            ControlSource: ControlSource,
-        };
-    },
-    methods: {
-        useDroneControlWsEvent(sn, payloadSn, funcs) {
-            const _this = this;
-            this.droneControlSource = this.ControlSource.A;
-            this.payloadControlSource = this.ControlSource.B;
+	data() {
+		return {
+			droneControlSource: '',
+			payloadControlSource: '',
+			ControlSource: ControlSource,
+		}
+	},
+	methods: {
+		useDroneControlWsEvent(sn, payloadSn, funcs) {
+			const _this = this
+			this.droneControlSource = this.ControlSource.A
+			this.payloadControlSource = this.ControlSource.B
 
-            function onControlSourceChange(data) {
-                if (
-                    data.type === 1 &&
-                    data.sn === sn
-                ) {
-                    _this.droneControlSource = data.control_source;
-                    _this.$store.commit(
-                        'SET_DRONE_CONTROL_SOURCE',
-                        _this.droneControlSource,
-                    );
-                    // _this.$message.info(`飞行控制改为 ${_this.droneControlSource}`)
-                    // _this._showMessage.info(`飞行控制改为 ${_this.droneControlSource}`)
-                    return;
-                }
-                if (
-                    data.type === 2 &&
-                    data.sn === payloadSn
-                ) {
-                    _this.payloadControlSource = data.control_source;
-                    // _this.$message.info(`负载控制改为 ${_this.payloadControlSource}.`)
-                    // _this._showMessage.info(`负载控制改为 ${_this.payloadControlSource}.`)
-                }
-            }
+			function onControlSourceChange(data) {
+				if (data.type === 1 && data.sn === sn) {
+					_this.droneControlSource = data.control_source
+					_this.$store.commit('SET_DRONE_CONTROL_SOURCE', _this.droneControlSource)
+					// _this.$message.info(`飞行控制改为 ${_this.droneControlSource}`)
+					// _this._showMessage.info(`飞行控制改为 ${_this.droneControlSource}`)
+					return
+				}
+				if (data.type === 2 && data.sn === payloadSn) {
+					_this.payloadControlSource = data.control_source
+					// _this.$message.info(`负载控制改为 ${_this.payloadControlSource}.`)
+					// _this._showMessage.info(`负载控制改为 ${_this.payloadControlSource}.`)
+				}
+			}
 
-            function handleProgress(key, message, error) {
-                if (error !== 0) {
-                    // _this.$notify.closeAll()
-                    // _this.$notify.error({
-                    //     title: key + '错误码:' + error,
-                    //     message: message,
-                    //     duration: 30
-                    // })
-                    // _this._showMessage.warning(key + '错误码:' + error)
-                    _this._showMessage.warning(key);
-                } else {
-                    // _this.$notify.closeAll()
-                    // _this.$notify.info({
-                    //     title: key,
-                    //     message: message,
-                    //     duration: 30
-                    // })
-                    _this._showMessage.info(message);
-                }
-            }
+			function handleProgress(key, message, error) {
+				if (error !== 0) {
+					// _this.$notify.closeAll()
+					// _this.$notify.error({
+					//     title: key + '错误码:' + error,
+					//     message: message,
+					//     duration: 30
+					// })
+					// _this._showMessage.warning(key + '错误码:' + error)
+					_this._showMessage.warning(key)
+				} else {
+					// _this.$notify.closeAll()
+					// _this.$notify.info({
+					//     title: key,
+					//     message: message,
+					//     duration: 30
+					// })
+					_this._showMessage.info(message)
+				}
+			}
 
-            function handleDroneControlWsEvent(payload) {
-                if (!payload) {
-                    return;
-                }
-                switch (payload.biz_code) {
-                    case EBizCode.ControlSourceChange: {
-                        onControlSourceChange(payload.data);
-                        break;
-                    }
-                    case EBizCode.FlyToPointProgress: {
-                        const {
-                            sn: deviceSn,
-                            result,
-                            message: msg,
-                        } = payload.data;
-                        if (deviceSn !== sn) return;
-                        handleProgress(
-                            EBizCodeMessage[EBizCode.FlyToPointProgress],
-                            `设备(编码: ${deviceSn}) ${msg}`,
-                            result,
-                        );
-                        break;
-                    }
-                    case EBizCode.TakeoffToPointProgress: {
-                        const {
-                            sn: deviceSn,
-                            result,
-                            message: msg,
-                        } = payload.data;
-                        if (deviceSn !== sn) return;
-                        handleProgress(
-                            EBizCodeMessage[EBizCode.TakeoffToPointProgress],
-                            `设备(编码: ${deviceSn}) ${msg}`,
-                            result,
-                        );
-                        break;
-                    }
-                    case EBizCode.JoystickInvalidNotify: {
-                        const {
-                            sn: deviceSn,
-                            result,
-                            message: msg,
-                        } = payload.data;
-                        if (deviceSn !== sn) return;
-                        handleProgress(
-                            EBizCodeMessage[EBizCode.JoystickInvalidNotify],
-                            `设备(编码: ${deviceSn}) ${msg}`,
-                            result,
-                        );
-                        break;
-                    }
-                    case EBizCode.DrcStatusNotify: {
-                        const {
-                            sn: deviceSn,
-                            result,
-                            message: msg,
-                        } = payload.data;
-                        break;
-                    }
-                }
-            }
+			function handleDroneControlWsEvent(payload) {
+				if (!payload) {
+					return
+				}
+				switch (payload.biz_code) {
+					case EBizCode.ControlSourceChange: {
+						onControlSourceChange(payload.data)
+						break
+					}
+					case EBizCode.FlyToPointProgress: {
+						const { sn: deviceSn, result, message: msg } = payload.data
+						if (deviceSn !== sn) return
+						handleProgress(
+							EBizCodeMessage[EBizCode.FlyToPointProgress],
+							`设备(编码: ${deviceSn}) ${msg}`,
+							result
+						)
+						break
+					}
+					case EBizCode.TakeoffToPointProgress: {
+						const { sn: deviceSn, result, message: msg } = payload.data
+						if (deviceSn !== sn) return
+						handleProgress(
+							EBizCodeMessage[EBizCode.TakeoffToPointProgress],
+							`设备(编码: ${deviceSn}) ${msg}`,
+							result
+						)
+						break
+					}
+					case EBizCode.JoystickInvalidNotify: {
+						const { sn: deviceSn, result, message: msg } = payload.data
+						if (deviceSn !== sn) return
+						handleProgress(
+							EBizCodeMessage[EBizCode.JoystickInvalidNotify],
+							`设备(编码: ${deviceSn}) ${msg}`,
+							result
+						)
+						break
+					}
+					case EBizCode.DrcStatusNotify: {
+						const { sn: deviceSn, result, message: msg } = payload.data
+						break
+					}
+				}
+			}
 
-            return {
-                handleDroneControlWsEvent,
-            };
-        },
-    },
-    mounted() {
-        this.$EventBus.$on(
-            'droneControlWs',
-            this.useDroneControlWsEvent(this.sn, this.payloadSelectInfo.value)
-                .handleDroneControlWsEvent,
-        );
-    },
-    beforeDestroy() {
-        this.$EventBus.$off(
-            'droneControlWs',
-            this.useDroneControlWsEvent(this.sn, this.payloadSelectInfo.value)
-                .handleDroneControlWsEvent,
-        );
-    },
-};
+			return {
+				handleDroneControlWsEvent,
+			}
+		},
+	},
+	mounted() {
+		this.$EventBus.$on(
+			'droneControlWs',
+			this.useDroneControlWsEvent(this.sn, this.payloadSelectInfo.value).handleDroneControlWsEvent
+		)
+	},
+	beforeDestroy() {
+		this.$EventBus.$off(
+			'droneControlWs',
+			this.useDroneControlWsEvent(this.sn, this.payloadSelectInfo.value).handleDroneControlWsEvent
+		)
+	},
+}
diff --git a/src/views/Home/Footer.vue b/src/views/Home/Footer.vue
index ddbb6f4..fbe52c5 100644
--- a/src/views/Home/Footer.vue
+++ b/src/views/Home/Footer.vue
@@ -1,128 +1,128 @@
 <template>
-  <div class="footer">
-    <img
-      v-for="item in list"
-      :class="item.className"
-      :src="item.active ? item.activeImg : item.img"
-      alt=""
-      @click="imgClick(item)"
-    />
-  </div>
-  <div class="intelligent-introduction-flying">
-    <img class="orthophoto" src="@/assets/images/intelligent-introduction-flying.png" alt="" />
-  </div>
+	<div class="footer">
+		<img
+			v-for="item in list"
+			:class="item.className"
+			:src="item.active ? item.activeImg : item.img"
+			alt=""
+			@click="imgClick(item)"
+		/>
+	</div>
+	<div class="intelligent-introduction-flying">
+		<img class="orthophoto" src="@/assets/images/intelligent-introduction-flying.png" alt="" />
+	</div>
 </template>
 
 <script setup>
-import img1 from '@/assets/images/home/footer/machine-nest.png';
-import activeImg1 from '@/assets/images/home/footer/machine-nest1.png';
-import img2 from '@/assets/images/home/footer/event.png';
-import activeImg2 from '@/assets/images/home/footer/event1.png';
-import img3 from '@/assets/images/home/footer/panorama.png';
-import activeImg3 from '@/assets/images/home/footer/panorama1.png';
-import img4 from '@/assets/images/home/footer/3D.png';
-import activeImg4 from '@/assets/images/home/footer/3D1.png';
-import img5 from '@/assets/images/home/footer/orthophoto.png';
-import activeImg5 from '@/assets/images/home/footer/orthophoto1.png';
+import img1 from '@/assets/images/home/footer/machine-nest.png'
+import activeImg1 from '@/assets/images/home/footer/machine-nest1.png'
+import img2 from '@/assets/images/home/footer/event.png'
+import activeImg2 from '@/assets/images/home/footer/event1.png'
+import img3 from '@/assets/images/home/footer/panorama.png'
+import activeImg3 from '@/assets/images/home/footer/panorama1.png'
+import img4 from '@/assets/images/home/footer/3D.png'
+import activeImg4 from '@/assets/images/home/footer/3D1.png'
+import img5 from '@/assets/images/home/footer/orthophoto.png'
+import activeImg5 from '@/assets/images/home/footer/orthophoto1.png'
 
-import { useUavHome } from '@/views/Home/useUavHome/useUavHome';
-import { useEventOperate } from '@/views/Home/useEventOperate/useEventOperate';
+import { useUavHome } from '@/views/Home/useUavHome/useUavHome'
+import { useEventOperate } from '@/views/Home/useEventOperate/useEventOperate'
 
 // 机巢聚合
-const { init, removeAll } = useUavHome();
+const { init, removeAll } = useUavHome('device');
 // 事件聚合
-const { init: eventInit, removeAll: eventRemove } = useEventOperate();
+const { init: eventInit, removeAll: eventRemove } = useUavHome('event');
 
 const list = ref([
-  {
-    name: 'event1',
-    img: img1,
-    activeImg: activeImg1,
-    active: true,
-    className: 'machine-nest',
-    init: init,
-    removeAll: removeAll,
-  },
-  {
-    name: 'event2',
-    img: img2,
-    activeImg: activeImg2,
-    active: false,
-    className: 'event',
-    init: eventInit,
-    removeAll: eventRemove,
-  },
-  { name: 'event3', img: img3, activeImg: activeImg3, active: false, className: 'panorama' },
-  { name: 'event4', img: img4, activeImg: activeImg4, active: false, className: 'threeD' },
-  { name: 'event5', img: img5, activeImg: activeImg5, active: false, className: 'orthophoto' },
-]);
+	{
+		name: 'event1',
+		img: img1,
+		activeImg: activeImg1,
+		active: true,
+		className: 'machine-nest',
+		init: init,
+		removeAll: removeAll,
+	},
+	{
+		name: 'event2',
+		img: img2,
+		activeImg: activeImg2,
+		active: false,
+		className: 'event',
+		init: eventInit,
+		removeAll: eventRemove,
+	},
+	{ name: 'event3', img: img3, activeImg: activeImg3, active: false, className: 'panorama' },
+	{ name: 'event4', img: img4, activeImg: activeImg4, active: false, className: 'threeD' },
+	{ name: 'event5', img: img5, activeImg: activeImg5, active: false, className: 'orthophoto' },
+])
 
 const imgClick = toItem => {
   const fromItem = list.value.find(item => item.active);
   if (fromItem.name === toItem.name) return;
   fromItem?.removeAll?.();
-  nextTick(()=>{
+  nextTick(() => {
     toItem?.init?.();
-  })
+  });
   list.value = list.value.map(item => ({ ...item, active: item.name === toItem.name }));
 };
 
 // 销毁前钩子
 onBeforeUnmount(() => {
-  if (!window.$viewer) return;
   removeAll();
+  eventRemove()
 });
 onMounted(() => {
-  nextTick(() => {
-    init();
-  });
-});
+	nextTick(() => {
+		init()
+	})
+})
 </script>
 
 <style scoped lang="scss">
 .footer {
-  position: absolute;
-  bottom: 84px;
-  left: 624px;
+	position: absolute;
+	bottom: 84px;
+	left: 624px;
 
-  img {
-    width: 103px;
-    height: 119px;
-    cursor: pointer;
-  }
+	img {
+		width: 103px;
+		height: 119px;
+		cursor: pointer;
+	}
 
-  .event {
-    position: relative;
-    left: 40px;
-    bottom: 15px;
-  }
+	.event {
+		position: relative;
+		left: 40px;
+		bottom: 15px;
+	}
 
-  .panorama {
-    position: relative;
-    left: 80px;
-    bottom: 34px;
-  }
+	.panorama {
+		position: relative;
+		left: 80px;
+		bottom: 34px;
+	}
 
-  .threeD {
-    position: relative;
-    left: 120px;
-    bottom: 15px;
-  }
+	.threeD {
+		position: relative;
+		left: 120px;
+		bottom: 15px;
+	}
 
-  .orthophoto {
-    position: relative;
-    left: 160px;
-  }
+	.orthophoto {
+		position: relative;
+		left: 160px;
+	}
 }
 
 .intelligent-introduction-flying {
-  position: absolute;
-  left: 888px;
-  bottom: 23px;
+	position: absolute;
+	left: 888px;
+	bottom: 23px;
 
-  img {
-    width: 146px;
-    height: 54px;
-  }
+	img {
+		width: 146px;
+		height: 54px;
+	}
 }
 </style>
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index 9ce5980..cf44de4 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -26,7 +26,7 @@
 
 const singleUavHome = computed(() => store.state.home.singleUavHome);
 
-onBeforeUnmount(()=>{
+onUnmounted(()=>{
   store.commit('setSingleUavHome',null);
   viewerDestory()
 })
diff --git a/src/views/Home/components/HomeLeft/InspectionRaskDetails.vue b/src/views/Home/components/HomeLeft/InspectionRaskDetails.vue
index 4e921be..d24f168 100644
--- a/src/views/Home/components/HomeLeft/InspectionRaskDetails.vue
+++ b/src/views/Home/components/HomeLeft/InspectionRaskDetails.vue
@@ -1,222 +1,225 @@
 <!-- 巡检任务详情 -->
 <template>
-  <common-title title="巡检任务情况" :style="{ marginLeft: pxToRem(14) }" @details="detailsFun">
-  </common-title>
-  <div class="inspection-rask-details">
-    <div class="inspection-num">
-      <div class="total">
-        <div class="value">{{ total }}</div>
-        <div class="name">总任务数</div>
-      </div>
-      <div class="status">
-        <div v-for="item in list">
-          <div :style="{ color: item.color }" class="value">{{ jobStatistics[item.field] }}</div>
-          <div class="name">{{ item.name }}</div>
-        </div>
-      </div>
-    </div>
-    <CommonDateTime :style="{ top: pxToRem(19) }" v-model="newTime" @change="getData" />
-    <div class="chart-container" ref="chartRef"></div>
-  </div>
+	<common-title title="巡检任务情况" :style="{ marginLeft: pxToRem(14) }" @details="detailsFun">
+	</common-title>
+	<div class="inspection-rask-details">
+		<div class="inspection-num">
+			<div class="total">
+				<div class="value">{{ total }}</div>
+				<div class="name">总任务数</div>
+			</div>
+			<div class="status">
+				<div v-for="item in list">
+					<div :style="{ color: item.color }" class="value">
+						{{ jobStatistics[item.field] }}
+					</div>
+					<div class="name">{{ item.name }}</div>
+				</div>
+			</div>
+		</div>
+		<CommonDateTime :style="{ top: pxToRem(19) }" v-model="newTime" @change="getData" />
+		<div class="chart-container" ref="chartRef"></div>
+	</div>
 </template>
 
 <script setup>
-import * as echarts from 'echarts';
-import { pxToRem } from '@/utils/rem';
-import CommonTitle from '@/components/CommonTitle.vue';
-import CommonDateTime from '@/components/CommonDateTime.vue';
-import { getJobNumBar, getJobStatistics, getTotalJobNum } from '@/api/home';
-import dayjs from 'dayjs';
+import * as echarts from 'echarts'
+import { pxToRem } from '@/utils/rem'
+import CommonTitle from '@/components/CommonTitle.vue'
+import CommonDateTime from '@/components/CommonDateTime.vue'
+import { getJobNumBar, getJobStatistics, getTotalJobNum } from '@/api/home'
+import dayjs from 'dayjs'
 
-const currenDate = dayjs().format('YYYY-MM-DD');
-const newTime = ref([currenDate, currenDate]);
+const currenDate = dayjs().format('YYYY-MM-DD')
+const newTime = ref([currenDate, currenDate])
 const list = ref([
-  { name: '计划执行', value: 89, color: '#FFFFFF', field: 'planned_executions' },
-  { name: '执行中', value: 100, color: '#FFA768', field: 'running_num' },
-  { name: '待执行', value: 66, color: '#FFE17E', field: 'pending_executions' },
-  { name: '已执行', value: 10, color: '#8EFFAC', field: 'executed' },
-  { name: '执行失败', value: 10, color: '#FF8E8E', field: 'failed_executions' },
-]);
+	{ name: '计划执行', value: 89, color: '#FFFFFF', field: 'planned_executions' },
+	{ name: '执行中', value: 100, color: '#FFA768', field: 'running_num' },
+	{ name: '待执行', value: 66, color: '#FFE17E', field: 'pending_executions' },
+	{ name: '已执行', value: 10, color: '#8EFFAC', field: 'executed' },
+	{ name: '执行失败', value: 10, color: '#FF8E8E', field: 'failed_executions' },
+])
 const option = {
-  grid: {
-    top: '15%',
-    left: '3%',
-    right: '4%',
-    bottom: '3%',
-    containLabel: true,
-  },
-  tooltip: {
-    trigger: 'axis',
-    backgroundColor: 'rgba(0,0,0,0.7)',
-    borderColor: '#0070FF',
-    borderWidth: 1,
-    textStyle: {
-      color: '#fff',
-    },
-    formatter: '{b}: {c}次',
-  },
-  xAxis: {
-    type: 'category',
-    data: ['1',],
-    axisLine: {
-      show: false, // 隐藏轴线
-    },
-    axisTick: {
-      show: true,
-      length: 2,
-      lineStyle: {
-        color: '#ffffff',
-      },
-    },
-    axisLabel: {
-      color: '#ffffff',
-      margin: 8,
-    },
-  },
-  yAxis: {
-    type: 'value',
-    axisLine: {
-      lineStyle: {
-        color: '#ffffff',
-      },
-    },
-    axisLabel: {
-      color: '#ffffff',
-    },
-    splitLine: {
-      lineStyle: {
-        color: 'rgba(255, 255, 255, 0.1)',
-      },
-    },
-  },
-  series: {
-    data: [10],
-    type: 'bar',
-    barWidth: '60%',
-    itemStyle: {
-      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-        { offset: 0, color: '#1EE7E7' },
-        { offset: 1, color: 'rgba(0, 112, 255, 0.1)' },
-      ]),
-    },
-  },
-};
+	grid: {
+		top: '15%',
+		left: '3%',
+		right: '4%',
+		bottom: '3%',
+		containLabel: true,
+	},
+	tooltip: {
+		trigger: 'axis',
+		backgroundColor: 'rgba(0,0,0,0.7)',
+		borderColor: '#0070FF',
+		borderWidth: 1,
+		textStyle: {
+			color: '#fff',
+		},
+		formatter: '{b}: {c}次',
+	},
+	xAxis: {
+		type: 'category',
+		data: ['1'],
+		axisLine: {
+			show: false, // 隐藏轴线
+		},
+		axisTick: {
+			show: true,
+			length: 2,
+			lineStyle: {
+				color: '#ffffff',
+			},
+		},
+		axisLabel: {
+			color: '#ffffff',
+			margin: 8,
+		},
+	},
+	yAxis: {
+		type: 'value',
+		axisLine: {
+			lineStyle: {
+				color: '#ffffff',
+			},
+		},
+		axisLabel: {
+			color: '#ffffff',
+		},
+		splitLine: {
+			lineStyle: {
+				color: 'rgba(255, 255, 255, 0.1)',
+			},
+		},
+	},
+	series: {
+		data: [10],
+		type: 'bar',
+		barWidth: '60%',
+		itemStyle: {
+			color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+				{ offset: 0, color: '#1EE7E7' },
+				{ offset: 1, color: 'rgba(0, 112, 255, 0.1)' },
+			]),
+		},
+	},
+}
 
 const detailsFun = () => {
-  console.log('details');
-};
+	console.log('details')
+}
 
-let chart = null;
+let chart = null
 
 // TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR
-const getData = (value,date_enum) => {
-  const params = {
-    date_enum,
-    // start_date: newTime.value[0],
-    // end_date: newTime.value[1]
-  };
-  getJobStatistics(params).then(res => {
-    jobStatistics.value = res.data?.data || {};
-  });
-  getJobNumBar(params).then(res => {
-    option.xAxis.data = res.data?.data.map(item => item.name);
-    option.series.data = res.data?.data.map(item => item.value);
-    chart.setOption(option);
-  });
-};
+const getData = (value, date_enum) => {
+	const params = {
+		date_enum,
+		// start_date: newTime.value[0],
+		// end_date: newTime.value[1]
+	}
+	getJobStatistics(params).then(res => {
+		jobStatistics.value = res.data?.data || {}
+	})
+	getJobNumBar(params).then(res => {
+		option.xAxis.data = res.data?.data.map(item => item.name)
+		option.series.data = res.data?.data.map(item => item.value)
+		chart.setOption(option)
+	})
+}
 
-const chartRef = ref(null);
-const total = ref(0);
+const chartRef = ref(null)
+const total = ref(0)
 const jobStatistics = ref({
-  planned_executions: 0,
-  executed: 0,
-  running_num: 0,
-  failed_executions: 0,
-  pending_executions: 0,
-});
+	planned_executions: 0,
+	executed: 0,
+	running_num: 0,
+	failed_executions: 0,
+	pending_executions: 0,
+})
 
 onMounted(() => {
-  chart = echarts.init(chartRef.value);
-  // 监听窗口大小变化
-  window.addEventListener('resize', () => {
-    chart.resize();
-  });
-  getTotalJobNum().then(res => {
-    total.value = res.data?.data || 0;
-  });
-  getData(newTime.value, 'TODAY');
-});
+	chart = echarts.init(chartRef.value)
+	// 监听窗口大小变化
+	window.addEventListener('resize', () => {
+		chart.resize()
+	})
+	getTotalJobNum().then(res => {
+		total.value = res.data?.data || 0
+	})
+	getData(newTime.value, 'TODAY')
+})
 </script>
 
 <style scoped lang="scss">
 .inspection-rask-details {
-  margin-left: 29px;
-  padding: 16px 16px;
-  width: 390px;
-  height: 414px;
-  background: linear-gradient(
-    270deg,
-    rgba(31, 62, 122, 0) 0%,
-    rgba(31, 62, 122, 0.35) 21%,
-    #1f3e7a 100%
-  );
-  border-radius: 0px 0px 0px 0px;
-  opacity: 0.85;
+	margin-left: 29px;
+	padding: 16px 16px;
+	width: 390px;
+	height: 414px;
+	background: linear-gradient(
+		270deg,
+		rgba(31, 62, 122, 0) 0%,
+		rgba(31, 62, 122, 0.35) 21%,
+		#1f3e7a 100%
+	);
+	border-radius: 0px 0px 0px 0px;
+	opacity: 0.85;
 
-  .inspection-num {
-    background: url('@/assets/images/home/homeLeft/inspection-num.png') no-repeat center / 100% 100%;
-    width: 360px;
-    height: 118px;
-    position: relative;
+	.inspection-num {
+		background: url('@/assets/images/home/homeLeft/inspection-num.png') no-repeat center / 100%
+			100%;
+		width: 360px;
+		height: 118px;
+		position: relative;
 
-    .total {
-      position: absolute;
-      left: 34px;
-      top: 44px;
-      font-weight: 500;
-      font-size: 14px;
-      color: #ffffff;
-      text-align: center;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      line-height: 19px;
+		.total {
+			position: absolute;
+			left: 34px;
+			top: 44px;
+			font-weight: 500;
+			font-size: 14px;
+			color: #ffffff;
+			text-align: center;
+			font-family: Source Han Sans CN, Source Han Sans CN;
+			line-height: 19px;
 
-      .value {
-        font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
-        font-size: 26px;
-      }
-    }
+			.value {
+				font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
+				font-size: 26px;
+			}
+		}
 
-    .status {
-      position: absolute;
-      top: 8px;
-      right: 10px;
-      width: 200px;
-      display: flex;
-      flex-wrap: wrap;
-      gap: 8px;
-      justify-content: flex-start;
-      line-height: 22px;
-      padding: 0 10px 10px 0;
+		.status {
+			position: absolute;
+			top: 8px;
+			right: 10px;
+			width: 200px;
+			display: flex;
+			flex-wrap: wrap;
+			gap: 8px;
+			justify-content: flex-start;
+			line-height: 22px;
+			padding: 0 10px 10px 0;
 
-      .name {
-        font-family: Source Han Sans CN, Source Han Sans CN;
-        font-weight: 400;
-        font-size: 14px;
-        color: #ffffff;
-      }
+			.name {
+				font-family: Source Han Sans CN, Source Han Sans CN;
+				font-weight: 400;
+				font-size: 14px;
+				color: #ffffff;
+			}
 
-      .value {
-        font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
-        font-weight: 400;
-        font-size: 26px;
-      }
-    }
-  }
+			.value {
+				font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
+				font-weight: 400;
+				font-size: 26px;
+			}
+		}
+	}
 
-  .chart-container {
-    width: 100%;
-    height: 200px;
-    margin-top: 20px;
-  }
+	.chart-container {
+		width: 100%;
+		height: 200px;
+		margin-top: 20px;
+	}
 }
 </style>
diff --git a/src/views/Home/useEventOperate/EventPopUpBox.vue b/src/views/Home/useEventOperate/EventPopUpBox.vue
index a5abd92..dd87e8d 100644
--- a/src/views/Home/useEventOperate/EventPopUpBox.vue
+++ b/src/views/Home/useEventOperate/EventPopUpBox.vue
@@ -1,37 +1,50 @@
 <template>
   <div class="mapPopUpBox">
     <div class="title">
-      违章建筑
+      {{ info.event_name }}
       <el-icon class="header-close" @click="props.removeLabel">
         <Close />
       </el-icon>
     </div>
     <div class="content">
-      <img
-        class="eventImage"
-        src="@/assets/images/home/useEventOperate/eventErr.png"
-        alt="Event Image"
-      />
+      <div class="medium">
+        <img v-if="info.media_type === 'PHOTO_TYPE'" class="eventImage" :src="info.url" alt="Event Image" />
+        <video v-else :src="info.url" autoplay muted playsinline preload="metadata" />
+      </div>
+
       <div class="details">
         <div class="label">位置:</div>
-        <div class="value point">112.12345 23.98726</div>
+        <div class="value point">{{ _.round(info.longitude, 3) }},{{ _.round(info.latitude, 3) }}</div>
         <div class="label">时间:</div>
-        <div class="value">2025.08.16 22:25</div>
+        <div class="value">{{ info.create_time }}</div>
       </div>
     </div>
   </div>
 </template>
 <script setup>
+// src="@/assets/images/home/useEventOperate/eventErr.png"
 import { Close } from '@element-plus/icons-vue';
-
-const list = [
-  { name: '执行中', value: '1', color: '#FFA768' },
-  { name: '在线', value: '20', color: '#8EFFAC' },
-  { name: '离线', value: '14', color: '#FFFFFF' },
-  { name: '异常', value: '25', color: '#FF6262' },
-];
+import { getEventDetails } from '@/api/home/aggregation';
+import _ from 'lodash';
 
 const props = defineProps(['data', 'removeLabel']);
+const loading = ref(true);
+
+const info = ref({
+  event_name: '',
+  status: 1,
+  url: '1',
+  longitude: '',
+  latitude: '',
+  create_time: '04/01 12:41',
+  media_type: 'PHOTO_TYPE',
+});
+onMounted(async () => {
+  loading.value = true;
+  const res = await getEventDetails({ id: props.data.eventId });
+  info.value = res.data.data;
+  loading.value = false;
+});
 </script>
 
 <style scoped lang="scss">
@@ -47,7 +60,7 @@
     font-weight: 400;
     font-size: 18px;
     line-height: 16px;
-    background: linear-gradient(180deg, #A8E5FB 0%, #E6F8FF 100%);
+    background: linear-gradient(180deg, #a8e5fb 0%, #e6f8ff 100%);
     -webkit-background-clip: text;
     -webkit-text-fill-color: transparent;
     -moz-background-clip: text;
@@ -77,10 +90,16 @@
     display: flex;
     align-items: center;
 
-    img {
+    .medium {
       height: 102px;
-      width: 102px;
+      width: 120px;
       margin-right: 10px;
+
+      > img,
+      video {
+        width: 100%;
+        height: 100%;
+      }
     }
 
     .details {
diff --git a/src/views/Home/useEventOperate/useEventOperate.js b/src/views/Home/useEventOperate/useEventOperate.js
index 56033b9..205b988 100644
--- a/src/views/Home/useEventOperate/useEventOperate.js
+++ b/src/views/Home/useEventOperate/useEventOperate.js
@@ -1,6 +1,5 @@
 import * as Cesium from 'cesium';
 import data2 from '@/assets/images/home/homeRight/data2.png';
-import data1 from '@/assets/images/home/homeRight/data1.png';
 import eventImg from '@/assets/images/home/useEventOperate/event.png';
 import jiangxishi from '@/assets/geojson/jiangxishi.json';
 import jiangxi from '@/assets/geojson/jiangxi.json';
@@ -13,202 +12,202 @@
  * 事件聚合功能
  */
 export const useEventOperate = () => {
-  const scalingJudgment = [
-    { name: '县', value: [0, 48651], gJson: null },
-    { name: '市', value: [48651, 314863], gJson: jiangxishi },
-    { name: '省', value: [314863, 1169651], gJson: jiangxi },
-    { name: '国', value: [1169651, 37962800], gJson: zg },
-  ];
-  let viewer = null;
-  let active = null;
-  let handler = null;
-  let positionC3 = null;
-  const listenerHeight = () => {
-    determineScaling();
-    viewer.camera.moveEnd.addEventListener(determineScaling);
-  };
+	const scalingJudgment = [
+		{ name: '县', value: [0, 48651], gJson: null },
+		{ name: '市', value: [48651, 314863], gJson: jiangxishi },
+		{ name: '省', value: [314863, 1169651], gJson: jiangxi },
+		{ name: '国', value: [1169651, 37962800], gJson: zg },
+	]
+	let viewer = null
+	let active = null
+	let handler = null
+	let positionC3 = null
+	const listenerHeight = () => {
+		determineScaling()
+		viewer.camera.moveEnd.addEventListener(determineScaling)
+	}
 
-  // 确定缩放比例
-  const determineScaling = () => {
-    if(!viewer) return
-    let height = viewer.camera.positionCartographic.height;
-    // 根据高度展示对应的 gJson
-    for (let item of scalingJudgment) {
-      if (height > item.value[0] && height <= item.value[1]) {
-        if (active !== item.name) {
-          removeEntities();
-          removeLabel();
-          active = item.name;
-          item.gJson ? aggregation(item) : splashed();
-        }
-        break;
-      }
-    }
-  };
+	// 确定缩放比例
+	const determineScaling = () => {
+		if (!viewer) return
+		let height = viewer.camera.positionCartographic.height
+		// 根据高度展示对应的 gJson
+		for (let item of scalingJudgment) {
+			if (height > item.value[0] && height <= item.value[1]) {
+				if (active !== item.name) {
+					removeEntities()
+					removeLabel()
+					active = item.name
+					item.gJson ? aggregation(item) : splashed()
+				}
+				break
+			}
+		}
+	}
 
-  //散点机巢
-  function splashed() {
-    for (let i = 0; i < 50; i++) {
-      viewer.entities.add({
-        position: Cesium.Cartesian3.fromDegrees(
-          115.89 + Math.random() * 0.2,
-          28.68 + Math.random() * 0.2
-        ),
-        label: {
-          // 随机整数
-          text: Math.floor(Math.random() * 100) + '号事件',
-          font: '14pt monospace',
-          fillColor: Cesium.Color.WHITE,
-          outlineColor: Cesium.Color.BLACK,
-          outlineWidth: 2,
-          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-          pixelOffset: new Cesium.Cartesian2(0, -9),
-        },
-        billboard: {
-          image: new Cesium.ConstantProperty(eventImg),
-          width: 24,
-          height: 24,
-        },
-      });
-    }
-  }
+	//散点机巢
+	function splashed() {
+		for (let i = 0; i < 50; i++) {
+			viewer.entities.add({
+				position: Cesium.Cartesian3.fromDegrees(
+					115.89 + Math.random() * 0.2,
+					28.68 + Math.random() * 0.2
+				),
+				label: {
+					// 随机整数
+					text: Math.floor(Math.random() * 100) + '号事件',
+					font: '14pt monospace',
+					fillColor: Cesium.Color.WHITE,
+					outlineColor: Cesium.Color.BLACK,
+					outlineWidth: 2,
+					style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+					verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+					pixelOffset: new Cesium.Cartesian2(0, -9),
+				},
+				billboard: {
+					image: new Cesium.ConstantProperty(eventImg),
+					width: 24,
+					height: 24,
+				},
+			})
+		}
+	}
 
-  // 聚合机巢
-  const aggregation = item => {
-    const featuresList = item.gJson.features.map(item => ({
-      name: item.properties.name,
-      position: item.properties.center,
-    }));
-    // 遍历特征并添加实体
-    featuresList.forEach(feature => {
-      if (!feature.position) return;
-      const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1]);
-      viewer.entities.add({
-        id: feature.id,
-        position: position,
-        label: {
-          // 随机整数
-          text: Math.floor(Math.random() * 100) + '个事件',
-          font: '14pt monospace',
-          fillColor: Cesium.Color.WHITE,
-          outlineColor: Cesium.Color.BLACK,
-          outlineWidth: 2,
-          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-          pixelOffset: new Cesium.Cartesian2(0, -9),
-        },
-        billboard: {
-          image: new Cesium.ConstantProperty(data2),
-          width: 24,
-          height: 24,
-        },
-        properties: {
-          id: feature.id,
-          customData: {
-            name: feature.name,
-          },
-        },
-      });
-    });
-    // 加载新的 GeoJSON 数据
-    Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
-      viewer.dataSources.add(dataSource);
-      item.dataSource = dataSource; // 保存数据源以便后续删除
-      // 获取数据源中的实体
-      const entities = dataSource.entities.values;
-      entities.forEach(entity => {
-        entity.polygon.material = new Cesium.ColorMaterialProperty(
-          Cesium.Color.YELLOW.withAlpha(0) // 透明填充
-        );
-        entity.polygon.outline = new Cesium.ConstantProperty(true); // 显示边框
-        entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.YELLOW); // 黑色边框
-      });
-    });
-  };
+	// 聚合机巢
+	const aggregation = item => {
+		const featuresList = item.gJson.features.map(item => ({
+			name: item.properties.name,
+			position: item.properties.center,
+		}))
+		// 遍历特征并添加实体
+		featuresList.forEach(feature => {
+			if (!feature.position) return
+			const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1])
+			viewer.entities.add({
+				id: feature.id,
+				position: position,
+				label: {
+					// 随机整数
+					text: Math.floor(Math.random() * 100) + '个事件',
+					font: '14pt monospace',
+					fillColor: Cesium.Color.WHITE,
+					outlineColor: Cesium.Color.BLACK,
+					outlineWidth: 2,
+					style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+					verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+					pixelOffset: new Cesium.Cartesian2(0, -9),
+				},
+				billboard: {
+					image: new Cesium.ConstantProperty(data2),
+					width: 24,
+					height: 24,
+				},
+				properties: {
+					id: feature.id,
+					customData: {
+						name: feature.name,
+					},
+				},
+			})
+		})
+		// 加载新的 GeoJSON 数据
+		Cesium.GeoJsonDataSource.load(item.gJson).then(dataSource => {
+			viewer.dataSources.add(dataSource)
+			item.dataSource = dataSource // 保存数据源以便后续删除
+			// 获取数据源中的实体
+			const entities = dataSource.entities.values
+			entities.forEach(entity => {
+				entity.polygon.material = new Cesium.ColorMaterialProperty(
+					Cesium.Color.YELLOW.withAlpha(0) // 透明填充
+				)
+				entity.polygon.outline = new Cesium.ConstantProperty(true) // 显示边框
+				entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.YELLOW) // 黑色边框
+			})
+		})
+	}
 
-  // 获取弹框box
-  const getLabelDom = () => {
-    const vNode = h(EventPopUpBox, { data: '参数', removeLabel });
-    const tooltipContainer = document.createElement('div');
-    tooltipContainer.id = 'mapPopUpBox';
-    tooltipContainer.style.position = 'absolute';
-    tooltipContainer.style.transform = 'translate(-50%,-110%)';
-    tooltipContainer.style.pointerEvents = 'none';
-    document.querySelector('.page-index').append(tooltipContainer);
-    render(vNode, tooltipContainer);
-    return tooltipContainer;
-  };
+	// 获取弹框box
+	const getLabelDom = () => {
+		const vNode = h(EventPopUpBox, { data: '参数', removeLabel })
+		const tooltipContainer = document.createElement('div')
+		tooltipContainer.id = 'mapPopUpBox'
+		tooltipContainer.style.position = 'absolute'
+		tooltipContainer.style.transform = 'translate(-50%,-110%)'
+		tooltipContainer.style.pointerEvents = 'none'
+		document.querySelector('.page-index').append(tooltipContainer)
+		render(vNode, tooltipContainer)
+		return tooltipContainer
+	}
 
-  // 弹框位置刷新
-  const labelBox = () => {
-    store.commit('setSingleUavHome', {
-      id: '123'
-    });
-    let dom = document.querySelector('#mapPopUpBox');
-    if (!dom) {
-      dom = getLabelDom();
-    }
-    const screenPosition = viewer.scene.cartesianToCanvasCoordinates(positionC3);
-    if (screenPosition) {
-      dom.style.left = `${screenPosition.x}px`;
-      dom.style.top = `${screenPosition.y}px`;
-      dom.style.display = 'block';
-    }
-  };
+	// 弹框位置刷新
+	const labelBox = () => {
+		store.commit('setSingleUavHome', {
+			id: '123',
+		})
+		let dom = document.querySelector('#mapPopUpBox')
+		if (!dom) {
+			dom = getLabelDom()
+		}
+		const screenPosition = viewer.scene.cartesianToCanvasCoordinates(positionC3)
+		if (screenPosition) {
+			dom.style.left = `${screenPosition.x}px`
+			dom.style.top = `${screenPosition.y}px`
+			dom.style.display = 'block'
+		}
+	}
 
-  // 左键单机事件
-  const singleMachineEvent = click => {
-    const pickedObject = viewer.scene.pick(click.position);
-    if (Cesium.defined(pickedObject) && pickedObject.id) {
-      const entity = pickedObject.id;
-      positionC3 = entity?.position?._value;
-      if (!positionC3) return;
-      viewer.scene.postRender.removeEventListener(labelBox);
-      viewer.scene.postRender.addEventListener(labelBox);
-    }
-  };
+	// 左键单机事件
+	const singleMachineEvent = click => {
+		const pickedObject = viewer.scene.pick(click.position)
+		if (Cesium.defined(pickedObject) && pickedObject.id) {
+			const entity = pickedObject.id
+			positionC3 = entity?.position?._value
+			if (!positionC3) return
+			viewer.scene.postRender.removeEventListener(labelBox)
+			viewer.scene.postRender.addEventListener(labelBox)
+		}
+	}
 
-  // 移除 点 和 gjson 实体
-  const removeEntities = () => {
-    viewer.dataSources?.removeAll(true);
-    viewer.entities?.removeAll();
-  };
-  // 移除弹框标签
-  const removeLabel = () => {
-    viewer.scene.postRender.removeEventListener(labelBox);
-    const dom = document.querySelector('#mapPopUpBox');
-    if (dom && dom.parentNode) {
-      dom.parentNode.removeChild(dom);
-    }
-  };
+	// 移除 点 和 gjson 实体
+	const removeEntities = () => {
+		viewer.dataSources?.removeAll(true)
+		viewer.entities?.removeAll()
+	}
+	// 移除弹框标签
+	const removeLabel = () => {
+		viewer.scene.postRender.removeEventListener(labelBox)
+		const dom = document.querySelector('#mapPopUpBox')
+		if (dom && dom.parentNode) {
+			dom.parentNode.removeChild(dom)
+		}
+	}
 
-  // 移除所有监听事件,变量置空
-  const removeAll = () => {
-    removeEntities();
-    removeLabel();
-    viewer.camera.moveEnd.removeEventListener(determineScaling);
-    handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
-    handler?.destroy();
-    viewer = null;
-    active = null
-    handler = null;
-    positionC3 = null;
-  };
-  const init = () => {
-    viewer = window.$viewer;
-    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
-    handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-    listenerHeight();
-  };
-  // onMounted(() => {
-  //   nextTick(() => {
-  //     viewer = window.$viewer;
-  //     handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
-  //     handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-  //     listenerHeight();
-  //   });
-  // });
+	// 移除所有监听事件,变量置空
+	const removeAll = () => {
+		removeEntities()
+		removeLabel()
+		viewer.camera.moveEnd.removeEventListener(determineScaling)
+		handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+		handler?.destroy()
+		viewer = null
+		active = null
+		handler = null
+		positionC3 = null
+	}
+	const init = () => {
+		viewer = window.$viewer
+		handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
+		handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK)
+		listenerHeight()
+	}
+	// onMounted(() => {
+	//   nextTick(() => {
+	//     viewer = window.$viewer;
+	//     handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
+	//     handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+	//     listenerHeight();
+	//   });
+	// });
 
-  return { init,removeAll };
-};
+	return { init, removeAll }
+}
diff --git a/src/views/Home/useUavHome/MapPopUpBox.vue b/src/views/Home/useUavHome/DevicePopUpBox.vue
similarity index 100%
rename from src/views/Home/useUavHome/MapPopUpBox.vue
rename to src/views/Home/useUavHome/DevicePopUpBox.vue
diff --git a/src/views/Home/useUavHome/useUavHome.js b/src/views/Home/useUavHome/useUavHome.js
index 655b589..3c8b93c 100644
--- a/src/views/Home/useUavHome/useUavHome.js
+++ b/src/views/Home/useUavHome/useUavHome.js
@@ -1,31 +1,51 @@
 import * as Cesium from 'cesium';
 import aggregationImg from '@/assets/images/home/useUavHome/aggregation.png';
 import uavImg from '@/assets/images/home/useUavHome/uavImg.png';
-import MapPopUpBox from '@/views/Home/useUavHome/MapPopUpBox.vue';
+
+import eventImg from '@/assets/images/home/useEventOperate/event.png';
+
+import DevicePopUpBox from '@/views/Home/useUavHome/DevicePopUpBox.vue';
+import EventPopUpBox from '@/views/Home/useEventOperate/EventPopUpBox.vue';
+
 import { render } from 'vue';
 import { useStore } from 'vuex';
 import { getCenterPoint } from '@/utils/cesium/mapUtil';
 import cesiumOperation from '@/utils/cesium-tsa';
-import { HeadingPitchRange } from 'cesium';
-import { getDeviceRegion, getDeviceRegionCount } from '@/api/home/aggregation';
-
+import { getDeviceRegion, getDeviceRegionCount, getEventDetails, getMapEvents } from '@/api/home/aggregation';
 
 /**
  * 机巢聚合功能
  */
-export const useUavHome = () => {
+export const useUavHome = type => {
   const { flyTo } = cesiumOperation();
 
+  const singleImg = type === 'device' ? uavImg : eventImg;
+  const mergeImg = type === 'device' ? aggregationImg : aggregationImg;
+  const MapPopUpBox = type === 'device' ? DevicePopUpBox : EventPopUpBox;
+  const styleTransform = type === 'device' ? 'translateY(-50%)' : 'translate(-50%,-110%)';
+
   let scalingJudgment = [
-    { name: '县', splashedList: [], gJson: null, show: false,outline:{}, value: [0, 48651], height: 31753 },
-    { name: '市', splashedList: [], gJson: null, show: false,outline:{}, value: [48651, 314863], height: 257731 },
-    { name: '省', splashedList: [], gJson: null, show: false,outline:{}, value: [314863, 3796280000], height: 1987280 },
+    { name: '县', splashedList: [], gJson: null, show: false, outline: {}, value: [0, 48651], height: 31753 },
+    { name: '市', splashedList: [], gJson: null, show: false, outline: {}, value: [48651, 314863], height: 257731 },
+    {
+      name: '省',
+      splashedList: [],
+      gJson: null,
+      show: false,
+      outline: {},
+      value: [314863, 3796280000],
+      height: 1987280,
+    },
   ];
   let viewer = null;
   let active = null;
   let handler = null;
   let positionC3 = null;
   let currentEntity = null;
+
+  const store = useStore();
+  const userAreaCode = computed(() => store.state.user.userInfo.detail.areaCode);
+  const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
   const listenerHeight = () => {
     determineScaling();
     viewer.camera.moveEnd.addEventListener(determineScaling);
@@ -44,8 +64,8 @@
         active = item.name;
         removeEntities();
         removeLabel();
-        item.gJson ?  aggregation(item) :  splashed(item)
-        renderOutline(item)
+        item.gJson ? aggregation(item) : splashed(item);
+        renderOutline(item);
         break;
       }
     }
@@ -63,100 +83,134 @@
     return [provinceCode, cityCode, code];
   }
 
-  const store = useStore();
-  const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
-
   function getDeviceCount(areaCode) {
-    return getDeviceRegionCount({areaCode}).then(res => {
-      return res?.data?.data || [];
+    return getDeviceRegionCount({ areaCode }).then(res => {
+      return (res?.data?.data || []).map(i=>({...i,type:'deviceAggregation'}));
     });
   }
 
   function getDeviceList(areaCode) {
-    return getDeviceRegion({areaCode}).then(res => {
-      return res?.data?.data || [];
+    return getDeviceRegion({ areaCode }).then(res => {
+      return (res?.data?.data || []).map(i =>({...i,type}));
     });
   }
+
+  let eventList = []
+  function processChildren(childrens) {
+    return (childrens || []).map(item => {
+      const arr = processChildren(item.childrens);
+      if (item.data){
+        eventList = eventList.concat(item.data)
+      }
+      const returnObj = {
+        total_device_count: item.number,
+        region_code: item.id,
+        region_name: item.name,
+        type:'eventAggregation'
+      };
+      if (arr.length !== 0) {
+        returnObj.childrens = arr;
+      }
+      return returnObj;
+    });
+  }
+
+  function getMapEventCount(areaCode) {
+    return getMapEvents({ areaCode }).then(res => {
+      return processChildren(res?.data?.data?.childrens || []);
+    });
+  }
+  function getEventDetailsFun(areaCode){
+    return getEventDetails({areaCode}).then(res => {
+      console.log(res.data.data,'getEventDetailsFun');
+    });
+  }
+
   const findFun = (featItem, numItem) => Number(featItem.region_code.slice(0, 6)) === numItem.properties.adcode;
   const { VITE_APP_BASE } = import.meta.env;
   const defaultDir = `${VITE_APP_BASE}public/geoJson/100000/`;
 
-  const getFiler = async (url) => {
+  const getFiler = async url => {
     const gJson = await import(/* @vite-ignore */ url);
     return JSON.parse(JSON.stringify(gJson));
-  }
-  const getOutLine = async (jsonPathPre,hierarchy) => {
-    const parentGJson = await getFiler(`${defaultDir}${jsonPathPre}/index.json`)
+  };
+  const getOutLine = async (jsonPathPre, hierarchy) => {
+    const parentGJson = await getFiler(`${defaultDir}${jsonPathPre}/index.json`);
     let features = parentGJson.features.find(
       item => item.properties.adcode === Number(hierarchy[hierarchy.length - 1])
     );
-    return  { type: "FeatureCollection", features: [features] }
-  }
+    return { type: 'FeatureCollection', features: [features] };
+  };
 
-  const injectData = (gJson,dataList) => {
+  const injectData = (gJson, dataList) => {
     return {
       ...gJson,
       features: gJson.features.map(item => ({ ...item, data: dataList.find(item1 => findFun(item1, item)) })),
+    };
+  };
+
+  const initMapData = async areaCode => {
+    if (!areaCode) return;
+    const list = type === 'device' ? await getDeviceCount(areaCode) : await getMapEventCount(areaCode);
+    const splashedList = type === 'device'
+      ? await getDeviceList(areaCode)
+      : eventList.map(i=>({eventId:i.id,latitude:Number(i.latitude),longitude:Number(i.longitude),type:'event'}))
+    console.log(list, 'list');
+    console.log(splashedList, 'splashedList');
+    const hierarchy = convertToHierarchy(areaCode.slice(0, 6));
+    const jsonPath = hierarchy.join('/');
+    const jsonPathPre = hierarchy.slice(0, hierarchy.length - 1).join('/');
+    scalingJudgment = scalingJudgment.map(item => ({ ...item, show: true }));
+    scalingJudgment[0].gJson = null;
+    scalingJudgment[0].splashedList = splashedList;
+    active = null;
+    console.log(hierarchy);
+
+    // 省
+    if (hierarchy.length === 1) {
+      const gJson1 = await getFiler(`${defaultDir}${jsonPath}/indexDistrict.json`);
+      const gJson2 = await getFiler(`${defaultDir}${jsonPath}/index.json`);
+      scalingJudgment[1].gJson = {
+        ...gJson1,
+        features: gJson1.features.map(item => ({
+          ...item,
+          data: list.flatMap(item => item.childrens || []).find(item1 => findFun(item1, item)),
+        })),
+      };
+      scalingJudgment[2].gJson = injectData(gJson2, list);
+      const { lng, lat } = getCenterPoint(gJson2.features.map(item => item.properties.center));
+      flyTo({ longitude: lng, latitude: lat }, 0, scalingJudgment[2].height);
     }
-  }
-
-
+    // 市
+    if (hierarchy.length === 2) {
+      scalingJudgment[2].gJson = null;
+      scalingJudgment[2].show = false;
+      const gJson1 = await getFiler(`${defaultDir}${jsonPath}/index.json`);
+      scalingJudgment[1].gJson = injectData(gJson1, list);
+      const center = getCenterPoint(gJson1.features.map(item => item.properties.center));
+      flyTo({ longitude: center.lng, latitude: center.lat }, 0, scalingJudgment[1].height);
+    }
+    // 区县
+    if (hierarchy.length === 3) {
+      scalingJudgment[1].gJson = null;
+      scalingJudgment[1].show = false;
+      scalingJudgment[2].gJson = null;
+      scalingJudgment[2].show = false;
+      const outlineGJson = await getOutLine(jsonPathPre, hierarchy);
+      const center = outlineGJson.features[0].properties.center;
+      flyTo({ longitude: center[0], latitude: center[1] }, 0, scalingJudgment[0].height);
+    }
+    // 轮廓
+    const outlineGJson = await getOutLine(jsonPathPre, hierarchy);
+    scalingJudgment.forEach(item => item.show && (item.outline = outlineGJson));
+  };
 
   watch(
     selectedAreaCode,
     async (newValue, oldValue) => {
-      if (newValue) {
-        const list = await getDeviceCount(newValue);
-        const splashedList = await getDeviceList(newValue);
-        console.log(list);
-        console.log(splashedList);
-        const hierarchy = convertToHierarchy(newValue.slice(0, 6));
-        const jsonPath = hierarchy.join('/');
-        const jsonPathPre = hierarchy.slice(0, hierarchy.length - 1).join('/');
-        scalingJudgment = scalingJudgment.map(item => ({ ...item, show: true }));
-        scalingJudgment[0].gJson = null;
-        scalingJudgment[0].splashedList = splashedList;
-        active = null
-        // 省
-        if (hierarchy.length === 1) {
-          const gJson1 = await getFiler(`${defaultDir}${jsonPath}/indexDistrict.json`)
-          const gJson2 = await getFiler(`${defaultDir}${jsonPath}/index.json`)
-          scalingJudgment[1].gJson = {
-            ...gJson1,
-            features: gJson1.features.map(item => ({
-              ...item,
-              data: list.flatMap(item => item.childrens || []).find(item1 => findFun(item1, item)),
-            })),
-          };
-          scalingJudgment[2].gJson = injectData(gJson2,list);
-          const { lng, lat } = getCenterPoint(gJson2.features.map(item => item.properties.center));
-          flyTo({ longitude: lng, latitude: lat }, 0, scalingJudgment[2].height);
-        }
-        // 市
-        if (hierarchy.length === 2) {
-          scalingJudgment[2].gJson = null;
-          scalingJudgment[2].show = false;
-          const gJson1 = await getFiler(`${defaultDir}${jsonPath}/index.json`)
-          scalingJudgment[1].gJson = injectData(gJson1,list);
-          const center = getCenterPoint(gJson1.features.map(item => item.properties.center));
-          flyTo({ longitude: center.lng, latitude: center.lat }, 0, scalingJudgment[1].height);
-        }
-        // 区县
-        if (hierarchy.length === 3) {
-          scalingJudgment[1].gJson = null;
-          scalingJudgment[1].show = false;
-          scalingJudgment[2].gJson = null;
-          scalingJudgment[2].show = false;
-          const outlineGJson = await getOutLine(jsonPathPre,hierarchy)
-          const center = outlineGJson.features[0].properties.center;
-          flyTo({ longitude: center[0], latitude: center[1] }, 0, scalingJudgment[0].height);
-        }
-        // 轮廓
-        const outlineGJson = await getOutLine(jsonPathPre,hierarchy)
-        scalingJudgment.forEach(item => item.show &&(item.outline = outlineGJson))
-      }
+      initMapData(newValue);
     },
-    { immediate: true, deep: true }
+    { deep: true }
   );
 
   //散点机巢
@@ -176,7 +230,7 @@
           pixelOffset: new Cesium.Cartesian2(0, -9),
         },
         billboard: {
-          image: new Cesium.ConstantProperty(uavImg),
+          image: new Cesium.ConstantProperty(singleImg),
           width: 24,
           height: 24,
         },
@@ -190,8 +244,9 @@
   }
 
   // 渲染轮廓
-  const renderOutline = (item) => {
-    item.outline && Cesium.GeoJsonDataSource.load(item.outline).then(dataSource => {
+  const renderOutline = item => {
+    item.outline &&
+    Cesium.GeoJsonDataSource.load(item.outline).then(dataSource => {
       viewer.dataSources.add(dataSource);
       const entities = dataSource.entities.values;
       entities.forEach(entity => {
@@ -206,10 +261,10 @@
             width: 5, // 直接设置宽度
             material: new Cesium.PolylineGlowMaterialProperty({
               glowPower: 0.5,
-              color: Cesium.Color.AQUA
+              color: Cesium.Color.AQUA,
             }),
-            clampToGround: true // 贴地显示
-          }
+            clampToGround: true, // 贴地显示
+          },
         });
       });
     });
@@ -239,20 +294,20 @@
           style: Cesium.LabelStyle.FILL_AND_OUTLINE,
           verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
           pixelOffset: new Cesium.Cartesian2(0, -9),
-        }
+        },
       });
       viewer.entities.add({
         id: feature.id,
         position: position,
         label: {
-          text: feature.data.total_device_count,
+          text: feature.data.total_device_count.toString(),
           font: '12pt Source Han Sans CN',
           fillColor: Cesium.Color.BLACK,
           style: Cesium.LabelStyle.FILL_AND_OUTLINE,
           eyeOffset: new Cesium.Cartesian3(0, 0, -10), // 让label "浮" 在广告牌前面
         },
         billboard: {
-          image: new Cesium.ConstantProperty(aggregationImg),
+          image: new Cesium.ConstantProperty(mergeImg),
           width: 35,
           height: 35,
         },
@@ -276,17 +331,17 @@
           Cesium.Color.YELLOW.withAlpha(0) // 透明填充
         );
         entity.polygon.outline = new Cesium.ConstantProperty(true); // 显示边框
-        entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.AQUAMARINE );
+        entity.polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.AQUAMARINE);
       });
       flyTo &&
-        viewer.flyTo(dataSource, {
-          offset: new Cesium.HeadingPitchRange(
-            0, // heading: 0 (朝向不变)
-            Cesium.Math.toRadians(-90), // pitch: -90° (垂直向下)
-            0 // range: 0 (默认距离)
-          ),
-          duration: 0.5,
-        });
+      viewer.flyTo(dataSource, {
+        offset: new Cesium.HeadingPitchRange(
+          0, // heading: 0 (朝向不变)
+          Cesium.Math.toRadians(-90), // pitch: -90° (垂直向下)
+          0 // range: 0 (默认距离)
+        ),
+        duration: 0.5,
+      });
     });
   };
 
@@ -296,7 +351,7 @@
     const tooltipContainer = document.createElement('div');
     tooltipContainer.id = 'mapPopUpBox';
     tooltipContainer.style.position = 'absolute';
-    tooltipContainer.style.transform = 'translateY(-50%)';
+    tooltipContainer.style.transform = styleTransform;
     tooltipContainer.style.pointerEvents = 'none';
     document.querySelector('.page-index').append(tooltipContainer);
     render(vNode, tooltipContainer);
@@ -326,13 +381,23 @@
       positionC3 = entity?.position?._value;
       if (!positionC3) return;
       removeLabel();
-      const customData = entity.properties.customData._value.data
-      console.log(customData);
-      if (customData.device_sn){
-        store.commit('setSingleUavHome', { id: '123' });
-        return
+      const customData = entity.properties.customData._value.data;
+
+      switch (customData.type) {
+        case 'deviceAggregation':
+          viewer.scene.postRender.addEventListener(labelBoxRender);
+          break;
+        case 'device':
+          store.commit('setSingleUavHome', { id: '123' });
+          break;
+        case 'eventAggregation':
+          break;
+        case 'event':
+          viewer.scene.postRender.addEventListener(labelBoxRender);
+          break;
+        default:
+          break;
       }
-      viewer.scene.postRender.addEventListener(labelBoxRender);
     }
   };
 
@@ -368,11 +433,13 @@
     currentEntity = null;
   };
   const init = () => {
+    initMapData(selectedAreaCode.value || userAreaCode.value);
     viewer = window.$viewer;
     handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
     handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
     listenerHeight();
   };
+  onBeforeUnmount(() => {});
   // onMounted(() => {
   //   nextTick(() => {
   //     viewer = window.$viewer;
diff --git a/src/websocket/index.js b/src/websocket/index.js
index f5732b8..da0a2e0 100644
--- a/src/websocket/index.js
+++ b/src/websocket/index.js
@@ -1,4 +1,4 @@
-import ReconnectingWebSocket from 'reconnecting-websocket';
+import ReconnectingWebSocket from 'reconnecting-websocket'
 
 /**
  * ConnectWebSocket 类
@@ -6,69 +6,69 @@
  */
 
 class ConnectWebSocket {
-    _url;
-    _socket;
-    _hasInit;
-    _messageHandler;
+	_url
+	_socket
+	_hasInit
+	_messageHandler
 
-    constructor(url) {
-        this._url = url;
-        this._socket = null;
-        this._hasInit = false;
-        this._messageHandler = null;
-    }
+	constructor(url) {
+		this._url = url
+		this._socket = null
+		this._hasInit = false
+		this._messageHandler = null
+	}
 
-    initSocket() {
-        if (this._hasInit) {
-            return;
-        }
-        if (!this._url) {
-            return;
-        }
-        // 会自动重连,无需处理重连逻辑
-        this._socket = new ReconnectingWebSocket(this._url, [], {
-            maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
-            minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
-            maxRetries: 5,
-        });
-        this._hasInit = true;
+	initSocket() {
+		if (this._hasInit) {
+			return
+		}
+		if (!this._url) {
+			return
+		}
+		// 会自动重连,无需处理重连逻辑
+		this._socket = new ReconnectingWebSocket(this._url, [], {
+			maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
+			minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
+			maxRetries: 5,
+		})
+		this._hasInit = true
 
-        this._socket.addEventListener('open', this._onOpen.bind(this));
-        this._socket.addEventListener('close', this._onClose.bind(this));
-        this._socket.addEventListener('error', this._onError.bind(this));
-        this._socket.addEventListener('message', this._onMessage.bind(this));
-    }
+		this._socket.addEventListener('open', this._onOpen.bind(this))
+		this._socket.addEventListener('close', this._onClose.bind(this))
+		this._socket.addEventListener('error', this._onError.bind(this))
+		this._socket.addEventListener('message', this._onMessage.bind(this))
+	}
 
-    _onOpen() {
-        console.log('连接成功');
-    }
+	_onOpen() {
+		console.log('连接成功')
+	}
 
-    _onClose() {
-        console.log('连接已断开');
-    }
+	_onClose() {
+		console.log('连接已断开')
+	}
 
-    _onError() {
-        console.log('连接 error');
-    }
+	_onError() {
+		console.log('连接 error')
+	}
 
-    registerMessageHandler(messageHandler) {
-        this._messageHandler = messageHandler;
-    }
+	registerMessageHandler(messageHandler) {
+		this._messageHandler = messageHandler
+	}
 
-    _onMessage(msg) {
-        // const data = JSON.parse(msg.data);
-        this._messageHandler && this._messageHandler(msg.data);
-    }
+	_onMessage(msg) {
+		// const data = JSON.parse(msg.data);
+		this._messageHandler && this._messageHandler(msg.data)
+	}
 
-    sendMessage = (message) => {
-        // 目前只供AI聊天使用
-        this._socket?.send(message)
-        // this._socket?.send(JSON.stringify(message.data));
-    };
+	sendMessage = message => {
+		// 目前只供AI聊天使用
+		this._socket?.send(message)
+		// this._socket?.send(JSON.stringify(message.data));
+	}
 
-    close() {
-        this._socket?.close();
-    }
+	close() {
+		this._socket?.close()
+	}
 }
 
-export default ConnectWebSocket;
+export default ConnectWebSocket
diff --git a/src/websocket/util/config.js b/src/websocket/util/config.js
index cd1b9ce..a8a19a8 100644
--- a/src/websocket/util/config.js
+++ b/src/websocket/util/config.js
@@ -1,14 +1,13 @@
-import { ELocalStorageKey } from '@/utils/http/enums';
+import { ELocalStorageKey } from '@/utils/http/enums'
 
 export function getWebsocketUrl() {
-    const token = localStorage.getItem(ELocalStorageKey.Token) || '';
-    const url =
-        import.meta.env.VITE_APP_WS_API_URL + '?x-auth-token=' + encodeURI(token);
-    return url;
+	const token = localStorage.getItem(ELocalStorageKey.Token) || ''
+	const url = import.meta.env.VITE_APP_WS_API_URL + '?x-auth-token=' + encodeURI(token)
+	return url
 }
 // AI 指令飞行
 export function getAIWebsocketUrl() {
-    const token = localStorage.getItem(ELocalStorageKey.Token) || '';
-    const url = `${import.meta.env.VITE_APP_WS_API_URL}?x-auth-token=${encodeURI(token)}`
-    return url;
-}
\ No newline at end of file
+	const token = localStorage.getItem(ELocalStorageKey.Token) || ''
+	const url = `${import.meta.env.VITE_APP_WS_API_URL}?x-auth-token=${encodeURI(token)}`
+	return url
+}

--
Gitblit v1.9.3