From 42f5e37f656e362bebab0bf78d9ddc24b8d64cde Mon Sep 17 00:00:00 2001 From: lcw <1878680531@qq.com> Date: Sat, 16 Aug 2025 16:54:03 +0800 Subject: [PATCH] lcw --- package-lock.json | 222 +++++++- package.json | 2 + public/textVideo/textVideo.js | 380 +++++++------- src/App.vue | 1 + src/api/commit.js | 86 ++++ src/api/spl.js | 100 ++++ src/assets/css/pulic.scss | 72 ++- src/assets/images/tztg.png | Bin 0 -> 555 bytes src/assets/images/xtxx.png | Bin 0 -> 652 bytes src/assets/images/xxxt.png | Bin 0 -> 790 bytes src/components/ChooseList/ChooseCl/addPeo.vue | 49 +- src/components/ChooseList/ChooseCl/index.vue | 101 ++-- .../ChooseList/ChooseZdr/addPeo.vue | 29 +- src/components/ChooseList/ChooseZdr/index.vue | 9 +- .../MyComponents/Department/index.vue | 9 + src/components/MyComponents/Upload/index.vue | 36 +- src/components/aboutTable/FormMessage.vue | 3 +- src/components/addPerson/index.vue | 3 +- src/components/flowPath/ApprovalEcho.vue | 303 +++++++++++ src/components/flowPath/SelectingPeople.vue | 316 ++++++++++++ src/components/flowPath/submissionProcess.vue | 143 ++++++ .../instructionHasBeen/sendFqzl.vue | 153 ++++++ src/main.js | 13 +- src/router/index.js | 53 +- src/store/modules/permission.js | 4 +- src/store/modules/user.js | 74 +-- src/utils/request.js | 10 +- src/utils/tools.js | 33 +- src/views/KeyPopulations/model/yjclqktj.vue | 18 +- .../ApprovalInformation/Clue/index.vue | 228 ++++++++ .../Clue/objectInformation.vue | 59 +++ .../FocusExploration/index.vue | 203 ++++++++ .../deploycontrol/deploymentApproval.vue | 184 +++++++ .../deploycontrol/objectInformation.vue | 56 ++ .../ApprovalInformation/tableRow.js | 86 ++++ .../BasicManagement/experienceShare/index.vue | 2 +- .../mpvCar/components/addForm.vue | 52 +- .../DeploymentDisposal/mpvCar/index.vue | 6 +- .../LandingAudit/details.vue | 269 ++++++++++ .../ExcavationResearch/LandingAudit/index.vue | 60 ++- .../components/addForm copy.vue | 191 +++++++ .../CollectCrculate/components/addForm.vue | 18 +- .../CollectCrculate/index.vue | 184 +++---- .../TaskScheduling/components/addForm.vue | 50 +- .../TaskScheduling/index.vue | 20 +- .../myControl/components/addBkdx.vue | 485 ++++++++++-------- .../myControl/components/dolog/sfzLog.vue | 185 +++++++ .../IntelligentControl/myControl/index.vue | 140 ++--- .../warningControl/components/dict.js | 4 + .../warningControl/components/sendFqzl.vue | 122 +++++ .../warningControl/components/yjItem.vue | 17 +- .../warningControl/index.vue | 55 +- .../MakeAcomment/components/a/addForm.vue | 299 +++++++++++ .../components/itemXs/addForm.vue | 75 +++ .../components/itemXs/commentList.vue | 228 ++++++++ .../MakeAcomment/components/itemXs/itemXs.vue | 71 ++- .../components/itemXs/lstItem.vue | 144 ++++++ .../components/itemXs/replyList.vue | 184 +++++++ .../backOfficeSystem/MakeAcomment/index.vue | 59 ++- .../DatAcquisition/components/addForm.vue | 178 ++++--- .../ResearchJudgment/DatAcquisition/index.vue | 38 +- .../IntelligenceManagement/index.vue | 29 +- src/views/home/index.vue | 126 ++++- src/views/home/model/fxq.vue | 194 +++++++ src/views/home/model/information.vue | 53 ++ .../home/model/mesgSwitch/systemMessages.vue | 186 +++++++ src/views/home/model/mesgSwitch/tztg.vue | 53 ++ src/views/home/model/mesgSwitch/xtxi.vue | 53 ++ vue.config.js | 23 +- 69 files changed, 5913 insertions(+), 978 deletions(-) create mode 100644 src/api/commit.js create mode 100644 src/api/spl.js create mode 100644 src/assets/images/tztg.png create mode 100644 src/assets/images/xtxx.png create mode 100644 src/assets/images/xxxt.png create mode 100644 src/components/flowPath/ApprovalEcho.vue create mode 100644 src/components/flowPath/SelectingPeople.vue create mode 100644 src/components/flowPath/submissionProcess.vue create mode 100644 src/components/instructionHasBeen/sendFqzl.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/Clue/index.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/Clue/objectInformation.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/FocusExploration/index.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/deploycontrol/objectInformation.vue create mode 100644 src/views/backOfficeSystem/ApprovalInformation/tableRow.js create mode 100644 src/views/backOfficeSystem/ExcavationResearch/LandingAudit/details.vue create mode 100644 src/views/backOfficeSystem/HumanIntelligence/CollectCrculate/components/addForm copy.vue create mode 100644 src/views/backOfficeSystem/IntelligentControl/myControl/components/dolog/sfzLog.vue create mode 100644 src/views/backOfficeSystem/IntelligentControl/warningControl/components/dict.js create mode 100644 src/views/backOfficeSystem/IntelligentControl/warningControl/components/sendFqzl.vue create mode 100644 src/views/backOfficeSystem/MakeAcomment/components/a/addForm.vue create mode 100644 src/views/backOfficeSystem/MakeAcomment/components/itemXs/addForm.vue create mode 100644 src/views/backOfficeSystem/MakeAcomment/components/itemXs/commentList.vue create mode 100644 src/views/backOfficeSystem/MakeAcomment/components/itemXs/lstItem.vue create mode 100644 src/views/backOfficeSystem/MakeAcomment/components/itemXs/replyList.vue create mode 100644 src/views/home/model/fxq.vue create mode 100644 src/views/home/model/information.vue create mode 100644 src/views/home/model/mesgSwitch/systemMessages.vue create mode 100644 src/views/home/model/mesgSwitch/tztg.vue create mode 100644 src/views/home/model/mesgSwitch/xtxi.vue diff --git a/package-lock.json b/package-lock.json index db5b134..7465b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -292,6 +292,11 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", @@ -2182,6 +2187,45 @@ } } }, + "@vue/compat": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/compat/-/compat-3.5.18.tgz", + "integrity": "sha512-9nJUhd2+1JBW2YRxPkF0JZ+UieK2U7FEVla+7V4d9IlzD9HztQFSFj9VVR3sy/aTIUTyEhysKvsv7geD1jEiKg==", + "requires": { + "@babel/parser": "^7.28.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + } + } + }, "@vue/compiler-core": { "version": "3.2.37", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", @@ -7174,6 +7218,183 @@ "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", "dev": true }, + "fzui-fengqun-api": { + "version": "1.0.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-api/-/fzui-fengqun-api-1.0.1.tgz", + "integrity": "sha512-YjcHnNJgBsuSJwmHFetovRT20Gw/6DRrvzMFsAgQe81zX1El5ckGE6vA4zTld8LUDiSHWdrc618hNlcjC3A7qA==", + "requires": { + "core-js": "^3.6.5", + "vue": "^2.6.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/types": { + "version": "7.28.2", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "requires": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "^0.6.1" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "vue": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "requires": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + } + } + }, + "fzui-fengqun-bpm": { + "version": "1.0.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-bpm/-/fzui-fengqun-bpm-1.0.1.tgz", + "integrity": "sha512-Ym3vvUf39oNAQew+5ZFFWWCQnM68jue8NvzNtxxFHElHzdiym4fY3Ged1VYpYyaeGeNMbADKKlxNKLy/6Yj1ig==", + "requires": { + "core-js": "^3.6.5", + "fzui-fengqun-api": "^1.0.1", + "vue": "^2.6.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/types": { + "version": "7.28.2", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "requires": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "^0.6.1" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "vue": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "requires": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + } + } + }, + "fzui-fengqun-vue": { + "version": "1.0.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-vue/-/fzui-fengqun-vue-1.0.1.tgz", + "integrity": "sha512-UFrs02ShB9+fmEa9kuX7QLg837N1GOPURX9gRKukIM9V1dsilea1+pU/iPu8irGgE5arkOEnsm8LilxfnMILAA==", + "requires": { + "core-js": "^3.6.5", + "fzui-fengqun-api": "^1.0.1", + "fzui-fengqun-bpm": "^1.0.1", + "vue": "^2.6.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/types": { + "version": "7.28.2", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "requires": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "^0.6.1" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "vue": { + "version": "2.7.16", + "resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "requires": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + } + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11930,7 +12151,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, "optional": true }, "pretty-error": { diff --git a/package.json b/package.json index bbc6c0d..10b1f1c 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@paddlejs-models/ocr": "^1.1.2", "@paddlejs-models/ocrdet": "^0.0.3", "@types/video.js": "^7.3.42", + "@vue/compat": "^3.5.18", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", "axios": "^0.26.0", @@ -27,6 +28,7 @@ "el-table-infinite-scroll": "^3.0.6", "element-plus": "2.0.2", "file-saver": "^2.0.5", + "fzui-fengqun-vue": "^1.0.1", "gifler": "^0.1.0", "image-compressor.js": "^1.1.4", "lodash": "^4.17.21", diff --git a/public/textVideo/textVideo.js b/public/textVideo/textVideo.js index faaa9bc..c5a0b1b 100644 --- a/public/textVideo/textVideo.js +++ b/public/textVideo/textVideo.js @@ -11,10 +11,10 @@ var audioBlob; var isfilemode = true; // if it is in file mode // 录音; 定义录音对象,wav格式 var rec = Recorder({ - type: "pcm", - bitRate: 16, - sampleRate: 16000, - onProcess: recProcess + type: "pcm", + bitRate: 16, + sampleRate: 16000, + onProcess: recProcess }); var sampleBuf = new Int16Array(); @@ -30,9 +30,9 @@ var totalsend = 0; addresschange(); function addresschange() { - var Uri = 'ws://192.168.0.232:10095'; - Uri = Uri.replace(/wss/g, "https"); - window.open(Uri, '_blank'); + var Uri = 'ws://192.168.0.232:10095'; + Uri = Uri.replace(/wss/g, "https"); + // window.open(Uri, '_blank'); } @@ -40,236 +40,236 @@ function addresschange() { var readWavInfo = function (bytes) { - //读取wav文件头,统一成44字节的头 - if (bytes.byteLength < 44) { - return null; - }; - var wavView = bytes; - var eq = function (p, s) { - for (var i = 0; i < s.length; i++) { - if (wavView[p + i] != s.charCodeAt(i)) { - return false; - }; - }; - return true; - }; + //读取wav文件头,统一成44字节的头 + if (bytes.byteLength < 44) { + return null; + }; + var wavView = bytes; + var eq = function (p, s) { + for (var i = 0; i < s.length; i++) { + if (wavView[p + i] != s.charCodeAt(i)) { + return false; + }; + }; + return true; + }; - if (eq(0, "RIFF") && eq(8, "WAVEfmt ")) { + if (eq(0, "RIFF") && eq(8, "WAVEfmt ")) { - var numCh = wavView[22]; - if (wavView[20] == 1 && (numCh == 1 || numCh == 2)) {//raw pcm 单或双声道 - var sampleRate = wavView[24] + (wavView[25] << 8) + (wavView[26] << 16) + (wavView[27] << 24); - var bitRate = wavView[34] + (wavView[35] << 8); - var heads = [wavView.subarray(0, 12)], headSize = 12;//head只保留必要的块 - //搜索data块的位置 - var dataPos = 0; // 44 或有更多块 - for (var i = 12, iL = wavView.length - 8; i < iL;) { - if (wavView[i] == 100 && wavView[i + 1] == 97 && wavView[i + 2] == 116 && wavView[i + 3] == 97) {//eq(i,"data") - heads.push(wavView.subarray(i, i + 8)); - headSize += 8; - dataPos = i + 8; break; - } - var i0 = i; - i += 4; - i += 4 + wavView[i] + (wavView[i + 1] << 8) + (wavView[i + 2] << 16) + (wavView[i + 3] << 24); - if (i0 == 12) {//fmt - heads.push(wavView.subarray(i0, i)); - headSize += i - i0; - } - } - if (dataPos) { - var wavHead = new Uint8Array(headSize); - for (var i = 0, n = 0; i < heads.length; i++) { - wavHead.set(heads[i], n); n += heads[i].length; - } - return { - sampleRate: sampleRate - , bitRate: bitRate - , numChannels: numCh - , wavHead44: wavHead - , dataPos: dataPos - }; - }; - }; - }; - return null; + var numCh = wavView[22]; + if (wavView[20] == 1 && (numCh == 1 || numCh == 2)) {//raw pcm 单或双声道 + var sampleRate = wavView[24] + (wavView[25] << 8) + (wavView[26] << 16) + (wavView[27] << 24); + var bitRate = wavView[34] + (wavView[35] << 8); + var heads = [wavView.subarray(0, 12)], headSize = 12;//head只保留必要的块 + //搜索data块的位置 + var dataPos = 0; // 44 或有更多块 + for (var i = 12, iL = wavView.length - 8; i < iL;) { + if (wavView[i] == 100 && wavView[i + 1] == 97 && wavView[i + 2] == 116 && wavView[i + 3] == 97) {//eq(i,"data") + heads.push(wavView.subarray(i, i + 8)); + headSize += 8; + dataPos = i + 8; break; + } + var i0 = i; + i += 4; + i += 4 + wavView[i] + (wavView[i + 1] << 8) + (wavView[i + 2] << 16) + (wavView[i + 3] << 24); + if (i0 == 12) {//fmt + heads.push(wavView.subarray(i0, i)); + headSize += i - i0; + } + } + if (dataPos) { + var wavHead = new Uint8Array(headSize); + for (var i = 0, n = 0; i < heads.length; i++) { + wavHead.set(heads[i], n); n += heads[i].length; + } + return { + sampleRate: sampleRate + , bitRate: bitRate + , numChannels: numCh + , wavHead44: wavHead + , dataPos: dataPos + }; + }; + }; + }; + return null; }; function upfileOnchange(files) { - this.files = [files]; - var len = this.files.length; - for (let i = 0; i < len; i++) { - let fileAudio = new FileReader(); - fileAudio.readAsArrayBuffer(this.files[i]); - file_ext = this.files[i].name.split('.').pop().toLowerCase(); - var audioblob; - fileAudio.onload = function () { - audioblob = fileAudio.result; - file_data_array = audioblob; - } + this.files = [files]; + var len = this.files.length; + for (let i = 0; i < len; i++) { + let fileAudio = new FileReader(); + fileAudio.readAsArrayBuffer(this.files[i]); + file_ext = this.files[i].name.split('.').pop().toLowerCase(); + var audioblob; + fileAudio.onload = function () { + audioblob = fileAudio.result; + file_data_array = audioblob; + } - fileAudio.onerror = function (e) { - console.log('error' + e); - } - } - // for wav file, we get the sample rate - if (file_ext == "wav") { - for (let i = 0; i < len; i++) { - let fileAudio = new FileReader(); - fileAudio.readAsArrayBuffer(this.files[i]); - fileAudio.onload = function () { - audioblob = new Uint8Array(fileAudio.result); + fileAudio.onerror = function (e) { + console.log('error' + e); + } + } + // for wav file, we get the sample rate + if (file_ext == "wav") { + for (let i = 0; i < len; i++) { + let fileAudio = new FileReader(); + fileAudio.readAsArrayBuffer(this.files[i]); + fileAudio.onload = function () { + audioblob = new Uint8Array(fileAudio.result); - var info = readWavInfo(audioblob); - file_sample_rate = info.sampleRate; - } - } - } + var info = readWavInfo(audioblob); + file_sample_rate = info.sampleRate; + } + } + } } function play_file() { - var audioblob = new Blob([new Uint8Array(file_data_array)], { type: "audio/wav" }); - var audio_record = document.getElementById('audio_record'); - audio_record.src = (window.URL || webkitURL).createObjectURL(audioblob); - audio_record.controls = true; + var audioblob = new Blob([new Uint8Array(file_data_array)], { type: "audio/wav" }); + var audio_record = document.getElementById('audio_record'); + audio_record.src = (window.URL || webkitURL).createObjectURL(audioblob); + audio_record.controls = true; } function start_file_send() { - sampleBuf = new Uint8Array(file_data_array); - var chunk_size = 960; // for asr chunk_size [5, 10, 5] - while (sampleBuf.length >= chunk_size) { - sendBuf = sampleBuf.slice(0, chunk_size); - totalsend = totalsend + sampleBuf.length; - sampleBuf = sampleBuf.slice(chunk_size, sampleBuf.length); - wsconnecter.wsSend(sendBuf); - } - stop(); + sampleBuf = new Uint8Array(file_data_array); + var chunk_size = 960; // for asr chunk_size [5, 10, 5] + while (sampleBuf.length >= chunk_size) { + sendBuf = sampleBuf.slice(0, chunk_size); + totalsend = totalsend + sampleBuf.length; + sampleBuf = sampleBuf.slice(chunk_size, sampleBuf.length); + wsconnecter.wsSend(sendBuf); + } + stop(); } function stop() { - var chunk_size = new Array(5, 10, 5); - var request = { - "chunk_size": chunk_size, - "wav_name": "h5", - "is_speaking": false, - "chunk_interval": 10, - "mode": getAsrMode(), - }; - if (sampleBuf.length > 0) { - wsconnecter.wsSend(sampleBuf); - sampleBuf = new Int16Array(); - } - wsconnecter.wsSend(JSON.stringify(request)); - // 控件状态更新 - isRec = false; - if (isfilemode == false) { - //wait 3s for asr result - setTimeout(function () { - wsconnecter.wsStop(); - }, 3000); - rec.stop(function (blob, duration) { - var audioBlob = Recorder.pcm2wav(data = { sampleRate: 16000, bitRate: 16, blob: blob }, - function (theblob, duration) { - console.log(theblob); - var audio_record = document.getElementById('audio_record'); - audio_record.src = (window.URL || webkitURL).createObjectURL(theblob); - audio_record.controls = true; - }, function (msg) { - console.log(msg); - } - ); + var chunk_size = new Array(5, 10, 5); + var request = { + "chunk_size": chunk_size, + "wav_name": "h5", + "is_speaking": false, + "chunk_interval": 10, + "mode": getAsrMode(), + }; + if (sampleBuf.length > 0) { + wsconnecter.wsSend(sampleBuf); + sampleBuf = new Int16Array(); + } + wsconnecter.wsSend(JSON.stringify(request)); + // 控件状态更新 + isRec = false; + if (isfilemode == false) { + //wait 3s for asr result + setTimeout(function () { + wsconnecter.wsStop(); + }, 3000); + rec.stop(function (blob, duration) { + var audioBlob = Recorder.pcm2wav(data = { sampleRate: 16000, bitRate: 16, blob: blob }, + function (theblob, duration) { + console.log(theblob); + var audio_record = document.getElementById('audio_record'); + audio_record.src = (window.URL || webkitURL).createObjectURL(theblob); + audio_record.controls = true; + }, function (msg) { + console.log(msg); + } + ); - }, function (errMsg) { - console.log("errMsg: " + errMsg); - }); - } - // 停止连接 + }, function (errMsg) { + console.log("errMsg: " + errMsg); + }); + } + // 停止连接 } function getAsrMode() { - return 'offline'; + return 'offline'; } function getHotwords() { - return null + return null } function handleWithTimestamp(tmptext, tmptime) { - if (tmptime == null || tmptime == "undefined" || tmptext.length <= 0) { - return tmptext; - } - tmptext = tmptext.replace(/。|?|,|、|\?|\.|\ /g, ","); // in case there are a lot of "。" - var words = tmptext.split(","); // split to chinese sentence or english words - var jsontime = JSON.parse(tmptime); //JSON.parse(tmptime.replace(/\]\]\[\[/g, "],[")); // in case there are a lot segments by VAD - var char_index = 0; // index for timestamp - var text_withtime = ""; - for (var i = 0; i < words.length; i++) { - if (words[i] == "undefined" || words[i].length <= 0) { - continue; - } - if (/^[a-zA-Z]+$/.test(words[i])) { // if it is english - text_withtime = text_withtime + jsontime[char_index][0] / 1000 + ":" + words[i] + "\n"; - char_index = char_index + 1; //for english, timestamp unit is about a word - } - else { - text_withtime = text_withtime + jsontime[char_index][0] / 1000 + ":" + words[i] + "\n"; - char_index = char_index + words[i].length; //for chinese, timestamp unit is about a char - } - } - return text_withtime; + if (tmptime == null || tmptime == "undefined" || tmptext.length <= 0) { + return tmptext; + } + tmptext = tmptext.replace(/。|?|,|、|\?|\.|\ /g, ","); // in case there are a lot of "。" + var words = tmptext.split(","); // split to chinese sentence or english words + var jsontime = JSON.parse(tmptime); //JSON.parse(tmptime.replace(/\]\]\[\[/g, "],[")); // in case there are a lot segments by VAD + var char_index = 0; // index for timestamp + var text_withtime = ""; + for (var i = 0; i < words.length; i++) { + if (words[i] == "undefined" || words[i].length <= 0) { + continue; + } + if (/^[a-zA-Z]+$/.test(words[i])) { // if it is english + text_withtime = text_withtime + jsontime[char_index][0] / 1000 + ":" + words[i] + "\n"; + char_index = char_index + 1; //for english, timestamp unit is about a word + } + else { + text_withtime = text_withtime + jsontime[char_index][0] / 1000 + ":" + words[i] + "\n"; + char_index = char_index + words[i].length; //for chinese, timestamp unit is about a char + } + } + return text_withtime; } // 语音识别结果; 对jsonMsg数据解析,将识别结果附加到编辑框中 function getJsonMessage(jsonMsg) { - var rectxt = "" + JSON.parse(jsonMsg.data)['text']; - var asrmodel = JSON.parse(jsonMsg.data)['mode']; - var is_final = JSON.parse(jsonMsg.data)['is_final']; - var timestamp = JSON.parse(jsonMsg.data)['timestamp']; - if (asrmodel == "2pass-offline" || asrmodel == "offline") { - offline_text = offline_text + handleWithTimestamp(rectxt, timestamp); //rectxt; //.replace(/ +/g,""); - rec_text = offline_text; - } else { - rec_text = rec_text + rectxt; - } - videoText = rec_text; - if (is_final == true) { - play_file(); - wsconnecter.wsStop(); - btnConnect.disabled = false; - } + var rectxt = "" + JSON.parse(jsonMsg.data)['text']; + var asrmodel = JSON.parse(jsonMsg.data)['mode']; + var is_final = JSON.parse(jsonMsg.data)['is_final']; + var timestamp = JSON.parse(jsonMsg.data)['timestamp']; + if (asrmodel == "2pass-offline" || asrmodel == "offline") { + offline_text = offline_text + handleWithTimestamp(rectxt, timestamp); //rectxt; //.replace(/ +/g,""); + rec_text = offline_text; + } else { + rec_text = rec_text + rectxt; + } + videoText = rec_text; + if (is_final == true) { + play_file(); + wsconnecter.wsStop(); + btnConnect.disabled = false; + } } // 连接状态响应 function getConnState(connState) { - if (connState === 0) start_file_send(); + if (connState === 0) start_file_send(); } // 识别启动、停止、清空操作 function start() { - var ret = wsconnecter.wsStart();//启动连接 - return ret == 1 ? 1 : 0; + var ret = wsconnecter.wsStart();//启动连接 + return ret == 1 ? 1 : 0; } function recProcess(buffer, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) { - if (isRec === true) { - var data_48k = buffer[buffer.length - 1]; - var array_48k = new Array(data_48k); - var data_16k = Recorder.SampleData(array_48k, bufferSampleRate, 16000).data; - sampleBuf = Int16Array.from([...sampleBuf, ...data_16k]); - var chunk_size = 960; // for asr chunk_size [5, 10, 5] - while (sampleBuf.length >= chunk_size) { - sendBuf = sampleBuf.slice(0, chunk_size); - sampleBuf = sampleBuf.slice(chunk_size, sampleBuf.length); - wsconnecter.wsSend(sendBuf); - } - } + if (isRec === true) { + var data_48k = buffer[buffer.length - 1]; + var array_48k = new Array(data_48k); + var data_16k = Recorder.SampleData(array_48k, bufferSampleRate, 16000).data; + sampleBuf = Int16Array.from([...sampleBuf, ...data_16k]); + var chunk_size = 960; // for asr chunk_size [5, 10, 5] + while (sampleBuf.length >= chunk_size) { + sendBuf = sampleBuf.slice(0, chunk_size); + sampleBuf = sampleBuf.slice(chunk_size, sampleBuf.length); + wsconnecter.wsSend(sendBuf); + } + } } function getUseITN() { - return false; + return false; } diff --git a/src/App.vue b/src/App.vue index 1321975..c3cc271 100644 --- a/src/App.vue +++ b/src/App.vue @@ -12,6 +12,7 @@ import { useStore } from "vuex"; import { getItem, setItem} from "@/utils/storage"; import { generateNewStyle, writeNewStyle } from "@/utils/theme"; const { proxy } = getCurrentInstance(); + const store = useStore(); generateNewStyle(store.getters.mainColor).then((newStyle) => { writeNewStyle(newStyle); diff --git a/src/api/commit.js b/src/api/commit.js new file mode 100644 index 0000000..a229afd --- /dev/null +++ b/src/api/commit.js @@ -0,0 +1,86 @@ +import request from "@/utils/request"; +const api = "/mosty-api/mosty-base"; +const gsxtApi = "/mosty-api/mosty-gsxt"; +// 查询未读消息 +export const queryYdxxPageList = (data) => { + return request({ + url: api + "/fzmsg/queryYdxxPageList", + method: "POST", + data + }); +}; +//查看未读详情 +export const queryWdxxDetail = (data) => { + return request({ + url: api + "/fzmsg/queryWdxxDetail", + method: "POST", + data + }); +}; + +// 查询一睹消息 +export const queryWdxxPageList = (data) => { + return request({ + url: api + "/fzmsg/queryWdxxPageList ", + method: "POST", + data + }); +}; +export const queryYdxxDetail = (data) => { + return request({ + url: api + "/fzmsg/queryYdxxDetail", + method: "POST", + data + }); +}; +export const queryXxTj = (data) => { + return request({ + url: api + "/fzmsg/queryXxTj", + method: "POST", + data + }); +}; +// 下发指令 +export const updateBkgzl = (params) => { + return request({ + url: gsxtApi + "/tbGsxtBk/updateBkgzl", + method: "get", + params + }); +}; +// 签收 +export const qsXx = (data) => { + return request({ + url: api + "/fzmsg/qsXx", + method: "post", + data + }); +}; + +// 预警发送指令 +export const sendFqzl = (data) => { + return request({ + url: gsxtApi + "/tbYjxx/sendFqzl", + method: "post", + data + }); +}; + +// 重点人发掘发送指令 + +export const ZdrfjSendFqzl = (data) => { + return request({ + url: gsxtApi + "/tbGsxtRqfjRy/sendFqzl", + method: "post", + data + }); +}; +//线索流转 + +export const qbcjSendFqzl = (data) => { + return request({ + url: gsxtApi + "/qbcj/sendFqzl", + method: "post", + data + }); +}; diff --git a/src/api/spl.js b/src/api/spl.js new file mode 100644 index 0000000..563fcc8 --- /dev/null +++ b/src/api/spl.js @@ -0,0 +1,100 @@ +import request from "@/utils/request"; +import axios from "axios"; +import qs from 'qs'; // 或者使用 URLSearchParams +const api = "/bpm"; +// 解析数据 +export function ParsingText(data, fun) { + axios({ + method: 'post', + url: '/chat/completions', + data: data, + headers: { 'Authorization': 'Bearer sk-064b5c53131c4046883b718f2b31c050' } + }).then((res) => { + fun(res) + }) +} + + +//get 请求 +export const splFlvGet = (params = {}, url) => { + return request({ + url: url, + method: "get", + params + }); +}; + + + +//get 请求 +export const splGet = (params = {}, url) => { + return request({ + url: api + url, + method: "get", + params + }); +}; +//post 请求 +export const splPost = (data = {}, url) => { + return request({ + url: api + url, + method: "post", + data + }); +}; +//put 请求 +export const splPut = (data = {}, url) => { + return request({ + url: api + url, + method: "put", + data + }); +}; +//put 请求 +export const splDelete = (data = {}, url) => { + return request({ + url: api + url, + method: "delete", + data + }); +}; + + + + +export const submitProcess = (data) => { + return request({ + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + url: api + '/process/createProcess', + method: 'post', + data: qs.stringify(data) + }); +}; + +export const queryProcessNode = (data) => { + return request({ + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + url: api + '/process/queryProcessNode', + method: 'post', + data: qs.stringify(data) + }); +}; +export const queryProcessNodeLog = (data) => { + return request({ + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + url: api + '/process/queryProcessNodeLog', + method: 'post', + data: qs.stringify(data) + }); +}; +export const queryProcess = (data) => { + return request({ + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + url: api + '/process/queryProcess', + method: 'post', + data: qs.stringify(data) + }); +}; + + + diff --git a/src/assets/css/pulic.scss b/src/assets/css/pulic.scss index 7858e79..8b4f89b 100644 --- a/src/assets/css/pulic.scss +++ b/src/assets/css/pulic.scss @@ -1,19 +1,23 @@ -.h-100{ +.h-100 { height: 100%; } -.w-100{ + +.w-100 { width: 100%; } -.flexcc{ -display: flex; -justify-content: center; -align-items: center; + +.flexcc { + display: flex; + justify-content: center; + align-items: center; } -.flexcb{ + +.flexcb { display: flex; justify-content: space-between; align-items: center; - } +} + .font10 { font-size: 10px; } @@ -64,12 +68,10 @@ align-items: center; // 分割线 .divider { - background: linear-gradient( - 90.143958942072deg, - rgba(14, 48, 115, 1) 0%, - rgba(70, 159, 251, 1) 50%, - rgba(14, 48, 115, 1) 100% - ); + background: linear-gradient(90.143958942072deg, + rgba(14, 48, 115, 1) 0%, + rgba(70, 159, 251, 1) 50%, + rgba(14, 48, 115, 1) 100%); height: 1px; } @@ -137,6 +139,7 @@ align-items: center; .relative { position: relative; } + .absolute { position: absolute; } @@ -180,9 +183,11 @@ align-items: center; .flex { display: flex; } + .flex-grow1 { flex-grow: 1; } + .shrink0 { flex-shrink: 0; } @@ -190,6 +195,7 @@ align-items: center; .flex-warp { flex-wrap: wrap; } + .flex-nowrap { flex-wrap: nowrap; } @@ -200,7 +206,9 @@ align-items: center; .just-between { justify-content: space-between; + } + .just-around { justify-content: space-around; } @@ -221,14 +229,18 @@ align-items: center; align-items: start; } -.align-center { - align-items: center; +.align-space-around { + align-content: space-around; } .align-bottom { align-items: flex-end; } +.align-center { + align-items: center; +} + /**********文本省略***********/ .nowrap { white-space: nowrap; @@ -328,11 +340,11 @@ align-items: center; } .ww#{$i} { - width: #{$i}+ "%"; + width: #{$i}+"%"; } .hh#{$i} { - height: #{$i}+ "%"; + height: #{$i}+"%"; } //高度 @@ -345,24 +357,29 @@ align-items: center; .lh#{$i} { line-height: #{$i}px; } - //自适应大号字体(通常为统计数字 18-30) - .font_size_big{ - font-size: clamp(1.125rem, -0.894rem + 2.31vw, 1.875rem); -} + + //自适应大号字体(通常为统计数字 18-30) + .font_size_big { + font-size: clamp(1.125rem, -0.894rem + 2.31vw, 1.875rem); + } + //自适应一号字体(通常为一级标题 14-18) - .font_size_title{ + .font_size_title { font-size: clamp(0.875rem, 0.37rem + 0.58vw, 1.063rem); } + //自适应统计字体(通常为统计数字 14-22) - .font_size1{ + .font_size1 { font-size: clamp(0.875rem, -0.471rem + 1.54vw, 1.375rem); } - //自适应二号字体(通常为二级标题 14-16) - .font_size2{ + + //自适应二号字体(通常为二级标题 14-16) + .font_size2 { font-size: clamp(0.75rem, 0.077rem + 0.77vw, 1rem); } + //自适应普通字体(通常为默认大小 10-14) - .font_size_default{ + .font_size_default { font-size: clamp(0.625rem, -0.048rem + 0.77vw, 0.875rem); } } @@ -373,6 +390,7 @@ align-items: center; font-weight: normal; font-style: normal; } + @font-face { font-family: "HANYILINGXINTIJIAN"; src: url("~@/assets/font/HANYILINGXINTIJIAN-1.TTF"); diff --git a/src/assets/images/tztg.png b/src/assets/images/tztg.png new file mode 100644 index 0000000000000000000000000000000000000000..f92f1599de9f4a183e1bc8bcdfbbd548d9319cf8 GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z7>k44ofy`glX(f`><#b?SX^dyL19H@bzMVqTSs^A z(iN-MtX;SH!lf%$uiw1&;K{QW?>>J2@$2tVxAUezlP-C>IEGl9-g^1EP?LcG>xBrx zYR8S=yN)&85cu?ezUrY2jtQ-WPwdjpsmwmhrfAmMyKa3EhtDsMH4jueW*zb4b+KjN z>S$7afy1cQ$!U9)G;=a@(6)&JlNi1lPFU2o{*GFNYD?qRj8liqH)ZOUuy}PvHy3=0 zc`iHIN>HKtxok9x&s{fXiPBt?f5uU1Hoe;S|71LTn-|7y@ov?|%0Dqb7&q@^S|k3?#4J%UA`Z7>k44ofy`glX(f`d<*aiaRt)< zM;_R?{b&u)=Yb_be!&ckOw25-Z0sDIT->~T`~t$FV&algGU}QJMrM{)4t@baQSk|B zS$RdJ)%6|SJ(H%+oV9lShK-wc?ApC&|G`6tFJ8KQ>-L>{kDk7K_4eI|Pv3tZ+IXn~ zX!vta7sn6@$+-uwhaGYdVZ9*S%d7qEU|;MJJ29PvgHlsI|F>6G(^2m%e&1ZJyuAMV zyRzl{tLAx^#jsphW3-L!=AFbNF3HsrajjXi&%NfdNs~Tvi+_Uo)s%aTMNQKGLfx*Z z*)HN-!n^14@}@1NReM`KHhzh25_b7=yE%Bt1Br7stjh~{SjGAl9ynwu5@FHC#C<#< z;h_YVPF?R+jS30J@QCFru5}*~6P5P36CCKi#^J1Zl5q&{L-!lY9tn49Yn_{@u~p-j z#=`89!pIE<9re5Nj-Fev(kQGk?Nh64|KkAP`8M{lq7%RJR&Kht%EYLE1L$Q2Pgg&e IbxsLQ0Cky|$^ZZW literal 0 HcmV?d00001 diff --git a/src/assets/images/xxxt.png b/src/assets/images/xxxt.png new file mode 100644 index 0000000000000000000000000000000000000000..20c7d0985f35aed1eae1a2dcd4d8a7998522a959 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z7>k44ofy`glX(ebD+Kt2xB>J}`{pOM?7@85o&ZIJvla`S=CIB_vhU_4Ex4P0TGU9b7$q`~m`lLL#FQ zQq!|@@(N1oTHCvOCrz0;W9IAy3l}e0x@`I8-Fx@#KXU5AjhnY_-?@A5;iG3SUcG+v z_T9%X-@gC&`RmW$e>)5pZUIJ%rKgKyh=gS8L3VrTLWbiH*L!tm^mJbh=#+cf6Y=({ zR%c*~)N<8hKllDGf2i{Br$^D_%8W}><26Iqt=C>UwZ{A*o7uZ71=|fhcHi^edgGT* z_nhTsaeZp{Yg<1&uSgFQe3o(IXV(XtbF+Jvd;B-LlB<1;&ouJrsZUwn8_PJpgov)b z#Vj&q0mB-tgIWP$O-2RFSkfERA0H^3vxv#{cp+a(#eu0j;u}OZFoYjdEzmm5s>7;t zVCqNq8&e-LO=A*!aOwu@wA44Zx9weUpegtEZ=eBPBl8MjGo@iFG>A4i}LG;x8M{`eBw^sadoBU?wtv|BMjvimSDoW?F z-sXyhX=aLcJZJykvbLG{(ZX#?U#5TQ@%WB!na|3fKFj!=t!}E{QQ?tZ)KDz|j4uXH LS3j3^P6 -