From 137c22a702e38e3e09ef361205701126104ec741 Mon Sep 17 00:00:00 2001 From: "https://blog.iamtsm.cn" <1905333456@qq.com> Date: Sat, 28 Oct 2023 15:03:00 +0800 Subject: [PATCH] feat: inndexdb file setting feat: wxapp scan login feat: auto join fixed room setting feat: local netword room scan setting feat: message dot setting feat: system room feat: mysql table index perf feat: message top/admin flag feat: custom file transfer setting feat: code perf feat: setting perf feat: log perf feat: css perf fix: url args encode --- .gitignore | 4 +- doc/gitbook/SETTING.md | 53 + doc/gitbook/SUMMARY.md | 3 + .../install/INSTALL_BY_COMMAND_SHELL.md | 10 +- svr/conf/cfg.json | 8 +- svr/package-lock.json | 1845 +++----- svr/package.json | 4 + svr/src/bussiness/cache/cache.js | 50 + svr/src/bussiness/cache/key.js | 31 + svr/src/bussiness/cache/scan/scanCache.js | 105 + svr/src/bussiness/notify/notify.js | 200 +- svr/src/bussiness/notify/notifyHandler.js | 16 +- svr/src/bussiness/wxapi/wxapi.js | 100 + svr/src/controller/comm/comm.js | 19 +- svr/src/controller/dog/dog.js | 30 + svr/src/controller/dog/index.js | 7 +- svr/src/controller/login/index.js | 24 + svr/src/controller/login/login.js | 288 ++ svr/src/dao/dog/dog.js | 71 +- svr/src/dao/relation/relation.js | 139 + svr/src/dao/user/user.js | 64 + svr/src/socket/connect.js | 11 + .../rtcChangeNickName/changeNickName.js | 12 +- svr/src/socket/rtcChatingComm/chatingComm.js | 29 +- svr/src/socket/rtcChatingRoom/chatingRoom.js | 11 +- svr/src/socket/rtcCodeFile/addCodeFile.js | 11 +- svr/src/socket/rtcCodeFile/getCodeFile.js | 12 +- svr/src/socket/rtcCodeFile/prepareCodeFile.js | 12 +- svr/src/socket/rtcConstant.js | 2 + svr/src/socket/rtcCount/count.js | 6 + svr/src/socket/rtcCreateJoin/createJoin.js | 34 +- svr/src/socket/rtcDraw/draw.js | 13 +- svr/src/socket/rtcExit/exit.js | 6 +- .../socket/rtcLocalNetRoom/localNetRoom.js | 161 + svr/src/socket/rtcMessage/message.js | 11 +- svr/src/socket/rtcOpenai/openai.js | 11 +- svr/src/socket/rtcToken/token.js | 53 + svr/src/tables/dog.js | 10 + svr/src/tables/relation.js | 38 + svr/src/tables/room.js | 12 +- svr/src/tables/user.js | 50 + svr/src/utils/utils.js | 82 +- svr/static/js/localforage.min.js | 7 + svr/static/layui/css/admin.css | 2 +- svr/static/layui/font-ext/demo_index.html | 1117 +++-- svr/static/layui/font-ext/iconfont.css | 194 +- svr/static/layui/font-ext/iconfont.js | 2 +- svr/static/layui/font-ext/iconfont.json | 329 +- svr/static/layui/font-ext/iconfont.ttf | Bin 40784 -> 40088 bytes svr/static/layui/font-ext/iconfont.woff | Bin 24268 -> 24604 bytes svr/static/layui/font-ext/iconfont.woff2 | Bin 20756 -> 21108 bytes svr/static/layui/layui.js | 2 +- svr/tlapi.js | 5 + svr/vite.config.js | 12 +- svr/{res => web-res}/css/comm.css | 0 svr/{res => web-res}/css/index.css | 184 +- svr/{res => web-res}/disclaimer.html | 0 svr/{res => web-res}/home.html | 0 svr/{res => web-res}/home_en.html | 0 svr/{res => web-res}/image/44826979.png | Bin svr/{res => web-res}/image/coffee.jpeg | Bin svr/{res => web-res}/image/drawcircle.png | Bin svr/{res => web-res}/image/drawcirclefill.png | Bin svr/{res => web-res}/image/drawdelete.png | Bin svr/{res => web-res}/image/drawhexagon.png | Bin .../image/drawhexagonfill.png | Bin svr/{res => web-res}/image/drawline.png | Bin svr/{res => web-res}/image/drawrectangle.png | Bin .../image/drawrectanglefill.png | Bin svr/{res => web-res}/image/drawrhomboid.png | Bin .../image/drawrhomboidfill.png | Bin svr/{res => web-res}/image/drawstar.png | Bin svr/{res => web-res}/image/drawstarfill.png | Bin svr/{res => web-res}/image/drawtext.png | Bin svr/{res => web-res}/image/drawtriangle.png | Bin .../image/drawtrianglefill.png | Bin svr/web-res/image/qrcode.jpeg | Bin 0 -> 89413 bytes svr/{res => web-res}/index.html | 184 +- svr/{res => web-res}/js/audioShare.js | 0 svr/{res => web-res}/js/comm.js | 6 +- svr/{res => web-res}/js/draw.js | 0 svr/{res => web-res}/js/index.js | 4071 ++++++++++------- svr/{res => web-res}/js/language.js | 152 +- svr/{res => web-res}/js/liveShare.js | 0 svr/{res => web-res}/js/screen.js | 0 svr/{res => web-res}/js/screenShare.js | 0 svr/{res => web-res}/js/videoShare.js | 0 svr/{res => web-res}/pay.html | 0 svr/wxapp-res/app.js | 13 + svr/wxapp-res/app.json | 17 + svr/wxapp-res/app.wxss | 11 + svr/wxapp-res/images/demo.png | Bin 0 -> 12824 bytes svr/wxapp-res/images/gitee.png | Bin 0 -> 490 bytes svr/wxapp-res/images/github.png | Bin 0 -> 454 bytes svr/wxapp-res/images/succ.png | Bin 0 -> 7296 bytes svr/wxapp-res/pages/login/login.js | 180 + svr/wxapp-res/pages/login/login.json | 5 + svr/wxapp-res/pages/login/login.wxml | 24 + svr/wxapp-res/pages/login/login.wxss | 55 + svr/wxapp-res/pages/succ/succ.js | 62 + svr/wxapp-res/pages/succ/succ.json | 5 + svr/wxapp-res/pages/succ/succ.wxml | 5 + svr/wxapp-res/pages/succ/succ.wxss | 34 + svr/wxapp-res/project.config.json | 28 + tlrtcfile.env | 7 + 105 files changed, 6648 insertions(+), 3723 deletions(-) create mode 100644 doc/gitbook/SETTING.md create mode 100644 svr/src/bussiness/cache/cache.js create mode 100644 svr/src/bussiness/cache/key.js create mode 100644 svr/src/bussiness/cache/scan/scanCache.js create mode 100644 svr/src/bussiness/wxapi/wxapi.js create mode 100644 svr/src/controller/dog/dog.js create mode 100644 svr/src/controller/login/index.js create mode 100644 svr/src/controller/login/login.js create mode 100644 svr/src/dao/relation/relation.js create mode 100644 svr/src/dao/user/user.js create mode 100644 svr/src/socket/rtcLocalNetRoom/localNetRoom.js create mode 100644 svr/src/socket/rtcToken/token.js create mode 100644 svr/src/tables/relation.js create mode 100644 svr/src/tables/user.js create mode 100644 svr/static/js/localforage.min.js rename svr/{res => web-res}/css/comm.css (100%) rename svr/{res => web-res}/css/index.css (88%) rename svr/{res => web-res}/disclaimer.html (100%) rename svr/{res => web-res}/home.html (100%) rename svr/{res => web-res}/home_en.html (100%) rename svr/{res => web-res}/image/44826979.png (100%) rename svr/{res => web-res}/image/coffee.jpeg (100%) rename svr/{res => web-res}/image/drawcircle.png (100%) rename svr/{res => web-res}/image/drawcirclefill.png (100%) rename svr/{res => web-res}/image/drawdelete.png (100%) rename svr/{res => web-res}/image/drawhexagon.png (100%) rename svr/{res => web-res}/image/drawhexagonfill.png (100%) rename svr/{res => web-res}/image/drawline.png (100%) rename svr/{res => web-res}/image/drawrectangle.png (100%) rename svr/{res => web-res}/image/drawrectanglefill.png (100%) rename svr/{res => web-res}/image/drawrhomboid.png (100%) rename svr/{res => web-res}/image/drawrhomboidfill.png (100%) rename svr/{res => web-res}/image/drawstar.png (100%) rename svr/{res => web-res}/image/drawstarfill.png (100%) rename svr/{res => web-res}/image/drawtext.png (100%) rename svr/{res => web-res}/image/drawtriangle.png (100%) rename svr/{res => web-res}/image/drawtrianglefill.png (100%) create mode 100644 svr/web-res/image/qrcode.jpeg rename svr/{res => web-res}/index.html (90%) rename svr/{res => web-res}/js/audioShare.js (100%) rename svr/{res => web-res}/js/comm.js (99%) rename svr/{res => web-res}/js/draw.js (100%) rename svr/{res => web-res}/js/index.js (75%) rename svr/{res => web-res}/js/language.js (83%) rename svr/{res => web-res}/js/liveShare.js (100%) rename svr/{res => web-res}/js/screen.js (100%) rename svr/{res => web-res}/js/screenShare.js (100%) rename svr/{res => web-res}/js/videoShare.js (100%) rename svr/{res => web-res}/pay.html (100%) create mode 100644 svr/wxapp-res/app.js create mode 100644 svr/wxapp-res/app.json create mode 100644 svr/wxapp-res/app.wxss create mode 100644 svr/wxapp-res/images/demo.png create mode 100644 svr/wxapp-res/images/gitee.png create mode 100644 svr/wxapp-res/images/github.png create mode 100644 svr/wxapp-res/images/succ.png create mode 100644 svr/wxapp-res/pages/login/login.js create mode 100644 svr/wxapp-res/pages/login/login.json create mode 100644 svr/wxapp-res/pages/login/login.wxml create mode 100644 svr/wxapp-res/pages/login/login.wxss create mode 100644 svr/wxapp-res/pages/succ/succ.js create mode 100644 svr/wxapp-res/pages/succ/succ.json create mode 100644 svr/wxapp-res/pages/succ/succ.wxml create mode 100644 svr/wxapp-res/pages/succ/succ.wxss create mode 100644 svr/wxapp-res/project.config.json diff --git a/.gitignore b/.gitignore index 77cc42f..917f766 100644 --- a/.gitignore +++ b/.gitignore @@ -42,8 +42,8 @@ node_modules # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* -svr/res/js/*.min.* -svr/res/css/*.min.* +svr/web-res/js/*.min.* +svr/web-res/css/*.min.* dist/ diff --git a/doc/gitbook/SETTING.md b/doc/gitbook/SETTING.md new file mode 100644 index 0000000..1866cc8 --- /dev/null +++ b/doc/gitbook/SETTING.md @@ -0,0 +1,53 @@ +# 设置选项说明 + +### webrtc检测 + +简单检测浏览器是否支持webrtc,如果不支持,网页许多功能将不能使用。一般来说,目前市面上大多数浏览器都是支持webrtc的 + +### 日志列表 + +点击打开日志列表,会将系统执行日志进行展示,包括系统日志,用户操作日志 + +### 执行日志 【此开关刷新网页后失效,需重新设置】 + +控制是否开启日志输出。默认是开启的。 + +### 中继设置 【此开关刷新网页后有效,长久保存】 + +用于保障webrtc数据兜底成功传输,默认是不开启的,但是不开启的话,可能在一些网络受限的情况下,可能导致p2p连接失败。 + +### 文件持久化 【此开关刷新网页后有效,长久保存】 + +支持接收的文件存放在浏览器的indexedDb数据库中,也就是长久存放在客户端,刷新网页后会自动加载历史的接收缓存文件记录,支持选择性删除。 + +### socket地址 【此设置刷新网页后有效,长久保存】 + +自定义websocket地址,支持连接指定websocket服务地址。 + +### ai上下文 【此开关刷新网页后失效,需重新设置】 + +chatgpt聊天框的对话上下文的简单处理。 + +### 消息红点 【此设置刷新网页后有效,长久保存】 + +主动关闭消息通知的红点,适用于 “强迫症“ 伙伴。 + +### 固定房间号 【此设置刷新网页后有效,长久保存】 + +自定义一个房间号,设置好之后,每次自动进入,无需额外输入。 + +### 局域网房间 (开发中) + +开启设置后,你创建的房间,同一个局域网用户进入网页后将看到你创建的房间。 + +### 文件分片传输大小 【此开关刷新网页后失效,需重新设置】 + +由于网站的文件传输是分片传输,但是由于webrtc的数据传输通道有限制,所以项目提供了一个合理范围的可选项,用于自定义控制每次webrtc的数据通道发送数据时的分片大小。默认是 16KB,最大可调整到64KB(不同浏览器实现可能不同,16~64是我认为比较合适的可选范围) + +### 预览文件大小限制 【此开关刷新网页后失效,需重新设置】 + +在选择完待传输的文件后,网站支持在线本地预览多种格式的文件。但是由于预览文件过大,会导致浏览器过于卡顿,所以提供了一个我认为比较合适的可选范围,默认5M,最大15M + +### 执行日志输出限制 【此开关刷新网页后失效,需重新设置】 + +由于数据传输和用户操作量日志可能较大,对浏览器会造成一些卡顿,默认提供了一个我认为比较合适的可选范围,默认300条,最大800条 \ No newline at end of file diff --git a/doc/gitbook/SUMMARY.md b/doc/gitbook/SUMMARY.md index 5230e09..39d7553 100644 --- a/doc/gitbook/SUMMARY.md +++ b/doc/gitbook/SUMMARY.md @@ -66,4 +66,7 @@ * [屏幕录制](dev/svr/RECODE.md) +* [tl-rtc-file-设置选项说明](SETTING.md) + * [tl-rtc-file-常见问题列表](FAQ.md) + diff --git a/doc/gitbook/install/INSTALL_BY_COMMAND_SHELL.md b/doc/gitbook/install/INSTALL_BY_COMMAND_SHELL.md index edbab83..0dcad7c 100644 --- a/doc/gitbook/install/INSTALL_BY_COMMAND_SHELL.md +++ b/doc/gitbook/install/INSTALL_BY_COMMAND_SHELL.md @@ -2,7 +2,7 @@ 由于每个人的机器/环境都是有细微区别的,但是脚本能处理的情况有限,所以选择这种模式,有一定几率不能正常运行。但是可以遇到具体情况具体分析,或者可以加群反馈问题或者建议, QQ群 : 624214498 -目前支持 `ubuntu16`, `ubuntu18`, `ubuntu20`, `windows` 这几种自动脚本。 +目前支持 `ubuntu16`, `ubuntu18`, `ubuntu20`, `windows`, `centeros`, `macos` 这几种自动脚本。 ### ubuntu16/18/20/macos @@ -59,4 +59,10 @@ ### centeros -自动脚本待补充... \ No newline at end of file +- `auto-check-install-http.sh` 自动检测环境 + 安装环境 + 检测端口占用 + 调用 **`auto-start-http.sh`** 服务脚本 +- `auto-check-install-https.sh` 自动检测环境 + 安装环境 + 检测端口占用 + 调用 **`auto-start-https.sh`** 服务脚本 +- `auto-start-http.sh` pm2后台启动 **http** 服务脚本 +- `auto-start-https.sh` pm2后台启动 **https** 服务脚本 +- `auto-stop.sh` pm2删除服务进程 + +具体操作如ubuntu所示例,脚本内容如有问题,请反馈 \ No newline at end of file diff --git a/svr/conf/cfg.json b/svr/conf/cfg.json index 061ddd8..2d72c63 100644 --- a/svr/conf/cfg.json +++ b/svr/conf/cfg.json @@ -1,5 +1,5 @@ { - "version": "10.4.8", + "version": "10.4.9", "socket": { "port": "请到 tlrtcfile.env 中进行配置", "host": "请到 tlrtcfile.env 中进行配置" @@ -14,10 +14,14 @@ ] }, "res" : { - "/": "res/dist/" + "/": "web-res/dist/" } } }, + "login": { + "appId" : "请到 tlrtcfile.env 中进行配置", + "appSecret" : "请到 tlrtcfile.env 中进行配置" + }, "manage": { "room": "请到 tlrtcfile.env 中进行配置", "password": "请到 tlrtcfile.env 中进行配置" diff --git a/svr/package-lock.json b/svr/package-lock.json index c11f488..73d58f5 100644 --- a/svr/package-lock.json +++ b/svr/package-lock.json @@ -11,12 +11,15 @@ "dependencies": { "@grpc/grpc-js": "^1.8.0", "@grpc/proto-loader": "^0.6.0", + "body-parser": "^1.20.2", "concurrently": "^8.2.0", + "cookie-parser": "^1.4.6", "cross-env": "^5.2.0", "dotenv": "^16.3.1", "express": "^4.17.1", "glob": "^10.3.1", "google-protobuf": "^3.0.0", + "lru-cache": "^10.0.1", "mocha": "^10.2.0", "mysql2": "^2.1.0", "openai": "^3.3.0", @@ -27,13 +30,13 @@ "socket.io": "^2.3.0", "terser": "^5.18.2", "tl-ngrpc": "^1.0.1", + "uuid": "^9.0.1", "vite": "^4.3.9" } }, "node_modules/@babel/runtime": { "version": "7.22.6", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -41,58 +44,12 @@ "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.11.tgz", - "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", - "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.11.tgz", - "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", - "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -101,280 +58,9 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", - "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", - "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", - "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", - "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", - "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", - "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", - "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", - "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", - "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", - "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", - "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", - "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", - "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", - "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", - "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", - "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", - "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", - "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.8.18", - "resolved": "https://registry.npmmirror.com/@grpc/grpc-js/-/grpc-js-1.8.18.tgz", - "integrity": "sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==", + "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" @@ -385,8 +71,7 @@ }, "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { "version": "0.7.8", - "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", - "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "license": "Apache-2.0", "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", @@ -403,16 +88,14 @@ }, "node_modules/@grpc/grpc-js/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@grpc/grpc-js/node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -424,13 +107,11 @@ }, "node_modules/@grpc/grpc-js/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/@grpc/grpc-js/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -442,8 +123,7 @@ }, "node_modules/@grpc/grpc-js/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -453,8 +133,7 @@ }, "node_modules/@grpc/grpc-js/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -462,12 +141,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/@grpc/grpc-js/node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -483,16 +164,14 @@ }, "node_modules/@grpc/grpc-js/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@grpc/proto-loader": { "version": "0.6.13", - "resolved": "https://registry.npmmirror.com/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", - "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "license": "Apache-2.0", "dependencies": { "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", @@ -509,9 +188,8 @@ }, "node_modules/@grpc/proto-loader/node_modules/protobufjs": { "version": "6.11.3", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -534,8 +212,7 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -550,8 +227,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -563,24 +239,21 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -588,13 +261,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -602,13 +273,11 @@ }, "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -619,16 +288,14 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -639,8 +306,7 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -648,28 +314,23 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -677,49 +338,41 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "license": "BSD-3-Clause" }, "node_modules/@types/debug": { "version": "4.1.8", - "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/fs-extra": { "version": "8.1.2", - "resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/glob": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -727,33 +380,27 @@ }, "node_modules/@types/long": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "license": "MIT" }, "node_modules/@types/node": { "version": "20.4.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.4.0.tgz", - "integrity": "sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==" + "license": "MIT" }, "node_modules/@types/validator": { "version": "13.7.17", - "resolved": "https://registry.npmmirror.com/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + "license": "MIT" }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -764,8 +411,7 @@ }, "node_modules/acorn": { "version": "8.10.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -775,51 +421,55 @@ }, "node_modules/after": { "version": "0.8.2", - "resolved": "https://registry.npmmirror.com/after/-/after-0.8.2.tgz", - "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" + "license": "MIT" }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-colors": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -830,123 +480,105 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/arraybuffer.slice": { "version": "0.0.7", - "resolved": "https://registry.npmmirror.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + "license": "MIT" }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", - "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "license": "MIT" }, "node_modules/axios": { "version": "0.26.1", - "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.14.8" } }, "node_modules/backo2": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base64-arraybuffer": { "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", "engines": { "node": ">= 0.6.0" } }, "node_modules/base64id": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/blob": { "version": "0.0.5", - "resolved": "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -954,7 +586,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -965,16 +597,14 @@ }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -984,13 +614,11 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "license": "ISC" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", @@ -1002,42 +630,46 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caseless": { "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "license": "Apache-2.0" }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1047,8 +679,13 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1067,8 +704,7 @@ }, "node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1077,21 +713,18 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1103,8 +736,7 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1114,8 +746,7 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1123,12 +754,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1138,18 +771,15 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/colorette": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1159,33 +789,25 @@ }, "node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "license": "MIT" }, "node_modules/component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" + "version": "1.0.0" }, "node_modules/component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "license": "MIT" }, "node_modules/component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + "version": "0.0.3" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/concurrently": { "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "date-fns": "^2.30.0", @@ -1203,20 +825,21 @@ }, "engines": { "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, "node_modules/concurrently/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/concurrently/node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1228,13 +851,11 @@ }, "node_modules/concurrently/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/concurrently/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1246,8 +867,7 @@ }, "node_modules/concurrently/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1257,8 +877,7 @@ }, "node_modules/concurrently/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1266,12 +885,14 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/concurrently/node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -1287,16 +908,14 @@ }, "node_modules/concurrently/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -1306,34 +925,49 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie": { "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmmirror.com/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "license": "MIT" }, "node_modules/cross-env": { "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-5.2.1.tgz", - "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "license": "MIT", "dependencies": { "cross-spawn": "^6.0.5" }, @@ -1347,8 +981,7 @@ }, "node_modules/cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -1362,8 +995,7 @@ }, "node_modules/dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -1373,59 +1005,59 @@ }, "node_modules/date-fns": { "version": "2.30.0", - "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0" }, "engines": { "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, "node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/decamelize": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "license": "MIT", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/denque": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", "engines": { "node": ">=0.10" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1433,16 +1065,14 @@ }, "node_modules/diff": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1452,26 +1082,25 @@ }, "node_modules/dotenv": { "version": "16.3.1", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dottie": { "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/dottie/-/dottie-2.0.6.tgz", - "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "license": "MIT" }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1479,26 +1108,22 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/engine.io": { "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/engine.io/-/engine.io-3.6.1.tgz", - "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -1513,8 +1138,7 @@ }, "node_modules/engine.io-client": { "version": "3.5.3", - "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-3.5.3.tgz", - "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==", + "license": "MIT", "dependencies": { "component-emitter": "~1.3.0", "component-inherit": "0.0.3", @@ -1531,16 +1155,14 @@ }, "node_modules/engine.io-client/node_modules/debug": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/engine.io-parser": { "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "license": "MIT", "dependencies": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", @@ -1551,31 +1173,26 @@ }, "node_modules/engine.io/node_modules/cookie": { "version": "0.4.2", - "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/engine.io/node_modules/debug": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/engine.io/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/esbuild": { "version": "0.18.11", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.11.tgz", - "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1609,37 +1226,35 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmmirror.com/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -1674,31 +1289,64 @@ "vary": "~1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "license": "MIT" }, "node_modules/extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" - ] + ], + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1712,21 +1360,18 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1736,8 +1381,7 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -1753,28 +1397,34 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/follow-redirects": { "version": "1.15.2", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1786,20 +1436,21 @@ }, "node_modules/foreground-child": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/foreground-child/node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1811,16 +1462,14 @@ }, "node_modules/foreground-child/node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/foreground-child/node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1830,16 +1479,14 @@ }, "node_modules/foreground-child/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/foreground-child/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -1852,16 +1499,14 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/form-data": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1873,24 +1518,21 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -1902,14 +1544,11 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1920,48 +1559,45 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "license": "MIT" }, "node_modules/generate-function": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", "dependencies": { "is-property": "^1.0.2" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-proto": "^1.0.1", "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/getpass": { "version": "0.1.7", - "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { "version": "10.3.1", - "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.1.tgz", - "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", @@ -1974,12 +1610,14 @@ }, "engines": { "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1989,8 +1627,7 @@ }, "node_modules/globby": { "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -2007,8 +1644,7 @@ }, "node_modules/globby/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2016,8 +1652,7 @@ }, "node_modules/globby/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2028,12 +1663,14 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globby/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2043,27 +1680,22 @@ }, "node_modules/google-protobuf": { "version": "3.21.2", - "resolved": "https://registry.npmmirror.com/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + "license": "(BSD-3-Clause AND Apache-2.0)" }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", - "resolved": "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "license": "MIT", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -2074,8 +1706,7 @@ }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -2085,53 +1716,52 @@ }, "node_modules/has-binary2": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "license": "MIT", "dependencies": { "isarray": "2.0.1" } }, "node_modules/has-cors": { "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-proto": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "license": "MIT", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -2145,8 +1775,7 @@ }, "node_modules/http-signature": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -2170,29 +1799,24 @@ }, "node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + "version": "0.0.1" }, "node_modules/inflection": { "version": "1.13.4", - "resolved": "https://registry.npmmirror.com/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", "engines": [ "node >= 0.4.0" - ] + ], + "license": "MIT" }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2200,21 +1824,18 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2224,24 +1845,21 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2251,79 +1869,74 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-object": { "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-property": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + "license": "MIT" }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/isstream": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "license": "MIT" }, "node_modules/jackspeak": { "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2333,36 +1946,30 @@ }, "node_modules/jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "license": "ISC" }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsprim": { "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -2375,86 +1982,79 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/long": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "license": "Apache-2.0" }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "engines": { - "node": ">=10" + "node": "14 || >=16.14" } }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -2465,8 +2065,7 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2476,16 +2075,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2495,27 +2092,27 @@ }, "node_modules/minimatch": { "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minipass": { "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mocha": { "version": "10.2.0", - "resolved": "https://registry.npmmirror.com/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "license": "MIT", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -2545,12 +2142,15 @@ }, "engines": { "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -2565,13 +2165,11 @@ }, "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/mocha/node_modules/glob": { "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2582,12 +2180,14 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2595,8 +2195,7 @@ }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2606,8 +2205,7 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2617,21 +2215,18 @@ }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/moment": { "version": "2.29.4", - "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/moment-timezone": { "version": "0.5.43", - "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "license": "MIT", "dependencies": { "moment": "^2.29.4" }, @@ -2641,13 +2236,11 @@ }, "node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/mysql2": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-2.3.3.tgz", - "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "license": "MIT", "dependencies": { "denque": "^2.0.1", "generate-function": "^2.3.1", @@ -2664,8 +2257,7 @@ }, "node_modules/mysql2/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -2673,10 +2265,20 @@ "node": ">=0.10.0" } }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/named-placeholders": { "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", "dependencies": { "lru-cache": "^7.14.1" }, @@ -2686,16 +2288,14 @@ }, "node_modules/named-placeholders/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/nanoid": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2705,42 +2305,39 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/nice-try": { "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/oauth-sign": { "version": "0.9.0", - "resolved": "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/object-inspect": { "version": "1.12.3", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -2750,16 +2347,14 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/openai": { "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/openai/-/openai-3.3.0.tgz", - "integrity": "sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==", + "license": "MIT", "dependencies": { "axios": "^0.26.0", "form-data": "^4.0.0" @@ -2767,128 +2362,130 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parseqs": { "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + "license": "MIT" }, "node_modules/parseuri": { "version": "0.0.6", - "resolved": "https://registry.npmmirror.com/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/path-scurry": { "version": "1.10.0", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.0.tgz", - "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", - "engines": { - "node": "14 || >=16.14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "license": "MIT" }, "node_modules/pg-connection-string": { "version": "2.6.1", - "resolved": "https://registry.npmmirror.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz", - "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" + "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/postcss": { "version": "8.4.25", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.25.tgz", - "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -2900,8 +2497,13 @@ }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2911,9 +2513,8 @@ }, "node_modules/protobufjs": { "version": "7.2.4", - "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -2934,13 +2535,11 @@ }, "node_modules/protobufjs/node_modules/long": { "version": "5.2.3", - "resolved": "https://registry.npmmirror.com/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "license": "Apache-2.0" }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -2951,53 +2550,64 @@ }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -3010,8 +2620,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -3021,14 +2630,11 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "license": "MIT" }, "node_modules/request": { "version": "2.88.2", - "resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -3057,8 +2663,7 @@ }, "node_modules/request/node_modules/form-data": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -3070,29 +2675,34 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/retry-as-promised": { "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + "license": "MIT" }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3100,8 +2710,7 @@ }, "node_modules/rollup": { "version": "3.26.2", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -3115,8 +2724,7 @@ }, "node_modules/rollup-plugin-copy": { "version": "3.4.0", - "resolved": "https://registry.npmmirror.com/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", - "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.1", "colorette": "^1.1.0", @@ -3130,42 +2738,64 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmmirror.com/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -3187,18 +2817,20 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmmirror.com/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + "version": "0.0.5" }, "node_modules/sequelize": { "version": "6.32.1", - "resolved": "https://registry.npmmirror.com/sequelize/-/sequelize-6.32.1.tgz", - "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", "dependencies": { "@types/debug": "^4.1.8", "@types/validator": "^13.7.17", @@ -3252,16 +2884,14 @@ }, "node_modules/sequelize-pool": { "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/sequelize-pool/-/sequelize-pool-6.1.0.tgz", - "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/sequelize/node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -3274,15 +2904,24 @@ } } }, + "node_modules/sequelize/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sequelize/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/sequelize/node_modules/semver": { "version": "7.5.3", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3295,32 +2934,28 @@ }, "node_modules/sequelize/node_modules/sequelize-pool": { "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/sequelize/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/serialize-javascript": { "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -3333,13 +2968,11 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -3349,47 +2982,50 @@ }, "node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/shell-quote": { "version": "1.8.1", - "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "license": "ISC", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/socket.io": { "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/socket.io/-/socket.io-2.5.0.tgz", - "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==", + "license": "MIT", "dependencies": { "debug": "~4.1.0", "engine.io": "~3.6.0", @@ -3401,13 +3037,11 @@ }, "node_modules/socket.io-adapter": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + "license": "MIT" }, "node_modules/socket.io-client": { "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-2.5.0.tgz", - "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", + "license": "MIT", "dependencies": { "backo2": "1.0.2", "component-bind": "1.0.0", @@ -3424,16 +3058,14 @@ }, "node_modules/socket.io-client/node_modules/debug": { "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/socket.io-client/node_modules/socket.io-parser": { "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.3.3.tgz", - "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", + "license": "MIT", "dependencies": { "component-emitter": "~1.3.0", "debug": "~3.1.0", @@ -3442,8 +3074,7 @@ }, "node_modules/socket.io-parser": { "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.4.3.tgz", - "integrity": "sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==", + "license": "MIT", "dependencies": { "component-emitter": "1.2.1", "debug": "~4.1.0", @@ -3455,79 +3086,65 @@ }, "node_modules/socket.io-parser/node_modules/component-emitter": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" + "license": "MIT" }, "node_modules/socket.io-parser/node_modules/debug": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/socket.io-parser/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/socket.io/node_modules/debug": { "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/socket.io/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" + "version": "0.0.2" }, "node_modules/sqlstring": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/sshpk": { "version": "1.17.0", - "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -3550,16 +3167,14 @@ }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3567,13 +3182,15 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3585,21 +3202,18 @@ }, "node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3609,20 +3223,21 @@ }, "node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3632,35 +3247,37 @@ }, "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/terser": { "version": "5.18.2", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.18.2.tgz", - "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -3675,9 +3292,8 @@ } }, "node_modules/tl-ngrpc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tl-ngrpc/-/tl-ngrpc-1.0.1.tgz", - "integrity": "sha512-gv0jd+rxAdMHSKLFIJZCH6i1rmgX5GTAni1brMxjEd8CQwE+MzeB505WRwcri2Va0WuvmkZByKZeL1GZo8od/w==", + "version": "v1.0.1", + "license": "MIT", "dependencies": { "@grpc/grpc-js": "^1.8.0", "@grpc/proto-loader": "^0.6.0", @@ -3685,14 +3301,11 @@ } }, "node_modules/to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" + "version": "0.1.4" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3702,21 +3315,18 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/toposort-class": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + "license": "MIT" }, "node_modules/tough-cookie": { "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -3727,21 +3337,18 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/tslib": { "version": "2.6.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -3751,13 +3358,11 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "license": "Unlicense" }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3768,68 +3373,60 @@ }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validator": { "version": "13.9.0", - "resolved": "https://registry.npmmirror.com/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/verror": { "version": "1.10.0", - "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -3838,8 +3435,7 @@ }, "node_modules/vite": { "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.1.tgz", - "integrity": "sha512-8mmwPlsy7t+ZcTme7vdbVGuZ3Tri+lrLXr6hsF5UHdyYyARPPPMtM16QlqC9TZuCd5j3NmWs1rwka3cVSRHZTw==", + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.24", @@ -3851,6 +3447,9 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, @@ -3889,8 +3488,7 @@ }, "node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3900,21 +3498,18 @@ }, "node_modules/wkx": { "version": "0.5.0", - "resolved": "https://registry.npmmirror.com/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/workerpool": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3922,13 +3517,15 @@ }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3936,25 +3533,25 @@ }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3966,8 +3563,7 @@ }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3977,21 +3573,21 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/ws": { "version": "7.4.6", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -4010,16 +3606,13 @@ }, "node_modules/xmlhttprequest-ssl": { "version": "1.6.3", - "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", "engines": { "node": ">=0.4.0" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -4031,8 +3624,7 @@ }, "node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -4048,16 +3640,14 @@ }, "node_modules/yargs-parser": { "version": "20.2.4", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -4070,21 +3660,18 @@ }, "node_modules/yargs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4096,8 +3683,7 @@ }, "node_modules/yargs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4107,15 +3693,16 @@ }, "node_modules/yeast": { "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" + "license": "MIT" }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/svr/package.json b/svr/package.json index 7288d90..83daa1f 100644 --- a/svr/package.json +++ b/svr/package.json @@ -24,12 +24,15 @@ "dependencies": { "@grpc/grpc-js": "^1.8.0", "@grpc/proto-loader": "^0.6.0", + "body-parser": "^1.20.2", "concurrently": "^8.2.0", + "cookie-parser": "^1.4.6", "cross-env": "^5.2.0", "dotenv": "^16.3.1", "express": "^4.17.1", "glob": "^10.3.1", "google-protobuf": "^3.0.0", + "lru-cache": "^10.0.1", "mocha": "^10.2.0", "mysql2": "^2.1.0", "openai": "^3.3.0", @@ -40,6 +43,7 @@ "socket.io": "^2.3.0", "terser": "^5.18.2", "tl-ngrpc": "^1.0.1", + "uuid": "^9.0.1", "vite": "^4.3.9" } } diff --git a/svr/src/bussiness/cache/cache.js b/svr/src/bussiness/cache/cache.js new file mode 100644 index 0000000..c0bc2b8 --- /dev/null +++ b/svr/src/bussiness/cache/cache.js @@ -0,0 +1,50 @@ +const { LRUCache } = require('lru-cache'); + +// 5分钟缓存 +const shortTimeCache = new LRUCache({ + max: 500, + maxAge: 1000 * 60 * 5 +}); + +// 1小时缓存 +const longTimeCache = new LRUCache({ + max: 500, + maxAge: 1000 * 60 * 60 +}); + +// 1天缓存 +const dayTimeCache = new LRUCache({ + max: 500, + maxAge: 1000 * 60 * 60 * 24 +}); + + +const setShortTimeCache = (key, value) => { + shortTimeCache.set(key, value); +} + +const getShortTimeCache = (key) => { + return shortTimeCache.get(key); +} + +const setLongTimeCache = (key, value) => { + longTimeCache.set(key, value); +} + +const getLongTimeCache = (key) => { + return longTimeCache.get(key); +} + +const setDayTimeCache = (key, value) => { + dayTimeCache.set(key, value); +} + +const getDayTimeCache = (key) => { + return dayTimeCache.get(key); +} + +module.exports = { + setShortTimeCache, getShortTimeCache, + setLongTimeCache, getLongTimeCache, + setDayTimeCache, getDayTimeCache +} \ No newline at end of file diff --git a/svr/src/bussiness/cache/key.js b/svr/src/bussiness/cache/key.js new file mode 100644 index 0000000..65f2d9e --- /dev/null +++ b/svr/src/bussiness/cache/key.js @@ -0,0 +1,31 @@ + +const prefix = "tl-rtc-file-"; + +// 状态缓存 +const stateKeys = { + // 扫码状态缓存 + SCAN_STATE_KEY : prefix + "scene-state-", + // 登录状态缓存 + TOKEN_STATE_KEY : prefix + "token-state-" +} + +// 信息缓存 +const infoKeys = { + // 登录信息缓存 + LOGIN_INFO_KEY : prefix + "login-info-", + // 用户信息缓存 + USER_INFO_KEY : prefix + "user-info-", +} + +// cookie key +const cookieKey = { + // 用户登录cookie key + USER_LOGIN_COOKIE_KEY : "_tl_u", +} + +module.exports = { + StateKey : stateKeys, + InfoKey: infoKeys, + CookieKey: cookieKey, +}; + diff --git a/svr/src/bussiness/cache/scan/scanCache.js b/svr/src/bussiness/cache/scan/scanCache.js new file mode 100644 index 0000000..3f86378 --- /dev/null +++ b/svr/src/bussiness/cache/scan/scanCache.js @@ -0,0 +1,105 @@ +const { StateKey, InfoKey, CookieKey } = require("../key"); +const cache = require("../cache"); + +/** + * 设置扫码状态 : 五分钟 + * @param {*} key + * @param {*} value + */ +const setScanState = (key, value) => { + cache.setShortTimeCache(StateKey.SCAN_STATE_KEY + key, value); +} + +/** + * 获取扫码状态 : 五分钟 + * @param {*} key + * @returns + * 'scan': 已扫码 + * 'auth_succ': 授权成功 + * 'auth_fail': 授权失败 + * '' + * */ +const getScanState = (key) => { + return cache.getShortTimeCache(StateKey.SCAN_STATE_KEY + key) || ""; +} + +/** + * 设置登录状态 : 一小时 + * @param {*} key + * @param {*} value + * @returns + * */ +const setTokenState = (key, value) => { + cache.setLongTimeCache(StateKey.TOKEN_STATE_KEY + key, value); +} + +/** + * 获取登录状态 : 一小时 + * @param {*} key + * @returns + * { + * token : token + * } + * */ +const getTokenState = (key) => { + return cache.getLongTimeCache(StateKey.TOKEN_STATE_KEY + key) || ""; +} + + +/** + * 获取登录信息 : 一小时 + * @param {*} key + * @returns + * { + * openId : openId, + * loginTime: loginTime + * } + * */ +const getLoginInfo = (key) => { + return cache.getLongTimeCache(InfoKey.LOGIN_INFO_KEY + key) || {}; +} + + +/** + * 设置登录信息 : 一小时 + * @param {*} key + * @param {*} value + * @returns + * */ +const setLoginInfo = (key, value) => { + cache.setLongTimeCache(InfoKey.LOGIN_INFO_KEY + key, value); +} + + +/** + * 获取用户信息 : 一天 + * @param {*} key + * @returns + * { + * id: id, + * openid: openid, + * avatar: userInfo.avatarUrl, + * uname: userInfo.nickName, + * ... + * } + */ +const getUserInfo = (key) => { + return cache.getDayTimeCache(InfoKey.USER_INFO_KEY + key) || {}; +} + +/** + * 设置用户信息 : 一天 + * @param {*} key + * @param {*} value + */ +const setUserInfo = (key, value) => { + cache.setDayTimeCache(InfoKey.USER_INFO_KEY + key, value); +} + + +module.exports = { + setScanState, getScanState, + setTokenState, getTokenState, + setLoginInfo, getLoginInfo, + setUserInfo, getUserInfo +} \ No newline at end of file diff --git a/svr/src/bussiness/notify/notify.js b/svr/src/bussiness/notify/notify.js index a8838d2..a8fcd1a 100644 --- a/svr/src/bussiness/notify/notify.js +++ b/svr/src/bussiness/notify/notify.js @@ -1,4 +1,4 @@ -const {inject_env_config} = require("../../../conf/env_config"); +const { inject_env_config } = require("../../../conf/env_config"); const conf = inject_env_config(require("../../../conf/cfg.json")); const request = require('request'); const qiweiNormal = conf.notify.qiwei.normal; @@ -10,10 +10,10 @@ const utils = require("../../../src/utils/utils"); // 统计企微机器人发送normal map const qiweiNormalMap = {} for (let key in qiweiNormal) { - qiweiNormalMap[qiweiNormal[key]] = { - time: new Date().valueOf(), - count: 0 - }; + qiweiNormalMap[qiweiNormal[key]] = { + time: new Date().valueOf(), + count: 0 + }; } /** @@ -22,62 +22,62 @@ for (let key in qiweiNormal) { * @param {*} msg */ function requestMsg(msg) { - if(!open){ - return - } - let finalKey = ""; - for (let key in qiweiNormalMap) { - // 单个还没达到20次,直接用 - if (qiweiNormalMap[key].count < 20) { - qiweiNormalMap[key].count += 1; - finalKey = key; - break; - } else { - //达到20次,看看时间如果在1分钟内,说明达到限制,直接跳过 - if ((new Date().valueOf() / 1000) - (qiweiNormalMap[key].time / 1000) <= 60) { - continue; - } else { - //达到20次,但是时间超过1分钟,我们尝试清零 - qiweiNormalMap[key].count = 1; - qiweiNormalMap[key].time = new Date().valueOf() - finalKey = key; - break; - } - } - } + if (!open) { + return + } + let finalKey = ""; + for (let key in qiweiNormalMap) { + // 单个还没达到20次,直接用 + if (qiweiNormalMap[key].count < 20) { + qiweiNormalMap[key].count += 1; + finalKey = key; + break; + } else { + //达到20次,看看时间如果在1分钟内,说明达到限制,直接跳过 + if ((new Date().valueOf() / 1000) - (qiweiNormalMap[key].time / 1000) <= 60) { + continue; + } else { + //达到20次,但是时间超过1分钟,我们尝试清零 + qiweiNormalMap[key].count = 1; + qiweiNormalMap[key].time = new Date().valueOf() + finalKey = key; + break; + } + } + } - if (finalKey === '' && qiweiNormal.length > 0) { - finalKey = qiweiNormal[0]; - } + if (finalKey === '' && qiweiNormal.length > 0) { + finalKey = qiweiNormal[0]; + } - msg = msg + `机器人KEY: ${finalKey}\n`; - msg = msg + `机器人KEY列表: ${JSON.stringify(qiweiNormalMap)}\n`; + msg = msg + `机器人KEY: ${finalKey}\n`; + msg = msg + `机器人KEY列表: ${JSON.stringify(qiweiNormalMap)}\n`; - request({ - url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + finalKey, - method: "POST", - headers: { - "content-type": "application/json", - }, - body: JSON.stringify({ - msgtype: "markdown", - markdown: { - content: msg, - } - }) - }, function (error, response, body) { - utils.tlConsole('提示成功!', qiweiNormalMap); - }); + request({ + url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + finalKey, + method: "POST", + headers: { + "content-type": "application/json", + }, + body: JSON.stringify({ + msgtype: "markdown", + markdown: { + content: msg, + } + }) + }, function (error, response, body) { + utils.tlConsole('提示成功!', qiweiNormalMap); + }); } // 统计企微机器人发送error map const qiweiErrorMap = {} for (let key in qiweiError) { - qiweiErrorMap[qiweiError[key]] = { - time: new Date().valueOf(), - count: 0 - }; + qiweiErrorMap[qiweiError[key]] = { + time: new Date().valueOf(), + count: 0 + }; } /** @@ -86,54 +86,54 @@ for (let key in qiweiError) { * @param {*} msg */ function requestErrorMsg(msg) { - if(!open){ - return - } - let finalKey = ""; - for (let key in qiweiErrorMap) { - // 单个还没达到20次,直接用 - if (qiweiErrorMap[key].count < 20) { - qiweiErrorMap[key].count += 1; - finalKey = key; - break; - } else { - //达到20次,看看时间如果在1分钟内,说明达到限制,直接跳过 - if ((new Date().valueOf() / 1000) - (qiweiErrorMap[key].time / 1000) <= 60) { - continue; - } else { - //达到20次,但是时间超过1分钟,我们尝试清零 - qiweiErrorMap[key].count = 1; - qiweiErrorMap[key].time = new Date().valueOf() - finalKey = key; - break; - } - } - } - - if (finalKey === '' && qiweiNormal.length > 0) { - finalKey = qiweiNormal[0]; - } - - msg = msg + `机器人KEY: ${finalKey}\n`; - msg = msg + `机器人KEY列表: ${JSON.stringify(qiweiErrorMap)}\n`; - - request({ - url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + finalKey, - method: "POST", - headers: { - "content-type": "application/json", - }, - body: JSON.stringify({ - msgtype: "markdown", - markdown: { - content: msg, - } - }) - }, function (error, response, body) { - utils.tlConsole('提示成功!', qiweiErrorMap); - }); - } + if (!open) { + return + } + let finalKey = ""; + for (let key in qiweiErrorMap) { + // 单个还没达到20次,直接用 + if (qiweiErrorMap[key].count < 20) { + qiweiErrorMap[key].count += 1; + finalKey = key; + break; + } else { + //达到20次,看看时间如果在1分钟内,说明达到限制,直接跳过 + if ((new Date().valueOf() / 1000) - (qiweiErrorMap[key].time / 1000) <= 60) { + continue; + } else { + //达到20次,但是时间超过1分钟,我们尝试清零 + qiweiErrorMap[key].count = 1; + qiweiErrorMap[key].time = new Date().valueOf() + finalKey = key; + break; + } + } + } + + if (finalKey === '' && qiweiNormal.length > 0) { + finalKey = qiweiNormal[0]; + } + + msg = msg + `机器人KEY: ${finalKey}\n`; + msg = msg + `机器人KEY列表: ${JSON.stringify(qiweiErrorMap)}\n`; + + request({ + url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + finalKey, + method: "POST", + headers: { + "content-type": "application/json", + }, + body: JSON.stringify({ + msgtype: "markdown", + markdown: { + content: msg, + } + }) + }, function (error, response, body) { + utils.tlConsole('提示成功!', qiweiErrorMap); + }); +} module.exports = { - requestMsg, requestErrorMsg + requestMsg, requestErrorMsg } \ No newline at end of file diff --git a/svr/src/bussiness/notify/notifyHandler.js b/svr/src/bussiness/notify/notifyHandler.js index ef6fc4b..61c4bda 100644 --- a/svr/src/bussiness/notify/notifyHandler.js +++ b/svr/src/bussiness/notify/notifyHandler.js @@ -493,6 +493,19 @@ function sendStopRemoteDrawNotify(data) { } +/** + * 发送扫码登录通知 + * @param {*} data + */ +function sendScanLoginNotify(data) { + let notifyMsg = `## 文件传输通知 - ${data.title} \n` + + `OpenId: ${data.openId}\n` + + `UserId: ${data.userId}\n` + + `Token: ${data.token}\n` + + `当前时间: ${utils.formateDateTime(new Date(), "yyyy-MM-dd hh:mm:ss")}\n` + notify.requestMsg(notifyMsg) +} + module.exports = { sendExitRoomNotify, sendCreateJoinRoomNotify, @@ -524,5 +537,6 @@ module.exports = { sendSystemErrorMsg, sendStartRemoteDrawNotify, sendStopRemoteDrawNotify, - sendChangeNickNameNotify + sendChangeNickNameNotify, + sendScanLoginNotify } \ No newline at end of file diff --git a/svr/src/bussiness/wxapi/wxapi.js b/svr/src/bussiness/wxapi/wxapi.js new file mode 100644 index 0000000..edeb6b2 --- /dev/null +++ b/svr/src/bussiness/wxapi/wxapi.js @@ -0,0 +1,100 @@ +const request = require('request'); +const { inject_env_config } = require("../../../conf/env_config") +const conf = inject_env_config(require("../../../conf/cfg.json")); + +//微信小程序授权登录 +const getOpenId = async ( code ) => { + try { + return await new Promise((resolve, reject) => { + request.get({ + url: 'https://api.weixin.qq.com/sns/jscode2session', + qs: { + appid: conf.login.appId, + secret: conf.login.appSecret, + js_code: code, + grant_type: 'authorization_code', + }, + json: true, + }, async (error, response, body) => { + if (error) { + console.error('Error fetching sessionKey:', error); + reject(error); + } else if (body.errcode) { + console.error('Error fetching sessionKey:', body.errmsg); + reject(body.errmsg); + } else { + resolve(body); + } + }); + }); + } catch (error) { + console.error('Error fetching sessionKey:', error); + return null + } +} + +// 定义一个函数来获取访问令牌 +const getAccessToken = async () => { + try { + return await new Promise((resolve, reject) => { + request.get({ + url: 'https://api.weixin.qq.com/cgi-bin/token', + qs: { + grant_type: 'client_credential', + appid: conf.login.appId, + secret: conf.login.appSecret, + }, + json: true, + }, (error, response, body) => { + if (error) { + console.error('Error fetching access token:', error); + reject(error); + } else if (body.errcode) { + console.error('Error fetching access token:', body.errmsg); + reject(body.errmsg); + } else { + resolve(body); + } + }); + }); + } catch (error) { + console.error('Error fetching access token:', error); + return null + } +}; + +// 定义一个函数来生成小程序码 +const generateQRCode = async (accessToken, scene, page) => { + try { + return await new Promise((resolve, reject) => { + request({ + method: 'POST', + url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='+accessToken, + headers: { + "content-type": "application/json", + }, + body: JSON.stringify({ + scene, page, check_path: false + }), + encoding: null, + }, (error, response, body) => { + if (error) { + console.error('Error fetching generateQRCode:', error); + reject(error); + } else if (body.errcode) { + console.error('Error fetching generateQRCode:', body.errmsg); + reject(body.errmsg); + } else { + resolve(body); + } + }); + }); + } catch (error) { + console.error('Error generating QR code:', error); + return null + } +}; + +module.exports = { + getOpenId, getAccessToken, generateQRCode +} \ No newline at end of file diff --git a/svr/src/controller/comm/comm.js b/svr/src/controller/comm/comm.js index facc97f..5868af4 100644 --- a/svr/src/controller/comm/comm.js +++ b/svr/src/controller/comm/comm.js @@ -17,6 +17,9 @@ function initData(req, res) { //ice服务器配置 const iceServers = utils.genTurnServerIceServersConfig(openTurn, useSecret, "tlrtcfile"); + //系统房间 + const systemRoomList = ['tlrtcfile问题反馈']; + if(process.env.tl_rtc_file_env_mode === 'http'){ let regexIP = /^((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))$/; @@ -29,29 +32,27 @@ function initData(req, res) { } let wsHost = conf.socket.host || ip + conf.socket.port; - - let data = { + + res.json({ version : conf.version, wsHost: "ws://" + wsHost, rtcConfig: { iceServers }, options: webrtcConf.options, logo : utils.genClientLogo(), - }; - - res.json(data) + systemRoomList : systemRoomList + }) }else{ let wsHost = conf.socket.host || ip; - let data = { + res.json({ version : conf.version, wsHost: "wss://" + wsHost, rtcConfig: { iceServers }, options: webrtcConf.options, logo : utils.genClientLogo(), - }; - - res.json(data) + systemRoomList : systemRoomList + }) } } diff --git a/svr/src/controller/dog/dog.js b/svr/src/controller/dog/dog.js new file mode 100644 index 0000000..7a75722 --- /dev/null +++ b/svr/src/controller/dog/dog.js @@ -0,0 +1,30 @@ +const dogDao = require('../../dao/dog/dog.js'); + +/** + * @description 获取问题列表 + */ +async function getQuestionList(req, res){ + try { + + const list = await dogDao.getDogSendBugInfo({ + limit : 30 + }, req.ctx.tables, req.ctx.dbClient); + + res.json({ + questionList : list, + code : 200, + msg : "ok" + }) + + } catch (err) { + console.log(err); + res.json({ + content: "", + err : "系统繁忙" + }) + } +} + +module.exports = { + getQuestionList +} \ No newline at end of file diff --git a/svr/src/controller/dog/index.js b/svr/src/controller/dog/index.js index 0e99bbd..541453a 100644 --- a/svr/src/controller/dog/index.js +++ b/svr/src/controller/dog/index.js @@ -1,14 +1,11 @@ const express = require('express'); +const dog = require('./dog'); module.exports = function () { const router = express.Router(); - router.get("/dog", (req, res) => { - res.json({ - dog : "request dog api ok!" - }) - }); + router.get("/question/list", dog.getQuestionList); return router; } \ No newline at end of file diff --git a/svr/src/controller/login/index.js b/svr/src/controller/login/index.js new file mode 100644 index 0000000..70a70bf --- /dev/null +++ b/svr/src/controller/login/index.js @@ -0,0 +1,24 @@ +const express = require('express'); +const login = require("./login"); + +module.exports = function () { + const router = express.Router(); + + router.post("/wechat", login.loginWechat); + + router.get("/qrcode", login.getLoginWechatQrCode); + + router.post("/scanState", login.scanState); + + router.get("/scanState", login.scanState); + + router.get("/getScanState", login.getScanState); + + router.get("/state", login.getTokenState); + + router.get("/logout", login.logout); + + router.post("/info", login.getLoginInfo); + + return router; +} \ No newline at end of file diff --git a/svr/src/controller/login/login.js b/svr/src/controller/login/login.js new file mode 100644 index 0000000..dbb4f6b --- /dev/null +++ b/svr/src/controller/login/login.js @@ -0,0 +1,288 @@ +const user = require("../../dao/user/user"); +const { inject_env_config } = require("../../../conf/env_config") +const conf = inject_env_config(require("../../../conf/cfg.json")); +const bussinessNotify = require("./../../bussiness/notify/notifyHandler") +const wxapi = require("./../../bussiness/wxapi/wxapi") +const { CookieKey } = require("./../../bussiness/cache/key") +const scanCache = require("./../../bussiness/cache/scan/scanCache") +const uuid = require("uuid") + +// 扫码状态 +const SCAN_STATE = { + wait: 'wait', + scan: 'scan', + auth_succ: 'auth_succ', + auth_fail: 'auth_fail', +} + +/** + * 微信小程序授权信息 : 小程序调用 + * @param {*} req + * @param {*} res + * @returns + */ +async function loginWechat(req, res) { + const { code, userInfo } = req.body; + try { + const dbClient = req.ctx.dbClient; + const tables = req.ctx.tables; + if (!dbClient || !tables) { + res.json({ code : 500, session_key: "", message: "系统错误" }); + return; + } + + const openIdInfo = await wxapi.getOpenId(code); + if(!openIdInfo){ + res.json({ code : 500, session_key: "", message: "系统错误" }); + return + } + + const { session_key, openid, unionid } = openIdInfo; + + const userId = await user.addWxUser({ + openid: openid, + avatar: userInfo.avatarUrl, + uname: userInfo.nickName, + pwd: '', + solt: '', + role: 'user', + }, tables, dbClient); + + //设置登录信息缓存 + const token = uuid.v4(); + scanCache.setLoginInfo(token, { + openId : openid, + userId : userId, + avatar : userInfo.avatarUrl, + nickName : userInfo.nickName, + loginTime : Date.now(), + }); + + bussinessNotify.sendScanLoginNotify({ + title: "微信小程序扫码登录", + openId : openid, + userId : userId, + token : token, + }) + + res.json({ session_key, openid, unionid, user: userId, token }); + + } catch (error) { + console.error('Error fetching sessionKey:', error); + bussinessNotify.sendSystemErrorMsg({ + title: "api-login-wechat", + data: error, + room: "", + from: "", + msg: JSON.stringify({ + error: error, + code, + userInfo + }, null, '\t') + }) + res.json({ code : 500, session_key: "", message: "系统错误" }); + } +} + + +/** + * 微信小程序授权扫码成功 : 小程序调用 + * @state : + * 'scan': 已扫码 + * 'auth_succ': 授权成功 + * 'auth_fail': 授权失败 + * @scene : socketId + * @token : 登录token + * @param {*} req + * @param {*} res + */ +async function scanState(req, res) { + const { scene, state, token} = req.body; + + if(!scene || scene.length <= 10 || scene.length > 32){ + res.json({ code : 400, message : "scene参数错误" }); + return; + } + + if(!state || SCAN_STATE[state] === undefined){ + res.json({ code : 400, message : "state参数错误" }); + return; + } + + // 如果授权成功,设置当前socketId登录状态 + if(state === SCAN_STATE.auth_succ){ + if(!token || token.length < 16){ + res.json({ code : 400, message : "token参数错误" }); + return; + } + // socketId - token + scanCache.setTokenState(scene, token); + } + + // 设置扫码状态 + scanCache.setScanState(scene, state); + + res.json({ code : 200 }); +} + + +/** + * 获取小程序登录二维码 : web端调用 + * @param {*} req + * @param {*} res + * @returns + */ +async function getLoginWechatQrCode(req, res) { + const { socketId } = req.query; + + try { + const dbClient = req.ctx.dbClient; + const tables = req.ctx.tables; + if (!dbClient || !tables) { + res.json({ code : 500, message: "系统错误" }); + return; + } + + const tokenInfo = await wxapi.getAccessToken(); + if(!tokenInfo){ + res.json({ code : 500, message: "系统错误" }); + return + } + const { access_token } = tokenInfo; + + const body = await wxapi.generateQRCode(access_token, socketId, "pages/login/login"); + + res.setHeader('Content-Type', "image/jpeg"); + res.send(body); + + } catch (error) { + console.error('Error fetching getLoginWechatQrCode:', error); + bussinessNotify.sendSystemErrorMsg({ + title: "api-login-wechat", + data: error, + room: "", + from: "", + msg: JSON.stringify({ + error: error + }, null, '\t') + }) + res.json({code : 500, message: "系统错误" }); + } +} + + +/** + * 获取扫码状态 : web端调用 + * @param {*} scene : socketId + * @returns + */ +async function getScanState( req, res ){ + const { scene } = req.query; + + if(!scene || scene.length < 10 || scene.length > 32){ + res.json({ code : 400, message : "scene参数错误" }); + return; + } + + const state = scanCache.getScanState(scene) || SCAN_STATE.wait; + //授权没有成功,返回状态 + if(state !== SCAN_STATE.auth_succ){ + res.json({ code : 200, state }) + return + } + + //先通过socketId获取token + const token = scanCache.getTokenState(scene); + if(!token){ + res.json({ code : 200, state, message : "token失效" }) + return + } + + res.cookie(CookieKey.USER_LOGIN_COOKIE_KEY, token, { + maxAge: 1000 * 60 * 60, + httpOnly: true + }) + + res.json({ code : 200, state, token }); +} + + +/** + * 获取登录状态 : web端调用 + * @param {*} req + * @param {*} res + */ +async function getTokenState(req, res){ + let token = req.cookies[CookieKey.USER_LOGIN_COOKIE_KEY]; + if(!token){ + token = req.query.token || ""; + } + + if(!token || token.length < 16){ + res.json({ code: 403 }); + return; + } + + const loginInfo = scanCache.getLoginInfo(token); + + const avatar = loginInfo.avatar || "/image/44826979.png"; + const username = loginInfo.nickName || ""; + + if(Object.keys(loginInfo).length > 0){ + res.json({ code: 200, login: true, token, avatar, username }); + }else{ + res.json({ code: 200, login: false }); + } +} + + +/** + * 退出登录 : web端调用 + * @param {*} req + * @param {*} res + */ +async function logout(req, res){ + let token = req.cookies[CookieKey.USER_LOGIN_COOKIE_KEY]; + if(!token){ + token = req.query.token || ""; + } + + if(!token || token.length === 0){ + res.json({ code: 200, logout : true }); + return; + } + + scanCache.setLoginInfo(token, undefined); + scanCache.setUserInfo(token, undefined); + + res.json({ code: 200, logout: true }); +} + + + +/** + * 获取登录信息 : socket服务调用 + * @param {*} req + * @param {*} res + */ +async function getLoginInfo(req, res){ + let token = req.query.token || ""; + let key = req.query.key || ""; + + if(!token || token.length < 16 || key !== 'iamtsm-socket'){ + res.json({ code: 403 }); + return; + } + + const loginInfo = scanCache.getLoginInfo(token); + + res.json({ code: 200, userId : loginInfo.userId }); +} + + + + +module.exports = { + loginWechat, scanState, getLoginWechatQrCode, getScanState, + getTokenState, logout, getLoginInfo +} \ No newline at end of file diff --git a/svr/src/dao/dog/dog.js b/svr/src/dao/dog/dog.js index 5567963..0d58f94 100644 --- a/svr/src/dao/dog/dog.js +++ b/svr/src/dao/dog/dog.js @@ -178,7 +178,7 @@ async function getDogManageInfo(params, tables, dbClient) { /** - * 获取操作统计信息 + * 获取公共聊天室操作统计信息 * @param {*} params * @param {*} tables * @param {*} dbClient @@ -194,19 +194,39 @@ async function getDogChatingCommInfo(params, tables, dbClient) { } const limit = params.limit || 10; - const sql = `select name, room_id, content, socket_id, created_at from dog where name = '公共聊天室' order by created_at desc limit ${limit}`; + const sql = `select name, room_id, content, socket_id, created_at, flag from dog where name = '公共聊天室' and flag & ${tables.DogOther.Flag.IS_SET_TOP} = 0 order by created_at desc limit ${limit}`; const [list,] = await dbClient.query(sql); + const topSql = `select name, room_id, content, socket_id, created_at, flag from dog where name = '公共聊天室' and flag & ${tables.DogOther.Flag.IS_SET_TOP} = ${tables.DogOther.Flag.IS_SET_TOP} order by created_at desc limit 1`; + const [topList,] = await dbClient.query(topSql); + let resultList = [] list.forEach(element => { resultList.push({ room: element.room_id, msg: element.content, + admin: utils.checkBit(element.flag, tables.DogOther.Flag.IS_DEV_ADMIN), + top: utils.checkBit(element.flag, tables.DogOther.Flag.IS_SET_TOP), + socketId: element.socket_id, + time: utils.formateDateTime(new Date(element.created_at), "yyyy-MM-dd hh:mm:ss"), + }) + }); + + topList.forEach(element => { + resultList.push({ + room: element.room_id, + msg: element.content, + admin: utils.checkBit(element.flag, tables.DogOther.Flag.IS_DEV_ADMIN), + top: utils.checkBit(element.flag, tables.DogOther.Flag.IS_SET_TOP), socketId: element.socket_id, time: utils.formateDateTime(new Date(element.created_at), "yyyy-MM-dd hh:mm:ss"), }) }); + resultList.sort((a, b) => { + return new Date(b.time).getTime() - new Date(a.time).getTime() + }); + resultList = resultList.reverse() return resultList; @@ -217,10 +237,54 @@ async function getDogChatingCommInfo(params, tables, dbClient) { } +/** + * 获取反馈操作统计信息 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function getDogSendBugInfo(params, tables, dbClient) { + try{ + if(!tables || !dbClient){ + return []; + } + if(!params){ + params = {}; + } + const limit = params.limit || 10; + + const sql = `select name, room_id, content, socket_id, created_at, flag from dog where room_id = 'tlrtcfile问题反馈' and name = '发送文本内容' order by created_at desc limit ${limit}`; + const [list,] = await dbClient.query(sql); + + let resultList = [] + list.forEach(element => { + let content = JSON.parse(element.content); + const isDevAdmin = utils.checkBit(element.flag, tables.DogOther.Flag.IS_DEV_ADMIN); + resultList.push({ + type : isDevAdmin ? "ANSWER" : "QUESTION", + nickName : isDevAdmin ? 'tl开发团队' : content.nickName, + room: element.room_id || content.room, + msg: utils.unescapeStr(content.content), + socketId : element.socket_id, + time: utils.formateDateTime(new Date(element.created_at), "yyyy-MM-dd hh:mm:ss"), + }) + }); + + resultList = resultList.reverse(); + + return resultList; + }catch(e){ + console.error(e); + return []; + } +} + module.exports = dbOpen ? { addDogData, getDogManageInfo, getDogChatingCommInfo, + getDogSendBugInfo } : { addDogData : () => { return {} @@ -231,4 +295,7 @@ module.exports = dbOpen ? { getDogChatingCommInfo : () => { return []; }, + getDogSendBugInfo: () => { + return []; + } } \ No newline at end of file diff --git a/svr/src/dao/relation/relation.js b/svr/src/dao/relation/relation.js new file mode 100644 index 0000000..786d194 --- /dev/null +++ b/svr/src/dao/relation/relation.js @@ -0,0 +1,139 @@ +const {inject_env_config} = require("../../../conf/env_config"); +const cfg = inject_env_config(require("../../../conf/cfg.json")); +const sequelizeObj = require('sequelize'); +const utils = require("../../utils/utils"); +const dbOpen = cfg.db.open; + + +/** + * 关联type类型 + */ +const RelationType = { + USER_ROOM : 1, // 用户-房间号 + USER_DOG : 2, // 用户-操作 + USER_FILE : 3, // 用户-文件 +} + +/** + * 添加关联记录 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function addRelation(params, tables, dbClient) { + try{ + if(!tables || !dbClient){ + return {}; + } + + if(!params){ + params = {}; + } + + let data = await tables.Relation.create({ + type: params.type, + source_id: params.source_id, + target_id: params.target_id, + flag: params.flag, + }); + + return data && data.dataValues ? data.dataValues.id : 0; + }catch(e){ + console.error(e); + return {}; + } +} + + + +/** + * 添加用户-房间号关联记录 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function addUserRoomRelation(params, tables, dbClient) { + try{ + + return await addRelation({ + type: RelationType.USER_ROOM, + source_id: params.userId, + target_id: params.roomId, + flag: 0, + }, tables, dbClient); + + }catch(e){ + console.error(e); + return {}; + } +} + + + +/** + * 添加用户-操作关联记录 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function addUserDogRelation(params, tables, dbClient) { + try{ + + return await addRelation({ + type: RelationType.USER_DOG, + source_id: params.userId, + target_id: params.dogId, + flag: 0, + }, tables, dbClient); + + }catch(e){ + console.error(e); + return {}; + } +} + + + +/** + * 添加用户-文件关联记录 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function addUserFileRelation(params, tables, dbClient) { + try{ + + return await addRelation({ + type: RelationType.USER_FILE, + source_id: params.userId, + target_id: params.fileId, + flag: 0, + }, tables, dbClient); + + }catch(e){ + console.error(e); + return {}; + } +} + + +module.exports = dbOpen ? { + addRelation, addUserDogRelation, addUserFileRelation, addUserRoomRelation +} : { + addRelation : function(){ + return {} + }, + addUserDogRelation : function(){ + return {} + }, + addUserFileRelation : function(){ + return {} + }, + addUserRoomRelation : function(){ + return {} + } +} \ No newline at end of file diff --git a/svr/src/dao/user/user.js b/svr/src/dao/user/user.js new file mode 100644 index 0000000..fed9b79 --- /dev/null +++ b/svr/src/dao/user/user.js @@ -0,0 +1,64 @@ +const {inject_env_config} = require("../../../conf/env_config"); +const cfg = inject_env_config(require("../../../conf/cfg.json")); +const sequelizeObj = require('sequelize'); +const utils = require("../../utils/utils"); +const dbOpen = cfg.db.open; + +/** + * 添加微信用户记录 + * @param {*} params + * @param {*} tables + * @param {*} dbClient + * @returns + */ +async function addWxUser(params, tables, dbClient) { + try{ + if(!tables || !dbClient){ + return {}; + } + + if(!params){ + params = {}; + } + + let users = await tables.User.findAll({ + where: { + type: 'wx', + openid: params.openid, + } + }); + + if(users && users.length === 0){ + let data = await tables.User.create({ + type: 'wx', + openid: params.openid, + avatar: params.avatar, + uname : params.uname, + pwd : params.pwd, + solt : params.solt, + role: params.role, + }); + + return data && data.dataValues ? data.dataValues.id : 0; + } + + if(users && users.length === 1){ + return users[0].dataValues.id; + } + + return 0; + }catch(e){ + console.error(e); + return {}; + } +} + + + +module.exports = dbOpen ? { + addWxUser +} : { + addWxUser : function(){ + return {} + } +} \ No newline at end of file diff --git a/svr/src/socket/connect.js b/svr/src/socket/connect.js index 8fc9fc2..a76dd93 100644 --- a/svr/src/socket/connect.js +++ b/svr/src/socket/connect.js @@ -19,13 +19,24 @@ const rtcChangeNickName = require("./rtcChangeNickName/changeNickName") const rtcHeartbeat = require("./rtcHeartbeat/heartbeat"); const rtcAddCodeFile = require("./rtcCodeFile/addCodeFile"); const rtcGetCodeFile = require("./rtcCodeFile/getCodeFile"); +const rtcLocalNetRoom = require("./rtcLocalNetRoom/localNetRoom"); const rtcServerEvent = require("./rtcConstant").rtcServerEvent +const rtcToken = require("./rtcToken/token") module.exports = (io, socket, tables, dbClient) => { + // token关联处理 + rtcToken.token(io, socket, tables, dbClient, {}); + + // 在线人数统计 rtcCount.count(io, socket, tables, dbClient, {}) + // 局域网房间发现列表 + rtcLocalNetRoom.localNetRoom(io, socket, tables, dbClient, { + toCurrentSocket : true + }) + // 断开连接 socket.on(rtcServerEvent.disconnect, (data)=>{ rtcDisConnect.disconnect(io, socket, tables, dbClient, data) diff --git a/svr/src/socket/rtcChangeNickName/changeNickName.js b/svr/src/socket/rtcChangeNickName/changeNickName.js index ad65dff..56b2a97 100644 --- a/svr/src/socket/rtcChangeNickName/changeNickName.js +++ b/svr/src/socket/rtcChangeNickName/changeNickName.js @@ -4,6 +4,8 @@ const utils = require("./../../utils/utils"); const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); + /** * 房间内更新昵称 @@ -28,7 +30,7 @@ async function changeNickName(io, socket, tables, dbClient, data){ data.nickName = check.contentFilter(nickName); - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "修改个人昵称", roomId: data.room || "", socketId: "", @@ -39,6 +41,14 @@ async function changeNickName(io, socket, tables, dbClient, data){ ip: ip }, tables, dbClient); + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } + bussinessNotify.sendChangeNickNameNotify({ title: "修改个人昵称", room: data.room, diff --git a/svr/src/socket/rtcChatingComm/chatingComm.js b/svr/src/socket/rtcChatingComm/chatingComm.js index bb5acdd..e7cacd2 100644 --- a/svr/src/socket/rtcChatingComm/chatingComm.js +++ b/svr/src/socket/rtcChatingComm/chatingComm.js @@ -5,6 +5,9 @@ const utils = require("../../utils/utils"); const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); + + /** * 公共聊天频道 * @param {*} io socketio对象 @@ -17,7 +20,7 @@ const check = require("../../bussiness/check/content"); async function chatingComm(io, socket, tables, dbClient, data){ try { data.msg = check.contentFilter(data.msg); - + let cacheSwitchData = rtcCommData.getCacheSwitchData() let chatingComm = rtcCommData.getChatingComm() @@ -35,8 +38,20 @@ async function chatingComm(io, socket, tables, dbClient, data){ if (chatingComm.length < 10) { chatingComm.push(data) } else { - chatingComm.shift() - chatingComm.push(data) + let normalList = []; + let adminOrTopList = []; + chatingComm.forEach(item => { + if(item.admin || item.top){ + adminOrTopList.push(item) + }else{ + normalList.push(item) + } + }) + normalList.shift() + normalList.unshift(...adminOrTopList) + normalList.push(data) + + chatingComm = normalList; } rtcCommData.setChatingComm(chatingComm); @@ -55,6 +70,14 @@ async function chatingComm(io, socket, tables, dbClient, data){ ip: ip }, tables, dbClient); + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } + bussinessNotify.sendChatingNotify({ title: "公共聊天室", room: data.room, diff --git a/svr/src/socket/rtcChatingRoom/chatingRoom.js b/svr/src/socket/rtcChatingRoom/chatingRoom.js index d383a29..c12584d 100644 --- a/svr/src/socket/rtcChatingRoom/chatingRoom.js +++ b/svr/src/socket/rtcChatingRoom/chatingRoom.js @@ -4,6 +4,7 @@ const utils = require("./../../utils/utils"); const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("./../../dao/relation/relation") /** * 房间内聊天 群聊/私聊 @@ -20,7 +21,7 @@ async function chatingRoom(io, socket, tables, dbClient, data){ try { let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket); - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "发送文本内容", roomId: data.room || "", socketId: "", @@ -31,6 +32,14 @@ async function chatingRoom(io, socket, tables, dbClient, data){ ip: ip }, tables, dbClient); + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } + bussinessNotify.sendChatingRoomNotify({ title: "发送文本内容", room: data.room, diff --git a/svr/src/socket/rtcCodeFile/addCodeFile.js b/svr/src/socket/rtcCodeFile/addCodeFile.js index 1bbdb85..cb02cbf 100644 --- a/svr/src/socket/rtcCodeFile/addCodeFile.js +++ b/svr/src/socket/rtcCodeFile/addCodeFile.js @@ -7,6 +7,7 @@ const utils = require("./../../utils/utils"); const seafile = require("./../../bussiness/oss/seafile") const rtcCommData = require("./../rtcCommData/commData"); const check = require("../../bussiness/check/content"); +const daoRelation = require("./../../dao/relation/relation") /** * 添加取件码文件 @@ -64,7 +65,7 @@ async function addCodeFile(io, socket, tables, dbClient, data){ ip: ip }) - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "添加取件码文件", roomId: data.room || "", socketId: socket.id, @@ -83,6 +84,14 @@ async function addCodeFile(io, socket, tables, dbClient, data){ download: data.donwloadLink, content: JSON.stringify(data), }, tables, dbClient) + + //添加用户-文件关联记录 + if(socket.userId){ + daoRelation.addUserFileRelation({ + fileId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } //不返回下载链接 delete data.donwloadLink; diff --git a/svr/src/socket/rtcCodeFile/getCodeFile.js b/svr/src/socket/rtcCodeFile/getCodeFile.js index 26099f3..2fdc23c 100644 --- a/svr/src/socket/rtcCodeFile/getCodeFile.js +++ b/svr/src/socket/rtcCodeFile/getCodeFile.js @@ -6,6 +6,8 @@ const utils = require("./../../utils/utils"); const daoFile = require("./../../dao/file/file") const rtcCommData = require("./../rtcCommData/commData"); const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); + /** * 取件码取件 @@ -50,7 +52,7 @@ async function getCodeFile(io, socket, tables, dbClient, data){ ip: ip }) - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "取件码取件", roomId: data.room || "", socketId: socket.id, @@ -60,6 +62,14 @@ async function getCodeFile(io, socket, tables, dbClient, data){ handshake: JSON.stringify(handshake), ip: ip }, tables, dbClient); + + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } socket.emit(rtcClientEvent.getCodeFile, data); diff --git a/svr/src/socket/rtcCodeFile/prepareCodeFile.js b/svr/src/socket/rtcCodeFile/prepareCodeFile.js index 754ff6d..3c972e2 100644 --- a/svr/src/socket/rtcCodeFile/prepareCodeFile.js +++ b/svr/src/socket/rtcCodeFile/prepareCodeFile.js @@ -6,6 +6,8 @@ const utils = require("./../../utils/utils"); const seafile = require("./../../bussiness/oss/seafile") const rtcCommData = require("./../rtcCommData/commData"); const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); + /** * 生成取件码上传链接 @@ -66,7 +68,7 @@ async function prepareCodeFile(io, socket, tables, dbClient, data){ ip: ip }) - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "生成取件码上传链接", roomId: data.room || "", socketId: socket.id, @@ -76,6 +78,14 @@ async function prepareCodeFile(io, socket, tables, dbClient, data){ handshake: JSON.stringify(handshake), ip: ip }, tables, dbClient); + + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } socket.emit(rtcClientEvent.prepareCodeFile, data); diff --git a/svr/src/socket/rtcConstant.js b/svr/src/socket/rtcConstant.js index e434ab9..18ba6ce 100644 --- a/svr/src/socket/rtcConstant.js +++ b/svr/src/socket/rtcConstant.js @@ -132,6 +132,8 @@ let rtcClientEvent = { heartbeat : "heartbeat", //修改昵称 changeNickName : "changeNickName", + //局域网房间发现列表 + localNetRoom : "localNetRoom", } /** diff --git a/svr/src/socket/rtcCount/count.js b/svr/src/socket/rtcCount/count.js index a6f873b..fca8bf5 100644 --- a/svr/src/socket/rtcCount/count.js +++ b/svr/src/socket/rtcCount/count.js @@ -1,6 +1,7 @@ const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const utils = require("../../../src/utils/utils"); +const rtcLocalNetRoom = require("../rtcLocalNetRoom/localNetRoom"); /** * 在线人数统计广播 @@ -17,6 +18,11 @@ async function count(io, socket, tables, dbClient, data){ io.sockets.emit(rtcClientEvent.count, { mc : allManCount }) + + rtcLocalNetRoom.localNetRoom(io, socket, tables, dbClient, { + toAll : true + }); + }catch(e){ utils.tlConsole(e) } diff --git a/svr/src/socket/rtcCreateJoin/createJoin.js b/svr/src/socket/rtcCreateJoin/createJoin.js index e5ed495..adaaf68 100644 --- a/svr/src/socket/rtcCreateJoin/createJoin.js +++ b/svr/src/socket/rtcCreateJoin/createJoin.js @@ -1,4 +1,5 @@ const daoRoom = require("./../../dao/room/room") +const daoRelation = require("./../../dao/relation/relation") const bussinessNotify = require("./../../bussiness/notify/notifyHandler") const rtcCount = require("./../rtcCount/count"); const utils = require("./../../utils/utils"); @@ -7,6 +8,8 @@ const cfg = inject_env_config(require("./../../../conf/cfg.json")) const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const rtcLocalNetRoom = require("../rtcLocalNetRoom/localNetRoom"); + /** * 用户创建或加入房间 @@ -18,11 +21,12 @@ const check = require("../../bussiness/check/content"); * @returns */ async function userCreateAndJoin(io, socket, tables, dbClient, data){ - let {handshake, userAgent, ip} = utils.getSocketClientInfo(socket); + let {handshake, userAgent, ip, address} = utils.getSocketClientInfo(socket); let { - room, type = 'file', nickName = '', password = '', - langMode = 'zh', ua = '', network = '', liveShareRole = '' + room = '', type = 'file', nickName = '', password = '', + langMode = 'zh', ua = '', network = '', liveShareRole = '', + localNetRoom = false } = data; if (room && room.length > 15) { @@ -78,6 +82,14 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){ device: userAgent, content: JSON.stringify({ handshake: handshake }) }, tables, dbClient); + + //添加用户-房间号关联记录 + if(socket.userId){ + daoRelation.addUserRoomRelation({ + roomId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } let clientsInRoom = io.sockets.adapter.rooms[room]; let numClients = clientsInRoom ? Object.keys(clientsInRoom.sockets).length : 0; @@ -109,9 +121,21 @@ async function userCreateAndJoin(io, socket, tables, dbClient, data){ //设置为房主 io.sockets.connected[socket.id].owner = true; + //设置房主ip为房间号ip, address + io.sockets.adapter.rooms[room].ip = ip; + io.sockets.adapter.rooms[room].address = address; + + //房间是否可以被局域网发现 + io.sockets.adapter.rooms[room].localNetRoom = localNetRoom; + if(localNetRoom){ + rtcLocalNetRoom.localNetRoom(io, socket, tables, dbClient, { + toAll : true + }); + } + //设置房间类型 io.sockets.adapter.rooms[room].type = type; - + //密码房间设置密码 if(type === 'password'){ io.sockets.adapter.rooms[room].password = password @@ -264,6 +288,8 @@ function getRoomTypeZh(type){ return "密码" }else if(type === 'audio'){ return "语音连麦" + }else if(type === 'system'){ + return "系统" }else{ return "未知类型" } diff --git a/svr/src/socket/rtcDraw/draw.js b/svr/src/socket/rtcDraw/draw.js index 5447c1e..fba0838 100644 --- a/svr/src/socket/rtcDraw/draw.js +++ b/svr/src/socket/rtcDraw/draw.js @@ -3,6 +3,9 @@ const daoDog = require("./../../dao/dog/dog") const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); + + /** * canvas画图 * @param {*} io socketio对象 @@ -25,7 +28,7 @@ async function draw(io, socket, tables, dbClient, data){ otherClient.emit(rtcClientEvent.draw, data); //控制操作事件入库 - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "canvas画图", roomId: "", socketId: "", @@ -35,6 +38,14 @@ async function draw(io, socket, tables, dbClient, data){ handshake: JSON.stringify(handshake), ip: ip }, tables, dbClient); + + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } } module.exports = { diff --git a/svr/src/socket/rtcExit/exit.js b/svr/src/socket/rtcExit/exit.js index 66cdc3b..bec1fd6 100644 --- a/svr/src/socket/rtcExit/exit.js +++ b/svr/src/socket/rtcExit/exit.js @@ -5,6 +5,7 @@ const utils = require("./../../utils/utils"); const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent + /** * 退出房间 * @param {*} io socketio对象 @@ -20,7 +21,7 @@ async function exit(io, socket, tables, dbClient, data){ socket.leave(room); - let clientsInRoom = io.sockets.adapter.rooms[room]; + clientsInRoom = io.sockets.adapter.rooms[room]; if (clientsInRoom) { let otherSocketIds = Object.keys(clientsInRoom.sockets); for (let i = 0; i < otherSocketIds.length; i++) { @@ -45,7 +46,8 @@ async function exit(io, socket, tables, dbClient, data){ }) } - rtcCount.count(io, socket, tables, dbClient, data) + rtcCount.count(io, socket, tables, dbClient, data); + } catch (e) { socket.emit(rtcClientEvent.tips, { room: data.room, diff --git a/svr/src/socket/rtcLocalNetRoom/localNetRoom.js b/svr/src/socket/rtcLocalNetRoom/localNetRoom.js new file mode 100644 index 0000000..3a1c844 --- /dev/null +++ b/svr/src/socket/rtcLocalNetRoom/localNetRoom.js @@ -0,0 +1,161 @@ +const rtcConstant = require("../rtcConstant"); +const rtcClientEvent = rtcConstant.rtcClientEvent +const bussinessNotify = require("../../bussiness/notify/notifyHandler") +const utils = require("../../../src/utils/utils"); + +/** + * 局域网房间发现列表 + * + * @param {*} io socketio对象 + * @param {*} socket 单个socket连接 + * @param {*} tables 数据表对象 + * @param {*} dbClient sequelize-orm对象 + * @param {*} data event参数 + * @returns + */ +async function localNetRoom(io, socket, tables, dbClient, data){ + try{ + const { toCurrentSocket = false, toAll = false } = data; + + let { ip, address } = utils.getSocketClientInfo(socket); + + let roomList = []; + let rooms = io.sockets.adapter.rooms; + + for(let roomId in rooms){ + if(roomId.length > 15){ + continue; + } + + //最多返回10个房间 + if(roomList.length > 10){ + break; + } + + // 是否开启局域网房间 + const localNetRoom = rooms[roomId].localNetRoom || false; + if(!localNetRoom){ + continue; + } + + // 房间ip + const roomIp = rooms[roomId].ip || ""; + // 房间address/ip + const roomAddress = rooms[roomId].address || ""; + + if(roomIp){ + // 本地请求 + if( + (roomIp.indexOf("127.0.0.1") > -1 && ip.indexOf("127.0.0.1") > -1) + || + (roomIp.indexOf("localhost") > -1 && ip.indexOf("localhost") > -1) + ){ + roomList = addFilterRoomListData(roomList, { + room : roomId, + type : 'file', + ips : [roomIp], + count : rooms[roomId].length + }) + }else{ + // 在同一个网段 + if(utils.isSameSubnet(roomIp, ip, "255.255.255.255")){ + roomList = addFilterRoomListData(roomList, { + room : roomId, + type : 'file', + ips : [roomIp], + count : rooms[roomId].length + }) + } + } + } + + if(roomAddress){ + // 本地请求 + if( + (roomAddress.indexOf("127.0.0.1") > -1 && address.indexOf("127.0.0.1") > -1) + || + (roomAddress.indexOf("localhost") > -1 && address.indexOf("localhost") > -1) + ){ + roomList = addFilterRoomListData(roomList, { + room : roomId, + type : 'file', + ips : [roomAddress], + count : rooms[roomId].length + }) + }else{ + // 在同一个网段 + if(utils.isSameSubnet(roomAddress, address, "255.255.255.255")){ + roomList = addFilterRoomListData(roomList, { + room : roomId, + type : 'file', + ips : [roomAddress], + count : rooms[roomId].length + }) + } + } + } + } + + roomList.map(item=>{ + item.room = item.room.toString().substring(0,1) + "***"; + }) + + // 通知当前用户 + if(toCurrentSocket){ + socket.emit(rtcClientEvent.localNetRoom, { + list : roomList + }) + } + + // 通知全部用户 + if(toAll){ + io.sockets.emit(rtcClientEvent.localNetRoom, { + list : roomList + }); + } + + }catch(e){ + utils.tlConsole(e) + bussinessNotify.sendSystemErrorMsg({ + title: "socket-localNetRoom", + data: JSON.stringify(data), + room: "", + from : socket.id, + msg : JSON.stringify({ + message: e.message, + fileName: e.fileName, + lineNumber: e.lineNumber, + stack: e.stack, + name: e.name + }, null, '\t') + }) + } +} + + +/** + * 处理去重房间列表 + * @param {*} list + * @returns + */ +function addFilterRoomListData(list, obj){ + let exist = list.filter(item => item.room === obj.room).length > 0; + if(!exist){ + list.push(obj) + return list + } + + for(let i = 0; i < list.length; i++){ + if(list[i].room === obj.room){ + let oldIps = list[i].ips; + oldIps.push(obj.ips[0]) + list[i].ips = oldIps; + } + } + return list; +} + + +module.exports = { + localNetRoom +} \ No newline at end of file diff --git a/svr/src/socket/rtcMessage/message.js b/svr/src/socket/rtcMessage/message.js index fb65b46..f25b22d 100644 --- a/svr/src/socket/rtcMessage/message.js +++ b/svr/src/socket/rtcMessage/message.js @@ -4,6 +4,7 @@ const utils = require("./../../utils/utils"); const rtcConstant = require("../rtcConstant"); const rtcServerMessageEvent = rtcConstant.rtcServerMessageEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("./../../dao/relation/relation") let rtcEventOpName = { "sendFileInfo": "准备发送文件", @@ -204,7 +205,7 @@ async function message(io, socket, tables, dbClient, data){ } if (rtcEventOpName[emitType]) { - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: rtcEventOpName[emitType], roomId: room || "", socketId: "", @@ -214,6 +215,14 @@ async function message(io, socket, tables, dbClient, data){ handshake: JSON.stringify(handshake), ip: ip }, tables, dbClient); + + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } } // 指定发送 diff --git a/svr/src/socket/rtcOpenai/openai.js b/svr/src/socket/rtcOpenai/openai.js index 764a660..b7cc879 100644 --- a/svr/src/socket/rtcOpenai/openai.js +++ b/svr/src/socket/rtcOpenai/openai.js @@ -6,6 +6,7 @@ const bussinessOpenai = require("./../../bussiness/openai/openai") const rtcConstant = require("../rtcConstant"); const rtcClientEvent = rtcConstant.rtcClientEvent const check = require("../../bussiness/check/content"); +const daoRelation = require("../../dao/relation/relation"); /** * ai聊天 @@ -59,7 +60,7 @@ async function openai(io, socket, tables, dbClient, data){ otherSocket.emit(rtcClientEvent.openaiAnswer, data); } - await daoDog.addDogData({ + let recoderId = await daoDog.addDogData({ name: "ChatGPT聊天", roomId: roomId, socketId: data.socketId, @@ -70,6 +71,14 @@ async function openai(io, socket, tables, dbClient, data){ ip: ip }, tables, dbClient); + //添加用户-操作关联记录 + if(socket.userId){ + daoRelation.addUserDogRelation({ + dogId : recoderId, + userId : socket.userId, + }, tables, dbClient); + } + bussinessNotify.sendOpenaiChatNotify({ title: "ChatGPT聊天", room: roomId, diff --git a/svr/src/socket/rtcToken/token.js b/svr/src/socket/rtcToken/token.js new file mode 100644 index 0000000..2db2017 --- /dev/null +++ b/svr/src/socket/rtcToken/token.js @@ -0,0 +1,53 @@ +const request = require('request'); +const {inject_env_config} = require("./../../../conf/env_config"); +const cfg = inject_env_config(require("./../../../conf/cfg.json")) +const utils = require("./../../utils/utils"); + +/** + * token 处理 + * 通过token去api服务拿到用户信息, 在后续的事件中可以关联到用户信息 + * @param {*} io socketio对象 + * @param {*} socket 单个socket连接 + * @param {*} tables 数据表对象 + * @param {*} dbClient sequelize-orm对象 + * @param {*} data event参数 + * @returns + */ +async function token(io, socket, tables, dbClient, data){ + const { token } = socket.handshake.query; + + if(!token || token.length < 16){ + utils.tlConsole("匿名用户-token空") + return; + } + + request({ + method: "POST", + url: `https://im.iamtsm.cn/api/login/info`, + json: true, + headers: { + "content-type": "application/json", + }, + qs: { + token, key : "iamtsm-socket" + }, + }, (err, res, body) => { + if(err){ + console.log(err); + return; + } + + if(body.code !== 200){ + console.log(body); + return; + } + + socket.userId = body.userId; + + utils.tlConsole("同步token信息成功 : ", token, body.userId) + }); +} + +module.exports = { + token +} \ No newline at end of file diff --git a/svr/src/tables/dog.js b/svr/src/tables/dog.js index 96b30a6..570316d 100644 --- a/svr/src/tables/dog.js +++ b/svr/src/tables/dog.js @@ -1,6 +1,12 @@ // dog module.exports = (sequelize, DataTypes) => { return { + DogOther : { + Flag : { + IS_DEV_ADMIN : 0x1, //是否是开发者团队的操作记录 + IS_SET_TOP : 0x2, //是否设置消息记录类型置顶 + } + }, Dog: sequelize.define('dog', { id: { type: DataTypes.INTEGER, @@ -44,6 +50,10 @@ module.exports = (sequelize, DataTypes) => { name: 'created_at_index', method: 'BTREE', fields: ['created_at'] + },{ + name: 'room_id_name_index', + method: 'BTREE', + fields: ['room_id','name'] }] }) }; diff --git a/svr/src/tables/relation.js b/svr/src/tables/relation.js new file mode 100644 index 0000000..476520c --- /dev/null +++ b/svr/src/tables/relation.js @@ -0,0 +1,38 @@ +// relation +module.exports = (sequelize, DataTypes) => { + return { + Relation: sequelize.define('relation', { + id: { + type: DataTypes.INTEGER, + comment: '关联id', + primaryKey: true, + autoIncrement: true + }, + type: { + type: DataTypes.STRING(20), + comment: '关联类型' + }, + source_id: { + type: DataTypes.STRING(25), + comment: '源对象id' + }, + target_id: { + type: DataTypes.STRING(25), + comment: '关联对象id' + }, + flag: { + type: DataTypes.INTEGER, + comment: '标志位', + defaultValue: 0, + } + }, { + timestamps: true, + comment: '关联记录表', + indexes: [{ + name: 'created_at_index', + method: 'BTREE', + fields: ['created_at'] + }] + }) + }; +} diff --git a/svr/src/tables/room.js b/svr/src/tables/room.js index 12529c9..13ecdc7 100644 --- a/svr/src/tables/room.js +++ b/svr/src/tables/room.js @@ -1,6 +1,12 @@ // room module.exports = (sequelize, DataTypes) => { return { + RoomOther: { + Flag : { + IS_MANAGE_ROOM : 0x1, //是否是管理后台房间 + IS_SYSTEM_QUESTION_ROOM : 0x2, //是否是系统反馈问题房间 + }, + }, Room: sequelize.define('room', { id: { type: DataTypes.INTEGER, @@ -15,15 +21,15 @@ module.exports = (sequelize, DataTypes) => { }, uid: { type: DataTypes.INTEGER, - comment: '匿名用户的id', + comment: '用户的id', }, uname: { type: DataTypes.STRING(20), - comment: '匿名用户姓名,昵称' + comment: '用户姓名,昵称' }, socket_id: { type: DataTypes.STRING(30), - comment: '匿名用户进入房间时的socket.id' + comment: '用户进入房间时的socket.id' }, pwd: { type: DataTypes.STRING(6), diff --git a/svr/src/tables/user.js b/svr/src/tables/user.js new file mode 100644 index 0000000..75e9040 --- /dev/null +++ b/svr/src/tables/user.js @@ -0,0 +1,50 @@ +// user +module.exports = (sequelize, DataTypes) => { + return { + User: sequelize.define('user', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + unique: true, + comment: '数据id', + }, + type: { + type: DataTypes.STRING(6), + comment: '帐号类型, wx, qq, wb, web, other' + }, + openid: { + type: DataTypes.STRING(64), + comment: '微信openid' + }, + avatar : { + type: DataTypes.STRING(512), + comment: '头像地址' + }, + uname: { + type: DataTypes.STRING(20), + comment: '姓名,昵称' + }, + pwd : { + type: DataTypes.STRING(12), + comment: '用户密码' + }, + solt : { + type: DataTypes.STRING(32), + comment: '加密solt' + }, + role: { + type: DataTypes.STRING(15), + comment: '用户身份' + } + }, { + timestamps: true, + comment: '用户表', + indexes: [{ + name: 'created_at_index', + method: 'BTREE', + fields: ['created_at'] + }] + }) + }; +} \ No newline at end of file diff --git a/svr/src/utils/utils.js b/svr/src/utils/utils.js index eeba0fe..60b4968 100644 --- a/svr/src/utils/utils.js +++ b/svr/src/utils/utils.js @@ -39,6 +39,36 @@ function getLocalIP() { return ip; } +/** + * 检查两个IP地址是否在同一个子网内 + * @param {*} ip1 + * @param {*} ip2 + * @param {*} subnetMask + * @returns + */ +function isSameSubnet(ip1, ip2, subnetMask) { + // 将IPv4或IPv6地址和子网掩码转换为数字形式 + function ipToNumber(ip) { + if (ip.includes(':')) { // IPv6 + const parts = ip.split(':'); + return parts.map(part => parseInt(part, 16)).join(''); + } else { // IPv4 + const parts = ip.split('.'); + return (parseInt(parts[0]) << 24) | + (parseInt(parts[1]) << 16) | + (parseInt(parts[2]) << 8) | + parseInt(parts[3]); + } + } + + // 检查第一个IP和第二个IP是否在同一个子网内 + const ip1Number = ipToNumber(ip1); + const ip2Number = ipToNumber(ip2); + const subnetMaskNumber = ipToNumber(subnetMask); + + return (ip1Number & subnetMaskNumber) === (ip2Number & subnetMaskNumber); +} + /** * 获取请求的ip * @param {*} request @@ -125,11 +155,17 @@ function getNextDay(time) { */ function getSocketClientInfo(socket){ let handshake = socket.handshake + let userAgent = handshake.headers['user-agent'].toString().substr(0, 255); + let ip = handshake.headers['x-real-ip'] || handshake.headers['x-forwarded-for'] || handshake.headers['host']; + ip = ip.indexOf(":") > -1 ? ip.split(":")[0] : ip; + + let address = socket.handshake.address; + address = address.length > 7 ? address.substr(7, address.length) : address; return { - handshake, userAgent, ip + handshake, userAgent, ip, address } } @@ -299,6 +335,46 @@ function unescapeStr(str) { }); } +/** + * 根据socketid加密websocket数据 + * @param {*} socketId + * @param {*} data + * @returns + */ +function encryptSocketData(socketId, data){ + const key = "tl-rtc-file"; + const iv = socketId.substring(0, 16); + const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); + let encrypted = cipher.update(data, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return encrypted; +} + +/** + * 根据socketid解密websocket数据 + * @param {*} socketId + * @param {*} data + * @returns + */ +function decryptSocketData(socketId, data){ + const key = "tl-rtc-file"; + const iv = socketId.substring(0, 16); + const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); + let decrypted = decipher.update(data, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; +} + +/** + * 根据flag和bit获取对应的值 + * @param {*} flag + * @param {*} bit + */ +function checkBit(flag, bit){ + return (flag & bit) === bit; +} + + module.exports = { getLocalIP, @@ -314,5 +390,7 @@ module.exports = { genTurnServerIceServersConfig, genClientLogo, unescapeStr, - escapeStr + escapeStr, + isSameSubnet, + checkBit } \ No newline at end of file diff --git a/svr/static/js/localforage.min.js b/svr/static/js/localforage.min.js new file mode 100644 index 0000000..7403f8f --- /dev/null +++ b/svr/static/js/localforage.min.js @@ -0,0 +1,7 @@ +/*! + localForage -- Offline Storage, Improved + Version 1.10.0 + https://localforage.github.io/localForage + (c) 2013-2017 Mozilla, Apache License 2.0 +*/ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){var b=f.result;b.onversionchange=function(a){a.target.close()},c(b),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a.layui-nav-child{padding:5px 0}.layui-side-menu .layui-nav>.layui-nav-item .layui-icon:first-child{position:absolute;top:50%;left:20px;margin-top:-19px}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child{background:0 0!important}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child a{padding-left:60px}@media screen and (max-width:992px){.layui-layout-admin .layui-side{transform:translate3d(-220px,0,0);-webkit-transform:translate3d(-220px,0,0);width:220px}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-layout-left{left:0}}.layadmin-side-shrink .layui-layout-admin .layui-logo{width:60px;background-image:url(res/logo.png)}.layadmin-side-shrink .layui-layout-admin .layui-logo span{display:none}.layadmin-side-shrink .layui-side{left:0;width:60px}.layadmin-side-shrink .layadmin-pagetabs,.layadmin-side-shrink .layui-layout-admin .layui-body,.layadmin-side-shrink .layui-layout-admin .layui-footer,.layadmin-side-shrink .layui-layout-admin .layui-layout-left{left:60px}.layadmin-side-shrink .layui-side-menu .layui-nav{position:static;width:60px}.layadmin-side-shrink .layui-side-menu .layui-nav-item{position:static}.layadmin-side-shrink .layui-side-menu .layui-nav-item>a{padding-right:0}.layadmin-side-shrink .layui-side-menu .layui-nav-item cite,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>a .layui-nav-more{display:none;padding:8px 0;width:200px}.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-itemed>a{background:rgba(0,0,0,.3)}.layadmin-side-spread-sm .layadmin-pagetabs,.layadmin-side-spread-sm .layui-layout-admin .layui-body,.layadmin-side-spread-sm .layui-layout-admin .layui-footer,.layadmin-side-spread-sm .layui-layout-admin .layui-layout-left{left:0;transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-layout-admin .layui-layout-right{transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-side{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}.layadmin-side-spread-sm .layadmin-body-shade{display:block}.layadmin-pagetabs .layui-tab-title li:first-child .layui-tab-close,.layadmin-tabs-select.layui-nav .layui-nav-bar,.layadmin-tabs-select.layui-nav .layui-nav-more{display:none}.layadmin-pagetabs{height:40px;line-height:40px;padding:0 80px 0 40px;background-color:#fff;box-sizing:border-box;box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.layadmin-pagetabs .layadmin-tabs-control{position:absolute;top:0;width:40px;height:100%;text-align:center;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box;border-left:1px solid #f6f6f6}.layadmin-pagetabs .layadmin-tabs-control:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-icon-prev{left:0;border-left:none;border-right:1px solid #f6f6f6}.layadmin-pagetabs .layui-icon-next{right:40px}.layadmin-pagetabs .layui-icon-down{right:0}.layadmin-tabs-select.layui-nav{position:absolute;left:0;top:0;width:100%;height:100%;padding:0;background:0 0}.layadmin-tabs-select.layui-nav .layui-nav-item{line-height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item>a{height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item a{color:#666}.layadmin-tabs-select.layui-nav .layui-nav-child{top:40px;left:auto;right:0}.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this,.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this a{background-color:#f2f2f2!important;color:#333}.layadmin-pagetabs .layui-tab{margin:0;overflow:hidden}.layadmin-pagetabs .layui-tab-title{height:40px;border:none}.layadmin-pagetabs .layui-tab-title li{min-width:0;line-height:40px;max-width:160px;text-overflow:ellipsis;padding-right:40px;overflow:hidden;border-right:1px solid #f6f6f6;vertical-align:top}.layadmin-pagetabs .layui-tab-title li:first-child{padding-right:15px}.layadmin-pagetabs .layui-tab-title li .layui-tab-close{position:absolute;right:8px;top:50%;margin:-7px 0 0;width:16px;height:16px;line-height:16px;border-radius:50%;font-size:12px}.layadmin-pagetabs .layui-tab-title li:after{content:'';position:absolute;top:0;left:0;width:0;height:2px;border-radius:0;background-color:#292B34;transition:all .3s;-webkit-transition:all .3s}.layadmin-pagetabs .layui-tab-title li:hover:after{width:100%}.layadmin-pagetabs .layui-tab-title li.layui-this,.layadmin-pagetabs .layui-tab-title li:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-tab-title li.layui-this:after{width:100%;border:none;height:2px;background-color:#292B34}.layadmin-tabspage-none .layui-layout-admin .layui-header{border-bottom:none;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layadmin-tabspage-none .layui-layout-admin .layui-body{top:50px}.layadmin-tabspage-none .layadmin-header{display:block}.layadmin-tabspage-none .layadmin-header .layui-breadcrumb{border-top:1px solid #f6f6f6}.layui-layout-admin .layui-header{border-bottom:1px solid #f6f6f6;box-sizing:border-box;background-color:#fff}.layui-layout-admin .layui-header a,.layui-layout-admin .layui-header a cite{color:#333}.layui-layout-admin .layui-header a:hover{color:#000}.layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color:#666}.layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color:transparent transparent #666}.layui-layout-admin .layui-header .layui-nav .layui-this:after,.layui-layout-admin .layui-header .layui-nav-bar{height:2px;background-color:#20222A}.layui-layout-admin .layui-logo{background-color:#20222A;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layui-layout-admin .layui-logo,.layui-layout-admin .layui-logo a{color:#fff;color:rgba(255,255,255,.8)}.layui-side-menu{box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layui-layout-admin .layui-footer{padding:10px 0;text-align:center;box-shadow:0 -1px 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-side,.layui-side-menu{background-color:#20222A;color:#fff}.layadmin-setTheme-header,.layui-layout-admin .layui-footer{background-color:#fff}.layui-tab-admin .layui-tab-title{background-color:#393D49;color:#fff}.layui-fluid{padding:15px}.layadmin-header{display:none;height:50px;line-height:50px;margin-bottom:0;border-radius:0}.layadmin-header .layui-breadcrumb{padding:0 15px}.layui-card-header{position:relative}.layui-card-header .layui-icon{line-height:initial;position:absolute;right:15px;top:50%;margin-top:-7px}.layadmin-iframe{position:absolute;width:100%;height:100%;left:0;top:0;right:0;bottom:0}.layadmin-carousel{height:185px;background-color:#fff}.layadmin-carousel .layui-carousel-ind li{background-color:#e2e2e2}.layadmin-carousel .layui-carousel-ind li:hover{background-color:#c2c2c2}.layadmin-carousel .layui-carousel-ind li.layui-this{background-color:#999}.layadmin-carousel .layui-carousel,.layadmin-carousel>[carousel-item]>*{background-color:#fff}.layadmin-carousel .layui-col-space10{margin:0}.layadmin-carousel .layui-carousel-ind{position:absolute;top:-41px;text-align:right}.layadmin-carousel .layui-carousel-ind ul{background:0 0}.layui-card .layui-tab-brief .layui-tab-title{height:42px;border-bottom-color:#f6f6f6}.layui-card .layui-tab-brief .layui-tab-title li{margin:0 15px;padding:0;line-height:42px}.layui-card .layui-tab-brief .layui-tab-title li.layui-this{color:#333}.layui-card .layui-tab-brief .layui-tab-title .layui-this:after{height:43px}.layui-card .layui-tab-brief .layui-tab-content{padding:15px}.layui-card .layui-table-view{margin:0}.layadmin-shortcut li{text-align:center}.layadmin-shortcut li .layui-icon{display:inline-block;width:100%;height:60px;line-height:60px;text-align:center;border-radius:2px;font-size:30px;background-color:#F8F8F8;color:#333;transition:all .3s;-webkit-transition:all .3s}.layadmin-shortcut li cite{position:relative;top:2px;display:block;color:#666;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:14px}.layadmin-shortcut li:hover .layui-icon{background-color:#f2f2f2}.layadmin-backlog .layadmin-backlog-body{display:block;padding:10px 15px;background-color:#f8f8f8;color:#999;border-radius:2px;transition:all .3s;-webkit-transition:all .3s}.layadmin-backlog-body h3{padding-bottom:10px;font-size:12px}.layadmin-backlog-body p cite{font-style:normal;font-size:30px;font-weight:300;color:#009688}.layadmin-backlog-body:hover{background-color:#f2f2f2;color:#888}.layadmin-version .layui-table{padding:6px 0}.layadmin-version .layui-table td,.layadmin-version .layui-table th{line-height:25px}.layadmin-dataview{height:332px!important}.layadmin-dataview>[carousel-item]:before{display:none}.layadmin-dataview>[carousel-item]>div{height:332px}.layadmin-takerates{padding-top:5px}.layadmin-takerates .layui-progress{margin:50px 0 60px}.layadmin-takerates .layui-progress:last-child{margin-bottom:10px}.layadmin-takerates .layui-progress h3{position:absolute;right:0;top:-35px;color:#999;font-size:14px}.layadmin-takerates .layui-progress-bar{text-align:left}.layadmin-takerates .layui-progress-text{top:-35px;line-height:26px;font-size:26px}.layadmin-news{height:60px!important;padding:5px 0}.layadmin-news a{display:block;line-height:60px;text-align:center}.layadmin-news .layui-carousel-ind{height:45px}.layadmin-list li{margin-bottom:6px;padding-bottom:6px;border-bottom-color:#f6f6f6;list-style-position:inside;list-style-type:disc;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layadmin-list li a{color:#666}.layadmin-list li a:hover{color:#009688}.layadmin-list li:last-child{border:none;padding:0;margin:0}.layadmin-text p{margin-bottom:10px;text-indent:2em}.layadmin-text p:last-child{margin:0}.layadmin-font-em{font-size:13px;color:#758697}.layui-card-header .layui-a-tips{position:absolute;right:15px;color:#01AAED}.layuiadmin-card-text{background-color:#f8f8f8;color:#777;padding:24px}.layuiadmin-card-text .layui-text-top{padding-bottom:10px}.layuiadmin-card-text .layui-text-top i{margin-right:10px;font-size:24px;color:#009688}.layuiadmin-card-text .layui-text-top a{line-height:24px;font-size:16px;vertical-align:top}.layuiadmin-card-text .layui-text-center{height:44px;line-height:22px;margin-bottom:10px;overflow:hidden}.layuiadmin-card-text .layui-text-bottom{position:relative}.layuiadmin-card-text .layui-text-bottom a{color:#777;font-size:12px;text-overflow:ellipsis;word-break:break-all}.layuiadmin-card-text .layui-text-bottom span{color:#CCC;font-size:12px;position:absolute;right:0}.layuiadmin-badge,.layuiadmin-btn-group,.layuiadmin-span-color{position:absolute;right:15px}.layuiadmin-card-link a:hover,.layuiadmin-card-team li a:hover,.layuiadmin-card-text a:hover{color:#01AAED;transition:all .3s}.layuiadmin-card-status{padding:0 10px 10px}.layuiadmin-card-status dd{padding:15px 0;border-bottom:1px solid #EEE;display:-webkit-flex;display:flex}.layuiadmin-card-status dd:last-child{border:none}.layuiadmin-card-status dd div.layui-status-img,.layuiadmin-card-team .layui-team-img{width:32px;height:32px;border-radius:50%;background-color:#009688;margin-right:15px}.layuiadmin-card-status dd div.layui-status-img a{width:100%;height:100%;display:inline-block;text-align:center;line-height:32px}.layuiadmin-card-status dd div.layui-status-img img,.layuiadmin-card-team .layui-team-img img{width:50%;height:50%}.layuiadmin-card-status dd div a{color:#01AAED}.layuiadmin-card-status dd div span{color:#BBB}.layuiadmin-card-link{padding-left:10px;font-size:0}.layuiadmin-card-link a{display:inline-block;width:25%;color:#666;font-size:14px;margin-bottom:12px}.layuiadmin-card-link button{vertical-align:top}.layuiadmin-card-link button:hover{color:#009688}.layuiadmin-card-team li{padding:10px 0 10px 10px}.layuiadmin-card-team .layui-team-img{display:inline-block;margin-right:8px;width:24px;height:24px;text-align:center;line-height:24px}.layuiadmin-card-team span{color:#777}.layuiadmin-badge{top:50%;margin-top:-9px;color:#01AAED}.layuiadmin-card-list{padding:15px}.layuiadmin-card-list p.layuiadmin-big-font{font-size:36px;color:#666;line-height:36px;padding:5px 0 10px;overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:nowrap}.layuiadmin-card-list p.layuiadmin-normal-font{padding-bottom:10px;font-size:20px;color:#666;line-height:24px}.layuiadmin-span-color{font-size:14px}.layuiadmin-span-color i{padding-left:5px}.layuiadmin-card-status li{position:relative;padding:10px 0;border-bottom:1px solid #EEE}.layuiadmin-card-status li h3{padding-bottom:5px;font-weight:700}.layuiadmin-card-status li p{padding-bottom:10px}.layuiadmin-card-status li>span{color:#999}.layuiadmin-home2-usernote .layuiadmin-reply{display:none;position:absolute;right:0;bottom:12px}.layuiadmin-home2-usernote li:hover .layuiadmin-reply{display:block}.layuiadmin-page-table td span{color:#2F4056}.layuiadmin-page-table td span.first{color:#FF5722}.layuiadmin-page-table td span.second{color:#FFB800}.layuiadmin-page-table td span.third{color:#5FB878}.layuiAdmin-msg-detail h1{font-size:16px}.layuiAdmin-msg-detail .layui-card-header{height:auto;line-height:30px;padding:15px}.layuiAdmin-msg-detail .layui-card-header span{padding:0 5px;color:#999}.layuiAdmin-msg-detail .layui-card-header span:first-child{padding-left:0}.layuiAdmin-msg-detail .layui-card-body{padding:15px}.layuiadmin-content-bread{padding-bottom:20px}.layuiadmin-order-progress{position:relative;top:12px}.layui-card-header.layuiadmin-card-header-auto{padding-top:15px;padding-bottom:15px;height:auto}.layuiadmin-card-header-auto i.layuiadmin-button-btn{position:relative;right:0;top:0;vertical-align:middle}.layuiadmin-card-header-auto .layui-form-item:last-child{margin-bottom:0}.layadmin-setTheme{padding:15px;overflow-x:hidden}.layadmin-setTheme>h5{padding:20px 0 10px;color:#000}.layadmin-setTheme>h5:first-child{padding-top:0}.layadmin-setTheme-color{width:330px;font-size:0}.layadmin-setTheme-color li{position:relative;display:inline-block;vertical-align:top;width:80px;height:50px;margin:0 15px 15px 0;background-color:#f2f2f2;cursor:pointer;font-size:12px;color:#666}.layadmin-setTheme-color li:after{content:'';position:absolute;z-index:20;top:50%;left:50%;width:1px;height:0;border:1px solid #f2f2f2;transition:all .3s;-webkit-transition:all .3s;opacity:0}.layadmin-setTheme-color li.layui-this:after,.layadmin-setTheme-color li:hover:after{width:100%;height:100%;padding:4px;top:-5px;left:-5px;border-color:#5FB878;opacity:1}.layadmin-setTheme-header{position:relative;z-index:10;height:10px;border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2}.layadmin-setTheme-side{position:absolute;left:0;top:0;width:20px;height:100%;z-index:11;box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-logo{position:absolute;left:0;top:0;width:100%;height:10px;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layadmin-form-right{text-align:right}.layadmin-about p{margin-bottom:10px}.layadmin-menu-list .layui-card-header{height:50px;line-height:50px;font-size:16px}.layadmin-menu-list .layui-card-header:active{background-color:#f2f2f2}.layadmin-menu-list .layui-card-header .layui-icon{position:relative;top:1px;left:0;display:inline-block;margin:0 10px;font-size:18px}@-webkit-keyframes layui-rl{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@keyframes layui-rl{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}.layui-anim-rl{-webkit-animation-name:layui-rl;animation-name:layui-rl}@-webkit-keyframes layui-lr{from{-webkit-transform:translate3d(0 0,0);opacity:1}to{-webkit-transform:translate3d(100%,0,0);opacity:1}}@keyframes layui-lr{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layui-anim-lr,.layui-anim-rl.layer-anim-close{-webkit-animation-name:layui-lr;animation-name:layui-lr}.layadmin-tips{margin-top:30px;text-align:center}.layadmin-tips .layui-icon[face]{display:inline-block;font-size:300px;color:#393D49}.layadmin-tips .layui-text{width:500px;margin:30px auto;padding-top:20px;border-top:5px solid #009688;font-size:16px}.layadmin-tips h1{font-size:100px;line-height:100px;color:#009688}.layadmin-tips .layui-text .layui-anim{display:inline-block}@media screen and (max-width:768px){.layadmin-panel-selection{margin:0;width:auto}.layui-body .layui-nav .layui-nav-item{display:block}.layui-layout-admin .layui-body .layadmin-tabsbody-item{-webkit-overflow-scrolling:touch;overflow:auto}} \ No newline at end of file +html #layuicss-layuiAdmin{display:none;position:absolute;width:1989px}::-webkit-input-placeholder{color:#ccc}html{background-color:#f2f2f2;color:#666}.layadmin-tabsbody-item,[template]{display:none}[lay-href],[lay-tips],[layadmin-event]{cursor:pointer}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;width:100%;height:50px}.layui-layout-admin .layui-header .layui-nav .layui-nav-child a{color:#333}.layui-layout-admin .layui-side{width:220px;top:0;z-index:1001}.layui-layout-admin .layui-header .layui-nav .layui-nav-item,.layui-layout-admin .layui-logo{height:50px;line-height:50px}.layui-layout-admin .layui-logo{position:fixed;left:0;top:0;z-index:1002;width:220px;height:49px;padding:0 15px;box-sizing:border-box;overflow:hidden;font-weight:300;background-repeat:no-repeat;background-position:center center}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-layout-left{left:220px}.layadmin-pagetabs{position:fixed;top:50px;right:0;z-index:999}.layadmin-pagetabs .layui-breadcrumb{padding:0 15px}.layui-layout-admin .layui-body{position:fixed;top:90px;bottom:0}.layui-layout-admin .layui-body .layadmin-tabsbody-item{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;overflow-y:auto}.layui-layout-admin .layui-header .layui-nav-img{width:26px;height:26px}.layui-layout-admin .layui-header .layui-nav-child{top:55px}.layui-layout-admin .layui-header .layui-layout-right .layui-nav-child{left:auto;right:0}.layui-layout-admin .layui-header .layui-nav .layui-nav-child dd.layui-this,.layui-layout-admin .layui-header .layui-nav .layui-nav-child dd.layui-this a{background:0 0}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-header .layui-layout-right,.layui-layout-admin .layui-header .layui-nav .layui-nav-item,.layui-layout-admin .layui-layout-left,.layui-layout-admin .layui-logo,.layui-layout-admin .layui-side{transition:all .3s;-webkit-transition:all .3s}.layui-icon-login-qq{color:#3492ED}.layui-icon-login-wechat{color:#4DAF29}.layui-icon-login-weibo{color:#CF1900}.layui-form[wid100] .layui-form-label{width:100px}.layui-form[wid100] .layui-input-block{margin-left:130px}@media screen and (max-width:450px){.layui-form[wid100] .layui-form-item .layui-input-inline{margin-left:132px}.layui-form[wid100] .layui-form-item .layui-input-inline+.layui-form-mid{margin-left:130px}}.layui-form-item .layui-input-company{width:auto;padding-right:10px;line-height:38px}.layui-bg-white{background-color:#fff}.layadmin-loading{position:absolute;left:50%;top:50%;margin:-16px -15px;font-size:30px;color:#c2c2c2}.layadmin-fixed{position:fixed;left:0;top:0;z-index:999}.layadmin-link{color:#029789!important}.layadmin-link:hover{opacity:.8}.layui-layer-admin .layui-layer-title{height:50px;line-height:50px;border:0;background-color:#20222A;color:#fff}.layui-layer-admin i[close]{position:absolute;padding:5px;right:10px;top:12px;color:#fff;cursor:pointer}.layui-layer-admin .layui-layer-content{padding:20px;line-height:22px}.layui-layer-admin .layui-layer-content cite{font-style:normal;color:#FF5722}.layui-layer-adminRight{top:50px!important;bottom:0;box-shadow:1px 1px 10px rgba(0,0,0,.1);border-radius:0;overflow:auto}.layadmin-note .layui-layer-content{padding:0}.layadmin-note textarea{display:block;width:300px;height:132px;min-width:300px;min-height:132px;line-height:20px;padding:10px 20px;border:none;box-sizing:border-box;color:#666;word-wrap:break-word}.layui-layout-admin .layui-layout-left{padding:0 10px}.layui-layout-admin .layui-layout-left .layui-nav-item{margin:0 20px}.layui-layout-admin .layui-input-search{display:inline-block;vertical-align:middle;height:32px;border:none;cursor:text}.layui-layout-admin .layui-layout-left a,.layui-layout-admin .layui-layout-right{padding:0}.layui-header .layui-layout-right .layui-badge-dot{margin-left:0}.layui-header .layui-nav .layui-this:after,.layui-layout-admin .layui-header .layui-nav-bar{top:0!important;bottom:auto;height:3px;background-color:#fff;background-color:rgba(255,255,255,.3)}.layadmin-body-shade{position:fixed;display:none;left:0;right:0;top:0;bottom:0;background-color:rgba(0,0,0,.3);z-index:1000}.layui-side-menu .layui-side-scroll{width:240px}.layui-side-menu .layui-nav{width:220px;margin-top:50px;background:0 0}.layui-side-menu .layui-nav .layui-nav-item a{padding-left:45px;padding-right:30px}.layui-side-menu .layui-nav .layui-nav-item a:hover{background:0 0}.layui-side-menu .layui-nav .layui-nav-itemed>.layui-nav-child{padding:5px 0}.layui-side-menu .layui-nav>.layui-nav-item .layui-icon:first-child{position:absolute;top:50%;left:20px;margin-top:-19px}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child{background:0 0!important}.layui-side-menu .layui-nav .layui-nav-child .layui-nav-child a{padding-left:60px}@media screen and (max-width:992px){.layui-layout-admin .layui-side{transform:translate3d(-220px,0,0);-webkit-transform:translate3d(-220px,0,0);width:220px}.layadmin-pagetabs,.layui-layout-admin .layui-body,.layui-layout-admin .layui-footer,.layui-layout-admin .layui-layout-left{left:0}}.layadmin-side-shrink .layui-layout-admin .layui-logo{width:60px;background-image:url(web-res/logo.png)}.layadmin-side-shrink .layui-layout-admin .layui-logo span{display:none}.layadmin-side-shrink .layui-side{left:0;width:60px}.layadmin-side-shrink .layadmin-pagetabs,.layadmin-side-shrink .layui-layout-admin .layui-body,.layadmin-side-shrink .layui-layout-admin .layui-footer,.layadmin-side-shrink .layui-layout-admin .layui-layout-left{left:60px}.layadmin-side-shrink .layui-side-menu .layui-nav{position:static;width:60px}.layadmin-side-shrink .layui-side-menu .layui-nav-item{position:static}.layadmin-side-shrink .layui-side-menu .layui-nav-item>a{padding-right:0}.layadmin-side-shrink .layui-side-menu .layui-nav-item cite,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>.layui-nav-child,.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-item>a .layui-nav-more{display:none;padding:8px 0;width:200px}.layadmin-side-shrink .layui-side-menu .layui-nav>.layui-nav-itemed>a{background:rgba(0,0,0,.3)}.layadmin-side-spread-sm .layadmin-pagetabs,.layadmin-side-spread-sm .layui-layout-admin .layui-body,.layadmin-side-spread-sm .layui-layout-admin .layui-footer,.layadmin-side-spread-sm .layui-layout-admin .layui-layout-left{left:0;transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-layout-admin .layui-layout-right{transform:translate3d(220px,0,0);-webkit-transform:translate3d(220px,0,0)}.layadmin-side-spread-sm .layui-side{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}.layadmin-side-spread-sm .layadmin-body-shade{display:block}.layadmin-pagetabs .layui-tab-title li:first-child .layui-tab-close,.layadmin-tabs-select.layui-nav .layui-nav-bar,.layadmin-tabs-select.layui-nav .layui-nav-more{display:none}.layadmin-pagetabs{height:40px;line-height:40px;padding:0 80px 0 40px;background-color:#fff;box-sizing:border-box;box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.layadmin-pagetabs .layadmin-tabs-control{position:absolute;top:0;width:40px;height:100%;text-align:center;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box;border-left:1px solid #f6f6f6}.layadmin-pagetabs .layadmin-tabs-control:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-icon-prev{left:0;border-left:none;border-right:1px solid #f6f6f6}.layadmin-pagetabs .layui-icon-next{right:40px}.layadmin-pagetabs .layui-icon-down{right:0}.layadmin-tabs-select.layui-nav{position:absolute;left:0;top:0;width:100%;height:100%;padding:0;background:0 0}.layadmin-tabs-select.layui-nav .layui-nav-item{line-height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item>a{height:40px}.layadmin-tabs-select.layui-nav .layui-nav-item a{color:#666}.layadmin-tabs-select.layui-nav .layui-nav-child{top:40px;left:auto;right:0}.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this,.layadmin-tabs-select.layui-nav .layui-nav-child dd.layui-this a{background-color:#f2f2f2!important;color:#333}.layadmin-pagetabs .layui-tab{margin:0;overflow:hidden}.layadmin-pagetabs .layui-tab-title{height:40px;border:none}.layadmin-pagetabs .layui-tab-title li{min-width:0;line-height:40px;max-width:160px;text-overflow:ellipsis;padding-right:40px;overflow:hidden;border-right:1px solid #f6f6f6;vertical-align:top}.layadmin-pagetabs .layui-tab-title li:first-child{padding-right:15px}.layadmin-pagetabs .layui-tab-title li .layui-tab-close{position:absolute;right:8px;top:50%;margin:-7px 0 0;width:16px;height:16px;line-height:16px;border-radius:50%;font-size:12px}.layadmin-pagetabs .layui-tab-title li:after{content:'';position:absolute;top:0;left:0;width:0;height:2px;border-radius:0;background-color:#292B34;transition:all .3s;-webkit-transition:all .3s}.layadmin-pagetabs .layui-tab-title li:hover:after{width:100%}.layadmin-pagetabs .layui-tab-title li.layui-this,.layadmin-pagetabs .layui-tab-title li:hover{background-color:#f6f6f6}.layadmin-pagetabs .layui-tab-title li.layui-this:after{width:100%;border:none;height:2px;background-color:#292B34}.layadmin-tabspage-none .layui-layout-admin .layui-header{border-bottom:none;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layadmin-tabspage-none .layui-layout-admin .layui-body{top:50px}.layadmin-tabspage-none .layadmin-header{display:block}.layadmin-tabspage-none .layadmin-header .layui-breadcrumb{border-top:1px solid #f6f6f6}.layui-layout-admin .layui-header{border-bottom:1px solid #f6f6f6;box-sizing:border-box;background-color:#fff}.layui-layout-admin .layui-header a,.layui-layout-admin .layui-header a cite{color:#333}.layui-layout-admin .layui-header a:hover{color:#000}.layui-layout-admin .layui-header .layui-nav .layui-nav-more{border-top-color:#666}.layui-layout-admin .layui-header .layui-nav .layui-nav-mored{border-color:transparent transparent #666}.layui-layout-admin .layui-header .layui-nav .layui-this:after,.layui-layout-admin .layui-header .layui-nav-bar{height:2px;background-color:#20222A}.layui-layout-admin .layui-logo{background-color:#20222A;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layui-layout-admin .layui-logo,.layui-layout-admin .layui-logo a{color:#fff;color:rgba(255,255,255,.8)}.layui-side-menu{box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layui-layout-admin .layui-footer{padding:10px 0;text-align:center;box-shadow:0 -1px 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-side,.layui-side-menu{background-color:#20222A;color:#fff}.layadmin-setTheme-header,.layui-layout-admin .layui-footer{background-color:#fff}.layui-tab-admin .layui-tab-title{background-color:#393D49;color:#fff}.layui-fluid{padding:15px}.layadmin-header{display:none;height:50px;line-height:50px;margin-bottom:0;border-radius:0}.layadmin-header .layui-breadcrumb{padding:0 15px}.layui-card-header{position:relative}.layui-card-header .layui-icon{line-height:initial;position:absolute;right:15px;top:50%;margin-top:-7px}.layadmin-iframe{position:absolute;width:100%;height:100%;left:0;top:0;right:0;bottom:0}.layadmin-carousel{height:185px;background-color:#fff}.layadmin-carousel .layui-carousel-ind li{background-color:#e2e2e2}.layadmin-carousel .layui-carousel-ind li:hover{background-color:#c2c2c2}.layadmin-carousel .layui-carousel-ind li.layui-this{background-color:#999}.layadmin-carousel .layui-carousel,.layadmin-carousel>[carousel-item]>*{background-color:#fff}.layadmin-carousel .layui-col-space10{margin:0}.layadmin-carousel .layui-carousel-ind{position:absolute;top:-41px;text-align:right}.layadmin-carousel .layui-carousel-ind ul{background:0 0}.layui-card .layui-tab-brief .layui-tab-title{height:42px;border-bottom-color:#f6f6f6}.layui-card .layui-tab-brief .layui-tab-title li{margin:0 15px;padding:0;line-height:42px}.layui-card .layui-tab-brief .layui-tab-title li.layui-this{color:#333}.layui-card .layui-tab-brief .layui-tab-title .layui-this:after{height:43px}.layui-card .layui-tab-brief .layui-tab-content{padding:15px}.layui-card .layui-table-view{margin:0}.layadmin-shortcut li{text-align:center}.layadmin-shortcut li .layui-icon{display:inline-block;width:100%;height:60px;line-height:60px;text-align:center;border-radius:2px;font-size:30px;background-color:#F8F8F8;color:#333;transition:all .3s;-webkit-transition:all .3s}.layadmin-shortcut li cite{position:relative;top:2px;display:block;color:#666;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:14px}.layadmin-shortcut li:hover .layui-icon{background-color:#f2f2f2}.layadmin-backlog .layadmin-backlog-body{display:block;padding:10px 15px;background-color:#f8f8f8;color:#999;border-radius:2px;transition:all .3s;-webkit-transition:all .3s}.layadmin-backlog-body h3{padding-bottom:10px;font-size:12px}.layadmin-backlog-body p cite{font-style:normal;font-size:30px;font-weight:300;color:#009688}.layadmin-backlog-body:hover{background-color:#f2f2f2;color:#888}.layadmin-version .layui-table{padding:6px 0}.layadmin-version .layui-table td,.layadmin-version .layui-table th{line-height:25px}.layadmin-dataview{height:332px!important}.layadmin-dataview>[carousel-item]:before{display:none}.layadmin-dataview>[carousel-item]>div{height:332px}.layadmin-takerates{padding-top:5px}.layadmin-takerates .layui-progress{margin:50px 0 60px}.layadmin-takerates .layui-progress:last-child{margin-bottom:10px}.layadmin-takerates .layui-progress h3{position:absolute;right:0;top:-35px;color:#999;font-size:14px}.layadmin-takerates .layui-progress-bar{text-align:left}.layadmin-takerates .layui-progress-text{top:-35px;line-height:26px;font-size:26px}.layadmin-news{height:60px!important;padding:5px 0}.layadmin-news a{display:block;line-height:60px;text-align:center}.layadmin-news .layui-carousel-ind{height:45px}.layadmin-list li{margin-bottom:6px;padding-bottom:6px;border-bottom-color:#f6f6f6;list-style-position:inside;list-style-type:disc;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layadmin-list li a{color:#666}.layadmin-list li a:hover{color:#009688}.layadmin-list li:last-child{border:none;padding:0;margin:0}.layadmin-text p{margin-bottom:10px;text-indent:2em}.layadmin-text p:last-child{margin:0}.layadmin-font-em{font-size:13px;color:#758697}.layui-card-header .layui-a-tips{position:absolute;right:15px;color:#01AAED}.layuiadmin-card-text{background-color:#f8f8f8;color:#777;padding:24px}.layuiadmin-card-text .layui-text-top{padding-bottom:10px}.layuiadmin-card-text .layui-text-top i{margin-right:10px;font-size:24px;color:#009688}.layuiadmin-card-text .layui-text-top a{line-height:24px;font-size:16px;vertical-align:top}.layuiadmin-card-text .layui-text-center{height:44px;line-height:22px;margin-bottom:10px;overflow:hidden}.layuiadmin-card-text .layui-text-bottom{position:relative}.layuiadmin-card-text .layui-text-bottom a{color:#777;font-size:12px;text-overflow:ellipsis;word-break:break-all}.layuiadmin-card-text .layui-text-bottom span{color:#CCC;font-size:12px;position:absolute;right:0}.layuiadmin-badge,.layuiadmin-btn-group,.layuiadmin-span-color{position:absolute;right:15px}.layuiadmin-card-link a:hover,.layuiadmin-card-team li a:hover,.layuiadmin-card-text a:hover{color:#01AAED;transition:all .3s}.layuiadmin-card-status{padding:0 10px 10px}.layuiadmin-card-status dd{padding:15px 0;border-bottom:1px solid #EEE;display:-webkit-flex;display:flex}.layuiadmin-card-status dd:last-child{border:none}.layuiadmin-card-status dd div.layui-status-img,.layuiadmin-card-team .layui-team-img{width:32px;height:32px;border-radius:50%;background-color:#009688;margin-right:15px}.layuiadmin-card-status dd div.layui-status-img a{width:100%;height:100%;display:inline-block;text-align:center;line-height:32px}.layuiadmin-card-status dd div.layui-status-img img,.layuiadmin-card-team .layui-team-img img{width:50%;height:50%}.layuiadmin-card-status dd div a{color:#01AAED}.layuiadmin-card-status dd div span{color:#BBB}.layuiadmin-card-link{padding-left:10px;font-size:0}.layuiadmin-card-link a{display:inline-block;width:25%;color:#666;font-size:14px;margin-bottom:12px}.layuiadmin-card-link button{vertical-align:top}.layuiadmin-card-link button:hover{color:#009688}.layuiadmin-card-team li{padding:10px 0 10px 10px}.layuiadmin-card-team .layui-team-img{display:inline-block;margin-right:8px;width:24px;height:24px;text-align:center;line-height:24px}.layuiadmin-card-team span{color:#777}.layuiadmin-badge{top:50%;margin-top:-9px;color:#01AAED}.layuiadmin-card-list{padding:15px}.layuiadmin-card-list p.layuiadmin-big-font{font-size:36px;color:#666;line-height:36px;padding:5px 0 10px;overflow:hidden;text-overflow:ellipsis;word-break:break-all;white-space:nowrap}.layuiadmin-card-list p.layuiadmin-normal-font{padding-bottom:10px;font-size:20px;color:#666;line-height:24px}.layuiadmin-span-color{font-size:14px}.layuiadmin-span-color i{padding-left:5px}.layuiadmin-card-status li{position:relative;padding:10px 0;border-bottom:1px solid #EEE}.layuiadmin-card-status li h3{padding-bottom:5px;font-weight:700}.layuiadmin-card-status li p{padding-bottom:10px}.layuiadmin-card-status li>span{color:#999}.layuiadmin-home2-usernote .layuiadmin-reply{display:none;position:absolute;right:0;bottom:12px}.layuiadmin-home2-usernote li:hover .layuiadmin-reply{display:block}.layuiadmin-page-table td span{color:#2F4056}.layuiadmin-page-table td span.first{color:#FF5722}.layuiadmin-page-table td span.second{color:#FFB800}.layuiadmin-page-table td span.third{color:#5FB878}.layuiAdmin-msg-detail h1{font-size:16px}.layuiAdmin-msg-detail .layui-card-header{height:auto;line-height:30px;padding:15px}.layuiAdmin-msg-detail .layui-card-header span{padding:0 5px;color:#999}.layuiAdmin-msg-detail .layui-card-header span:first-child{padding-left:0}.layuiAdmin-msg-detail .layui-card-body{padding:15px}.layuiadmin-content-bread{padding-bottom:20px}.layuiadmin-order-progress{position:relative;top:12px}.layui-card-header.layuiadmin-card-header-auto{padding-top:15px;padding-bottom:15px;height:auto}.layuiadmin-card-header-auto i.layuiadmin-button-btn{position:relative;right:0;top:0;vertical-align:middle}.layuiadmin-card-header-auto .layui-form-item:last-child{margin-bottom:0}.layadmin-setTheme{padding:15px;overflow-x:hidden}.layadmin-setTheme>h5{padding:20px 0 10px;color:#000}.layadmin-setTheme>h5:first-child{padding-top:0}.layadmin-setTheme-color{width:330px;font-size:0}.layadmin-setTheme-color li{position:relative;display:inline-block;vertical-align:top;width:80px;height:50px;margin:0 15px 15px 0;background-color:#f2f2f2;cursor:pointer;font-size:12px;color:#666}.layadmin-setTheme-color li:after{content:'';position:absolute;z-index:20;top:50%;left:50%;width:1px;height:0;border:1px solid #f2f2f2;transition:all .3s;-webkit-transition:all .3s;opacity:0}.layadmin-setTheme-color li.layui-this:after,.layadmin-setTheme-color li:hover:after{width:100%;height:100%;padding:4px;top:-5px;left:-5px;border-color:#5FB878;opacity:1}.layadmin-setTheme-header{position:relative;z-index:10;height:10px;border-top:1px solid #f2f2f2;border-right:1px solid #f2f2f2}.layadmin-setTheme-side{position:absolute;left:0;top:0;width:20px;height:100%;z-index:11;box-shadow:1px 0 2px 0 rgba(0,0,0,.05)}.layadmin-setTheme-logo{position:absolute;left:0;top:0;width:100%;height:10px;box-shadow:0 1px 2px 0 rgba(0,0,0,.15)}.layadmin-form-right{text-align:right}.layadmin-about p{margin-bottom:10px}.layadmin-menu-list .layui-card-header{height:50px;line-height:50px;font-size:16px}.layadmin-menu-list .layui-card-header:active{background-color:#f2f2f2}.layadmin-menu-list .layui-card-header .layui-icon{position:relative;top:1px;left:0;display:inline-block;margin:0 10px;font-size:18px}@-webkit-keyframes layui-rl{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@keyframes layui-rl{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}.layui-anim-rl{-webkit-animation-name:layui-rl;animation-name:layui-rl}@-webkit-keyframes layui-lr{from{-webkit-transform:translate3d(0 0,0);opacity:1}to{-webkit-transform:translate3d(100%,0,0);opacity:1}}@keyframes layui-lr{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layui-anim-lr,.layui-anim-rl.layer-anim-close{-webkit-animation-name:layui-lr;animation-name:layui-lr}.layadmin-tips{margin-top:30px;text-align:center}.layadmin-tips .layui-icon[face]{display:inline-block;font-size:300px;color:#393D49}.layadmin-tips .layui-text{width:500px;margin:30px auto;padding-top:20px;border-top:5px solid #009688;font-size:16px}.layadmin-tips h1{font-size:100px;line-height:100px;color:#009688}.layadmin-tips .layui-text .layui-anim{display:inline-block}@media screen and (max-width:768px){.layadmin-panel-selection{margin:0;width:auto}.layui-body .layui-nav .layui-nav-item{display:block}.layui-layout-admin .layui-body .layadmin-tabsbody-item{-webkit-overflow-scrolling:touch;overflow:auto}} \ No newline at end of file diff --git a/svr/static/layui/font-ext/demo_index.html b/svr/static/layui/font-ext/demo_index.html index bd02e22..884fe69 100644 --- a/svr/static/layui/font-ext/demo_index.html +++ b/svr/static/layui/font-ext/demo_index.html @@ -54,6 +54,144 @@

"].join("")),c=l.find("."+o),g=function(){a.scrollTop()>=t.showHeight?e||(c.show(),e=1):e&&(c.hide(),e=0)};u("."+n)[0]||("object"==typeof t.css&&l.css(t.css),r.append(l),g(),l.find("li").on("click",function(){var e=u(this).attr("lay-type");"top"===e&&u("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,e)}),a.on("scroll",function(){clearTimeout(i),i=setTimeout(function(){g()},100)}))},countdown:function(e,t,i){var n=this,o="function"==typeof t,a=new Date(e).getTime(),r=new Date(!t||o?(new Date).getTime():t).getTime(),a=a-r,l=[Math.floor(a/864e5),Math.floor(a/36e5)%24,Math.floor(a/6e4)%60,Math.floor(a/1e3)%60],o=(o&&(i=t),setTimeout(function(){n.countdown(e,r+1e3,i)},1e3));return i&&i(0]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},unescape:function(e){return e!==undefined&&null!==e||(e=""),(e+="").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/g,"'").replace(/\"/g,'"')},toVisibleArea:function(e){var t,i,n,o,a,r,l,c;(e=u.extend({margin:160,duration:200,type:"y"},e)).scrollElem[0]&&e.thisElem[0]&&(t=e.scrollElem,l=e.thisElem,n=(a="y"===e.type)?"top":"left",o=t[i=a?"scrollTop":"scrollLeft"](),a=t[a?"height":"width"](),r=t.offset()[n],c={},(l=l.offset()[n]-r)>a-e.margin||l."+y,k=function(e){var i=this;i.index=++c.index,i.config=s.extend({},i.config,c.config,e),i.init()};k.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300},k.prototype.reload=function(e){var i=this;i.config=s.extend({},i.config,e),i.init(!0)},k.prototype.init=function(e){var i=this,t=i.config,n=t.elem=s(t.elem);return 1",(t="href"in i?''+l+"":l,n?'
'+t+("parent"===o?'':"group"===o&&u.isAllowSpread?'':"")+"
":'
'+t+"
"),""].join(""))).data("item",i),n&&(a=s('
'),t=s("
    "),"parent"===o?(a.append(d(t,i.child)),l.append(a)):l.append(d(t,i.child))),r.append(l))}),r},t=['
    ',"
    "].join("");!(e="contextmenu"!==u.trigger&&!lay.isTopElem(u.elem[0])?e:!0)&&u.elem.data(r+"_opened")||(n.elemView=s(t),n.elemView.append(u.content||(e=s('
      '),0no menu'),e)),u.className&&n.elemView.addClass(u.className),u.style&&n.elemView.attr("style",u.style),c.thisId=u.id,n.remove(),i.append(n.elemView),u.elem.data(r+"_opened",!0),n.position(),(p.prevElem=n.elemView).data("prevElem",u.elem),n.elemView.find(".layui-menu").on(l,function(e){layui.stope(e)}),n.elemView.find(".layui-menu li").on("click",function(e){var i=s(this),t=i.data("item")||{};t.child&&0n.width()&&(t.addClass(C),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(C),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()))}).on("mouseleave",t,function(e){var i=s(this).children("."+w);i.removeClass(C),i.css("margin-top",0)}),c.reload=function(e,i){e=p.getThis(e);return e?(e.reload(i),p.call(e)):this},c.render=function(e){e=new k(e);return p.call(e)},e(o,c)});layui.define("jquery",function(e){"use strict";var h=layui.$,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var i=this;return i.config=h.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,a,e,i)}},a="slider",c="layui-disabled",y="layui-slider-bar",g="layui-slider-wrap",b="layui-slider-wrap-btn",x="layui-slider-tips",T="layui-slider-input-txt",w="layui-slider-hover",i=function(e){var i=this;i.index=++t.index,i.config=h.extend({},i.config,t.config,e),i.render()};i.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},i.prototype.render=function(){var a,n=this,l=n.config,e=(l.step<1&&(l.step=1),l.maxl.min?i:l.min,l.value[1]=s>l.min?s:l.min,l.value[0]=l.value[0]>l.max?l.max:l.value[0],l.value[1]=l.value[1]>l.max?l.max:l.value[1],i=Math.floor((l.value[0]-l.min)/(l.max-l.min)*100),t=(s=Math.floor((l.value[1]-l.min)/(l.max-l.min)*100))-i+"%",i+="%",s+="%"):("object"==typeof l.value&&(l.value=Math.min.apply(null,l.value)),l.valuel.max&&(l.value=l.max),t=Math.floor((l.value-l.min)/(l.max-l.min)*100)+"%"),l.disabled?"#c2c2c2":l.theme),i='
      '+(l.tips?'
      ':"")+'
      '+(l.range?'
      ':"")+"
      ",t=h(l.elem),s=t.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=h(i),l.range?(n.elemTemp.find("."+g).eq(0).data("value",l.value[0]),n.elemTemp.find("."+g).eq(1).data("value",l.value[1])):n.elemTemp.find("."+g).data("value",l.value),t.html(n.elemTemp),"vertical"===l.type&&n.elemTemp.height(l.height+"px"),l.showstep){for(var r=(l.max-l.min)/l.step,o="",u=1;u<1+r;u++){var d=100*u/r;d<100&&(o+='
      ')}n.elemTemp.append(o)}l.input&&!l.range&&(e=h('
      '),t.css("position","relative"),t.append(e),t.find("."+T).children("input").val(l.value),"vertical"===l.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),l.disabled?(n.elemTemp.addClass(c),n.elemTemp.find("."+b).addClass(c)):n.slide(),n.elemTemp.find("."+b).on("mouseover",function(){var e="vertical"===l.type?l.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+g),t=("vertical"===l.type?e-h(this).parent()[0].offsetTop-i.height():h(this).parent()[0].offsetLeft)/e*100,i=h(this).parent().data("value"),e=l.setTips?l.setTips(i):i;n.elemTemp.find("."+x).html(e),clearTimeout(a),a=setTimeout(function(){"vertical"===l.type?n.elemTemp.find("."+x).css({bottom:t+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+x).css({left:t+"%",display:"inline-block"})},300)}).on("mouseout",function(){clearTimeout(a),n.elemTemp.find("."+x).css("display","none")})},i.prototype.slide=function(e,i,t){var r=this.config,o=this.elemTemp,u=function(){return"vertical"===r.type?r.height:o[0].offsetWidth},d=o.find("."+g),s=o.next(".layui-slider-input"),c=s.children("."+T).children("input").val(),m=100/((r.max-r.min)/Math.ceil(r.step)),v=function(e,i){e=100<(e=100t[1]&&t.reverse(),r.change&&r.change(r.range?t:n)},p=function(e){var i=e/u()*100/m,t=Math.round(i)*m;return t=e==u()?Math.ceil(i)*m:t},f=h(['
      u()?u():i)/u()*100/m;v(i,l),s.addClass(w),o.find("."+x).show(),e.preventDefault()},i=function(){s.removeClass(w),o.find("."+x).hide()},t=function(){i&&i(),f.remove()},h("#LAY-slider-moving")[0]||h("body").append(f),f.on("mousemove",e),f.on("mouseup",t).on("mouseleave",t)})}),o.on("click",function(e){var i,t=h("."+b);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===r.type?u()-e.clientY+h(this).offset().top:e.clientX-h(this).offset().left)<0?0:t)>u()?u():t)/u()*100/m,t=r.range?"vertical"===r.type?Math.abs(t-parseInt(h(d[0]).css("bottom")))>Math.abs(t-parseInt(h(d[1]).css("bottom")))?1:0:Math.abs(t-d[0].offsetLeft)>Math.abs(t-d[1].offsetLeft)?1:0:0,v(i,t),e.preventDefault())}),s.children(".layui-slider-input-btn").children("i").each(function(i){h(this).on("click",function(){c=s.children("."+T).children("input").val();var e=((c=1==i?c-r.stepr.max?r.max:Number(c)+r.step)-r.min)/(r.max-r.min)*100/m;v(e,0)})});var a=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)r.max?r.max:e,((this.value=e)-r.min)/(r.max-r.min)*100/m);v(e,0)};s.children("."+T).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),a.call(this))}).on("change",a)},i.prototype.events=function(){this.config},t.render=function(e){e=new i(e);return function(){var t=this,a=t.config;return{setValue:function(e,i){return a.value=e,t.slide("set",e,i||0)},config:a}}.call(e)},e(a,t)});layui.define(["jquery","lay"],function(e){"use strict";var y=layui.jquery,o=layui.lay,r=layui.device().mobile?"click":"mousedown",i={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var i=this;return i.config=y.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},n="layui-colorpicker",l=".layui-colorpicker-main",m="layui-icon-down",x="layui-icon-close",P="layui-colorpicker-trigger-span",C="layui-colorpicker-trigger-i",B="layui-colorpicker-side-slider",w="layui-colorpicker-basis",D="layui-colorpicker-alpha-bgcolor",j="layui-colorpicker-alpha-slider",E="layui-colorpicker-basis-cursor",F="layui-colorpicker-main-input",H=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),n=r-o;return i.b=r,i.s=0!=r?255*n/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/n:e.g==r?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},M=function(e){var i,o={},r=e.h,n=255*e.s/100,e=255*e.b/100;return 0==n?o.r=o.g=o.b=e:(e=r%60*((i=e)-(n=(255-n)*e/255))/60,(r=360==r?0:r)<60?(o.r=i,o.b=n,o.g=n+e):r<120?(o.g=i,o.b=n,o.r=i-e):r<180?(o.g=i,o.r=n,o.b=n+e):r<240?(o.b=i,o.r=n,o.g=i-e):r<300?(o.b=i,o.g=n,o.r=n+e):r<360?(o.r=i,o.g=n,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},f=function(e){var e=M(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return y.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},Y=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},I=y(window),t=y(document),c=function(e){this.index=++i.index,this.config=y.extend({},this.config,i.config,e),this.render()};c.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},c.prototype.render=function(){var e=this,i=e.config,o=y(['
      ',"",'','',"","","
      "].join("")),r=y(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),r.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+P)[0].style.background,e.events()},c.prototype.renderPicker=function(){var o,e=this,i=e.config,r=e.elemColorBox[0],i=e.elemPicker=y(['
      ','
      ','
      ','
      ','
      ','
      ',"
      ",'
      ','
      ',"
      ","
      ",'
      ','
      ','
      ',"
      ","
      ",i.predefine?(o=['
      '],layui.each(i.colors,function(e,i){o.push(['
      ','
      ',"
      "].join(""))}),o.push("
      "),o.join("")):"",'
      ','
      ','',"
      ",'
      ','','',"","
      "].join(""));e.elemColorBox.find("."+P)[0];y(l)[0]&&y(l).data("index")==e.index?e.removePicker(c.thisElemInd):(e.removePicker(c.thisElemInd),y("body").append(i)),c.thisElemInd=e.index,c.thisColor=r.style.background,e.position(),e.pickerEvents()},c.prototype.removePicker=function(e){this.config;return y("#layui-colorpicker"+(e||this.index)).remove(),this},c.prototype.position=function(){var e=this,i=e.config;return o.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},c.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+P)),r=i.elemPicker.find("."+F),n=o[0].style.backgroundColor;n?(e=H(Y(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o&&r.find("input").val(n),"rgba"===o&&(e=Y(n),3==(n.match(/[0-9]{1,3}/g)||[]).length?(r.find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", 1)"),i.elemPicker.find("."+j).css("left",280)):(r.find("input").val(n),o=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+j).css("left",o)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))")):(i.select(0,100,100),r.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+j).css("left",280))},c.prototype.side=function(){var n=this,l=n.config,t=n.elemColorBox.find("."+P),c=t.attr("lay-type"),a=n.elemPicker.find(".layui-colorpicker-side"),e=n.elemPicker.find("."+B),s=n.elemPicker.find("."+w),r=n.elemPicker.find("."+E),d=n.elemPicker.find("."+D),f=n.elemPicker.find("."+j),u=e[0].offsetTop/180*360,p=100-(r[0].offsetTop+3)/180*100,g=(r[0].offsetLeft+3)/260*100,h=Math.round(f[0].offsetLeft/280*100)/100,v=n.elemColorBox.find("."+C),i=n.elemPicker.find(".layui-colorpicker-pre").children("div"),b=function(e,i,o,r){n.select(e,i,o);e=M({h:e,s:i,b:o});v.addClass(m).removeClass(x),t[0].style.background="rgb("+e.r+", "+e.g+", "+e.b+")","torgb"===c&&n.elemPicker.find("."+F).find("input").val("rgb("+e.r+", "+e.g+", "+e.b+")"),"rgba"===c&&(f.css("left",280*r),n.elemPicker.find("."+F).find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", "+r+")"),t[0].style.background="rgba("+e.r+", "+e.g+", "+e.b+", "+r+")",d[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))"),l.change&&l.change(n.elemPicker.find("."+F).find("input").val())},o=y(['
      '].join("")),k=function(e){y("#LAY-colorpicker-moving")[0]||y("body").append(o),o.on("mousemove",e),o.on("mouseup",function(){o.remove()}).on("mouseleave",function(){o.remove()})};e.on("mousedown",function(e){var r=this.offsetTop,n=e.clientY;k(function(e){var i=r+(e.clientY-n),o=a[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;b(u=o,g,p,h),e.preventDefault()}),e.preventDefault()}),a.on("click",function(e){var i=e.clientY-y(this).offset().top,i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;b(u=i,g,p,h),e.preventDefault()}),r.on("mousedown",function(e){var l=this.offsetTop,t=this.offsetLeft,c=e.clientY,a=e.clientX;layui.stope(e),k(function(e){var i=l+(e.clientY-c),o=t+(e.clientX-a),r=s[0].offsetHeight-3,n=s[0].offsetWidth-3,n=((o=n<(o=o<-3?-3:o)?n:o)+3)/260*100,o=100-((i=r<(i=i<-3?-3:i)?r:i)+3)/180*100;b(u,g=n,p=o,h),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-y(this).offset().top-3+I.scrollTop(),o=e.clientX-y(this).offset().left-3+I.scrollLeft(),o=((i=i<-3?-3:i)>this.offsetHeight-3&&(i=this.offsetHeight-3),((o=(o=o<-3?-3:o)>this.offsetWidth-3?this.offsetWidth-3:o)+3)/260*100),i=100-(i+3)/180*100;b(u,g=o,p=i,h),layui.stope(e),e.preventDefault(),r.trigger(e,"mousedown")}),f.on("mousedown",function(e){var r=this.offsetLeft,n=e.clientX;k(function(e){var i=r+(e.clientX-n),o=d[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);b(u,g,p,h=o),e.preventDefault()}),e.preventDefault()}),d.on("click",function(e){var i=e.clientX-y(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);b(u,g,p,h=i),e.preventDefault()}),i.each(function(){y(this).on("click",function(){y(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=H(Y(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);u=i.h,g=i.s,p=i.b,3==(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),h=o,b(i.h,i.s,i.b,o)})})},c.prototype.select=function(e,i,o,r){var n=this,l=(n.config,f({h:e,s:100,b:100})),t=f({h:e,s:i,b:o}),e=e/360*180,o=180-o/100*180-3,i=i/100*260-3;n.elemPicker.find("."+B).css("top",e),n.elemPicker.find("."+w)[0].style.background="#"+l,n.elemPicker.find("."+E).css({top:o,left:i}),"change"!==r&&n.elemPicker.find("."+F).find("input").val("#"+t)},c.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+P),d=c.elemPicker.find("."+F+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+C).removeClass(m).addClass(x),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,r,n=d.val(),l=n,t={};-1>16,g:(65280&o)>>8,b:255&o},t=H(r),s[0].style.background=l="#"+f(t),c.elemColorBox.find("."+C).removeClass(x).addClass(m)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(l)):(c.color=n,a.done&&a.done(n),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=y(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=y(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},c.prototype.events=function(){var i=this,e=i.config,o=i.elemColorBox.find("."+P);i.elemColorBox.on("click",function(){i.renderPicker(),y(l)[0]&&(i.val(),i.side())}),e.elem[0]&&!i.elemColorBox[0].eventHandler&&(t.on(r,function(e){y(e.target).hasClass(n)||y(e.target).parents("."+n)[0]||y(e.target).hasClass(l.replace(/\./g,""))||y(e.target).parents(l)[0]||i.elemPicker&&(i.color?(e=H(Y(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+C).removeClass(m).addClass(x),o[0].style.background=i.color||"",i.removePicker())}),I.on("resize",function(){if(!i.elemPicker||!y(l)[0])return!1;i.position()}),i.elemColorBox[0].eventHandler=!0)},i.render=function(e){e=new c(e);return function(){return{config:this.config}}.call(e)},e("colorpicker",i)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),c="element",r="layui-this",y="layui-show",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,c,t,i)},i.prototype.tabAdd=function(t,i){var a,t=u(".layui-tab[lay-filter="+t+"]"),e=t.children(".layui-tab-title"),l=e.children(".layui-tab-bar"),t=t.children(".layui-tab-content"),n=""+(i.title||"unnaming")+"";return l[0]?l.before(n):e.append(n),t.append('
      '+(i.content||"")+"
      "),C.hideTabMore(!0),C.tabAuto(),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabDelete(null,t),this},i.prototype.tabChange=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabClick.call(t[0],null,null,t),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(this).index();C.tabClick.call(this,t,i,null,a)})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",i).attr("lay-percent",i),a.text(i),this},".layui-nav"),f="layui-nav-item",l="layui-nav-bar",p="layui-nav-tree",b="layui-nav-child",v="layui-nav-more",m="layui-anim layui-anim-upbit",C={tabClick:function(t,i,a,e){e=e||{};var a=a||u(this),i=i||a.parent().children("li").index(a),l=e.headerElem?a.parent():a.parents(".layui-tab").eq(0),e=e.bodyElem?u(e.bodyElem):l.children(".layui-tab-content").children(".layui-tab-item"),n=a.find("a"),n="javascript:;"!==n.attr("href")&&"_blank"===n.attr("target"),s="string"==typeof a.attr("lay-unselect"),o=l.attr("lay-filter");n||s||(a.addClass(r).siblings().removeClass(r),e.eq(i).addClass(y).siblings().removeClass(y)),layui.event.call(this,c,"tab("+o+")",{elem:l,index:i})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.index(),e=i.parents(".layui-tab").eq(0),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter");i.hasClass(r)&&(i.next()[0]?C.tabClick.call(i.next()[0],null,a+1):i.prev()[0]&&C.tabClick.call(i.prev()[0],null,a-1)),i.remove(),l.eq(a).remove(),setTimeout(function(){C.tabAuto()},50),layui.event.call(this,c,"tabDelete("+n+")",{elem:e,index:a})},tabAuto:function(){var e="layui-tab-bar",l="layui-tab-close",n=this;u(".layui-tab").each(function(){var t=u(this),i=t.children(".layui-tab-title"),a=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),a=u('');n===window&&8!=d.ie&&C.hideTabMore(!0),t.attr("lay-allowClose")&&i.find("li").each(function(){var t,i=u(this);i.find("."+l)[0]||((t=u('')).on("click",C.tabDelete),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(i.prop("scrollWidth")>i.outerWidth()+1?i.find("."+e)[0]||(i.append(a),t.attr("overflow",""),a.on("click",function(t){i[this.title?"removeClass":"addClass"]("layui-tab-more"),this.title=this.title?"":"\u6536\u7f29"})):(i.find("."+e).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.parents(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+b),n="string"==typeof e.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+r).removeClass(r),e.addClass(r)),i.hasClass(p)&&(l.removeClass(m),l[0])&&(e["none"===l.css("display")?"addClass":"removeClass"](f+"ed"),"all"===i.attr("lay-shrink"))&&e.siblings().removeClass(f+"ed"),layui.event.call(this,c,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+y)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(y)),a[n?"addClass":"removeClass"](y),i.html(n?"":""),layui.event.call(this,c,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a=i?'[lay-filter="'+i+'"]':"",i={tab:function(){C.tabAuto.call({})},nav:function(){var s={},o={},c={},r="layui-nav-title";u(h+a).each(function(t){var i=u(this),a=u(''),e=i.find("."+f);i.find("."+l)[0]||(i.append(a),(i.hasClass(p)?e.find("dd,>."+r):e).on("mouseenter",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+b);i.hasClass(p)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(m),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(y),l.find("."+v).addClass(v+"d")},300))}.call(this,a,i,t)}).on("mouseleave",function(){i.hasClass(p)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+b).removeClass(y),i.find("."+v).removeClass(v+"d")},300))}),i.on("mouseleave",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(p)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)})),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+b)[0]&&!t.children("."+v)[0]&&t.append(''),t.off("click",C.clickThis).on("click",C.clickThis)})})},breadcrumb:function(){u(".layui-breadcrumb"+a).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(){var e="layui-progress";u("."+e+a).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a),t.attr("lay-showPercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(){u(".layui-collapse"+a).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",C.collapse).on("click",C.collapse)})})}};return i[t]?i[t]():layui.each(i,function(t,i){i()})},new i),e=u(document);u(function(){a.render()});e.on("click",".layui-tab-title li",C.tabClick),e.on("click",C.hideTabMore),u(window).on("resize",C.tabAuto),t(c,a)});layui.define("layer",function(e){"use strict";var v=layui.$,t=layui.layer,r=layui.hint(),y=layui.device(),i={config:{},set:function(e){var t=this;return t.config=v.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,n,e,t)}},n="upload",o="layui-upload-file",a="layui-upload-form",F="layui-upload-iframe",b="layui-upload-choose",x=function(e){var t=this;t.config=v.extend({},t.config,i.config,e),t.render()};x.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},x.prototype.render=function(e){var t=this;(e=t.config).elem=v(e.elem),e.bindAction=v(e.bindAction),t.file(),t.events()},x.prototype.file=function(){var e=this,t=e.config,i=e.elemFile=v(['"].join("")),n=t.elem.next();(n.hasClass(o)||n.hasClass(a))&&n.remove(),y.ie&&y.ie<10&&t.elem.wrap('
      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),y.ie&&y.ie<10&&e.initIE()},x.prototype.initIE=function(){var i,e=this.config,t=v(''),n=v(['
      ',"
      "].join(""));v("#"+F)[0]||v("body").append(t),e.elem.next().hasClass(a)||(this.elemFile.wrap(n),e.elem.next("."+a).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},x.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},x.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},x.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},x.prototype.upload=function(i,e){var n,o,t,a,l=this,r=l.config,u=l.elemFile[0],c=function(){var t=0,o=0,e=i||l.files||l.chooseFiles||u.files,a=function(){r.multiple&&t+o===l.fileLength&&"function"==typeof r.allDone&&r.allDone({total:l.fileLength,successful:t,failed:o})};layui.each(e,function(i,e){var n=new FormData,e=(n.append(r.field,e),layui.each(r.data,function(e,t){t="function"==typeof t?t():t,n.append(e,t)}),{url:r.url,type:"post",data:n,contentType:!1,processData:!1,dataType:"json",headers:r.headers||{},success:function(e){t++,s(i,e),a()},error:function(e){o++,l.msg("Request URL is abnormal: "+(e.statusText||"error")),p(i),a()}});"function"==typeof r.progress&&(e.xhr=function(){var e=v.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),r.progress(t,(r.item||r.elem)[0],e,i))}),e}),v.ajax(e)})},f=function(){var n=v("#"+F);l.elemFile.parent().submit(),clearInterval(x.timer),x.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){l.msg("Cross-domain requests are not supported"),clearInterval(x.timer),p()}e&&(clearInterval(x.timer),t.html(""),s(0,e))},30)},s=function(e,t){if(l.elemFile.next("."+b).remove(),u.value="","json"===r.force&&"object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},l.msg("Please return JSON data format")}"function"==typeof r.done&&r.done(t,e||0,function(e){l.upload(e)})},p=function(e){r.auto&&(u.value=""),"function"==typeof r.error&&r.error(e||0,function(e){l.upload(e)})},d=r.exts,m=(o=[],layui.each(i||l.chooseFiles,function(e,t){o.push(t.name)}),o),h={preview:function(e){l.preview(e)},upload:function(e,t){var i={};i[e]=t,l.upload(i)},pushFile:function(){return l.files=l.files||{},layui.each(l.chooseFiles,function(e,t){l.files[e]=t}),l.files},resetFile:function(e,t,i){t=new File([t],i);l.files=l.files||{},l.files[e]=t},clearAllFile:function(){l.files={}}},g={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[r.accept]||"\u6587\u4ef6",m=0===m.length?u.value.match(/[^\/\\]+\..+/g)||[]:m;if(0!==m.length){switch(r.accept){case"file":layui.each(m,function(e,t){if(d&&!RegExp(".\\.("+d+")$","i").test(escape(t)))return n=!0});break;case"video":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return n=!0});break;case"audio":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"mp3|wav|mid")+")$","i").test(escape(t)))return n=!0});break;default:layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(t)))return n=!0})}if(n)return l.msg("\u9009\u62e9\u7684"+g+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),u.value="";if("choose"!==e&&!r.auto||(r.choose&&r.choose(h),"choose"!==e)){if(l.fileLength=(t=0,g=i||l.files||l.chooseFiles||u.files,layui.each(g,function(){t++}),t),r.number&&l.fileLength>r.number)return l.msg("\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+r.number+" \u4e2a\u6587\u4ef6
      \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+l.fileLength+" \u4e2a\u6587\u4ef6");if(01024*r.size&&(t=1<=(t=r.size/1024)?t.toFixed(2)+"MB":r.size+"KB",u.value="",a=t)}),a)return l.msg("\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+a);if(!r.before||!1!==r.before(h))y.ie?(9'+e+"")};o.elem.off("upload.start").on("upload.start",function(){var e=v(this),t=e.attr("lay-data");if(t)try{t=new Function("return "+t)(),n.config=v.extend({},o,t)}catch(i){r.error("Upload element property lay-data configuration item has a syntax error: "+t)}n.config.item=e,n.elemFile[0].click()}),y.ie&&y.ie<10||o.elem.off("upload.over").on("upload.over",function(){v(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){v(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=v(this),t=t.originalEvent.dataTransfer.files||[];i.removeAttr("lay-over"),a(t),o.auto?n.upload():l(t)}),n.elemFile.off("upload.change").on("upload.change",function(){var e=this.files||[];a(e),o.auto?n.upload():l(e)}),o.bindAction.off("upload.action").on("upload.action",function(){n.upload()}),o.elem.data("haveEvents")||(n.elemFile.on("change",function(){v(this).trigger("upload.change")}),o.elem.on("click",function(){n.isFile()||v(this).trigger("upload.start")}),o.drag&&o.elem.on("dragover",function(e){e.preventDefault(),v(this).trigger("upload.over")}).on("dragleave",function(e){v(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),v(this).trigger("upload.drop",e)}),o.bindAction.on("click",function(){v(this).trigger("upload.action")}),o.elem.data("haveEvents",!0))},i.render=function(e){e=new x(e);return function(){var t=this;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}}.call(e)},e(n,i)});layui.define("layer",function(e){"use strict";var C=layui.$,h=layui.layer,l=layui.hint(),w=(layui.device(),"form"),s=".layui-form",T="layui-this",$="layui-hide",E="layui-disabled",t=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}},i=(t.prototype.set=function(e){return C.extend(!0,this.config,e),this},t.prototype.verify=function(e){return C.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return C(s+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,w,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=C(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.value==t&&(this.checked=!0)}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;C(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^checkbox|radio$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var i=this.config,a=C(s+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){e=e||a.find("input,textarea");i.autocomplete&&e.attr("autocomplete",i.autocomplete)},select:function(e){var p,c="\u8bf7\u9009\u62e9",m="layui-form-select",g="layui-select-title",k="layui-select-none",x="",e=e||a.find("select"),b=function(e,t){C(e.target).parent().hasClass(g)&&!t||(C("."+m).removeClass(m+"ed "+m+"up"),p&&x&&p.val(x)),p=null},u=function(a,e,t){var o,r,i,n,s,l,c=C(this),u=a.find("."+g),d=u.find("input"),f=a.find("dl"),h=f.children("dd"),y=f.children("dt"),v=this.selectedIndex;e||(r=c.attr("lay-search"),i=function(){var e=a.offset().top+a.outerHeight()+5-q.scrollTop(),t=f.outerHeight();v=c[0].selectedIndex,a.addClass(m+"ed"),h.removeClass($),y.removeClass($),o=null,h.eq(v).addClass(T).siblings().removeClass(T),e+t>q.height()&&t<=e&&a.addClass(m+"up"),s()},n=function(e){a.removeClass(m+"ed "+m+"up"),d.blur(),o=null,e||l(d.val(),function(e){var t=c[0].selectedIndex;e&&(x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),d.val(x||""))})},s=function(){var e,t,i=f.children("dd."+T);i[0]&&(e=i.position().top,t=f.height(),i=i.height(),t\u65e0\u5339\u914d\u9879

      '):f.find("."+k).remove()},"keyup"),""===t&&f.find("."+k).remove(),s()}).on("blur",function(e){var t=c[0].selectedIndex;p=d,x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),setTimeout(function(){l(d.val(),function(e){x||d.val("")},"blur")},200)}),h.on("click",function(){var e=C(this),t=e.attr("lay-value"),i=c.attr("lay-filter");return e.hasClass(E)||(e.hasClass("layui-select-tips")?d.val(""):(d.val(e.text()),e.addClass(T)),e.siblings().removeClass(T),c.val(t).removeClass("layui-form-danger"),layui.event.call(this,w,"select("+i+")",{elem:c[0],value:t,othis:a}),n(!0)),!1}),a.find("dl>dt").on("click",function(e){return!1}),C(document).off("click",b).on("click",b))};e.each(function(e,t){var i=C(this),a=i.next("."+m),n=this.disabled,l=t.value,r=C(t.options[t.selectedIndex]),t=t.options[0];if("string"==typeof i.attr("lay-ignore"))return i.show();var o,s="string"==typeof i.attr("lay-search"),t=t&&!t.value&&t.innerHTML||c,r=C(['
      ','
      ','','
      ','
      ',(t=i.find("*"),o=[],layui.each(t,function(e,t){0!==e||t.value?"optgroup"===t.tagName.toLowerCase()?o.push("
      "+t.label+"
      "):o.push('
      '+C.trim(t.innerHTML)+"
      "):o.push('
      '+C.trim(t.innerHTML||c)+"
      ")}),0===o.length&&o.push('
      \u6ca1\u6709\u9009\u9879
      '),o.join("")+"
      "),"
      "].join(""));a[0]&&a.remove(),i.after(r),u.call(this,r,n,s)})},checkbox:function(e){var s={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},e=e||a.find("input[type=checkbox]");e.each(function(e,t){var i=C(this),a=i.attr("lay-skin"),n=(i.attr("lay-text")||"").split("|"),l=this.disabled,r=s[a="switch"===a?"_"+a:a]||s.checkbox;if("string"==typeof i.attr("lay-ignore"))return i.show();var o=i.next("."+r[0]),t=C(['
      ",(l={checkbox:[t.title.replace(/\s/g,"")?""+t.title+"":"",''].join(""),_switch:""+((t.checked?n[0]:n[1])||"")+""})[a]||l.checkbox,"
      "].join(""));o[0]&&o.remove(),i.after(t),function(i,a){var n=C(this);i.on("click",function(){var e=n.attr("lay-filter"),t=(n.attr("lay-text")||"").split("|");n[0].disabled||(n[0].checked?(n[0].checked=!1,i.removeClass(a[1]).find("em").text(t[1])):(n[0].checked=!0,i.addClass(a[1]).find("em").text(t[0])),layui.event.call(n[0],w,a[2]+"("+e+")",{elem:n[0],value:n[0].value,othis:i}))})}.call(this,t,r)})},radio:function(e){var r="layui-form-radio",o=["",""],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=C(this),a=i.next("."+r),n=this.disabled;if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();n=C(['
      ',''+o[t.checked?0:1]+"","
      "+(a=t.title||"",a="string"==typeof i.next().attr("lay-radio")?i.next().html():a)+"
      ","
      "].join(""));i.after(n),function(a){var n=C(this),l="layui-anim-scaleSpring";a.on("click",function(){var e=n[0].name,t=n.parents(s),i=n.attr("lay-filter"),e=t.find("input[name="+e.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(e,function(){var e=C(this).next("."+r);this.checked=!1,e.removeClass(r+"ed"),e.find(".layui-icon").removeClass(l).html(o[1])}),n[0].checked=!0,a.addClass(r+"ed"),a.find(".layui-icon").addClass(l).html(o[0]),layui.event.call(n[0],w,"radio("+i+")",{elem:n[0],value:n[0].value,othis:a}))})}.call(this,n)})}};return"object"===layui.type(e)?e.each(function(e,t){var i=C(t);i.closest(s).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(n,function(e,t){t()}),this},t.prototype.validate=function(e){var u=null,d=r.config.verify,f="layui-form-danger";return!(e=C(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=C(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-verType"),c=o.val();if(o.removeClass(f),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqText")||i),n)return"tips"===s?h.tips(i,"string"!=typeof o.attr("lay-ignore")&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(f),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=C(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(s).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,w,"submit("+e+")",l))}),r=new t,t=C(document),q=C(window);C(function(){r.render()}),t.on("reset",s,function(){var e=C(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",s,i).on("click","*[lay-submit]",i),e(w,r)});layui.define(["laytpl","laypage","form","util"],function(e){"use strict";var m=layui.$,v=layui.laytpl,d=layui.laypage,g=layui.layer,y=layui.form,h=layui.util,f=layui.hint(),p=layui.device(),b={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var t=this;return t.config=m.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,C,e,t)}},x=function(){var a=this,e=a.config,i=e.id||e.index;return i&&(x.that[i]=a,x.config[i]=e),{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){b.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},l=function(e){var t=x.config[e];return t||f.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},k=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content,t=(t.escape&&(i=h.escape(i)),e.text&&a.exportTemplet||a.templet||a.toolbar);return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):v(m(t).html()||String(i)).render(e.tplData)),e.text?m("
      "+i+"
      ").text():i},C="table",w="layui-hide",r="layui-hide-v",c="layui-none",s="layui-table-view",u=".layui-table-header",T=".layui-table-body",N=".layui-table-pageview",L=".layui-table-sort",D="layui-table-edit",E="layui-table-hover",A="layui-table-col-special",j="LAY_TABLE_MOVE_DICT",t=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
      ','
      ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
      ","
      "].join("")},a=['',"","
      "].join(""),R=[,"{{# if(d.data.toolbar){ }}",'
      ','
      ','
      ',"
      ","{{# } }}",'
      ',"{{# if(d.data.loading){ }}",'
      ','',"
      ","{{# } }}","{{# var left, right; }}",'
      ',t(),"
      ",'
      ',a,"
      ","{{# if(left){ }}",'
      ','
      ',t({fixed:!0}),"
      ",'
      ',a,"
      ","
      ","{{# }; }}","{{# if(right){ }}",'
      ','
      ',t({fixed:"right"}),'
      ',"
      ",'
      ',a,"
      ","
      ","{{# }; }}","
      ","{{# if(d.data.totalRow){ }}",'
      ','','',"
      ","
      ","{{# } }}",'
      ','
      ',"
      ",""].join(""),_=m(window),S=m(document),i=function(e){this.index=++b.index,this.config=m.extend({},this.config,b.config,e),this.render()},F=(i.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,editTrigger:"click",defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"}},i.prototype.render=function(e){var t=this,a=t.config;if(a.elem=m(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||t.index,a.request=m.extend({pageName:"page",limitName:"limit"},a.request),a.response=m.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if("reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.height&&/^full-\d+$/.test(a.height)&&(t.fullHeightGap=a.height.split("-")[1],a.height=_.height()-t.fullHeightGap),t.setInit();var i,l,e=a.elem,n=e.next("."+s),o=t.elem=m("
      ");o.addClass((i=[s,s+"-"+t.index,"layui-form","layui-border-box"],a.className&&i.push(a.className),i.join(" "))).attr({"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,"lay-id":a.id,style:(i=[],a.width&&i.push("width:"+a.width+"px;"),a.height&&i.push("height:"+a.height+"px;"),i.join(""))}).html(v(R).render({data:a,index:t.index})),a.index=t.index,t.key=a.id||a.index,n[0]&&n.remove(),e.after(o),t.layTool=o.find(".layui-table-tool"),t.layBox=o.find(".layui-table-box"),t.layHeader=o.find(u),t.layMain=o.find(".layui-table-main"),t.layBody=o.find(T),t.layFixed=o.find(".layui-table-fixed"),t.layFixLeft=o.find(".layui-table-fixed-l"),t.layFixRight=o.find(".layui-table-fixed-r"),t.layTotal=o.find(".layui-table-total"),t.layPage=o.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),1
      ','
      ','
      '].join(""),a=this.layTool.find(".layui-table-tool-temp"),i=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=m(e.toolbar).html()||"")&&a.html(v(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}),l=[];"object"==typeof e.defaultToolbar&&layui.each(e.defaultToolbar,function(e,t){t="string"==typeof t?i[t]:t;t&&l.push('
      ')}),this.layTool.find(".layui-table-tool-self").html(l.join(""))},i.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=m('
      ');t.pagebar&&((e=m(t.pagebar).html()||"")&&a.append(v(e).render(t)),this.layPage.append(a))},i.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[0]][t[1]],e?l--:l++,i.attr("colspan",l),i[l<1?"addClass":"removeClass"](w),t.colspan=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},i.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},i.prototype.setColsWidth=function(){var t,a,i=this,o=i.config,l=0,d=0,r=0,c=0,s=i.setInit("width"),e=(i.eachCols(function(e,t){t.hide||l++}),s=s-("line"===o.skin||"nob"===o.skin?2:l+1)-i.getScrollWidth(i.layMain[0])-1,function(n){layui.each(o.cols,function(e,l){layui.each(l,function(e,t){var a=0,i=t.minWidth||o.cellMinWidth;t?t.colGroup||t.hide||(n?r&&r'+(e||"Error")+"
      ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(w),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(r),t.layPage.find(N).addClass(r),b.cache[t.key]=[],t.syncCheckAll()},i.prototype.page=1,i.prototype.pullData=function(t,a){var e,i=this,l=i.config,n=l.request,o=l.response,d=function(){"object"==typeof l.initSort&&i.sort(l.initSort.field,l.initSort.type)};a=a||{},"function"==typeof l.before&&l.before(l),i.startTime=(new Date).getTime(),l.url?((e={})[n.pageName]=t,e[n.limitName]=l.limit,n=m.extend(e,l.where),l.contentType&&0==l.contentType.indexOf("application/json")&&(n=JSON.stringify(n)),i.loading(),m.ajax({type:l.method||"get",url:l.url,contentType:l.contentType,data:n,dataType:l.dataType||"json",jsonpCallback:l.jsonpCallback,headers:l.headers||{},success:function(e){(e="function"==typeof l.parseData?l.parseData(e)||e:e)[o.statusName]!=o.statusCode?(i.renderForm(),i.errorView(e[o.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+o.statusName+'": '+o.statusCode)):(i.renderData({res:e,curr:t,count:e[o.countName],type:a.type}),d(),l.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof l.done&&l.done(e,t,e[o.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof l.error&&l.error(e,t)}})):"array"===layui.type(l.data)&&(e=t*l.limit-l.limit,(n={})[o.dataName]=l.data.concat().splice(e,l.limit),n[o.countName]=l.data.length,"object"==typeof l.totalRow&&(n[o.totalRowName]=m.extend({},l.totalRow)),i.renderData({res:n,curr:t,count:n[o.countName],type:a.type}),d(),i.setColsWidth(),"function"==typeof l.done)&&l.done(n,t,n[o.countName])},i.prototype.eachCols=function(e){return b.eachCols(null,e,this.config.cols),this},i.prototype.renderData=function(e){var u=this,y=u.config,t=e.res,l=e.curr,a=e.count,n=e.sort,i=t[y.response.dataName]||[],t=t[y.response.totalRowName],h=[],f=[],p=[],o=function(){var s;if(y.HAS_SET_COLS_PATCH||u.setColsPatch(),y.HAS_SET_COLS_PATCH=!0,!n&&u.sortKey)return u.sort(u.sortKey.field,u.sortKey.sort,!0);layui.each(i,function(o,d){var a=[],i=[],r=[],c=o+y.limit*(l-1)+1;"array"===layui.type(d)&&0===d.length||(n||(d[b.config.indexName]=o),u.eachCols(function(e,l){var e=l.field||e,t=y.index+"-"+l.key,n=d[e];n!==undefined&&null!==n||(n=""),l.colGroup||(t=['','
      "+function(){var e,t=m.extend(!0,{LAY_INDEX:c,LAY_COL:l},d),a=b.config.checkName,i=b.config.disabledName;switch(l.type){case"checkbox":return'";case"radio":return t[a]&&(s=o),'';case"numbers":return c}return l.toolbar?v(m(l.toolbar).html()||"").render(t):k.call(u,{item3:l,content:n,tplData:t})}(),"
      "].join(""),a.push(t),l.fixed&&"right"!==l.fixed&&i.push(t),"right"===l.fixed&&r.push(t))}),h.push(''+a.join("")+""),f.push(''+i.join("")+""),p.push(''+r.join("")+""))}),"fixed"===y.scrollPos&&"reloadData"===e.type||u.layBody.scrollTop(0),"reset"===y.scrollPos&&u.layBody.scrollLeft(0),u.layMain.find("."+c).remove(),u.layMain.find("tbody").html(h.join("")),u.layFixLeft.find("tbody").html(f.join("")),u.layFixRight.find("tbody").html(p.join("")),u.renderForm(),"number"==typeof s&&u.setThisRowChecked(s),u.syncCheckAll(),u.fullSize(),u.haveInit?u.scrollPatch():setTimeout(function(){u.scrollPatch()},50),u.haveInit=!0,g.close(u.tipsIndex)};return b.cache[u.key]=i,u.layTotal[0==i.length?"addClass":"removeClass"](r),u.layPage[y.page||y.pagebar?"removeClass":"addClass"](w),u.layPage.find(N)[!y.page||0==a||0===i.length&&1==l?"addClass":"removeClass"](r),0===i.length?(u.renderForm(),u.errorView(y.text.none)):(u.layFixLeft.removeClass(w),n?o():(o(),u.renderTotal(i,t),u.layTotal&&u.layTotal.removeClass(w),void(y.page&&(y.page=m.extend({elem:"layui-table-page"+y.index,count:a,limit:y.limit,limits:y.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(u.page=e.curr,y.limit=e.limit,u.pullData(e.curr))}},y.page),y.page.count=a,d.render(y.page)))))},i.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal={},d=[],r.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l=(a=t.totalRowText||"",n="totalRowDecimals"in t?t.totalRowDecimals:2,n=parseFloat(s[e]).toFixed(n),(l={LAY_COL:t})[e]=n,n=t.totalRow&&k.call(r,{item3:t,content:n,tplData:l})||a,i||n),n=['','
      "+("string"==typeof(a=t.totalRow||c.totalRow)?v(a).render(m.extend({TOTAL_NUMS:i||s[e],LAY_COL:t},t)):l),"
      "].join("");t.field&&(r.dataTotal[e]=l),d.push(n)}),r.layTotal.find("tbody").html(""+d.join("")+""))},i.prototype.getColElem=function(e,t){var a=this.config;return e.eq(0).find(".laytable-cell-"+a.index+"-"+t+":eq(0)")},i.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");y.render(e,t)},i.prototype.setThisRowChecked=function(e){this.config;var t="layui-table-click";this.layBody.find('tr[data-index="'+e+'"]').addClass(t).siblings("tr").removeClass(t)},i.prototype.sort=function(l,e,t,a){var i,n=this,o={},d=n.config,r=d.elem.attr("lay-filter"),c=b.cache[n.key];"string"==typeof l&&(s=l,n.layHeader.find("th").each(function(e,t){var a=m(this),i=a.data("field");if(i===l)return l=a,s=i,!1}));try{var s=s||l.data("field"),u=l.data("key");if(n.sortKey&&!t&&s===n.sortKey.field&&e===n.sortKey.sort)return;var y=n.layHeader.find("th .laytable-cell-"+u).find(L);n.layHeader.find("th").find(L).removeAttr("lay-sort"),y.attr("lay-sort",e||null),n.layFixed.find("th")}catch(h){f.error("Table modules: sort field '"+s+"' not matched")}n.sortKey={field:s,sort:e},d.autoSort&&("asc"===e?i=layui.sort(c,s):"desc"===e?i=layui.sort(c,s,!0):(i=layui.sort(c,b.config.indexName),delete n.sortKey,delete d.initSort)),o[d.response.dataName]=i||c,n.renderData({res:o,curr:n.page,count:n.count,sort:!0}),a&&(d.initSort={field:s,type:e},layui.event.call(l,C,"sort("+r+")",d.initSort))},i.prototype.loading=function(e){var t=this;t.config.loading&&(e?(t.layInit&&t.layInit.remove(),delete t.layInit,t.layBox.find(".layui-table-init").remove()):(t.layInit=m(['
      ','',"
      "].join("")),t.layBox.append(t.layInit)))},i.prototype.setCheckData=function(e,t){var a=this.config,i=b.cache[this.key];i[e]&&"array"!==layui.type(i[e])&&(i[e][a.checkName]=t)},i.prototype.syncCheckAll=function(){var e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(a){return e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),a};t[0]&&(b.checkStatus(e.key).isAll?(t[0].checked||(t.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(t[0].checked&&(t.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},i.prototype.getCssRule=function(a,i){var e=this.elem.find("style")[0],e=e.sheet||e.styleSheet||{},e=e.cssRules||e.rules;layui.each(e,function(e,t){if(t.selectorText===".laytable-cell-"+a)return i(t),!0})},i.prototype.fullSize=function(){var e=this,t=e.config,a=t.height;e.fullHeightGap&&(a=_.height()-e.fullHeightGap,e.elem.css("height",a=a<135?135:a)),a&&(a=parseFloat(a)-(e.layHeader.outerHeight()||38),t.toolbar&&(a-=e.layTool.outerHeight()||50),t.totalRow&&(a-=e.layTotal.outerHeight()||40),(t.page||t.pagebar)&&(a-=e.layPage.outerHeight()||43),e.layMain.outerHeight(a))},i.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:((e=document.createElement("div")).style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},i.prototype.scrollPatch=function(){var e=this,t=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),i=e.layMain.height()-e.layMain.prop("clientHeight"),l=(e.getScrollWidth(e.layMain[0]),t.outerWidth()-e.layMain.width()),n=function(e){var t;a&&i?(e=e.eq(0)).find(".layui-table-patch")[0]||((t=m('
      ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(T).css("height",t.height()>=n?n:"auto"),e.layFixRight[0');a.html(t),r.height&&a.css("max-height",r.height-(s.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(a),s.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};switch(layui.stope(e),S.trigger("table.tool.panel.remove"),g.close(s.tipsIndex),t){case"LAYTABLE_COLS":l({list:(a=[],s.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
    • ')}),a.join("")),done:function(){y.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=m(e.elem),i=this.checked,l=e.data("key"),n=e.data("parentkey");layui.each(r.cols,function(a,e){layui.each(e,function(e,t){a+"-"+e===l&&(e=t.hide,t.hide=!i,s.elem.find('*[data-key="'+r.index+"-"+l+'"]')[i?"removeClass":"addClass"](w),e!=t.hide&&s.setParentCol(!i,n),s.resize())})})})}});break;case"LAYTABLE_EXPORT":p.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):l({list:['
    • \u5bfc\u51fa csv \u683c\u5f0f\u6587\u4ef6
    • ','
    • \u5bfc\u51fa xls \u683c\u5f0f\u6587\u4ef6
    • '].join(""),done:function(e,t){t.on("click",function(){var e=m(this).data("type");b.exportFile.call(s,r.id,null,e)})}});break;case"LAYTABLE_PRINT":var n=window.open("about:blank","_blank"),o=[""].join(""),d=m(s.layHeader.html());d.append(s.layMain.find("table").html()),d.append(s.layTotal.find("table").html()),d.find("th.layui-table-patch").remove(),d.find("thead>tr>th."+A).filter(function(e,t){return!m(t).children(".laytable-cell-group").length}).remove(),d.find("tbody>tr>td."+A).remove(),n.document.write(o+d.prop("outerHTML")),n.document.close(),n.print(),n.close()}layui.event.call(this,C,"toolbar("+c+")",m.extend({event:t,config:r},{}))}),s.layPagebar.on("click","*[lay-event]",function(e){var t=m(this).attr("lay-event");layui.event.call(this,C,"pagebar("+c+")",m.extend({event:t,config:r},{}))}),e.on("mousemove",function(e){var t=m(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||x.eventMoveElem||(l.allowResize=t.width()-e<=10,i.css("cursor",l.allowResize?"col-resize":""))}).on("mouseleave",function(){m(this);x.eventMoveElem||i.css("cursor","")}).on("mousedown",function(e){var t,a=m(this);l.allowResize&&(t=a.data("key"),e.preventDefault(),l.offset=[e.clientX,e.clientY],s.getCssRule(t,function(e){var t=e.style.width||a.outerWidth();l.rule=e,l.ruleWidth=parseFloat(t),l.minWidth=a.data("minwidth")||r.cellMinWidth}),a.data(j,l),x.eventMoveElem=a)}),x.docEvent||S.on("mousemove",function(e){var t;x.eventMoveElem&&(t=x.eventMoveElem.data(j)||{},x.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&((e=t.ruleWidth+e.clientX-t.offset[0])':''))[0].value=t.data("content")||i.text(),t.find("."+D)[0]||t.append(a),a.focus(),layui.stope(e))}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=m(this),a=t.children(u);t.data("off")||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.outerWidth()||0
      '))},d=(s.layBody.on("click","."+o,function(e){var t=m(this).parent().children(u);s.tipsIndex=g.tips(['
      ',t.html(),"
      ",''].join(""),t[0],{tips:[3,""],time:-1,anim:-1,maxWidth:p.ios||p.android?300:s.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}),layui.stope(e)}),function(e){var t=m(this),a=t.parents("tr").eq(0).data("index");layui.event.call(this,C,(e||"tool")+"("+c+")",n.call(this,{event:t.attr("lay-event")})),s.setThisRowChecked(a)});s.layBody.on("click","*[lay-event]",function(){return d.call(this),!1}).on("dblclick","*[lay-event]",function(){return d.call(this,"toolDouble"),!1}),s.layMain.on("scroll",function(){var e=m(this),t=e.scrollLeft(),e=e.scrollTop();s.layHeader.scrollLeft(t),s.layTotal.scrollLeft(t),s.layFixed.find(T).scrollTop(e),g.close(s.tipsIndex)}),_.on("resize",function(){s.resize()})},S.on("click",function(){S.trigger("table.remove.tool.panel")}),S.on("table.remove.tool.panel",function(){m(".layui-table-tool-panel").remove()}),b.init=function(a,i){i=i||{};var e=m(a?'table[lay-filter="'+a+'"]':".layui-table[lay-data]"),d="Table element property lay-data configuration item has a syntax error: ";return e.each(function(){var e=m(this),t=e.attr("lay-data");try{t=new Function("return "+t)()}catch(l){f.error(d+t,"error")}var n=[],o=m.extend({elem:this,cols:[],data:[],skin:e.attr("lay-skin"),size:e.attr("lay-size"),even:"string"==typeof e.attr("lay-even")},b.config,i,t);a&&e.hide(),e.find("thead>tr").each(function(i){o.cols[i]=[],m(this).children().each(function(e){var t=m(this),a=t.attr("lay-data");try{a=new Function("return "+a)()}catch(l){return f.error(d+a)}t=m.extend({title:t.text(),colspan:t.attr("colspan")||1,rowspan:t.attr("rowspan")||1},a);t.colspan<2&&n.push(t),o.cols[i].push(t)})}),e.find("tbody>tr").each(function(e){var a=m(this),l={};a.children("td").each(function(e,t){var a=m(this),i=a.data("field");if(i)return l[i]=a.html()}),layui.each(n,function(e,t){e=a.children("td").eq(e);l[t.field]=e.html()}),o.data[e]=l}),b.render(o)}),this},x.that={},x.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),F(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=t.hide?0:parseInt(1td'),a!==undefined&&null!==a||(a=""),0==l&&d.push(t.title||""),o.push('"'+k.call(c,{item3:t,content:a,tplData:n,text:"text",obj:c.commonMember.call(i.eq(0),{td:function(e){return i.filter('[data-field="'+e+'"]')}})})+'"')))}),i.push(o.join(","))}),c&&layui.each(c.dataTotal,function(e,t){r[e]||l.push(t)}),d.join(",")+"\r\n"+i.join("\r\n")+"\r\n"+l.join(","))),u.download=(a.title||o.title||"table_"+(o.index||""))+"."+n,document.body.appendChild(u),u.click(),document.body.removeChild(u)},b.resize=function(e){e?l(e)&&x.that[e].resize():layui.each(x.that,function(){this.resize()})},b.reload=function(e,t,a,i){if(l(e))return(e=x.that[e]).reload(t,a,i),x.call(e)},b.reloadData=function(){var a=m.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["data","url","method","contentType","dataType","jsonpCallback","headers","where","page","limit","request","response","parseData","scrollPos"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)||delete a[1][e]}),b.reload.apply(null,a)},b.render=function(e){e=new i(e);return x.call(e)},b.clearCacheKey=function(e){return delete(e=m.extend({},e))[b.config.checkName],delete e[b.config.indexName],delete e[b.config.disabledName],e},m(function(){b.init()}),e(C,b)});layui.define("form",function(e){"use strict";var u=layui.$,i=layui.form,p=layui.layer,n="tree",a={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var i=this;return i.config=u.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,n,e,i)}},t=function(){var i=this,e=i.config,n=e.id||i.index;return t.that[n]=i,{config:t.config[n]=e,reload:function(e){i.reload.call(i,e)},getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}},y="layui-hide",o="layui-disabled",f="layui-tree-set",C="layui-tree-iconClick",k="layui-icon-addition",v="layui-icon-subtraction",m="layui-tree-entry",x="layui-tree-main",b="layui-tree-txt",g="layui-tree-pack",w="layui-tree-spread",N="layui-tree-setLineShort",T="layui-tree-showLine",L="layui-tree-lineExtend",l=function(e){var i=this;i.index=++a.index,i.config=u.extend({},i.config,a.config,e),i.render()};l.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},l.prototype.reload=function(e){var n=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete n.config[e]}),n.config=u.extend(!0,{},n.config,e),n.render()},l.prototype.render=function(){var e=this,i=e.config,n=(e.checkids=[],u('
      ')),a=(e.tree(n),i.elem=u(i.elem));if(a[0]){if(e.key=i.id||e.index,e.elem=n,e.elemNone=u('
      '+i.text.none+"
      "),a.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=u(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(N),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(N)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(c,e){var d=this,s=d.config,e=e||s.data;layui.each(e,function(e,i){var n,a,t=i.children&&0"),r=u(['
      ','
      ','
      ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i.title||i.label||s.text.defaultNodeName)+"":''+(i.title||i.label||s.text.defaultNodeName)+"","
      ",s.edit?(n={add:'',update:'',del:''},a=['
      '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){a.push(n[i]||"")}),a.join("")+"
      "):void 0):"","
      "].join(""));t&&(r.append(l),d.tree(l,i.children)),c.append(r),r.prev("."+f)[0]&&r.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||r.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(r,i),s.showCheckbox&&(i.checked&&d.checkids.push(i.id),d.checkClick(r,i)),s.edit&&d.operate(r,i)})},l.prototype.spread=function(a,e){var t=this.config,i=a.children("."+m),n=i.children("."+x),l=i.find("."+C),i=i.find("."+b),r=t.onlyIconControl?l:n,c="";r.on("click",function(e){var i=a.children("."+g),n=(r.children(".layui-icon")[0]?r:r.find(".layui-tree-icon")).children(".layui-icon");i[0]?a.hasClass(w)?(a.removeClass(w),i.slideUp(200),n.removeClass(v).addClass(k)):(a.addClass(w),i.slideDown(200),n.addClass(v).removeClass(k),t.accordion&&((i=a.siblings("."+f)).removeClass(w),i.children("."+g).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(v).addClass(k))):c="normal"}),i.on("click",function(){u(this).hasClass(o)||(c=a.hasClass(w)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:a,state:c,data:e}))})},l.prototype.setCheckbox=function(e,i,n){this.config;var t,l=n.prop("checked");n.prop("disabled")||("object"!=typeof i.children&&!e.find("."+g)[0]||e.find("."+g).find('input[same="layuiTreeCheck"]').each(function(){this.disabled||(this.checked=l)}),(t=function(e){var i,n,a;e.parents("."+f)[0]&&(n=(e=e.parent("."+g)).parent(),a=e.prev().find('input[same="layuiTreeCheck"]'),l?a.prop("checked",l):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||a.prop("checked",!1)),t(n))})(e),this.renderForm("checkbox"))},l.prototype.checkClick=function(n,a){var t=this,l=t.config;n.children("."+m).children("."+x).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=u(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(n,a,e),l.oncheck&&l.oncheck({elem:n,checked:i,data:a}))})},l.prototype.operate=function(c,d){var s=this,o=s.config,e=c.children("."+m),h=e.children("."+x);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=u(this).data("type"),a=c.children("."+g),t={data:d,type:e,elem:c};if("add"==e){a[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(k).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(y),c.append('
      '));var n,l=o.operate&&o.operate(t),r={};if(r.title=o.text.defaultNodeName,r.id=l,s.tree(c.children("."+g),[r]),o.showLine&&(a[0]?(a.hasClass(L)||a.addClass(L),c.find("."+g).each(function(){u(this).children("."+f).last().addClass(N)}),(a.children("."+f).last().prev().hasClass(N)?a.children("."+f).last().prev():a.children("."+f).last()).removeClass(N),!c.parent("."+g)[0]&&c.next()[0]&&a.children("."+f).last().removeClass(N)):(l=c.siblings("."+f),n=1,r=c.parent("."+g),layui.each(l,function(e,i){u(i).children("."+g)[0]||(n=0)}),(1==n?(l.children("."+g).addClass(T),l.children("."+g).children("."+f).removeClass(N),c.children("."+g).addClass(T),r.removeClass(L),r.children("."+f).last().children("."+g).children("."+f).last()):c.children("."+g).children("."+f)).addClass(N))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(c.children("."+g).children("."+f).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+b).html(),h.children("."+b).html(""),h.append(''),h.children(".layui-tree-editInput").val(l).focus(),i=function(e){var i=e.val().trim()||o.text.defaultNodeName;e.remove(),h.children("."+b).html(i),t.data.title=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(u(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(u(this)))})):p.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d.title||"")+'" \u5417\uff1f',function(e){var l,n,i;o.operate&&o.operate(t),t.status="remove",p.close(e),c.prev("."+f)[0]||c.next("."+f)[0]||c.parent("."+g)[0]?(c.siblings("."+f).children("."+m)[0]?(o.showCheckbox&&(l=function(e){var i,n,a,t;e.parents("."+f)[0]&&(i=e.siblings("."+f).children("."+m),n=(e=e.parent("."+g).prev()).find('input[same="layuiTreeCheck"]')[0],a=1,(t=0)==n.checked)&&(i.each(function(e,i){i=u(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(a=0),i.disabled||(t=1)}),1==a)&&1==t&&(n.checked=!0,s.renderForm("checkbox"),l(e.parent("."+f)))})(c),o.showLine&&(e=c.siblings("."+f),n=1,i=c.parent("."+g),layui.each(e,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(a[0]||(i.removeClass(L),e.children("."+g).addClass(T),e.children("."+g).children("."+f).removeClass(N)),(c.next()[0]?i.children("."+f).last():c.prev()).children("."+g).children("."+f).last().addClass(N),c.next()[0]||c.parents("."+f)[1]||c.parents("."+f).eq(0).next()[0]||c.prev("."+f).addClass(N)):!c.next()[0]&&c.hasClass(N)&&c.prev().addClass(N))):(e=c.parent("."+g).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(v).addClass("layui-icon-file"),(i=e.parents("."+g).eq(0)).addClass(L),i.children("."+f).each(function(){u(this).children("."+g).children("."+f).last().addClass(N)})):e.find(".layui-tree-iconArrow").addClass(y),c.parents("."+f).eq(0).removeClass(w),c.parent("."+g).remove()),c.remove()):(c.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=u(this),n=e.val(),e=e.nextAll(),a=[];e.find("."+b).each(function(){var i,e=u(this).parents("."+m);-1!=u(this).html().indexOf(n)&&(a.push(u(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+g)[0]&&i(e.parent("."+g).parent("."+f))})(e.parent("."+f)))}),e.find("."+m).each(function(){var e=u(this).parent("."+f);e.hasClass("layui-tree-searchShow")||e.addClass(y)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:a})}),i.elem.find(".layui-tree-search").on("keydown",function(){u(this).nextAll().find("."+m).each(function(){u(this).parent("."+f).removeClass("layui-tree-searchShow "+y)}),u(".layui-tree-emptyText")[0]&&u(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var e=this.config,i=[],n=[],t=(this.elem.find(".layui-form-checked").each(function(){i.push(u(this).prev()[0].value)}),function(e,a){layui.each(e,function(e,n){layui.each(i,function(e,i){if(n.id==i)return delete(i=u.extend({},n)).children,a.push(i),n.children&&(i.children=[],t(n.children,i.children)),!0})})});return t(u.extend({},e.data),n),n},l.prototype.setChecked=function(l){this.config;this.elem.find("."+f).each(function(e,i){var n=u(this).data("id"),a=u(i).children("."+m).find('input[same="layuiTreeCheck"]'),t=a.next();if("number"==typeof l){if(n==l)return a[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i==n&&!a[0].checked)return t.click(),!0})})},t.that={},t.config={},a.reload=function(e,i){e=t.that[e];return e.reload(i),t.call(e)},a.getChecked=function(e){return t.that[e].getChecked()},a.setChecked=function(e,i){return t.that[e].setChecked(i)},a.render=function(e){e=new l(e);return t.call(e)},e(n,a)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",h="layui-btn-disabled",r="layui-none",c="layui-transfer-box",u="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
      ','
      ','","
      ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
        ',"
        "].join("")},p=['
        ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
        ','",'","
        ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
        "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],e.key=t.id||e.index,i.html(e.elem),e.layBox=e.elem.find("."+c),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,i=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,a=["
      • ",'',"
      • "].join("");i[t].views.push(a),delete e.selected}),e.layData.eq(0).html(i[0].views.join("")),e.layData.eq(1).html(i[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(r){var c=this,o=c.config;r=r||{},c.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+u).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),c.layBtn.eq(e)[l?"removeClass":"addClass"](h),r.stopNone||(i=a.children("li:not(."+s+")").length,c.noneView(a,i?"":o.text.none))}),c.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

        '+(t||"")+"

        ");e.find("."+r)[0]&&e.find("."+r).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),r=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+c).find("."+f).append(t.clone()),t.remove(),r.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+c).find("."+f).append(e.clone()),e.remove(),r.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+c).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(r),e)},v.prototype.events=function(){var n=this,a=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+c).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent();a[0].disabled||n.transfer(i.data("index"),t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(h)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=-1!==t[0].title.indexOf(i);e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?a.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define("jquery",function(e){"use strict";var a=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,d,e,i)}}),d="carousel",r="layui-this",s="layui-carousel-left",u="layui-carousel-right",c="layui-carousel-prev",m="layui-carousel-next",t="layui-carousel-arrow",l="layui-carousel-ind",i=function(e){var i=this;i.config=a.extend({},i.config,n.config,e),i.render()};i.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},i.prototype.render=function(){var e=this,i=e.config;i.elem=a(i.elem),i.elem[0]&&(e.elemItem=i.elem.find(">*[carousel-item]>*"),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(r),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},i.prototype.reload=function(e){var i=this;clearInterval(i.timer),i.config=a.extend({},i.config,e),i.render()},i.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},i.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},i.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},i.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},i.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},i.prototype.arrow=function(){var i=this,e=i.config,n=a(['",'"].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+t)[0]&&e.elem.find("."+t).remove(),e.elem.append(n),n.on("click",function(){var e=a(this).attr("lay-type");i.slide(e)})},i.prototype.indicator=function(){var i,n=this,t=n.config,e=n.elemInd=a(['
          ',(i=[],layui.each(n.elemItem,function(e){i.push("")}),i.join("")),"
        "].join(""));t.elem.attr("lay-indicator",t.indicator),t.elem.find("."+l)[0]&&t.elem.find("."+l).remove(),t.elem.append(e),"updown"===t.anim&&e.css("margin-top",-e.height()/2),e.find("li").on("hover"===t.trigger?"mouseover":t.trigger,function(){var e=a(this).index();e>t.index?n.slide("add",e-t.index):ea.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'
          "),n=1;n<=a.length;n++){var t='
        • ";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'
        • ":i+=t}i+="
        "+(a.text?''+a.value+"\u661f":"")+"";var o=a.elem,s=o.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),o.html(e.elemTemp),o.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var i=this.config,n=this.elemTemp,t=n.find("i").width();n.children("li").each(function(e){var a=e+1,l=u(this);l.on("click",function(e){i.value=a,i.half&&e.pageX-u(this).offset().left<=t/2&&(i.value=i.value-.5),i.text&&n.next("span").text(i.value+"\u661f"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),l.on("mousemove",function(e){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+a+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&e.pageX-u(this).offset().left<=t/2&&l.children("i").addClass(o).removeClass(r)}),l.on("mouseleave",function(){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+Math.floor(i.value)+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&n.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})})},a.prototype.events=function(){this.config},l.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(i,l)});layui.define("jquery",function(l){"use strict";var g=layui.$,e=function(l){};e.prototype.load=function(l){var t,i,n,e,r,o,a,c,m,s,u,f,y,d=this,p=0,h=g((l=l||{}).elem);if(h[0])return e=g(l.scrollElem||document),r=l.mb||50,o=!("isAuto"in l)||l.isAuto,a=l.end||"\u6ca1\u6709\u66f4\u591a\u4e86",c=l.scrollElem&&l.scrollElem!==document,s=g('"),h.find(".layui-flow-more")[0]||h.append(s),u=function(l,e){l=g(l),s.before(l),(e=0==e||null)?s.html(a):s.find("a").html(m),i=e,t=null,y&&y()},(f=function(){t=!0,s.find("a").html(''),"function"==typeof l.done&&l.done(++p,u)})(),s.find("a").on("click",function(){g(this);i||t||f()}),l.isLazyimg&&(y=d.lazyimg({elem:l.elem+" img",scrollElem:l.scrollElem})),o&&e.on("scroll",function(){var e=g(this),o=e.scrollTop();n&&clearTimeout(n),!i&&h.width()&&(n=setTimeout(function(){var l=(c?e:g(window)).height();(c?e.prop("scrollHeight"):document.documentElement.scrollHeight)-o-l<=r&&(t||f())},100))}),d},e.prototype.lazyimg=function(l){var e,c=this,m=0,s=g((l=l||{}).scrollElem||document),u=l.elem||"img",f=l.scrollElem&&l.scrollElem!==document,y=function(e,l){var o,t=s.scrollTop(),l=t+l,i=f?e.offset().top-s.offset().top+t:e.offset().top;t<=i&&i<=l&&e.attr("lay-src")&&(o=e.attr("lay-src"),layui.img(o,function(){var l=c.lazyimg.elem.eq(m);e.attr("src",o).removeAttr("lay-src"),l[0]&&n(l),m++},function(){c.lazyimg.elem.eq(m);e.removeAttr("lay-src")}))},n=function(l,e){var o=(f?e||s:g(window)).height(),t=s.scrollTop(),i=t+o;if(c.lazyimg.elem=g(u),l)y(l,o);else for(var n=0;n','
        '+e+"
        ",'
        ','',"
        ",""].join(""));return y.ie&&y.ie<8?s.removeClass("layui-hide").addClass("layui-show"):(r[0]&&r.remove(),m.call(l,o,s[0],n),s.addClass("layui-hide").after(o),l.index)},e.prototype.getContent=function(t){t=n(t);if(t[0])return a(t[0].document.body.innerHTML)},e.prototype.getText=function(t){t=n(t);if(t[0])return u(t[0].document.body).text()},e.prototype.setContent=function(t,e,i){var a=n(t);a[0]&&(i?u(a[0].document.body).append(e):u(a[0].document.body).html(e),layedit.sync(t))},e.prototype.sync=function(t){t=n(t);t[0]&&u("#"+t[1].attr("textarea")).val(a(t[0].document.body.innerHTML))},e.prototype.getSelection=function(t){var t=n(t);if(t[0])return t=p(t[0].document),document.selection?t.text:t.toString()},function(l,n,o){var s=this,c=l.find("iframe");c.css({height:o.height}).on("load",function(){var t=c.contents(),e=c.prop("contentWindow"),i=t.find("head"),a=u([""].join("")),t=t.find("body");i.append(a),t.attr("contenteditable","true").css({"min-height":o.height}).html(n.value||""),r.apply(s,[e,c,n,o]),b.call(s,e,l,o)})}),n=function(t){t=u("#LAY_layedit_"+t);return[t.prop("contentWindow"),t]},a=function(t){return t=8==y.ie?t.replace(/<.+>/g,function(t){return t.toLowerCase()}):t},r=function(e,t,i,a){var l=e.document,n=u(l.body);n.on("keydown",function(t){if(13===t.keyCode){var e=p(l);if("pre"===h(e).parentNode.tagName.toLowerCase())return t.shiftKey?void 0:(d.msg("\u8bf7\u6682\u65f6\u7528shift+enter"),!1);l.execCommand("formatBlock",!1,"

        ")}}),u(i).parents("form").on("submit",function(){var t=n.html();8==y.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),i.value=t}),n.on("paste",function(t){l.execCommand("formatBlock",!1,"

        "),setTimeout(function(){o.call(e,n),i.value=n.html()},100)})},o=function(t){this.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),u(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},p=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},h=function(t){return t.endContainer||t.parentElement().childNodes[0]},g=function(t,e,i){var a,l,n=this.document,o=document.createElement(t);for(a in e)o.setAttribute(a,e[a]);o.removeAttribute("text"),n.selection?(l=i.text||e.text,"a"===t&&!l||(l&&(o.innerHTML=l),i.pasteHTML(u(o).prop("outerHTML")),i.select())):(l=i.toString()||e.text,"a"===t&&!l||(l&&(o.innerHTML=l),i.deleteContents(),i.insertNode(o)))},v=function(e,t){var i=this.document,a="layedit-tool-active",i=h(p(i)),l=function(t){return e.find(".layedit-tool-"+t)};t&&t[t.hasClass(a)?"removeClass":"addClass"](a),e.find(">i").removeClass(a),l("unlink").addClass(f),u(i).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||l("b").addClass(a),"i"!==t&&"em"!==t||l("i").addClass(a),"u"===t&&l("u").addClass(a),"strike"===t&&l("d").addClass(a),"p"===t&&l("center"===e?"center":"right"===e?"right":"left").addClass(a),"a"===t&&(l("link").addClass(a),l("unlink").removeClass(f))})},b=function(l,t,n){var o=l.document,s=u(o.body),c={link:function(i){var t=h(i),a=u(t).parent();x.call(s,{href:a.attr("href"),target:a.attr("target")},function(t){var e=a[0];"A"===e.tagName?e.href=t.url:g.call(l,"a",{target:t.target,href:t.url,text:t.url},i)})},unlink:function(t){o.execCommand("unlink")},face:function(e){k.call(this,function(t){g.call(l,"img",{src:t.src,alt:t.alt,style:t.style},e)})},image:function(i){var a=this;layui.use("upload",function(t){var e=n.uploadImage||{};t.render({url:e.url,method:e.type,elem:u(a).find("input")[0],choose:function(t){e.getChooseImageData&&"function"==typeof e.getChooseImageData&&e.getChooseImageData(t)},done:function(t){0==t.code?(t.data=t.data||{},g.call(l,"img",{src:t.data.src,alt:t.data.title,id:t.data.id,style:"width:100px;"},i),e.getUploadImageData&&"function"==typeof e.getUploadImageData&&e.getUploadImageData(t)):d.msg(t.msg||"\u4e0a\u4f20\u5931\u8d25")}})})},code:function(e){C.call(s,function(t){g.call(l,"pre",{text:t.code,"lay-lang":t.lang},e)})},help:function(){d.open({type:2,title:"\u5e2e\u52a9",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["","no"]})}},r=t.find(".layui-layedit-tool"),e=function(){var t,e=u(this),i=e.attr("layedit-event"),a=e.attr("lay-command");e.hasClass(f)||(s.focus(),(t=p(o)).commonAncestorContainer,a?(o.execCommand(a),/justifyLeft|justifyCenter|justifyRight/.test(a)&&o.execCommand("formatBlock",!1,"

        "),setTimeout(function(){s.focus()},10)):c[i]&&c[i].call(this,t),v.call(l,r,e))},i=/image/;r.find(">i").on("mousedown",function(){var t=u(this).attr("layedit-event");i.test(t)||e.call(this)}).on("click",function(){var t=u(this).attr("layedit-event");i.test(t)&&e.call(this)}),s.on("click",function(){v.call(l,r),d.close(k.index)})},x=function(t,i){var a=this,t=d.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"\u8d85\u94fe\u63a5",skin:"layui-layer-msg",content:['

          ','
        • ','','
          ','',"
          ","
        • ",'
        • ','','
          ','",'","
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(t,e){l.render("radio"),t.find(".layui-btn-primary").on("click",function(){d.close(e),a.focus()}),l.on("submit(layedit-link-yes)",function(t){d.close(x.index),i&&i(t.field)})}});x.index=t},k=function(i){a={},layui.each(["[\u5c0f\u4e11]","[\u51b7\u6f20]","[\u53ef\u7231]","[\u5077\u7b11]","[\u8c03\u76ae]","[\u54ed\u7b11]"],function(t,e){a[e]=layui.cache.dir+"images/face/"+t+".gif"});var a,l,n=a;return k.hide=k.hide||function(t){"face"!==u(t.target).attr("layedit-event")&&d.close(k.index)},k.index=d.tips((l=[],layui.each(n,function(t,e){l.push('
      • '+t+'
      • ')}),'
          '+l.join("")+"
        "),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(t,e){t.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){i&&i({src:n[this.title],alt:this.title,style:"width:30px; height:30px;user-select: none;-webkit-user-drag: none;"}),d.close(e)}),u(document).off("click",k.hide).on("click",k.hide)}})},C=function(i){var a=this,t=d.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"\u63d2\u5165\u4ee3\u7801",skin:"layui-layer-msg",content:['
          ','
        • ','','
          ','","
          ","
        • ",'
        • ','','
          ','',"
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(t,e){l.render("select"),t.find(".layui-btn-primary").on("click",function(){d.close(e),a.focus()}),l.on("submit(layedit-code-yes)",function(t){d.close(C.index),i&&i(t.field)})}});C.index=t},w={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},e=new e;t(i,e)});layui.define(["lay","util"],function(e){"use strict";var d=layui.$,o=layui.util,u="layui-code-title",l={elem:".layui-code",title:"</>",about:"",ln:!0};e("code",function(e){var c=e=d.extend({},l,e);e.elem=d(e.elem),e.elem[0]&&layui.each(e.elem.get().reverse(),function(e,l){var t,a=d(l),i=(i=a.html(),d.trim(i).replace(/^\n|\n$/,"")),l=d.extend({},c,lay.options(l),(t={},layui.each(["title","height","encode","skin","about"],function(e,l){var i=a.attr("lay-"+l);"string"==typeof i&&(t[l]=i)}),t)),s=l.ln?"ol":"ul",s=d("<"+s+' class="layui-code-'+s+'">'),n=d('
        ');a.addClass("layui-code-view layui-box"),l.skin&&("notepad"===l.skin&&(l.skin="dark"),a.addClass("layui-code-"+l.skin)),i=(i=l.encode?o.escape(i):i).replace(/[\r\t\n]+/g,"
      • "),a.html(s.html("
      • "+i+"
      • ")),a.children("."+u)[0]||(n.html(l.title+(l.about?'
        '+l.about+"
        ":"")),a.prepend(n)),0<(i=Math.floor(s.find("li").length/100))&&s.css("margin-left",i+"px"),l.height&&s.css("max-height",l.height)})})}).addcss("modules/code.css?v=3","skincodecss"); \ No newline at end of file +/** 2.7.4 | MIT Licensed */;!function(d){"use strict";var t,h=d.document,m={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.7.4"},e=d.LAYUI_GLOBAL||{},v=(t=h.currentScript?h.currentScript.src:function(){for(var t,e=h.scripts,o=e.length-1,r=o;01e3*m.timeout/4?g(s+" is not a valid module","error"):void(m.status[s]?y():setTimeout(r,4))}())}function y(){e.push(layui[s]),11e3*m.timeout/4?g(s+" is not a valid module","error"):void("string"==typeof m.modules[s]&&m.status[s]?y():setTimeout(f,4))}():((n=h.createElement("script"))["async"]=!0,n.charset="utf-8",n.src=i+((u=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+u:""),l.appendChild(n),!n.attachEvent||n.attachEvent.toString&&n.attachEvent.toString().indexOf("[native code")<0||b?n.addEventListener("load",function(t){p(t,i)},!1):n.attachEvent("onreadystatechange",function(t){p(t,i)}),m.modules[s]=i)),a},r.prototype.disuse=function(t){var o=this;return t=o.isArray(t)?t:[t],o.each(t,function(t,e){m.status[e],delete o[e],delete N[e],delete o.modules[e],delete m.status[e],delete m.modules[e]}),o},r.prototype.getStyle=function(t,e){t=t.currentStyle||d.getComputedStyle(t,null);return t[t.getPropertyValue?"getPropertyValue":"getAttribute"](e)},r.prototype.link=function(o,r,t){var n=this,e=h.getElementsByTagName("head")[0],i=h.createElement("link"),t=((t="string"==typeof r?r:t)||o).replace(/\.|\//g,""),a=i.id="layuicss-"+t,u="creating",l=0;return i.rel="stylesheet",i.href=o+(m.debug?"?v="+(new Date).getTime():""),i.media="all",h.getElementById(a)||e.appendChild(i),"function"==typeof r&&function s(t){var e=h.getElementById(a);return++l>1e3*m.timeout/100?g(o+" timeout"):void(1989===parseInt(n.getStyle(e,"width"))?(t===u&&e.removeAttribute("lay-status"),e.getAttribute("lay-status")===u?setTimeout(s,100):r()):(e.setAttribute("lay-status",u),setTimeout(function(){s(u)},100)))}(),n},r.prototype.addcss=function(t,e,o){return layui.link(m.dir+"css/"+t,e,o)},m.callback={},r.prototype.factory=function(t){if(layui[t])return"function"==typeof m.callback[t]?m.callback[t]:null},r.prototype.img=function(t,e,o){var r=new Image;if(r.src=t,r.complete)return e(r);r.onload=function(){r.onload=null,"function"==typeof e&&e(r)},r.onerror=function(t){r.onerror=null,"function"==typeof o&&o(t)}},r.prototype.config=function(t){for(var e in t=t||{})m[e]=t[e];return this},r.prototype.modules=function(){var t,e={};for(t in N)e[t]=N[t];return e}(),r.prototype.extend=function(t){for(var e in t=t||{})this[e]||this.modules[e]?g(e+" Module already exists","error"):this.modules[e]=t[e];return this},r.prototype.router=r.prototype.hash=function(t){var o={path:[],search:{},hash:((t=t||location.hash).match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)&&(t=t.replace(/^#\//,""),o.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(t,function(t,e){/^\w+=/.test(e)?(e=e.split("="),o.search[e[0]]=e[1]):o.path.push(e)})),o},r.prototype.url=function(t){var n,e,o=this;return{pathname:(t?((t.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):location.pathname).replace(/^\//,"").split("/"),search:(n={},e=(t?((t.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):location.search).replace(/^\?+/,"").split("&"),o.each(e,function(t,e){var o=e.indexOf("="),r=o<0?e.substr(0,e.length):0!==o&&e.substr(0,o);r&&(n[r]=0(l.innerHeight||f.documentElement.clientHeight)},h.position=function(t,e,n){var o,i,r,c,u,a,s;e&&(n=n||{},t!==f&&t!==h("body")[0]||(n.clickType="right"),u="right"===n.clickType?{left:(u=n.e||l.event||{}).clientX,top:u.clientY,right:u.clientX,bottom:u.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,s=e.offsetHeight,o=function(t){return f.body[t=t?"scrollLeft":"scrollTop"]|f.documentElement[t]},r=u.left,c=u.bottom,"center"===n.align?r-=(a-t.offsetWidth)/2:"right"===n.align&&(r=r-a+t.offsetWidth),(r=r+a+5>(i=function(t){return f.documentElement[t?"clientWidth":"clientHeight"]})("width")?i("width")-a-5:r)<5&&(r=5),c+s+5>i()&&(u.top>s+5?c=u.top-s-10:"right"===n.clickType?(c=i()-s-10)<0&&(c=0):c=5),(a=n.position)&&(e.style.position=a),e.style.left=r+("fixed"===a?0:o(1))+"px",e.style.top=c+("fixed"===a?0:o())+"px",h.hasScrollbar()||(s=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&s.bottom+5>i()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){h.position(t,e,n)},50))))},h.options=function(t,e){t=h(t),e=e||"lay-options";try{return new Function("return "+(t.attr(e)||"{}"))()}catch(n){return hint.error("parseerror\uff1a"+n,"error"),{}}},h.isTopElem=function(n){var t=[f,h("body")[0]],o=!1;return h.each(t,function(t,e){if(e===n)return o=!0}),o},i.addStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){new RegExp("\\b"+e+"\\b").test(n)||(n=n+" "+e)}),n.replace(/^\s|\s$/,"")},i.removeStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){e=new RegExp("\\b"+e+"\\b");e.test(n)&&(n=n.replace(e,""))}),n.replace(/\s+/," ").replace(/^\s|\s$/,"")},i.prototype.find=function(o){var i=this,r=0,c=[],u="object"==typeof o;return this.each(function(t,e){for(var n=u?e.contains(o):e.querySelectorAll(o||null);r]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},error:function(e,r){var n="Laytpl Error: ";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},l=a.exp,r=function(e){this.tpl=e},n=(r.pt=r.prototype,window.errors=0,r.pt.parse=function(e,r){var n=e,c=l("^"+p.open+"#",""),t=l(p.close+"$","");e='"use strict";var view = "'+(e=e.replace(/\s+|\r|\t|\n/g," ").replace(l(p.open+"#"),p.open+"# ").replace(l(p.close+"}"),"} "+p.close).replace(/\\/g,"\\\\").replace(l(p.open+"!(.+?)!"+p.close),function(e){return e=e.replace(l("^"+p.open+"!"),"").replace(l("!"+p.close),"").replace(l(p.open+"|"+p.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(a.query(),function(e){return'";'+(e=e.replace(c,"").replace(t,"")).replace(/\\(.)/g,"$1")+';view+="'}).replace(a.query(1),function(e){var r='"+laytpl.escape(';return e.replace(/\s/g,"")===p.open+p.close?"":(e=e.replace(l(p.open+"|"+p.close),""),/^=/.test(e)?e=e.replace(/^=/,""):/^-/.test(e)&&(e=e.replace(/^-/,""),r='"+('),r+e.replace(/\\(.)/g,"$1")+')+"')}))+'";return view;';try{return this.cache=e=new Function("d, laytpl",e),e(r,a)}catch(o){return delete this.cache,a.error(o,n)}},r.pt.render=function(e,r){var n=this;return e?(e=n.cache?n.cache(e,a):n.parse(n.tpl,e),r?void r(e):e):a.error("no data")},function(e){return"string"!=typeof e?a.error("Template not found"):new r(e)});n.config=function(e){for(var r in e=e||{})p[r]=e[r]},n.v="1.2.0",e("laytpl",n)});layui.define(function(e){"use strict";var n=document,u="getElementById",c="getElementsByTagName",a="layui-disabled",t=function(e){var a=this;a.config=e||{},a.config.index=++o.index,a.render(!0)},o=(t.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return e.elem.length===undefined?2:3},t.prototype.view=function(){var t,i,r=this.config,n=r.groups="groups"in r?Number(r.groups)||0:5,u=(r.layout="object"==typeof r.layout?r.layout:["prev","page","next"],r.count=Number(r.count)||0,r.curr=Number(r.curr)||1,r.limits="object"==typeof r.limits?r.limits:[10,20,30,40,50],r.limit=Number(r.limit)||10,r.pages=Math.ceil(r.count/r.limit)||1,r.curr>r.pages?r.curr=r.pages:r.curr<1&&(r.curr=1),n<0?n=1:n>r.pages&&(n=r.pages),r.prev="prev"in r?r.prev:"上一页",r.next="next"in r?r.next:"下一页",r.pages>n?Math.ceil((r.curr+(1'+r.prev+"":"",page:function(){var e=[];if(r.count<1)return"";1'+(r.first||1)+"");var a=Math.floor((n-1)/2),t=1r.pages?r.pages:a:n;for(i-t…');t<=i;t++)t===r.curr?e.push('"+t+""):e.push(''+t+"");return r.pages>n&&r.pages>i&&!1!==r.last&&(i+1…'),0!==n)&&e.push(''+(r.last||r.pages)+""),e.join("")}(),next:r.next?''+r.next+"":"",count:'\u5171 '+r.count+" \u6761",limit:(t=['"),refresh:['','',""].join(""),skip:['到第','','页',""].join("")};return['
        ',(i=[],layui.each(r.layout,function(e,a){s[a]&&i.push(s[a])}),i.join("")),"
        "].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,n=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],s=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return s();for(var l=0,p=r.length;li.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),n&&o.on(n,"click",function(){s()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),r=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=r):3===i?t.elem.html(r):n[u](t.elem)&&(n[u](t.elem).innerHTML=r),t.jump&&t.jump(t,e),n[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,r){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){u.path&&i.lay&&lay.layui&&lay.layui.link(u.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},u={v:"5.3.1",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/laydate/":"theme/")+"default/laydate.css?v="+u.v;return n?layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return{hint:function(e){t.hint.call(t,e)},config:(s.that[e]=t).config}},a="laydate",w="layui-this",x="laydate-disabled",h=[100,2e5],p="layui-laydate-static",M="layui-laydate-list",o="layui-laydate-hint",E=".laydate-btns-confirm",C="laydate-time-text",k="laydate-btns-time",f="layui-laydate-preview",g=function(e){var t=this;t.index=++u.index,t.config=lay.extend({},t.config,u.config,e),(e=t.config).id="id"in e?e.id:t.index,u.ready(function(){t.init()})},y="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s";s.formatArr=function(e){return(e||"").match(new RegExp(y+"|.","g"))||[]},g.isLeapYear=function(e){return e%4==0&&e%100!=0||e%400==0},g.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"click",show:!1,showBottom:!0,isPreview:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},holidays:null,zIndex:null,done:null,change:null},g.prototype.lang=function(){var e={cn:{weeks:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"],time:["\u65f6","\u5206","\u79d2"],timeTips:"\u9009\u62e9\u65f6\u95f4",startTime:"\u5f00\u59cb\u65f6\u95f4",endTime:"\u7ed3\u675f\u65f6\u95f4",dateTips:"\u8fd4\u56de\u65e5\u671f",month:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],tools:{confirm:"\u786e\u5b9a",clear:"\u6e05\u7a7a",now:"\u73b0\u5728"},timeout:"\u7ed3\u675f\u65f6\u95f4\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65f6\u95f4
        \u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
        \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
        ","
        \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
        Please re-select",invalidDate:"Invalid date",formatError:["The date format error
        Must be followed\uff1a
        ","
        It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},g.prototype.init=function(){var r=this,o=r.config,e="static"===o.position,t={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&(r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"","array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),t[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===t.date&&(o.format=t[o.type]||t.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(t=r.lang(),o.weekStart=t.weeks.indexOf(o.weekStart),-1===o.weekStart)&&(o.weekStart=0),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(y).test(t)?"\\d{"+(new RegExp(y).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key")||(o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index)),o.mark=lay.extend({},o.calendar&&"cn"===o.lang?{"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"}:{},o.mark),lay.each(["min","max"],function(e,t){var a,n,i=[],l=[];l="number"==typeof o[t]?(n=o[t],a=new Date,a=r.newDate({year:a.getFullYear(),month:a.getMonth(),date:a.getDate(),hours:"23",minutes:"59",seconds:"59"}).getTime(),i=[(n=new Date(n?n<864e5?a+864e5*n:n:a)).getFullYear(),n.getMonth()+1,n.getDate()],[n.getHours(),n.getMinutes(),n.getSeconds()]):(i=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":")),o[t]={year:0|i[0]||(new Date).getFullYear(),month:i[1]?(0|i[1])-1:(new Date).getMonth(),date:0|i[2]||(new Date).getDate(),hours:0|l[0],minutes:0|l[1],seconds:0|l[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||e)&&r.render(),e||r.events(),o.value)&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value))},g.prototype.render=function(){var n,e,t=this,o=t.config,s=t.lang(),i="static"===o.position,a=t.elem=lay.elem("div",{id:t.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",i?" "+p:"",o.theme&&"default"!==o.theme&&!/^#/.test(o.theme)?" laydate-theme-"+o.theme:""].join("")}),y=t.elemMain=[],d=t.elemHeader=[],m=t.elemCont=[],c=t.table=[],l=t.footer=lay.elem("div",{"class":"layui-laydate-footer"});o.zIndex&&(a.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0'+s.timeTips+""),!o.range&&"datetime"===o.type||e.push(''),lay.each(o.btns,function(e,t){var a=s.tools[t]||"btn";o.range&&"now"===t||(i&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push(''+a+""))}),e.push('"),e.join(""))),lay.each(y,function(e,t){a.appendChild(t)}),o.showBottom&&a.appendChild(l),/^#/.test(o.theme)&&(e=lay.elem("style"),l=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,t.elemID).replace(/{{theme}}/g,o.theme),"styleSheet"in e?(e.setAttribute("type","text/css"),e.styleSheet.cssText=l):e.innerHTML=l,lay(a).addClass("laydate-theme-molv"),a.appendChild(e)),t.remove(g.thisElemDate),u.thisId=o.id,i?o.elem.append(a):(r.body.appendChild(a),t.position()),t.checkDate().calendar(null,0,"init"),t.changeEvent(),g.thisElemDate=t.elemID,"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),t.preview()},g.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&!n.hasClass(p)&&t.checkDate(function(){n.remove(),delete u.thisId,"function"==typeof a.close&&a.close(t)}),t},g.prototype.position=function(){var e=this.config;return lay.position(this.bindElem||e.elem[0],this.elem,{position:e.position}),this},g.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":o}));t.elem&&(a.innerHTML=e||"",lay(t.elem).find("."+o).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+o).remove()},3e3))},g.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11h[1]&&(e.year=h[1],o=!0),11t&&(e.date=t,o=!0)},c=function(n,i,l){var r=["startTime","endTime"];i=(i.match(s.EXP_SPLIT)||[]).slice(1),l=l||0,y.range&&(s[r[l]]=s[r[l]]||{}),lay.each(s.format,function(e,t){var a=parseFloat(i[e]);i[e].lengthn(y.max)?l=y.dateTime=lay.extend({},y.max):n(l)n(y.max))&&(s.endDate=lay.extend({},y.max)),e&&e()),s},g.prototype.mark=function(e,a){var n,t=this.config;return lay.each(t.mark,function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}),n&&e.html(''+n+""),this},g.prototype.holidays=function(n,i){var e=this.config,l=["","work"];return"array"===layui.type(e.holidays)&&lay.each(e.holidays,function(a,e){lay.each(e,function(e,t){t===n.attr("lay-ymd")&&n.html('"+i[2]+"")})}),this},g.prototype.limit=function(e,t,a,i){var l=this,n=l.config,r={},a=n[41h[1]&&(s.year=h[1],o.hint(d.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},s)),y.setFullYear(s.year,s.month,1),i=(y.getDay()+(7-n.weekStart))%7,l=u.getEndDate(s.month||12,s.year),r=u.getEndDate(s.month+1,s.year),lay.each(c,function(e,t){var a=[s.year,s.month],n=0;(t=lay(t)).removeAttr("class"),e"+d.time[t]+"

          "];lay.each(new Array(e),function(e){n.push(""+lay.digit(e,2)+"")}),a.innerHTML=n.join("")+"
        ",m.appendChild(a)}),l()),p&&h.removeChild(p),h.appendChild(m),"year"===t||"month"===t?(lay(o.elemMain[n]).addClass("laydate-ym-show"),lay(m).find("li").on("click",function(){var e=0|lay(this).attr("lay-ym");lay(this).hasClass(x)||(0===n?(y[t]=e,o.limit(lay(o.footer).find(E),null,0)):o.endDate[t]=e,"year"===s.type||"month"===s.type?(lay(m).find("."+w).removeClass(w),lay(this).addClass(w),"month"===s.type&&"year"===t&&(o.listYM[n][0]=e,a&&((n?o.endDate:y).year=e),o.list("month",n))):(o.checkDate("limit").calendar(null,n),o.closeList()),o.setBtnStatus(),s.range||("month"===s.type&&"month"===t||"year"===s.type&&"year"===t)&&o.setValue(o.parse()).remove().done(),o.done(null,"change"),lay(o.footer).find("."+k).removeClass(x))})):(e=lay.elem("span",{"class":C}),r=function(){lay(m).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(o[D][T[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(x))return a.scrollTop=30*(e-2),!0})})},u=lay(c[2]).find("."+C),r(),e.innerHTML=s.range?[d.startTime,d.endTime][n]:d.timeTips,lay(o.elemMain[n]).addClass("laydate-time-show"),u[0]&&u.remove(),c[2].appendChild(e),lay(m).find("ol").each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(x)||(s.range?o[D][T[t]]=e:y[T[t]]=e,lay(a).find("."+w).removeClass(w),lay(this).addClass(w),l(),r(),!o.endDate&&"time"!==s.type||o.done(null,"change"),o.setBtnStatus())})})),o},g.prototype.listYM=[],g.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+M).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+C).remove()},g.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(E);i.range&&"time"!==i.type&&(t=t||i.dateTime,a=a||n.endDate,i=n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit(null,t)||n.limit(null,a)?r.addClass(x):r[i?"addClass":"removeClass"](x),e)&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout)},g.prototype.parse=function(e,t){var a=this,n=a.config,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),t=u.parse(t,a.format,1);return n.range&&e===undefined?t+" "+a.rangeStr+" "+a.parse("end"):t},g.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},g.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return"static"!==a.position&&(e=e||"",t.isInput(n)?lay(n).val(e):(a=t.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+t.rangeStr+" ")),a[0].val(e[0]||""),a[1].val(e[1]||"")):(0===lay(n).find("*").length&&lay(n).html(e),lay(n).attr("lay-date",e))),t},g.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+f),a=!a.range||t.endDate?t.parse():"",e.html(a).css({color:"#5FB878"}),setTimeout(function(){e.css({color:"#666"})},300))},g.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},g.prototype.choose=function(e,t){var a=this,n=a.config,i=a.thisDateTime(t),l=(lay(a.elem).find("td"),{year:0|(l=e.attr("lay-ymd").split("-"))[0],month:(0|l[1])-1,date:0|l[2]});e.hasClass(x)||(lay.extend(i,l),n.range?(lay.each(["startTime","endTime"],function(e,t){a[t]=a[t]||{hours:e?23:0,minutes:e?59:0,seconds:e?59:0}}),a.calendar(null,t).done(null,"change")):"static"===n.position?a.calendar().done().done(null,"change"):"date"===n.type?a.setValue(a.parse()).remove().done():"datetime"===n.type&&a.calendar().done(null,"change"))},g.prototype.tool=function(e,t){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(e).hasClass(x)||(a.list("time",0),n.range&&a.list("time",1),lay(e).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(e).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue("").remove(),a.done(["",{},{}])},now:function(){var e=new Date;lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(e).hasClass(x))return a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout)}else if(lay(e).hasClass(x))return a.hint(i.invalidDate);a.setValue(a.parse()).remove(),a.done()}};o[t]&&o[t]()},g.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),s=i.elemCont[n||0],y=i.listYM[n],e=function(e){var t=lay(s).find(".laydate-year-list")[0],a=lay(s).find(".laydate-month-list")[0];return t&&(y[0]=e?y[0]-15:y[0]+15,i.list("year",n)),a&&(e?y[0]--:y[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:y[0]}),o&&(r.year=y[0]),l.range||i.done(null,"change"),l.range||i.limit(lay(i.footer).find(E),{year:y[0]})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(r.year--,i.checkDate("limit").calendar(null,n),i.done(null,"change"))},prevMonth:function(){var e=i.getAsYM(r.year,r.month,"sub");lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextMonth:function(){var e=i.getAsYM(r.year,r.month);lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextYear:function(){e()||(r.year++,i.checkDate("limit").calendar(null,n),i.done(null,"change"))}}},g.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+k).addClass(x))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},g.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},g.prototype.events=function(){var a=this,n=a.config,e=function(e,t){e.on(n.trigger,function(){u.thisId!==n.id&&(t&&(a.bindElem=this),a.render())})};n.elem[0]&&!n.elem[0].eventHandler&&(e(n.elem,"bind"),e(n.eventElem),n.elem[0].eventHandler=!0)},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(r).on("mousedown",function(e){var t,a;u.thisId&&(t=s.getThis(u.thisId))&&(a=t.config,e.target!==a.elem[0])&&e.target!==a.eventElem[0]&&e.target!==n(a.closeStop)[0]&&t.remove()}).on("keydown",function(e){var t;u.thisId&&(t=s.getThis(u.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===g.thisElemDate&&(e.preventDefault(),n(t.footer).find(E)[0].click())}),n(i).on("resize",function(){if(u.thisId){var e=s.getThis(u.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},u.render=function(e){e=new g(e);return s.call(e)},u.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},u.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},u.close=function(e){lay("#"+(e?"layui-laydate"+e:g.thisElemDate)).remove()},n?(u.ready(),layui.define("lay",function(e){u.path=layui.cache.dir,l.run(lay),e(a,u)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),u}):(u.ready(),l.run(i.lay),i.laydate=u)}(window,window.document);!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){var f=[],g=T.document,c=f.slice,O=f.concat,R=f.push,P=f.indexOf,B={},W=B.toString,m=B.hasOwnProperty,y={},e="1.12.4",C=function(e,t){return new C.fn.init(e,t)},I=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,$=/^-ms-/,z=/-([\da-z])/gi,X=function(e,t){return t.toUpperCase()};function U(e){var t=!!e&&"length"in e&&e.length,n=C.type(e);return"function"!==n&&!C.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+a+")"+a+"*"),ee=new RegExp("="+a+"*([^\\]'\"]*?)"+a+"*\\]","g"),te=new RegExp(G),ne=new RegExp("^"+s+"$"),f={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),TAG:new RegExp("^("+s+"|[*])"),ATTR:new RegExp("^"+J),PSEUDO:new RegExp("^"+G),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+a+"*(even|odd|(([+-]|)(\\d*)n|)"+a+"*(?:([+-]|)"+a+"*(\\d+)|))"+a+"*\\)|)","i"),bool:new RegExp("^(?:"+Y+")$","i"),needsContext:new RegExp("^"+a+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+a+"*((?:-\\d)?\\d*)"+a+"*\\)|)(?=[^-]|$)","i")},re=/^(?:input|select|textarea|button)$/i,ie=/^h\d$/i,c=/^[^{]+\{\s*\[native \w/,oe=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ae=/[+~]/,se=/'|\\/g,d=new RegExp("\\\\([\\da-f]{1,6}"+a+"?|("+a+")|.)","ig"),p=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)},ue=function(){C()};try{D.apply(n=V.call(v.childNodes),v.childNodes),n[v.childNodes.length].nodeType}catch(F){D={apply:n.length?function(e,t){U.apply(e,V.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function H(e,t,n,r){var i,o,a,s,u,l,c,f,d=t&&t.ownerDocument,p=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==p&&9!==p&&11!==p)return n;if(!r&&((t?t.ownerDocument||t:v)!==E&&C(t),t=t||E,N)){if(11!==p&&(l=oe.exec(e)))if(i=l[1]){if(9===p){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(d&&(a=d.getElementById(i))&&y(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return D.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&g.getElementsByClassName&&t.getElementsByClassName)return D.apply(n,t.getElementsByClassName(i)),n}if(g.qsa&&!A[e+" "]&&(!m||!m.test(e))){if(1!==p)d=t,f=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(se,"\\$&"):t.setAttribute("id",s=k),o=(c=w(e)).length,u=ne.test(s)?"#"+s:"[id='"+s+"']";o--;)c[o]=u+" "+_(c[o]);f=c.join(","),d=ae.test(e)&&de(t.parentNode)||t}if(f)try{return D.apply(n,d.querySelectorAll(f)),n}catch(h){}finally{s===k&&t.removeAttribute("id")}}}return P(e.replace(L,"$1"),t,n,r)}function le(){var n=[];function r(e,t){return n.push(e+" ")>b.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function q(e){return e[k]=!0,e}function h(e){var t=E.createElement("div");try{return!!e(t)}catch(F){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function ce(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function x(a){return q(function(o){return o=+o,q(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in g=H.support={},O=H.isXML=function(e){e=e&&(e.ownerDocument||e).documentElement;return!!e&&"HTML"!==e.nodeName},C=H.setDocument=function(e){var e=e?e.ownerDocument||e:v;return e!==E&&9===e.nodeType&&e.documentElement&&(t=(E=e).documentElement,N=!O(E),(e=E.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",ue,!1):e.attachEvent&&e.attachEvent("onunload",ue)),g.attributes=h(function(e){return e.className="i",!e.getAttribute("className")}),g.getElementsByTagName=h(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),g.getElementsByClassName=c.test(E.getElementsByClassName),g.getById=h(function(e){return t.appendChild(e).id=k,!E.getElementsByName||!E.getElementsByName(k).length}),g.getById?(b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&N)return(e=t.getElementById(e))?[e]:[]},b.filter.ID=function(e){var t=e.replace(d,p);return function(e){return e.getAttribute("id")===t}}):(delete b.find.ID,b.filter.ID=function(e){var t=e.replace(d,p);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}}),b.find.TAG=g.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):g.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=g.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&N)return t.getElementsByClassName(e)},r=[],m=[],(g.qsa=c.test(E.querySelectorAll))&&(h(function(e){t.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+a+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+a+"*(?:value|"+Y+")"),e.querySelectorAll("[id~="+k+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||m.push(".#.+[+~]")}),h(function(e){var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+a+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(g.matchesSelector=c.test(i=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.msMatchesSelector))&&h(function(e){g.disconnectedMatch=i.call(e,"div"),i.call(e,"[s!='']:x"),r.push("!=",G)}),m=m.length&&new RegExp(m.join("|")),r=r.length&&new RegExp(r.join("|")),e=c.test(t.compareDocumentPosition),y=e||c.test(t.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},$=e?function(e,t){var n;return e===t?(l=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===v&&y(v,e)?-1:t===E||t.ownerDocument===v&&y(v,t)?1:u?j(u,e)-j(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===E?-1:t===E?1:i?-1:o?1:u?j(u,e)-j(u,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?fe(a[r],s[r]):a[r]===v?-1:s[r]===v?1:0}),E},H.matches=function(e,t){return H(e,null,null,t)},H.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&C(e),t=t.replace(ee,"='$1']"),g.matchesSelector&&N&&!A[t+" "]&&(!r||!r.test(t))&&(!m||!m.test(t)))try{var n=i.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(F){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(d,p),e[3]=(e[3]||e[4]||e[5]||"").replace(d,p),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||H.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&H.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return f.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&te.test(n)&&(t=(t=w(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(d,p).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+a+")"+e+"("+a+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=H.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1(?:<\/\1>|)$/,G=/^.[^:#\[\.,]*$/;function K(e,n,r){if(C.isFunction(n))return C.grep(e,function(e,t){return!!n.call(e,t,e)!==r});if(n.nodeType)return C.grep(e,function(e){return e===n!==r});if("string"==typeof n){if(G.test(n))return C.filter(n,e,r);n=C.filter(n,e)}return C.grep(e,function(e){return-1)[^>]*|#([\w-]*))$/,ee=((C.fn.init=function(e,t,n){if(e){if(n=n||Q,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):C.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(C):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),C.makeArray(e,this));if(!(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Z.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:g,!0)),J.test(r[1])&&C.isPlainObject(t))for(var r in t)C.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r])}else{if((n=g.getElementById(r[2]))&&n.parentNode){if(n.id!==r[2])return Q.find(e);this.length=1,this[0]=n}this.context=g,this.selector=e}}return this}).prototype=C.fn,Q=C(g),/^(?:parents|prev(?:Until|All))/),te={children:!0,contents:!0,next:!0,prev:!0};function ne(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t,n=C(e,this),r=n.length;return this.filter(function(){for(t=0;t
        a",y.leadingWhitespace=3===S.firstChild.nodeType,y.tbody=!S.getElementsByTagName("tbody").length,y.htmlSerialize=!!S.getElementsByTagName("link").length,y.html5Clone="<:nav>"!==g.createElement("nav").cloneNode(!0).outerHTML,q.type="checkbox",q.checked=!0,k.appendChild(q),y.appendChecked=q.checked,S.innerHTML="",y.noCloneChecked=!!S.cloneNode(!0).lastChild.defaultValue,k.appendChild(S),(q=g.createElement("input")).setAttribute("type","radio"),q.setAttribute("checked","checked"),q.setAttribute("name","t"),S.appendChild(q),y.checkClone=S.cloneNode(!0).cloneNode(!0).lastChild.checked,y.noCloneEvent=!!S.addEventListener,S[C.expando]=1,y.attributes=!S.getAttribute(C.expando);var x={option:[1,""],legend:[1,"
        ","
        "],area:[1,"",""],param:[1,"",""],thead:[1,"","
        "],tr:[2,"","
        "],col:[2,"","
        "],td:[3,"","
        "],_default:y.htmlSerialize?[0,"",""]:[1,"X
        ","
        "]};function b(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):undefined;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||C.nodeName(r,t)?o.push(r):C.merge(o,b(r,t));return t===undefined||t&&C.nodeName(e,t)?C.merge([e],o):o}function we(e,t){for(var n,r=0;null!=(n=e[r]);r++)C._data(n,"globalEval",!t||C._data(t[r],"globalEval"))}x.optgroup=x.option,x.tbody=x.tfoot=x.colgroup=x.caption=x.thead,x.th=x.td;var Te=/<|&#?\w+;/,Ce=/"!==f[1]||Ce.test(a)?0:u:u.firstChild)&&a.childNodes.length;o--;)C.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(C.merge(h,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=p.lastChild}else h.push(t.createTextNode(a));for(u&&p.removeChild(u),y.appendChecked||C.grep(b(h,"input"),Ee),g=0;a=h[g++];)if(r&&-1]","i"),Pe=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/\s*$/g,ze=be(g).appendChild(g.createElement("div"));function Xe(e,t){return C.nodeName(e,"table")&&C.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ue(e){return e.type=(null!==C.find.attr(e,"type"))+"/"+e.type,e}function Ve(e){var t=Ie.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ye(e,t){if(1===t.nodeType&&C.hasData(e)){var n,r,i,e=C._data(e),o=C._data(t,e),a=e.events;if(a)for(n in delete o.handle,o.events={},a)for(r=0,i=a[n].length;r")},clone:function(e,t,n){var r,i,o,a,s,u=C.contains(e.ownerDocument,e);if(y.html5Clone||C.isXMLDoc(e)||!Re.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(ze.innerHTML=e.outerHTML,ze.removeChild(o=ze.firstChild)),!(y.noCloneEvent&&y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(r=b(o),s=b(e),a=0;null!=(i=s[a]);++a)if(r[a]){f=c=l=p=d=void 0;var l,c,f,d=i,p=r[a];if(1===p.nodeType){if(l=p.nodeName.toLowerCase(),!y.noCloneEvent&&p[C.expando]){for(c in(f=C._data(p)).events)C.removeEvent(p,c,f.handle);p.removeAttribute(C.expando)}"script"===l&&p.text!==d.text?(Ue(p).text=d.text,Ve(p)):"object"===l?(p.parentNode&&(p.outerHTML=d.outerHTML),y.html5Clone&&d.innerHTML&&!C.trim(p.innerHTML)&&(p.innerHTML=d.innerHTML)):"input"===l&&ge.test(d.type)?(p.defaultChecked=p.checked=d.checked,p.value!==d.value&&(p.value=d.value)):"option"===l?p.defaultSelected=p.selected=d.defaultSelected:"input"!==l&&"textarea"!==l||(p.defaultValue=d.defaultValue)}}if(t)if(n)for(s=s||b(e),r=r||b(o),a=0;null!=(i=s[a]);a++)Ye(i,r[a]);else Ye(e,o);return 0<(r=b(o,"script")).length&&we(r,!u&&b(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=C.expando,u=C.cache,l=y.attributes,c=C.event.special;null!=(n=e[a]);a++)if((t||v(n))&&(o=(i=n[s])&&u[i])){if(o.events)for(r in o.events)c[r]?C.event.remove(n,r):C.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=undefined:n.removeAttribute(s),f.push(i))}}}),C.fn.extend({domManip:w,detach:function(e){return Je(this,e,!0)},remove:function(e){return Je(this,e)},text:function(e){return d(this,function(e){return e===undefined?C.text(this):this.empty().append((this[0]&&this[0].ownerDocument||g).createTextNode(e))},null,e,arguments.length)},append:function(){return w(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Xe(this,e).appendChild(e)})},prepend:function(){return w(this,arguments,function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(t=Xe(this,e)).insertBefore(e,t.firstChild)})},before:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&C.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&C.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return d(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return 1===t.nodeType?t.innerHTML.replace(Oe,""):undefined;if("string"==typeof e&&!Be.test(e)&&(y.htmlSerialize||!Re.test(e))&&(y.leadingWhitespace||!ve.test(e))&&!x[(me.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n")).appendTo(t.documentElement))[0].contentWindow||Ge[0].contentDocument).document).write(),t.close(),n=Qe(e,t),Ge.detach()),Ke[e]=n),n}var n,et,tt,nt,rt,it,ot,a,at=/^margin/,st=new RegExp("^("+e+")(?!px)[a-z%]+$","i"),ut=function(e,t,n,r){var i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.apply(e,r||[]),t)e.style[i]=o[i];return r},lt=g.documentElement;function t(){var e,t=g.documentElement;t.appendChild(ot),a.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=tt=it=!1,et=rt=!0,T.getComputedStyle&&(e=T.getComputedStyle(a),n="1%"!==(e||{}).top,it="2px"===(e||{}).marginLeft,tt="4px"===(e||{width:"4px"}).width,a.style.marginRight="50%",et="4px"===(e||{marginRight:"4px"}).marginRight,(e=a.appendChild(g.createElement("div"))).style.cssText=a.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",e.style.marginRight=e.style.width="0",a.style.width="1px",rt=!parseFloat((T.getComputedStyle(e)||{}).marginRight),a.removeChild(e)),a.style.display="none",(nt=0===a.getClientRects().length)&&(a.style.display="",a.innerHTML="
        t
        ",a.childNodes[0].style.borderCollapse="separate",(e=a.getElementsByTagName("td"))[0].style.cssText="margin:0;border:0;padding:0;display:none",nt=0===e[0].offsetHeight)&&(e[0].style.display="",e[1].style.display="none",nt=0===e[0].offsetHeight),t.removeChild(ot)}ot=g.createElement("div"),(a=g.createElement("div")).style&&(a.style.cssText="float:left;opacity:.5",y.opacity="0.5"===a.style.opacity,y.cssFloat=!!a.style.cssFloat,a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===a.style.backgroundClip,(ot=g.createElement("div")).style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",a.innerHTML="",ot.appendChild(a),y.boxSizing=""===a.style.boxSizing||""===a.style.MozBoxSizing||""===a.style.WebkitBoxSizing,C.extend(y,{reliableHiddenOffsets:function(){return null==n&&t(),nt},boxSizingReliable:function(){return null==n&&t(),tt},pixelMarginRight:function(){return null==n&&t(),et},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),rt},reliableMarginLeft:function(){return null==n&&t(),it}}));var l,p,ct=/^(top|right|bottom|left)$/;function ft(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}T.getComputedStyle?(l=function(e){var t=e.ownerDocument.defaultView;return(t=t&&t.opener?t:T).getComputedStyle(e)},p=function(e,t,n){var r,i,o=e.style;return""!==(i=(n=n||l(e))?n.getPropertyValue(t)||n[t]:undefined)&&i!==undefined||C.contains(e.ownerDocument,e)||(i=C.style(e,t)),n&&!y.pixelMarginRight()&&st.test(i)&&at.test(t)&&(e=o.width,t=o.minWidth,r=o.maxWidth,o.minWidth=o.maxWidth=o.width=i,i=n.width,o.width=e,o.minWidth=t,o.maxWidth=r),i===undefined?i:i+""}):lt.currentStyle&&(l=function(e){return e.currentStyle},p=function(e,t,n){var r,i,o,a=e.style;return null==(n=(n=n||l(e))?n[t]:undefined)&&a&&a[t]&&(n=a[t]),st.test(n)&&!ct.test(t)&&(r=a.left,(o=(i=e.runtimeStyle)&&i.left)&&(i.left=e.currentStyle.left),a.left="fontSize"===t?"1em":n,n=a.pixelLeft+"px",a.left=r,o)&&(i.left=o),n===undefined?n:n+""||"auto"});var dt=/alpha\([^)]*\)/i,pt=/opacity\s*=\s*([^)]*)/i,ht=/^(none|table(?!-c[ea]).+)/,gt=new RegExp("^("+e+")(.*)$","i"),mt={position:"absolute",visibility:"hidden",display:"block"},yt={letterSpacing:"0",fontWeight:"400"},vt=["Webkit","O","Moz","ms"],xt=g.createElement("div").style;function bt(e){if(e in xt)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=vt.length;n--;)if((e=vt[n]+t)in xt)return e}function wt(e,t){for(var n,r,i,o=[],a=0,s=e.length;a
        a",F=q.getElementsByTagName("a")[0],k.setAttribute("type","checkbox"),q.appendChild(k),(F=q.getElementsByTagName("a")[0]).style.cssText="top:1px",y.getSetAttribute="t"!==q.className,y.style=/top/.test(F.getAttribute("style")),y.hrefNormalized="/a"===F.getAttribute("href"),y.checkOn=!!k.value,y.optSelected=e.selected,y.enctype=!!g.createElement("form").enctype,S.disabled=!0,y.optDisabled=!e.disabled,(k=g.createElement("input")).setAttribute("value",""),y.input=""===k.getAttribute("value"),k.value="t",k.setAttribute("type","radio"),y.radioValue="t"===k.value;var Lt=/\r/g,Ht=/[\x20\t\r\n\f]+/g;C.fn.extend({val:function(t){var n,e,r,i=this[0];return arguments.length?(r=C.isFunction(t),this.each(function(e){1!==this.nodeType||(null==(e=r?t.call(this,e,C(this).val()):t)?e="":"number"==typeof e?e+="":C.isArray(e)&&(e=C.map(e,function(e){return null==e?"":e+""})),(n=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&n.set(this,e,"value")!==undefined)||(this.value=e)})):i?(n=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in n&&(e=n.get(i,"value"))!==undefined?e:"string"==typeof(e=i.value)?e.replace(Lt,""):null==e?"":e:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:C.trim(C.text(e)).replace(Ht," ")}},select:{get:function(e){for(var t,n=e.options,r=e.selectedIndex,i="select-one"===e.type||r<0,o=i?null:[],a=i?r+1:n.length,s=r<0?a:i?r:0;s").append(C.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this)},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.filters.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var r,i,o,a,s=C.css(e,"position"),u=C(e),l={};"static"===s&&(e.style.position="relative"),o=u.offset(),r=C.css(e,"top"),a=C.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1'+(o?n.title[0]:n.title)+"
        ":"";return n.zIndex=a,t([n.shade?'
        ':"",'
        '+(e&&2!=n.type?"":o)+'
        '+(0==n.type&&-1!==n.icon?'':"")+((1!=n.type||!e)&&n.content||"")+'
        '+(i=s?'':"",n.closeBtn&&(i+=''),i)+""+(n.btn?function(){var e="";"string"==typeof n.btn&&(n.btn=[n.btn]);for(var t=0,i=n.btn.length;t'+n.btn[t]+"";return'
        '+e+"
        "}():"")+(n.resize?'':"")+"
        "],o,h('
        ')),this},t.pt.creat=function(){var e,n=this,a=n.config,o=n.index,s="object"==typeof(l=a.content),r=h("body");if(!a.id||!h("#"+a.id)[0]){switch("string"==typeof a.area&&(a.area="auto"===a.area?["",""]:[a.area,""]),a.shift&&(a.anim=a.shift),6==m.ie&&(a.fixed=!1),a.type){case 0:a.btn="btn"in a?a.btn:c.btn[0],m.closeAll("dialog");break;case 2:var l=a.content=s?a.content:[a.content||"","auto"];a.content='';break;case 3:delete a.title,delete a.closeBtn,-1===a.icon&&a.icon,m.closeAll("loading");break;case 4:s||(a.content=[a.content,"body"]),a.follow=a.content[1],a.content=a.content[0]+'',delete a.title,a.tips="object"==typeof a.tips?a.tips:[a.tips,!0],a.tipsMore||m.closeAll("tips")}n.vessel(s,function(e,t,i){r.append(e[0]),s?2==a.type||4==a.type?h("body").append(e[1]):l.parents("."+d[0])[0]||(l.data("display",l.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),h("#"+d[0]+o).find("."+d[5]).before(t)):r.append(e[1]),h("#"+d.MOVE)[0]||r.append(c.moveElem=i),n.layero=h("#"+d[0]+o),n.shadeo=h("#"+d.SHADE+o),a.scrollbar||d.html.css("overflow","hidden").attr("layer-full",o)}).auto(o),n.shadeo.css({"background-color":a.shade[1]||"#000",opacity:a.shade[0]||a.shade}),2==a.type&&6==m.ie&&n.layero.find("iframe").attr("src",l[0]),4==a.type?n.tips():(n.offset(),parseInt(c.getStyle(document.getElementById(d.MOVE),"z-index"))||(n.layero.css("visibility","hidden"),m.ready(function(){n.offset(),n.layero.css("visibility","visible")}))),a.fixed&&f.on("resize",function(){n.offset(),(/^\d+%$/.test(a.area[0])||/^\d+%$/.test(a.area[1]))&&n.auto(o),4==a.type&&n.tips()}),a.time<=0||setTimeout(function(){m.close(n.index)},a.time),n.move().callback(),d.anim[a.anim]&&(e="layer-anim "+d.anim[a.anim],n.layero.addClass(e).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h(this).removeClass(e)})),a.isOutAnim&&n.layero.data("isOutAnim",!0)}},t.pt.auto=function(e){var t=this.config,i=h("#"+d[0]+e),n=(""===t.area[0]&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(d[1]).outerHeight()||0,o=i.find("."+d[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+d[5])):t.fixed&&n[1]>=f.height()&&(n[1]=f.height(),e("."+d[5])):e("."+d[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(f.height()-n[1])/2,e.offsetLeft=(f.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=f.width()-n[0]:"b"===t.offset?e.offsetTop=f.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=f.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=f.width()-n[0]):"rb"===t.offset?(e.offsetTop=f.height()-n[1],e.offsetLeft=f.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?f.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?f.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=f.scrollTop(),e.offsetLeft+=f.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=f.height()-(i.find(d[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=h(e.follow),a={width:(n=n[0]?n:h("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0":'',o=i.success;return delete i.success,m.open(h.extend({type:1,btn:["确定","取消"],content:t,skin:"layui-layer-prompt"+g("prompt"),maxWidth:f.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof o&&o(e)},resize:!1,yes:function(e){var t=a.val();""===t?a.focus():t.length>(i.maxlength||500)?m.tips("最多输入"+(i.maxlength||500)+"个字数",a,{tips:1}):n&&n(t,e,a)}},i))},m.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,m.open(h.extend({type:1,skin:"layui-layer-tab"+g("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
          '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
        ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=h(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},m.photos=function(i,e,n){var a={};if((i=i||{}).photos){var t=!("string"==typeof i.photos||i.photos instanceof h),o=t?i.photos:{},s=o.data||[],r=o.start||0,l=(a.imgIndex=1+(0|r),i.img=i.img||"img",i.success);if(delete i.success,t){if(0===s.length)return m.msg("没有图片")}else{var f=h(i.photos),c=function(){s=[],f.find(i.img).each(function(e){var t=h(this);t.attr("layer-index",e),s.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(c(),0===s.length)return;if(e||f.on("click",i.img,function(){c();var e=h(this).attr("layer-index");m.photos(h.extend(i,{photos:{start:e,data:s,tab:i.tab},full:i.full}),!0)}),!e)return}a.imgprev=function(e){a.imgIndex--,a.imgIndex<1&&(a.imgIndex=s.length),a.tabimg(e)},a.imgnext=function(e,t){a.imgIndex++,a.imgIndex>s.length&&(a.imgIndex=1,t)||a.tabimg(e)},a.keyup=function(e){var t;a.end||(t=e.keyCode,e.preventDefault(),37===t?a.imgprev(!0):39===t?a.imgnext(!0):27===t&&m.close(a.index))},a.tabimg=function(e){if(!(s.length<=1))return o.start=a.imgIndex-1,m.close(a.index),m.photos(i,!0,e)},a.event=function(){a.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),a.imgprev(!0)}),a.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),a.imgnext(!0)}),h(document).on("keyup",a.keyup)},a.loadi=m.load(1,{shade:!("shade"in i)&&.9,scrollbar:!1});var t=s[r].src,d=function(e){var t;m.close(a.loadi),n&&(i.anim=-1),a.index=m.open(h.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[h(p).width()-100,h(p).height()-100],!i.full&&(t[0]'+(s[r].alt||'+(1
        '+(s[r].alt||"")+""+a.imgIndex+" / "+s.length+"
        ":"")+"",success:function(e,t){a.bigimg=e.find(".layui-layer-phimg"),a.imgsee=e.find(".layui-layer-imgbar"),a.event(e),i.tab&&i.tab(s[r],e),"function"==typeof l&&l(e)},end:function(){a.end=!0,h(document).off("keyup",a.keyup)}},i))},u=function(){m.close(a.loadi),m.msg("当前图片地址异常
        是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){1',t.bar1?'
      • '+l[0]+"
      • ":"",t.bar2?'
      • '+l[1]+"
      • ":"",'
      • '+l[2]+"
      • ",""].join("")),c=l.find("."+o),g=function(){a.scrollTop()>=t.showHeight?e||(c.show(),e=1):e&&(c.hide(),e=0)};u("."+n)[0]||("object"==typeof t.css&&l.css(t.css),r.append(l),g(),l.find("li").on("click",function(){var e=u(this).attr("lay-type");"top"===e&&u("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,e)}),a.on("scroll",function(){clearTimeout(i),i=setTimeout(function(){g()},100)}))},countdown:function(e,t,i){var n=this,o="function"==typeof t,a=new Date(e).getTime(),r=new Date(!t||o?(new Date).getTime():t).getTime(),a=a-r,l=[Math.floor(a/864e5),Math.floor(a/36e5)%24,Math.floor(a/6e4)%60,Math.floor(a/1e3)%60],o=(o&&(i=t),setTimeout(function(){n.countdown(e,r+1e3,i)},1e3));return i&&i(0]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},unescape:function(e){return e!==undefined&&null!==e||(e=""),(e+="").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/g,"'").replace(/\"/g,'"')},toVisibleArea:function(e){var t,i,n,o,a,r,l,c;(e=u.extend({margin:160,duration:200,type:"y"},e)).scrollElem[0]&&e.thisElem[0]&&(t=e.scrollElem,l=e.thisElem,n=(a="y"===e.type)?"top":"left",o=t[i=a?"scrollTop":"scrollLeft"](),a=t[a?"height":"width"](),r=t.offset()[n],c={},(l=l.offset()[n]-r)>a-e.margin||l."+y,k=function(e){var i=this;i.index=++c.index,i.config=s.extend({},i.config,c.config,e),i.init()};k.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300},k.prototype.reload=function(e){var i=this;i.config=s.extend({},i.config,e),i.init(!0)},k.prototype.init=function(e){var i=this,t=i.config,n=t.elem=s(t.elem);return 1",(t="href"in i?''+l+"":l,n?'
        '+t+("parent"===o?'':"group"===o&&u.isAllowSpread?'':"")+"
        ":'
        '+t+"
        "),""].join(""))).data("item",i),n&&(a=s('
        '),t=s("
          "),"parent"===o?(a.append(d(t,i.child)),l.append(a)):l.append(d(t,i.child))),r.append(l))}),r},t=['
          ',"
          "].join("");!(e="contextmenu"!==u.trigger&&!lay.isTopElem(u.elem[0])?e:!0)&&u.elem.data(r+"_opened")||(n.elemView=s(t),n.elemView.append(u.content||(e=s('
            '),0no menu'),e)),u.className&&n.elemView.addClass(u.className),u.style&&n.elemView.attr("style",u.style),c.thisId=u.id,n.remove(),i.append(n.elemView),u.elem.data(r+"_opened",!0),n.position(),(p.prevElem=n.elemView).data("prevElem",u.elem),n.elemView.find(".layui-menu").on(l,function(e){layui.stope(e)}),n.elemView.find(".layui-menu li").on("click",function(e){var i=s(this),t=i.data("item")||{};t.child&&0n.width()&&(t.addClass(C),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(C),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()))}).on("mouseleave",t,function(e){var i=s(this).children("."+w);i.removeClass(C),i.css("margin-top",0)}),c.reload=function(e,i){e=p.getThis(e);return e?(e.reload(i),p.call(e)):this},c.render=function(e){e=new k(e);return p.call(e)},e(o,c)});layui.define("jquery",function(e){"use strict";var h=layui.$,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var i=this;return i.config=h.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,a,e,i)}},a="slider",c="layui-disabled",y="layui-slider-bar",g="layui-slider-wrap",b="layui-slider-wrap-btn",x="layui-slider-tips",T="layui-slider-input-txt",w="layui-slider-hover",i=function(e){var i=this;i.index=++t.index,i.config=h.extend({},i.config,t.config,e),i.render()};i.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},i.prototype.render=function(){var a,n=this,l=n.config,e=(l.step<1&&(l.step=1),l.maxl.min?i:l.min,l.value[1]=s>l.min?s:l.min,l.value[0]=l.value[0]>l.max?l.max:l.value[0],l.value[1]=l.value[1]>l.max?l.max:l.value[1],i=Math.floor((l.value[0]-l.min)/(l.max-l.min)*100),t=(s=Math.floor((l.value[1]-l.min)/(l.max-l.min)*100))-i+"%",i+="%",s+="%"):("object"==typeof l.value&&(l.value=Math.min.apply(null,l.value)),l.valuel.max&&(l.value=l.max),t=Math.floor((l.value-l.min)/(l.max-l.min)*100)+"%"),l.disabled?"#c2c2c2":l.theme),i='
            '+(l.tips?'
            ':"")+'
            '+(l.range?'
            ':"")+"
            ",t=h(l.elem),s=t.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=h(i),l.range?(n.elemTemp.find("."+g).eq(0).data("value",l.value[0]),n.elemTemp.find("."+g).eq(1).data("value",l.value[1])):n.elemTemp.find("."+g).data("value",l.value),t.html(n.elemTemp),"vertical"===l.type&&n.elemTemp.height(l.height+"px"),l.showstep){for(var r=(l.max-l.min)/l.step,o="",u=1;u<1+r;u++){var d=100*u/r;d<100&&(o+='
            ')}n.elemTemp.append(o)}l.input&&!l.range&&(e=h('
            '),t.css("position","relative"),t.append(e),t.find("."+T).children("input").val(l.value),"vertical"===l.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),l.disabled?(n.elemTemp.addClass(c),n.elemTemp.find("."+b).addClass(c)):n.slide(),n.elemTemp.find("."+b).on("mouseover",function(){var e="vertical"===l.type?l.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+g),t=("vertical"===l.type?e-h(this).parent()[0].offsetTop-i.height():h(this).parent()[0].offsetLeft)/e*100,i=h(this).parent().data("value"),e=l.setTips?l.setTips(i):i;n.elemTemp.find("."+x).html(e),clearTimeout(a),a=setTimeout(function(){"vertical"===l.type?n.elemTemp.find("."+x).css({bottom:t+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+x).css({left:t+"%",display:"inline-block"})},300)}).on("mouseout",function(){clearTimeout(a),n.elemTemp.find("."+x).css("display","none")})},i.prototype.slide=function(e,i,t){var r=this.config,o=this.elemTemp,u=function(){return"vertical"===r.type?r.height:o[0].offsetWidth},d=o.find("."+g),s=o.next(".layui-slider-input"),c=s.children("."+T).children("input").val(),m=100/((r.max-r.min)/Math.ceil(r.step)),v=function(e,i){e=100<(e=100t[1]&&t.reverse(),r.change&&r.change(r.range?t:n)},p=function(e){var i=e/u()*100/m,t=Math.round(i)*m;return t=e==u()?Math.ceil(i)*m:t},f=h(['
            u()?u():i)/u()*100/m;v(i,l),s.addClass(w),o.find("."+x).show(),e.preventDefault()},i=function(){s.removeClass(w),o.find("."+x).hide()},t=function(){i&&i(),f.remove()},h("#LAY-slider-moving")[0]||h("body").append(f),f.on("mousemove",e),f.on("mouseup",t).on("mouseleave",t)})}),o.on("click",function(e){var i,t=h("."+b);!t.is(event.target)&&0===t.has(event.target).length&&t.length&&(i=(t=(t=(t="vertical"===r.type?u()-e.clientY+h(this).offset().top:e.clientX-h(this).offset().left)<0?0:t)>u()?u():t)/u()*100/m,t=r.range?"vertical"===r.type?Math.abs(t-parseInt(h(d[0]).css("bottom")))>Math.abs(t-parseInt(h(d[1]).css("bottom")))?1:0:Math.abs(t-d[0].offsetLeft)>Math.abs(t-d[1].offsetLeft)?1:0:0,v(i,t),e.preventDefault())}),s.children(".layui-slider-input-btn").children("i").each(function(i){h(this).on("click",function(){c=s.children("."+T).children("input").val();var e=((c=1==i?c-r.stepr.max?r.max:Number(c)+r.step)-r.min)/(r.max-r.min)*100/m;v(e,0)})});var a=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)r.max?r.max:e,((this.value=e)-r.min)/(r.max-r.min)*100/m);v(e,0)};s.children("."+T).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),a.call(this))}).on("change",a)},i.prototype.events=function(){this.config},t.render=function(e){e=new i(e);return function(){var t=this,a=t.config;return{setValue:function(e,i){return a.value=e,t.slide("set",e,i||0)},config:a}}.call(e)},e(a,t)});layui.define(["jquery","lay"],function(e){"use strict";var y=layui.jquery,o=layui.lay,r=layui.device().mobile?"click":"mousedown",i={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var i=this;return i.config=y.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},n="layui-colorpicker",l=".layui-colorpicker-main",m="layui-icon-down",x="layui-icon-close",P="layui-colorpicker-trigger-span",C="layui-colorpicker-trigger-i",B="layui-colorpicker-side-slider",w="layui-colorpicker-basis",D="layui-colorpicker-alpha-bgcolor",j="layui-colorpicker-alpha-slider",E="layui-colorpicker-basis-cursor",F="layui-colorpicker-main-input",H=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),n=r-o;return i.b=r,i.s=0!=r?255*n/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/n:e.g==r?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},M=function(e){var i,o={},r=e.h,n=255*e.s/100,e=255*e.b/100;return 0==n?o.r=o.g=o.b=e:(e=r%60*((i=e)-(n=(255-n)*e/255))/60,(r=360==r?0:r)<60?(o.r=i,o.b=n,o.g=n+e):r<120?(o.g=i,o.b=n,o.r=i-e):r<180?(o.g=i,o.r=n,o.b=n+e):r<240?(o.b=i,o.r=n,o.g=i-e):r<300?(o.b=i,o.g=n,o.r=n+e):r<360?(o.r=i,o.g=n,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},f=function(e){var e=M(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return y.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},Y=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},I=y(window),t=y(document),c=function(e){this.index=++i.index,this.config=y.extend({},this.config,i.config,e),this.render()};c.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},c.prototype.render=function(){var e=this,i=e.config,o=y(['
            ',"",'','',"","","
            "].join("")),r=y(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),r.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+P)[0].style.background,e.events()},c.prototype.renderPicker=function(){var o,e=this,i=e.config,r=e.elemColorBox[0],i=e.elemPicker=y(['
            ','
            ','
            ','
            ','
            ','
            ',"
            ",'
            ','
            ',"
            ","
            ",'
            ','
            ','
            ',"
            ","
            ",i.predefine?(o=['
            '],layui.each(i.colors,function(e,i){o.push(['
            ','
            ',"
            "].join(""))}),o.push("
            "),o.join("")):"",'
            ','
            ','',"
            ",'
            ','','',"","
            "].join(""));e.elemColorBox.find("."+P)[0];y(l)[0]&&y(l).data("index")==e.index?e.removePicker(c.thisElemInd):(e.removePicker(c.thisElemInd),y("body").append(i)),c.thisElemInd=e.index,c.thisColor=r.style.background,e.position(),e.pickerEvents()},c.prototype.removePicker=function(e){this.config;return y("#layui-colorpicker"+(e||this.index)).remove(),this},c.prototype.position=function(){var e=this,i=e.config;return o.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},c.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+P)),r=i.elemPicker.find("."+F),n=o[0].style.backgroundColor;n?(e=H(Y(n)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o&&r.find("input").val(n),"rgba"===o&&(e=Y(n),3==(n.match(/[0-9]{1,3}/g)||[]).length?(r.find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", 1)"),i.elemPicker.find("."+j).css("left",280)):(r.find("input").val(n),o=280*n.slice(n.lastIndexOf(",")+1,n.length-1),i.elemPicker.find("."+j).css("left",o)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))")):(i.select(0,100,100),r.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+j).css("left",280))},c.prototype.side=function(){var n=this,l=n.config,t=n.elemColorBox.find("."+P),c=t.attr("lay-type"),a=n.elemPicker.find(".layui-colorpicker-side"),e=n.elemPicker.find("."+B),s=n.elemPicker.find("."+w),r=n.elemPicker.find("."+E),d=n.elemPicker.find("."+D),f=n.elemPicker.find("."+j),u=e[0].offsetTop/180*360,p=100-(r[0].offsetTop+3)/180*100,g=(r[0].offsetLeft+3)/260*100,h=Math.round(f[0].offsetLeft/280*100)/100,v=n.elemColorBox.find("."+C),i=n.elemPicker.find(".layui-colorpicker-pre").children("div"),b=function(e,i,o,r){n.select(e,i,o);e=M({h:e,s:i,b:o});v.addClass(m).removeClass(x),t[0].style.background="rgb("+e.r+", "+e.g+", "+e.b+")","torgb"===c&&n.elemPicker.find("."+F).find("input").val("rgb("+e.r+", "+e.g+", "+e.b+")"),"rgba"===c&&(f.css("left",280*r),n.elemPicker.find("."+F).find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", "+r+")"),t[0].style.background="rgba("+e.r+", "+e.g+", "+e.b+", "+r+")",d[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))"),l.change&&l.change(n.elemPicker.find("."+F).find("input").val())},o=y(['
            '].join("")),k=function(e){y("#LAY-colorpicker-moving")[0]||y("body").append(o),o.on("mousemove",e),o.on("mouseup",function(){o.remove()}).on("mouseleave",function(){o.remove()})};e.on("mousedown",function(e){var r=this.offsetTop,n=e.clientY;k(function(e){var i=r+(e.clientY-n),o=a[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;b(u=o,g,p,h),e.preventDefault()}),e.preventDefault()}),a.on("click",function(e){var i=e.clientY-y(this).offset().top,i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;b(u=i,g,p,h),e.preventDefault()}),r.on("mousedown",function(e){var l=this.offsetTop,t=this.offsetLeft,c=e.clientY,a=e.clientX;layui.stope(e),k(function(e){var i=l+(e.clientY-c),o=t+(e.clientX-a),r=s[0].offsetHeight-3,n=s[0].offsetWidth-3,n=((o=n<(o=o<-3?-3:o)?n:o)+3)/260*100,o=100-((i=r<(i=i<-3?-3:i)?r:i)+3)/180*100;b(u,g=n,p=o,h),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-y(this).offset().top-3+I.scrollTop(),o=e.clientX-y(this).offset().left-3+I.scrollLeft(),o=((i=i<-3?-3:i)>this.offsetHeight-3&&(i=this.offsetHeight-3),((o=(o=o<-3?-3:o)>this.offsetWidth-3?this.offsetWidth-3:o)+3)/260*100),i=100-(i+3)/180*100;b(u,g=o,p=i,h),layui.stope(e),e.preventDefault(),r.trigger(e,"mousedown")}),f.on("mousedown",function(e){var r=this.offsetLeft,n=e.clientX;k(function(e){var i=r+(e.clientX-n),o=d[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);b(u,g,p,h=o),e.preventDefault()}),e.preventDefault()}),d.on("click",function(e){var i=e.clientX-y(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);b(u,g,p,h=i),e.preventDefault()}),i.each(function(){y(this).on("click",function(){y(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=H(Y(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);u=i.h,g=i.s,p=i.b,3==(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),h=o,b(i.h,i.s,i.b,o)})})},c.prototype.select=function(e,i,o,r){var n=this,l=(n.config,f({h:e,s:100,b:100})),t=f({h:e,s:i,b:o}),e=e/360*180,o=180-o/100*180-3,i=i/100*260-3;n.elemPicker.find("."+B).css("top",e),n.elemPicker.find("."+w)[0].style.background="#"+l,n.elemPicker.find("."+E).css({top:o,left:i}),"change"!==r&&n.elemPicker.find("."+F).find("input").val("#"+t)},c.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+P),d=c.elemPicker.find("."+F+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+C).removeClass(m).addClass(x),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,r,n=d.val(),l=n,t={};-1>16,g:(65280&o)>>8,b:255&o},t=H(r),s[0].style.background=l="#"+f(t),c.elemColorBox.find("."+C).removeClass(x).addClass(m)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(l)):(c.color=n,a.done&&a.done(n),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=y(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=y(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},c.prototype.events=function(){var i=this,e=i.config,o=i.elemColorBox.find("."+P);i.elemColorBox.on("click",function(){i.renderPicker(),y(l)[0]&&(i.val(),i.side())}),e.elem[0]&&!i.elemColorBox[0].eventHandler&&(t.on(r,function(e){y(e.target).hasClass(n)||y(e.target).parents("."+n)[0]||y(e.target).hasClass(l.replace(/\./g,""))||y(e.target).parents(l)[0]||i.elemPicker&&(i.color?(e=H(Y(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+C).removeClass(m).addClass(x),o[0].style.background=i.color||"",i.removePicker())}),I.on("resize",function(){if(!i.elemPicker||!y(l)[0])return!1;i.position()}),i.elemColorBox[0].eventHandler=!0)},i.render=function(e){e=new c(e);return function(){return{config:this.config}}.call(e)},e("colorpicker",i)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),c="element",r="layui-this",y="layui-show",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,c,t,i)},i.prototype.tabAdd=function(t,i){var a,t=u(".layui-tab[lay-filter="+t+"]"),e=t.children(".layui-tab-title"),l=e.children(".layui-tab-bar"),t=t.children(".layui-tab-content"),n=""+(i.title||"unnaming")+"";return l[0]?l.before(n):e.append(n),t.append('
            '+(i.content||"")+"
            "),C.hideTabMore(!0),C.tabAuto(),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabDelete(null,t),this},i.prototype.tabChange=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabClick.call(t[0],null,null,t),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(this).index();C.tabClick.call(this,t,i,null,a)})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",i).attr("lay-percent",i),a.text(i),this},".layui-nav"),f="layui-nav-item",l="layui-nav-bar",p="layui-nav-tree",b="layui-nav-child",v="layui-nav-more",m="layui-anim layui-anim-upbit",C={tabClick:function(t,i,a,e){e=e||{};var a=a||u(this),i=i||a.parent().children("li").index(a),l=e.headerElem?a.parent():a.parents(".layui-tab").eq(0),e=e.bodyElem?u(e.bodyElem):l.children(".layui-tab-content").children(".layui-tab-item"),n=a.find("a"),n="javascript:;"!==n.attr("href")&&"_blank"===n.attr("target"),s="string"==typeof a.attr("lay-unselect"),o=l.attr("lay-filter");n||s||(a.addClass(r).siblings().removeClass(r),e.eq(i).addClass(y).siblings().removeClass(y)),layui.event.call(this,c,"tab("+o+")",{elem:l,index:i})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.index(),e=i.parents(".layui-tab").eq(0),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter");i.hasClass(r)&&(i.next()[0]?C.tabClick.call(i.next()[0],null,a+1):i.prev()[0]&&C.tabClick.call(i.prev()[0],null,a-1)),i.remove(),l.eq(a).remove(),setTimeout(function(){C.tabAuto()},50),layui.event.call(this,c,"tabDelete("+n+")",{elem:e,index:a})},tabAuto:function(){var e="layui-tab-bar",l="layui-tab-close",n=this;u(".layui-tab").each(function(){var t=u(this),i=t.children(".layui-tab-title"),a=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),a=u('');n===window&&8!=d.ie&&C.hideTabMore(!0),t.attr("lay-allowClose")&&i.find("li").each(function(){var t,i=u(this);i.find("."+l)[0]||((t=u('')).on("click",C.tabDelete),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(i.prop("scrollWidth")>i.outerWidth()+1?i.find("."+e)[0]||(i.append(a),t.attr("overflow",""),a.on("click",function(t){i[this.title?"removeClass":"addClass"]("layui-tab-more"),this.title=this.title?"":"\u6536\u7f29"})):(i.find("."+e).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.parents(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+b),n="string"==typeof e.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+r).removeClass(r),e.addClass(r)),i.hasClass(p)&&(l.removeClass(m),l[0])&&(e["none"===l.css("display")?"addClass":"removeClass"](f+"ed"),"all"===i.attr("lay-shrink"))&&e.siblings().removeClass(f+"ed"),layui.event.call(this,c,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+y)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(y)),a[n?"addClass":"removeClass"](y),i.html(n?"":""),layui.event.call(this,c,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a=i?'[lay-filter="'+i+'"]':"",i={tab:function(){C.tabAuto.call({})},nav:function(){var s={},o={},c={},r="layui-nav-title";u(h+a).each(function(t){var i=u(this),a=u(''),e=i.find("."+f);i.find("."+l)[0]||(i.append(a),(i.hasClass(p)?e.find("dd,>."+r):e).on("mouseenter",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+b);i.hasClass(p)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(m),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(y),l.find("."+v).addClass(v+"d")},300))}.call(this,a,i,t)}).on("mouseleave",function(){i.hasClass(p)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+b).removeClass(y),i.find("."+v).removeClass(v+"d")},300))}),i.on("mouseleave",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(p)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)})),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+b)[0]&&!t.children("."+v)[0]&&t.append(''),t.off("click",C.clickThis).on("click",C.clickThis)})})},breadcrumb:function(){u(".layui-breadcrumb"+a).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(){var e="layui-progress";u("."+e+a).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a),t.attr("lay-showPercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(){u(".layui-collapse"+a).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",C.collapse).on("click",C.collapse)})})}};return i[t]?i[t]():layui.each(i,function(t,i){i()})},new i),e=u(document);u(function(){a.render()});e.on("click",".layui-tab-title li",C.tabClick),e.on("click",C.hideTabMore),u(window).on("resize",C.tabAuto),t(c,a)});layui.define("layer",function(e){"use strict";var v=layui.$,t=layui.layer,r=layui.hint(),y=layui.device(),i={config:{},set:function(e){var t=this;return t.config=v.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,n,e,t)}},n="upload",o="layui-upload-file",a="layui-upload-form",F="layui-upload-iframe",b="layui-upload-choose",x=function(e){var t=this;t.config=v.extend({},t.config,i.config,e),t.render()};x.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},x.prototype.render=function(e){var t=this;(e=t.config).elem=v(e.elem),e.bindAction=v(e.bindAction),t.file(),t.events()},x.prototype.file=function(){var e=this,t=e.config,i=e.elemFile=v(['"].join("")),n=t.elem.next();(n.hasClass(o)||n.hasClass(a))&&n.remove(),y.ie&&y.ie<10&&t.elem.wrap('
            '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),y.ie&&y.ie<10&&e.initIE()},x.prototype.initIE=function(){var i,e=this.config,t=v(''),n=v(['
            ',"
            "].join(""));v("#"+F)[0]||v("body").append(t),e.elem.next().hasClass(a)||(this.elemFile.wrap(n),e.elem.next("."+a).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},x.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},x.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},x.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},x.prototype.upload=function(i,e){var n,o,t,a,l=this,r=l.config,u=l.elemFile[0],c=function(){var t=0,o=0,e=i||l.files||l.chooseFiles||u.files,a=function(){r.multiple&&t+o===l.fileLength&&"function"==typeof r.allDone&&r.allDone({total:l.fileLength,successful:t,failed:o})};layui.each(e,function(i,e){var n=new FormData,e=(n.append(r.field,e),layui.each(r.data,function(e,t){t="function"==typeof t?t():t,n.append(e,t)}),{url:r.url,type:"post",data:n,contentType:!1,processData:!1,dataType:"json",headers:r.headers||{},success:function(e){t++,s(i,e),a()},error:function(e){o++,l.msg("Request URL is abnormal: "+(e.statusText||"error")),p(i),a()}});"function"==typeof r.progress&&(e.xhr=function(){var e=v.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),r.progress(t,(r.item||r.elem)[0],e,i))}),e}),v.ajax(e)})},f=function(){var n=v("#"+F);l.elemFile.parent().submit(),clearInterval(x.timer),x.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){l.msg("Cross-domain requests are not supported"),clearInterval(x.timer),p()}e&&(clearInterval(x.timer),t.html(""),s(0,e))},30)},s=function(e,t){if(l.elemFile.next("."+b).remove(),u.value="","json"===r.force&&"object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},l.msg("Please return JSON data format")}"function"==typeof r.done&&r.done(t,e||0,function(e){l.upload(e)})},p=function(e){r.auto&&(u.value=""),"function"==typeof r.error&&r.error(e||0,function(e){l.upload(e)})},d=r.exts,m=(o=[],layui.each(i||l.chooseFiles,function(e,t){o.push(t.name)}),o),h={preview:function(e){l.preview(e)},upload:function(e,t){var i={};i[e]=t,l.upload(i)},pushFile:function(){return l.files=l.files||{},layui.each(l.chooseFiles,function(e,t){l.files[e]=t}),l.files},resetFile:function(e,t,i){t=new File([t],i);l.files=l.files||{},l.files[e]=t},clearAllFile:function(){l.files={}}},g={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[r.accept]||"\u6587\u4ef6",m=0===m.length?u.value.match(/[^\/\\]+\..+/g)||[]:m;if(0!==m.length){switch(r.accept){case"file":layui.each(m,function(e,t){if(d&&!RegExp(".\\.("+d+")$","i").test(escape(t)))return n=!0});break;case"video":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return n=!0});break;case"audio":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"mp3|wav|mid")+")$","i").test(escape(t)))return n=!0});break;default:layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(t)))return n=!0})}if(n)return l.msg("\u9009\u62e9\u7684"+g+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),u.value="";if("choose"!==e&&!r.auto||(r.choose&&r.choose(h),"choose"!==e)){if(l.fileLength=(t=0,g=i||l.files||l.chooseFiles||u.files,layui.each(g,function(){t++}),t),r.number&&l.fileLength>r.number)return l.msg("\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+r.number+" \u4e2a\u6587\u4ef6
            \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+l.fileLength+" \u4e2a\u6587\u4ef6");if(01024*r.size&&(t=1<=(t=r.size/1024)?t.toFixed(2)+"MB":r.size+"KB",u.value="",a=t)}),a)return l.msg("\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+a);if(!r.before||!1!==r.before(h))y.ie?(9'+e+"")};o.elem.off("upload.start").on("upload.start",function(){var e=v(this),t=e.attr("lay-data");if(t)try{t=new Function("return "+t)(),n.config=v.extend({},o,t)}catch(i){r.error("Upload element property lay-data configuration item has a syntax error: "+t)}n.config.item=e,n.elemFile[0].click()}),y.ie&&y.ie<10||o.elem.off("upload.over").on("upload.over",function(){v(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){v(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=v(this),t=t.originalEvent.dataTransfer.files||[];i.removeAttr("lay-over"),a(t),o.auto?n.upload():l(t)}),n.elemFile.off("upload.change").on("upload.change",function(){var e=this.files||[];a(e),o.auto?n.upload():l(e)}),o.bindAction.off("upload.action").on("upload.action",function(){n.upload()}),o.elem.data("haveEvents")||(n.elemFile.on("change",function(){v(this).trigger("upload.change")}),o.elem.on("click",function(){n.isFile()||v(this).trigger("upload.start")}),o.drag&&o.elem.on("dragover",function(e){e.preventDefault(),v(this).trigger("upload.over")}).on("dragleave",function(e){v(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),v(this).trigger("upload.drop",e)}),o.bindAction.on("click",function(){v(this).trigger("upload.action")}),o.elem.data("haveEvents",!0))},i.render=function(e){e=new x(e);return function(){var t=this;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}}.call(e)},e(n,i)});layui.define("layer",function(e){"use strict";var C=layui.$,h=layui.layer,l=layui.hint(),w=(layui.device(),"form"),s=".layui-form",T="layui-this",$="layui-hide",E="layui-disabled",t=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}},i=(t.prototype.set=function(e){return C.extend(!0,this.config,e),this},t.prototype.verify=function(e){return C.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return C(s+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,w,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=C(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.value==t&&(this.checked=!0)}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;C(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^checkbox|radio$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var i=this.config,a=C(s+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){e=e||a.find("input,textarea");i.autocomplete&&e.attr("autocomplete",i.autocomplete)},select:function(e){var p,c="\u8bf7\u9009\u62e9",m="layui-form-select",g="layui-select-title",k="layui-select-none",x="",e=e||a.find("select"),b=function(e,t){C(e.target).parent().hasClass(g)&&!t||(C("."+m).removeClass(m+"ed "+m+"up"),p&&x&&p.val(x)),p=null},u=function(a,e,t){var o,r,i,n,s,l,c=C(this),u=a.find("."+g),d=u.find("input"),f=a.find("dl"),h=f.children("dd"),y=f.children("dt"),v=this.selectedIndex;e||(r=c.attr("lay-search"),i=function(){var e=a.offset().top+a.outerHeight()+5-q.scrollTop(),t=f.outerHeight();v=c[0].selectedIndex,a.addClass(m+"ed"),h.removeClass($),y.removeClass($),o=null,h.eq(v).addClass(T).siblings().removeClass(T),e+t>q.height()&&t<=e&&a.addClass(m+"up"),s()},n=function(e){a.removeClass(m+"ed "+m+"up"),d.blur(),o=null,e||l(d.val(),function(e){var t=c[0].selectedIndex;e&&(x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),d.val(x||""))})},s=function(){var e,t,i=f.children("dd."+T);i[0]&&(e=i.position().top,t=f.height(),i=i.height(),t\u65e0\u5339\u914d\u9879

            '):f.find("."+k).remove()},"keyup"),""===t&&f.find("."+k).remove(),s()}).on("blur",function(e){var t=c[0].selectedIndex;p=d,x=C(c[0].options[t]).html(),0===t&&x===d.attr("placeholder")&&(x=""),setTimeout(function(){l(d.val(),function(e){x||d.val("")},"blur")},200)}),h.on("click",function(){var e=C(this),t=e.attr("lay-value"),i=c.attr("lay-filter");return e.hasClass(E)||(e.hasClass("layui-select-tips")?d.val(""):(d.val(e.text()),e.addClass(T)),e.siblings().removeClass(T),c.val(t).removeClass("layui-form-danger"),layui.event.call(this,w,"select("+i+")",{elem:c[0],value:t,othis:a}),n(!0)),!1}),a.find("dl>dt").on("click",function(e){return!1}),C(document).off("click",b).on("click",b))};e.each(function(e,t){var i=C(this),a=i.next("."+m),n=this.disabled,l=t.value,r=C(t.options[t.selectedIndex]),t=t.options[0];if("string"==typeof i.attr("lay-ignore"))return i.show();var o,s="string"==typeof i.attr("lay-search"),t=t&&!t.value&&t.innerHTML||c,r=C(['
            ','
            ','','
            ','
            ',(t=i.find("*"),o=[],layui.each(t,function(e,t){0!==e||t.value?"optgroup"===t.tagName.toLowerCase()?o.push("
            "+t.label+"
            "):o.push('
            '+C.trim(t.innerHTML)+"
            "):o.push('
            '+C.trim(t.innerHTML||c)+"
            ")}),0===o.length&&o.push('
            \u6ca1\u6709\u9009\u9879
            '),o.join("")+"
            "),"
            "].join(""));a[0]&&a.remove(),i.after(r),u.call(this,r,n,s)})},checkbox:function(e){var s={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},e=e||a.find("input[type=checkbox]");e.each(function(e,t){var i=C(this),a=i.attr("lay-skin"),n=(i.attr("lay-text")||"").split("|"),l=this.disabled,r=s[a="switch"===a?"_"+a:a]||s.checkbox;if("string"==typeof i.attr("lay-ignore"))return i.show();var o=i.next("."+r[0]),t=C(['
            ",(l={checkbox:[t.title.replace(/\s/g,"")?""+t.title+"":"",''].join(""),_switch:""+((t.checked?n[0]:n[1])||"")+""})[a]||l.checkbox,"
            "].join(""));o[0]&&o.remove(),i.after(t),function(i,a){var n=C(this);i.on("click",function(){var e=n.attr("lay-filter"),t=(n.attr("lay-text")||"").split("|");n[0].disabled||(n[0].checked?(n[0].checked=!1,i.removeClass(a[1]).find("em").text(t[1])):(n[0].checked=!0,i.addClass(a[1]).find("em").text(t[0])),layui.event.call(n[0],w,a[2]+"("+e+")",{elem:n[0],value:n[0].value,othis:i}))})}.call(this,t,r)})},radio:function(e){var r="layui-form-radio",o=["",""],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=C(this),a=i.next("."+r),n=this.disabled;if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();n=C(['
            ',''+o[t.checked?0:1]+"","
            "+(a=t.title||"",a="string"==typeof i.next().attr("lay-radio")?i.next().html():a)+"
            ","
            "].join(""));i.after(n),function(a){var n=C(this),l="layui-anim-scaleSpring";a.on("click",function(){var e=n[0].name,t=n.parents(s),i=n.attr("lay-filter"),e=t.find("input[name="+e.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(e,function(){var e=C(this).next("."+r);this.checked=!1,e.removeClass(r+"ed"),e.find(".layui-icon").removeClass(l).html(o[1])}),n[0].checked=!0,a.addClass(r+"ed"),a.find(".layui-icon").addClass(l).html(o[0]),layui.event.call(n[0],w,"radio("+i+")",{elem:n[0],value:n[0].value,othis:a}))})}.call(this,n)})}};return"object"===layui.type(e)?e.each(function(e,t){var i=C(t);i.closest(s).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(n,function(e,t){t()}),this},t.prototype.validate=function(e){var u=null,d=r.config.verify,f="layui-form-danger";return!(e=C(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=C(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-verType"),c=o.val();if(o.removeClass(f),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqText")||i),n)return"tips"===s?h.tips(i,"string"!=typeof o.attr("lay-ignore")&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(f),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=C(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(s).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,w,"submit("+e+")",l))}),r=new t,t=C(document),q=C(window);C(function(){r.render()}),t.on("reset",s,function(){var e=C(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",s,i).on("click","*[lay-submit]",i),e(w,r)});layui.define(["laytpl","laypage","form","util"],function(e){"use strict";var m=layui.$,v=layui.laytpl,d=layui.laypage,g=layui.layer,y=layui.form,h=layui.util,f=layui.hint(),p=layui.device(),b={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var t=this;return t.config=m.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,C,e,t)}},x=function(){var a=this,e=a.config,i=e.id||e.index;return i&&(x.that[i]=a,x.config[i]=e),{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){b.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},l=function(e){var t=x.config[e];return t||f.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},k=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content,t=(t.escape&&(i=h.escape(i)),e.text&&a.exportTemplet||a.templet||a.toolbar);return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):v(m(t).html()||String(i)).render(e.tplData)),e.text?m("
            "+i+"
            ").text():i},C="table",w="layui-hide",r="layui-hide-v",c="layui-none",s="layui-table-view",u=".layui-table-header",T=".layui-table-body",N=".layui-table-pageview",L=".layui-table-sort",D="layui-table-edit",E="layui-table-hover",A="layui-table-col-special",j="LAY_TABLE_MOVE_DICT",t=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
            ','
            ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
            ","
            "].join("")},a=['',"","
            "].join(""),R=[,"{{# if(d.data.toolbar){ }}",'
            ','
            ','
            ',"
            ","{{# } }}",'
            ',"{{# if(d.data.loading){ }}",'
            ','',"
            ","{{# } }}","{{# var left, right; }}",'
            ',t(),"
            ",'
            ',a,"
            ","{{# if(left){ }}",'
            ','
            ',t({fixed:!0}),"
            ",'
            ',a,"
            ","
            ","{{# }; }}","{{# if(right){ }}",'
            ','
            ',t({fixed:"right"}),'
            ',"
            ",'
            ',a,"
            ","
            ","{{# }; }}","
            ","{{# if(d.data.totalRow){ }}",'
            ','','',"
            ","
            ","{{# } }}",'
            ','
            ',"
            ",""].join(""),_=m(window),S=m(document),i=function(e){this.index=++b.index,this.config=m.extend({},this.config,b.config,e),this.render()},F=(i.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,editTrigger:"click",defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"}},i.prototype.render=function(e){var t=this,a=t.config;if(a.elem=m(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||t.index,a.request=m.extend({pageName:"page",limitName:"limit"},a.request),a.response=m.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if("reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.height&&/^full-\d+$/.test(a.height)&&(t.fullHeightGap=a.height.split("-")[1],a.height=_.height()-t.fullHeightGap),t.setInit();var i,l,e=a.elem,n=e.next("."+s),o=t.elem=m("
            ");o.addClass((i=[s,s+"-"+t.index,"layui-form","layui-border-box"],a.className&&i.push(a.className),i.join(" "))).attr({"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,"lay-id":a.id,style:(i=[],a.width&&i.push("width:"+a.width+"px;"),a.height&&i.push("height:"+a.height+"px;"),i.join(""))}).html(v(R).render({data:a,index:t.index})),a.index=t.index,t.key=a.id||a.index,n[0]&&n.remove(),e.after(o),t.layTool=o.find(".layui-table-tool"),t.layBox=o.find(".layui-table-box"),t.layHeader=o.find(u),t.layMain=o.find(".layui-table-main"),t.layBody=o.find(T),t.layFixed=o.find(".layui-table-fixed"),t.layFixLeft=o.find(".layui-table-fixed-l"),t.layFixRight=o.find(".layui-table-fixed-r"),t.layTotal=o.find(".layui-table-total"),t.layPage=o.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),1
            ','
            ','
            '].join(""),a=this.layTool.find(".layui-table-tool-temp"),i=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=m(e.toolbar).html()||"")&&a.html(v(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}),l=[];"object"==typeof e.defaultToolbar&&layui.each(e.defaultToolbar,function(e,t){t="string"==typeof t?i[t]:t;t&&l.push('
            ')}),this.layTool.find(".layui-table-tool-self").html(l.join(""))},i.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=m('
            ');t.pagebar&&((e=m(t.pagebar).html()||"")&&a.append(v(e).render(t)),this.layPage.append(a))},i.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[0]][t[1]],e?l--:l++,i.attr("colspan",l),i[l<1?"addClass":"removeClass"](w),t.colspan=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},i.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},i.prototype.setColsWidth=function(){var t,a,i=this,o=i.config,l=0,d=0,r=0,c=0,s=i.setInit("width"),e=(i.eachCols(function(e,t){t.hide||l++}),s=s-("line"===o.skin||"nob"===o.skin?2:l+1)-i.getScrollWidth(i.layMain[0])-1,function(n){layui.each(o.cols,function(e,l){layui.each(l,function(e,t){var a=0,i=t.minWidth||o.cellMinWidth;t?t.colGroup||t.hide||(n?r&&r'+(e||"Error")+"
            ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(w),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(r),t.layPage.find(N).addClass(r),b.cache[t.key]=[],t.syncCheckAll()},i.prototype.page=1,i.prototype.pullData=function(t,a){var e,i=this,l=i.config,n=l.request,o=l.response,d=function(){"object"==typeof l.initSort&&i.sort(l.initSort.field,l.initSort.type)};a=a||{},"function"==typeof l.before&&l.before(l),i.startTime=(new Date).getTime(),l.url?((e={})[n.pageName]=t,e[n.limitName]=l.limit,n=m.extend(e,l.where),l.contentType&&0==l.contentType.indexOf("application/json")&&(n=JSON.stringify(n)),i.loading(),m.ajax({type:l.method||"get",url:l.url,contentType:l.contentType,data:n,dataType:l.dataType||"json",jsonpCallback:l.jsonpCallback,headers:l.headers||{},success:function(e){(e="function"==typeof l.parseData?l.parseData(e)||e:e)[o.statusName]!=o.statusCode?(i.renderForm(),i.errorView(e[o.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+o.statusName+'": '+o.statusCode)):(i.renderData({res:e,curr:t,count:e[o.countName],type:a.type}),d(),l.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof l.done&&l.done(e,t,e[o.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof l.error&&l.error(e,t)}})):"array"===layui.type(l.data)&&(e=t*l.limit-l.limit,(n={})[o.dataName]=l.data.concat().splice(e,l.limit),n[o.countName]=l.data.length,"object"==typeof l.totalRow&&(n[o.totalRowName]=m.extend({},l.totalRow)),i.renderData({res:n,curr:t,count:n[o.countName],type:a.type}),d(),i.setColsWidth(),"function"==typeof l.done)&&l.done(n,t,n[o.countName])},i.prototype.eachCols=function(e){return b.eachCols(null,e,this.config.cols),this},i.prototype.renderData=function(e){var u=this,y=u.config,t=e.res,l=e.curr,a=e.count,n=e.sort,i=t[y.response.dataName]||[],t=t[y.response.totalRowName],h=[],f=[],p=[],o=function(){var s;if(y.HAS_SET_COLS_PATCH||u.setColsPatch(),y.HAS_SET_COLS_PATCH=!0,!n&&u.sortKey)return u.sort(u.sortKey.field,u.sortKey.sort,!0);layui.each(i,function(o,d){var a=[],i=[],r=[],c=o+y.limit*(l-1)+1;"array"===layui.type(d)&&0===d.length||(n||(d[b.config.indexName]=o),u.eachCols(function(e,l){var e=l.field||e,t=y.index+"-"+l.key,n=d[e];n!==undefined&&null!==n||(n=""),l.colGroup||(t=['','
            "+function(){var e,t=m.extend(!0,{LAY_INDEX:c,LAY_COL:l},d),a=b.config.checkName,i=b.config.disabledName;switch(l.type){case"checkbox":return'";case"radio":return t[a]&&(s=o),'';case"numbers":return c}return l.toolbar?v(m(l.toolbar).html()||"").render(t):k.call(u,{item3:l,content:n,tplData:t})}(),"
            "].join(""),a.push(t),l.fixed&&"right"!==l.fixed&&i.push(t),"right"===l.fixed&&r.push(t))}),h.push(''+a.join("")+""),f.push(''+i.join("")+""),p.push(''+r.join("")+""))}),"fixed"===y.scrollPos&&"reloadData"===e.type||u.layBody.scrollTop(0),"reset"===y.scrollPos&&u.layBody.scrollLeft(0),u.layMain.find("."+c).remove(),u.layMain.find("tbody").html(h.join("")),u.layFixLeft.find("tbody").html(f.join("")),u.layFixRight.find("tbody").html(p.join("")),u.renderForm(),"number"==typeof s&&u.setThisRowChecked(s),u.syncCheckAll(),u.fullSize(),u.haveInit?u.scrollPatch():setTimeout(function(){u.scrollPatch()},50),u.haveInit=!0,g.close(u.tipsIndex)};return b.cache[u.key]=i,u.layTotal[0==i.length?"addClass":"removeClass"](r),u.layPage[y.page||y.pagebar?"removeClass":"addClass"](w),u.layPage.find(N)[!y.page||0==a||0===i.length&&1==l?"addClass":"removeClass"](r),0===i.length?(u.renderForm(),u.errorView(y.text.none)):(u.layFixLeft.removeClass(w),n?o():(o(),u.renderTotal(i,t),u.layTotal&&u.layTotal.removeClass(w),void(y.page&&(y.page=m.extend({elem:"layui-table-page"+y.index,count:a,limit:y.limit,limits:y.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(u.page=e.curr,y.limit=e.limit,u.pullData(e.curr))}},y.page),y.page.count=a,d.render(y.page)))))},i.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal={},d=[],r.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l=(a=t.totalRowText||"",n="totalRowDecimals"in t?t.totalRowDecimals:2,n=parseFloat(s[e]).toFixed(n),(l={LAY_COL:t})[e]=n,n=t.totalRow&&k.call(r,{item3:t,content:n,tplData:l})||a,i||n),n=['','
            "+("string"==typeof(a=t.totalRow||c.totalRow)?v(a).render(m.extend({TOTAL_NUMS:i||s[e],LAY_COL:t},t)):l),"
            "].join("");t.field&&(r.dataTotal[e]=l),d.push(n)}),r.layTotal.find("tbody").html(""+d.join("")+""))},i.prototype.getColElem=function(e,t){var a=this.config;return e.eq(0).find(".laytable-cell-"+a.index+"-"+t+":eq(0)")},i.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");y.render(e,t)},i.prototype.setThisRowChecked=function(e){this.config;var t="layui-table-click";this.layBody.find('tr[data-index="'+e+'"]').addClass(t).siblings("tr").removeClass(t)},i.prototype.sort=function(l,e,t,a){var i,n=this,o={},d=n.config,r=d.elem.attr("lay-filter"),c=b.cache[n.key];"string"==typeof l&&(s=l,n.layHeader.find("th").each(function(e,t){var a=m(this),i=a.data("field");if(i===l)return l=a,s=i,!1}));try{var s=s||l.data("field"),u=l.data("key");if(n.sortKey&&!t&&s===n.sortKey.field&&e===n.sortKey.sort)return;var y=n.layHeader.find("th .laytable-cell-"+u).find(L);n.layHeader.find("th").find(L).removeAttr("lay-sort"),y.attr("lay-sort",e||null),n.layFixed.find("th")}catch(h){f.error("Table modules: sort field '"+s+"' not matched")}n.sortKey={field:s,sort:e},d.autoSort&&("asc"===e?i=layui.sort(c,s):"desc"===e?i=layui.sort(c,s,!0):(i=layui.sort(c,b.config.indexName),delete n.sortKey,delete d.initSort)),o[d.response.dataName]=i||c,n.renderData({res:o,curr:n.page,count:n.count,sort:!0}),a&&(d.initSort={field:s,type:e},layui.event.call(l,C,"sort("+r+")",d.initSort))},i.prototype.loading=function(e){var t=this;t.config.loading&&(e?(t.layInit&&t.layInit.remove(),delete t.layInit,t.layBox.find(".layui-table-init").remove()):(t.layInit=m(['
            ','',"
            "].join("")),t.layBox.append(t.layInit)))},i.prototype.setCheckData=function(e,t){var a=this.config,i=b.cache[this.key];i[e]&&"array"!==layui.type(i[e])&&(i[e][a.checkName]=t)},i.prototype.syncCheckAll=function(){var e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(a){return e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),a};t[0]&&(b.checkStatus(e.key).isAll?(t[0].checked||(t.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(t[0].checked&&(t.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},i.prototype.getCssRule=function(a,i){var e=this.elem.find("style")[0],e=e.sheet||e.styleSheet||{},e=e.cssRules||e.rules;layui.each(e,function(e,t){if(t.selectorText===".laytable-cell-"+a)return i(t),!0})},i.prototype.fullSize=function(){var e=this,t=e.config,a=t.height;e.fullHeightGap&&(a=_.height()-e.fullHeightGap,e.elem.css("height",a=a<135?135:a)),a&&(a=parseFloat(a)-(e.layHeader.outerHeight()||38),t.toolbar&&(a-=e.layTool.outerHeight()||50),t.totalRow&&(a-=e.layTotal.outerHeight()||40),(t.page||t.pagebar)&&(a-=e.layPage.outerHeight()||43),e.layMain.outerHeight(a))},i.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:((e=document.createElement("div")).style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},i.prototype.scrollPatch=function(){var e=this,t=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),i=e.layMain.height()-e.layMain.prop("clientHeight"),l=(e.getScrollWidth(e.layMain[0]),t.outerWidth()-e.layMain.width()),n=function(e){var t;a&&i?(e=e.eq(0)).find(".layui-table-patch")[0]||((t=m('
            ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(T).css("height",t.height()>=n?n:"auto"),e.layFixRight[0');a.html(t),r.height&&a.css("max-height",r.height-(s.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(a),s.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};switch(layui.stope(e),S.trigger("table.tool.panel.remove"),g.close(s.tipsIndex),t){case"LAYTABLE_COLS":l({list:(a=[],s.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
          • ')}),a.join("")),done:function(){y.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=m(e.elem),i=this.checked,l=e.data("key"),n=e.data("parentkey");layui.each(r.cols,function(a,e){layui.each(e,function(e,t){a+"-"+e===l&&(e=t.hide,t.hide=!i,s.elem.find('*[data-key="'+r.index+"-"+l+'"]')[i?"removeClass":"addClass"](w),e!=t.hide&&s.setParentCol(!i,n),s.resize())})})})}});break;case"LAYTABLE_EXPORT":p.ie?g.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):l({list:['
          • \u5bfc\u51fa csv \u683c\u5f0f\u6587\u4ef6
          • ','
          • \u5bfc\u51fa xls \u683c\u5f0f\u6587\u4ef6
          • '].join(""),done:function(e,t){t.on("click",function(){var e=m(this).data("type");b.exportFile.call(s,r.id,null,e)})}});break;case"LAYTABLE_PRINT":var n=window.open("about:blank","_blank"),o=[""].join(""),d=m(s.layHeader.html());d.append(s.layMain.find("table").html()),d.append(s.layTotal.find("table").html()),d.find("th.layui-table-patch").remove(),d.find("thead>tr>th."+A).filter(function(e,t){return!m(t).children(".laytable-cell-group").length}).remove(),d.find("tbody>tr>td."+A).remove(),n.document.write(o+d.prop("outerHTML")),n.document.close(),n.print(),n.close()}layui.event.call(this,C,"toolbar("+c+")",m.extend({event:t,config:r},{}))}),s.layPagebar.on("click","*[lay-event]",function(e){var t=m(this).attr("lay-event");layui.event.call(this,C,"pagebar("+c+")",m.extend({event:t,config:r},{}))}),e.on("mousemove",function(e){var t=m(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||x.eventMoveElem||(l.allowResize=t.width()-e<=10,i.css("cursor",l.allowResize?"col-resize":""))}).on("mouseleave",function(){m(this);x.eventMoveElem||i.css("cursor","")}).on("mousedown",function(e){var t,a=m(this);l.allowResize&&(t=a.data("key"),e.preventDefault(),l.offset=[e.clientX,e.clientY],s.getCssRule(t,function(e){var t=e.style.width||a.outerWidth();l.rule=e,l.ruleWidth=parseFloat(t),l.minWidth=a.data("minwidth")||r.cellMinWidth}),a.data(j,l),x.eventMoveElem=a)}),x.docEvent||S.on("mousemove",function(e){var t;x.eventMoveElem&&(t=x.eventMoveElem.data(j)||{},x.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&((e=t.ruleWidth+e.clientX-t.offset[0])':''))[0].value=t.data("content")||i.text(),t.find("."+D)[0]||t.append(a),a.focus(),layui.stope(e))}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=m(this),a=t.children(u);t.data("off")||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.outerWidth()||0
            '))},d=(s.layBody.on("click","."+o,function(e){var t=m(this).parent().children(u);s.tipsIndex=g.tips(['
            ',t.html(),"
            ",''].join(""),t[0],{tips:[3,""],time:-1,anim:-1,maxWidth:p.ios||p.android?300:s.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}),layui.stope(e)}),function(e){var t=m(this),a=t.parents("tr").eq(0).data("index");layui.event.call(this,C,(e||"tool")+"("+c+")",n.call(this,{event:t.attr("lay-event")})),s.setThisRowChecked(a)});s.layBody.on("click","*[lay-event]",function(){return d.call(this),!1}).on("dblclick","*[lay-event]",function(){return d.call(this,"toolDouble"),!1}),s.layMain.on("scroll",function(){var e=m(this),t=e.scrollLeft(),e=e.scrollTop();s.layHeader.scrollLeft(t),s.layTotal.scrollLeft(t),s.layFixed.find(T).scrollTop(e),g.close(s.tipsIndex)}),_.on("resize",function(){s.resize()})},S.on("click",function(){S.trigger("table.remove.tool.panel")}),S.on("table.remove.tool.panel",function(){m(".layui-table-tool-panel").remove()}),b.init=function(a,i){i=i||{};var e=m(a?'table[lay-filter="'+a+'"]':".layui-table[lay-data]"),d="Table element property lay-data configuration item has a syntax error: ";return e.each(function(){var e=m(this),t=e.attr("lay-data");try{t=new Function("return "+t)()}catch(l){f.error(d+t,"error")}var n=[],o=m.extend({elem:this,cols:[],data:[],skin:e.attr("lay-skin"),size:e.attr("lay-size"),even:"string"==typeof e.attr("lay-even")},b.config,i,t);a&&e.hide(),e.find("thead>tr").each(function(i){o.cols[i]=[],m(this).children().each(function(e){var t=m(this),a=t.attr("lay-data");try{a=new Function("return "+a)()}catch(l){return f.error(d+a)}t=m.extend({title:t.text(),colspan:t.attr("colspan")||1,rowspan:t.attr("rowspan")||1},a);t.colspan<2&&n.push(t),o.cols[i].push(t)})}),e.find("tbody>tr").each(function(e){var a=m(this),l={};a.children("td").each(function(e,t){var a=m(this),i=a.data("field");if(i)return l[i]=a.html()}),layui.each(n,function(e,t){e=a.children("td").eq(e);l[t.field]=e.html()}),o.data[e]=l}),b.render(o)}),this},x.that={},x.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),F(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=t.hide?0:parseInt(1td'),a!==undefined&&null!==a||(a=""),0==l&&d.push(t.title||""),o.push('"'+k.call(c,{item3:t,content:a,tplData:n,text:"text",obj:c.commonMember.call(i.eq(0),{td:function(e){return i.filter('[data-field="'+e+'"]')}})})+'"')))}),i.push(o.join(","))}),c&&layui.each(c.dataTotal,function(e,t){r[e]||l.push(t)}),d.join(",")+"\r\n"+i.join("\r\n")+"\r\n"+l.join(","))),u.download=(a.title||o.title||"table_"+(o.index||""))+"."+n,document.body.appendChild(u),u.click(),document.body.removeChild(u)},b.resize=function(e){e?l(e)&&x.that[e].resize():layui.each(x.that,function(){this.resize()})},b.reload=function(e,t,a,i){if(l(e))return(e=x.that[e]).reload(t,a,i),x.call(e)},b.reloadData=function(){var a=m.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["data","url","method","contentType","dataType","jsonpCallback","headers","where","page","limit","request","response","parseData","scrollPos"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)||delete a[1][e]}),b.reload.apply(null,a)},b.render=function(e){e=new i(e);return x.call(e)},b.clearCacheKey=function(e){return delete(e=m.extend({},e))[b.config.checkName],delete e[b.config.indexName],delete e[b.config.disabledName],e},m(function(){b.init()}),e(C,b)});layui.define("form",function(e){"use strict";var u=layui.$,i=layui.form,p=layui.layer,n="tree",a={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var i=this;return i.config=u.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,n,e,i)}},t=function(){var i=this,e=i.config,n=e.id||i.index;return t.that[n]=i,{config:t.config[n]=e,reload:function(e){i.reload.call(i,e)},getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}},y="layui-hide",o="layui-disabled",f="layui-tree-set",C="layui-tree-iconClick",k="layui-icon-addition",v="layui-icon-subtraction",m="layui-tree-entry",x="layui-tree-main",b="layui-tree-txt",g="layui-tree-pack",w="layui-tree-spread",N="layui-tree-setLineShort",T="layui-tree-showLine",L="layui-tree-lineExtend",l=function(e){var i=this;i.index=++a.index,i.config=u.extend({},i.config,a.config,e),i.render()};l.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},l.prototype.reload=function(e){var n=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete n.config[e]}),n.config=u.extend(!0,{},n.config,e),n.render()},l.prototype.render=function(){var e=this,i=e.config,n=(e.checkids=[],u('
            ')),a=(e.tree(n),i.elem=u(i.elem));if(a[0]){if(e.key=i.id||e.index,e.elem=n,e.elemNone=u('
            '+i.text.none+"
            "),a.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=u(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(N),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(N)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(c,e){var d=this,s=d.config,e=e||s.data;layui.each(e,function(e,i){var n,a,t=i.children&&0"),r=u(['
            ','
            ','
            ',s.showLine?t?'':'':'',s.showCheckbox?'':"",s.isJump&&i.href?''+(i.title||i.label||s.text.defaultNodeName)+"":''+(i.title||i.label||s.text.defaultNodeName)+"","
            ",s.edit?(n={add:'',update:'',del:''},a=['
            '],!0===s.edit&&(s.edit=["update","del"]),"object"==typeof s.edit?(layui.each(s.edit,function(e,i){a.push(n[i]||"")}),a.join("")+"
            "):void 0):"","
            "].join(""));t&&(r.append(l),d.tree(l,i.children)),c.append(r),r.prev("."+f)[0]&&r.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||r.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),d.spread(r,i),s.showCheckbox&&(i.checked&&d.checkids.push(i.id),d.checkClick(r,i)),s.edit&&d.operate(r,i)})},l.prototype.spread=function(a,e){var t=this.config,i=a.children("."+m),n=i.children("."+x),l=i.find("."+C),i=i.find("."+b),r=t.onlyIconControl?l:n,c="";r.on("click",function(e){var i=a.children("."+g),n=(r.children(".layui-icon")[0]?r:r.find(".layui-tree-icon")).children(".layui-icon");i[0]?a.hasClass(w)?(a.removeClass(w),i.slideUp(200),n.removeClass(v).addClass(k)):(a.addClass(w),i.slideDown(200),n.addClass(v).removeClass(k),t.accordion&&((i=a.siblings("."+f)).removeClass(w),i.children("."+g).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(v).addClass(k))):c="normal"}),i.on("click",function(){u(this).hasClass(o)||(c=a.hasClass(w)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:a,state:c,data:e}))})},l.prototype.setCheckbox=function(e,i,n){this.config;var t,l=n.prop("checked");n.prop("disabled")||("object"!=typeof i.children&&!e.find("."+g)[0]||e.find("."+g).find('input[same="layuiTreeCheck"]').each(function(){this.disabled||(this.checked=l)}),(t=function(e){var i,n,a;e.parents("."+f)[0]&&(n=(e=e.parent("."+g)).parent(),a=e.prev().find('input[same="layuiTreeCheck"]'),l?a.prop("checked",l):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||a.prop("checked",!1)),t(n))})(e),this.renderForm("checkbox"))},l.prototype.checkClick=function(n,a){var t=this,l=t.config;n.children("."+m).children("."+x).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=u(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(n,a,e),l.oncheck&&l.oncheck({elem:n,checked:i,data:a}))})},l.prototype.operate=function(c,d){var s=this,o=s.config,e=c.children("."+m),h=e.children("."+x);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=u(this).data("type"),a=c.children("."+g),t={data:d,type:e,elem:c};if("add"==e){a[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(k).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(y),c.append('
            '));var n,l=o.operate&&o.operate(t),r={};if(r.title=o.text.defaultNodeName,r.id=l,s.tree(c.children("."+g),[r]),o.showLine&&(a[0]?(a.hasClass(L)||a.addClass(L),c.find("."+g).each(function(){u(this).children("."+f).last().addClass(N)}),(a.children("."+f).last().prev().hasClass(N)?a.children("."+f).last().prev():a.children("."+f).last()).removeClass(N),!c.parent("."+g)[0]&&c.next()[0]&&a.children("."+f).last().removeClass(N)):(l=c.siblings("."+f),n=1,r=c.parent("."+g),layui.each(l,function(e,i){u(i).children("."+g)[0]||(n=0)}),(1==n?(l.children("."+g).addClass(T),l.children("."+g).children("."+f).removeClass(N),c.children("."+g).addClass(T),r.removeClass(L),r.children("."+f).last().children("."+g).children("."+f).last()):c.children("."+g).children("."+f)).addClass(N))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(c.children("."+g).children("."+f).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+b).html(),h.children("."+b).html(""),h.append(''),h.children(".layui-tree-editInput").val(l).focus(),i=function(e){var i=e.val().trim()||o.text.defaultNodeName;e.remove(),h.children("."+b).html(i),t.data.title=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(u(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(u(this)))})):p.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d.title||"")+'" \u5417\uff1f',function(e){var l,n,i;o.operate&&o.operate(t),t.status="remove",p.close(e),c.prev("."+f)[0]||c.next("."+f)[0]||c.parent("."+g)[0]?(c.siblings("."+f).children("."+m)[0]?(o.showCheckbox&&(l=function(e){var i,n,a,t;e.parents("."+f)[0]&&(i=e.siblings("."+f).children("."+m),n=(e=e.parent("."+g).prev()).find('input[same="layuiTreeCheck"]')[0],a=1,(t=0)==n.checked)&&(i.each(function(e,i){i=u(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(a=0),i.disabled||(t=1)}),1==a)&&1==t&&(n.checked=!0,s.renderForm("checkbox"),l(e.parent("."+f)))})(c),o.showLine&&(e=c.siblings("."+f),n=1,i=c.parent("."+g),layui.each(e,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(a[0]||(i.removeClass(L),e.children("."+g).addClass(T),e.children("."+g).children("."+f).removeClass(N)),(c.next()[0]?i.children("."+f).last():c.prev()).children("."+g).children("."+f).last().addClass(N),c.next()[0]||c.parents("."+f)[1]||c.parents("."+f).eq(0).next()[0]||c.prev("."+f).addClass(N)):!c.next()[0]&&c.hasClass(N)&&c.prev().addClass(N))):(e=c.parent("."+g).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(v).addClass("layui-icon-file"),(i=e.parents("."+g).eq(0)).addClass(L),i.children("."+f).each(function(){u(this).children("."+g).children("."+f).last().addClass(N)})):e.find(".layui-tree-iconArrow").addClass(y),c.parents("."+f).eq(0).removeClass(w),c.parent("."+g).remove()),c.remove()):(c.remove(),s.elem.append(s.elemNone))})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=u(this),n=e.val(),e=e.nextAll(),a=[];e.find("."+b).each(function(){var i,e=u(this).parents("."+m);-1!=u(this).html().indexOf(n)&&(a.push(u(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+g)[0]&&i(e.parent("."+g).parent("."+f))})(e.parent("."+f)))}),e.find("."+m).each(function(){var e=u(this).parent("."+f);e.hasClass("layui-tree-searchShow")||e.addClass(y)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:a})}),i.elem.find(".layui-tree-search").on("keydown",function(){u(this).nextAll().find("."+m).each(function(){u(this).parent("."+f).removeClass("layui-tree-searchShow "+y)}),u(".layui-tree-emptyText")[0]&&u(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var e=this.config,i=[],n=[],t=(this.elem.find(".layui-form-checked").each(function(){i.push(u(this).prev()[0].value)}),function(e,a){layui.each(e,function(e,n){layui.each(i,function(e,i){if(n.id==i)return delete(i=u.extend({},n)).children,a.push(i),n.children&&(i.children=[],t(n.children,i.children)),!0})})});return t(u.extend({},e.data),n),n},l.prototype.setChecked=function(l){this.config;this.elem.find("."+f).each(function(e,i){var n=u(this).data("id"),a=u(i).children("."+m).find('input[same="layuiTreeCheck"]'),t=a.next();if("number"==typeof l){if(n==l)return a[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i==n&&!a[0].checked)return t.click(),!0})})},t.that={},t.config={},a.reload=function(e,i){e=t.that[e];return e.reload(i),t.call(e)},a.getChecked=function(e){return t.that[e].getChecked()},a.setChecked=function(e,i){return t.that[e].setChecked(i)},a.render=function(e){e=new l(e);return t.call(e)},e(n,a)});layui.define(["laytpl","form"],function(e){"use strict";var d=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=d.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},s="layui-hide",h="layui-btn-disabled",r="layui-none",c="layui-transfer-box",u="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
            ','
            ','","
            ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
              ',"
              "].join("")},p=['
              ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
              ','",'","
              ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
              "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=d.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=d.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=d(n(p).render({data:t,index:e.index})),i=t.elem=d(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],e.key=t.id||e.index,i.html(e.elem),e.layBox=e.elem.find("."+c),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,i=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,a=["
            • ",'',"
            • "].join("");i[t].views.push(a),delete e.selected}),e.layData.eq(0).html(i[0].views.join("")),e.layData.eq(1).html(i[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(r){var c=this,o=c.config;r=r||{},c.layBox.each(function(e){var t=d(this),a=t.find("."+f),t=t.find("."+u).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=d(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),c.layBtn.eq(e)[l?"removeClass":"addClass"](h),r.stopNone||(i=a.children("li:not(."+s+")").length,c.noneView(a,i?"":o.text.none))}),c.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=d('

              '+(t||"")+"

              ");e.find("."+r)[0]&&e.find("."+r).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){d(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=d.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),r=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+c).find("."+f).append(t.clone()),t.remove(),r.push(a[0].value),i.setValue()):l.each(function(e){d(this).find("."+f).children("li").each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+c).find("."+f).append(e.clone()),e.remove(),r.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+c).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(r),e)},v.prototype.events=function(){var n=this,a=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=d(this).prev(),t=e[0].checked,a=e.parents("."+c).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=d(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent();a[0].disabled||n.transfer(i.data("index"),t)}),n.layBtn.on("click",function(){var e=d(this),t=e.data("index");e.hasClass(h)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=d(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=d(this),t=e.find('input[type="checkbox"]'),a=-1!==t[0].title.indexOf(i);e[a?"removeClass":"addClass"](s),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+s).length);n.noneView(e,t?a.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define("jquery",function(e){"use strict";var a=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,d,e,i)}}),d="carousel",r="layui-this",s="layui-carousel-left",u="layui-carousel-right",c="layui-carousel-prev",m="layui-carousel-next",t="layui-carousel-arrow",l="layui-carousel-ind",i=function(e){var i=this;i.config=a.extend({},i.config,n.config,e),i.render()};i.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},i.prototype.render=function(){var e=this,i=e.config;i.elem=a(i.elem),i.elem[0]&&(e.elemItem=i.elem.find(">*[carousel-item]>*"),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(r),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},i.prototype.reload=function(e){var i=this;clearInterval(i.timer),i.config=a.extend({},i.config,e),i.render()},i.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},i.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},i.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},i.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},i.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},i.prototype.arrow=function(){var i=this,e=i.config,n=a(['",'"].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+t)[0]&&e.elem.find("."+t).remove(),e.elem.append(n),n.on("click",function(){var e=a(this).attr("lay-type");i.slide(e)})},i.prototype.indicator=function(){var i,n=this,t=n.config,e=n.elemInd=a(['
                ',(i=[],layui.each(n.elemItem,function(e){i.push("")}),i.join("")),"
              "].join(""));t.elem.attr("lay-indicator",t.indicator),t.elem.find("."+l)[0]&&t.elem.find("."+l).remove(),t.elem.append(e),"updown"===t.anim&&e.css("margin-top",-e.height()/2),e.find("li").on("hover"===t.trigger?"mouseover":t.trigger,function(){var e=a(this).index();e>t.index?n.slide("add",e-t.index):ea.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'
                "),n=1;n<=a.length;n++){var t='
              • ";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'
              • ":i+=t}i+="
              "+(a.text?''+a.value+"\u661f":"")+"";var o=a.elem,s=o.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),o.html(e.elemTemp),o.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var i=this.config,n=this.elemTemp,t=n.find("i").width();n.children("li").each(function(e){var a=e+1,l=u(this);l.on("click",function(e){i.value=a,i.half&&e.pageX-u(this).offset().left<=t/2&&(i.value=i.value-.5),i.text&&n.next("span").text(i.value+"\u661f"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),l.on("mousemove",function(e){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+a+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&e.pageX-u(this).offset().left<=t/2&&l.children("i").addClass(o).removeClass(r)}),l.on("mouseleave",function(){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+Math.floor(i.value)+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&n.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})})},a.prototype.events=function(){this.config},l.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(i,l)});layui.define("jquery",function(l){"use strict";var g=layui.$,e=function(l){};e.prototype.load=function(l){var t,i,n,e,r,o,a,c,m,s,u,f,y,d=this,p=0,h=g((l=l||{}).elem);if(h[0])return e=g(l.scrollElem||document),r=l.mb||50,o=!("isAuto"in l)||l.isAuto,a=l.end||"\u6ca1\u6709\u66f4\u591a\u4e86",c=l.scrollElem&&l.scrollElem!==document,s=g('"),h.find(".layui-flow-more")[0]||h.append(s),u=function(l,e){l=g(l),s.before(l),(e=0==e||null)?s.html(a):s.find("a").html(m),i=e,t=null,y&&y()},(f=function(){t=!0,s.find("a").html(''),"function"==typeof l.done&&l.done(++p,u)})(),s.find("a").on("click",function(){g(this);i||t||f()}),l.isLazyimg&&(y=d.lazyimg({elem:l.elem+" img",scrollElem:l.scrollElem})),o&&e.on("scroll",function(){var e=g(this),o=e.scrollTop();n&&clearTimeout(n),!i&&h.width()&&(n=setTimeout(function(){var l=(c?e:g(window)).height();(c?e.prop("scrollHeight"):document.documentElement.scrollHeight)-o-l<=r&&(t||f())},100))}),d},e.prototype.lazyimg=function(l){var e,c=this,m=0,s=g((l=l||{}).scrollElem||document),u=l.elem||"img",f=l.scrollElem&&l.scrollElem!==document,y=function(e,l){var o,t=s.scrollTop(),l=t+l,i=f?e.offset().top-s.offset().top+t:e.offset().top;t<=i&&i<=l&&e.attr("lay-src")&&(o=e.attr("lay-src"),layui.img(o,function(){var l=c.lazyimg.elem.eq(m);e.attr("src",o).removeAttr("lay-src"),l[0]&&n(l),m++},function(){c.lazyimg.elem.eq(m);e.removeAttr("lay-src")}))},n=function(l,e){var o=(f?e||s:g(window)).height(),t=s.scrollTop(),i=t+o;if(c.lazyimg.elem=g(u),l)y(l,o);else for(var n=0;n','
              '+e+"
              ",'
              ','',"
              ",""].join(""));return y.ie&&y.ie<8?s.removeClass("layui-hide").addClass("layui-show"):(u[0]&&u.remove(),m.call(l,o,s[0],n),s.addClass("layui-hide").after(o),l.index)},e.prototype.getContent=function(t){t=n(t);if(t[0])return a(t[0].document.body.innerHTML)},e.prototype.getText=function(t){t=n(t);if(t[0])return r(t[0].document.body).text()},e.prototype.setContent=function(t,e,i){var a=n(t);a[0]&&(i?r(a[0].document.body).append(e):r(a[0].document.body).html(e),layedit.sync(t))},e.prototype.sync=function(t){t=n(t);t[0]&&r("#"+t[1].attr("textarea")).val(a(t[0].document.body.innerHTML))},e.prototype.getSelection=function(t){var t=n(t);if(t[0])return t=p(t[0].document),document.selection?t.text:t.toString()},function(l,n,o){var s=this,c=l.find("iframe");c.css({height:o.height}).on("load",function(){var t=c.contents(),e=c.prop("contentWindow"),i=t.find("head"),a=r([""].join("")),t=t.find("body");i.append(a),t.attr("contenteditable","true").css({"min-height":o.height}).html(n.value||""),u.apply(s,[e,c,n,o]),b.call(s,e,l,o)})}),n=function(t){t=r("#LAY_layedit_"+t);return[t.prop("contentWindow"),t]},a=function(t){return t=8==y.ie?t.replace(/<.+>/g,function(t){return t.toLowerCase()}):t},u=function(e,t,i,a){var l=e.document,n=r(l.body);n.on("keydown",function(t){if(13===t.keyCode){var e=p(l);if("pre"===g(e).parentNode.tagName.toLowerCase())return t.shiftKey?void 0:(d.msg("\u8bf7\u6682\u65f6\u7528shift+enter"),!1);l.execCommand("formatBlock",!1,"

              ")}}),r(i).parents("form").on("submit",function(){var t=n.html();8==y.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),i.value=t}),n.on("paste",function(t){l.execCommand("formatBlock",!1,"

              "),setTimeout(function(){o.call(e,n),i.value=n.html()},100)})},o=function(t){this.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),r(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},p=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},g=function(t){return t.endContainer||t.parentElement().childNodes[0]},h=function(t,e,i){var a,l,n=this.document,o=document.createElement(t);for(a in e)o.setAttribute(a,e[a]);o.removeAttribute("text"),n.selection?(l=i.text||e.text,"a"===t&&!l||(l&&(o.innerHTML=l),i.pasteHTML(r(o).prop("outerHTML")),i.select())):(l=i.toString()||e.text,"a"===t&&!l||(l&&(o.innerHTML=l),i.deleteContents(),i.insertNode(o)))},v=function(e,t){var i=this.document,a="layedit-tool-active",i=g(p(i)),l=function(t){return e.find(".layedit-tool-"+t)};t&&t[t.hasClass(a)?"removeClass":"addClass"](a),e.find(">i").removeClass(a),l("unlink").addClass(f),r(i).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||l("b").addClass(a),"i"!==t&&"em"!==t||l("i").addClass(a),"u"===t&&l("u").addClass(a),"strike"===t&&l("d").addClass(a),"p"===t&&l("center"===e?"center":"right"===e?"right":"left").addClass(a),"a"===t&&(l("link").addClass(a),l("unlink").removeClass(f))})},b=function(l,t,n){var o=l.document,s=r(o.body),c={link:function(i){var t=g(i),a=r(t).parent();x.call(s,{href:a.attr("href"),target:a.attr("target")},function(t){var e=a[0];"A"===e.tagName?e.href=t.url:h.call(l,"a",{target:t.target,href:t.url,text:t.url},i)})},unlink:function(t){o.execCommand("unlink")},face:function(e){k.call(this,function(t){h.call(l,"img",{src:t.src,alt:t.alt,style:t.style},e)})},image:function(i){var a=this;layui.use("upload",function(t){var e=n.uploadImage||{};t.render({url:e.url,method:e.type,elem:r(a).find("input")[0],choose:function(t){e.getChooseImageData&&"function"==typeof e.getChooseImageData&&e.getChooseImageData(t)},done:function(t){0==t.code?(t.data=t.data||{},h.call(l,"img",{src:t.data.src,alt:t.data.title,id:t.data.id,style:"width:100px;"},i),e.getUploadImageData&&"function"==typeof e.getUploadImageData&&e.getUploadImageData(t)):d.msg(t.msg||"\u4e0a\u4f20\u5931\u8d25")}})})},code:function(e){C.call(s,function(t){h.call(l,"pre",{text:t.code,"lay-lang":t.lang},e)})},help:function(){d.open({type:2,title:"\u5e2e\u52a9",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["","no"]})},good:function(){var t=(n.good||{})["goodCallback"];t&&"function"==typeof t&&t()},top:function(){var t=(n.top||{})["topCallback"];t&&"function"==typeof t&&t()},closeImage:function(){d.msg("\u6f14\u793a\u7ad9\u70b9\u6682\u4e0d\u5f00\u653e\u56fe\u7247\u804a\u5929\u529f\u80fd")}},u=t.find(".layui-layedit-tool"),e=function(){var t,e=r(this),i=e.attr("layedit-event"),a=e.attr("lay-command");e.hasClass(f)||(s.focus(),(t=p(o)).commonAncestorContainer,a?(o.execCommand(a),/justifyLeft|justifyCenter|justifyRight/.test(a)&&o.execCommand("formatBlock",!1,"

              "),setTimeout(function(){s.focus()},10)):c[i]&&c[i].call(this,t),v.call(l,u,e))},i=/image/;u.find(">i").on("mousedown",function(){var t=r(this).attr("layedit-event");i.test(t)||e.call(this)}).on("click",function(){var t=r(this).attr("layedit-event");i.test(t)&&e.call(this)}),s.on("click",function(){v.call(l,u),d.close(k.index)})},x=function(t,i){var a=this,t=d.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"\u8d85\u94fe\u63a5",skin:"layui-layer-msg",content:['

                ','
              • ','','
                ','',"
                ","
              • ",'
              • ','','
                ','",'","
                ","
              • ",'
              • ','','',"
              • ","
              "].join(""),success:function(t,e){l.render("radio"),t.find(".layui-btn-primary").on("click",function(){d.close(e),a.focus()}),l.on("submit(layedit-link-yes)",function(t){d.close(x.index),i&&i(t.field)})}});x.index=t},k=function(i){a={},layui.each(["[\u5c0f\u4e11]","[\u51b7\u6f20]","[\u53ef\u7231]","[\u5077\u7b11]","[\u8c03\u76ae]","[\u54ed\u7b11]"],function(t,e){a[e]=layui.cache.dir+"images/face/"+t+".gif"});var a,l,n=a;return k.hide=k.hide||function(t){"face"!==r(t.target).attr("layedit-event")&&d.close(k.index)},k.index=d.tips((l=[],layui.each(n,function(t,e){l.push('
            • '+t+'
            • ')}),'
                '+l.join("")+"
              "),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(t,e){t.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){i&&i({src:n[this.title],alt:this.title,style:"width:30px; height:30px;user-select: none;-webkit-user-drag: none;"}),d.close(e)}),r(document).off("click",k.hide).on("click",k.hide)}})},C=function(i){var a=this,t=d.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"\u63d2\u5165\u4ee3\u7801",skin:"layui-layer-msg",content:['
                ','
              • ','','
                ','","
                ","
              • ",'
              • ','','
                ','',"
                ","
              • ",'
              • ','','',"
              • ","
              "].join(""),success:function(t,e){l.render("select"),t.find(".layui-btn-primary").on("click",function(){d.close(e),a.focus()}),l.on("submit(layedit-code-yes)",function(t){d.close(C.index),i&&i(t.field)})}});C.index=t},w={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',closeImage:'',code:'',good:'\u7cbe\u9009\u6d88\u606f',top:'\u7f6e\u9876\u6d88\u606f'},e=new e;t(i,e)});layui.define(["lay","util"],function(e){"use strict";var d=layui.$,o=layui.util,u="layui-code-title",l={elem:".layui-code",title:"</>",about:"",ln:!0};e("code",function(e){var c=e=d.extend({},l,e);e.elem=d(e.elem),e.elem[0]&&layui.each(e.elem.get().reverse(),function(e,l){var t,a=d(l),i=(i=a.html(),d.trim(i).replace(/^\n|\n$/,"")),l=d.extend({},c,lay.options(l),(t={},layui.each(["title","height","encode","skin","about"],function(e,l){var i=a.attr("lay-"+l);"string"==typeof i&&(t[l]=i)}),t)),s=l.ln?"ol":"ul",s=d("<"+s+' class="layui-code-'+s+'">'),n=d('
              ');a.addClass("layui-code-view layui-box"),l.skin&&("notepad"===l.skin&&(l.skin="dark"),a.addClass("layui-code-"+l.skin)),i=(i=l.encode?o.escape(i):i).replace(/[\r\t\n]+/g,"
            • "),a.html(s.html("
            • "+i+"
            • ")),a.children("."+u)[0]||(n.html(l.title+(l.about?'
              '+l.about+"
              ":"")),a.prepend(n)),0<(i=Math.floor(s.find("li").length/100))&&s.css("margin-left",i+"px"),l.height&&s.css("max-height",l.height)})})}).addcss("modules/code.css?v=3","skincodecss"); \ No newline at end of file diff --git a/svr/tlapi.js b/svr/tlapi.js index 06bcd01..fadc359 100644 --- a/svr/tlapi.js +++ b/svr/tlapi.js @@ -1,4 +1,6 @@ const express = require("express"); +const bodyParser = require('body-parser'); +const cookieParser = require('cookie-parser'); const { inject_env_config, load_env_config } = require("./conf/env_config"); //加载环境变量 load_env_config(); @@ -17,6 +19,9 @@ utils.tlConsoleIcon() async function start() { let app = express(); + app.use(bodyParser.json()); + app.use(cookieParser()); + utils.tlConsole("api init start ...") if (!conf.db.open) {// 没开db diff --git a/svr/vite.config.js b/svr/vite.config.js index d21262d..d781962 100644 --- a/svr/vite.config.js +++ b/svr/vite.config.js @@ -8,9 +8,9 @@ export default { plugins: [ copy({ targets: [ - { src: 'res/*.html', dest: 'res/dist' }, - { src: 'res/image/*', dest: 'res/dist/image' }, - { src: 'static/*', dest: 'res/dist/static' }, + { src: 'web-res/*.html', dest: 'web-res/dist' }, + { src: 'web-res/image/*', dest: 'web-res/dist/image' }, + { src: 'static/*', dest: 'web-res/dist/static' }, ], hook: 'writeBundle', verbose: true @@ -19,16 +19,16 @@ export default { build: { rollupOptions: { input: Object.fromEntries( - glob.sync('res/*(js|css)/*.*(js|css)').map(file => [ + glob.sync('web-res/*(js|css)/*.*(js|css)').map(file => [ path.relative( - './res', + './web-res', file.slice(0, file.length - path.extname(file).length) ), fileURLToPath(new URL(file, url)) ]) ), output: { - dir: "./res/dist/", + dir: "./web-res/dist/", entryFileNames: "[name].min.js", assetFileNames: "css/[name].min[extname]" }, diff --git a/svr/res/css/comm.css b/svr/web-res/css/comm.css similarity index 100% rename from svr/res/css/comm.css rename to svr/web-res/css/comm.css diff --git a/svr/res/css/index.css b/svr/web-res/css/index.css similarity index 88% rename from svr/res/css/index.css rename to svr/web-res/css/index.css index 28229f1..fecc306 100644 --- a/svr/res/css/index.css +++ b/svr/web-res/css/index.css @@ -34,6 +34,12 @@ body { border-radius: 8px !important; } +@media screen and (max-width: 1100px){ + .layui-layer-iframe{ + overflow-y: hidden !important; + } +} + .language-mode{ border-radius: 8px; } @@ -60,19 +66,27 @@ body { position: absolute; right: 10px; float: right; - top: 20%; + top: 22%; display: grid; transition: top 0.5s; } .tl-rtc-file-side-tool a { - margin-top: 20px; + cursor: pointer; + border-radius: 50%; + padding: 10px; + margin-top: 5px; + transition: background .3s, box-shadow .3s; +} + +.tl-rtc-file-side-tool a:hover{ + background: #e8ebff; + box-shadow: #a9bcde40 0 7px 9px; } .tl-rtc-file-side-tool a i { font-size: 23px; font-weight: bold; - margin-right: 10px; cursor: pointer; color: black; } @@ -207,12 +221,31 @@ body { } .tl-rtc-file-receive-list-icon{ - position: fixed; - padding: 0px 10px 0px 10px; + position: absolute; + padding: 0 10px; right: 2%; bottom: 2%; font-size: 35px; - color: black; + color: #000; + display: inline-flex; +} + +.tl-rtc-file-local-net-room{ + overflow: hidden; + text-overflow: ellipsis; + word-break: break-all; + white-space: nowrap; + margin: 20px; + text-align: center; + background: white; + border-radius: 8px; + font-size: 16px; + cursor: pointer; +} + +.tl-rtc-file-local-net-room:hover{ + background: #e8ebff; + box-shadow: #a9bcde40 0 7px 9px; } .tl-rtc-file-tool { @@ -709,11 +742,12 @@ body { .setting-main { - height: 100%; + height: 100% !important; background-color: #fff; position: relative; left: 0; top: 0; + height: auto; } .setting-main-body { @@ -723,6 +757,43 @@ body { overflow: hidden; } +.setting-main-body .layui-icon-help{ + margin-left: 5px; + font-size: 12px; + border-radius: 50%; + background: #d6cd87; + padding: 2px; + cursor: pointer; +} + +.setting-main-body-intro{ + padding: 10px 20px; + display: inline-flex; + flex-direction: row; + align-items: center; + word-break: break-all; +} + +.setting-main-body-intro svg{ + width: 24px; + height: 24px; +} + +.setting-main-body-file{ + padding: 15px 50px; +} + +.setting-main-body-file-top{ + display: inline-flex; + flex-direction: row; + align-items: center; + word-break: break-all; +} + +.setting-main-body-intro div{ + margin-left: 10px; +} + .setting-main-body ul { padding: 15px; margin: 0px; @@ -739,6 +810,26 @@ body { .setting-main-body ul li { text-align: center; cursor: pointer; + margin-bottom: 10px; +} + +.setting-main-body ul li svg { + width: 40px; + height: 45px; +} + +.setting-main-body .settingOpenIcon{ + color: #4bd839; +} +.setting-main-body .settingOpenIcon, .setting-main-body .settingCloseIcon{ + width: 14px; + height: 14px; + position: absolute; + top: 10px; +} + +.setting-main-body .settingCloseIcon{ + color: red; } .setting-main-body ul li cite { @@ -749,7 +840,7 @@ body { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - font-size: 14px; + font-size: 12px; } .setting-main-body ul li i { @@ -942,6 +1033,81 @@ body { margin-left: 20%; } +#tl-rtc-file-wx-login-image img{ + width: 60%; + margin-left: 20%; + margin-top: 25px; + filter: blur(5px); +} + +.tl-rtc-file-wx-login-scan-ok{ + text-align: center; + position: relative; + margin-top: 40px; + margin-bottom: 50px; + width: 50%; + margin-left: 25%; +} + +#tl-rtc-file-wx-login-title{ + scale: 0.8; + margin-bottom: 10px; +} + +.tl-rtc-file-login-user{ + margin-top: 20px; + margin-bottom: 20px; + width: 80%; + margin-left: 10%; +} + +.tl-rtc-file-login-user-info{ + margin-top: 20px; + margin-bottom: 20px; + width: 80%; + margin-left: 10%; +} + +.tl-rtc-file-login-user-info-avatar{ + width: 50%; + margin-left: 25%; + margin-bottom: 10px; +} + +.tl-rtc-file-login-user-info-avatar img{ + width: 100%; + border-radius: 50%; +} + +#tl-rtc-file-user-help{ + cursor: pointer; + margin-left: 5px; +} + +.tl-rtc-file-login-user-info-name{ + text-align: center; + font-size: 15px; + font-weight: bold; + margin-top: 30px; + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; +} + +.tl-rtc-file-logout{ + width: 60%; + margin-left: 10%; + bottom: 20px; + position: absolute; +} + +.tl-rtc-file-logout button{ + width: 100%; + margin-bottom: 10px; +} + .isMediaing{ width: 50%; margin-left: 50%; @@ -1084,7 +1250,7 @@ body { bottom: 0px; position: absolute; width: 100%; - padding: 20px; + padding: 0px 15px 10px 15px; } .chating_input_body textarea{ diff --git a/svr/res/disclaimer.html b/svr/web-res/disclaimer.html similarity index 100% rename from svr/res/disclaimer.html rename to svr/web-res/disclaimer.html diff --git a/svr/res/home.html b/svr/web-res/home.html similarity index 100% rename from svr/res/home.html rename to svr/web-res/home.html diff --git a/svr/res/home_en.html b/svr/web-res/home_en.html similarity index 100% rename from svr/res/home_en.html rename to svr/web-res/home_en.html diff --git a/svr/res/image/44826979.png b/svr/web-res/image/44826979.png similarity index 100% rename from svr/res/image/44826979.png rename to svr/web-res/image/44826979.png diff --git a/svr/res/image/coffee.jpeg b/svr/web-res/image/coffee.jpeg similarity index 100% rename from svr/res/image/coffee.jpeg rename to svr/web-res/image/coffee.jpeg diff --git a/svr/res/image/drawcircle.png b/svr/web-res/image/drawcircle.png similarity index 100% rename from svr/res/image/drawcircle.png rename to svr/web-res/image/drawcircle.png diff --git a/svr/res/image/drawcirclefill.png b/svr/web-res/image/drawcirclefill.png similarity index 100% rename from svr/res/image/drawcirclefill.png rename to svr/web-res/image/drawcirclefill.png diff --git a/svr/res/image/drawdelete.png b/svr/web-res/image/drawdelete.png similarity index 100% rename from svr/res/image/drawdelete.png rename to svr/web-res/image/drawdelete.png diff --git a/svr/res/image/drawhexagon.png b/svr/web-res/image/drawhexagon.png similarity index 100% rename from svr/res/image/drawhexagon.png rename to svr/web-res/image/drawhexagon.png diff --git a/svr/res/image/drawhexagonfill.png b/svr/web-res/image/drawhexagonfill.png similarity index 100% rename from svr/res/image/drawhexagonfill.png rename to svr/web-res/image/drawhexagonfill.png diff --git a/svr/res/image/drawline.png b/svr/web-res/image/drawline.png similarity index 100% rename from svr/res/image/drawline.png rename to svr/web-res/image/drawline.png diff --git a/svr/res/image/drawrectangle.png b/svr/web-res/image/drawrectangle.png similarity index 100% rename from svr/res/image/drawrectangle.png rename to svr/web-res/image/drawrectangle.png diff --git a/svr/res/image/drawrectanglefill.png b/svr/web-res/image/drawrectanglefill.png similarity index 100% rename from svr/res/image/drawrectanglefill.png rename to svr/web-res/image/drawrectanglefill.png diff --git a/svr/res/image/drawrhomboid.png b/svr/web-res/image/drawrhomboid.png similarity index 100% rename from svr/res/image/drawrhomboid.png rename to svr/web-res/image/drawrhomboid.png diff --git a/svr/res/image/drawrhomboidfill.png b/svr/web-res/image/drawrhomboidfill.png similarity index 100% rename from svr/res/image/drawrhomboidfill.png rename to svr/web-res/image/drawrhomboidfill.png diff --git a/svr/res/image/drawstar.png b/svr/web-res/image/drawstar.png similarity index 100% rename from svr/res/image/drawstar.png rename to svr/web-res/image/drawstar.png diff --git a/svr/res/image/drawstarfill.png b/svr/web-res/image/drawstarfill.png similarity index 100% rename from svr/res/image/drawstarfill.png rename to svr/web-res/image/drawstarfill.png diff --git a/svr/res/image/drawtext.png b/svr/web-res/image/drawtext.png similarity index 100% rename from svr/res/image/drawtext.png rename to svr/web-res/image/drawtext.png diff --git a/svr/res/image/drawtriangle.png b/svr/web-res/image/drawtriangle.png similarity index 100% rename from svr/res/image/drawtriangle.png rename to svr/web-res/image/drawtriangle.png diff --git a/svr/res/image/drawtrianglefill.png b/svr/web-res/image/drawtrianglefill.png similarity index 100% rename from svr/res/image/drawtrianglefill.png rename to svr/web-res/image/drawtrianglefill.png diff --git a/svr/web-res/image/qrcode.jpeg b/svr/web-res/image/qrcode.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1e4a45fac06da8701d5bb582c63782b79576791c GIT binary patch literal 89413 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 literal 0 HcmV?d00001 diff --git a/svr/res/index.html b/svr/web-res/index.html similarity index 90% rename from svr/res/index.html rename to svr/web-res/index.html index 2cf126e..d141c84 100644 --- a/svr/res/index.html +++ b/svr/web-res/index.html @@ -14,6 +14,7 @@ + @@ -48,18 +49,38 @@
              - + +
              + +
              + +
              + + + + + + + + + - - - {{lang.sharing}}: {{screenShareTimes < 10 ? '0' + screenShareTimes : @@ -108,18 +124,12 @@
              - - - - - + - + style="right: 7px;top: 13px; width: 7px; height: 7px;"> @@ -127,20 +137,22 @@ - + + + + + - - - - @@ -173,7 +185,7 @@ - {{Math.min(sendFileRecoderList.length, 99)}}
              @@ -193,7 +205,7 @@ - {{Math.min(receiveChatRoomList.length, 99)}} @@ -217,7 +229,7 @@ {{lang.chat_comm}} - @@ -360,15 +372,15 @@ class="layui-icon layui-icon-time" @click="clickSendFileHistory">
              - {{Math.min(sendFileRecoderHistoryList.length, 99)}} + class="layui-icon layui-icon-print" @click="clickReceiveFile()"> - + {{Math.min(receiveFileRecoderList.length, 99)}} @@ -398,14 +410,14 @@ : {{remote.iceConnectionState}} - {{remote.p2pMode}} - {{remote.iceConnectionState}} - {{remote.p2pMode}} + {{remote.iceConnectionState}} - {{remote.p2pMode}} !!
              - {{Math.min(remote.receiveChatRoomSingleList.length, 99)}}
              @@ -437,16 +449,32 @@ -
              - - - - {{Math.min(receiveFileRecoderList.length, 99)}} - +
              +
              + + + + {{Math.min(receiveFileRecoderList.length, 99)}} + +
              +
              + + + + {{Math.min(localNetRoomList.length, 99)}} + +
              @@ -626,7 +654,7 @@ + + + ` + }) + }) + }, + // 打开扫码登录 + openWxLogin: function(){ + let that = this; + layer.closeAll(function () { + layer.open({ + type: 1, + closeBtn: 0, + fixed: true, + maxmin: false, + shadeClose: true, + area: ['350px', '380px'], + title: that.lang.wxlogin, + end : function(){ + if(that.checkWxLoginIntervalId){ + clearInterval(that.checkWxLoginIntervalId); + that.checkWxLoginCount = 0; + } + }, + success: async function (layero, index) { + document.querySelector(".layui-layer-title").style.borderTopRightRadius = "8px"; + document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "8px"; + document.querySelector(".layui-layer").style.borderRadius = "8px"; + document.querySelector(".layui-layer-content").style.overflow = "hidden"; + + let loadIndex = layer.load(1); + // 1min,30s 更新一次 + if(that.wxLoginQrCodePreUpdateTime === 0 || that.wxLoginQrCodePreUpdateTime < (new Date().getTime() - 1000 * 60 * 1.5)){ + let imgData = await axios.get("/api/login/qrcode?socketId="+that.socket.id,{ + responseType: 'blob' + }); + const imgSrc = URL.createObjectURL(imgData.data) + that.wxLoginQrCodePreUpdateTime = new Date().getTime(); + that.wxLoginQrCode = imgSrc; + } + document.querySelector("#tl-rtc-file-wx-login-image").innerHTML = ` + 二维码 + `; + layer.close(loadIndex); + + //开启接口轮训 + that.checkWxLoginIntervalId = setInterval(async () => { + if(that.checkWxLoginCount++ > 50){ + window.location.reload(); + } + let { data : { state: scanState, token } } = await axios.get("/api/login/getScanState?scene="+that.socket.id) + const scanDom = document.querySelector("#tl-rtc-file-wx-login-scan") + const defaultDom = document.querySelector("#tl-rtc-file-wx-login-default") + if(scanState === 'scan'){ + scanDom.style.display = 'block'; + defaultDom.style.display = 'none'; + }else if(scanState === 'auth_succ'){ + layer.close(index); + layer.msg(that.lang.login_succ); + setTimeout(() => { + window.location.reload(); + }, 500); + }else if(scanState === 'auth_fail'){ + layer.msg(that.lang.login_fail) + setTimeout(() => { + window.location.reload() + }, 500); + }else if(scanState === 'wait'){ + scanDom.style.display = 'none'; + defaultDom.style.display = 'block'; + } + }, 1500); + }, + content: ` +
              +
              + 二维码 +
              +
              +
              ${that.lang.login_info}
              +
              +
              + + + ` + }) + }) + }, + // 修改昵称 changeNickName : function(){ let that = this; layer.prompt({ @@ -521,7 +710,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { iceOk : function(state){ return ['completed', 'connected', 'checking', 'new'].includes(state); }, - consoleLogo : function(){ + printLogo : function(){ window.console.log(`%c____ TL-RTC-FILE-V${this.version} ____ \n____ FORK ME ON GITHUB ____ \n____ https://github.com/tl-open-source/tl-rtc-file ____`, this.logo) }, changeLanguage: function () { @@ -685,7 +874,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if (window.layedit) { that.txtEditId = layedit.build('chating_room_single_value', { tool: ['strong', 'italic', 'underline', 'del', '|', 'left', 'center', 'right', 'face'], - height: 120 + height: 100 }); } that.chatingRoomSingleTpl(); @@ -695,10 +884,15 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if(textareaIframe && textareaIframe.length === 1){ tlrtcfile.chatKeydown( document.getElementsByTagName("iframe")[0].contentDocument.body, - sendChatingRoomSingle + that.sendChatingRoomSingle ) } } + + document.getElementById("tl-sendChatingRoomSingle").addEventListener("click",function(){ + that.sendChatingRoomSingle(); + }) + }, cancel: function (index, layero) { this.chatRoomSingleSocketId = ""; @@ -742,7 +936,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              shift+enter | ${this.lang.enter_send} - +
              ` } @@ -778,9 +972,9 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { let height = 0; if (this.isMobile) { - height = document.documentElement.clientHeight - 335; + height = document.documentElement.clientHeight - 280; } else { - height = 300 + height = 325 } if (chatDomHeight > height) { @@ -932,19 +1126,19 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { return } - let fileRecorde = filterFile[0]; - if (fileRecorde.size > this.previewFileMaxSize) { + let fileRecorder = filterFile[0]; + if (fileRecorder.size > this.previewFileMaxSize) { layer.msg(`${this.lang.max_previewed} ${this.previewFileMaxSize / 1024 / 1024} ${this.lang.mb_file}`); return } let file = await new Promise((resolve, reject) => { let req = new XMLHttpRequest(); - req.open("GET", fileRecorde.href); + req.open("GET", fileRecorder.href); req.setRequestHeader('Accept', 'image/png'); req.responseType = "blob"; req.onload = () => { - resolve( new File([req.response], fileRecorde.name, { type: fileRecorde.type }) ); + resolve( new File([req.response], fileRecorder.name, { type: fileRecorder.type }) ); }; req.onerror = reject req.send(); @@ -1097,8 +1291,12 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { that.openaiChatTpl(); if(window.tlrtcfile.chatKeydown){ - tlrtcfile.chatKeydown(document.getElementById("openaiChat_value"), sendOpenaiChat) + tlrtcfile.chatKeydown(document.getElementById("openaiChat_value"), that.sendOpenaiChat) } + + document.getElementById("tl-sendOpenaiChat").addEventListener("click",function(){ + that.sendOpenaiChat(); + }); }, content: `
              @@ -1154,7 +1352,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              shift+enter | ${this.lang.enter_send} - +
              ` } @@ -1169,7 +1367,6 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { }) this.addUserLogs(this.lang.open_ai_chat) }, - // ai窗口渲染 openaiChatTpl: function (callback) { let tpl_html = document.getElementById("openaiChat_tpl"); let tpl_view_html = document.getElementById("openaiChat_tpl_view"); @@ -1189,7 +1386,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { let height = 0; if (this.isMobile) { - height = document.documentElement.clientHeight - 235; + height = document.documentElement.clientHeight - 200; } else { height = 350 } @@ -1316,162 +1513,6 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { }); } }, - // 打开设置 - setting: function () { - let that = this; - let options = { - type: 1, - fixed: false, - maxmin: false, - shadeClose: true, - area: ['300px', '350px'], - title: this.lang.setting, - success: function (layero, index) { - document.querySelector(".layui-layer-title").style.borderTopRightRadius = "15px" - document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "15px" - document.querySelector(".layui-layer").style.borderRadius = "15px" - document.querySelector(".layui-layer-content").style.borderRadius = "15px" - window.form.render() - }, - content: ` -
              - ` - } - layer.closeAll(function () { - layer.open(options) - }) - this.addUserLogs(this.lang.open_setting) - }, - // 自定义ws地址 - customWsHost: function () { - let that = this; - if(window.localStorage.getItem("tl-rtc-file-custom-ws-host")){ - window.localStorage.removeItem("tl-rtc-file-custom-ws-host") - layer.msg(that.lang.close_custom_ws_url) - setTimeout(() => { - window.location.reload() - }, 500); - }else{ - layer.prompt({ - formType: 0, - value: 'wss://', - title: that.lang.input_custom_ws_url, - }, function (value, index, elem) { - if(!/^wss?:\/\/[^\s/$.?#].[^\s]*$/.test(value)){ - layer.msg(that.lang.ws_url_error) - return - } - - layer.close(index); - - window.localStorage.setItem("tl-rtc-file-custom-ws-host", value) - layer.msg(that.lang.open_custom_ws_url) - setTimeout(() => { - window.location.reload() - }, 500); - }); - } - }, - // 打开中继设置面板 - relaySetting: function () { - let options = { - type: 1, - fixed: false, - maxmin: false, - shadeClose: true, - area: ['300px', '350px'], - title: this.lang.relay_setting, - success: function (layero, index) { - let active = null; - document.querySelector(".layui-layer-title").style.borderTopRightRadius = "15px" - document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "15px" - document.querySelector(".layui-layer").style.borderRadius = "15px" - document.querySelector(".layui-layer-content").style.borderRadius = "15px" - }, - content: ` -
              -
              -
              -

              ${this.lang.relay_server_current} '${useTurn ? this.lang.on : this.lang.off}'

              -

              ${this.lang.relay_server_current_detail}

              -
              -
              - - -
              -
              -
              -
              -
              - ` - } - layer.closeAll(function () { - layer.open(options) - }) - this.addUserLogs(this.lang.open_relay_setting) - }, // 创建/加入音视频房间 startVideoShare: function () { if (!this.switchData.openVideoShare) { @@ -1900,14 +1941,14 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { id: that.lang.web_screen_recording, nickName : that.nickName, href: res.src, - style: 'color: #ff5722;text-decoration: underline;', name: 'screen-recording-' + res.donwId + '.mp4', type: "webm/mp4", size: res.size, progress: 100, done: true, start: 0, - cost: res.times + cost: res.times, + indexedDB : false }) that.socket.emit('message', { emitType: "stopScreen", @@ -1935,6 +1976,14 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { shadeClose : true, area: ['600px', '600px'], title: this.lang.public_chat_channel, + end: function () { + if(that.chatCommFilterGood){ + that.chatCommFilterGood = false; + } + if(that.chatCommFilterTop){ + that.chatCommFilterTop = false; + } + }, success: function (layero, index) { let lIndex = layer.load(1); setTimeout(() => { @@ -1943,8 +1992,36 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if (window.layer && window.layui && window.layedit) { that.txtEditId = layedit.build('chating_comm_value', { - tool: ['strong', 'italic', 'underline', 'del', 'face'], - height: 120 + tool: ['strong', 'del', 'face', 'closeImage', 'good', 'top'], + height: 100, + good : { + goodCallback : function(){ + const goodDom = document.getElementById("layedit-good"); + if(goodDom){ + if(!that.chatCommFilterGood){ + goodDom.innerText = '取消精选' + }else{ + goodDom.innerText = '精选消息' + } + } + that.chatCommFilterGood = !that.chatCommFilterGood; + that.chatingCommTpl(); + } + }, + top : { + topCallback : function(){ + const topDom = document.getElementById("layedit-top"); + if(topDom){ + if(!that.chatCommFilterTop){ + topDom.innerText = '取消置顶' + }else{ + topDom.innerText = '置顶消息' + } + } + that.chatCommFilterTop = !that.chatCommFilterTop; + that.chatingCommTpl(); + } + } }); } @@ -1955,10 +2032,14 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if(textareaIframe && textareaIframe.length === 1){ tlrtcfile.chatKeydown( document.getElementsByTagName("iframe")[0].contentDocument.body, - sendChatingComm + that.sendChatingComm ) } } + + document.getElementById("tl-sendChatingComm").addEventListener('click',function(){ + that.sendChatingComm(); + }) }, content: `
              @@ -1969,8 +2050,24 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              img
              -
              ${this.lang.room}: {{info.room}} - ${this.lang.user}: {{info.socketId}} - ${this.lang.time}: {{info.timeAgo}}
              -
              说: {{- info.msg}}
              +
              + {{# if(info.top) { }} + + {{# } }} + ${this.lang.room}: {{info.room}} - + ${this.lang.user}: {{info.socketId}} - + ${this.lang.time}: {{info.timeAgo}} + {{# if(info.admin) { }} + + {{# } }} +
              +
              + 说: {{- info.msg}} +
              {{# }); }} @@ -1979,7 +2076,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              shift+enter | ${this.lang.enter_send} - +
              ` } @@ -2002,16 +2099,23 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if (tpl_html && tpl_view_html) { - this.tpl(tpl_html, this.receiveChatCommList, tpl_view_html) + let filterList = this.receiveChatCommList; + if(this.chatCommFilterGood){ + filterList = this.receiveChatCommList.filter(item => item.admin) + }else if(this.chatCommFilterTop){ + filterList = this.receiveChatCommList.filter(item => item.top) + } + + this.tpl(tpl_html, filterList, tpl_view_html) let chatDom = document.querySelector("#chating_comm_tpl_view") let chatDomHeight = chatDom.clientHeight let height = 0; if (this.isMobile) { - height = document.documentElement.clientHeight - 335; + height = document.documentElement.clientHeight - 280; } else { - height = 300 + height = 325 } if (chatDomHeight > height) { @@ -2070,6 +2174,58 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { layedit.setContent(this.txtEditId, "", false) }, + // 加载系统房间消息 + loadSystemRoomMsg : async function(){ + if (!this.isJoined) { + layer.msg(this.lang.please_join_then_send) + this.addUserLogs(this.lang.please_join_then_send); + return + } + + if (!this.isSystemRoom) { + return; + } + + let systemMsgList = []; + let cacheList = localStorage.getItem('tl-rtc-file-question-list'); + let reflushCache = false; + if(cacheList){ + const { questionList, time } = JSON.parse(cacheList); + if(time > Date.now() - this.systemMsgCacheTime){ + console.log("question list use cache") + systemMsgList = questionList || []; + }else{ + reflushCache = true; + } + }else{ + reflushCache = true; + } + + if(reflushCache){ + console.log("question list use request") + let res = await axios.get('/api/dog/question/list'); + if(res.data && res.data.code === 200){ + systemMsgList = res.data.questionList || []; + localStorage.setItem('tl-rtc-file-question-list', JSON.stringify({ + questionList : systemMsgList, + time : Date.now() + })); + } + } + + systemMsgList.forEach(item => { + this.receiveChatRoomList.push({ + socketId: item.socketId, + content: item.msg, + nickName : item.nickName , + type : item.type, + time: item.time, + timeAgo : window.util ? util.timeAgo(item.time) : item.time + }); + }) + + this.chatingRoomTpl(); + }, // 房间内群聊弹窗 openChatingRoom: function () { let that = this; @@ -2085,7 +2241,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if (window.layer && window.layui && window.layedit) { that.txtEditId = layedit.build('chating_room_value', { tool: ['strong', 'italic', 'underline', 'del', '|', 'left', 'center', 'right', 'face'], - height: 120 + height: 100 }); } @@ -2096,10 +2252,14 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { if(textareaIframe && textareaIframe.length === 1){ tlrtcfile.chatKeydown( document.getElementsByTagName("iframe")[0].contentDocument.body, - sendChatingRoom + that.sendChatingRoom ) } } + + document.getElementById("tl-sendChatingRoom").addEventListener("click",function(){ + that.sendChatingRoom(); + }) }, content: `
              @@ -2112,6 +2272,15 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              ${this.lang.user}: {{info.nickName}} - + {{# if(info.type === 'QUESTION') { }} + + {{# }else if(info.type === 'ANSWER') { }} + + {{# } }} id: {{info.socketId}} - ${this.lang.time}: {{info.timeAgo}}
              @@ -2140,7 +2309,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => {
              shift+enter | ${this.lang.enter_send} - +
              ` } @@ -2170,9 +2339,9 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { let height = 0; if (this.isMobile) { - height = document.documentElement.clientHeight - 335; + height = document.documentElement.clientHeight - 280; } else { - height = 300 + height = 325 } if (chatDomHeight > height) { @@ -2234,1176 +2403,871 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { this.addUserLogs(this.lang.text_send_done); layedit.setContent(this.txtEditId, "", false) + + //清空系统记录缓存 + localStorage.removeItem('tl-rtc-file-question-list'); }, - // 中继信息提示 - useTurnMsg: function () { - layer.msg(this.lang.relay_on) - this.addUserLogs(this.lang.relay_on) - }, - // 当前网络状态 - networkMsg: function () { - layer.msg(this.lang.current_network + (this.network !== 'wifi' ? this.lang.mobile_data : this.network)) - this.addUserLogs(this.lang.current_network + (this.network !== 'wifi' ? this.lang.mobile_data : this.network)) - }, - // 添加弹窗 - addPopup: function (msg) { - this.popUpList.push({ - title : msg.title, - message : msg.msg - }) - }, - // 记录系统日志 - addSysLogs: function (msg) { - this.addLogs(msg, "【"+this.lang.sys_log+"】: ") - }, - // 记录用户操作日志 - addUserLogs: function (msg) { - this.addLogs(msg, "【"+this.lang.op_log+"】: ") - }, - // 记录日志 - addLogs: function (msg, type) { - if (this.logs.length > 1000) { - this.logs.shift(); + //创建文件发送房间 + createFileRoom: function () { + this.openRoomInput = !this.openRoomInput; + + if(this.openRoomInput){ + return } - this.logs.unshift({ - type: type, - msg: msg, - time: new Date().toLocaleString() - }) - }, - // 清空日志 - cleanLogs: function () { - this.logs = [] - this.addSysLogs(this.lang.clear_log) - }, - // 发送建议反馈 - sendBugs: function () { - let that = this; - $("#sendBugs").removeClass("layui-anim-rotate") - setTimeout(() => { - $("#sendBugs").addClass("layui-anim-rotate") - }, 50) - setTimeout(() => { - layer.prompt({ - formType: 2, - title: that.lang.please_describe_your_feedback, - }, function (value, index, elem) { - that.socket.emit('message', { - emitType: "sendBugs", - msg: value, - room: that.roomId, - to: that.socketId - }); - layer.msg(that.lang.send_bug_info_ok) - layer.close(index); - that.addUserLogs(that.lang.send_bug_info_ok + ", " + value); - }); - }, 500); - }, - // 随机刷新房间号 - refleshRoom: function () { - if (!this.isJoined) { - this.roomId = parseInt(Math.random() * 100000); + + this.roomId = this.roomId.toString().replace(/\s*/g, "") + if (this.roomId === null || this.roomId === undefined || this.roomId === '') { + layer.msg(this.lang.please_enter_room_num) + this.addUserLogs(this.lang.please_enter_room_num); + return; + } + if (!this.switchData.allowChinese && window.tlrtcfile.containChinese(this.roomId)) { + layer.msg(this.lang.room_num_no_zh) + this.addUserLogs(this.lang.room_num_no_zh); + return; + } + if (!this.switchData.allowNumber && window.tlrtcfile.containNumber(this.roomId)) { + layer.msg(this.lang.room_num_no_number) + this.addUserLogs(this.lang.room_num_no_number); + return; + } + if (!this.switchData.allowSymbol && window.tlrtcfile.containSymbol(this.roomId)) { + layer.msg(this.lang.room_num_no_special_symbols) + this.addUserLogs(this.lang.room_num_no_special_symbols); + return; + } + if (this.chooseFileList.length > 0) { + layer.msg(this.lang.please_join_then_choose_file) + this.addUserLogs(this.lang.please_join_then_choose_file); + return; + } + if (this.roomId) { + if (this.roomId.toString().length > 15) { + layer.msg(this.lang.room_num_too_long) + this.addUserLogs(this.lang.room_num_too_long); + return; + } + this.socket.emit('createAndJoin', { + room: this.roomId, + type : 'file', + nickName : this.nickName, + langMode : this.langMode, + ua: this.isMobile ? 'mobile' : 'pc', + network : this.network, + localNetRoom : this.useLocalNetworkRoomShare + }); + this.isJoined = true; this.addPopup({ - title : this.lang.refresh_room, - msg : this.lang.you_refresh_room + this.roomId + title : this.lang.file_room, + msg : this.lang.you_enter_file_room + this.roomId }); - this.addUserLogs(this.lang.you_refresh_room + this.roomId); + this.addUserLogs( this.lang.you_enter_file_room + this.roomId); } }, - // 复制分享房间url - shareUrl: function () { - let that = this; - layer.closeAll(function () { - layer.open({ - type: 1, - closeBtn: 0, - fixed: true, - maxmin: false, - shadeClose: true, - area: ['350px', '380px'], - title: that.lang.share_join_room, - success: function (layero, index) { - let shareArgs = { - r : that.roomId, - t : that.roomType - }; - if(that.roomType === 'live'){ - shareArgs.lsm = that.liveShareMode; - shareArgs.lsr = 'viewer'; - } - let content = window.tlrtcfile.addUrlHashParams(shareArgs); - document.querySelector(".layui-layer-title").style.borderTopRightRadius = "8px"; - document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "8px"; - document.querySelector(".layui-layer").style.borderRadius = "8px"; - if(window.tlrtcfile.getQrCode){ - tlrtcfile.getQrCode("tl-rtc-file-room-share-image", content) - } - - document.querySelector("#shareUrl").setAttribute("data-clipboard-text", content); - let clipboard = new ClipboardJS('#shareUrl'); - clipboard.on('success', function (e) { - e.clearSelection(); - setTimeout(() => { - layer.msg(that.lang.copy_room_link) - }, 500); - }); - that.addUserLogs(that.lang.copy_room_link); - }, - content: ` -
              -
              ${that.lang.share_join_room_done} - -
              -
              -
              - ` - }) - }) - this.addUserLogs(this.lang.open_share_join_room) + //创建流媒体房间 + createMediaRoom: function (type) { + this.roomId = this.roomId.toString().replace(/\s*/g, "") + if (this.roomId === null || this.roomId === undefined || this.roomId === '') { + layer.msg(this.lang.please_enter_room_num) + this.addUserLogs(this.lang.please_enter_room_num); + return; + } + if (this.roomId) { + if (this.roomId.toString().length > 15) { + layer.msg(this.lang.room_num_too_long) + this.addUserLogs(this.lang.room_num_too_long); + return; + } + this.socket.emit('createAndJoin', { + room: this.roomId, + type: type, + nickName : this.nickName, + langMode : this.langMode, + ua: this.isMobile ? 'mobile' : 'pc', + network : this.network, + liveShareRole : this.liveShareRole, + localNetRoom : this.useLocalNetworkRoomShare + }); + this.isJoined = true; + this.roomType = type; + this.addPopup({ + title : this.lang.stream_room, + msg : this.lang.you_enter_stream_room + this.roomId + }); + this.addUserLogs(this.lang.you_enter_stream_room + this.roomId); + } }, - // 获取分享的取件码文件 - handlerGetCodeFile: function () { - let that = this; - let hash = window.location.hash || ""; - if (hash && hash.includes("#")) { - let codeIdArgs = hash.split("c="); - if (codeIdArgs && codeIdArgs.length > 1) { - this.codeId = (codeIdArgs[1] + "").replace(/\s*/g, "").substring(0, 40); - layer.confirm(this.lang.is_pickup_code, (index) => { - window.location.hash = ""; - layer.close(index) - that.getCodeFile(); - }, (index) => { - that.codeId = ""; - window.location.hash = ""; - layer.close(index) - }) - this.addPopup({ - title : this.lang.share_pickup_code_file, - msg : this.lang.get_pickup_file + this.codeId - }); - this.addUserLogs(this.lang.get_pickup_file + this.codeId); + //创建密码房间 + createPasswordRoom: function (password) { + this.roomId = this.roomId.toString().replace(/\s*/g, "") + if (this.roomId === null || this.roomId === undefined || this.roomId === '') { + layer.msg(this.lang.please_enter_room_num) + this.addUserLogs(this.lang.please_enter_room_num); + return; + } + if (this.roomId) { + if (this.roomId.toString().length > 15) { + layer.msg(this.lang.room_num_too_long) + this.addUserLogs(this.lang.room_num_too_long); + return; } + if (password.toString().length > 15) { + layer.msg(this.lang.password_too_long) + this.addUserLogs(this.lang.password_too_long); + return; + } + this.socket.emit('createAndJoin', { + room: this.roomId, + type : 'password', + password: password, + nickName : this.nickName, + langMode : this.langMode, + ua: this.isMobile ? 'mobile' : 'pc', + network : this.network, + localNetRoom : this.useLocalNetworkRoomShare + }); + this.isJoined = true; + this.addPopup({ + title : this.lang.password_room, + msg : this.lang.you_enter_password_room + this.roomId + }); + this.addUserLogs(this.lang.you_enter_password_room + this.roomId); } }, - // 分享进入房间 - handlerJoinShareRoom: function () { - let that = this; - let hash = window.location.hash || ""; - if (!hash || !hash.includes("#") || !hash.includes("r=")) { - return + //退出房间 + exitRoom: function () { + if (this.roomId) { + this.socket.emit('exit', { + from: this.socketId, + room: this.roomId, + recoderId: this.recoderId + }); + } + for (let i in this.rtcConns) { + let rtcConnect = this.rtcConns[i]; + rtcConnect.close(); + rtcConnect = null; } - if (!window.layer) { - return + window.location.reload(); + }, + //创立链接 + createRtcConnect: function (id) { + if (id === undefined) { + return; } - //房间号 - let roomIdArgs = tlrtcfile.getRequestHashArgs("r"); - if (!roomIdArgs) { - return + let that = this; + let rtcConnect = new RTCPeerConnection(this.config); + + //ice + rtcConnect.onicecandidate = (e) => { + that.iceCandidate(rtcConnect, id, e) + }; + + rtcConnect.oniceconnectionstatechange = (e) => { + that.addSysLogs("iceConnectionState: " + rtcConnect.iceConnectionState); + + //如果是断开连接,并且没有使用turn服务器,提示开启turn服务器 + if(rtcConnect.iceConnectionState === 'disconnected' && !this.useTurn){ + layer.msg(that.lang.please_use_turn_server); + that.addSysLogs(that.lang.please_use_turn_server); + } + that.setRemoteInfo(id, { + iceConnectionState : rtcConnect.iceConnectionState + }) } - this.roomId = (roomIdArgs + "").replace(/\s*/g, "").substring(0, 15); - //房间类型 - let typeArgs = tlrtcfile.getRequestHashArgs("t"); + //媒体流通道 + rtcConnect.ontrack = (e) => { + that.mediaTrackHandler(e, id) + }; - layer.confirm(this.lang.join_room + this.roomId, (index) => { - window.location.hash = ""; - layer.close(index) - that.openRoomInput = true; - that.isShareJoin = true; - if(typeArgs && ['screen','live','video','audio'].includes(typeArgs)){ - if(typeArgs === 'screen'){ - that.startScreenShare(); - }else if(typeArgs === 'live'){ - //直播房间模式 - let lsm = tlrtcfile.getRequestHashArgs("lsm"); - if(['video', 'live', ''].includes(lsm)){ - that.liveShareMode = lsm; - } - //直播房间身份 - let lsr = tlrtcfile.getRequestHashArgs("lsr"); - if(['owner', 'viewer'].includes(lsr)){ - that.liveShareRole = lsr; - } - that.startLiveShare(); - }else if(typeArgs === 'video'){ - that.startVideoShare(); - }else if(typeArgs === 'audio'){ - that.startAudioShare(); - } - }else{ - that.createFileRoom(); + //文件发送数据通道 + let sendFileDataChannel = rtcConnect.createDataChannel('sendFileDataChannel'); + sendFileDataChannel.binaryType = 'arraybuffer'; + sendFileDataChannel.addEventListener('open', (event) => { + if (sendFileDataChannel.readyState === 'open') { + that.addSysLogs(that.lang.establish_connection) } - }, (index) => { - that.roomId = ""; - window.location.hash = ""; - layer.close(index) - }) - this.addPopup({ - title : this.lang.share_join_room, - msg : this.lang.you_join_room + this.roomId }); - this.addUserLogs(this.lang.you_join_room + this.roomId); - }, - // 赞助面板 - coffee: function () { - let options = { - type: 1, - fixed: false, - maxmin: false, - shadeClose: true, - area: ['300px', '350px'], - title: this.lang.donate, - success: function (layero, index) { - document.querySelector(".layui-layer-title").style.borderTopRightRadius = "8px"; - document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "8px"; - document.querySelector(".layui-layer").style.borderRadius = "8px"; - }, - content: `img ` + sendFileDataChannel.addEventListener('close', (event) => { + if (sendFileDataChannel.readyState === 'close') { + that.addSysLogs(that.lang.connection_closed) + } + }); + sendFileDataChannel.addEventListener('error', (error) => { + console.error(error.error) + that.addSysLogs(that.lang.connection_disconnected + ",file:e=" + error) + that.removeStream(null, id, null) + }); + + //自定义数据发送通道 + let sendDataChannel = rtcConnect.createDataChannel('sendDataChannel'); + sendDataChannel.binaryType = 'arraybuffer'; + sendDataChannel.addEventListener('open', (event) => { + if (sendDataChannel.readyState === 'open') { + that.addSysLogs(that.lang.establish_connection) + } + }); + sendDataChannel.addEventListener('close', (event) => { + if (sendDataChannel.readyState === 'close') { + that.addSysLogs(that.lang.connection_closed) + } + }); + sendDataChannel.addEventListener('error', (error) => { + console.error(error.error) + that.addSysLogs(that.lang.connection_disconnected + ",cus:e=" + error) + that.removeStream(null, id, null) + }); + + rtcConnect.addEventListener('datachannel', (event) => { + that.initReceiveDataChannel(event, id); + }); + + rtcConnect.onremovestream = (e) => { + that.removeStream(rtcConnect, id, e) + }; + + //保存peer连接 + this.rtcConns[id] = rtcConnect; + if (!this.remoteMap[id]) { + Vue.set(this.remoteMap, id, { + id: id, + receiveChatRoomSingleList : [], + p2pMode : '识别中...', + sendFileDataChannel: sendFileDataChannel, + sendDataChannel : sendDataChannel + }) } - layer.closeAll(function () { - layer.open(options) - }) - this.addUserLogs(this.lang.open_donate) + + return rtcConnect; }, - //点击下载文件面板 - clickReceiveFile: function () { - if(this.receiveFileRecoderList.length === 0){ - layer.msg(this.lang.no_received_file) - return - } - this.showReceiveFile = !this.showReceiveFile; - if (this.showReceiveFile) { - this.addUserLogs(this.lang.expand_receive_file); - this.receiveFileMaskHeightNum = 20; - } else { - this.receiveFileMaskHeightNum = 150; - this.addUserLogs(this.lang.collapse_receive_file); + //获取本地与远程连接 + getOrCreateRtcConnect: function (id) { + // 获取rtc缓存连接 + let rtcConnect = this.rtcConns[id]; + // 不存在,创建一个 + if (typeof (rtcConnect) == 'undefined') { + rtcConnect = this.createRtcConnect(id); } + return rtcConnect; }, - //点击已选文件面板 - clickChooseFile: function () { - if(!this.hasManInRoom && !this.showChooseFile){ - layer.msg(this.lang.room_least_two_can_send_content) - return - } - this.showChooseFile = !this.showChooseFile; - if (this.showChooseFile) { - this.chooseFileMaskHeightNum = 20; - this.addUserLogs(this.lang.expand_selected_file); - } else { - this.chooseFileMaskHeightNum = 150; - this.addUserLogs(this.lang.collapse_selected_file); + //远程媒体流处理 + mediaTrackHandler: function(event, id){ + let that = this; + + let video = null; + + const remoteRtc = this.getRemoteInfo(id); + const remoteName = remoteRtc.nickName || ""; + + if(event.track.kind === 'audio'){ + // audio-track事件,除了语音连麦房间之外,其他都可以跳过,因为音视频/直播/屏幕共享他们的音频流都并入了video-track了 + if(that.roomType !== 'audio'){ + return + } + + //连麦房间,只有音频数据 + $(`#mediaAudioRoomList`).append(` +
              ${remoteName}
              +
              + + + + + +
              + `); + video = document.querySelector(`#otherMediaAudioShare${id}`); } - }, - //点击待发送文件面板 - clickSendFile: function () { - if(!this.hasManInRoom && !this.showSendFile){ - layer.msg(this.lang.room_least_two_can_send_content) - return + + if(this.roomType === 'video'){ + $(`#mediaVideoRoomList`).append(` +
              ${remoteName}
              +
              + + + + +
              + `); + video = document.querySelector(`#otherMediaVideoShare${id}`); + } else if(this.roomType === 'screen'){ + $(`#mediaScreenRoomList`).append(` +
              ${remoteName}
              +
              + + +
              + `); + video = document.querySelector(`#otherMediaScreenShare${id}`); + } else if(this.roomType === 'live'){ + + if(this.liveShareRole === 'viewer'){ + $(`#mediaLiveRoomList`).append(` +
              ${remoteName}
              +
              + + + + +
              + `); + } + + video = document.querySelector(`#otherMediaLiveShare${id}`); } - this.showSendFile = !this.showSendFile; - if (this.showSendFile) { - this.sendFileMaskHeightNum = 20; - this.addUserLogs(this.lang.expand_wait_send_file); - } else { - this.sendFileMaskHeightNum = 150; - this.addUserLogs(this.lang.collapse_wait_send_file); + + if(video){ + video.addEventListener('loadedmetadata', function() { + video.play(); + that.addSysLogs("loadedmetadata") + // ios 微信浏览器兼容问题 + document.addEventListener('WeixinJSBridgeReady', function () { + that.addSysLogs("loadedmetadata WeixinJSBridgeReady") + video.play(); + }, false); + }); + document.addEventListener('WeixinJSBridgeReady', function () { + that.addSysLogs("WeixinJSBridgeReady") + video.play(); + }, false); + video.srcObject = event.streams[0] + video.play(); } }, - //点击发送文件历史记录面板 - clickSendFileHistory: function () { - if(this.sendFileRecoderHistoryList.length === 0){ - layer.msg(this.lang.no_send_file) - return - } - this.showSendFileHistory = !this.showSendFileHistory; - if (this.showSendFileHistory) { - this.sendFileHistoryMaskHeightNum = 20; - this.addUserLogs(this.lang.expand_send_file_record); - } else { - this.sendFileHistoryMaskHeightNum = 150; - this.addUserLogs(this.lang.collapse_send_file_record); - } - }, - //点击查看日志面板 - clickLogs: function (e) { - this.showLogs = !this.showLogs; - this.touchResize(); - if (this.showLogs) { - this.addUserLogs(this.lang.expand_log); - this.logMaskHeightNum = 0; - } else { - this.addUserLogs(this.lang.collapse_log); - this.logMaskHeightNum = -150; + //编码组装发送文件数据,设置好每次分片的文件头信息 + encodeSendFileBuffer: function ({recoder, buffer, fragment, event}) { + let fileInfoString = JSON.stringify({ + i: recoder.index, //当前文件块所属的索引 + f: fragment, //当前buffer所处的分片块 + }); + //填充 + const paddedFileInfoString = fileInfoString.padEnd(this.fileInfoBufferHeaderLen, '\0'); + const combindBuffer = new ArrayBuffer(this.fileInfoBufferHeaderLen + buffer.byteLength); + + const combinedUint8Array = new Uint8Array(combindBuffer); + for (let i = 0; i < paddedFileInfoString.length; i++) { + combinedUint8Array[i] = paddedFileInfoString.charCodeAt(i); } + combinedUint8Array.set(new Uint8Array(buffer), this.fileInfoBufferHeaderLen); + + return combindBuffer; }, - //点击打开音视频面板 - clickMediaVideo: function () { - this.showMedia = !this.showMedia; - this.touchResize(); - if (this.showMedia) { - this.addUserLogs(this.lang.expand_video); - this.mediaVideoMaskHeightNum = 0; - if(this.clientWidth < 500){ - document.getElementById("iamtsm").style.marginLeft = '0'; - }else{ - document.getElementById("iamtsm").style.marginLeft = "50%"; - } - } else { - this.addUserLogs(this.lang.collapse_video); - this.mediaVideoMaskHeightNum = -150; - document.getElementById("iamtsm").style.marginLeft = "0"; + //解码组装接收文件数据 + decodeReceiveFileBuffer: function (buffer) { + const receivedUint8Array = new Uint8Array(buffer); + const fileInfoString = String.fromCharCode(...receivedUint8Array.slice(0, this.fileInfoBufferHeaderLen)); + const trimmedFileInfoString = fileInfoString.replace(/\0/g, ''); + const fileInfo = JSON.parse(trimmedFileInfoString); + return { + buffer: receivedUint8Array.slice(this.fileInfoBufferHeaderLen), + index: fileInfo.i, + fragment: fileInfo.f } }, - //点击打开屏幕共享面板 - clickMediaScreen: function () { - this.showMedia = !this.showMedia; - this.touchResize(); - if (this.showMedia) { - this.addUserLogs(this.lang.expand_screen_sharing); - this.mediaScreenMaskHeightNum = 0; - if(this.clientWidth < 500){ - document.getElementById("iamtsm").style.marginLeft = "0"; - }else{ - document.getElementById("iamtsm").style.marginLeft = "50%"; - } - } else { - this.addUserLogs(this.lang.collapse_screen_sharing); - this.mediaScreenMaskHeightNum = -150; - document.getElementById("iamtsm").style.marginLeft = "0"; + //每个记录发送完毕后都检查下是否全部发送完 + allFileSendedCheckHandler : function(){ + let allDone = this.sendFileRecoderList.filter(item => { + return item.done; + }).length === this.sendFileRecoderList.length; + + // 全部发完 + if(allDone){ + this.chooseFileList = [] + this.sendFileRecoderList = [] + this.chooseFileRecoderList = [] + this.chooseFileRecoderAutoNext = false; + this.addPopup({ + title : this.lang.send_file, + msg : this.lang.file_send_done + }); + this.addSysLogs(this.lang.file_send_done) + this.allSended = true; + this.isSending = false; + + return true } - }, - //点击打开直播面板 - clickMediaLive: function () { - this.showMedia = !this.showMedia; - this.touchResize(); - if (this.showMedia) { - this.addUserLogs(this.lang.expand_live); - if(this.clientWidth < 500){ - document.getElementById("iamtsm").style.marginLeft = "0"; - }else{ - document.getElementById("iamtsm").style.marginLeft = "50%"; - } - this.mediaLiveMaskHeightNum = 0; - } else { - this.addUserLogs(this.lang.collapse_live); - this.mediaLiveMaskHeightNum = -150; - document.getElementById("iamtsm").style.marginLeft = "0"; + + //在每次发送完后的检查时, 过滤掉已经发送完毕的记录 + this.chooseFileRecoderList = this.chooseFileRecoderList.filter(item=>{ + return !item.done; + }); + + // 在每次发送完后的检查时,如果是开启了自动排队发送,调用自动发送 + if(this.chooseFileRecoderAutoNext){ + this.sendFileToSingleAuto(); } + + return false }, - clickMediaAudio : function(){ - this.showMedia = !this.showMedia; - this.touchResize(); - if (this.showMedia) { - this.addUserLogs(this.lang.expand_audio); - if(this.clientWidth < 500){ - document.getElementById("iamtsm").style.marginLeft = "0"; - }else{ - document.getElementById("iamtsm").style.marginLeft = "50%"; - } - this.mediaAudioMaskHeightNum = 0; - } else { - this.addUserLogs(this.lang.collapse_audio); - this.mediaAudioMaskHeightNum = -150; - document.getElementById("iamtsm").style.marginLeft = "0"; + // 指定单独发送文件给用户 + sendFileToSingle: function(recoder){ + layer.msg(`${this.lang.send_to_user_separately} ${recoder.id}`) + + if(!this.hasManInRoom){ + layer.msg(this.lang.room_least_two_can_send_content) + return } + + this.chooseFileRecoderList = [recoder]; + this.sendFileRecoderInfo(); }, - typeInArr: function(arr, type, name = ""){ - if(type === ''){ - let fileTail = name.split(".").pop() - return arr.filter(item=>{ - return fileTail.toLowerCase().includes(item) && name.endsWith("."+fileTail); - }).length > 0; - }else{ - return arr.filter(item=>{ - return type.toLowerCase().includes(item); - }).length > 0; + // 自动单独发送文件给用户 + sendFileToSingleAuto: function(){ + if(!this.hasManInRoom){ + layer.msg(this.lang.room_least_two_can_send_content) + return } - }, - //文件大小 - getFileSizeStr: function (size) { - let sizeStr = (size / 1048576).toString(); - let head = sizeStr.split(".")[0]; - let tail = ""; - if (sizeStr.split(".")[1]) { - tail = sizeStr.split(".")[1].substring(0, 3); + + //当前自动切换文件是开启的 + if(this.chooseFileRecoderAutoNext){ + let chooseRecoder = this.sendFileRecoderList.filter(item=>{ + return !item.done; + }).shift(); + + if(chooseRecoder){ + setTimeout(() => { + this.chooseFileRecoderList = [chooseRecoder]; + this.sendFileRecoderInfo(); + }, 1000); + } } - return head + '.' + tail + "M"; }, - //创建文件发送房间 - createFileRoom: function () { - this.openRoomInput = !this.openRoomInput; + // 一键发送 , 根据设置的规则自动选择发送模式,支持自动排队发送,并发发送 + sendFileToAll: function(){ + layer.msg(`${this.lang.send_to_all_user}`) - if(this.openRoomInput){ + if(!this.hasManInRoom){ + layer.msg(this.lang.room_least_two_can_send_content) return } - this.roomId = this.roomId.toString().replace(/\s*/g, "") - if (this.roomId === null || this.roomId === undefined || this.roomId === '') { - layer.msg(this.lang.please_enter_room_num) - this.addUserLogs(this.lang.please_enter_room_num); - return; - } - if (!this.switchData.allowChinese && window.tlrtcfile.containChinese(this.roomId)) { - layer.msg(this.lang.room_num_no_zh) - this.addUserLogs(this.lang.room_num_no_zh); - return; - } - if (!this.switchData.allowNumber && window.tlrtcfile.containNumber(this.roomId)) { - layer.msg(this.lang.room_num_no_number) - this.addUserLogs(this.lang.room_num_no_number); - return; - } - if (!this.switchData.allowSymbol && window.tlrtcfile.containSymbol(this.roomId)) { - layer.msg(this.lang.room_num_no_special_symbols) - this.addUserLogs(this.lang.room_num_no_special_symbols); - return; - } - if (this.chooseFileList.length > 0) { - layer.msg(this.lang.please_join_then_choose_file) - this.addUserLogs(this.lang.please_join_then_choose_file); - return; - } - if (this.roomId) { - if (this.roomId.toString().length > 15) { - layer.msg(this.lang.room_num_too_long) - this.addUserLogs(this.lang.room_num_too_long); - return; - } - this.setNickName(); - this.socket.emit('createAndJoin', { - room: this.roomId, - type : 'file', - nickName : this.nickName, - langMode : this.langMode, - ua: this.isMobile ? 'mobile' : 'pc', - network : this.network - }); - this.isJoined = true; - this.addPopup({ - title : this.lang.file_room, - msg : this.lang.you_enter_file_room + this.roomId - }); - this.addUserLogs( this.lang.you_enter_file_room + this.roomId); + let hasMoreBigFile = this.sendFileRecoderList.filter(item=>{ + return item.size > this.bigFileMaxSize + }).length > this.bigFileMaxCount; + + let hasLongFileQueue = this.sendFileRecoderList.filter(item=>{ + return !item.done; + }).length > this.longFileQueueMaxSize; + + //超过规则范围,自动排队发送 + if(hasMoreBigFile || hasLongFileQueue){ + this.chooseFileRecoderAutoNext = true; + this.sendFileToSingleAuto(); + return } - }, - //创建流媒体房间 - createMediaRoom: function (type) { - this.roomId = this.roomId.toString().replace(/\s*/g, "") - if (this.roomId === null || this.roomId === undefined || this.roomId === '') { - layer.msg(this.lang.please_enter_room_num) - this.addUserLogs(this.lang.please_enter_room_num); - return; - } - if (this.roomId) { - if (this.roomId.toString().length > 15) { - layer.msg(this.lang.room_num_too_long) - this.addUserLogs(this.lang.room_num_too_long); - return; - } - this.setNickName(); - this.socket.emit('createAndJoin', { - room: this.roomId, - type: type, + + //如果不是单独发送某个记录,就需要处理全部记录 + this.chooseFileRecoderList = this.sendFileRecoderList.filter(item=>{ + return !item.done; + }) + this.sendFileRecoderInfo(); + }, + // 多记录并发发送文件基本信息 + sendFileRecoderInfo : function(){ + // 提前发送文件基础信息 + this.chooseFileRecoderList.forEach(chooseRecoder => { + this.socket.emit('message', { + emitType: "sendFileInfo", + index: chooseRecoder.index, + name: chooseRecoder.name, + type: chooseRecoder.type, + size: chooseRecoder.size, + room: this.roomId, + from: this.socketId, nickName : this.nickName, - langMode : this.langMode, - ua: this.isMobile ? 'mobile' : 'pc', - network : this.network, - liveShareRole : this.liveShareRole - }); - this.isJoined = true; - this.roomType = type; - this.addPopup({ - title : this.lang.stream_room, - msg : this.lang.you_enter_stream_room + this.roomId + to: chooseRecoder.id, + recoderId: this.recoderId }); - this.addUserLogs(this.lang.you_enter_stream_room + this.roomId); - } + }) }, - //创建密码房间 - createPasswordRoom: function (password) { - this.roomId = this.roomId.toString().replace(/\s*/g, "") - if (this.roomId === null || this.roomId === undefined || this.roomId === '') { - layer.msg(this.lang.please_enter_room_num) - this.addUserLogs(this.lang.please_enter_room_num); - return; - } - if (this.roomId) { - if (this.roomId.toString().length > 15) { - layer.msg(this.lang.room_num_too_long) - this.addUserLogs(this.lang.room_num_too_long); - return; - } - if (password.toString().length > 15) { - layer.msg(this.lang.password_too_long) - this.addUserLogs(this.lang.password_too_long); - return; + // 多记录并行发送文件数据 + sendFileRecoderData: function () { + let that = this; + + this.chooseFileRecoderList.forEach(chooseRecoder => { + let filterFile = that.chooseFileList.filter(item => { + return item.index === chooseRecoder.index; + }); + if(filterFile.length === 0){ + return } - this.setNickName(); - this.socket.emit('createAndJoin', { - room: this.roomId, - type : 'password', - password: password, - nickName : this.nickName, - langMode : this.langMode, - ua: this.isMobile ? 'mobile' : 'pc', - network : this.network + + let chooseFile = filterFile[0]; + let fileReader = chooseRecoder.reader; + + fileReader.addEventListener('loadend', (event) => { + that.sendFileToRemoteByRecoder(event.target.result, chooseRecoder, chooseFile); }); - this.isJoined = true; - this.addPopup({ - title : this.lang.password_room, - msg : this.lang.you_enter_password_room + this.roomId + + fileReader.addEventListener('error', error => { + that.addSysLogs(that.lang.read_file_error + " : " + error); }); - this.addUserLogs(this.lang.you_enter_password_room + this.roomId); - } - }, - //退出房间 - exitRoom: function () { - if (this.roomId) { - this.socket.emit('exit', { - from: this.socketId, - room: this.roomId, - recoderId: this.recoderId + + fileReader.addEventListener('abort', event => { + that.addSysLogs(that.lang.read_file_interrupt + " : " + event); }); - } - for (let i in this.rtcConns) { - let rtcConnect = this.rtcConns[i]; - rtcConnect.close(); - rtcConnect = null; - } - window.location.reload(); + that.readAsArrayBufferByOffset(0, chooseFile, chooseRecoder) + }) }, - //创立链接 - createRtcConnect: function (id) { - if (id === undefined) { - return; + // 一次发送一个文件给一个用户 + sendFileToRemoteByRecoder: function (buffer, chooseRecoder, chooseFile) { + let that = this; + if (!chooseRecoder) { + return } - let that = this; - let rtcConnect = new RTCPeerConnection(this.config); + let remote = this.getRemoteInfo(chooseRecoder.id); + let fileOffset = remote[chooseRecoder.index + "offset"] + let sendFileDataChannel = remote.sendFileDataChannel; + if (!sendFileDataChannel || sendFileDataChannel.readyState !== 'open') { + this.addSysLogs(this.lang.file_send_channel_not_establish) + return; + } - //ice - rtcConnect.onicecandidate = (e) => { - that.iceCandidate(rtcConnect, id, e) - }; + this.setRemoteInfo(chooseRecoder.id, { + [chooseRecoder.index + "status"]: 'sending' + }) - rtcConnect.oniceconnectionstatechange = (e) => { - that.addSysLogs("iceConnectionState: " + rtcConnect.iceConnectionState); + this.isSending = true; - //如果是断开连接,并且没有使用turn服务器,提示开启turn服务器 - if(rtcConnect.iceConnectionState === 'disconnected' && !this.useTurn){ - layer.msg(that.lang.please_use_turn_server); - that.addSysLogs(that.lang.please_use_turn_server); - } - that.setRemoteInfo(id, { - iceConnectionState : rtcConnect.iceConnectionState - }) + // 开始发送通知 + if (fileOffset === 0) { + this.addPopup({ + title : this.lang.send_file, + msg : this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",0%。" + }); + this.addSysLogs(this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",0%。") + this.updateSendFileRecoderProgress(chooseRecoder.id, { + start: Date.now() + }, chooseRecoder) } - //媒体流通道 - rtcConnect.ontrack = (e) => { - that.mediaTrackHandler(e, id) - }; - - //文件发送数据通道 - let sendFileDataChannel = rtcConnect.createDataChannel('sendFileDataChannel'); - sendFileDataChannel.binaryType = 'arraybuffer'; - sendFileDataChannel.addEventListener('open', (event) => { - if (sendFileDataChannel.readyState === 'open') { - that.addSysLogs(that.lang.establish_connection) - } - }); - sendFileDataChannel.addEventListener('close', (event) => { - if (sendFileDataChannel.readyState === 'close') { - that.addSysLogs(that.lang.connection_closed) - } - }); - sendFileDataChannel.addEventListener('error', (error) => { - console.error(error.error) - that.addSysLogs(that.lang.connection_disconnected + ",file:e=" + error) - that.removeStream(null, id, null) - }); - - //自定义数据发送通道 - let sendDataChannel = rtcConnect.createDataChannel('sendDataChannel'); - sendDataChannel.binaryType = 'arraybuffer'; - sendDataChannel.addEventListener('open', (event) => { - if (sendDataChannel.readyState === 'open') { - that.addSysLogs(that.lang.establish_connection) - } - }); - sendDataChannel.addEventListener('close', (event) => { - if (sendDataChannel.readyState === 'close') { - that.addSysLogs(that.lang.connection_closed) + //缓冲区暂定 256kb + sendFileDataChannel.bufferedAmountLowThreshold = 16 * 1024 * 16; + //局域网一般不会走缓冲区,所以bufferedAmount一般为0,公网部分情况受限于带宽,bufferedAmount可能会逐渐堆积,从而进行排队 + if (sendFileDataChannel.bufferedAmount > sendFileDataChannel.bufferedAmountLowThreshold) { + this.addSysLogs( + that.lang.file_send_channel_buffer_full + ",bufferedAmount=" + + sendFileDataChannel.bufferedAmount + ",bufferedAmountLowThreshold=" + + sendFileDataChannel.bufferedAmountLowThreshold + ) + sendFileDataChannel.onbufferedamountlow = () => { + that.addSysLogs( + that.lang.file_send_channel_buffer_recover + ",bufferedAmount=" + + sendFileDataChannel.bufferedAmount + ) + sendFileDataChannel.onbufferedamountlow = null; + that.sendFileToRemoteByRecoder(buffer, chooseRecoder, chooseFile); } - }); - sendDataChannel.addEventListener('error', (error) => { - console.error(error.error) - that.addSysLogs(that.lang.connection_disconnected + ",cus:e=" + error) - that.removeStream(null, id, null) - }); + return; + } - rtcConnect.addEventListener('datachannel', (event) => { - that.initReceiveDataChannel(event, id); - }); + // 发送数据 + sendFileDataChannel.send(this.encodeSendFileBuffer({ + recoder : chooseRecoder, + fragment : parseInt(fileOffset / this.chunkSize), + buffer : buffer, + })); - rtcConnect.onremovestream = (e) => { - that.removeStream(rtcConnect, id, e) - }; + fileOffset += buffer.byteLength; + remote[chooseRecoder.index + "offset"] = fileOffset + this.currentSendAllSize += buffer.byteLength; - //保存peer连接 - this.rtcConns[id] = rtcConnect; - if (!this.remoteMap[id]) { - Vue.set(this.remoteMap, id, { - id: id, - receiveChatRoomSingleList : [], - p2pMode : '识别中...', - sendFileDataChannel: sendFileDataChannel, - sendDataChannel : sendDataChannel - }) - } + //更新发送进度 + this.updateSendFileRecoderProgress(chooseRecoder.id, { + progress: ((fileOffset / chooseRecoder.size) * 100).toFixed(3) || 0 + }, chooseRecoder) - return rtcConnect; - }, - //获取本地与远程连接 - getOrCreateRtcConnect: function (id) { - // 获取rtc缓存连接 - let rtcConnect = this.rtcConns[id]; - // 不存在,创建一个 - if (typeof (rtcConnect) == 'undefined') { - rtcConnect = this.createRtcConnect(id); - } - return rtcConnect; - }, - //远程媒体流处理 - mediaTrackHandler: function(event, id){ - let that = this; - - let video = null; + //发送完一份重置相关数据 + if (fileOffset === chooseRecoder.size) { + this.addPopup({ + title : this.lang.send_file, + msg : this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",100%。" + }); + this.addSysLogs(this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",100%。") + this.socket.emit('message', { + emitType: "sendDone", + room: this.roomId, + from: this.socketId, + size: chooseRecoder.size, + name: chooseRecoder.name, + type: chooseRecoder.type, + to: chooseRecoder.id + }); + //更新发送进度 + this.updateSendFileRecoderProgress(chooseRecoder.id, { + progress: 100, + done: true + }, chooseRecoder) - const remoteRtc = this.getRemoteInfo(id); - const remoteName = remoteRtc.nickName || ""; + this.setRemoteInfo(chooseRecoder.id, { + [chooseRecoder.index + "status"]: 'done' + }) - if(event.track.kind === 'audio'){ - // audio-track事件,除了语音连麦房间之外,其他都可以跳过,因为音视频/直播/屏幕共享他们的音频流都并入了video-track了 - if(that.roomType !== 'audio'){ - return - } + this.isSending = false; - //连麦房间,只有音频数据 - $(`#mediaAudioRoomList`).append(` -
              ${remoteName}
              -
              - - - - - -
              - `); - video = document.querySelector(`#otherMediaAudioShare${id}`); + //检查全部发送完毕 + this.allFileSendedCheckHandler() } - if(this.roomType === 'video'){ - $(`#mediaVideoRoomList`).append(` -
              ${remoteName}
              -
              - - - - -
              - `); - video = document.querySelector(`#otherMediaVideoShare${id}`); - } else if(this.roomType === 'screen'){ - $(`#mediaScreenRoomList`).append(` -
              ${remoteName}
              -
              - - -
              - `); - video = document.querySelector(`#otherMediaScreenShare${id}`); - } else if(this.roomType === 'live'){ - - if(this.liveShareRole === 'viewer'){ - $(`#mediaLiveRoomList`).append(` -
              ${remoteName}
              -
              - - - - -
              - `); - } - - video = document.querySelector(`#otherMediaLiveShare${id}`); - } - - if(video){ - video.addEventListener('loadedmetadata', function() { - video.play(); - that.addSysLogs("loadedmetadata") - // ios 微信浏览器兼容问题 - document.addEventListener('WeixinJSBridgeReady', function () { - that.addSysLogs("loadedmetadata WeixinJSBridgeReady") - video.play(); - }, false); - }); - document.addEventListener('WeixinJSBridgeReady', function () { - that.addSysLogs("WeixinJSBridgeReady") - video.play(); - }, false); - video.srcObject = event.streams[0] - video.play(); + if(fileOffset < chooseRecoder.size){ + this.readAsArrayBufferByOffset(fileOffset, chooseFile, chooseRecoder); } }, - //编码组装发送文件数据,设置好每次分片的文件头信息 - encodeSendFileBuffer: function ({recoder, buffer, fragment, event}) { - let fileInfoString = JSON.stringify({ - i: recoder.index, //当前文件块所属的索引 - f: fragment, //当前buffer所处的分片块 - }); - //填充 - const paddedFileInfoString = fileInfoString.padEnd(this.fileInfoBufferHeaderLen, '\0'); - const combindBuffer = new ArrayBuffer(this.fileInfoBufferHeaderLen + buffer.byteLength); - - const combinedUint8Array = new Uint8Array(combindBuffer); - for (let i = 0; i < paddedFileInfoString.length; i++) { - combinedUint8Array[i] = paddedFileInfoString.charCodeAt(i); - } - combinedUint8Array.set(new Uint8Array(buffer), this.fileInfoBufferHeaderLen); - - return combindBuffer; + // 分片读取文件 + readAsArrayBufferByOffset: function ( offset, chooseFile, chooseRecoder) { + let slice = chooseFile.slice(offset, offset + this.chunkSize); + let fileReader = chooseRecoder.reader; + fileReader.readAsArrayBuffer(slice); }, - //解码组装接收文件数据 - decodeReceiveFileBuffer: function (buffer) { - const receivedUint8Array = new Uint8Array(buffer); - const fileInfoString = String.fromCharCode(...receivedUint8Array.slice(0, this.fileInfoBufferHeaderLen)); - const trimmedFileInfoString = fileInfoString.replace(/\0/g, ''); - const fileInfo = JSON.parse(trimmedFileInfoString); - return { - buffer: receivedUint8Array.slice(this.fileInfoBufferHeaderLen), - index: fileInfo.i, - fragment: fileInfo.f + //初始化接收数据事件 + initReceiveDataChannel: function (event, id) { + if (!id || !event) { + return; } - }, - //每个记录发送完毕后都检查下是否全部发送完 - allFileSendedCheckHandler : function(){ - let allDone = this.sendFileRecoderList.filter(item => { - return item.done; - }).length === this.sendFileRecoderList.length; - - // 全部发完 - if(allDone){ - this.chooseFileList = [] - this.sendFileRecoderList = [] - this.chooseFileRecoderList = [] - this.chooseFileRecoderAutoNext = false; - this.addPopup({ - title : this.lang.send_file, - msg : this.lang.file_send_done - }); - this.addSysLogs(this.lang.file_send_done) - this.allSended = true; - this.isSending = false; - - return true + let currentRtc = this.getRemoteInfo(id); + if (!currentRtc) { + return } - //在每次发送完后的检查时, 过滤掉已经发送完毕的记录 - this.chooseFileRecoderList = this.chooseFileRecoderList.filter(item=>{ - return !item.done; - }); + let receiveChannel = event.channel; - // 在每次发送完后的检查时,如果是开启了自动排队发送,调用自动发送 - if(this.chooseFileRecoderAutoNext){ - this.sendFileToSingleAuto(); + //文件接收 + if(receiveChannel.label === 'sendFileDataChannel'){ + receiveChannel.binaryType = 'arraybuffer'; + receiveChannel.onmessage = (evt) => { + if(this.canSaveToIndexedDb && this.useIndexedDb){ + this.receiveFileDataToIndexedDb(evt, id); + }else{ + this.receiveFileDataToMemery(evt, id); + } + }; + receiveChannel.onopen = () => { + const readyState = receiveChannel.readyState; + this.addSysLogs(this.lang.file_receive_channel_ready + readyState) + }; + receiveChannel.onclose = () => { + const readyState = receiveChannel.readyState; + this.addSysLogs(this.lang.file_receive_channel_closed + readyState) + }; + this.setRemoteInfo(id, { receiveFileDataChannel: receiveChannel }); } - return false - }, - // 指定单独发送文件给用户 - sendFileToSingle: function(recoder){ - layer.msg(`${this.lang.send_to_user_separately} ${recoder.id}`) - - if(!this.hasManInRoom){ - layer.msg(this.lang.room_least_two_can_send_content) - return + //自定义数据接收 + if(receiveChannel.label === 'sendDataChannel'){ + receiveChannel.binaryType = 'arraybuffer'; + receiveChannel.onmessage = (evt) => { + //接收自定义数据 , 暂时用做远程画笔数据接收 + if (!evt || !id) { + return; + } + let data = JSON.parse(evt.data) || {}; + window.Bus.$emit("openRemoteDraw", data) + } + receiveChannel.onopen = () => { + const readyState = receiveChannel.readyState; + this.addSysLogs(this.lang.custom_data_receive_channel_ready + readyState) + }; + receiveChannel.onclose = () => { + const readyState = receiveChannel.readyState; + this.addSysLogs(this.lang.custom_data_receive_channel_closed + readyState) + }; + this.setRemoteInfo(id, { receiveDataChannel: receiveChannel }); } - - this.chooseFileRecoderList = [recoder]; - this.sendFileRecoderInfo(); }, - // 自动单独发送文件给用户 - sendFileToSingleAuto: function(){ - if(!this.hasManInRoom){ - layer.msg(this.lang.room_least_two_can_send_content) - return + //接收文件 (使用indexedDb接收,不占用内存) + receiveFileDataToIndexedDb: function (event, id) { + let that = this; + if (!event || !id) { + return; } - - //当前自动切换文件是开启的 - if(this.chooseFileRecoderAutoNext){ - let chooseRecoder = this.sendFileRecoderList.filter(item=>{ - return !item.done; - }).shift(); - - if(chooseRecoder){ - setTimeout(() => { - this.chooseFileRecoderList = [chooseRecoder]; - this.sendFileRecoderInfo(); - }, 1000); - } + let currentRtc = this.getRemoteInfo(id); + if(!currentRtc){ + return; } - }, - // 一键发送 , 根据设置的规则自动选择发送模式,支持自动排队发送,并发发送 - sendFileToAll: function(){ - layer.msg(`${this.lang.send_to_all_user}`) - if(!this.hasManInRoom){ - layer.msg(this.lang.room_least_two_can_send_content) - return - } + //解析数据 + let { index, fragment, buffer } = this.decodeReceiveFileBuffer(event.data); - let hasMoreBigFile = this.sendFileRecoderList.filter(item=>{ - return item.size > this.bigFileMaxSize - }).length > this.bigFileMaxCount; + //接收文件总大小 + this.receivedFileAllSize += buffer.byteLength; - let hasLongFileQueue = this.sendFileRecoderList.filter(item=>{ - return !item.done; - }).length > this.longFileQueueMaxSize; - - //超过规则范围,自动排队发送 - if(hasMoreBigFile || hasLongFileQueue){ - this.chooseFileRecoderAutoNext = true; - this.sendFileToSingleAuto(); - return + // 文件数据 大小/数据 + let receiveFileMap = currentRtc.receiveFileMap; + let receiveRecoder = receiveFileMap[index]; + let receivedSize = receiveRecoder.receivedSize; + receivedSize += buffer.byteLength; + receiveFileMap[index].receivedSize = receivedSize; + let receivedBuffer = receiveRecoder.receivedBuffer; + receivedBuffer.push(buffer); + receiveFileMap[index].receivedBuffer = receivedBuffer; + + // 文件信息 + let receiveFileRecoder = this.receiveFileRecoderList.filter(item=>{ + return item.index === index; + })[0]; + + //当前接收的文件基本信息 + let name = receiveFileRecoder.name; + let size = receiveFileRecoder.size; + let type = receiveFileRecoder.type; + + //1000分片存储一次, 默认16M一组 = chunkSize * 1000 + if(fragment % 1000 === 0){ + this.saveSliceFileBufferToIndexedDb(receiveFileRecoder, fragment, receivedBuffer); + receiveFileMap[index].receivedBuffer = new Array(); } + this.setRemoteInfo(id, { receiveFileMap : receiveFileMap}); - //如果不是单独发送某个记录,就需要处理全部记录 - this.chooseFileRecoderList = this.sendFileRecoderList.filter(item=>{ - return !item.done; - }) - this.sendFileRecoderInfo(); - }, - // 多记录并发发送文件基本信息 - sendFileRecoderInfo : function(){ - // 提前发送文件基础信息 - this.chooseFileRecoderList.forEach(chooseRecoder => { - this.socket.emit('message', { - emitType: "sendFileInfo", - index: chooseRecoder.index, - name: chooseRecoder.name, - type: chooseRecoder.type, - size: chooseRecoder.size, - room: this.roomId, - from: this.socketId, - nickName : this.nickName, - to: chooseRecoder.id, - recoderId: this.recoderId - }); - }) - }, - // 多记录并行发送文件数据 - sendFileRecoderData: function () { - let that = this; + //更新接收进度 + this.updateReceiveFileRecoderProgress(id, { + progress: ((receivedSize / size) * 100).toFixed(3) || 0, + fragment : fragment + }, receiveFileRecoder); - this.chooseFileRecoderList.forEach(chooseRecoder => { - let filterFile = that.chooseFileList.filter(item => { - return item.index === chooseRecoder.index; + //接收完毕 + if (receivedSize === size) { + this.addSysLogs(name + this.lang.save_file_to_indexeddb); + this.addPopup({ + title : this.lang.file_receive, + msg : "[ " + name + " ]" + this.lang.save_file_to_indexeddb }); - if(filterFile.length === 0){ - return + + //发送完毕后,如果buffer还有剩余不满1000分片的数据,也要存储 + if(receivedBuffer.length >= 0){ + this.saveSliceFileBufferToIndexedDb(receiveFileRecoder, fragment, receivedBuffer); } - let chooseFile = filterFile[0]; - let fileReader = chooseRecoder.reader; + // 更新接收进度 + this.updateReceiveFileRecoderProgress(id, { + progress: 100, + done: true, + }, receiveFileRecoder); - fileReader.addEventListener('loadend', (event) => { - that.sendFileToRemoteByRecoder(event.target.result, chooseRecoder, chooseFile); - }); - - fileReader.addEventListener('error', error => { - that.addSysLogs(that.lang.read_file_error + " : " + error); - }); - - fileReader.addEventListener('abort', event => { - that.addSysLogs(that.lang.read_file_interrupt + " : " + event); - }); + // 更新indexeddb中的文件信息 + this.saveSliceFileInfoToIndexedDb(Object.assign({ + progress: 100, + done: true, + }, receiveFileRecoder)); - that.readAsArrayBufferByOffset(0, chooseFile, chooseRecoder) - }) + //清除接收的数据缓存 + receiveFileMap[index].receivedBuffer = new Array(); + receiveFileMap[index].receivedSize = 0; + this.setRemoteInfo(id, { receiveFileMap }) + } }, - // 一次发送一个文件给一个用户 - sendFileToRemoteByRecoder: function (buffer, chooseRecoder, chooseFile) { + //接收文件 (使用内存接收) + receiveFileDataToMemery: function (event, id) { let that = this; - if (!chooseRecoder) { - return + if (!event || !id) { + return; } - - let remote = this.getRemoteInfo(chooseRecoder.id); - let fileOffset = remote[chooseRecoder.index + "offset"] - let sendFileDataChannel = remote.sendFileDataChannel; - if (!sendFileDataChannel || sendFileDataChannel.readyState !== 'open') { - this.addSysLogs(this.lang.file_send_channel_not_establish) + let currentRtc = this.getRemoteInfo(id); + if(!currentRtc){ return; } - this.setRemoteInfo(chooseRecoder.id, { - [chooseRecoder.index + "status"]: 'sending' - }) + //解析数据 + let { index, fragment, buffer } = this.decodeReceiveFileBuffer(event.data); - this.isSending = true; + let receiveFileMap = currentRtc.receiveFileMap; + let receiveRecoder = receiveFileMap[index]; + //当前接收的文件相关数据/大小 + let receivedBuffer = receiveRecoder.receivedBuffer; + let receivedSize = receiveRecoder.receivedSize; - // 开始发送通知 - if (fileOffset === 0) { - this.addPopup({ - title : this.lang.send_file, - msg : this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",0%。" - }); - this.addSysLogs(this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",0%。") - this.updateSendFileRecoderProgress(chooseRecoder.id, { - start: Date.now() - }, chooseRecoder) - } + //当前接收的文件基本信息 + let receiveFileRecoder = this.receiveFileRecoderList.filter(item=>{ + return item.index === index; + })[0]; + let name = receiveFileRecoder.name; + let size = receiveFileRecoder.size; + let type = receiveFileRecoder.type; - //缓冲区暂定 256kb - sendFileDataChannel.bufferedAmountLowThreshold = 16 * 1024 * 16; - //局域网一般不会走缓冲区,所以bufferedAmount一般为0,公网部分情况受限于带宽,bufferedAmount可能会逐渐堆积,从而进行排队 - if (sendFileDataChannel.bufferedAmount > sendFileDataChannel.bufferedAmountLowThreshold) { - this.addSysLogs( - that.lang.file_send_channel_buffer_full + ",bufferedAmount=" + - sendFileDataChannel.bufferedAmount + ",bufferedAmountLowThreshold=" + - sendFileDataChannel.bufferedAmountLowThreshold - ) - sendFileDataChannel.onbufferedamountlow = () => { - that.addSysLogs( - that.lang.file_send_channel_buffer_recover + ",bufferedAmount=" + - sendFileDataChannel.bufferedAmount - ) - sendFileDataChannel.onbufferedamountlow = null; - that.sendFileToRemoteByRecoder(buffer, chooseRecoder, chooseFile); - } - return; - } + //接收数据 + receivedBuffer.push(buffer); + receivedSize += buffer.byteLength; - // 发送数据 - sendFileDataChannel.send(this.encodeSendFileBuffer({ - recoder : chooseRecoder, - fragment : parseInt(fileOffset / this.chunkSize), - buffer : buffer, - })); + //接收文件总大小 + this.receivedFileAllSize += buffer.byteLength; - fileOffset += buffer.byteLength; - remote[chooseRecoder.index + "offset"] = fileOffset - this.currentSendAllSize += buffer.byteLength; + receiveFileMap[index].receivedBuffer = receivedBuffer; + receiveFileMap[index].receivedSize = receivedSize; + this.setRemoteInfo(id, { receiveFileMap : receiveFileMap}) - //更新发送进度 - this.updateSendFileRecoderProgress(chooseRecoder.id, { - progress: ((fileOffset / chooseRecoder.size) * 100).toFixed(3) || 0 - }, chooseRecoder) + //更新接收进度 + this.updateReceiveFileRecoderProgress(id, { + progress: ((receivedSize / size) * 100).toFixed(3) || 0 + }, receiveFileRecoder); - //发送完一份重置相关数据 - if (fileOffset === chooseRecoder.size) { + if (receivedSize === size) { + this.addSysLogs(name + this.lang.receive_done); this.addPopup({ - title : this.lang.send_file, - msg : this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",100%。" - }); - this.addSysLogs(this.lang.sending_to + chooseRecoder.id.substr(0, 4) + ",100%。") - this.socket.emit('message', { - emitType: "sendDone", - room: this.roomId, - from: this.socketId, - size: chooseRecoder.size, - name: chooseRecoder.name, - type: chooseRecoder.type, - to: chooseRecoder.id + title : this.lang.file_receive, + msg : "[ " + name + " ]" + this.lang.receive_done }); - //更新发送进度 - this.updateSendFileRecoderProgress(chooseRecoder.id, { - progress: 100, - done: true - }, chooseRecoder) - - this.setRemoteInfo(chooseRecoder.id, { - [chooseRecoder.index + "status"]: 'done' - }) - this.isSending = false; + //更新接收进度 + this.updateReceiveFileRecoderProgress(id, { + progress: 100, + href: URL.createObjectURL(new Blob(receivedBuffer), { type: type }), + done: true, + }, receiveFileRecoder); - //检查全部发送完毕 - this.allFileSendedCheckHandler() + //清除接收的数据缓存 + receiveFileMap[index].receivedBuffer = new Array(); + receiveFileMap[index].receivedSize = 0; + this.setRemoteInfo(id, { receiveFileMap }) } + }, + //关闭连接 + closeDataChannels: function () { + for (let remote in this.remoteMap) { + let id = remote.id; + if(!id) continue; - if(fileOffset < chooseRecoder.size){ - this.readAsArrayBufferByOffset(fileOffset, chooseFile, chooseRecoder); - } - }, - // 分片读取文件 - readAsArrayBufferByOffset: function ( offset, chooseFile, chooseRecoder) { - let slice = chooseFile.slice(offset, offset + this.chunkSize); - let fileReader = chooseRecoder.reader; - fileReader.readAsArrayBuffer(slice); - }, - //初始化接收数据事件 - initReceiveDataChannel: function (event, id) { - if (!id || !event) { - return; - } - let currentRtc = this.getRemoteInfo(id); - if (!currentRtc) { - return - } - - let receiveChannel = event.channel; - - //文件接收 - if(receiveChannel.label === 'sendFileDataChannel'){ - receiveChannel.binaryType = 'arraybuffer'; - receiveChannel.onmessage = (evt) => { - this.receiveFileData(evt, id); - }; - receiveChannel.onopen = () => { - const readyState = receiveChannel.readyState; - this.addSysLogs(this.lang.file_receive_channel_ready + readyState) - }; - receiveChannel.onclose = () => { - const readyState = receiveChannel.readyState; - this.addSysLogs(this.lang.file_receive_channel_closed + readyState) - }; - this.setRemoteInfo(id, { receiveFileDataChannel: receiveChannel }); - } - - //自定义数据接收 - if(receiveChannel.label === 'sendDataChannel'){ - receiveChannel.binaryType = 'arraybuffer'; - receiveChannel.onmessage = (evt) => { - //接收自定义数据 , 暂时用做远程画笔数据接收 - if (!evt || !id) { - return; - } - let data = JSON.parse(evt.data) || {}; - window.Bus.$emit("openRemoteDraw", data) - } - receiveChannel.onopen = () => { - const readyState = receiveChannel.readyState; - this.addSysLogs(this.lang.custom_data_receive_channel_ready + readyState) - }; - receiveChannel.onclose = () => { - const readyState = receiveChannel.readyState; - this.addSysLogs(this.lang.custom_data_receive_channel_closed + readyState) - }; - this.setRemoteInfo(id, { receiveDataChannel: receiveChannel }); - } - }, - //接收文件 - receiveFileData: function (event, id) { - if (!event || !id) { - return; - } - let currentRtc = this.getRemoteInfo(id); - if(!currentRtc){ - return; - } - - //解析数据 - let { index, fragment, buffer } = this.decodeReceiveFileBuffer(event.data); - let receiveFileMap = currentRtc.receiveFileMap; - - //当前接收的文件基本信息 - let receiveRecoder = receiveFileMap[index]; - let name = receiveRecoder.name; - let size = receiveRecoder.size; - let type = receiveRecoder.type; - - //当前接收的文件相关数据/大小 - let receivedBuffer = receiveRecoder.receivedBuffer; - let receivedSize = receiveRecoder.receivedSize; - - //接收数据 - receivedBuffer.push(buffer); - receivedSize += buffer.byteLength; - - receiveFileMap[index].receivedBuffer = receivedBuffer; - receiveFileMap[index].receivedSize = receivedSize; - this.setRemoteInfo(id, { receiveFileMap : receiveFileMap}) - - //更新接收进度 - this.updateReceiveProgress(id, { - progress: ((receivedSize / size) * 100).toFixed(3) || 0 - }, receiveRecoder); - - if (receivedSize === size) { - this.addSysLogs(name + this.lang.receive_done); - this.addPopup({ - title : this.lang.file_receive, - msg : "[ " + name + " ]" + this.lang.receive_done - }); - - //更新接收进度 - this.updateReceiveProgress(id, { - style: 'color: #ff5722;text-decoration: underline;', - progress: 100, - href: URL.createObjectURL(new Blob(receivedBuffer), { type: type }), - done: true - }, receiveRecoder); - - //清除接收的数据缓存 - receiveFileMap[index].receivedBuffer = new Array(); - receiveFileMap[index].receivedSize = 0; - this.setRemoteInfo(id, { receiveFileMap }) - } - }, - //关闭连接 - closeDataChannels: function () { - for (let remote in this.remoteMap) { - let id = remote.id; - if(!id) continue; - - let sendFileDataChannel = remote.sendFileDataChannel; - if(sendFileDataChannel){ - sendFileDataChannel.close(); - } - let sendDataChannel = remote.sendDataChannel; - if(sendDataChannel){ - sendDataChannel.close(); - } - let receiveFileDataChannel = remote.receiveFileDataChannel; - if(receiveFileDataChannel){ - receiveFileDataChannel.close(); - } - let receiveDataChannel = remote.receiveDataChannel; - if(receiveDataChannel){ - receiveDataChannel.close(); - } + let sendFileDataChannel = remote.sendFileDataChannel; + if(sendFileDataChannel){ + sendFileDataChannel.close(); + } + let sendDataChannel = remote.sendDataChannel; + if(sendDataChannel){ + sendDataChannel.close(); + } + let receiveFileDataChannel = remote.receiveFileDataChannel; + if(receiveFileDataChannel){ + receiveFileDataChannel.close(); + } + let receiveDataChannel = remote.receiveDataChannel; + if(receiveDataChannel){ + receiveDataChannel.close(); + } } }, //设置rtc缓存远程连接数据 @@ -3418,7 +3282,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { } }, //更新接收进度 - updateReceiveProgress: function (id, data, recoder) { + updateReceiveFileRecoderProgress: function (id, data, recoder) { for (let i = 0; i < this.receiveFileRecoderList.length; i++) { let item = this.receiveFileRecoderList[i]; if (item.id === id && item.index === recoder.index && !item.done) { @@ -3549,9 +3413,17 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { addIceCandidateFailed: function (err) { this.addSysLogs(this.lang.add_ice_candidate_failed + err); }, + //事件监听 socketListener: function () { let that = this; + this.socket.on("localNetRoom", data => { + that.localNetRoomList = data.list || []; + if(that.localNetRoomList.length === 0 && that.showLocalNetRoom){ + that.clickLocalNetRooms(true); + } + }) + this.socket.on("heartbeat", data => { if(data.status === 'ok'){ that.addSysLogs(that.lang.websocketHeartBeatCheckOk + ": " + data.status); @@ -3764,22 +3636,22 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { //选中文件时发送给接收方 this.socket.on('sendFileInfo', function (data) { - let fromId = data.from; - let { receiveFileMap = {} } = that.getRemoteInfo(fromId); - receiveFileMap[data.index] = Object.assign({ - receivedBuffer : new Array(), - receivedSize : 0 - },data); - - that.setRemoteInfo(fromId, { receiveFileMap }); - that.addPopup({ title : that.lang.send_file, msg : data.from + that.lang.selected_file + "[ " + data.name + " ], "+that.lang.will_send }); that.addSysLogs(data.from + that.lang.selected_file + "[ " + data.name + " ], "+that.lang.will_send); - that.receiveFileRecoderList.push({ + let fromId = data.from; + let { receiveFileMap = {} } = that.getRemoteInfo(fromId); + receiveFileMap[data.index] = Object.assign({ + receivedBuffer : new Array(), + receivedSize : 0, + }, data); + that.setRemoteInfo(fromId, { receiveFileMap }); + + // 组装接收文件的recoder结构 + const recoder = { id: fromId, nickName : data.nickName, index: data.index, @@ -3791,8 +3663,13 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { done: false, start: 0, cost: 0, - upload : 'wait' - }) + upload : 'wait', + indexedDb: that.canSaveToIndexedDb && that.useIndexedDb, + fragment : 0, + indexedDbInfoKey: Date.now() + "_" + data.index + "_info", + indexedDbBufferKey: Date.now() + "_" + data.index + "_buffer", + } + that.receiveFileRecoderList.push(recoder) that.socket.emit("message", { emitType : "sendFileInfoAck", @@ -3801,6 +3678,10 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { to: fromId, // 谁发过来的sendFileInfo事件就回执给谁 index: data.index, //具体的recoder记录文件的索引 }) + + if(that.canSaveToIndexedDb && that.useIndexedDb){ + that.saveSliceFileInfoToIndexedDb(recoder); + } }); //接收放已经收到待发送文件信息,代表可以进行发送了, @@ -3984,217 +3865,1400 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { that.setRemoteInfo(data.from, { nickName : data.nickName }) - that.addSysLogs(data.from + + that.lang.changeNickNameTo + " : " + data.nickName) - }); - - //提示 - this.socket.on('tips', function (data) { - if (window.layer) { - layer.msg(data.msg) - if (data.reload) { - setTimeout(() => { - window.location.reload() - }, 1300); - } - } - }); + that.addSysLogs(data.from + + that.lang.changeNickNameTo + " : " + data.nickName) + }); + + //提示 + this.socket.on('tips', function (data) { + if (window.layer) { + layer.msg(data.msg) + if (data.reload) { + setTimeout(() => { + window.location.reload() + }, 1300); + } + } + }); + + //关闭共享 + this.socket.on('stopScreenShare', function (data) { + if (data.id === that.socketId) { + that.clickMediaScreen(); + } else { + $(`#otherMediaScreenShare${data.id}`).parent().remove(); + } + }); + + //关闭共享 + this.socket.on('openCamera', function (data) { + that.setRemoteInfo(data.from, { + isCameraEnabled : data.isCameraEnabled, + isAudioEnabled : data.isAudioEnabled + }) + if(data.type === 'video'){ + if(data.kind === 'video'){ + document.querySelector(`#otherMediaVideoShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaVideoShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; + }else if(data.kind === 'audio'){ + document.querySelector(`#otherMediaVideoShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaVideoShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; + } + }else if(data.type === 'screen'){ + if(data.kind === 'video'){ + document.querySelector(`#otherMediaScreenShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaScreenShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; + }else if(data.kind === 'audio'){ + document.querySelector(`#otherMediaScreenShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaScreenShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; + } + }else if(data.type === 'live'){ + if(data.kind === 'video'){ + document.querySelector(`#otherMediaLiveShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaLiveShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; + }else if(data.kind === 'audio'){ + document.querySelector(`#otherMediaLiveShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaLiveShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; + } + }else if(data.type === 'audio'){ + if(data.kind === 'audio'){ + document.querySelector(`#otherMediaAudioShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaAudioShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; + + document.querySelector(`#otherMediaAudioShareAudioOpenAnimSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; + document.querySelector(`#otherMediaAudioShareAudioCloseAnimSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; + } + } + }); + + //关闭音视频 + this.socket.on('stopVideoShare', function (data) { + if (data.id === that.socketId) { + that.clickMediaVideo(); + } else { + $(`#otherMediaVideoShare${data.id}`).parent().remove(); + } + }); + + //退出直播 + this.socket.on('stopLiveShare', function (data) { + //如果是主动房主退出,所有观众都退出 + if(data.owner){ + window.location.reload(); + return + } + + if (data.id === that.socketId) { + that.clickMediaLive(); + } + }); + + //退出语音连麦 + this.socket.on('stopAudioShare', function (data) { + if (data.id === that.socketId) { + that.clickMediaAudio(); + } else { + $(`#otherMediaAudioShare${data.id}`).parent().remove(); + } + }); + + //ai对话 + this.socket.on('openaiAnswer', function (data) { + that.isAiAnswering = false + that.receiveAiChatList.push(data) + that.addSysLogs("AI : " + data.content) + that.addPopup({ + title : that.lang.ai_reply, + msg : that.lang.ai_reply_you + }); + that.receiveAiChatList.forEach(item => { + item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; + }) + that.openaiChatTpl() + }); + + //开关数据 + this.socket.on('commData', function (data) { + that.switchData = data.switchData; + that.switchDataGet = true; + if(data.switchData.noticeMsgList){ + let alert = window.localStorage.getItem("tl-rtc-file-alert-notice") + if(!alert || (Date.now() - parseInt(alert)) / 1000 > (24 * 60 * 60) ){ + setTimeout(() => { + that.clickNotice() + window.localStorage.setItem("tl-rtc-file-alert-notice", Date.now()) + }, 1000); + } + } + + if(data.chatingCommData){ + data.chatingCommData.forEach(elem => { + try { + elem.msg = tlrtcfile.unescapeStr(elem.msg) + } catch (e) { + that.addSysLogs(that.lang.text_decode_failed + elem.msg); + } + that.receiveChatCommList.push(elem) + }) + that.receiveChatCommList.forEach(item => { + item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; + }) + } + }); + + //公共聊天频道 + this.socket.on('chatingComm', function (data) { + that.addSysLogs(data.room + ":" + data.socketId + that.lang.send_text + ": [ " + data.msg + " ]"); + try { + data.msg = tlrtcfile.unescapeStr(data.msg) + } catch (e) { + that.addSysLogs(that.lang.text_decode_failed + data.msg); + } + that.receiveChatCommList.push(data); + if (that.receiveChatCommList.length > that.switchData.chatingCommCount) { + that.receiveChatCommList.shift(); + } + that.receiveChatCommList.forEach(item => { + item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; + }) + that.chatingCommTpl() + + that.addPopup({ + title : that.lang.chat_comm, + msg : that.lang.public_chat_channel_someone_interact + }); + }); + + this.socket.on('manageCheck', function (data) { + layer.prompt({ + formType: 1, + title: that.lang.please_enter, + }, function (value, index, elem) { + that.socket.emit('manageConfirm', { + room: that.roomId, + value: value + }); + layer.close(index) + }); + }); + + this.socket.on('manage', function (data) { + if (data.socketId !== that.socketId) { + layer.msg(that.lang.illegal_event) + return + } + layer.closeAll(); + that.token = data.token; + layer.load(2, { + time: 1000, + shade: [0.8, '#000000'], + success: function (layero) { + layer.setTop(layero); //重点2 + } + }) + setTimeout(() => { + that.manageIframeId = layer.tab({ + area: ['100%', '100%'], + shade: [0.8, '#393D49'], + closeBtn : 0, + tab: [{ + title: data.content[0].title, + content: data.content[0].html + }, { + title: data.content[1].title, + content: data.content[1].html + }, { + title: data.content[2].title, + content: data.content[2].html + }], + cancel: function (index, layero) { + that.manageIframeId = 0; + }, + }) + layer.full(that.manageIframeId) + }, 500); + }); + }, + // 打开设置 + setting: function () { + let that = this; + let options = { + type: 1, + fixed: false, + maxmin: false, + shadeClose: true, + area: ['320px', '390px'], + title: this.lang.setting, + success: function (layero, index) { + document.querySelector(".layui-layer-title").style.borderTopRightRadius = "15px" + document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "15px" + document.querySelector(".layui-layer").style.borderRadius = "15px" + document.querySelector(".layui-layer-content").style.borderRadius = "15px" + window.form.render() + + carousel.render({ + elem: '#tl-rtc-file-setting-info', + width: '100%', + autoplay : false, + indicator: 'inside' + }); + + //文件分片大小自定义 + let chunkSizeSliderDivObj = slider.render({ + elem: '#tl-rtc-file-chunk-size', + min: 16, + max: 64, + change: function (value) { + that.chunkSize = value * 1024; + document.getElementById("tl-rtc-file-chunk-size-txt").innerText = value + "KB"; + } + }); + chunkSizeSliderDivObj.setValue((that.chunkSize / 1024) - 16); + + //文件预览大小自定义 + let previewSizeSliderDivObj = slider.render({ + elem: '#tl-rtc-file-preview-size', + min: 5, + max: 15, + change: function (value) { + that.previewFileMaxSize = value * 1024 * 1024; + document.getElementById("tl-rtc-file-preview-size-txt").innerText = value + "MB"; + } + }); + previewSizeSliderDivObj.setValue((that.previewFileMaxSize / 1024 / 1024) - 5); + + //执行日志大小自定义 + let logSizeSliderDivObj = slider.render({ + elem: '#tl-rtc-file-log-size', + min: 300, + max: 800, + change: function (value) { + that.maxLogCount = value; + document.getElementById("tl-rtc-file-log-size-txt").innerText = value + "条"; + } + }); + logSizeSliderDivObj.setValue(that.maxLogCount - 300); + + document.getElementById("rtcCheck").addEventListener('click',function(){ + that.webrtcCheck(); + }) + + document.getElementById("customWsHost").addEventListener('click', function(){ + that.customWsHost(); + }) + + document.getElementById("relaySetting").addEventListener('click', function(){ + that.relaySetting(); + }) + + document.getElementById("sendBugs").addEventListener('click', function(){ + that.sendBugs(); + }) + + document.getElementById("aiContext").addEventListener('click', function(){ + that.sendOpenaiChatWithContext(); + }) + + document.getElementById("fileSave").addEventListener('click', function(){ + that.savaFileToIndexedDb(); + }) + + document.getElementById("systemLog").addEventListener('click', function(){ + layer.closeAll(function(){ + that.clickLogs(); + }) + }) + + document.getElementById("closeLogs").addEventListener('click', function(){ + that.closeLogs(); + }) + + document.getElementById("coffee").addEventListener('click', function(){ + that.coffee(); + }) + + document.getElementById("messageDot").addEventListener('click', function(){ + that.messageDot(); + }) + + document.getElementById("fixedRoom").addEventListener('click', function(){ + that.fixedRoom(); + }) + + document.getElementById("localNetworkRoomShare").addEventListener('click', function(){ + that.localNetworkRoomShare(); + }) + + document.getElementById("settingBasicHelp").addEventListener('click', function(){ + that.settingHelp(); + }) + + document.getElementById("settingSwitchHelp").addEventListener('click', function(){ + that.settingHelp(); + }) + + document.getElementById("fileTransferSettingHelp").addEventListener('click', function(){ + that.settingHelp(); + }) + }, + content: ` + + ` + } + layer.closeAll(function () { + layer.open(options) + }) + this.addUserLogs(this.lang.open_setting) + }, + // 设置文档 + settingHelp : function(){ + layer.open({ + type: 2 + , title: false + , closeBtn: false + , area: ['80%','80%'] + , shade: 0.5 + , shadeClose : true + , id: 'layui-info-msg' + , content: 'document/SETTING.html' + }); + }, + // 自动加入固定房间号 + autoJoinFixedRoom: function () { + if(!this.useFixedRoom){ + return + } + + this.roomId = this.useFixedRoom; + this.createFileRoom(); + this.createFileRoom(); + + layer.msg(this.lang.auto_join_fixed_room + ": " + this.useFixedRoom) + }, + + // 是否关闭日志输出 + closeLogs: function(){ + this.isCloseLogs = !this.isCloseLogs; + + if (this.isCloseLogs) { + layer.msg(`${this.lang.logs_switch}${this.lang.on}`) + $("#closeLogsOpen").css("display", "inline"); + $("#closeLogsClose").css("display", "none"); + } else { + layer.msg(`${this.lang.logs_switch}${this.lang.off}`) + $("#closeLogsOpen").css("display", "none"); + $("#closeLogsClose").css("display", "inline"); + } + + $("#closeLogs").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#closeLogs").addClass("layui-anim-rotate") + }, 50) + }, + // ai对话上下文开关 + sendOpenaiChatWithContext : function(){ + this.openaiSendContext = !this.openaiSendContext; + + if(this.openaiSendContext){ + $("#aiContextOpen").css("display", "inline"); + $("#aiContextClose").css("display", "none"); + }else{ + $("#aiContextOpen").css("display", "none"); + $("#aiContextClose").css("display", "inline"); + } + + layer.msg(`${this.lang.ai_switch}${this.openaiSendContext ? this.lang.on : this.lang.off}`) + + this.addUserLogs(`${this.lang.ai_switch}${this.openaiSendContext ? this.lang.on : this.lang.off}`) + + $("#aiContext").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#aiContext").addClass("layui-anim-rotate") + }, 50) + }, + // 是否关闭消息红点提示 + messageDot : function(){ + if (this.useMessageDot) { + window.localStorage.setItem("tl-rtc-file-use-message-dot", false) + layer.msg(`${this.lang.messgae_dot_switch}${this.lang.off}`) + $("#messageDotOpen").css("display", "none"); + $("#messageDotClose").css("display", "inline"); + } else { + window.localStorage.setItem("tl-rtc-file-use-message-dot", true) + layer.msg(`${this.lang.messgae_dot_switch}${this.lang.on}`) + $("#messageDotOpen").css("display", "inline"); + $("#messageDotClose").css("display", "none"); + } + + this.useMessageDot = !this.useMessageDot; + + $("#messageDot").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#messageDot").addClass("layui-anim-rotate") + }, 50) + }, + // 是否开启局域网房间分享 + localNetworkRoomShare : function(){ + if(this.useLocalNetworkRoomShare){ + window.localStorage.setItem("tl-rtc-file-use-local-network-room-share", false) + layer.msg(`${this.lang.local_network_room_share}${this.lang.off}`) + $("#localNetworkRoomShareOpen").css("display", "none"); + $("#localNetworkRoomShareClose").css("display", "inline"); + }else{ + window.localStorage.setItem("tl-rtc-file-use-local-network-room-share", true) + layer.msg(`${this.lang.local_network_room_share}${this.lang.on}`) + $("#localNetworkRoomShareOpen").css("display", "inline"); + $("#localNetworkRoomShareClose").css("display", "none"); + } + + this.useLocalNetworkRoomShare = !this.useLocalNetworkRoomShare; + + $("#localNetworkRoomShare").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#localNetworkRoomShare").addClass("layui-anim-rotate") + }, 50) + }, + // 是否使用自自定义持久化房间号 + fixedRoom : function(){ + let that = this; + if(this.useFixedRoom){ + window.localStorage.removeItem("tl-rtc-file-use-fixed-room") + layer.msg(`${this.lang.fixed_room}${this.lang.off}`) + + $("#fixedRoomOpen").css("display", "none"); + $("#fixedRoomClose").css("display", "inline"); + + setTimeout(() => { + window.location.reload() + }, 500); + }else{ + layer.prompt({ + formType: 0, + value: '', + title: that.lang.fixed_room, + }, function (value, index, elem) { + if (!that.switchData.allowChinese && window.tlrtcfile.containChinese(value)) { + layer.msg(that.lang.room_num_no_zh) + return + } + if (!that.switchData.allowNumber && window.tlrtcfile.containNumber(value)) { + layer.msg(that.lang.room_num_no_number) + return + } + if (!that.switchData.allowSymbol && window.tlrtcfile.containSymbol(value)) { + layer.msg(that.lang.room_num_no_special_symbols) + return + } + + console.log(that.switchData, value, window.tlrtcfile.containSymbol(value)) + + layer.close(index); + + window.localStorage.setItem("tl-rtc-file-use-fixed-room", value) + layer.msg(`${that.lang.fixed_room}${that.lang.on}`) + + $("#fixedRoomOpen").css("display", "inline"); + $("#fixedRoomClose").css("display", "none"); + + setTimeout(() => { + window.location.reload() + }, 500); + }); + } + + $("#fixedRoom").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#fixedRoom").addClass("layui-anim-rotate") + }, 50) + }, + // 开启文件持久化到indexedDb中 + savaFileToIndexedDb: function(){ + if(!this.canSaveToIndexedDb){ + layer.msg(this.lang.not_support) + return + } + + if (this.useIndexedDb) { + window.localStorage.setItem("tl-rtc-file-receive-file-use-indexed-db", false) + layer.msg(`${this.lang.save_file_to_indexeddb}${this.lang.off}`) + $("#fileSaveOpen").css("display", "none"); + $("#fileSaveClose").css("display", "inline"); + } else { + window.localStorage.setItem("tl-rtc-file-receive-file-use-indexed-db", true) + layer.msg(`${this.lang.save_file_to_indexeddb}${this.lang.on}`) + $("#fileSaveOpen").css("display", "inline"); + $("#fileSaveClose").css("display", "none"); + } + + this.useIndexedDb = !this.useIndexedDb; + + $("#fileSave").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#fileSave").addClass("layui-anim-rotate") + }, 50) + }, + // 自定义ws地址 + customWsHost: function () { + let that = this; + if(window.localStorage.getItem("tl-rtc-file-custom-ws-host")){ + window.localStorage.removeItem("tl-rtc-file-custom-ws-host") + layer.msg(that.lang.close_custom_ws_url) + setTimeout(() => { + window.location.reload() + }, 500); + }else{ + layer.prompt({ + formType: 0, + value: 'wss://', + title: that.lang.input_custom_ws_url, + }, function (value, index, elem) { + if(!/^wss?:\/\/[^\s/$.?#].[^\s]*$/.test(value)){ + layer.msg(that.lang.ws_url_error) + return + } + + layer.close(index); + + window.localStorage.setItem("tl-rtc-file-custom-ws-host", value) + layer.msg(that.lang.open_custom_ws_url) + setTimeout(() => { + window.location.reload() + }, 500); + }); + } + $("#customWsHost").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#customWsHost").addClass("layui-anim-rotate") + }, 50) + }, + // 打开中继设置面板 + relaySetting: function () { + if (this.useTurn) { + window.localStorage.setItem("tl-rtc-file-use-relay", false) + layer.msg(`${this.lang.relay_server_current}${this.lang.off}`) + $("#relaySettingOpen").css("display", "none"); + $("#relaySettingClose").css("display", "inline"); + } else { + window.localStorage.setItem("tl-rtc-file-use-relay", true) + layer.msg(`${this.lang.relay_server_current}${this.lang.on}`) + $("#relaySettingOpen").css("display", "none"); + $("#relaySettingClose").css("display", "inline"); + } + + $("#relaySetting").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#relaySetting").addClass("layui-anim-rotate") + }, 50) + + setTimeout(() => { + window.location.reload() + }, 300); + }, + // 中继信息提示 + useTurnMsg: function () { + layer.msg(this.lang.relay_on) + this.addUserLogs(this.lang.relay_on) + }, + // 当前网络状态 + networkMsg: function () { + layer.msg(this.lang.current_network + (this.network !== 'wifi' ? this.lang.mobile_data : this.network)) + this.addUserLogs(this.lang.current_network + (this.network !== 'wifi' ? this.lang.mobile_data : this.network)) + }, + // 添加弹窗 + addPopup: function (msg) { + this.popUpList.push({ + title : msg.title, + message : msg.msg + }) + }, + // 记录系统日志 + addSysLogs: function (msg) { + this.addLogs(msg, "【"+this.lang.sys_log+"】: ") + }, + // 记录用户操作日志 + addUserLogs: function (msg) { + this.addLogs(msg, "【"+this.lang.op_log+"】: ") + }, + // 记录日志 + addLogs: function (msg, type) { + if(this.isCloseLogs){ + return + } + if (this.logs.length > this.maxLogCount) { + this.logs.shift(); + } + this.logs.unshift({ + type: type, + msg: msg, + time: new Date().toLocaleString() + }) + }, + // 清空日志 + cleanLogs: function () { + this.logs = [] + this.addSysLogs(this.lang.clear_log) + }, + // 发送建议反馈 + sendBugs: function () { + let that = this; + $("#sendBugs").removeClass("layui-anim-rotate") + setTimeout(() => { + $("#sendBugs").addClass("layui-anim-rotate") + }, 50) + + that.roomId = "tlrtcfile问题反馈"; + that.roomType = "system"; + that.createFileRoom(); + that.createFileRoom(); + + setTimeout(() => { + layer.closeAll(async function(){ + that.openChatingRoom(); + let index = layer.load(2); + await that.loadSystemRoomMsg(); + layer.close(index); + }); + that.addUserLogs(that.lang.send_bug_info_ok); + }, 500); + }, + // 随机刷新房间号 + refleshRoom: function () { + if (!this.isJoined) { + this.roomId = parseInt(Math.random() * 100000); + this.addPopup({ + title : this.lang.refresh_room, + msg : this.lang.you_refresh_room + this.roomId + }); + this.addUserLogs(this.lang.you_refresh_room + this.roomId); + } + }, + // 复制分享房间url + shareUrl: function () { + let that = this; + layer.closeAll(function () { + layer.open({ + type: 1, + closeBtn: 0, + fixed: true, + maxmin: false, + shadeClose: true, + area: ['350px', '380px'], + title: that.lang.share_join_room, + success: function (layero, index) { + let shareArgs = { + r : that.roomId, + t : that.roomType + }; + if(that.roomType === 'live'){ + shareArgs.lsm = that.liveShareMode; + shareArgs.lsr = 'viewer'; + } + let content = window.tlrtcfile.addUrlHashParams(shareArgs); + document.querySelector(".layui-layer-title").style.borderTopRightRadius = "8px"; + document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "8px"; + document.querySelector(".layui-layer").style.borderRadius = "8px"; + if(window.tlrtcfile.getQrCode){ + tlrtcfile.getQrCode("tl-rtc-file-room-share-image", content) + } + + document.querySelector("#shareUrl").setAttribute("data-clipboard-text", content); + let clipboard = new ClipboardJS('#shareUrl'); + clipboard.on('success', function (e) { + e.clearSelection(); + setTimeout(() => { + layer.msg(that.lang.copy_room_link) + }, 500); + }); + that.addUserLogs(that.lang.copy_room_link); + }, + content: ` +
              +
              ${that.lang.share_join_room_done} + +
              +
              +
              + ` + }) + }) + this.addUserLogs(this.lang.open_share_join_room) + }, + // 获取分享的取件码文件 + handlerGetCodeFile: function () { + let that = this; + let hash = window.location.hash || ""; + if (hash && hash.includes("#")) { + let codeIdArgs = hash.split("c="); + if (codeIdArgs && codeIdArgs.length > 1) { + this.codeId = (codeIdArgs[1] + "").replace(/\s*/g, "").substring(0, 40); + layer.confirm(this.lang.is_pickup_code, (index) => { + window.location.hash = ""; + layer.close(index) + that.getCodeFile(); + }, (index) => { + that.codeId = ""; + window.location.hash = ""; + layer.close(index) + }) + this.addPopup({ + title : this.lang.share_pickup_code_file, + msg : this.lang.get_pickup_file + this.codeId + }); + this.addUserLogs(this.lang.get_pickup_file + this.codeId); + } + } + }, + // 分享进入房间 + handlerJoinShareRoom: function () { + let that = this; + + //如果已经使用固定房间号,跳过分享进入逻辑 + if(this.useFixedRoom){ + return + } + + let hash = window.location.hash || ""; + if (!hash || !hash.includes("#") || !hash.includes("r=")) { + return + } + + if (!window.layer) { + return + } + + //房间号 + let roomIdArgs = tlrtcfile.getRequestHashArgs("r"); + if (!roomIdArgs) { + return + } + this.roomId = (roomIdArgs + "").replace(/\s*/g, "").substring(0, 15); + + //房间类型 + let typeArgs = tlrtcfile.getRequestHashArgs("t"); + + layer.confirm(this.lang.join_room + this.roomId, (index) => { + window.location.hash = ""; + layer.close(index) + that.openRoomInput = true; + that.isShareJoin = true; + if(typeArgs && ['screen','live','video','audio'].includes(typeArgs)){ + if(typeArgs === 'screen'){ + that.startScreenShare(); + }else if(typeArgs === 'live'){ + //直播房间模式 + let lsm = tlrtcfile.getRequestHashArgs("lsm"); + if(['video', 'live', ''].includes(lsm)){ + that.liveShareMode = lsm; + } + //直播房间身份 + let lsr = tlrtcfile.getRequestHashArgs("lsr"); + if(['owner', 'viewer'].includes(lsr)){ + that.liveShareRole = lsr; + } + that.startLiveShare(); + }else if(typeArgs === 'video'){ + that.startVideoShare(); + }else if(typeArgs === 'audio'){ + that.startAudioShare(); + } + }else{ + that.createFileRoom(); + } + }, (index) => { + that.roomId = ""; + window.location.hash = ""; + layer.close(index) + }) + this.addPopup({ + title : this.lang.share_join_room, + msg : this.lang.you_join_room + this.roomId + }); + this.addUserLogs(this.lang.you_join_room + this.roomId); + }, + // 赞助面板 + coffee: function () { + let options = { + type: 1, + fixed: false, + maxmin: false, + shadeClose: true, + area: ['300px', '350px'], + title: this.lang.donate, + success: function (layero, index) { + document.querySelector(".layui-layer-title").style.borderTopRightRadius = "8px"; + document.querySelector(".layui-layer-title").style.borderTopLeftRadius = "8px"; + document.querySelector(".layui-layer").style.borderRadius = "8px"; + }, + content: `img ` + } + layer.closeAll(function () { + layer.open(options) + }) + this.addUserLogs(this.lang.open_donate) + }, + //点击局域网房间列表 + clickLocalNetRooms : function(hidden){ + if(this.localNetRoomList.length === 0 && !hidden){ + layer.msg(this.lang.no_local_network_room) + return + } + + this.showLocalNetRoom = !this.showLocalNetRoom; + if (this.showLocalNetRoom) { + this.addUserLogs(this.lang.expand_local_network_room); + this.localNetRoomMaskHeightNum = 20; + } else { + this.localNetRoomMaskHeightNum = 150; + this.addUserLogs(this.lang.collapse_local_network_room); + } + }, + //点击下载文件面板 + clickReceiveFile: function (hidden) { + if(this.receiveFileRecoderList.length === 0 && !hidden){ + layer.msg(this.lang.no_received_file) + return + } + this.showReceiveFile = !this.showReceiveFile; + if (this.showReceiveFile) { + this.addUserLogs(this.lang.expand_receive_file); + this.receiveFileMaskHeightNum = 20; + } else { + this.receiveFileMaskHeightNum = 150; + this.addUserLogs(this.lang.collapse_receive_file); + } + }, + //点击已选文件面板 + clickChooseFile: function () { + if(!this.hasManInRoom && !this.showChooseFile){ + layer.msg(this.lang.room_least_two_can_send_content) + return + } + this.showChooseFile = !this.showChooseFile; + if (this.showChooseFile) { + this.chooseFileMaskHeightNum = 20; + this.addUserLogs(this.lang.expand_selected_file); + } else { + this.chooseFileMaskHeightNum = 150; + this.addUserLogs(this.lang.collapse_selected_file); + } + }, + //点击待发送文件面板 + clickSendFile: function () { + if(!this.hasManInRoom && !this.showSendFile){ + layer.msg(this.lang.room_least_two_can_send_content) + return + } + this.showSendFile = !this.showSendFile; + if (this.showSendFile) { + this.sendFileMaskHeightNum = 20; + this.addUserLogs(this.lang.expand_wait_send_file); + } else { + this.sendFileMaskHeightNum = 150; + this.addUserLogs(this.lang.collapse_wait_send_file); + } + }, + //点击发送文件历史记录面板 + clickSendFileHistory: function () { + if(this.sendFileRecoderHistoryList.length === 0){ + layer.msg(this.lang.no_send_file) + return + } + this.showSendFileHistory = !this.showSendFileHistory; + if (this.showSendFileHistory) { + this.sendFileHistoryMaskHeightNum = 20; + this.addUserLogs(this.lang.expand_send_file_record); + } else { + this.sendFileHistoryMaskHeightNum = 150; + this.addUserLogs(this.lang.collapse_send_file_record); + } + }, + //点击查看日志面板 + clickLogs: function (e) { + this.showLogs = !this.showLogs; + this.touchResize(); + if (this.showLogs) { + this.addUserLogs(this.lang.expand_log); + this.logMaskHeightNum = 0; + } else { + this.addUserLogs(this.lang.collapse_log); + this.logMaskHeightNum = -150; + } + }, + //点击打开音视频面板 + clickMediaVideo: function () { + this.showMedia = !this.showMedia; + this.touchResize(); + if (this.showMedia) { + this.addUserLogs(this.lang.expand_video); + this.mediaVideoMaskHeightNum = 0; + if(this.clientWidth < 500){ + document.getElementById("iamtsm").style.marginLeft = '0'; + }else{ + document.getElementById("iamtsm").style.marginLeft = "50%"; + } + } else { + this.addUserLogs(this.lang.collapse_video); + this.mediaVideoMaskHeightNum = -150; + document.getElementById("iamtsm").style.marginLeft = "0"; + } + }, + //点击打开屏幕共享面板 + clickMediaScreen: function () { + this.showMedia = !this.showMedia; + this.touchResize(); + if (this.showMedia) { + this.addUserLogs(this.lang.expand_screen_sharing); + this.mediaScreenMaskHeightNum = 0; + if(this.clientWidth < 500){ + document.getElementById("iamtsm").style.marginLeft = "0"; + }else{ + document.getElementById("iamtsm").style.marginLeft = "50%"; + } + } else { + this.addUserLogs(this.lang.collapse_screen_sharing); + this.mediaScreenMaskHeightNum = -150; + document.getElementById("iamtsm").style.marginLeft = "0"; + } + }, + //点击打开直播面板 + clickMediaLive: function () { + this.showMedia = !this.showMedia; + this.touchResize(); + if (this.showMedia) { + this.addUserLogs(this.lang.expand_live); + if(this.clientWidth < 500){ + document.getElementById("iamtsm").style.marginLeft = "0"; + }else{ + document.getElementById("iamtsm").style.marginLeft = "50%"; + } + this.mediaLiveMaskHeightNum = 0; + } else { + this.addUserLogs(this.lang.collapse_live); + this.mediaLiveMaskHeightNum = -150; + document.getElementById("iamtsm").style.marginLeft = "0"; + } + }, + clickMediaAudio : function(){ + this.showMedia = !this.showMedia; + this.touchResize(); + if (this.showMedia) { + this.addUserLogs(this.lang.expand_audio); + if(this.clientWidth < 500){ + document.getElementById("iamtsm").style.marginLeft = "0"; + }else{ + document.getElementById("iamtsm").style.marginLeft = "50%"; + } + this.mediaAudioMaskHeightNum = 0; + } else { + this.addUserLogs(this.lang.collapse_audio); + this.mediaAudioMaskHeightNum = -150; + document.getElementById("iamtsm").style.marginLeft = "0"; + } + }, + typeInArr: function(arr, type, name = ""){ + if(type === ''){ + let fileTail = name.split(".").pop() + return arr.filter(item=>{ + return fileTail.toLowerCase().includes(item) && name.endsWith("."+fileTail); + }).length > 0; + }else{ + return arr.filter(item=>{ + return type.toLowerCase().includes(item); + }).length > 0; + } + }, + //文件大小 + getFileSizeStr: function (size) { + let sizeStr = (size / 1048576).toString(); + let head = sizeStr.split(".")[0]; + let tail = ""; + if (sizeStr.split(".")[1]) { + tail = sizeStr.split(".")[1].substring(0, 3); + } + if(head === '0') { + return "0M"; + } + return head + '.' + tail + "M"; + }, + // indexedDb缓存keys + getIndexedDbFileBufferKeyList : function(recoder){ + let keyList = []; + for(let i = 0; i < recoder.fragment; i += 1000){ + keyList.push(recoder.indexedDbBufferKey + i); + } + if(recoder.fragment % 1000 > 0){ + keyList.push(recoder.indexedDbBufferKey + recoder.fragment); + } + return keyList; + }, + // 预览indexedDb中的文件 + previewIndexedDbFile : async function(recoder){ + let that = this; + const keyList = this.getIndexedDbFileBufferKeyList(recoder); + const allBuffer = new Array(); + for(let i = 0; i < keyList.length; i++){ + //从磁盘加载完,自动下载 + await new Promise((resolve, reject) => { + localforage.getItem(keyList[i]).then(function(value) { + if(!value){ + layer.msg(that.lang.indexedDB_file_alreay_delete) + setTimeout(() => { + that.deleteIndexedDbFile(recoder); + }, 300); + reject(null) + }else{ + value.forEach(item=>{ + allBuffer.push(item); + }) + resolve(0) + } + }).catch(function(err) { + console.log("previewIndexedDbFile err ",err); + reject(err); + }); + }) + } + await this.previewFile(new File(allBuffer, recoder.name, { type: recoder.type })); + }, + // 从indexedDb下载文件 + downloadIndexedDbFile : async function(recoder){ + let that = this; - //关闭共享 - this.socket.on('stopScreenShare', function (data) { - if (data.id === that.socketId) { - that.clickMediaScreen(); - } else { - $(`#otherMediaScreenShare${data.id}`).parent().remove(); - } - }); + if(!this.canSaveToIndexedDb){ + return + } - //关闭共享 - this.socket.on('openCamera', function (data) { - that.setRemoteInfo(data.from, { - isCameraEnabled : data.isCameraEnabled, - isAudioEnabled : data.isAudioEnabled + const keyList = this.getIndexedDbFileBufferKeyList(recoder); + const allBuffer = new Array(); + for(let i = 0; i < keyList.length; i++){ + //从磁盘加载完,自动下载 + await new Promise((resolve, reject) => { + localforage.getItem(keyList[i]).then(function(value) { + if(!value){ + layer.msg(that.lang.indexedDB_file_alreay_delete) + setTimeout(() => { + that.deleteIndexedDbFile(recoder); + }, 300); + reject(null) + }else{ + value.forEach(item=>{ + allBuffer.push(item); + }) + } + resolve(0) + }).catch(function(err) { + console.log("downloadIndexedDbFileInfo err ",err); + reject(null); + }); }) - if(data.type === 'video'){ - if(data.kind === 'video'){ - document.querySelector(`#otherMediaVideoShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaVideoShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; - }else if(data.kind === 'audio'){ - document.querySelector(`#otherMediaVideoShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaVideoShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; - } - }else if(data.type === 'screen'){ - if(data.kind === 'video'){ - document.querySelector(`#otherMediaScreenShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaScreenShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; - }else if(data.kind === 'audio'){ - document.querySelector(`#otherMediaScreenShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaScreenShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; - } - }else if(data.type === 'live'){ - if(data.kind === 'video'){ - document.querySelector(`#otherMediaLiveShare${data.from}`).style.display = data.isCameraEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaLiveShareVideoSvg${data.from}`).style.display = data.isCameraEnabled ? 'none' : 'block'; - }else if(data.kind === 'audio'){ - document.querySelector(`#otherMediaLiveShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaLiveShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; - } - }else if(data.type === 'audio'){ - if(data.kind === 'audio'){ - document.querySelector(`#otherMediaAudioShareAudioOpenSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaAudioShareAudioCloseSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; - - document.querySelector(`#otherMediaAudioShareAudioOpenAnimSvg${data.from}`).style.display = data.isAudioEnabled ? 'block' : 'none'; - document.querySelector(`#otherMediaAudioShareAudioCloseAnimSvg${data.from}`).style.display = data.isAudioEnabled ? 'none' : 'block'; - } - } - }); - - //关闭音视频 - this.socket.on('stopVideoShare', function (data) { - if (data.id === that.socketId) { - that.clickMediaVideo(); - } else { - $(`#otherMediaVideoShare${data.id}`).parent().remove(); - } - }); + } - //退出直播 - this.socket.on('stopLiveShare', function (data) { - //如果是主动房主退出,所有观众都退出 - if(data.owner){ - window.location.reload(); - return - } + const downloadLink = document.createElement('a'); + downloadLink.download = recoder.name; + downloadLink.href = URL.createObjectURL(new Blob(allBuffer), { type: recoder.type }); + downloadLink.style.display = 'none'; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }, + // 清除indexedDb中的文件 + clearIndexedDbFile: function(){ + let that = this; - if (data.id === that.socketId) { - that.clickMediaLive(); - } - }); + this.receiveFileRecoderList = []; - //退出语音连麦 - this.socket.on('stopAudioShare', function (data) { - if (data.id === that.socketId) { - that.clickMediaAudio(); - } else { - $(`#otherMediaAudioShare${data.id}`).parent().remove(); - } + localforage.clear().then(function() { + layer.msg(that.lang.clear_indexeddb_file_done) }); + }, + //删除indexedDb中的文件 + deleteIndexedDbFile : function(recoder){ + let that = this; + if(!this.canSaveToIndexedDb){ + return + } - //ai对话 - this.socket.on('openaiAnswer', function (data) { - that.isAiAnswering = false - that.receiveAiChatList.push(data) - that.addSysLogs("AI : " + data.content) - that.addPopup({ - title : that.lang.ai_reply, - msg : that.lang.ai_reply_you - }); - that.receiveAiChatList.forEach(item => { - item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; - }) - that.openaiChatTpl() - }); + const keyList = this.getIndexedDbFileBufferKeyList(recoder); - //开关数据 - this.socket.on('commData', function (data) { - that.switchData = data.switchData - that.switchDataGet = true; - if(data.switchData.noticeMsgList){ - let alert = window.localStorage.getItem("tl-rtc-file-alert-notice") - if(!alert || (Date.now() - parseInt(alert)) / 1000 > (24 * 60 * 60) ){ - setTimeout(() => { - that.clickNotice() - window.localStorage.setItem("tl-rtc-file-alert-notice", Date.now()) - }, 1000); - } - } + this.receiveFileRecoderList = this.receiveFileRecoderList.filter(item => { + return item.index !== recoder.index; + }) - if(data.chatingCommData){ - data.chatingCommData.forEach(elem => { - try { - elem.msg = tlrtcfile.unescapeStr(elem.msg) - } catch (e) { - that.addSysLogs(that.lang.text_decode_failed + elem.msg); - } - that.receiveChatCommList.push(elem) - }) - that.receiveChatCommList.forEach(item => { - item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; - }) - } + // 删除文件信息 + localforage.removeItem(recoder.indexedDbInfoKey).then(function() { + layer.msg(that.lang.delete_indexeddb_file_done) + }).catch(function(err) { + console.log("deleteIndexedDbFile info err ",err); }); - //公共聊天频道 - this.socket.on('chatingComm', function (data) { - that.addSysLogs(data.room + ":" + data.socketId + that.lang.send_text + ": [ " + data.msg + " ]"); - try { - data.msg = tlrtcfile.unescapeStr(data.msg) - } catch (e) { - that.addSysLogs(that.lang.text_decode_failed + data.msg); - } - that.receiveChatCommList.push(data); - if (that.receiveChatCommList.length > 10) { - that.receiveChatCommList.shift(); - } - that.receiveChatCommList.forEach(item => { - item.timeAgo = window.util ? util.timeAgo(item.time) : item.time; - }) - that.chatingCommTpl() - - that.addPopup({ - title : that.lang.chat_comm, - msg : that.lang.public_chat_channel_someone_interact + // 删除文件数据 + keyList.forEach( key =>{ + localforage.removeItem( key ).then(function() { + }).catch(function(err) { + console.log("deleteIndexedDbFile data err ",err); }); }); - this.socket.on('manageCheck', function (data) { - layer.prompt({ - formType: 1, - title: that.lang.please_enter, - }, function (value, index, elem) { - that.socket.emit('manageConfirm', { - room: that.roomId, - value: value - }); - layer.close(index) - }); - }); + // 删除的文件如果是最后一个文件,关闭下接收文件弹窗 + if(this.receiveFileRecoderList === 0){ + this.clickReceiveFile(true) + } + }, + //分片文件数据存入indexedDb + saveSliceFileBufferToIndexedDb : function(recoder, fragment, buffer){ + localforage.setItem(recoder.indexedDbBufferKey + fragment, buffer); + }, + //文件信息存入indexedDb + saveSliceFileInfoToIndexedDb : function(recoder){ + localforage.setItem(recoder.indexedDbInfoKey, recoder); + }, + //加载indexedDb中的历史文件信息,不包括文件buffer + loadIndexedDbFileInfo : function(){ + let that = this; + if(!this.canSaveToIndexedDb){ + return + } - this.socket.on('manage', function (data) { - if (data.socketId !== that.socketId) { - layer.msg(that.lang.illegal_event) - return + localforage.iterate(function(value, key, iterationNumber) { + if(key.toString().endsWith("_info")){ + that.receiveFileRecoderList.push(value) + that.loadIndexedFileAllSize += value.size; } - layer.closeAll(); - that.token = data.token; - layer.load(2, { - time: 1000, - shade: [0.8, '#000000'], - success: function (layero) { - layer.setTop(layero); //重点2 - } - }) - setTimeout(() => { - that.manageIframeId = layer.tab({ - area: ['100%', '100%'], - shade: [0.8, '#393D49'], - closeBtn : 0, - tab: [{ - title: data.content[0].title, - content: data.content[0].html - }, { - title: data.content[1].title, - content: data.content[1].html - }, { - title: data.content[2].title, - content: data.content[2].html - }], - cancel: function (index, layero) { - that.manageIframeId = 0; - }, - }) - layer.full(that.manageIframeId) - }, 500); + }).then(function() { + that.addUserLogs(that.lang.load_indexeddb_file_done); + }).catch(function(err) { + console.log("loadIndexedDbFileInfo err ",err); }); }, // 检测浏览器是支持webrtc @@ -4226,6 +5290,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { this.sendFileRecoderHeight = document.querySelector("#send-file-list").clientHeight - 190; this.chooseFileHeight = document.querySelector("#send-file-list-choose").clientHeight - 40; this.sendFileRecoderHistoryHeight = document.querySelector("#send-file-list-history").clientHeight - 40; + this.localNetRoomListHeight = document.querySelector("#local-net-room-list").clientHeight - 40; this.receiveFileHeight = document.querySelector("#receive-file-list").clientHeight - 40; this.codeFileHeight = document.querySelector("#code-file-list").clientHeight - 40; @@ -4328,27 +5393,6 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { } this.isAudioShare = res }) - window.Bus.$on("sendChatingComm", (res) => { - this.sendChatingComm() - }) - window.Bus.$on("sendChatingRoom", (res) => { - this.sendChatingRoom() - }) - window.Bus.$on("sendChatingRoomSingle", (res) => { - this.sendChatingRoomSingle() - }) - window.Bus.$on("sendOpenaiChat", (res) => { - this.sendOpenaiChat() - }) - window.Bus.$on("sendOpenaiChatWithContext", () => { - this.openaiSendContext = !this.openaiSendContext; - layer.msg(`${this.lang.ai_switch}${this.openaiSendContext ? this.lang.on : this.lang.off}`) - this.addUserLogs(`${this.lang.ai_switch}${this.openaiSendContext ? this.lang.on : this.lang.off}`) - $("#aiContext").removeClass("layui-anim-rotate") - setTimeout(() => { - $("#aiContext").addClass("layui-anim-rotate") - }, 50) - }) window.Bus.$on("manageChange", (data) => { this.socket.emit('manageChange', { id: data.id, @@ -4365,18 +5409,6 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { content: data.time, }); }) - window.Bus.$on("webrtcCheck", (res) => { - this.webrtcCheck() - }) - window.Bus.$on("sendBugs", (res) => { - this.sendBugs() - }) - window.Bus.$on("relaySetting", (res) => { - this.relaySetting() - }) - window.Bus.$on("customWsHost", (res) => { - this.customWsHost() - }) window.Bus.$on("addSysLogs", (res) => { this.addSysLogs(res) }) @@ -4485,7 +5517,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { observer: true, scrollbar: { el : '.swiper-scrollbar', - hide: true, + // hide: true, } }) window.toolSwiper = toolSwiper; @@ -4500,7 +5532,7 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { this.addSysLogs(this.lang.init_language_done); this.addSysLogs(this.lang.print_logo); - this.consoleLogo(); + this.printLogo(); this.addSysLogs(this.lang.refresh_random_room_num_init); this.refleshRoom() @@ -4531,9 +5563,11 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { }, 5000); this.addSysLogs(this.lang.webrtc_check_init_done); + this.addSysLogs(this.lang.heartbeat_init); setInterval(async () => { this.socket.emit("heartbeat", {}) }, 10000); + this.addSysLogs(this.lang.heartbeat_init_done); this.addSysLogs(this.lang.message_box_init); this.startPopUpMsg() @@ -4562,8 +5596,20 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { this.audioDeviceList = a; this.loudspeakerDeviceList = l; }); + + this.addSysLogs(this.lang.indexedDB_init); + this.loadIndexedDbFileInfo(); + this.addSysLogs(this.lang.indexedDB_init_done); + + this.addSysLogs(this.lang.check_auto_join_fixed_room); + this.autoJoinFixedRoom(); + this.addSysLogs(this.lang.check_auto_join_fixed_room_done); }, 2000); + this.addSysLogs(this.lang.nickname_init); + this.setNickName(); + this.addSysLogs(this.lang.nickname_init_done); + this.addSysLogs(this.lang.debug_init); this.loadVConsoleJs(); this.addSysLogs(this.lang.debug_init_done); @@ -4578,45 +5624,6 @@ axios.get("/api/comm/initData?turn="+useTurn, {}).then((initData) => { window.manageChange = function (data) { window.Bus.$emit("manageChange", data) } - window.sendChatingComm = function () { - window.Bus.$emit("sendChatingComm", {}) - } - window.sendChatingRoom = function () { - window.Bus.$emit("sendChatingRoom", {}) - } - window.sendChatingRoomSingle = function () { - window.Bus.$emit("sendChatingRoomSingle", {}) - } - window.sendOpenaiChat = function () { - window.Bus.$emit("sendOpenaiChat", {}) - } - window.webrtcCheck = function () { - window.Bus.$emit("webrtcCheck", {}) - } - window.sendBugs = function () { - window.Bus.$emit("sendBugs", {}) - } - window.sendOpenaiChatWithContext = function () { - window.Bus.$emit("sendOpenaiChatWithContext", {}) - } - window.relaySetting = function () { - window.layer.closeAll(() => { - window.Bus.$emit("relaySetting", {}) - }); - } - window.useTurn = function () { - if ((window.localStorage.getItem("tl-rtc-file-use-relay") || "") === 'true') { - window.localStorage.setItem("tl-rtc-file-use-relay", false) - } else { - window.localStorage.setItem("tl-rtc-file-use-relay", true) - } - window.location.reload() - } - window.customWsHost = function () { - window.layer.closeAll(() => { - window.Bus.$emit("customWsHost", {}) - }); - } }) diff --git a/svr/res/js/language.js b/svr/web-res/js/language.js similarity index 83% rename from svr/res/js/language.js rename to svr/web-res/js/language.js index 2e80bdb..fb9bd3b 100644 --- a/svr/res/js/language.js +++ b/svr/web-res/js/language.js @@ -8,6 +8,70 @@ const local_lang = { "en": { + "question_answer" : "Question and answer", + "room_number" : "Room number", + "expand_local_network_room" : "Expand local network room panel", + "collapse_local_network_room" : "Collapse local network room panel", + "no_local_network_room" : "No local network room searched", + "local_net_room_list" : "Local network room list", + "heartbeat_init" : "heartbeat init", + "heartbeat_init_done" : "heartbeat init done", + "indexedDB_init" : "indexedDB init", + "indexedDB_init_done" : "indexedDB init done", + "auto_join_fixed_room" : "Auto join fixed room", + "check_auto_join_fixed_room" : "Check auto join fixed room", + "check_auto_join_fixed_room_done" : "Check auto join fixed room done", + "room_number_error" : "Room number error", + "local_network_room_share" : "Local network room share", + "fixed_room" : "Fixed room number", + "messgae_dot_switch" : "Message dot switch", + "message_dot" : "Message dot", + "github": "Github link", + "gitee" : "Gitee link", + "log_list" : "Log list", + "logs_switch" : "Logs switch", + "indexedDB_file_alreay_delete" : "indexedDB file has been deleted", + "output_log_limit" : "Execution log output limit", + "preview_limit_size" : "Preview file size limit", + "file_fragment_size" : "File fragment transfer size", + "clear_indexeddb_file_done" : "Clear indexeddb file done", + "clear_all" : "Clear all", + "file_transfer_setting" : "File transfer setting", + "switch_setting" : "Switch setting", + "setting_basic": "Setting basic", + "receive_file_all_size" : "Total size of received files", + "load_indexeddb_file_all" : "Load all historical files from disk", + "delete_indexeddb_file_done" : "Delete indexeddb file done", + "load_indexeddb_file_done" : "Load indexeddb file done", + "load_from_disk" : "Load from disk", + "clear" : "Clear", + "clear_file_in_disk" : "Clear file in disk", + "open_source_doc_intro" : "Open source project document installation instructions", + "blog_intro" : "Developer/Team Blog", + "webrtc_check_intro" : "webrtc browser compatibility check", + "custom_url_intro" : "Customized websocket service connection address", + "relay_intro" : "Relay switch for p2p failed transmission", + "save_to_indexeddb_intro" : "Switch to permanently store files in the browser", + "ai_intro" : "Context switch for handling ChatGPT conversations", + "log_intro" : "Open the log list panel", + "send_bug_intro" :"Feedback website/project issues, suggestions", + "setting_intro" : "Setting intro", + "open_source_doc" : "Open source document", + "file_in_disk" : "Saved in disk", + "save_file_to_indexeddb_done" : "Save file to indexeddb done", + "save_file_to_indexeddb" : "Save file to indexeddb", + "logout_succ": "Logout successfully", + "check_login_state_init" : "Check login state initialization", + "check_login_state_init_done" : "Check login state initialization completed", + "nickname_init" : "Nickname initialization", + "nickname_init_done" : "Nickname initialization completed", + "user_info": "User info", + "login_fail": "Login failed", + "login_succ" : "Login successfully", + "scan_succ_and_wait_auth" : "Scan code successfully, waiting for confirmation authorization...", + "wait_scan" : "Waiting for scan", + "login_info" : "After logging in, you can load historical room records and other information", + "wxlogin" : "wchat app login", "wait_for_file" : "Waiting for the other party to prepare the file", "send_to_all_user": "Send to all user", "please_use_turn_server" : "Please use turn server in settings", @@ -33,7 +97,7 @@ const local_lang = { "start_audio_sharing" : "Start audio sharing", "end_audio_sharing" : "End audio sharing", "in_audioing" : "In audioing", - "start_audio" : "Start audio", + "start_audio" : "audio", "audience" : "Audience", "webrtc_check_init" : "Webrtc check init", "webrtc_check_init_done" : "Webrtc check init done", @@ -50,7 +114,7 @@ const local_lang = { "answer_failed": "Answer failed", "basic_data_get": "Basic data acquisition", "basic_data_get_done": "Basic data acquisition completed", - "blog": "Blog", + "blog": "My Blog", "chat_channel": "Chat channel", "chat_comm": "Chat", "chat_gpt": "ChatGPT", @@ -137,7 +201,7 @@ const local_lang = { "generate_send_file_record": "Generate send file record", "get_device_failed": "Failed to get device recording permission", "get_pickup_file": "Get files through pickup code", - "give_coffee": "Buy me a coffee", + "give_coffee": "donat author", "home": "Official website homepage", "history_msg" : " History messages", "i_said_to_ai": "I said to AI", @@ -184,7 +248,6 @@ const local_lang = { "open_donate": "Open donate window", "open_private_chat": "Open private chat panel", "open_public_chat_panel": "Open public chat panel", - "open_relay_setting": "Open relay setting window", "open_room_chat_panel": "Open room chat panel", "open_setting": "Open setting window", "open_share_join_room": "Open share join room window", @@ -247,7 +310,7 @@ const local_lang = { "relay_on": "The relay server is currently enabled, for more information, please go to settings to view", "relay_on_and_more_info_in_setting": "The relay server is currently enabled, for more information, please go to settings to view", "relay_server_current": "The relay server is currently", - "relay_server_current_detail": "Enabling the relay server can ensure that the data is transferred in a complex p2p network environment. If it is disabled, it will be forced to go through p2p (p2p detection can be performed in the settings), which may cause the transmission to fail!", + "relay_server_current_detail": "Enabling the relay server can ensure that the data is transferred in a complex p2p network environment. If it is disabled, it will be forced to go through p2p, which may cause the transmission to fail!", "relay_setting": "Relay setting", "remote_draw": "Paint", "room": "Room", @@ -347,9 +410,77 @@ const local_lang = { "device_classification" : "Device classification", "network_status" : "Network status", "public_ip" : "Public IP", - "webrtc_ice_state" : "webrtc state" + "webrtc_ice_state" : "webrtc state", + "ip" : "IP", + "online_count" : "Online count", }, "zh": { + "question_answer" : "问答/建议反馈列表", + "ip" : "IP", + "online_count" : "在线人数", + "room_number" : "房间号", + "expand_local_network_room" : "展开局域网房间面板", + "collapse_local_network_room" : "收起局域网房间面板", + "no_local_network_room" : "未搜索到局域网房间", + "local_net_room_list" : "局域网房间列表", + "heartbeat_init" : "心跳初始化", + "heartbeat_init_done" : "心跳初始化完成", + "indexedDB_init" : "indexedDB初始化", + "indexedDB_init_done" : "indexedDB初始化完成", + "auto_join_fixed_room" : "自动加入固定房间", + "check_auto_join_fixed_room_done" : "检查自动加入固定房间完成", + "check_auto_join_fixed_room" : "检查自动加入固定房间", + "room_number_error" : "房间号格式错误", + "local_network_room_share" : "局域网房间", + "fixed_room" : "固定房间号", + "messgae_dot_switch" : "消息红点开关", + "message_dot" : "消息红点", + "github" : "github地址", + "gitee" : "gitee地址", + "log_list" : "日志列表", + "logs_switch" : "日志开关", + "indexedDB_file_alreay_delete" : "indexedDB文件已经删除", + "output_log_limit" : "执行日志输出限制", + "preview_limit_size" : "预览文件大小限制", + "file_fragment_size" : "文件分片传输大小", + "clear_indexeddb_file_done" : "清除indexeddb文件完成", + "clear_all" : "清空全部", + "file_transfer_setting" : "文件传输设置", + "switch_setting" : "开关设置", + "setting_basic" : "基础设置", + "receive_file_all_size" : "接收文件总大小", + "load_indexeddb_file_all" : "加载磁盘历史文件", + "delete_indexeddb_file_done" : "删除indexeddb文件完成", + "load_indexeddb_file_done" : "从indexeddb加载文件完成", + "load_from_disk" : "从磁盘加载", + "clear" : "清理", + "clear_file_in_disk" : "清除磁盘中的文件", + "open_source_doc_intro" : "开源项目文档安装说明", + "blog_intro" : "开发者/团队博客", + "webrtc_check_intro" : "webrtc浏览器兼容性检测", + "custom_url_intro" : "自定义websocket服务连接地址", + "relay_intro" : "p2p失败兜底传输的中继开关", + "save_to_indexeddb_intro" : "文件长久存放在浏览器的开关", + "ai_intro" : "处理ChatGPT对话的上下文开关", + "log_intro" : "打开日志列表面板", + "send_bug_intro" :"反馈网站/项目问题,建议", + "setting_intro" : "设置简介", + "open_source_doc" : "开源文档", + "file_in_disk" : "已存放磁盘中", + "save_file_to_indexeddb" : "文件持久化", + "save_file_to_indexeddb_done": "保存文件到indexeddb完成", + "logout_succ" : "退出成功", + "check_login_state_init" : "检查登录状态初始化", + "check_login_state_init_done" : "检查登录状态初始化完成", + "nickname_init" : "昵称初始化", + "nickname_init_done" : "昵称初始化完成", + "user_info" : "用户信息", + "login_fail": "登录失败", + "login_succ": "登录成功", + "scan_succ_and_wait_auth": "扫码成功,等待确定授权中...", + "wait_scan" : "等待扫码", + "login_info" : "登录后可关联/加载历史房间记录等信息", + "wxlogin" : "微信扫码登录", "wait_for_file": "对方准备文件中", "please_use_turn_server" : "当前网络环境不稳定,建议在设置中打开中继服务开关", "socketConnectFail" : "socket服务连接失败,请检查socket服务是否正常启动,socket地址=", @@ -395,13 +526,13 @@ const local_lang = { "ai_chat_record": "AI聊天记录", "ai_reply": "AI回复", "ai_reply_you": "AI回复了你,快点聊起来吧~", - "ai_setting": "智能理解", + "ai_setting": "AI上下文", "ai_switch": "AI智能理解上下文开关", "ai_thinking": "AI思考中", "answer_failed": "answer失败", "basic_data_get": "基础数据 获取中", "basic_data_get_done": "基础数据 获取完成", - "blog": "博客", + "blog": "个人博客", "chat_channel": "聊天频道", "chat_comm": "公共聊天", "chat_gpt": "ChatGPT", @@ -487,7 +618,7 @@ const local_lang = { "generate_send_file_record": "生成文件发送记录", "get_device_failed": "获取设备录制权限失败", "get_pickup_file": "通过取件码获取文件", - "give_coffee": "赞助一杯咖啡", + "give_coffee": "赞赏作者", "history_msg" : " 条历史消息", "home": "官网首页", "i_said_to_ai": "我对AI说", @@ -534,7 +665,6 @@ const local_lang = { "open_donate": "打开赞助窗口", "open_private_chat": "打开私聊面板", "open_public_chat_panel": "打开公共聊天面板", - "open_relay_setting": "打开中继设置窗口", "open_room_chat_panel": "打开房间聊天面板", "open_setting": "打开设置窗口", "open_share_join_room": "打开分享房间窗口", @@ -597,7 +727,7 @@ const local_lang = { "relay_on": "当前已启用中继服务器,有关更多信息,请前往设置查看", "relay_on_and_more_info_in_setting": "当前已启用中继服务器,有关更多信息,请前往设置查看", "relay_server_current": "中继服务器当前已", - "relay_server_current_detail": "启用中继服务器可以保证在复杂的p2p网络环境下,提供保底的数据中转传输,如果禁用,则是强制走p2p(可在设置中进行p2p检测),可能会出现发送失败!", + "relay_server_current_detail": "启用中继服务器可以保证在复杂的p2p网络环境下,提供保底的数据中转传输,如果禁用,则是强制走p2p,可能会出现发送失败!", "relay_setting": "中继设置", "remote_draw": "远程画笔", "room": "房间", diff --git a/svr/res/js/liveShare.js b/svr/web-res/js/liveShare.js similarity index 100% rename from svr/res/js/liveShare.js rename to svr/web-res/js/liveShare.js diff --git a/svr/res/js/screen.js b/svr/web-res/js/screen.js similarity index 100% rename from svr/res/js/screen.js rename to svr/web-res/js/screen.js diff --git a/svr/res/js/screenShare.js b/svr/web-res/js/screenShare.js similarity index 100% rename from svr/res/js/screenShare.js rename to svr/web-res/js/screenShare.js diff --git a/svr/res/js/videoShare.js b/svr/web-res/js/videoShare.js similarity index 100% rename from svr/res/js/videoShare.js rename to svr/web-res/js/videoShare.js diff --git a/svr/res/pay.html b/svr/web-res/pay.html similarity index 100% rename from svr/res/pay.html rename to svr/web-res/pay.html diff --git a/svr/wxapp-res/app.js b/svr/wxapp-res/app.js new file mode 100644 index 0000000..6bdc111 --- /dev/null +++ b/svr/wxapp-res/app.js @@ -0,0 +1,13 @@ +//app.js +App({ + onLaunch: async function () { + + }, + globalData: { + userInfo: null, //用户信息 + baseUrl: "http://localhost:9092", //访问路径 + openId: '', //用户唯一标识 + loginState: false, //用户登录状态 + token: '', //用户登录返回的token + } +}) \ No newline at end of file diff --git a/svr/wxapp-res/app.json b/svr/wxapp-res/app.json new file mode 100644 index 0000000..e666d2d --- /dev/null +++ b/svr/wxapp-res/app.json @@ -0,0 +1,17 @@ +{ + "pages": [ + "pages/login/login", + "pages/succ/succ" + ], + "window": { + "navigationBarBackgroundColor": "#fff", + "navigationBarTitleText": "tl-rtc-file", + "navigationBarTextStyle": "black", + "backgroundColor": "#eeeeee", + "backgroundTextStyle": "dark" + }, + "networkTimeout": { + "request": 10000, + "downloadFile": 10000 + } +} \ No newline at end of file diff --git a/svr/wxapp-res/app.wxss b/svr/wxapp-res/app.wxss new file mode 100644 index 0000000..a529c39 --- /dev/null +++ b/svr/wxapp-res/app.wxss @@ -0,0 +1,11 @@ +/* *app.wxss* */ + +.container { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 200rpx 0; + box-sizing: border-box; +} diff --git a/svr/wxapp-res/images/demo.png b/svr/wxapp-res/images/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c0306d15ef8294e733f5a54cfa79057503e19a GIT binary patch literal 12824 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 wst9nS(=vt<8 literal 0 HcmV?d00001 diff --git a/svr/wxapp-res/images/succ.png b/svr/wxapp-res/images/succ.png new file mode 100644 index 0000000000000000000000000000000000000000..92f5506d6efd606e9b3a1405ea58e2b1aaed93f5 GIT binary patch literal 7296 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 a{Cfa0Ic*jpDjF^T0000 { + code = res.code; + }, + }); + // 获取用户信息 + wx.getUserProfile({ + lang: 'zh_CN', + desc: '用户登录', + success: (res) => { + that.GetOpenId(res.rawData, code); + }, + fail: () => { + // 失败回调 + wx.hideLoading(); + } + }); + }, + GetOpenId: function (userInfo, code) { + console.log(userInfo) + let that = this + wx.request({ + url: app.globalData.baseUrl + '/api/login/wechat', + data: { + userInfo: JSON.parse(userInfo), + code: code, + scene: that.data.scene + }, + dataType: "json", + method: "POST", + success: function (res) { + wx.hideLoading(); + console.log(res.data); + if (!res.data.session_key) { + wx.showToast({ + title: "登录失败,请尝试重新扫码登录", + duration: 1000, + icon: 'none', + mask: true + }) + wx.exitMiniProgram({ + success: (res)=>{ + console.log(res) + } + }) + return + } + app.globalData.openId = res.data.openid; + app.globalData.token = res.data.token; + app.globalData.userInfo = userInfo; + app.globalData.loginState = true; + that.setScanState('auth_succ'); + }, + fail: function () { + console.log("失败") + that.setScanState('auth_fail'); + } + }) + }, + setScanState(state) { + let that = this; + wx.request({ + url: app.globalData.baseUrl + '/api/login/scanState', + data: { + scene: that.data.scene, + state: state, + token : app.globalData.token + }, + dataType: "json", + method: "POST", + success: function (res) { + wx.hideLoading(); + if (res.data.code != 200) { + wx.showToast({ + title: "登录失败,请尝试重新扫码登录", + duration: 1000, + icon: 'none', + mask: true + }) + wx.exitMiniProgram({ + success: (res)=>{ + console.log(res) + } + }) + return + } + + if(state === 'auth_succ'){ + wx.showToast({ + title: "登录成功!", + duration: 1000, + icon: 'none', + mask: true + }) + // 在登录成功后跳转到 succ 页面 + wx.redirectTo({ + url: '/pages/succ/succ', + }) + } + }, + fail: function () { + console.log("失败") + wx.exitMiniProgram({ + success: (res)=>{ + console.log(res) + } + }) + } + }) + } +}) diff --git a/svr/wxapp-res/pages/login/login.json b/svr/wxapp-res/pages/login/login.json new file mode 100644 index 0000000..0c9087e --- /dev/null +++ b/svr/wxapp-res/pages/login/login.json @@ -0,0 +1,5 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "", + "disableScroll": true +} \ No newline at end of file diff --git a/svr/wxapp-res/pages/login/login.wxml b/svr/wxapp-res/pages/login/login.wxml new file mode 100644 index 0000000..44e640e --- /dev/null +++ b/svr/wxapp-res/pages/login/login.wxml @@ -0,0 +1,24 @@ + + tl-rtc-file 授权登录 + + + 演示体验地址 + | + 复制 + https://im.iamtsm.cn + + + github开源地址 + | + 复制 + https://github.com/tl-open-source/tl-rtc-file + + + gitee开源地址 + | + 复制 + https://gitee.com/iamtsm/tl-rtc-file + + + + diff --git a/svr/wxapp-res/pages/login/login.wxss b/svr/wxapp-res/pages/login/login.wxss new file mode 100644 index 0000000..f439403 --- /dev/null +++ b/svr/wxapp-res/pages/login/login.wxss @@ -0,0 +1,55 @@ +.tlrtcfilePanel { + border: 1px white solid; + height: 60vh; + margin-top: 5vh; +} + +.tlrtcfileTitle { + font-size: 23px; + font-weight: bold; + color: #383C40; + margin-top: 1vh; +} + +.tlrtcfileIntro { + color: #686767; + font-size: 12px; + position: relative; + line-height: 25px; + padding: 8vh; + text-align: left; +} + +.tlrtcfileIntroItem{ + margin-top: 3vh; +} + +.tlrtcfileIntroItem view{ + margin-top: 1vh; +} + +.tlrtcfileIntro image{ + width: 4vh; + height: 4vh; + top: 7px; + position: relative; +} + +.tlrtcfileIntro a { + margin-left: 1vh; +} + +.tlrtcfileIntro a:hover { + color: rgb(114, 114, 202); +} + +.loginBtn { + width: 70% !important; + height: 45px; + border-radius: 5px; + background-color: #0E87EB; + color: #fff; + bottom: 13vh; + position: absolute; + left: 15%; +} \ No newline at end of file diff --git a/svr/wxapp-res/pages/succ/succ.js b/svr/wxapp-res/pages/succ/succ.js new file mode 100644 index 0000000..c41b557 --- /dev/null +++ b/svr/wxapp-res/pages/succ/succ.js @@ -0,0 +1,62 @@ +// pages/index/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + }, + onShow: function(){ + wx.hideHomeButton() + } +}) \ No newline at end of file diff --git a/svr/wxapp-res/pages/succ/succ.json b/svr/wxapp-res/pages/succ/succ.json new file mode 100644 index 0000000..0c9087e --- /dev/null +++ b/svr/wxapp-res/pages/succ/succ.json @@ -0,0 +1,5 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "", + "disableScroll": true +} \ No newline at end of file diff --git a/svr/wxapp-res/pages/succ/succ.wxml b/svr/wxapp-res/pages/succ/succ.wxml new file mode 100644 index 0000000..5d99de4 --- /dev/null +++ b/svr/wxapp-res/pages/succ/succ.wxml @@ -0,0 +1,5 @@ + + + + 登录成功 + \ No newline at end of file diff --git a/svr/wxapp-res/pages/succ/succ.wxss b/svr/wxapp-res/pages/succ/succ.wxss new file mode 100644 index 0000000..ad7edbd --- /dev/null +++ b/svr/wxapp-res/pages/succ/succ.wxss @@ -0,0 +1,34 @@ +/* pages/result/result.wxss */ +page{ + text-align: center; + background-color: #ffffff; +} +.scc{ + margin-top: 100rpx; + width: 160rpx; + height: 160rpx; +} +.resuil{ + margin-top: 30rpx; + font-weight: 600; + letter-spacing: 3rpx; + font-size: 36rpx; +} +.btn{ + width: 280rpx; + letter-spacing: 3rpx; + height: 70rpx; + font-weight: 500; + line-height: 70rpx; + border: 1px solid #3bb270; + color: #3bb270; + border-radius: 10rpx; + position: absolute; + bottom: 200rpx; + left: 50%; + margin-left: -130rpx; +} + +.btn :hover, .btn:active{ + color: #189b53; +} \ No newline at end of file diff --git a/svr/wxapp-res/project.config.json b/svr/wxapp-res/project.config.json new file mode 100644 index 0000000..bb2bf46 --- /dev/null +++ b/svr/wxapp-res/project.config.json @@ -0,0 +1,28 @@ +{ + "appid": "", + "projectname": "", + "compileType": "miniprogram", + "libVersion": "3.0.2", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "coverView": true, + "es6": true, + "postcss": true, + "minified": true, + "showShadowRootInWxmlPanel": true, + "compileHotReLoad": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + } +} \ No newline at end of file diff --git a/tlrtcfile.env b/tlrtcfile.env index f47e5dc..05dac9e 100644 --- a/tlrtcfile.env +++ b/tlrtcfile.env @@ -87,3 +87,10 @@ tl_rtc_file_notify_open=false tl_rtc_file_notify_qiwei_normal= ## 企业微信通知机器人KEY,错误通知,如果有多个key,逗号分隔 tl_rtc_file_notify_qiwei_error= + + +#-----------------以下为微信小程序授权登录相关配置-----------------# +## appId +tl_rtc_file_login_appId= +## appSecret +tl_rtc_file_login_appSecret=