From 11433d0f47eae3403e883fc26d72269b930235f2 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Mon, 11 Sep 2023 16:51:20 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/develop' into develop

---
 src/mqtt/config.ts                                        |    7 
 src/pages/page-web/projects/common/common.ts              |    6 
 env/.env.stag                                             |    3 
 src/components/Drawer/Drawer.vue                          |   18 
 src/pages/page-web/projects/tsa.vue                       |   58 ++-
 src/websocket/index.ts                                    |    8 
 src/hooks/use-center-point.ts                             |    3 
 src/pages/page-web/projects/components/DockConfig.vue     |  282 ++++++++++++++++
 env/.env.production                                       |    3 
 env/.env                                                  |    3 
 src/mqtt/index.ts                                         |    5 
 src/pages/page-web/projects/project_list/add_page/add.vue |   22 
 src/pages/page-web/home.vue                               |    5 
 src/main.ts                                               |    2 
 src/styles/flex.style.scss                                |   17 
 src/api/http/config.ts                                    |    7 
 src/api/pilot-bridge.ts                                   |    3 
 yarn.lock                                                 |  424 ++++++++++++++++++++----
 src/components/cesiumMap/cesium.vue                       |  100 ++++-
 src/websocket/util/config.ts                              |    3 
 package.json                                              |    2 
 src/pages/page-web/projects/workspace.vue                 |    5 
 22 files changed, 827 insertions(+), 159 deletions(-)

diff --git a/env/.env b/env/.env
index 47efef8..edbd2bd 100644
--- a/env/.env
+++ b/env/.env
@@ -1,3 +1,4 @@
 VITE_APP_ENVIRONMENT=DEV
 VITE_APP_APIGATEWAY_BACKEND_HOST=''
-VITE_HTTP = 'http://172.16.13.129:8100'
\ No newline at end of file
+VITE_HTTP = 'http://172.16.13.129:8100'
+VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
\ No newline at end of file
diff --git a/env/.env.production b/env/.env.production
index a76530f..22c939b 100644
--- a/env/.env.production
+++ b/env/.env.production
@@ -1,3 +1,4 @@
 VITE_APP_ENVIRONMENT=production
 VITE_APP_APIGATEWAY_BACKEND_HOST=''
-VITE_HTTP = 'http://172.16.13.129:8100'
\ No newline at end of file
+VITE_HTTP = 'http://172.16.13.129:8100'
+VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
\ No newline at end of file
diff --git a/env/.env.stag b/env/.env.stag
index 276f95b..8aa5141 100644
--- a/env/.env.stag
+++ b/env/.env.stag
@@ -10,4 +10,5 @@
 ### 
 VITE_APP_ENVIRONMENT=STAG
 VITE_APP_APIGATEWAY_BACKEND_HOST=''
-VITE_HTTP = 'http://172.16.13.129:8100'
\ No newline at end of file
+VITE_HTTP = 'http://172.16.13.129:8100'
+VITE_CESIUM_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
\ No newline at end of file
diff --git a/package.json b/package.json
index ddad0b4..26da358 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
     "axios": "^0.21.1",
     "eventemitter3": "^5.0.0",
     "mitt": "^3.0.0",
-    "mqtt": "^4.3.7",
+    "mqtt": "4.0.1",
     "query-string": "^7.0.1",
     "reconnecting-websocket": "^4.4.0",
     "vconsole": "^3.8.1",
diff --git a/src/api/http/config.ts b/src/api/http/config.ts
index fd8ecbf..0915e36 100644
--- a/src/api/http/config.ts
+++ b/src/api/http/config.ts
@@ -1,8 +1,8 @@
 /*
  * @Author: 胡思旗 931347610@qq.com
  * @Date: 2023-08-22 09:55:39
- * @LastEditors: 胡思旗 931347610@qq.com
- * @LastEditTime: 2023-08-29 14:59:18
+ * @LastEditors: husq 931347610@qq.com
+ * @LastEditTime: 2023-09-11 12:04:07
  * @FilePath: \Cloud-API-Demo-Web\src\api\http\config.ts
  * @Description:
  *
@@ -19,7 +19,8 @@
   // http://172.16.13.64:8100
   baseURL: 'http://172.16.13.129:8100', // This url must end with "/". Example: 'http://192.168.1.1:6789/'
   // ws://172.16.13.129:6789/api/v1/ws
-  websocketURL: '', // Example: 'ws://192.168.1.1:6789/api/v1/ws'
+  // ws://192.168.1.198:1883/
+  websocketURL: 'ws://192.168.1.198:8600/drone/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.
diff --git a/src/api/pilot-bridge.ts b/src/api/pilot-bridge.ts
index 61bdf4e..86af3e2 100644
--- a/src/api/pilot-bridge.ts
+++ b/src/api/pilot-bridge.ts
@@ -1,5 +1,5 @@
 import { message } from 'ant-design-vue'
-import { EComponentName, EPhotoType, ERouterName } from '../types'
+import { EComponentName, ELocalStorageKey, EPhotoType, ERouterName } from '../types'
 import { CURRENT_CONFIG } from './http/config'
 import { EVideoPublishType, LiveStreamStatus } from '../types/live-stream'
 import { getRoot } from '/@/root'
@@ -93,6 +93,7 @@
       userName: '',
       elementPreName: 'PILOT'
     }
+    const token = localStorage.getItem(ELocalStorageKey.Token)
     components.set(EComponentName.Map, mapParam)
     const wsParam: WsParam = {
       host: CURRENT_CONFIG.websocketURL,
diff --git a/src/components/Drawer/Drawer.vue b/src/components/Drawer/Drawer.vue
index 896aa5b..f86da93 100644
--- a/src/components/Drawer/Drawer.vue
+++ b/src/components/Drawer/Drawer.vue
@@ -1,6 +1,6 @@
 <template>
-    <div class="drawer" :class="[show ? 'active':'none']" v-show="show">
-        <div class="side-header">
+    <div class="drawer" :style="[styleDrawer]" :class="[show ? 'active':'none']" v-show="show">
+        <div v-if="isHeader" class="side-header">
             <div class="side-option flex-display flex-align-center flex-justify-between">
                 <h2 class="title">{{ title }}</h2>
                 <CloseOutlined @click="close" />
@@ -21,7 +21,19 @@
   },
   title: {
     type: String,
-    required: true
+    // required: true
+  },
+  // 是否显示头部
+  isHeader: {
+    type: Boolean,
+    default: true
+  },
+  // 定位css
+  styleDrawer: {
+    type: Object,
+    default: () => ({
+      top: 0
+    })
   }
 })
 const emits = defineEmits(['update:show'])
diff --git a/src/components/cesiumMap/cesium.vue b/src/components/cesiumMap/cesium.vue
index 7f9175d..110559e 100644
--- a/src/components/cesiumMap/cesium.vue
+++ b/src/components/cesiumMap/cesium.vue
@@ -2,7 +2,7 @@
  * @Author: 胡思旗 931347610@qq.com
  * @Date: 2023-08-22 17:50:30
  * @LastEditors: husq 931347610@qq.com
- * @LastEditTime: 2023-09-07 16:45:18
+ * @LastEditTime: 2023-09-11 09:57:01
  * @FilePath: \Cloud-API-Demo-Web\src\components\cesiumMap\cesium.vue
  * @Description:
  *
@@ -11,26 +11,35 @@
 <template>
   <div class="height-100 width-100 cesium" id="cesiumContainer"></div>
   <div v-if="centerConfig.type && !centerConfig.latitude" class="pointLongitude">在地图上点击绘制项目中心点</div>
+  <div class="switch">
+    <div class="2d" v-if="dimension === 3" @click="switchModel('2D')">2D</div>
+    <div class="3d" v-else @click="switchModel('3D')">3D</div>
+  </div>
 </template>
 
 <script setup lang="ts">
 import * as Cesium from 'cesium'
-import { onMounted, ref, onUnmounted } from 'vue'
+import { onMounted, ref, onUnmounted, } from 'vue'
 import { pointCenter, clickPoint } from '/@/hooks/use-center-point'
 import { useMyStore } from '/@/store'
-const viewer: { value: Cesium.Viewer | null | undefined } = ref()
+let viewer: Cesium.Viewer | null = null
+let handler: Cesium.ScreenSpaceEventHandler
+const dimension = ref(3)
+const { appContext } = getCurrentInstance()
+const global = appContext.config.globalProperties
+// const viewer: { value: Cesium.Viewer | null | undefined } = ref()
 const store = useMyStore()
 const centerConfig = computed(() => {
   return store.state.map.centerConfig
 })
 const init = () => {
   // Cesium Token
-  const cesiumToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMjdmNGUxZC02YzY3LTQyZWUtOTNmYy1hNTI0MDRkZDY2ZmEiLCJpZCI6MTYxODgyLCJpYXQiOjE2OTI3NTQyNDV9.Pm7xTwPmKowPzFgJ0TsIKOtthigq86BLJX4c8M97Hhw'
+  const cesiumToken = import.meta.env.VITE_CESIUM_TOKEN
   Cesium.Ion.defaultAccessToken = cesiumToken
   Cesium.Camera.DEFAULT_VIEW_FACTOR = -0.45
   // 西南东北,默认显示中国
   Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(110, -25, 110, 90)
-  viewer.value = new Cesium.Viewer('cesiumContainer', {
+  viewer = new Cesium.Viewer('cesiumContainer', {
     infoBox: false, // 禁用沙箱,解决控制台报错
     animation: false, // 左下角的动画仪表盘
     baseLayerPicker: false, // 右上角的图层选择按钮
@@ -39,9 +48,15 @@
     sceneModePicker: false, // 模式切换按钮
     timeline: false, // 底部的时间轴
     navigationHelpButton: false, // 右上角的帮助按钮,
+    selectionIndicator: false, // 是否显示选择指示器
     baseLayer: false,
   })
+  handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
   loadLAYER()
+  viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK) // 禁用双击
+  // viewer.scene.screenSpaceCameraController.minimumZoomDistance = 100
+  viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000
+  global.$viewer = viewer
 }
 // 加载图层、注解方法
 const loadLAYER = () => {
@@ -67,7 +82,7 @@
     tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
     maximumLevel: 50,
   })
-  viewer.value?.imageryLayers.addImageryProvider(imageryProvider)
+  viewer?.imageryLayers.addImageryProvider(imageryProvider)
   // 天地图中文注记加载
   const annotation = new Cesium.WebMapTileServiceImageryProvider({
     url: TDT_ZJ,
@@ -80,12 +95,12 @@
     tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
     maximumLevel: 50,
   })
-  viewer.value?.imageryLayers.addImageryProvider(annotation)
+  viewer?.imageryLayers.addImageryProvider(annotation)
 }
 const Point = (longitude: number, latitude: number) => {
   // 移除地图所有点 重新绘制
-  viewer.value?.entities.removeAll()
-  const entity = viewer.value?.entities.add({
+  viewer?.entities.removeAll()
+  const entity = viewer?.entities.add({
     position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
     point: {
       pixelSize: 24,
@@ -100,27 +115,47 @@
   //   duration: 2
   // })
 }
+
+// 切换为二三维模式
+const switchModel = (type: string) => {
+  switch (type) {
+    case '2D':
+      viewer.scene.camera.setView({
+        orientation: {
+          pitch: Cesium.Math.toRadians(-60),
+          heading: Cesium.Math.toRadians(0),
+        }
+      })
+      dimension.value = 2
+      break
+    case '3D':
+      viewer.scene.camera.setView({
+        orientation: {
+          pitch: Cesium.Math.toRadians(-90),
+          heading: Cesium.Math.toRadians(0),
+        }
+      })
+      dimension.value = 3
+  }
+}
+
 // 设置项目中所有的项目中心坐标
-watch(() => store.state.map.pointList, (newVal, oldVal) => {
-  if (newVal) {
-    pointCenter(viewer.value, newVal)
-    clickPoint(viewer.value, newVal)
+watch(() => store.state.map.pointList, (newVal) => {
+  if (newVal && newVal.length > 0) {
+    pointCenter(viewer, newVal)
+    clickPoint(viewer, newVal)
   }
 }, {
   deep: true
 })
 // 点击地图生成项目中心点
 watch(() => store.state.map.centerConfig.type, (newVal) => {
-  const handler = new Cesium.ScreenSpaceEventHandler(viewer.value?.scene.canvas)
-  console.log(newVal, 'newVal')
-  if (newVal === false) {
-    viewer.value?.entities.removeAll()
-    console.log('===false===')
+  if (newVal === false || !store.state.map.centerConfig.type) {
+    viewer?.entities.removeAll()
     handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
   } else {
-    console.log('===true===')
     handler.setInputAction(function (e: any) {
-      const cartesian = viewer.value?.camera.pickEllipsoid(e.position, viewer.value?.scene.globe.ellipsoid)
+      const cartesian = viewer?.camera.pickEllipsoid(e.position, viewer?.scene.globe.ellipsoid)
       if (cartesian) {
         const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
         const longitude = Cesium.Math.toDegrees(cartographic.longitude)
@@ -130,7 +165,6 @@
           latitude,
         }
         store.commit('SET_CENTER_CONFIG_LATITUDE', data)
-        console.log(data, 'data')
         Point(longitude, latitude)
       }
     }, Cesium.ScreenSpaceEventType.LEFT_CLICK
@@ -144,7 +178,7 @@
 })
 // 销毁地图模型
 onUnmounted(() => {
-  viewer.value = null
+  viewer = null
 })
 
 </script>
@@ -169,4 +203,26 @@
   text-align: center;
   font-size: 16px;
 }
+
+.switch {
+  position: absolute;
+  background-color: #fff;
+  z-index: 30;
+  bottom: 80px;
+  font-size: 14px;
+  right: 20px;
+  cursor: pointer;
+  box-shadow: 0 0 4px 0 rgba(0, 0, 0, .6);
+  width: 28px;
+  height: 28px;
+  color: #4e4e4e;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.switch:hover {
+  color: #1180ff;
+}
 </style>
diff --git a/src/hooks/use-center-point.ts b/src/hooks/use-center-point.ts
index a068a2a..a1262f3 100644
--- a/src/hooks/use-center-point.ts
+++ b/src/hooks/use-center-point.ts
@@ -35,6 +35,7 @@
   const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
   handler.setInputAction(function (click: any) {
     const pickedObject = viewer.scene.pick(click.position)
+    console.log(pickedObject, 'pickObject')
     if (Cesium.defined(pickedObject)) {
       const list = longitudeList.filter((v: { id:string, longitude: number; latitude: number; }) => v.id === pickedObject.id.id)
       if (pickedObject.id.label) {
@@ -52,5 +53,5 @@
     }
   }
   , Cesium.ScreenSpaceEventType.LEFT_CLICK)
-  handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+  // handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
 }
diff --git a/src/main.ts b/src/main.ts
index cb46d6a..a9a2568 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -6,7 +6,7 @@
 import store, { storeKey } from './store'
 import { createInstance } from '/@/root'
 import '/@/styles/index.scss'
-const app = createInstance(App)
+const app = createInstance(App) // 引入css
 app.use(store, storeKey)
 app.use(router)
 app.use(CommonComponents)
diff --git a/src/mqtt/config.ts b/src/mqtt/config.ts
index 1af7df6..bc8f71d 100644
--- a/src/mqtt/config.ts
+++ b/src/mqtt/config.ts
@@ -1,4 +1,3 @@
-
 import {
   IClientOptions,
 } from 'mqtt'
@@ -9,4 +8,10 @@
   resubscribe: true, // 断开重连后,再次订阅原订阅
   reconnectPeriod: 10000, // 重连间隔时间: 5s
   keepalive: 1, // 心跳间隔时间:1s
+  clientId: 'DroneWeb',
+  // username: 'guest',
+  // password: 'guest',
+  host: '192.168.1.198',
+  protocol: 'ws',
+  port: 8083,
 }
diff --git a/src/mqtt/index.ts b/src/mqtt/index.ts
index f6570df..2028edc 100644
--- a/src/mqtt/index.ts
+++ b/src/mqtt/index.ts
@@ -34,10 +34,13 @@
       ...OPTIONS,
       ...this._options,
     })
+    console.log(this._client, 'client')
     this._hasInit = true
     if (this._client) {
       this._client.on('reconnect', this._onReconnect)
-
+      this._client.on('connect', () => {
+        console.log('connect')
+      })
       // 消息监听
       this._client.on('message', this._onMessage)
 
diff --git a/src/pages/page-web/home.vue b/src/pages/page-web/home.vue
index d8f6e82..4a73951 100644
--- a/src/pages/page-web/home.vue
+++ b/src/pages/page-web/home.vue
@@ -41,11 +41,6 @@
     }
   }
 }
-watch(route, newVal => {
-  console.log(newVal, 'val')
-}, {
-  immediate: true
-})
 // 监听ws 消息
 useConnectWebSocket(messageHandler)
 
diff --git a/src/pages/page-web/projects/common/common.ts b/src/pages/page-web/projects/common/common.ts
new file mode 100644
index 0000000..0f07c79
--- /dev/null
+++ b/src/pages/page-web/projects/common/common.ts
@@ -0,0 +1,6 @@
+export const styleDrawer = {
+  height: 'auto',
+  width: '400px',
+  top: '30px',
+  left: '70%'
+}
diff --git a/src/pages/page-web/projects/components/DockConfig.vue b/src/pages/page-web/projects/components/DockConfig.vue
new file mode 100644
index 0000000..8583483
--- /dev/null
+++ b/src/pages/page-web/projects/components/DockConfig.vue
@@ -0,0 +1,282 @@
+<template>
+    <div class="config_dock">
+        <div class="w100 option flex-display">
+            <div class="option-left-icon flex-display">
+                <RobotOutlined :style="{ fontSize: '48px' }" />
+                <div style="margin-top: 10px;">Dock</div>
+            </div>
+            <div class="option-right">
+                <div class="wrapper">
+                    <div class="wrapper-item flex-display">
+                        <span class="item-left">设备空闲中</span>
+                        <span class="item-right dock-status">当前正常</span>
+                    </div>
+
+                    <div class="wrapper-item  flex-display">
+                        <div class="item-left">
+                            <CloudOutlined />
+                            <span>正常</span>
+                        </div>
+                        <div class="item-right flex-display flex-align-center">
+                            <span class="mr20">
+                                <ThunderboltOutlined />
+                                34°C
+                            </span>
+                            <span class="mr20">
+                                <FundProjectionScreenOutlined />
+                                436kb/s
+                            </span>
+                            <span class="mr20">
+                                <UploadOutlined />
+                                0
+                            </span>
+                        </div>
+                    </div>
+                </div>
+                <div class="option-btn flex-display flex-justify-between">
+                    <div class="btn">
+                        <a-button type="primary" @click="videoControl = !videoControl" :class="{ unchecked: !videoControl }"
+                            style="width: 100%;">
+                            <template #icon>
+                                <VideoCameraOutlined />
+                            </template>
+                            监控
+                        </a-button>
+                    </div>
+                    <div class="btn">
+                        <a-button type="primary" @click="optionControl = !optionControl"
+                            :class="{ unchecked: !optionControl }" style="width: 100%;">
+                            <template #icon>
+                                <ToolOutlined />
+                            </template>
+                            操作
+                        </a-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="video">
+            <!-- <div class="video-option">
+                <a-tooltip title="关闭补光灯"></a-tooltip>
+            </div> -->
+            <video auto src="https://cdn.jsdelivr.net/gh/xdlumia/files/video-play/IronMan.mp4"
+                style="width: 100%;height: 200px;"></video>
+        </div>
+        <div class="w100 option flex-display aerial">
+            <div class="option-left-icon flex-display">
+                <RobotOutlined :style="{ fontSize: '48px' }" />
+                <div style="margin-top: 10px;">Dock</div>
+            </div>
+            <div class="option-right">
+                <div class="wrapper">
+                    <div class="wrapper-item flex-display">
+                        <span class="item-left">舱内关机</span>
+                        <span class="item-right dock-status">N/A</span>
+                    </div>
+
+                    <div class="wrapper-item  flex-display">
+                        <span class="w100 text-center f12" style="color: #4e4e4e;">当前设备已关机,无法进行直播</span>
+                        <!-- <div class="item-left">
+                            <CloudOutlined />
+                            <span>正常</span>
+                        </div>
+                        <div class="item-right flex-display flex-align-center">
+                            <span class="mr20">
+                                <ThunderboltOutlined />
+                                34°C
+                            </span>
+                        </div> -->
+                    </div>
+                </div>
+                <div class="option-btn flex-display flex-justify-between">
+                    <div class="btn" style="width: 100%;">
+                        <a-button type="primary" @click="flyControl = !flyControl" :class="{ unchecked: !flyControl }"
+                            style="width: 100%;">
+                            <template #icon>
+                                <BoxPlotOutlined />
+                            </template>
+                            飞行控制
+                        </a-button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="takeoff flex-display flex-align-center">
+            <div class="takeoff-left mr15 flex-display flex-align-center flex-direction-column">
+                <RobotOutlined :style="{ fontSize: '28px' }" />
+                <div style="margin-top: 10px;">一键起飞</div>
+            </div>
+            <div class="divider"></div>
+            <div class="takeoff-middle"></div>
+            <div class="takeoff-right  flex-display flex-justify-center flex-align-center flex-direction-column">
+                <div class="mb5 input-box flex-display flex-align-center">
+                    <span class="f10 label mr15">安全离场高(ALT)</span>
+                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.safe_height" />
+                </div>
+                <div class="mb5 input-box flex-display flex-align-center">
+                    <span class="f10 label mr15">飞行作业高(AGL)</span>
+                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.fly_height" />
+                </div>
+                <div class="mb5 input-box flex-display flex-align-center">
+                    <span class="f10 label mr15">返航高(ALT)</span>
+                    <a-input size="small" class="input-style" suffix="m" v-model:value="option.return_height" />
+                </div>
+                <div class="mb5 select-box flex-display flex-align-center">
+                    <span class="f10 label mr15">失联动作</span>
+                    <a-select :dropdownMatchSelectWidth="false" class="select-style" :bordered="false" size="small" ref="select"
+                        v-model:value="option.lose_connection" style="width: 60px" @change="handleChange">
+                        <a-select-option value="1">悬停</a-select-option>
+                        <a-select-option value="2">返航</a-select-option>
+                        <a-select-option value="3">继续执行</a-select-option>
+                    </a-select>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { VideoCameraOutlined, RobotOutlined, ToolOutlined, CloudOutlined, ThunderboltOutlined, FundProjectionScreenOutlined, UploadOutlined, BoxPlotOutlined } from '@ant-design/icons-vue'
+import Drawer from '/@/components/Drawer/Drawer.vue'
+const videoControl = ref(false)
+const optionControl = ref(false)
+const flyControl = ref(false)
+const option = ref({
+  safe_height: 60,
+  fly_height: 60,
+  return_height: 60,
+  lose_connection: '1',
+})
+const handleChange = (e: string) => {
+  console.log(e, 'eee')
+}
+</script>
+
+<style scoped lang="scss">
+.config_dock {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+
+    :deep(.ant-input-affix-wrapper > input.ant-input) {
+        background: #101010;
+        color: #fff;
+        text-align: center;
+        margin-right: 5px;
+        width: 30px;
+    }
+
+    :deep(.ant-input-affix-wrapper .ant-input-suffix) {
+        color: #fff;
+    }
+
+    .unchecked {
+        color: #fff;
+        background-color: #3c3c3c;
+        border: none;
+    }
+
+    .option {
+        width: 100%;
+        height: 120px;
+        align-items: center;
+
+        .option-left-icon {
+            flex-direction: column;
+            justify-content: center;
+            align-items: center;
+            background-color: #3d3d3d;
+            padding: 10px;
+        }
+
+        .option-right {
+            flex: 1;
+            padding: 5px;
+
+            .wrapper {
+                width: 100%;
+
+                .wrapper-item {
+                    align-items: center;
+                    justify-content: space-between;
+                    margin-bottom: 10px;
+
+                    .item-left {
+                        width: 100px;
+                    }
+
+                    .item-right {
+                        flex: 1;
+                    }
+
+                    .dock-status {
+                        background-color: #5d5f61;
+                        padding: 0 5px;
+                        color: #fff;
+                    }
+                }
+            }
+
+            .option-btn {
+                width: 100%;
+
+                .btn {
+                    width: 48%;
+                }
+            }
+        }
+    }
+
+    .video {
+        width: 100%;
+        height: 80%;
+        position: relative;
+
+        .video-option {
+            display: flex;
+            align-items: center;
+            justify-content: flex-end;
+        }
+    }
+
+    .takeoff {
+        padding: 5px;
+        height: 100px;
+        width: 100%;
+        margin-bottom: 10px;
+
+        .takeoff-left {
+            background-color: #3d3d3d;
+            padding: 10px;
+            width: 90px;
+            height: 90px;
+            justify-content: center;
+        }
+
+        .input-style {
+            width: 60px;
+            padding: 0;
+            background-color: #101010;
+            border: none;
+        }
+
+        .select-style {
+            background-color: #3c3c3c;
+            padding: 0;
+            color: #fff;
+            font-size: 10px;
+        }
+
+        .label {
+            min-width: 100px;
+            text-align: right;
+        }
+
+        .divider {
+            height: 100%;
+            width: 1.12px;
+            background-color: hsla(0, 0%, 100%, .1);
+        }
+    }
+}</style>
diff --git a/src/pages/page-web/projects/project_list/add_page/add.vue b/src/pages/page-web/projects/project_list/add_page/add.vue
index 910cba2..1bee552 100644
--- a/src/pages/page-web/projects/project_list/add_page/add.vue
+++ b/src/pages/page-web/projects/project_list/add_page/add.vue
@@ -368,36 +368,36 @@
         }
 
         .ant-table-project :deep(.project_dark) td {
-            background-color: #232323;
-            color: #fff;
-            border: none;
+            background-color: #232323 !important;
+            color: #fff !important;
+            border: none !important;
             border-bottom: 1px solid #4f4f4f;
             padding: 10px;
         }
 
         .ant-table-project :deep(.ant-table-placeholder) {
-            background: #434343;
+            background: #434343 !important;
             border: none !important;
         }
 
         .ant-table-project :deep(.ant-table-thead) th {
-            background: #3c3c3c;
-            color: #fff;
-            border: 1px solid #4f4f4f;
+            background: #3c3c3c !important;
+            color: #fff !important;
+            border: 1px solid #4f4f4f !important;
             padding: 10px;
         }
 
         .ant-table-project :deep(.ant-table-body) table {
-            border: 1px solid #4f4f4f;
-            border-right: 1px solid #4f4f4f;
+            border: 1px solid #4f4f4f !important;
+            border-right: 1px solid #4f4f4f !important;
         }
 
         .ant-table-project :deep(.ant-table-body) {
-            background: #434343;
+            background: #434343 !important;
         }
 
         .ant-table-project :deep(.ant-empty-description) {
-            color: #fff;
+            color: #fff !important;
         }
     }
 
diff --git a/src/pages/page-web/projects/tsa.vue b/src/pages/page-web/projects/tsa.vue
index 9b16078..ea78241 100644
--- a/src/pages/page-web/projects/tsa.vue
+++ b/src/pages/page-web/projects/tsa.vue
@@ -15,7 +15,7 @@
             <a-empty style="color: #fff;" :image="simpleImage" description="暂无数据" :image-style="{ height: '60px' }" />
           </div>
           <div v-else class="fz12" style="color: white;">
-            <div v-for="dock in onlineDocks.data" :key="dock.sn" style="background: #3c3c3c; height: 90px; width: 250px; margin-bottom: 10px;">
+            <div v-for="dock in onlineDocks.data" :key="dock.sn" style="background: #3c3c3c; height: 90px; margin-bottom: 10px;">
               <div style="border-radius: 2px; height: 100%; width: 100%;" class="flex-row flex-justify-between flex-align-center">
                 <div style="float: left; padding: 0px 5px 8px 8px; width: 88%">
                   <div style="width: 80%; height: 30px; line-height: 30px; font-size: 16px;">
@@ -26,6 +26,7 @@
                   <div class="mt5 flex-align-center flex-row flex-justify-between" style="background: #595959;">
                     <div class="flex-align-center flex-row">
                       <span class="ml5 mr5"><RobotOutlined /></span>
+                      132
                       <div class="font-bold text-hidden" style="max-width: 80px;" :style="dockInfo[dock.gateway.sn] && dockInfo[dock.gateway.sn].basic_osd?.mode_code !== EDockModeCode.Disconnected ? 'color: #00ee8b' :  'color: red;'">
                         {{ dockInfo[dock.gateway.sn] ? EDockModeCode[dockInfo[dock.gateway.sn].basic_osd?.mode_code] : EDockModeCode[EDockModeCode.Disconnected] }}
                       </div>
@@ -142,7 +143,7 @@
             <a-empty :image="simpleImage" style="color: #fff;"  description="暂无数据" :image-style="{ height: '60px' }" />
           </div>
           <div v-else class="fz12" style="color: white;">
-            <div v-for="device in onlineDevices.data" :key="device.sn" style="background: #3c3c3c; height: 90px; width: 250px; margin-bottom: 10px;">
+            <div v-for="device in onlineDevices.data" :key="device.sn" style="background: #3c3c3c; height: 90px; margin-bottom: 10px;">
               <div class="battery-slide" v-if="deviceInfo[device.sn]">
                 <div style="background: #535759; width: 100%;"></div>
                 <div class="capacity-percent" :style="{ width: deviceInfo[device.sn].battery.capacity_percent + '%'}"></div>
@@ -186,12 +187,17 @@
         </a-collapse-panel>
       </a-collapse>
     </div>
+    <Drawer title="项目设置" :styleDrawer="styleDrawer" v-model:show="showDrawer">
+      <DockConfig />
+    </Drawer>
   </div>
 </template>
 
 <script lang="ts" setup>
+import { styleDrawer } from './common/common'
 import { computed, onMounted, reactive, ref, watch, WritableComputedRef } from 'vue'
 import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
+import Drawer from '/@/components/Drawer/Drawer.vue'
 import noData from '/@/assets/icons/no-data.png'
 import { Empty } from 'ant-design-vue'
 import rc from '/@/assets/icons/rc.png'
@@ -200,6 +206,10 @@
 import { getDeviceTopo, getUnreadDeviceHms, updateDeviceHms } from '/@/api/manage'
 import { RocketOutlined, EyeInvisibleOutlined, EyeOutlined, RobotOutlined, DoubleRightOutlined } from '@ant-design/icons-vue'
 import { EHmsLevel } from '/@/types/enums'
+import { UranusMqtt } from '/@/mqtt/index'
+import DockConfig from './components/DockConfig.vue'
+const { appContext } = getCurrentInstance()
+const global = appContext.config.globalProperties
 const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE
 const store = useMyStore()
 const username = ref(localStorage.getItem(ELocalStorageKey.Username))
@@ -207,7 +217,7 @@
 const osdVisible = ref({} as OSDVisible)
 const hmsVisible = new Map<string, boolean>()
 const scorllHeight = ref()
-
+const showDrawer = ref(false)
 const onlineDevices = reactive({
   data: [] as OnlineDevice[]
 })
@@ -220,8 +230,8 @@
       sn: '我是sn字段',
       mode: '我是mode字段',
       gateway: {
-        model: '我是gateway.model字段',
-        callsign: '我是gateway.callsign字段',
+        model: 'gateway.model',
+        callsign: 'gateway.callsign',
         sn: '我是gateway.sn字段',
         mode: '我是gateway.mode字段',
       },
@@ -249,6 +259,9 @@
 })
 
 onMounted(() => {
+  console.log(global, 'global')
+  // const mqtt = new UranusMqtt('ws://192.168.1.198:8083/mqtt', {})
+  // mqtt.initMqtt()
   getOnlineTopo()
   setTimeout(() => {
     watch(() => store.state.deviceStatusEvent,
@@ -314,23 +327,24 @@
 }
 
 function switchVisible (e: any, device: OnlineDevice, isDock: boolean, isClick: boolean) {
-  if (!isClick) {
-    e.target.style.cursor = 'not-allowed'
-    return
-  }
-  if (device.sn === osdVisible.value.sn) {
-    osdVisible.value.visible = !osdVisible.value.visible
-  } else {
-    osdVisible.value.sn = device.sn
-    osdVisible.value.callsign = device.callsign
-    osdVisible.value.model = device.model
-    osdVisible.value.visible = true
-    osdVisible.value.gateway_sn = device.gateway.sn
-    osdVisible.value.is_dock = isDock
-    osdVisible.value.gateway_callsign = device.gateway.callsign
-    osdVisible.value.payloads = device.payload
-  }
-  store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
+  showDrawer.value = !showDrawer.value
+  // if (!isClick) {
+  //   e.target.style.cursor = 'not-allowed'
+  //   return
+  // }
+  // if (device.sn === osdVisible.value.sn) {
+  //   osdVisible.value.visible = !osdVisible.value.visible
+  // } else {
+  //   osdVisible.value.sn = device.sn
+  //   osdVisible.value.callsign = device.callsign
+  //   osdVisible.value.model = device.model
+  //   osdVisible.value.visible = true
+  //   osdVisible.value.gateway_sn = device.gateway.sn
+  //   osdVisible.value.is_dock = isDock
+  //   osdVisible.value.gateway_callsign = device.gateway.callsign
+  //   osdVisible.value.payloads = device.payload
+  // }
+  // store.commit('SET_OSD_VISIBLE_INFO', osdVisible)
 }
 
 function getUnreadHms (sn: string) {
diff --git a/src/pages/page-web/projects/workspace.vue b/src/pages/page-web/projects/workspace.vue
index a7b1d92..5ad885b 100644
--- a/src/pages/page-web/projects/workspace.vue
+++ b/src/pages/page-web/projects/workspace.vue
@@ -129,8 +129,9 @@
 
   .left {
     display: flex;
-    width: 335px;
-    flex: 0 0 335px;
+    // width: 335px;
+    flex: 1;
+    // flex: 0 0 335px;
     background-color: #232323;
 
     .main-content {
diff --git a/src/styles/flex.style.scss b/src/styles/flex.style.scss
index 2a0f3eb..1e4519a 100644
--- a/src/styles/flex.style.scss
+++ b/src/styles/flex.style.scss
@@ -6,6 +6,16 @@
   align-items: center;
   justify-content: center;
 }
+.text-center {
+  text-align: center
+}
+.f12 {
+  font-size: 12px
+}
+
+.f10 {
+  font-size: 10px
+}
 // .border-bottom {
 //   position: relative;
 //   box-sizing: border-box;
@@ -40,6 +50,9 @@
 
 .flex-align-center {
   align-items: center;
+}
+.flex-direction-column {
+  flex-direction: column;
 }
 
 .flex-justify-start {
@@ -91,7 +104,9 @@
 .height-100 {
   height: 100%;
 }
-
+.w100 {
+  width: 100%;
+}
 //margin
 m-5 {
   margin: -5px !important;
diff --git a/src/websocket/index.ts b/src/websocket/index.ts
index 8edd25c..cb602c4 100644
--- a/src/websocket/index.ts
+++ b/src/websocket/index.ts
@@ -1,5 +1,7 @@
+
 import { message } from 'ant-design-vue'
 import ReconnectingWebSocket from 'reconnecting-websocket'
+import { ELocalStorageKey } from '../types'
 
 interface WebSocketOptions {
   data: any
@@ -35,14 +37,14 @@
     if (!this._url) {
       return
     }
-
+    const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
     // 会自动重连,无需处理重连逻辑
+    console.log(token, 'token')
     this._socket = new ReconnectingWebSocket(this._url, [], {
       maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
       minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
-      maxRetries: 5
+      maxRetries: 5,
     })
-
     this._hasInit = true
 
     this._socket.addEventListener('open', this._onOpen.bind(this))
diff --git a/src/websocket/util/config.ts b/src/websocket/util/config.ts
index 46c8c2e..15fa08a 100644
--- a/src/websocket/util/config.ts
+++ b/src/websocket/util/config.ts
@@ -3,6 +3,7 @@
 
 export function getWebsocketUrl () {
   const token: string = localStorage.getItem(ELocalStorageKey.Token) || '' as string
-  const url = CURRENT_CONFIG.websocketURL + '?x-auth-token=' + encodeURI(token)
+  const url = CURRENT_CONFIG.websocketURL
+  // const url = CURRENT_CONFIG.websocketURL + '?Authorization=' + encodeURI(token)
   return url
 }
diff --git a/yarn.lock b/yarn.lock
index 9ebc103..97f3b9b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1010,6 +1010,11 @@
   resolved "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz"
   integrity sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=
 
+async-limiter@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
 async-validator@^3.3.0:
   version "3.5.2"
   resolved "https://registry.npmmirror.com/async-validator/download/async-validator-3.5.2.tgz"
@@ -1052,9 +1057,9 @@
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz"
   integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=
 
-base64-js@^1.3.1:
+base64-js@^1.3.0, base64-js@^1.3.1:
   version "1.5.1"
-  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz"
+  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
 
 base@^0.11.1:
@@ -1216,6 +1221,14 @@
   dependencies:
     function-bind "^1.1.1"
     get-intrinsic "^1.0.2"
+
+callback-stream@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908"
+  integrity sha512-sAZ9kODla+mGACBZ1IpTCAisKoGnv6PykW7fPk1LrM+mMepE18Yz0515yoVcrZy7dQsTUp3uZLQ/9Sx1RnLoHw==
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "> 1.0.0 < 3.0.0"
 
 callsites@^3.0.0:
   version "3.1.0"
@@ -1400,14 +1413,14 @@
   resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz"
-  integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
+concat-stream@^1.6.2:
+  version "1.6.2"
+  resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
   dependencies:
     buffer-from "^1.0.0"
     inherits "^2.0.3"
-    readable-stream "^3.0.2"
+    readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
 constant-case@^3.0.4:
@@ -1509,6 +1522,14 @@
   resolved "https://registry.npmmirror.com/csstype/download/csstype-2.6.19.tgz?cache=0&sync_timestamp=1637224514674&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fcsstype%2Fdownload%2Fcsstype-2.6.19.tgz"
   integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
 debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz"
@@ -1523,7 +1544,7 @@
   dependencies:
     ms "^2.1.1"
 
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3:
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3:
   version "4.3.3"
   resolved "https://registry.npmmirror.com/debug/download/debug-4.3.3.tgz"
   integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
@@ -1688,14 +1709,14 @@
   dependencies:
     readable-stream "^2.0.2"
 
-duplexify@^4.1.1:
-  version "4.1.2"
-  resolved "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz"
-  integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==
+duplexify@^3.5.1, duplexify@^3.6.0:
+  version "3.7.1"
+  resolved "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
   dependencies:
-    end-of-stream "^1.4.1"
-    inherits "^2.0.3"
-    readable-stream "^3.1.1"
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
 earcut@^2.2.4:
@@ -1728,7 +1749,7 @@
   resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz"
   integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
 
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
   version "1.4.4"
   resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz"
   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -1791,6 +1812,56 @@
     is-callable "^1.1.4"
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@~0.10.14:
+  version "0.10.62"
+  resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
+  integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  integrity sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+  version "0.1.6"
+  resolved "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz#5669e3b2aa01d61a50ba79964f733673574983b8"
+  integrity sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==
+  dependencies:
+    d "^1.0.1"
+    es5-ext "^0.10.62"
+    es6-iterator "~2.0.3"
+    es6-symbol "^3.1.3"
+    event-emitter "^0.3.5"
+    type "^2.7.2"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3, es6-symbol@~3.1.1:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
 
 esbuild@^0.18.10:
   version "0.18.20"
@@ -2065,6 +2136,14 @@
   resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz"
   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
 
+event-emitter@^0.3.5, event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
 eventemitter3@^5.0.0:
   version "5.0.0"
   resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.0.tgz"
@@ -2083,6 +2162,13 @@
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+ext@^1.1.2:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+  integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+  dependencies:
+    type "^2.7.2"
+
 extend-shallow@^2.0.1:
   version "2.0.1"
   resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz"
@@ -2097,6 +2183,11 @@
   dependencies:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
+
+extend@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
 extglob@^2.0.2:
   version "2.0.4"
@@ -2292,6 +2383,14 @@
   resolved "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz"
   integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
 
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
 glob-parent@^5.1.2, glob-parent@~5.1.2:
   version "5.1.2"
   resolved "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz"
@@ -2299,7 +2398,35 @@
   dependencies:
     is-glob "^4.0.1"
 
-glob@^7.1.3, glob@^7.1.6:
+glob-stream@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+  integrity sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==
+  dependencies:
+    extend "^3.0.0"
+    glob "^7.1.1"
+    glob-parent "^3.1.0"
+    is-negated-glob "^1.0.0"
+    ordered-read-streams "^1.0.0"
+    pumpify "^1.3.5"
+    readable-stream "^2.1.5"
+    remove-trailing-separator "^1.0.1"
+    to-absolute-glob "^2.0.0"
+    unique-stream "^2.0.2"
+
+glob@^7.1.1:
+  version "7.2.3"
+  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.1.3:
   version "7.2.0"
   resolved "https://registry.npmmirror.com/glob/download/glob-7.2.0.tgz"
   integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -2435,13 +2562,15 @@
     capital-case "^1.0.4"
     tslib "^2.0.3"
 
-help-me@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmmirror.com/help-me/-/help-me-3.0.0.tgz"
-  integrity sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==
+help-me@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6"
+  integrity sha512-P/IZ8yOMne3SCTHbVY429NZ67B/2bVQlcYGZh2iPPbdLrEQ/qY5aGChn0YTDmt7Sb4IKRI51fypItav+lNl76w==
   dependencies:
-    glob "^7.1.6"
-    readable-stream "^3.6.0"
+    callback-stream "^1.0.2"
+    glob-stream "^6.1.0"
+    through2 "^2.0.1"
+    xtend "^4.0.0"
 
 htmlparser2@^3.8.3:
   version "3.10.1"
@@ -2525,6 +2654,14 @@
     get-intrinsic "^1.1.0"
     has "^1.0.3"
     side-channel "^1.0.4"
+
+is-absolute@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
+  dependencies:
+    is-relative "^1.0.0"
+    is-windows "^1.0.1"
 
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
@@ -2630,15 +2767,22 @@
   dependencies:
     is-plain-object "^2.0.4"
 
-is-extglob@^2.1.1:
+is-extglob@^2.1.0, is-extglob@^2.1.1:
   version "2.1.1"
-  resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz"
-  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
 
 is-fullwidth-code-point@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&sync_timestamp=1618552489864&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz"
   integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==
+  dependencies:
+    is-extglob "^2.1.0"
 
 is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
   version "4.0.3"
@@ -2646,6 +2790,11 @@
   integrity sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=
   dependencies:
     is-extglob "^2.1.1"
+
+is-negated-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+  integrity sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==
 
 is-negative-zero@^2.0.1:
   version "2.0.2"
@@ -2703,6 +2852,13 @@
     call-bind "^1.0.2"
     has-tostringtag "^1.0.0"
 
+is-relative@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
+  dependencies:
+    is-unc-path "^1.0.0"
+
 is-shared-array-buffer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmmirror.com/is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz"
@@ -2722,6 +2878,13 @@
   dependencies:
     has-symbols "^1.0.2"
 
+is-unc-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
+  dependencies:
+    unc-path-regex "^0.1.2"
+
 is-weakref@^1.0.1:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/is-weakref/download/is-weakref-1.0.2.tgz"
@@ -2729,10 +2892,10 @@
   dependencies:
     call-bind "^1.0.2"
 
-is-windows@^1.0.2:
+is-windows@^1.0.1, is-windows@^1.0.2:
   version "1.0.2"
-  resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz"
-  integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=
+  resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
 isarray@1.0.0, isarray@~1.0.0:
   version "1.0.0"
@@ -2760,11 +2923,6 @@
   version "2.6.4"
   resolved "https://registry.npmmirror.com/js-base64/download/js-base64-2.6.4.tgz"
   integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
-
-js-sdsl@4.3.0:
-  version "4.3.0"
-  resolved "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz"
-  integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
 
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
@@ -3049,6 +3207,13 @@
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
 minimatch@^9.0.2:
   version "9.0.3"
   resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz"
@@ -3096,37 +3261,35 @@
   resolved "https://registry.npmmirror.com/moment/download/moment-2.29.1.tgz"
   integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
 
-mqtt-packet@^6.8.0:
+mqtt-packet@^6.0.0:
   version "6.10.0"
-  resolved "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz"
+  resolved "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz#c8b507832c4152e3e511c0efa104ae4a64cd418f"
   integrity sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==
   dependencies:
     bl "^4.0.2"
     debug "^4.1.1"
     process-nextick-args "^2.0.1"
 
-mqtt@^4.3.7:
-  version "4.3.7"
-  resolved "https://registry.npmmirror.com/mqtt/-/mqtt-4.3.7.tgz"
-  integrity sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==
+mqtt@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/mqtt/-/mqtt-4.0.1.tgz#8bffa46b2b365a459c0bedd90267645418d0f2a5"
+  integrity sha512-sDvB/wI8e3YSSdIxJ74M81lQTFXxg1uFM5/irpQL+IH9crQiW90R69YOnk7UGj9xCqoXBBRPr8fqnkzQUKRYgg==
   dependencies:
+    base64-js "^1.3.0"
     commist "^1.0.0"
-    concat-stream "^2.0.0"
-    debug "^4.1.1"
-    duplexify "^4.1.1"
-    help-me "^3.0.0"
+    concat-stream "^1.6.2"
+    end-of-stream "^1.4.1"
+    es6-map "^0.1.5"
+    help-me "^1.0.1"
     inherits "^2.0.3"
-    lru-cache "^6.0.0"
-    minimist "^1.2.5"
-    mqtt-packet "^6.8.0"
-    number-allocator "^1.0.9"
+    minimist "^1.2.0"
+    mqtt-packet "^6.0.0"
     pump "^3.0.0"
-    readable-stream "^3.6.0"
+    readable-stream "^2.3.6"
     reinterval "^1.1.0"
-    rfdc "^1.3.0"
     split2 "^3.1.0"
-    ws "^7.5.5"
-    xtend "^4.0.2"
+    websocket-stream "^5.1.2"
+    xtend "^4.0.1"
 
 ms@2.0.0:
   version "2.0.0"
@@ -3180,6 +3343,11 @@
   resolved "https://registry.nlark.com/natural-compare/download/natural-compare-1.4.0.tgz"
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
+next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
 no-case@^3.0.4:
   version "3.0.4"
   resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867308811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz"
@@ -3209,14 +3377,6 @@
   integrity sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=
   dependencies:
     boolbase "^1.0.0"
-
-number-allocator@^1.0.9:
-  version "1.0.14"
-  resolved "https://registry.npmmirror.com/number-allocator/-/number-allocator-1.0.14.tgz"
-  integrity sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==
-  dependencies:
-    debug "^4.3.1"
-    js-sdsl "4.3.0"
 
 object-assign@^4, object-assign@^4.1.0:
   version "4.1.1"
@@ -3306,6 +3466,13 @@
     type-check "^0.4.0"
     word-wrap "^1.2.3"
 
+ordered-read-streams@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+  integrity sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==
+  dependencies:
+    readable-stream "^2.0.1"
+
 p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.nlark.com/p-limit/download/p-limit-1.3.0.tgz"
@@ -3370,6 +3537,11 @@
   dependencies:
     dot-case "^3.0.4"
     tslib "^2.0.3"
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==
 
 path-exists@^3.0.0:
   version "3.0.0"
@@ -3520,6 +3692,14 @@
     "@types/node" ">=13.7.0"
     long "^5.0.0"
 
+pump@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
 pump@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz"
@@ -3527,6 +3707,15 @@
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
+
+pumpify@^1.3.5:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
 
 punycode@^2.1.0:
   version "2.1.1"
@@ -3573,6 +3762,19 @@
   dependencies:
     quickselect "^2.0.0"
 
+"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
 readable-stream@^2.0.2, readable-stream@~2.3.6:
   version "2.3.7"
   resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz"
@@ -3586,7 +3788,7 @@
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0:
   version "3.6.0"
   resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz"
   integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg=
@@ -3629,6 +3831,11 @@
   version "1.1.0"
   resolved "https://registry.npmmirror.com/reinterval/-/reinterval-1.1.0.tgz"
   integrity sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+  integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
 
 repeat-element@^1.1.2:
   version "1.1.4"
@@ -3679,11 +3886,6 @@
   resolved "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz"
   integrity sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=
 
-rfdc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz"
-  integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
-
 rimraf@2:
   version "2.7.1"
   resolved "https://registry.npmmirror.com/rimraf/download/rimraf-2.7.1.tgz"
@@ -3729,15 +3931,15 @@
   dependencies:
     queue-microtask "^1.2.2"
 
+safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
+  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
+
 safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.1.2.tgz"
   integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
-
-safe-buffer@~5.2.0:
-  version "5.2.1"
-  resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz"
-  integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=
 
 safe-regex@^1.1.0:
   version "1.1.0"
@@ -4162,6 +4364,30 @@
   resolved "https://registry.nlark.com/text-table/download/text-table-0.2.0.tgz"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
+through2-filter@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
+  integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
+  dependencies:
+    through2 "~2.0.0"
+    xtend "~4.0.0"
+
+through2@^2.0.1, through2@~2.0.0:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+  dependencies:
+    readable-stream "~2.3.6"
+    xtend "~4.0.1"
+
+to-absolute-glob@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+  integrity sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==
+  dependencies:
+    is-absolute "^1.0.0"
+    is-negated-glob "^1.0.0"
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://registry.nlark.com/to-fast-properties/download/to-fast-properties-2.0.0.tgz?cache=0&sync_timestamp=1628418893613&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fto-fast-properties%2Fdownload%2Fto-fast-properties-2.0.0.tgz"
@@ -4265,6 +4491,16 @@
   resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz"
   integrity sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+  version "2.7.2"
+  resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz"
@@ -4280,6 +4516,11 @@
   resolved "https://registry.npmmirror.com/ufo/-/ufo-1.3.0.tgz"
   integrity sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==
 
+ultron@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+  integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
+
 unbox-primitive@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npm.taobao.org/unbox-primitive/download/unbox-primitive-1.0.1.tgz?cache=0&sync_timestamp=1616706302651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funbox-primitive%2Fdownload%2Funbox-primitive-1.0.1.tgz"
@@ -4289,6 +4530,11 @@
     has-bigints "^1.0.1"
     has-symbols "^1.0.2"
     which-boxed-primitive "^1.0.2"
+
+unc-path-regex@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+  integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==
 
 unimport@^3.0.14:
   version "3.2.0"
@@ -4316,6 +4562,14 @@
     get-value "^2.0.6"
     is-extendable "^0.1.1"
     set-value "^2.0.1"
+
+unique-stream@^2.0.2:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
+  integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
+  dependencies:
+    json-stable-stringify-without-jsonify "^1.0.1"
+    through2-filter "^3.0.0"
 
 universalify@^2.0.0:
   version "2.0.0"
@@ -4608,6 +4862,18 @@
   resolved "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz"
   integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
 
+websocket-stream@^5.1.2:
+  version "5.5.2"
+  resolved "https://registry.npmmirror.com/websocket-stream/-/websocket-stream-5.5.2.tgz#49d87083d96839f0648f5513bbddd581f496b8a2"
+  integrity sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==
+  dependencies:
+    duplexify "^3.5.1"
+    inherits "^2.0.1"
+    readable-stream "^2.3.3"
+    safe-buffer "^5.1.2"
+    ws "^3.2.0"
+    xtend "^4.0.0"
+
 which-boxed-primitive@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz"
@@ -4636,14 +4902,18 @@
   resolved "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-ws@^7.5.5:
-  version "7.5.9"
-  resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz"
-  integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+ws@^3.2.0:
+  version "3.3.3"
+  resolved "https://registry.npmmirror.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
+  integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==
+  dependencies:
+    async-limiter "~1.0.0"
+    safe-buffer "~5.1.0"
+    ultron "~1.1.0"
 
-xtend@^4.0.2:
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.2"
-  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz"
+  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
 
 yallist@^4.0.0:

--
Gitblit v1.9.3