From b97db305eb110da024e2e5c922e31f8665d65520 Mon Sep 17 00:00:00 2001 From: luoshuyue <239937404@qq.com> Date: Fri, 25 Feb 2022 15:04:47 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=8B=89?= =?UTF-8?q?=E6=B5=81=E6=B7=BB=E5=8A=A0=E5=9B=BD=E6=A0=87=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E4=B8=8A=E7=BA=A7=E7=BA=A7=E8=81=94=E8=B0=83=E5=8F=96=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=E8=A7=86=E9=A2=91=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql.sql | 2 +- .../iot/vmp/storager/dao/GbStreamMapper.java | 22 +++++++++---------- .../storager/dao/PlatformGbStreamMapper.java | 22 +++++++++---------- .../impl/VideoManagerStoragerImpl.java | 4 ++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/sql/mysql.sql b/sql/mysql.sql index f2e358fc..b4c38a2a 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -389,7 +389,7 @@ DROP TABLE IF EXISTS `platform_gb_stream`; CREATE TABLE `platform_gb_stream` ( `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `gbStreamId` int NOT NULL, + `gbStreamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `id` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`) diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index 55b53793..593b78a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -41,15 +41,15 @@ public interface GbStreamMapper { "SELECT gs.* FROM gb_stream gs " + "WHERE " + "1=1 " + - " AND gs.gbStreamId in" + + " AND gs.gbId in" + "(select pgs.gbStreamId from platform_gb_stream pgs where pgs.platformId = #{platformId} and pgs.catalogId=#{catalogId}) " + - " AND gs.gbStreamId not in" + + " AND gs.gbId not in" + "(select pgs.gbStreamId from platform_gb_stream pgs where pgs.platformId = #{platformId}) " + " AND (gs.app LIKE '%${query}%' OR gs.stream LIKE '%${query}%' OR gs.gbId LIKE '%${query}%' OR gs.name LIKE '%${query}%') " + " AND gs.status=1" + " AND gs.status=0" + " AND gs.mediaServerId=#{mediaServerId} " + - " order by gs.gbStreamId asc " + + " order by gs.gbId asc " + "") List selectAll(String platformId, String catalogId, String query, Boolean pushing, String mediaServerId); @@ -60,18 +60,18 @@ public interface GbStreamMapper { List selectByGBId(String gbId); @Select("SELECT gs.*, pgs.platformId as platformId, pgs.catalogId as catalogId FROM gb_stream gs " + - "LEFT JOIN platform_gb_stream pgs ON gs.gbStreamId = pgs.catalogId " + + "LEFT JOIN platform_gb_stream pgs ON gs.gbId = pgs.gbStreamId " + "WHERE gs.gbId = '${gbId}' AND pgs.platformId = '${platformId}'") GbStream queryStreamInPlatform(String platformId, String gbId); @Select("SELECT gs.*, pgs.platformId as platformId, pgs.catalogId as catalogId FROM gb_stream gs " + - "LEFT JOIN platform_gb_stream pgs ON gs.gbStreamId = pgs.gbStreamId " + + "LEFT JOIN platform_gb_stream pgs ON gs.gbId = pgs.gbStreamId " + "WHERE pgs.platformId = #{platformId}") List queryGbStreamListInPlatform(String platformId); @Select("SELECT gs.* FROM gb_stream gs LEFT JOIN platform_gb_stream pgs " + - "ON gs.gbStreamId = pgs.gbStreamId WHERE pgs.gbStreamId is NULL") + "ON gs.gbId = pgs.gbStreamId WHERE pgs.gbStreamId is NULL") List queryStreamNotInPlatform(); @Update("UPDATE gb_stream " + @@ -128,10 +128,10 @@ public interface GbStreamMapper { int updateStreamGPS(List gpsMsgInfos); @Select("") + "SELECT * FROM gb_stream where " + + "" + + "(app=#{item.app} and stream=#{item.stream}) " + + "" + + "") List selectAllForAppAndStream(List streamPushItems); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java index a4950980..b411b599 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java @@ -17,7 +17,7 @@ import java.util.List; public interface PlatformGbStreamMapper { @Insert("REPLACE INTO platform_gb_stream (gbStreamId, platformId, catalogId) VALUES" + - "( #{gbStreamId}, #{platformId}, #{catalogId})") + "( #{gbId}, #{platformId}, #{catalogId})") int add(PlatformGbStream platformGbStream); @@ -26,12 +26,12 @@ public interface PlatformGbStreamMapper { "(gbStreamId, platformId, catalogId) " + "values " + " " + - "(${item.gbStreamId}, '${item.platformId}', '${item.catalogId}')" + + "(#{item.gbId}, #{item.platformId}, #{item.catalogId})" + " " + "") int batchAdd(List streamPushItems); - @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbStreamId from gb_stream where app=#{app} AND stream=#{stream})") + @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbId from gb_stream where app=#{app} AND stream=#{stream})") int delByAppAndStream(String app, String stream); @Delete("DELETE FROM platform_gb_stream WHERE platformId=#{platformId}") @@ -42,28 +42,28 @@ public interface PlatformGbStreamMapper { "FROM " + "platform_gb_stream pgs " + "LEFT JOIN parent_platform pp ON pp.serverGBId = pgs.platformId " + - "LEFT JOIN gb_stream gs ON gs.gbStreamId = pgs.gbStreamId " + + "LEFT JOIN gb_stream gs ON gs.gbId = pgs.gbStreamId " + "WHERE " + "gs.app =#{app} " + "AND gs.stream =#{stream} ") List selectByAppAndStream(String app, String stream); @Select("SELECT pgs.*, gs.gbId FROM platform_gb_stream pgs " + - "LEFT JOIN gb_stream gs ON pgs.gbStreamId = gs.gbStreamId " + + "LEFT JOIN gb_stream gs ON pgs.gbStreamId = gs.gbId " + "WHERE gs.app=#{app} AND gs.stream=#{stream} AND pgs.platformId=#{serverGBId}") StreamProxyItem selectOne(String app, String stream, String serverGBId); @Select("select gs.* \n" + "from gb_stream gs\n" + " left join platform_gb_stream pgs\n" + - " on gs.gbStreamId = pgs.gbStreamId\n" + + " on gs.gbId = pgs.gbStreamId\n" + "where pgs.platformId=#{platformId} and pgs.catalogId=#{catalogId}") List queryChannelInParentPlatformAndCatalog(String platformId, String catalogId); @Select("select gs.gbId as id, gs.name as name, pgs.platformId as platformId, pgs.catalogId as catalogId , 0 as childrenCount, 2 as type\n" + "from gb_stream gs\n" + " left join platform_gb_stream pgs\n" + - " on gs.gbStreamId = pgs.gbStreamId\n" + + " on gs.gbId = pgs.gbStreamId\n" + "where pgs.platformId=#{platformId} and pgs.catalogId=#{catalogId}") List queryChannelInParentPlatformAndCatalogForCatalog(String platformId, String catalogId); @@ -78,7 +78,7 @@ public interface PlatformGbStreamMapper { "left join platform_gb_stream pgs on " + "pp.serverGBId = pgs.platformId " + "left join gb_stream gs " + - "gs.gbStreamId = pgs.gbStreamId " + + "gs.gbId = pgs.gbStreamId " + "WHERE " + "gs.app = #{app} " + "AND gs.stream = #{stream}" + @@ -87,13 +87,13 @@ public interface PlatformGbStreamMapper { " ") List queryPlatFormListForGBWithGBId(String app, String stream, List platforms); - @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select id from gb_stream where app=#{app} AND stream=#{stream}) AND platformId=#{platformId}") + @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbId from gb_stream where app=#{app} AND stream=#{stream}) AND platformId=#{platformId}") int delByAppAndStreamAndPlatform(String app, String stream, String platformId); @Delete("") void delByGbStreams(List gbStreams); @@ -101,7 +101,7 @@ public interface PlatformGbStreamMapper { @Delete("") void delByAppAndStreamsByPlatformId(List gbStreams, String platformId); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index 1d04c82d..77164c28 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -707,7 +707,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { try { if (streamProxyMapper.add(streamProxyItem) > 0) { if (!StringUtils.isEmpty(streamProxyItem.getGbId())) { - if (gbStreamMapper.add(streamProxyItem) > 0) { + if (gbStreamMapper.add(streamProxyItem) < 0) { //事务回滚 dataSourceTransactionManager.rollback(transactionStatus); return false; @@ -742,7 +742,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { try { if (streamProxyMapper.update(streamProxyItem) > 0) { if (!StringUtils.isEmpty(streamProxyItem.getGbId())) { - if (gbStreamMapper.update(streamProxyItem) > 0) { + if (gbStreamMapper.update(streamProxyItem) < 0) { //事务回滚 dataSourceTransactionManager.rollback(transactionStatus); return false; From ce56d9c0bf35cdea6d3fdbf0f5fee9ddb6280e75 Mon Sep 17 00:00:00 2001 From: luoshuyue <239937404@qq.com> Date: Fri, 25 Feb 2022 15:05:36 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96code?= =?UTF-8?q?=E4=B8=BAnull=E6=97=B6=E7=9A=84=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java index afac6eba..1850cdfd 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java @@ -248,7 +248,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { StreamProxyItem streamProxyDto = videoManagerStorager.queryStreamProxy(app, stream); if (streamProxyDto != null && streamProxyDto.isEnable()) { JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyDto); - if (jsonObject.getInteger("code") == 0) { + if (null==jsonObject.getInteger("code") || jsonObject.getInteger("code") == 0) { streamProxyDto.setEnable(false); result = videoManagerStorager.updateStreamProxy(streamProxyDto); } From 0cc0a21206de86b6892331d97d891c628924f49b Mon Sep 17 00:00:00 2001 From: luoshuyue <239937404@qq.com> Date: Fri, 25 Feb 2022 15:06:51 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E4=BA=BA?= =?UTF-8?q?=E8=A7=82=E7=9C=8B=E6=97=B6=E5=85=B3=E9=97=ADzlm=E6=8B=89?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/media/zlm/ZLMHttpHookListener.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 4f458135..3789207e 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -83,6 +83,9 @@ public class ZLMHttpHookListener { @Autowired private MediaConfig mediaConfig; + @Autowired + private ZLMRESTfulUtils zlmresTfulUtils; + /** * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 * @@ -465,6 +468,18 @@ public class ZLMHttpHookListener { streamProxyService.del(app, streamId); String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url(); logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", app, streamId, url); + + }else if (streamProxyItem != null && streamProxyItem.isEnable()) { + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); + if(null!=mediaServerItem){ + JSONObject jsonObject = zlmresTfulUtils.closeStreams(mediaServerItem,streamProxyItem.getApp(), streamProxyItem.getStream()); + if (jsonObject.getInteger("code") == 0) { + streamProxyItem.setEnable(false); + storager.updateStreamProxy(streamProxyItem); + } + }else { + ret.put("close", false); + } }else { ret.put("close", false); } From f97ce3e93640f14bcdd437dd893b7861097bfd8f Mon Sep 17 00:00:00 2001 From: wangyimeng <239937404@qq.com> Date: Sat, 26 Feb 2022 11:07:55 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8B=89=E6=B5=81?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/storager/dao/StreamProxyMapper.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java index 63cd425d..3f5c72bf 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java @@ -10,9 +10,9 @@ import java.util.List; @Repository public interface StreamProxyMapper { - @Insert("INSERT INTO stream_proxy (type, app, stream,mediaServerId, url, src_url, dst_url, " + + @Insert("INSERT INTO stream_proxy (type, app, name, stream,mediaServerId, url, src_url, dst_url, " + "timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, createTime) VALUES" + - "('${type}','${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + + "('${type}','${app}','${name}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + "'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, ${status}, " + "${enable_remove_none_reader}, '${createTime}' )") int add(StreamProxyItem streamProxyDto); @@ -20,6 +20,7 @@ public interface StreamProxyMapper { @Update("UPDATE stream_proxy " + "SET type=#{type}, " + "app=#{app}," + + "name=#{name}," + "stream=#{stream}," + "url=#{url}, " + "mediaServerId=#{mediaServerId}, " + From 560165b6679f96f04cd3f8f6d5709b1214afddfb Mon Sep 17 00:00:00 2001 From: wangyimeng <421132955@qq.com> Date: Sat, 26 Feb 2022 11:14:56 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8B=89=E6=B5=81?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../streamProxy/StreamProxyController.java | 23 ++++- .../src/components/dialog/StreamProxyEdit.vue | 88 +++++++++++-------- 2 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java index 1226eb7e..5f02b2aa 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java @@ -75,7 +75,28 @@ public class StreamProxyController { WVPResult result = streamProxyService.save(param); return result; } - + @ApiOperation("修改代理") + @ApiImplicitParams({ + @ApiImplicitParam(name = "param", value = "代理参数", dataTypeClass = StreamProxyItem.class), + }) + @PostMapping(value = "/update") + @ResponseBody + public WVPResult update(@RequestBody StreamProxyItem param){ + logger.info("修改代理: " + JSONObject.toJSONString(param)); + WVPResult result = new WVPResult<>(); + if(StringUtils.isEmpty(param.getApp())||StringUtils.isEmpty(param.getStream())){ + result.setCode(400); + result.setMsg("app不能为null且stream不能为null,请检查具体参数!"); + return result; + } + streamProxyService.del(param.getApp(), param.getStream()); + if (StringUtils.isEmpty(param.getMediaServerId())) param.setMediaServerId("auto"); + if (StringUtils.isEmpty(param.getType())) param.setType("default"); + if (StringUtils.isEmpty(param.getGbId())) param.setGbId(null); + param.setEnable(false); + result = streamProxyService.save(param); + return result; + } @ApiOperation("获取ffmpeg.cmd模板") @GetMapping(value = "/ffmpeg_cmd/list") @ApiImplicitParams({ diff --git a/web_src/src/components/dialog/StreamProxyEdit.vue b/web_src/src/components/dialog/StreamProxyEdit.vue index 8d3fe268..d5a95299 100644 --- a/web_src/src/components/dialog/StreamProxyEdit.vue +++ b/web_src/src/components/dialog/StreamProxyEdit.vue @@ -131,22 +131,6 @@ export default { computed: {}, created() {}, data() { - // var deviceGBIdRules = async (rule, value, callback) => { - // console.log(value); - // if (value === "") { - // callback(new Error("请输入设备国标编号")); - // } else { - // var exit = await this.deviceGBIdExit(value); - // console.log(exit); - // console.log(exit == "true"); - // console.log(exit === "true"); - // if (exit) { - // callback(new Error("设备国标编号已存在")); - // } else { - // callback(); - // } - // } - // }; return { listChangeCallback: null, showDialog: false, @@ -185,6 +169,7 @@ export default { timeout_ms: [{ required: true, message: "请输入FFmpeg推流成功超时时间", trigger: "blur" }], ffmpeg_cmd_key: [{ required: false, message: "请输入FFmpeg命令参数模板(可选)", trigger: "blur" }], }, + isUpdate: false, }; }, methods: { @@ -192,13 +177,14 @@ export default { this.showDialog = true; this.listChangeCallback = callback; if (proxyParam != null) { + this.isUpdate=true this.proxyParam = proxyParam; } let that = this; this.$axios({ method: 'get', - url:`/api/platform/query/10000/0` + url:`/api/platform/query/100/1` }).then(function (res) { that.platformList = res.data.list; }).catch(function (error) { @@ -229,28 +215,54 @@ export default { onSubmit: function () { this.dialogLoading = true; var that = this; - that.$axios({ - method: 'post', - url:`/api/proxy/save`, - data: that.proxyParam - }).then(function (res) { - that.dialogLoading = false; - if (typeof (res.data.code) != "undefined" && res.data.code === 0) { - that.$message({ - showClose: true, - message: res.data.msg, - type: "success", - }); - that.showDialog = false; - if (that.listChangeCallback != null) { - that.listChangeCallback(); - that.dialogLoading = false; + if(this.isUpdate){ + that.$axios({ + method: 'post', + url:`/api/proxy/update`, + data: that.proxyParam + }).then(function (res) { + that.dialogLoading = false; + if (typeof (res.data.code) != "undefined" && res.data.code === 0) { + that.$message({ + showClose: true, + message: res.data.msg, + type: "success", + }); + that.showDialog = false; + if (that.listChangeCallback != null) { + that.listChangeCallback(); + that.dialogLoading = false; + } } - } - }).catch(function (error) { - console.log(error); - this.dialogLoading = false; - }); + }).catch(function (error) { + console.log(error); + this.dialogLoading = false; + }); + }else{ + that.$axios({ + method: 'post', + url:`/api/proxy/save`, + data: that.proxyParam + }).then(function (res) { + that.dialogLoading = false; + if (typeof (res.data.code) != "undefined" && res.data.code === 0) { + that.$message({ + showClose: true, + message: res.data.msg, + type: "success", + }); + that.showDialog = false; + if (that.listChangeCallback != null) { + that.listChangeCallback(); + that.dialogLoading = false; + } + } + }).catch(function (error) { + console.log(error); + this.dialogLoading = false; + }); + } + }, close: function () { this.showDialog = false; From c3c44dbd53036b9971d847443ff1704a70afb5a3 Mon Sep 17 00:00:00 2001 From: wangyimeng <421132955@qq.com> Date: Sat, 26 Feb 2022 11:16:01 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8B=89=E6=B5=81?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=A1=A8name=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/mysql.sql b/sql/mysql.sql index b4c38a2a..3734db27 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -416,6 +416,7 @@ CREATE TABLE `stream_proxy` ( `id` int NOT NULL AUTO_INCREMENT, `type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, `src_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, From 69d9692f6194d1e03ec81cf87ea8f0e7a62f7173 Mon Sep 17 00:00:00 2001 From: wangyimeng <421132955@qq.com> Date: Wed, 16 Mar 2022 15:27:12 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/mysql.sql b/sql/mysql.sql index a47fbef7..abebd0d8 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -431,7 +431,6 @@ CREATE TABLE `stream_proxy` ( `status` bit(1) NOT NULL, `enable_remove_none_reader` bit(1) NOT NULL, `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `stream_proxy_pk` (`app`,`stream`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; From c8831bc58fd967a4215cbe3ea8c89d753b4d31f7 Mon Sep 17 00:00:00 2001 From: wangyimeng <421132955@qq.com> Date: Fri, 6 May 2022 11:56:29 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=90=8C=E6=AD=A5wvp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOCKERFILE | 2 +- README.md | 21 +- pom.xml | 6 +- sql/clean.sql | 13 + sql/mysql.sql | 423 +- sql/update.sql | 12 + .../iot/vmp/common/ApiSaveConstant.java | 8 +- .../genersoft/iot/vmp/common/StreamInfo.java | 28 + .../iot/vmp/common/VideoManagerConstants.java | 25 +- .../iot/vmp/conf/ApiAccessFilter.java | 4 +- .../genersoft/iot/vmp/conf/DynamicTask.java | 77 +- .../genersoft/iot/vmp/conf/RedisConfig.java | 7 +- ...edisKeyExpirationEventMessageListener.java | 9 +- .../com/genersoft/iot/vmp/conf/SipConfig.java | 2 +- .../iot/vmp/conf/SipPlatformRunner.java | 5 +- .../iot/vmp/conf/ThreadPoolTaskConfig.java | 8 + .../conf/{UserSetup.java => UserSetting.java} | 23 +- .../iot/vmp/conf/runner/SipDeviceRunner.java | 21 +- .../vmp/conf/security/WebSecurityConfig.java | 8 +- .../genersoft/iot/vmp/gb28181/SipLayer.java | 12 +- .../DigestServerAuthenticationHelper.java | 8 +- .../gb28181/auth/RegisterLogicHandler.java | 4 +- .../vmp/gb28181/bean/AlarmChannelMessage.java | 46 + .../iot/vmp/gb28181/bean/CatalogData.java | 32 + .../iot/vmp/gb28181/bean/Device.java | 55 +- .../iot/vmp/gb28181/bean/DeviceAlarm.java | 25 +- .../iot/vmp/gb28181/bean/DeviceChannel.java | 15 +- .../gb28181/bean/DeviceChannelInPlatform.java | 23 + .../iot/vmp/gb28181/bean/GbStream.java | 1 + .../vmp/gb28181/bean/InviteStreamType.java | 8 + .../iot/vmp/gb28181/bean/ParentPlatform.java | 51 +- .../iot/vmp/gb28181/bean/SendRtpItem.java | 12 +- .../iot/vmp/gb28181/bean/SsrcTransaction.java | 11 + .../iot/vmp/gb28181/bean/SubscribeHolder.java | 54 + .../iot/vmp/gb28181/bean/SubscribeInfo.java | 27 + .../iot/vmp/gb28181/bean/SyncStatus.java | 34 + .../gb28181/event/DeviceOffLineDetector.java | 28 - .../KeepaliveTimeoutListenerForPlatform.java | 42 +- .../offline/KeepliveTimeoutListener.java | 15 +- .../event/offline/OfflineEventListener.java | 19 +- .../event/online/OnlineEventListener.java | 30 +- .../PlatformKeepaliveExpireEventLister.java | 5 +- .../PlatformCycleRegisterEventLister.java | 23 +- .../PlatformNotRegisterEventLister.java | 40 +- .../event/record/RecordEndEventListener.java | 6 +- .../SubscribeListenerForPlatform.java | 50 - .../subscribe/catalog/CatalogEventLister.java | 51 +- .../vmp/gb28181/session/CatalogDataCatch.java | 124 +- .../iot/vmp/gb28181/session/SsrcConfig.java | 3 + .../session/VideoStreamSessionManager.java | 91 +- .../vmp/gb28181/task/GPSSubscribeTask.java | 71 - .../iot/vmp/gb28181/task/ISubscribeTask.java | 12 + .../task/impl/CatalogSubscribeTask.java | 102 + .../MobilePositionSubscribeHandlerTask.java | 95 + .../impl/MobilePositionSubscribeTask.java | 99 + .../transmit/SIPProcessorObserver.java | 5 +- .../callback/CheckForAllRecordsThread.java | 1 + .../callback/DeferredResultHolder.java | 10 +- .../gb28181/transmit/cmd/ISIPCommander.java | 36 +- .../cmd/ISIPCommanderForPlatform.java | 14 +- .../cmd/SIPRequestHeaderPlarformProvider.java | 56 +- .../cmd/SIPRequestHeaderProvider.java | 14 +- .../transmit/cmd/impl/SIPCommander.java | 328 +- .../cmd/impl/SIPCommanderFroPlatform.java | 331 +- .../request/SIPRequestProcessorParent.java | 12 +- .../request/impl/AckRequestProcessor.java | 4 +- .../request/impl/ByeRequestProcessor.java | 25 +- .../request/impl/InviteRequestProcessor.java | 223 +- .../request/impl/NotifyRequestProcessor.java | 82 +- .../impl/RegisterRequestProcessor.java | 292 +- .../impl/SubscribeRequestProcessor.java | 102 +- .../impl/message/MessageRequestProcessor.java | 27 +- .../cmd/DeviceControlQueryMessageHandler.java | 48 +- .../notify/cmd/AlarmNotifyMessageHandler.java | 125 +- .../cmd/CatalogNotifyMessageHandler.java | 83 +- .../cmd/KeepaliveNotifyMessageHandler.java | 10 +- .../cmd/MediaStatusNotifyMessageHandler.java | 7 +- .../MobilePositionNotifyMessageHandler.java | 23 +- .../query/cmd/AlarmQueryMessageHandler.java | 10 +- .../query/cmd/CatalogQueryMessageHandler.java | 82 +- .../cmd/DeviceStatusQueryMessageHandler.java | 4 +- .../cmd/RecordInfoQueryMessageHandler.java | 6 +- .../cmd/CatalogResponseMessageHandler.java | 165 +- .../cmd/DeviceInfoResponseMessageHandler.java | 14 +- .../DeviceStatusResponseMessageHandler.java | 11 +- .../MobilePositionResponseMessageHandler.java | 23 +- .../impl/InviteResponseProcessor.java | 2 +- .../impl/RegisterResponseProcessor.java | 14 +- .../iot/vmp/gb28181/utils/Coordtransform.java | 126 + .../iot/vmp/gb28181/utils/SipUtils.java | 12 + .../iot/vmp/gb28181/utils/XmlUtil.java | 79 +- .../iot/vmp/media/zlm/AssistRESTfulUtils.java | 139 + .../vmp/media/zlm/ZLMHttpHookListener.java | 55 +- .../vmp/media/zlm/ZLMHttpHookSubscribe.java | 23 +- .../vmp/media/zlm/ZLMMediaListManager.java | 71 +- .../iot/vmp/media/zlm/ZLMRESTfulUtils.java | 5 + .../vmp/media/zlm/ZLMRTPServerFactory.java | 20 +- .../iot/vmp/media/zlm/ZLMRunner.java | 40 +- .../vmp/media/zlm/dto/ChannelOnlineEvent.java | 6 + .../vmp/media/zlm/dto/StreamProxyItem.java | 4 + .../iot/vmp/media/zlm/dto/StreamPushItem.java | 4 + .../zlm/event/ZLMKeepliveTimeoutListener.java | 11 +- .../iot/vmp/service/IDeviceService.java | 34 + .../iot/vmp/service/IGbStreamService.java | 3 +- .../iot/vmp/service/IMediaServerService.java | 4 +- .../iot/vmp/service/IPlayService.java | 6 + .../vmp/service/StreamGPSSubscribeTask.java | 4 +- .../service/bean/CatalogSubscribeTask.java | 40 - .../service/bean/MessageForPushChannel.java | 112 + .../vmp/service/impl/DeviceServiceImpl.java | 82 +- .../vmp/service/impl/GbStreamServiceImpl.java | 19 +- .../service/impl/MediaServerServiceImpl.java | 77 +- .../vmp/service/impl/MediaServiceImpl.java | 9 +- .../iot/vmp/service/impl/PlayServiceImpl.java | 282 +- .../service/impl/RedisAlarmMsgListener.java | 69 + .../vmp/service/impl/RedisGPSMsgListener.java | 2 +- .../service/impl/StreamProxyServiceImpl.java | 74 +- .../service/impl/StreamPushServiceImpl.java | 23 +- .../iot/vmp/service/impl/UserServiceImpl.java | 4 +- .../iot/vmp/storager/IRedisCatchStorage.java | 20 + ...torager.java => IVideoManagerStorage.java} | 955 +- .../vmp/storager/dao/DeviceChannelMapper.java | 35 +- .../iot/vmp/storager/dao/DeviceMapper.java | 12 + .../dao/DeviceMobilePositionMapper.java | 4 +- .../iot/vmp/storager/dao/GbStreamMapper.java | 35 +- .../storager/dao/ParentPlatformMapper.java | 7 +- .../storager/dao/PlatformGbStreamMapper.java | 22 +- .../vmp/storager/dao/StreamProxyMapper.java | 9 +- .../storager/impl/RedisCatchStorageImpl.java | 299 +- ...Impl.java => VideoManagerStorageImpl.java} | 98 +- .../iot/vmp/utils/Coordtransform.java | 126 + .../com/genersoft/iot/vmp/utils/GpsUtil.java | 91 +- .../iot/vmp/utils/SpringBeanFactory.java | 4 +- .../iot/vmp/utils/node/BaseNode.java | 82 - .../iot/vmp/utils/node/ForestNode.java | 31 - .../iot/vmp/utils/node/ForestNodeManager.java | 68 - .../iot/vmp/utils/node/ForestNodeMerger.java | 51 - .../genersoft/iot/vmp/utils/node/INode.java | 42 - .../iot/vmp/utils/node/TreeNode.java | 42 - .../vmp/vmanager/bean/DeviceChannelTree.java | 121 - .../vmanager/bean/DeviceChannelTreeNode.java | 56 - .../MobilePositionController.java | 34 +- .../gb28181/alarm/AlarmController.java | 102 +- .../vmanager/gb28181/device/DeviceConfig.java | 6 +- .../gb28181/device/DeviceControl.java | 6 +- .../vmanager/gb28181/device/DeviceQuery.java | 165 +- .../gb28181/gbStream/GbStreamController.java | 4 +- .../gb28181/media/MediaController.java | 8 +- .../gb28181/platform/PlatformController.java | 20 +- .../vmanager/gb28181/play/PlayController.java | 6 +- .../gb28181/playback/DownloadController.java | 150 - .../gb28181/playback/PlaybackController.java | 9 +- .../vmanager/gb28181/ptz/PtzController.java | 6 +- .../gb28181/record/GBRecordController.java | 124 +- .../iot/vmp/vmanager/log/LogController.java | 27 +- .../vmp/vmanager/server/ServerController.java | 48 +- .../streamProxy/StreamProxyController.java | 35 +- .../vmp/web/gb28181/ApiControlController.java | 4 +- .../vmp/web/gb28181/ApiDeviceController.java | 4 +- .../vmp/web/gb28181/ApiStreamController.java | 11 +- src/main/resources/all-application.yml | 2 + src/main/resources/application.yml | 2 +- src/main/resources/logback-spring-local.xml | 12 +- web_src/build/webpack.dev.conf.js | 1 + web_src/config/index.js | 4 +- web_src/index.html | 22 +- web_src/package-lock.json | 14542 +--------------- web_src/package.json | 3 +- web_src/src/App.vue | 20 + web_src/src/api/deviceApi.js | 19 - web_src/src/components/CloudRecord.vue | 108 +- web_src/src/components/CloudRecordDetail.vue | 2 +- web_src/src/components/DeviceList.vue | 633 +- web_src/src/components/MediaServerManger.vue | 65 +- web_src/src/components/ParentPlatformList.vue | 148 +- web_src/src/components/PushVideoList.vue | 606 +- web_src/src/components/StreamProxyList.vue | 209 +- web_src/src/components/UiHeader.vue | 141 - web_src/src/components/channelList.vue | 736 +- web_src/src/components/channelTree.vue | 70 - web_src/src/components/channelTreeItem.vue | 74 - web_src/src/components/common/DeviceTree.vue | 160 + .../src/components/common/MapComponent.vue | 257 + web_src/src/components/common/jessibuca.vue | 316 + web_src/src/components/control.vue | 1196 +- web_src/src/components/devicePosition.vue | 701 +- .../src/components/dialog/StreamProxyEdit.vue | 86 +- .../components/dialog/SyncChannelProgress.vue | 115 + web_src/src/components/dialog/catalogEdit.vue | 23 +- .../components/dialog/channelMapInfobox.vue | 65 + web_src/src/components/dialog/deviceEdit.vue | 16 +- .../src/components/dialog/devicePlayer.vue | 59 +- web_src/src/components/dialog/jessibuca.vue | 298 - .../src/components/dialog/platformEdit.vue | 30 + web_src/src/components/dialog/queryTrace.vue | 100 + .../src/components/dialog/recordDownload.vue | 195 + web_src/src/components/jessibuca.vue | 317 - web_src/src/components/live.vue | 599 +- .../src/components/service/DeviceService.js | 124 + web_src/src/components/service/MediaServer.js | 4 +- web_src/src/components/setting/Media.vue | 149 +- web_src/src/components/setting/Sip.vue | 81 +- web_src/src/components/setting/Web.vue | 17 +- web_src/src/components/test.vue | 198 - web_src/src/components/test2.vue | 190 - web_src/src/layout/UiHeader.vue | 151 + web_src/src/layout/index.vue | 66 + web_src/src/router/index.js | 136 +- web_src/static/css/iconfont.css | 48 +- web_src/static/css/iconfont.woff2 | Bin 52504 -> 54140 bytes web_src/static/images/arrow.png | Bin 0 -> 5053 bytes web_src/static/images/gis/camera-offline.png | Bin 0 -> 8891 bytes web_src/static/images/gis/camera.png | Bin 0 -> 10315 bytes web_src/static/images/gis/camera1-offline.png | Bin 0 -> 10463 bytes web_src/static/images/gis/camera1.png | Bin 0 -> 13055 bytes web_src/static/images/gis/camera2-offline.png | Bin 0 -> 10061 bytes web_src/static/images/gis/camera2.png | Bin 0 -> 12553 bytes web_src/static/images/gis/camera3-offline.png | Bin 0 -> 10460 bytes web_src/static/images/gis/camera3.png | Bin 0 -> 13009 bytes web_src/static/js/jessibuca/decoder.js | 1 + web_src/static/js/jessibuca/decoder.wasm | Bin 0 -> 1226828 bytes web_src/static/js/jessibuca/ff.js | 1 - web_src/static/js/jessibuca/ff.wasm | Bin 1216411 -> 0 bytes web_src/static/js/jessibuca/ff.worker.js | 1 - web_src/static/js/jessibuca/index.js | 3 - web_src/static/js/jessibuca/jessibuca.js | 1 + web_src/static/js/jessibuca/logo.png | Bin 10620 -> 0 bytes 227 files changed, 10116 insertions(+), 21640 deletions(-) create mode 100644 sql/clean.sql create mode 100644 sql/update.sql rename src/main/java/com/genersoft/iot/vmp/conf/{UserSetup.java => UserSetting.java} (86%) create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ChannelOnlineEvent.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java create mode 100644 src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannel.java create mode 100644 src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java rename src/main/java/com/genersoft/iot/vmp/storager/{IVideoManagerStorager.java => IVideoManagerStorage.java} (90%) rename src/main/java/com/genersoft/iot/vmp/storager/impl/{VideoManagerStoragerImpl.java => VideoManagerStorageImpl.java} (93%) create mode 100644 src/main/java/com/genersoft/iot/vmp/utils/Coordtransform.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/INode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java delete mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java delete mode 100644 web_src/src/api/deviceApi.js delete mode 100644 web_src/src/components/UiHeader.vue delete mode 100644 web_src/src/components/channelTree.vue delete mode 100644 web_src/src/components/channelTreeItem.vue create mode 100644 web_src/src/components/common/DeviceTree.vue create mode 100644 web_src/src/components/common/MapComponent.vue create mode 100644 web_src/src/components/common/jessibuca.vue create mode 100644 web_src/src/components/dialog/SyncChannelProgress.vue create mode 100644 web_src/src/components/dialog/channelMapInfobox.vue delete mode 100644 web_src/src/components/dialog/jessibuca.vue create mode 100644 web_src/src/components/dialog/queryTrace.vue create mode 100644 web_src/src/components/dialog/recordDownload.vue delete mode 100644 web_src/src/components/jessibuca.vue create mode 100644 web_src/src/components/service/DeviceService.js delete mode 100644 web_src/src/components/test.vue delete mode 100644 web_src/src/components/test2.vue create mode 100644 web_src/src/layout/UiHeader.vue create mode 100644 web_src/src/layout/index.vue create mode 100644 web_src/static/images/arrow.png create mode 100644 web_src/static/images/gis/camera-offline.png create mode 100644 web_src/static/images/gis/camera.png create mode 100644 web_src/static/images/gis/camera1-offline.png create mode 100644 web_src/static/images/gis/camera1.png create mode 100644 web_src/static/images/gis/camera2-offline.png create mode 100644 web_src/static/images/gis/camera2.png create mode 100644 web_src/static/images/gis/camera3-offline.png create mode 100644 web_src/static/images/gis/camera3.png create mode 100644 web_src/static/js/jessibuca/decoder.js create mode 100644 web_src/static/js/jessibuca/decoder.wasm delete mode 100644 web_src/static/js/jessibuca/ff.js delete mode 100755 web_src/static/js/jessibuca/ff.wasm delete mode 100644 web_src/static/js/jessibuca/ff.worker.js delete mode 100644 web_src/static/js/jessibuca/index.js create mode 100644 web_src/static/js/jessibuca/jessibuca.js delete mode 100644 web_src/static/js/jessibuca/logo.png diff --git a/DOCKERFILE b/DOCKERFILE index 6c4beb55..d55e06a7 100644 --- a/DOCKERFILE +++ b/DOCKERFILE @@ -84,7 +84,7 @@ RUN echo '#!/bin/bash' > run.sh && \ echo 'nohup java -jar *.jar --userSettings.record=/opt/media/www/record/ &' >> run.sh && \ echo 'nohup /opt/media/MediaServer -d -m 3 &' >> run.sh && \ echo 'cd /opt/wvp' >> run.sh && \ - echo 'if [${WVP_CONFIG}]; then' >> run.sh && \ + echo 'if [-n "${WVP_CONFIG}"]; then' >> run.sh && \ echo ' java -jar *.jar --spring.config.location=/opt/wvp/config/application.yml --media.record-assist-port=18081 ${WVP_CONFIG}' >> run.sh && \ echo 'else' >> run.sh && \ echo ' java -jar *.jar --spring.config.location=/opt/wvp/config/application.yml --media.record-assist-port=18081 --media.ip=127.0.0.1 --media.sdp-ip=${WVP_IP} --sip.ip=${WVP_IP} --media.stream-ip=${WVP_IP}' >> run.sh && \ diff --git a/README.md b/README.md index 564b1973..ee030127 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![logo](https://gitee.com/pan648540858/wvp-GB28181-pro/raw/wvp-28181-2.0/web_src/static/logo.png) +![logo](https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/wvp-28181-2.0/web_src/static/logo.png) # 开箱即用的的28181协议视频平台 [![Build Status](https://travis-ci.org/xia-chu/ZLMediaKit.svg?branch=master)](https://travis-ci.org/xia-chu/ZLMediaKit) @@ -10,9 +10,9 @@ WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将不带国标功能的摄像机/直播流/直播推流转发到其他国标平台。 -流媒体服务基于ZLMediaKit-https://github.com/xiongziliang/ZLMediaKit - -前端页面基于MediaServerUI进行修改. +流媒体服务基于@夏楚 ZLMediaKit [https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit) +播放器使用@dexter jessibuca [https://github.com/langhuihui/jessibuca/tree/v3](https://github.com/langhuihui/jessibuca/tree/v3) +前端页面基于@Kyle MediaServerUI [https://gitee.com/kkkkk5G/MediaServerUI](https://gitee.com/kkkkk5G/MediaServerUI) 进行修改. # 应用场景: 支持浏览器无插件播放摄像头视频。 @@ -128,7 +128,18 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git QQ群: 901799015, ZLM使用文档[https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit) QQ私信一般不回, 精力有限.欢迎大家在群里讨论.觉得项目对你有帮助,欢迎star和提交pr。 +# 授权协议 +本项目自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。 在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议 # 致谢 -感谢作者[夏楚](https://github.com/xia-chu) 提供这么棒的开源流媒体服务框架 +感谢作者[夏楚](https://github.com/xia-chu) 提供这么棒的开源流媒体服务框架,并在开发过程中给予支持与帮助。 +感谢作者[dexter langhuihui](https://github.com/langhuihui) 开源这么好用的WEB播放器。 +感谢作者[Kyle](https://gitee.com/kkkkk5G) 开源了好用的前端页面 +感谢各位大佬的赞助以及对项目的指正与帮助。包括但不限于代码贡献、问题反馈、资金捐赠等各种方式的支持!以下排名不分先后: +[lawrencehj](https://github.com/lawrencehj) [Smallwhitepig](https://github.com/Smallwhitepig) [swwhaha](https://github.com/swwheihei) +[hotcoffie](https://github.com/hotcoffie) [xiaomu](https://github.com/nikmu) [TristingChen](https://github.com/TristingChen) +[chenparty](https://github.com/chenparty) [Hotleave](https://github.com/hotleave) [ydwxb](https://github.com/ydwxb) +[ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb) [Albertzhu666](https://github.com/Albertzhu666) + +ps: 刚增加了这个名单,肯定遗漏了一些大佬,欢迎大佬联系我添加。 diff --git a/pom.xml b/pom.xml index 7ad53db9..b41cc080 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.genersoft wvp-pro - 2.0.2 + 2.2.1 web video platform 国标28181视频平台 @@ -269,13 +269,13 @@ - + org.apache.maven.plugins diff --git a/sql/clean.sql b/sql/clean.sql new file mode 100644 index 00000000..b8343912 --- /dev/null +++ b/sql/clean.sql @@ -0,0 +1,13 @@ +delete from device; +delete from device_alarm; +delete from device_channel; +delete from device_mobile_position; +delete from gb_stream; +delete from log; +delete from media_server; +delete from parent_platform; +delete from platform_catalog; +delete from platform_gb_channel; +delete from platform_gb_stream; +delete from stream_proxy; +delete from stream_push; \ No newline at end of file diff --git a/sql/mysql.sql b/sql/mysql.sql index abebd0d8..cffaa690 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -1,13 +1,13 @@ --- MySQL dump 10.13 Distrib 8.0.28, for Linux (x86_64) +-- MariaDB dump 10.19 Distrib 10.7.3-MariaDB, for Linux (x86_64) -- --- Host: 127.0.0.1 Database: wvp +-- Host: 127.0.0.1 Database: wvp3 -- ------------------------------------------------------ --- Server version 8.0.28-0ubuntu0.20.04.3 +-- Server version 8.0.0-dmr /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; +/*!40101 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -21,30 +21,34 @@ DROP TABLE IF EXISTS `device`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `device` ( - `id` int NOT NULL AUTO_INCREMENT, - `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `manufacturer` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `model` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `firmware` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `transport` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `streamMode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `online` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `registerTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `keepaliveTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `ip` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `port` int NOT NULL, - `expires` int NOT NULL, - `subscribeCycleForCatalog` int NOT NULL, - `hostAddress` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `charset` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `deviceId` varchar(50) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `manufacturer` varchar(255) DEFAULT NULL, + `model` varchar(255) DEFAULT NULL, + `firmware` varchar(255) DEFAULT NULL, + `transport` varchar(50) DEFAULT NULL, + `streamMode` varchar(50) DEFAULT NULL, + `online` varchar(50) DEFAULT NULL, + `registerTime` varchar(50) DEFAULT NULL, + `keepaliveTime` varchar(50) DEFAULT NULL, + `ip` varchar(50) NOT NULL, + `createTime` varchar(50) NOT NULL, + `updateTime` varchar(50) NOT NULL, + `port` int(11) NOT NULL, + `expires` int(11) NOT NULL, + `subscribeCycleForCatalog` int(11) NOT NULL, + `subscribeCycleForMobilePosition` int(11) NOT NULL, + `mobilePositionSubmissionInterval` int(11) NOT NULL DEFAULT '5', + `subscribeCycleForAlarm` int(11) NOT NULL, + `hostAddress` varchar(50) NOT NULL, + `charset` varchar(50) NOT NULL, + `ssrcCheck` int(11) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `device_deviceId_uindex` (`deviceId`) -) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -62,20 +66,20 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `device_alarm`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `device_alarm` ( - `id` int NOT NULL AUTO_INCREMENT, - `deviceId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `channelId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `alarmPriority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `alarmMethod` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `alarmTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `alarmDescription` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `deviceId` varchar(50) NOT NULL, + `channelId` varchar(50) NOT NULL, + `alarmPriority` varchar(50) NOT NULL, + `alarmMethod` varchar(50) DEFAULT NULL, + `alarmTime` varchar(50) NOT NULL, + `alarmDescription` varchar(255) DEFAULT NULL, `longitude` double DEFAULT NULL, `latitude` double DEFAULT NULL, - `alarmType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `alarmType` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -93,43 +97,43 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `device_channel`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `device_channel` ( - `id` int NOT NULL AUTO_INCREMENT, - `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `manufacture` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `model` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `owner` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `civilCode` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `block` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `address` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `parentId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `safetyWay` int DEFAULT NULL, - `registerWay` int DEFAULT NULL, - `certNum` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `certifiable` int DEFAULT NULL, - `errCode` int DEFAULT NULL, - `endTime` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `secrecy` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `ipAddress` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `port` int DEFAULT NULL, - `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `PTZType` int DEFAULT NULL, - `status` int DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `channelId` varchar(50) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `manufacture` varchar(50) DEFAULT NULL, + `model` varchar(50) DEFAULT NULL, + `owner` varchar(50) DEFAULT NULL, + `civilCode` varchar(50) DEFAULT NULL, + `block` varchar(50) DEFAULT NULL, + `address` varchar(50) DEFAULT NULL, + `parentId` varchar(50) DEFAULT NULL, + `safetyWay` int(11) DEFAULT NULL, + `registerWay` int(11) DEFAULT NULL, + `certNum` varchar(50) DEFAULT NULL, + `certifiable` int(11) DEFAULT NULL, + `errCode` int(11) DEFAULT NULL, + `endTime` varchar(50) DEFAULT NULL, + `secrecy` varchar(50) DEFAULT NULL, + `ipAddress` varchar(50) DEFAULT NULL, + `port` int(11) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `PTZType` int(11) DEFAULT NULL, + `status` int(11) DEFAULT NULL, `longitude` double DEFAULT NULL, `latitude` double DEFAULT NULL, - `streamId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `parental` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `streamId` varchar(50) DEFAULT NULL, + `deviceId` varchar(50) NOT NULL, + `parental` varchar(50) DEFAULT NULL, `hasAudio` bit(1) DEFAULT NULL, - `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `subCount` int DEFAULT '0', + `createTime` varchar(50) NOT NULL, + `updateTime` varchar(50) NOT NULL, + `subCount` int(11) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `device_channel_id_uindex` (`id`), UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=81657 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -147,24 +151,24 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `device_mobile_position`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `device_mobile_position` ( - `id` int NOT NULL AUTO_INCREMENT, - `deviceId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `channelId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `deviceName` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `time` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `deviceId` varchar(50) NOT NULL, + `channelId` varchar(50) NOT NULL, + `deviceName` varchar(255) DEFAULT NULL, + `time` varchar(50) NOT NULL, `longitude` double NOT NULL, `latitude` double NOT NULL, `altitude` double DEFAULT NULL, `speed` double DEFAULT NULL, `direction` double DEFAULT NULL, - `reportSource` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `geodeticSystem` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `cnLng` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `cnLat` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `reportSource` varchar(50) DEFAULT NULL, + `geodeticSystem` varchar(50) DEFAULT NULL, + `cnLng` varchar(50) DEFAULT NULL, + `cnLat` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=6108 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -182,23 +186,23 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `gb_stream`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `gb_stream` ( - `gbStreamId` int NOT NULL AUTO_INCREMENT, - `app` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `stream` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `gbId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gbStreamId` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `stream` varchar(255) NOT NULL, + `gbId` varchar(50) NOT NULL, + `name` varchar(255) DEFAULT NULL, `longitude` double DEFAULT NULL, `latitude` double DEFAULT NULL, - `streamType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `status` int DEFAULT NULL, - `createStamp` bigint DEFAULT NULL, + `streamType` varchar(50) DEFAULT NULL, + `mediaServerId` varchar(50) DEFAULT NULL, + `status` int(11) DEFAULT NULL, + `createStamp` bigint(20) DEFAULT NULL, PRIMARY KEY (`gbStreamId`) USING BTREE, UNIQUE KEY `app` (`app`,`stream`) USING BTREE, UNIQUE KEY `gbId` (`gbId`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=300766 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=300769 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -216,19 +220,19 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `log`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `log` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `uri` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `result` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `timing` bigint NOT NULL, - `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `type` varchar(50) NOT NULL, + `uri` varchar(200) NOT NULL, + `address` varchar(50) NOT NULL, + `result` varchar(50) NOT NULL, + `timing` bigint(20) NOT NULL, + `username` varchar(50) NOT NULL, + `createTime` varchar(50) NOT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=962 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=1552 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -246,34 +250,34 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `media_server`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `media_server` ( - `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `hookIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `sdpIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `streamIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `httpPort` int NOT NULL, - `httpSSlPort` int NOT NULL, - `rtmpPort` int NOT NULL, - `rtmpSSlPort` int NOT NULL, - `rtpProxyPort` int NOT NULL, - `rtspPort` int NOT NULL, - `rtspSSLPort` int NOT NULL, - `autoConfig` int NOT NULL, - `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `streamNoneReaderDelayMS` int NOT NULL, - `rtpEnable` int NOT NULL, - `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `recordAssistPort` int NOT NULL, - `defaultServer` int NOT NULL, - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `hookAliveInterval` int NOT NULL, + `id` varchar(255) NOT NULL, + `ip` varchar(50) NOT NULL, + `hookIp` varchar(50) NOT NULL, + `sdpIp` varchar(50) NOT NULL, + `streamIp` varchar(50) NOT NULL, + `httpPort` int(11) NOT NULL, + `httpSSlPort` int(11) NOT NULL, + `rtmpPort` int(11) NOT NULL, + `rtmpSSlPort` int(11) NOT NULL, + `rtpProxyPort` int(11) NOT NULL, + `rtspPort` int(11) NOT NULL, + `rtspSSLPort` int(11) NOT NULL, + `autoConfig` int(11) NOT NULL, + `secret` varchar(50) NOT NULL, + `streamNoneReaderDelayMS` int(11) NOT NULL, + `rtpEnable` int(11) NOT NULL, + `rtpPortRange` varchar(50) NOT NULL, + `sendRtpPortRange` varchar(50) NOT NULL, + `recordAssistPort` int(11) NOT NULL, + `defaultServer` int(11) NOT NULL, + `createTime` varchar(50) NOT NULL, + `updateTime` varchar(50) NOT NULL, + `hookAliveInterval` int(11) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `media_server_i` (`ip`,`httpPort`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -291,33 +295,36 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `parent_platform`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `parent_platform` ( - `id` int NOT NULL AUTO_INCREMENT, - `enable` int DEFAULT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `serverGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `serverGBDomain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `serverIP` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `serverPort` int DEFAULT NULL, - `deviceGBId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `deviceIp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `devicePort` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `expires` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `keepTimeout` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `transport` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `characterSet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `ptz` int DEFAULT NULL, - `rtcp` int DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `enable` int(11) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `serverGBId` varchar(50) NOT NULL, + `serverGBDomain` varchar(50) DEFAULT NULL, + `serverIP` varchar(50) DEFAULT NULL, + `serverPort` int(11) DEFAULT NULL, + `deviceGBId` varchar(50) NOT NULL, + `deviceIp` varchar(50) DEFAULT NULL, + `devicePort` varchar(50) DEFAULT NULL, + `username` varchar(255) DEFAULT NULL, + `password` varchar(50) DEFAULT NULL, + `expires` varchar(50) DEFAULT NULL, + `keepTimeout` varchar(50) DEFAULT NULL, + `transport` varchar(50) DEFAULT NULL, + `characterSet` varchar(50) DEFAULT NULL, + `catalogId` varchar(50) NOT NULL, + `ptz` int(11) DEFAULT NULL, + `rtcp` int(11) DEFAULT NULL, `status` bit(1) DEFAULT NULL, - `shareAllLiveStream` int DEFAULT NULL, + `shareAllLiveStream` int(11) DEFAULT NULL, + `startOfflinePush` int(11) DEFAULT '0', + `administrativeDivision` varchar(50) NOT NULL, + `catalogGroup` int(11) DEFAULT '1', PRIMARY KEY (`id`), UNIQUE KEY `parent_platform_id_uindex` (`id`), UNIQUE KEY `parent_platform_pk` (`serverGBId`) -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -335,14 +342,14 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `platform_catalog`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `platform_catalog` ( - `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `parentId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `id` varchar(50) NOT NULL, + `platformId` varchar(50) NOT NULL, + `name` varchar(255) NOT NULL, + `parentId` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -360,14 +367,14 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `platform_gb_channel`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `platform_gb_channel` ( - `id` int NOT NULL AUTO_INCREMENT, - `platformId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `catalogId` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `deviceChannelId` int NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `platformId` varchar(50) NOT NULL, + `catalogId` varchar(50) NOT NULL, + `deviceChannelId` int(11) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -385,15 +392,15 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `platform_gb_stream`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `platform_gb_stream` ( - `platformId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `gbStreamId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `id` int NOT NULL AUTO_INCREMENT, + `platformId` varchar(50) NOT NULL, + `catalogId` varchar(50) NOT NULL, + `gbStreamId` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`) -) ENGINE=InnoDB AUTO_INCREMENT=301207 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=301210 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -411,29 +418,29 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `stream_proxy`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `stream_proxy` ( - `id` int NOT NULL AUTO_INCREMENT, - `type` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, - `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - `url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `src_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `dst_url` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `timeout_ms` int DEFAULT NULL, - `ffmpeg_cmd_key` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `rtp_type` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `type` varchar(50) NOT NULL, + `app` varchar(255) NOT NULL, + `stream` varchar(255) NOT NULL, + `url` varchar(255) DEFAULT NULL, + `src_url` varchar(255) DEFAULT NULL, + `dst_url` varchar(255) DEFAULT NULL, + `timeout_ms` int(11) DEFAULT NULL, + `ffmpeg_cmd_key` varchar(255) DEFAULT NULL, + `rtp_type` varchar(50) DEFAULT NULL, + `mediaServerId` varchar(50) DEFAULT NULL, `enable_hls` bit(1) DEFAULT NULL, `enable_mp4` bit(1) DEFAULT NULL, `enable` bit(1) NOT NULL, `status` bit(1) NOT NULL, `enable_remove_none_reader` bit(1) NOT NULL, - `createTime` varchar(50) COLLATE utf8mb4_general_ci NOT NULL, + `createTime` varchar(50) NOT NULL, + `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `stream_proxy_pk` (`app`,`stream`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -451,20 +458,20 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `stream_push`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `stream_push` ( - `id` int NOT NULL AUTO_INCREMENT, - `app` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - `stream` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - `totalReaderCount` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `originType` int DEFAULT NULL, - `originTypeStr` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, - `createStamp` bigint DEFAULT NULL, - `aliveSecond` int DEFAULT NULL, - `mediaServerId` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `app` varchar(255) NOT NULL, + `stream` varchar(255) NOT NULL, + `totalReaderCount` varchar(50) DEFAULT NULL, + `originType` int(11) DEFAULT NULL, + `originTypeStr` varchar(50) DEFAULT NULL, + `createStamp` bigint(20) DEFAULT NULL, + `aliveSecond` int(11) DEFAULT NULL, + `mediaServerId` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `stream_push_pk` (`app`,`stream`) -) ENGINE=InnoDB AUTO_INCREMENT=300799 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +) ENGINE=InnoDB AUTO_INCREMENT=300838 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -482,17 +489,17 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `user`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `user` ( - `id` int NOT NULL AUTO_INCREMENT, - `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `roleId` int NOT NULL, - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `roleId` int(11) NOT NULL, + `createTime` varchar(50) NOT NULL, + `updateTime` varchar(50) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `user_username_uindex` (`username`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -501,7 +508,8 @@ CREATE TABLE `user` ( LOCK TABLES `user` WRITE; /*!40000 ALTER TABLE `user` DISABLE KEYS */; -INSERT INTO `user` VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021 - 04 - 13 14:14:57','2021 - 04 - 13 14:14:57'); +INSERT INTO `user` VALUES + (1,'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021 - 04 - 13 14:14:57','2021 - 04 - 13 14:14:57'); /*!40000 ALTER TABLE `user` ENABLE KEYS */; UNLOCK TABLES; @@ -511,15 +519,15 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `user_role`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +/*!40101 SET character_set_client = utf8 */; CREATE TABLE `user_role` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `authority` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `authority` varchar(50) NOT NULL, + `createTime` varchar(50) NOT NULL, + `updateTime` varchar(50) NOT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -528,7 +536,8 @@ CREATE TABLE `user_role` ( LOCK TABLES `user_role` WRITE; /*!40000 ALTER TABLE `user_role` DISABLE KEYS */; -INSERT INTO `user_role` VALUES (1,'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); +INSERT INTO `user_role` VALUES + (1,'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); /*!40000 ALTER TABLE `user_role` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -541,4 +550,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2022-03-07 8:26:30 +-- Dump completed on 2022-04-18 10:50:27 diff --git a/sql/update.sql b/sql/update.sql new file mode 100644 index 00000000..9c18c26e --- /dev/null +++ b/sql/update.sql @@ -0,0 +1,12 @@ +alter table parent_platform + add startOfflinePush int default 0 null; + +alter table parent_platform + add administrativeDivision varchar(50) not null; + +alter table parent_platform + add catalogGroup int default 1 null; + +alter table device + add ssrcCheck int default 0 null; + diff --git a/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java index ec2a7252..e91d1cab 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java +++ b/src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java @@ -38,10 +38,14 @@ public class ApiSaveConstant { } break; case "query": - if (keyItemArray.length <= 5) return null; + if (keyItemArray.length <= 5) { + return null; + } switch (keyItemArray[4]) { case "devices": - if (keyItemArray.length < 7) return null; + if (keyItemArray.length < 7) { + return null; + } switch (keyItemArray[6]) { case "sync": return "[设备查询] 同步设备通道"; diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java index 06263840..4e4ba15e 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java @@ -31,6 +31,9 @@ public class StreamInfo { private String rtc; private String mediaServerId; private Object tracks; + private String startTime; + private String endTime; + private double progress; public static class TransactionInfo{ public String callId; @@ -264,4 +267,29 @@ public class StreamInfo { public void setHttps_ts(String https_ts) { this.https_ts = https_ts; } + + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public double getProgress() { + return progress; + } + + public void setProgress(double progress) { + this.progress = progress; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index 0d638435..ef4492f8 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -22,6 +22,9 @@ public class VideoManagerConstants { public static final String DEVICE_PREFIX = "VMP_DEVICE_"; + // 设备同步完成 + public static final String DEVICE_SYNC_PREFIX = "VMP_DEVICE_SYNC_"; + public static final String CACHEKEY_PREFIX = "VMP_CHANNEL_"; public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_"; @@ -69,9 +72,29 @@ public class VideoManagerConstants { public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_"; + //************************** redis 消息********************************* + + // 流变化的通知 public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_"; - public static final String WVP_MSG_GPS_PREFIX = "VM_MSG_GPS"; + + // 接收推流设备的GPS变化通知 + public static final String VM_MSG_GPS = "VM_MSG_GPS"; + + // redis 消息通知设备推流到平台 + public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED"; + + // 移动位置订阅通知 + public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition"; + + // 报警订阅的通知(收到报警向redis发出通知) + public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm"; + + // 报警通知的发送 (收到redis发出的通知,转发给其他平台) + public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive"; + + // 设备状态订阅的通知 + public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device"; //************************** 第三方 **************************************** public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_"; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java index 08d030a8..61809743 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ApiAccessFilter.java @@ -29,7 +29,7 @@ public class ApiAccessFilter extends OncePerRequestFilter { private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private ILogService logService; @@ -48,7 +48,7 @@ public class ApiAccessFilter extends OncePerRequestFilter { filterChain.doFilter(servletRequest, servletResponse); - if (uriName != null && userSetup.getLogInDatebase()) { + if (uriName != null && userSetting.getLogInDatebase()) { LogDto logDto = new LogDto(); logDto.setName(uriName); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java index 80e39f5f..052f5336 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java @@ -1,5 +1,9 @@ package com.genersoft.iot.vmp.conf; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @@ -7,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.Date; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; @@ -16,14 +21,22 @@ import java.util.concurrent.ScheduledFuture; @Component public class DynamicTask { + private Logger logger = LoggerFactory.getLogger(DynamicTask.class); + @Autowired private ThreadPoolTaskScheduler threadPoolTaskScheduler; private Map> futureMap = new ConcurrentHashMap<>(); + private Map runnableMap = new ConcurrentHashMap<>(); @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { - return new ThreadPoolTaskScheduler(); + ThreadPoolTaskScheduler schedulerPool = new ThreadPoolTaskScheduler(); + schedulerPool.setPoolSize(300); + schedulerPool.setWaitForTasksToCompleteOnShutdown(true); + schedulerPool.setAwaitTerminationSeconds(10); + return schedulerPool; + } /** @@ -33,33 +46,66 @@ public class DynamicTask { * @param cycleForCatalog 间隔 * @return */ - public String startCron(String key, Runnable task, int cycleForCatalog) { - stop(key); + public void startCron(String key, Runnable task, int cycleForCatalog) { + ScheduledFuture future = futureMap.get(key); + if (future != null) { + if (future.isCancelled()) { + logger.info("任务【{}】已存在但是关闭状态!!!", key); + } else { + logger.info("任务【{}】已存在且已启动!!!", key); + return; + } + } // scheduleWithFixedDelay 必须等待上一个任务结束才开始计时period, cycleForCatalog表示执行的间隔 - ScheduledFuture future = threadPoolTaskScheduler.scheduleWithFixedDelay(task, cycleForCatalog * 1000L); - futureMap.put(key, future); - return "startCron"; + future = threadPoolTaskScheduler.scheduleAtFixedRate(task, cycleForCatalog * 1000L); + if (future != null){ + futureMap.put(key, future); + runnableMap.put(key, task); + logger.info("任务【{}】启动成功!!!", key); + }else { + logger.info("任务【{}】启动失败!!!", key); + } } /** * 延时任务 * @param key 任务ID * @param task 任务 - * @param delay 延时 /秒 + * @param delay 延时 /毫秒 * @return */ - public String startDelay(String key, Runnable task, int delay) { + public void startDelay(String key, Runnable task, int delay) { stop(key); - Date starTime = new Date(System.currentTimeMillis() + delay * 1000); + Date starTime = new Date(System.currentTimeMillis() + delay); + + ScheduledFuture future = futureMap.get(key); + if (future != null) { + if (future.isCancelled()) { + logger.info("任务【{}】已存在但是关闭状态!!!", key); + } else { + logger.info("任务【{}】已存在且已启动!!!", key); + return; + } + } // scheduleWithFixedDelay 必须等待上一个任务结束才开始计时period, cycleForCatalog表示执行的间隔 - ScheduledFuture future = threadPoolTaskScheduler.schedule(task, starTime); - futureMap.put(key, future); - return "startCron"; + future = threadPoolTaskScheduler.schedule(task, starTime); + if (future != null){ + futureMap.put(key, future); + runnableMap.put(key, task); + logger.info("任务【{}】启动成功!!!", key); + }else { + logger.info("任务【{}】启动失败!!!", key); + } } public void stop(String key) { if (futureMap.get(key) != null && !futureMap.get(key).isCancelled()) { futureMap.get(key).cancel(true); + Runnable runnable = runnableMap.get(key); + if (runnable instanceof ISubscribeTask) { + ISubscribeTask subscribeTask = (ISubscribeTask) runnable; + subscribeTask.stop(); + } } } @@ -67,4 +113,11 @@ public class DynamicTask { return futureMap.get(key) != null; } + public Set getAllKeys() { + return futureMap.keySet(); + } + + public Runnable get(String key) { + return runnableMap.get(key); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java index 5f04a083..6b45eb5d 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.conf; import com.genersoft.iot.vmp.common.VideoManagerConstants; +import com.genersoft.iot.vmp.service.impl.RedisAlarmMsgListener; import com.genersoft.iot.vmp.service.impl.RedisGPSMsgListener; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +49,9 @@ public class RedisConfig extends CachingConfigurerSupport { @Autowired private RedisGPSMsgListener redisGPSMsgListener; + @Autowired + private RedisAlarmMsgListener redisAlarmMsgListener; + @Bean public JedisPool jedisPool() { if (StringUtils.isBlank(password)) { @@ -92,7 +96,8 @@ public class RedisConfig extends CachingConfigurerSupport { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); - container.addMessageListener(redisGPSMsgListener, new PatternTopic(VideoManagerConstants.WVP_MSG_GPS_PREFIX)); + container.addMessageListener(redisGPSMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_GPS)); + container.addMessageListener(redisAlarmMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM_RECEIVE)); return container; } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java index a2281ab0..18483800 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisKeyExpirationEventMessageListener.java @@ -3,25 +3,24 @@ package com.genersoft.iot.vmp.conf; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.util.StringUtils; import java.util.Properties; public class RedisKeyExpirationEventMessageListener extends KeyExpirationEventMessageListener { - private UserSetup userSetup; + private UserSetting userSetting; private RedisMessageListenerContainer listenerContainer; private String keyspaceNotificationsConfigParameter = "EA"; - public RedisKeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) { + public RedisKeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer, UserSetting userSetting) { super(listenerContainer); this.listenerContainer = listenerContainer; - this.userSetup = userSetup; + this.userSetting = userSetting; } @Override public void init() { - if (!userSetup.getRedisConfig()) { + if (!userSetting.getRedisConfig()) { // 配置springboot默认Config为空,即不让应用去修改redis的默认配置,因为Redis服务出于安全会禁用CONFIG命令给远程用户使用 setKeyspaceNotificationsConfigParameter(""); }else { diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java index 6fa802da..bbc946bf 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java @@ -29,7 +29,7 @@ public class SipConfig { Integer registerTimeInterval = 120; - private boolean alarm = false; + private boolean alarm; public void setIp(String ip) { this.ip = ip; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java index 7f9f8476..cf16f864 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java @@ -4,9 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; -import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; @@ -22,7 +21,7 @@ import java.util.List; public class SipPlatformRunner implements CommandLineRunner { @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java index 1bc85218..71aed27f 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java @@ -7,6 +7,10 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; +/** + * ThreadPoolTask 配置类 + * @author lin + */ @Configuration @EnableAsync(proxyTargetClass = true) public class ThreadPoolTaskConfig { @@ -40,6 +44,10 @@ public class ThreadPoolTaskConfig { */ private static final String threadNamePrefix = "wvp-"; + /** + * + * @return + */ @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名 public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java similarity index 86% rename from src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java rename to src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java index d1d0e20b..c0fcf01f 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java @@ -1,15 +1,18 @@ package com.genersoft.iot.vmp.conf; +import io.swagger.models.auth.In; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; - +/** + * 配置文件 user-settings 映射的配置信息 + */ @Component @ConfigurationProperties(prefix = "user-settings", ignoreInvalidFields = true) -public class UserSetup { +public class UserSetting { private Boolean savePositionHistory = Boolean.FALSE; @@ -17,7 +20,9 @@ public class UserSetup { private Boolean seniorSdp = Boolean.FALSE; - private Long playTimeout = 18000L; + private Integer playTimeout = 18000; + + private int platformPlayTimeout = 60000; private Boolean interfaceAuthentication = Boolean.TRUE; @@ -51,7 +56,7 @@ public class UserSetup { return seniorSdp; } - public Long getPlayTimeout() { + public Integer getPlayTimeout() { return playTimeout; } @@ -79,7 +84,7 @@ public class UserSetup { this.seniorSdp = seniorSdp; } - public void setPlayTimeout(Long playTimeout) { + public void setPlayTimeout(Integer playTimeout) { this.playTimeout = playTimeout; } @@ -134,4 +139,12 @@ public class UserSetup { public void setRecordSip(Boolean recordSip) { this.recordSip = recordSip; } + + public int getPlatformPlayTimeout() { + return platformPlayTimeout; + } + + public void setPlatformPlayTimeout(int platformPlayTimeout) { + this.platformPlayTimeout = platformPlayTimeout; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java index da4e2eda..4a897968 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java @@ -1,10 +1,10 @@ package com.genersoft.iot.vmp.conf.runner; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; @@ -14,20 +14,20 @@ import java.util.List; /** - * 系统启动时控制设备离线 + * 系统启动时控制设备 */ @Component @Order(value=4) public class SipDeviceRunner implements CommandLineRunner { @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private IDeviceService deviceService; @@ -41,9 +41,14 @@ public class SipDeviceRunner implements CommandLineRunner { for (String deviceId : onlineForAll) { storager.online(deviceId); Device device = redisCatchStorage.getDevice(deviceId); - if (device != null && device.getSubscribeCycleForCatalog() > 0) { - // 查询在线设备那些开启了订阅,为设备开启定时的目录订阅 - deviceService.addCatalogSubscribe(device); + if (device != null ) { + if (device.getSubscribeCycleForCatalog() > 0) { + // 查询在线设备那些开启了订阅,为设备开启定时的目录订阅 + deviceService.addCatalogSubscribe(device); + } + if (device.getSubscribeCycleForMobilePosition() > 0) { + deviceService.addMobilePositionSubscribe(device); + } } } // 重置cseq计数 diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java index f0eca856..47cfdaba 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java @@ -1,6 +1,6 @@ package com.genersoft.iot.vmp.conf.security; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +29,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final static Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class); @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private DefaultUserDetailsServiceImpl userDetailsService; @@ -77,7 +77,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) { - if (!userSetup.isInterfaceAuthentication()) { + if (!userSetting.isInterfaceAuthentication()) { web.ignoring().antMatchers("**"); }else { // 可以直接访问的静态数据 @@ -91,7 +91,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/swagger-resources/**") .antMatchers("/v3/api-docs/**") .antMatchers("/js/**"); - List interfaceAuthenticationExcludes = userSetup.getInterfaceAuthenticationExcludes(); + List interfaceAuthenticationExcludes = userSetting.getInterfaceAuthenticationExcludes(); for (String interfaceAuthenticationExclude : interfaceAuthenticationExcludes) { if (interfaceAuthenticationExclude.split("/").length < 4 ) { logger.warn("{}不满足两级目录,已忽略", interfaceAuthenticationExclude); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java index 1a5cce57..58772d9c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; @@ -18,7 +19,7 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -@Component +@Configuration public class SipLayer{ private final static Logger logger = LoggerFactory.getLogger(SipLayer.class); @@ -35,7 +36,7 @@ public class SipLayer{ @Bean("sipFactory") - private SipFactory createSipFactory() { + SipFactory createSipFactory() { sipFactory = SipFactory.getInstance(); sipFactory.setPathName("gov.nist"); return sipFactory; @@ -43,11 +44,12 @@ public class SipLayer{ @Bean("sipStack") @DependsOn({"sipFactory"}) - private SipStack createSipStack() throws PeerUnavailableException { + SipStack createSipStack() throws PeerUnavailableException { Properties properties = new Properties(); properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getMonitorIp()); properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); + properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); // 接收所有notify请求,即使没有订阅 /** * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE = * 0; public static final int TRACE_MESSAGES = 16; public static final int @@ -63,7 +65,7 @@ public class SipLayer{ @Bean(name = "tcpSipProvider") @DependsOn("sipStack") - private SipProviderImpl startTcpListener() { + SipProviderImpl startTcpListener() { ListeningPoint tcpListeningPoint = null; SipProviderImpl tcpSipProvider = null; try { @@ -88,7 +90,7 @@ public class SipLayer{ @Bean(name = "udpSipProvider") @DependsOn("sipStack") - private SipProviderImpl startUdpListener() { + SipProviderImpl startUdpListener() { ListeningPoint udpListeningPoint = null; SipProviderImpl udpSipProvider = null; try { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java index 5ee3de69..f6284f5a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java @@ -129,7 +129,9 @@ public class DigestServerAuthenticationHelper { */ public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) { AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; + if ( authHeader == null ) { + return false; + } String realm = authHeader.getRealm(); String username = authHeader.getUsername(); @@ -176,7 +178,9 @@ public class DigestServerAuthenticationHelper { */ public boolean doAuthenticatePlainTextPassword(Request request, String pass) { AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; + if ( authHeader == null ) { + return false; + } String realm = authHeader.getRealm().trim(); String username = authHeader.getUsername().trim(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java index 82390709..8731228a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/auth/RegisterLogicHandler.java @@ -1,6 +1,6 @@ package com.genersoft.iot.vmp.gb28181.auth; -import com.genersoft.iot.vmp.storager.impl.VideoManagerStoragerImpl; +import com.genersoft.iot.vmp.storager.impl.VideoManagerStorageImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,7 @@ public class RegisterLogicHandler { private SIPCommander cmder; @Autowired - private VideoManagerStoragerImpl storager; + private VideoManagerStorageImpl storager; public void onRegister(Device device) { // 只有第一次注册时调用查询设备信息,如需更新调用更新API接口 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java new file mode 100644 index 00000000..96d25c4e --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java @@ -0,0 +1,46 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +/** + * 通过redis分发报警消息 + */ +public class AlarmChannelMessage { + /** + * 国标编号 + */ + private String gbId; + + /** + * 报警编号 + */ + private int alarmSn; + + + /** + * 报警描述 + */ + private String alarmDescription; + + public String getGbId() { + return gbId; + } + + public void setGbId(String gbId) { + this.gbId = gbId; + } + + public int getAlarmSn() { + return alarmSn; + } + + public void setAlarmSn(int alarmSn) { + this.alarmSn = alarmSn; + } + + public String getAlarmDescription() { + return alarmDescription; + } + + public void setAlarmDescription(String alarmDescription) { + this.alarmDescription = alarmDescription; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java index c74fb87b..338f8ad5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java @@ -4,10 +4,26 @@ import java.util.Date; import java.util.List; public class CatalogData { + private int sn; // 命令序列号 private int total; private List channelList; private Date lastTime; private Device device; + private String errorMsg; + + public enum CatalogDataStatus{ + ready, runIng, end + } + private CatalogDataStatus status; + + + public int getSn() { + return sn; + } + + public void setSn(int sn) { + this.sn = sn; + } public int getTotal() { return total; @@ -40,4 +56,20 @@ public class CatalogData { public void setDevice(Device device) { this.device = device; } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public CatalogDataStatus getStatus() { + return status; + } + + public void setStatus(CatalogDataStatus status) { + this.status = status; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java index 761437fc..81b96662 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java @@ -105,15 +105,34 @@ public class Device { private boolean firsRegister; /** - * 字符集, 支持 utf-8 与 gb2312 + * 字符集, 支持 UTF-8 与 GB2312 */ private String charset ; /** * 目录订阅周期,0为不订阅 */ - private int subscribeCycleForCatalog ; + private int subscribeCycleForCatalog; + /** + * 移动设备位置订阅周期,0为不订阅 + */ + private int subscribeCycleForMobilePosition; + + /** + * 移动设备位置信息上报时间间隔,单位:秒,默认值5 + */ + private int mobilePositionSubmissionInterval = 5; + + /** + * 报警订阅周期,0为不订阅 + */ + private int subscribeCycleForAlarm; + + /** + * 是否开启ssrc校验,默认关闭,开启可以防止串流 + */ + private boolean ssrcCheck; public String getDeviceId() { @@ -283,4 +302,36 @@ public class Device { public void setSubscribeCycleForCatalog(int subscribeCycleForCatalog) { this.subscribeCycleForCatalog = subscribeCycleForCatalog; } + + public int getSubscribeCycleForMobilePosition() { + return subscribeCycleForMobilePosition; + } + + public void setSubscribeCycleForMobilePosition(int subscribeCycleForMobilePosition) { + this.subscribeCycleForMobilePosition = subscribeCycleForMobilePosition; + } + + public int getMobilePositionSubmissionInterval() { + return mobilePositionSubmissionInterval; + } + + public void setMobilePositionSubmissionInterval(int mobilePositionSubmissionInterval) { + this.mobilePositionSubmissionInterval = mobilePositionSubmissionInterval; + } + + public int getSubscribeCycleForAlarm() { + return subscribeCycleForAlarm; + } + + public void setSubscribeCycleForAlarm(int subscribeCycleForAlarm) { + this.subscribeCycleForAlarm = subscribeCycleForAlarm; + } + + public boolean isSsrcCheck() { + return ssrcCheck; + } + + public void setSsrcCheck(boolean ssrcCheck) { + this.ssrcCheck = ssrcCheck; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java index 8176c1c9..530bce2d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java @@ -50,7 +50,30 @@ public class DeviceAlarm { private double latitude; /** - * 报警类型 + * 报警类型, + * 报警方式为2时,不携带 AlarmType为默认的报警设备报警, + * 携带 AlarmType取值及对应报警类型如下: + * 1-视频丢失报警; + * 2-设备防拆报警; + * 3-存储设备磁盘满报警; + * 4-设备高温报警; + * 5-设备低温报警。 + * 报警方式为5时,取值如下: + * 1-人工视频报警; + * 2-运动目标检测报警; + * 3-遗留物检测报警; + * 4-物体移除检测报警; + * 5-绊线检测报警; + * 6-入侵检测报警; + * 7-逆行检测报警; + * 8-徘徊检测报警; + * 9-流量统计报警; + * 10-密度检测报警; + * 11-视频异常检测报警; + * 12-快速移动报警。 + * 报警方式为6时,取值下: + * 1-存储设备磁盘故障报警; + * 2-存储设备风扇故障报警。 */ private String alarmType; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 36337895..95576f38 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -4,7 +4,7 @@ public class DeviceChannel { /** - * 数据库自赠ID + * 数据库自增ID */ private int id; @@ -169,6 +169,11 @@ public class DeviceChannel { */ private boolean hasAudio; + /** + * 标记通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划 + */ + private int channelType; + public int getId() { return id; } @@ -441,4 +446,12 @@ public class DeviceChannel { public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } + + public int getChannelType() { + return channelType; + } + + public void setChannelType(int channelType) { + this.channelType = channelType; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java new file mode 100644 index 00000000..c61bb088 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java @@ -0,0 +1,23 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +public class DeviceChannelInPlatform extends DeviceChannel{ + + private String platFormId; + private String catalogId; + + public String getPlatFormId() { + return platFormId; + } + + public void setPlatFormId(String platFormId) { + this.platFormId = platFormId; + } + + public String getCatalogId() { + return catalogId; + } + + public void setCatalogId(String catalogId) { + this.catalogId = catalogId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java index 1b77ddec..010e0009 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java @@ -25,6 +25,7 @@ public class GbStream extends PlatformGbStream{ return gbStreamId; } + @Override public void setGbStreamId(Integer gbStreamId) { this.gbStreamId = gbStreamId; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java new file mode 100644 index 00000000..24d509fd --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java @@ -0,0 +1,8 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +public enum InviteStreamType { + + PLAY,PLAYBACK,PUSH,PROXY,CLOUD_RECORD_PUSH,CLOUD_RECORD_PROXY + + +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java index 8df79394..7c23a2f8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java @@ -125,9 +125,24 @@ public class ParentPlatform { private boolean alarmSubscribe; /** - * 已被订阅GPS信息 + * 已被订阅移动位置信息 */ - private boolean gpsSubscribe; + private boolean mobilePositionSubscribe; + + /** + * 点播未推流的设备时是否使用redis通知拉起 + */ + private boolean startOfflinePush; + + /** + * 目录分组-每次向上级发送通道信息时单个包携带的通道数量,取值1,2,4,8 + */ + private int catalogGroup; + + /** + * 行政区划 + */ + private String administrativeDivision; public Integer getId() { return id; @@ -322,11 +337,35 @@ public class ParentPlatform { this.alarmSubscribe = alarmSubscribe; } - public boolean isGpsSubscribe() { - return gpsSubscribe; + public boolean isMobilePositionSubscribe() { + return mobilePositionSubscribe; } - public void setGpsSubscribe(boolean gpsSubscribe) { - this.gpsSubscribe = gpsSubscribe; + public void setMobilePositionSubscribe(boolean mobilePositionSubscribe) { + this.mobilePositionSubscribe = mobilePositionSubscribe; + } + + public boolean isStartOfflinePush() { + return startOfflinePush; + } + + public void setStartOfflinePush(boolean startOfflinePush) { + this.startOfflinePush = startOfflinePush; + } + + public int getCatalogGroup() { + return catalogGroup; + } + + public void setCatalogGroup(int catalogGroup) { + this.catalogGroup = catalogGroup; + } + + public String getAdministrativeDivision() { + return administrativeDivision; + } + + public void setAdministrativeDivision(String administrativeDivision) { + this.administrativeDivision = administrativeDivision; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java index a2c38acb..4b63ec53 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java @@ -77,9 +77,9 @@ public class SendRtpItem { private String CallId; /** - * 是否是play, false是playback + * 播放类型 */ - private boolean isPlay; + private InviteStreamType playType; private byte[] transaction; @@ -197,12 +197,12 @@ public class SendRtpItem { CallId = callId; } - public boolean isPlay() { - return isPlay; + public InviteStreamType getPlayType() { + return playType; } - public void setPlay(boolean play) { - isPlay = play; + public void setPlayType(InviteStreamType playType) { + this.playType = playType; } public byte[] getTransaction() { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java index c2dedec1..87d26359 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java @@ -1,5 +1,7 @@ package com.genersoft.iot.vmp.gb28181.bean; +import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; + public class SsrcTransaction { private String deviceId; @@ -10,6 +12,7 @@ public class SsrcTransaction { private byte[] dialog; private String mediaServerId; private String ssrc; + private VideoStreamSessionManager.SessionType type; public String getDeviceId() { return deviceId; @@ -74,4 +77,12 @@ public class SsrcTransaction { public void setSsrc(String ssrc) { this.ssrc = ssrc; } + + public VideoStreamSessionManager.SessionType getType() { + return type; + } + + public void setType(VideoStreamSessionManager.SessionType type) { + this.type = type; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java index 287c2a0a..e804be28 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java @@ -1,5 +1,12 @@ package com.genersoft.iot.vmp.gb28181.bean; +import com.genersoft.iot.vmp.common.VideoManagerConstants; +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -9,12 +16,32 @@ import java.util.concurrent.ConcurrentHashMap; @Component public class SubscribeHolder { + @Autowired + private DynamicTask dynamicTask; + + @Autowired + private IRedisCatchStorage redisCatchStorage; + + @Autowired + private ISIPCommanderForPlatform sipCommanderForPlatform; + + @Autowired + private IVideoManagerStorage storager; + + private final String taskOverduePrefix = "subscribe_overdue_"; + private static ConcurrentHashMap catalogMap = new ConcurrentHashMap<>(); private static ConcurrentHashMap mobilePositionMap = new ConcurrentHashMap<>(); public void putCatalogSubscribe(String platformId, SubscribeInfo subscribeInfo) { catalogMap.put(platformId, subscribeInfo); + // 添加订阅到期 + String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId; + dynamicTask.stop(taskOverdueKey); + // 添加任务处理订阅过期 + dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()), + subscribeInfo.getExpires() * 1000); } public SubscribeInfo getCatalogSubscribe(String platformId) { @@ -23,10 +50,26 @@ public class SubscribeHolder { public void removeCatalogSubscribe(String platformId) { catalogMap.remove(platformId); + String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId; + // 添加任务处理订阅过期 + dynamicTask.stop(taskOverdueKey); } public void putMobilePositionSubscribe(String platformId, SubscribeInfo subscribeInfo) { mobilePositionMap.put(platformId, subscribeInfo); + String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId; + // 添加任务处理GPS定时推送 + dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(redisCatchStorage, sipCommanderForPlatform, + storager, platformId, subscribeInfo.getSn(), key, this, dynamicTask), + subscribeInfo.getGpsInterval()); + String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId; + dynamicTask.stop(taskOverdueKey); + // 添加任务处理订阅过期 + dynamicTask.startDelay(taskOverdueKey, () -> { + System.out.println("订阅过期"); + removeMobilePositionSubscribe(subscribeInfo.getId()); + }, + subscribeInfo.getExpires() * 1000); } public SubscribeInfo getMobilePositionSubscribe(String platformId) { @@ -35,6 +78,12 @@ public class SubscribeHolder { public void removeMobilePositionSubscribe(String platformId) { mobilePositionMap.remove(platformId); + String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + "MobilePosition_" + platformId; + // 结束任务处理GPS定时推送 + dynamicTask.stop(key); + String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId; + // 添加任务处理订阅过期 + dynamicTask.stop(taskOverdueKey); } public List getAllCatalogSubscribePlatform() { @@ -46,4 +95,9 @@ public class SubscribeHolder { } return platforms; } + + public void removeAllSubscribe(String platformId) { + removeMobilePositionSubscribe(platformId); + removeCatalogSubscribe(platformId); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java index 434a639a..1958b449 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java @@ -25,6 +25,9 @@ public class SubscribeInfo { this.callId = callIdHeader.getCallId(); } + public SubscribeInfo() { + } + private String id; private int expires; private String callId; @@ -33,6 +36,14 @@ public class SubscribeInfo { private ServerTransaction transaction; private Dialog dialog; + /** + * 以下为可选字段 + * @return + */ + private String sn; + private int gpsInterval; + + public String getId() { return id; } @@ -88,4 +99,20 @@ public class SubscribeInfo { public void setDialog(Dialog dialog) { this.dialog = dialog; } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public int getGpsInterval() { + return gpsInterval; + } + + public void setGpsInterval(int gpsInterval) { + this.gpsInterval = gpsInterval; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java new file mode 100644 index 00000000..2ae50e69 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java @@ -0,0 +1,34 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +/** + * 摄像机同步状态 + */ +public class SyncStatus { + private int total; + private int current; + private String errorMsg; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getCurrent() { + return current; + } + + public void setCurrent(int current) { + this.current = current; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java deleted file mode 100644 index ea2fa6c2..00000000 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/DeviceOffLineDetector.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.genersoft.iot.vmp.gb28181.event; - -import com.genersoft.iot.vmp.conf.UserSetup; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; - -/** - * @description:设备离在线状态检测器,用于检测设备状态 - * @author: swwheihei - * @date: 2020年5月13日 下午2:40:29 - */ -@Component -public class DeviceOffLineDetector { - - @Autowired - private RedisUtil redis; - - @Autowired - private UserSetup userSetup; - - public boolean isOnline(String deviceId) { - String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + deviceId; - return redis.hasKey(key); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java index 3b611b5b..ef78d371 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java @@ -1,27 +1,20 @@ package com.genersoft.iot.vmp.gb28181.event.offline; import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; -import org.springframework.util.StringUtils; - -import java.util.Properties; /** * @description:设备心跳超时监听,借助redis过期特性,进行监听,监听到说明设备心跳超时,发送离线事件 @@ -37,16 +30,16 @@ public class KeepaliveTimeoutListenerForPlatform extends RedisKeyExpirationEvent private EventPublisher publisher; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private SipSubscribe sipSubscribe; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; - public KeepaliveTimeoutListenerForPlatform(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) { - super(listenerContainer, userSetup); + public KeepaliveTimeoutListenerForPlatform(RedisMessageListenerContainer listenerContainer, UserSetting userSetting) { + super(listenerContainer, userSetting); } @@ -59,12 +52,11 @@ public class KeepaliveTimeoutListenerForPlatform extends RedisKeyExpirationEvent public void onMessage(Message message, byte[] pattern) { // 获取失效的key String expiredKey = message.toString(); - logger.debug(expiredKey); // 平台心跳到期,需要重发, 判断是否已经多次未收到心跳回复, 多次未收到,则重新发起注册, 注册尝试多次未得到回复,则认为平台离线 - String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetup.getServerId() + "_"; - String PLATFORM_REGISTER_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetup.getServerId() + "_"; - String KEEPLIVEKEY_PREFIX = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_"; - String REGISTER_INFO_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetup.getServerId() + "_"; + String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_"; + String PLATFORM_REGISTER_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_"; + String KEEPLIVEKEY_PREFIX = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_"; + String REGISTER_INFO_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetting.getServerId() + "_"; if (expiredKey.startsWith(PLATFORM_KEEPLIVEKEY_PREFIX)) { String platformGBId = expiredKey.substring(PLATFORM_KEEPLIVEKEY_PREFIX.length(),expiredKey.length()); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformGBId); @@ -84,12 +76,14 @@ public class KeepaliveTimeoutListenerForPlatform extends RedisKeyExpirationEvent publisher.outlineEventPublish(deviceId, KEEPLIVEKEY_PREFIX); } }else if (expiredKey.startsWith(REGISTER_INFO_PREFIX)) { - String callid = expiredKey.substring(REGISTER_INFO_PREFIX.length()); - SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(); - eventResult.callId = callid; - eventResult.msg = "注册超时"; - eventResult.type = "register timeout"; - sipSubscribe.getErrorSubscribe(callid).response(eventResult); + String callId = expiredKey.substring(REGISTER_INFO_PREFIX.length()); + if (sipSubscribe.getErrorSubscribe(callId) != null) { + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(); + eventResult.callId = callId; + eventResult.msg = "注册超时"; + eventResult.type = "register timeout"; + sipSubscribe.getErrorSubscribe(callId).response(eventResult); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java index 151b68dc..9e8c6471 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepliveTimeoutListener.java @@ -1,14 +1,11 @@ package com.genersoft.iot.vmp.gb28181.event.offline; import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; @@ -29,15 +26,15 @@ public class KeepliveTimeoutListener extends RedisKeyExpirationEventMessageListe private EventPublisher publisher; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; - public KeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) { - super(listenerContainer, userSetup); + public KeepliveTimeoutListener(RedisMessageListenerContainer listenerContainer, UserSetting userSetting) { + super(listenerContainer, userSetting); } @Override public void init() { - if (!userSetup.getRedisConfig()) { + if (!userSetting.getRedisConfig()) { // 配置springboot默认Config为空,即不让应用去修改redis的默认配置,因为Redis服务出于安全会禁用CONFIG命令给远程用户使用 setKeyspaceNotificationsConfigParameter(""); } @@ -54,7 +51,7 @@ public class KeepliveTimeoutListener extends RedisKeyExpirationEventMessageListe public void onMessage(Message message, byte[] pattern) { // 获取失效的key String expiredKey = message.toString(); - String KEEPLIVEKEY_PREFIX = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_"; + String KEEPLIVEKEY_PREFIX = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_"; if(!expiredKey.startsWith(KEEPLIVEKEY_PREFIX)){ logger.debug("收到redis过期监听,但开头不是"+KEEPLIVEKEY_PREFIX+",忽略"); return; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java index 9e67191b..46332566 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java @@ -1,24 +1,21 @@ package com.genersoft.iot.vmp.gb28181.event.offline; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import java.util.List; @@ -36,7 +33,7 @@ public class OfflineEventListener implements ApplicationListener { private final static Logger logger = LoggerFactory.getLogger(OfflineEventListener.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private VideoStreamSessionManager streamSession; @@ -45,7 +42,7 @@ public class OfflineEventListener implements ApplicationListener { private RedisUtil redis; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private EventPublisher eventPublisher; @@ -60,12 +57,10 @@ public class OfflineEventListener implements ApplicationListener { @Override public void onApplicationEvent(OfflineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("设备离线事件触发,deviceId:" + event.getDeviceId() + ",from:" + event.getFrom()); - } - String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + event.getDeviceId(); + logger.info("设备离线事件触发,deviceId:" + event.getDeviceId() + ",from:" + event.getFrom()); + + String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDeviceId(); switch (event.getFrom()) { // 心跳超时触发的离线事件,说明redis中已删除,无需处理 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java index d3580d35..f32637e5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java @@ -1,14 +1,13 @@ package com.genersoft.iot.vmp.gb28181.event.online; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; -import com.genersoft.iot.vmp.storager.dao.dto.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,7 +15,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import java.text.SimpleDateFormat; @@ -35,7 +34,7 @@ public class OnlineEventListener implements ApplicationListener { private final static Logger logger = LoggerFactory.getLogger(OnlineEventListener.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IDeviceService deviceService; @@ -47,7 +46,7 @@ public class OnlineEventListener implements ApplicationListener { private SipConfig sipConfig; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private EventPublisher eventPublisher; @@ -55,17 +54,18 @@ public class OnlineEventListener implements ApplicationListener { @Autowired private SIPCommander cmder; + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void onApplicationEvent(OnlineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("设备上线事件触发,deviceId:" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("设备上线事件触发,deviceId:" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); Device device = event.getDevice(); - if (device == null) return; - String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + event.getDevice().getDeviceId(); + if (device == null) { + return; + } + String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId(); Device deviceInStore = storager.queryVideoDevice(device.getDeviceId()); device.setOnline(1); switch (event.getFrom()) { @@ -77,7 +77,7 @@ public class OnlineEventListener implements ApplicationListener { if (deviceInStore == null) { //第一次上线 logger.info("[{}] 首次注册,查询设备信息以及通道信息", device.getDeviceId()); cmder.deviceInfoQuery(device); - cmder.catalogQuery(device, null); + deviceService.sync(device); } break; // 设备主动发送心跳触发的在线事件 @@ -98,11 +98,13 @@ public class OnlineEventListener implements ApplicationListener { } // 处理上线监听 storager.updateDevice(device); - List deviceChannelList = storager.queryOnlineChannelsByDeviceId(device.getDeviceId()); - eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON); // 上线添加订阅 if (device.getSubscribeCycleForCatalog() > 0) { + // 查询在线设备那些开启了订阅,为设备开启定时的目录订阅 deviceService.addCatalogSubscribe(device); } + if (device.getSubscribeCycleForMobilePosition() > 0) { + deviceService.addMobilePositionSubscribe(device); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java index 00926574..67b297c3 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformKeepaliveExpire/PlatformKeepaliveExpireEventLister.java @@ -6,7 +6,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; -import javax.sip.ResponseEvent; import javax.sip.message.Response; /** @@ -29,7 +28,7 @@ public class PlatformKeepaliveExpireEventLister implements ApplicationListener

{ - timer.cancel(); + dynamicTask.stop(taskKey); }; - sipCommanderFroPlatform.register(parentPlatform, null, okEvent); - timer.schedule(new TimerTask() { - @Override - public void run() { - logger.info("[平台注册]再次向平台注册,平台国标ID:" + event.getPlatformGbID()); - sipCommanderFroPlatform.register(parentPlatform, null, okEvent); - } - }, 15*1000 ,Long.parseLong(parentPlatform.getExpires())* 1000); + dynamicTask.startCron(taskKey, ()->{ + logger.info("[平台注册]再次向平台注册,平台国标ID:" + event.getPlatformGbID()); + sipCommanderFroPlatform.register(parentPlatform, null, okEvent); + }, Integer.parseInt(parentPlatform.getExpires())* 1000); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java index 1b8e7aed..14ed76a2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/platformNotRegister/PlatformNotRegisterEventLister.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.event.platformNotRegister; +import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; @@ -9,7 +10,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +32,7 @@ public class PlatformNotRegisterEventLister implements ApplicationListener 0) { logger.info("[ 平台未注册事件 ] 停止[ {} ]的所有推流", event.getPlatformGbID()); - StringBuilder app = new StringBuilder(); - StringBuilder stream = new StringBuilder(); for (SendRtpItem sendRtpItem : sendRtpItems) { - if (app.length() != 0) { - app.append(","); - } - app.append(sendRtpItem.getApp()); - if (stream.length() != 0) { - stream.append(","); - } - stream.append(sendRtpItem.getStreamId()); redisCatchStorage.deleteSendRTPServer(event.getPlatformGbID(), sendRtpItem.getChannelId(), null, null); MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); Map param = new HashMap<>(); param.put("vhost", "__defaultVhost__"); - param.put("app", app.toString()); - param.put("stream", stream.toString()); + param.put("app", sendRtpItem.getApp()); + param.put("stream", sendRtpItem.getStreamId()); zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param); } } - Timer timer = new Timer(); + String taskKey = "platform-not-register-" + parentPlatform.getServerGBId(); SipSubscribe.Event okEvent = (responseEvent)->{ - timer.cancel(); + dynamicTask.stop(taskKey); }; - logger.info("[平台注册]平台国标ID:" + event.getPlatformGbID()); - sipCommanderFroPlatform.register(parentPlatform, null, okEvent); - // 设置注册失败则每隔15秒发起一次注册 - timer.schedule(new TimerTask() { - @Override - public void run() { - logger.info("[平台注册]再次向平台注册,平台国标ID:" + event.getPlatformGbID()); - sipCommanderFroPlatform.register(parentPlatform, null, okEvent); - } - }, config.getRegisterTimeInterval()* 1000, config.getRegisterTimeInterval()* 1000);//十五秒后再次发起注册 + dynamicTask.startCron(taskKey, ()->{ + logger.info("[平台注册]再次向平台注册,平台国标ID:" + event.getPlatformGbID()); + sipCommanderFroPlatform.register(parentPlatform, null, okEvent); + }, config.getRegisterTimeInterval()* 1000); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java index 95ffbfa0..4965026d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -31,10 +31,8 @@ public class RecordEndEventListener implements ApplicationListener handlerMap = new HashMap<>(); @Override public void onApplicationEvent(RecordEndEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), - event.getRecordInfo().getChannelId(), event.getRecordInfo().getRecordList().size() ); - } + logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), + event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); if (handlerMap.size() > 0) { for (RecordEndEventHandler recordEndEventHandler : handlerMap.values()) { recordEndEventHandler.handler(event.getRecordInfo()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java deleted file mode 100644 index 3b2bd230..00000000 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/SubscribeListenerForPlatform.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.genersoft.iot.vmp.gb28181.event.subscribe; - -import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.conf.DynamicTask; -import com.genersoft.iot.vmp.conf.RedisKeyExpirationEventMessageListener; -import com.genersoft.iot.vmp.conf.UserSetup; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.stereotype.Component; - -/** - * 平台订阅到期事件 - */ -@Component -public class SubscribeListenerForPlatform extends RedisKeyExpirationEventMessageListener { - - private Logger logger = LoggerFactory.getLogger(SubscribeListenerForPlatform.class); - - @Autowired - private UserSetup userSetup; - - @Autowired - private DynamicTask dynamicTask; - - public SubscribeListenerForPlatform(RedisMessageListenerContainer listenerContainer, UserSetup userSetup) { - super(listenerContainer, userSetup); - } - - - /** - * 监听失效的key - * @param message - * @param pattern - */ - @Override - public void onMessage(Message message, byte[] pattern) { - // 获取失效的key - String expiredKey = message.toString(); - logger.debug(expiredKey); - // 订阅到期 - String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_"; - if (expiredKey.startsWith(PLATFORM_KEEPLIVEKEY_PREFIX)) { - // 取消定时任务 - dynamicTask.stop(expiredKey); - } - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index d511f421..7e5ecb49 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -2,17 +2,14 @@ package com.genersoft.iot.vmp.gb28181.event.subscribe.catalog; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; -import com.genersoft.iot.vmp.gb28181.event.platformNotRegister.PlatformNotRegisterEvent; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IGbStreamService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +28,7 @@ public class CatalogEventLister implements ApplicationListener { private final static Logger logger = LoggerFactory.getLogger(CatalogEventLister.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired @@ -47,7 +44,7 @@ public class CatalogEventLister implements ApplicationListener { private SipConfig config; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private IGbStreamService gbStreamService; @@ -63,13 +60,13 @@ public class CatalogEventLister implements ApplicationListener { Map> parentPlatformMap = new HashMap<>(); if (event.getPlatformId() != null) { parentPlatform = storager.queryParentPlatByServerGBId(event.getPlatformId()); - if (parentPlatform != null && !parentPlatform.isStatus())return; - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + event.getPlatformId(); -// subscribe = redisCatchStorage.getSubscribe(key); + if (parentPlatform != null && !parentPlatform.isStatus()) { + return; + } subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); if (subscribe == null) { - logger.debug("发送订阅消息时发现订阅信息已经不存在"); + logger.info("发送订阅消息时发现订阅信息已经不存在"); return; } }else { @@ -85,7 +82,9 @@ public class CatalogEventLister implements ApplicationListener { }else if (event.getGbStreams() != null) { if (platforms.size() > 0) { for (GbStream gbStream : event.getGbStreams()) { - if (gbStream == null || StringUtils.isEmpty(gbStream.getGbId())) continue; + if (gbStream == null || StringUtils.isEmpty(gbStream.getGbId())) { + continue; + } List parentPlatformsForGB = storager.queryPlatFormListForStreamWithGBId(gbStream.getApp(),gbStream.getStream(), platforms); parentPlatformMap.put(gbStream.getGbId(), parentPlatformsForGB); } @@ -104,7 +103,7 @@ public class CatalogEventLister implements ApplicationListener { } if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ for (GbStream gbStream : event.getGbStreams()) { - DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); + DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform); deviceChannelList.add(deviceChannelByStream); } } @@ -118,7 +117,9 @@ public class CatalogEventLister implements ApplicationListener { if (parentPlatforms != null && parentPlatforms.size() > 0) { for (ParentPlatform platform : parentPlatforms) { SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId()); - if (subscribeInfo == null) continue; + if (subscribeInfo == null) { + continue; + } logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId); List deviceChannelList = new ArrayList<>(); DeviceChannel deviceChannel = new DeviceChannel(); @@ -143,7 +144,10 @@ public class CatalogEventLister implements ApplicationListener { } if (event.getGbStreams() != null && event.getGbStreams().size() > 0){ for (GbStream gbStream : event.getGbStreams()) { - DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform.getDeviceGBId()); + DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), parentPlatform); + if (deviceChannelByStream.getParentId().length() <= 10) { // 父节点是行政区划,则设置CivilCode使用此行政区划 + deviceChannelByStream.setCivilCode(deviceChannelByStream.getParentId()); + } deviceChannelList.add(deviceChannelByStream); } } @@ -156,18 +160,20 @@ public class CatalogEventLister implements ApplicationListener { List parentPlatforms = parentPlatformMap.get(gbId); if (parentPlatforms != null && parentPlatforms.size() > 0) { for (ParentPlatform platform : parentPlatforms) { -// String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + platform.getServerGBId(); -// SubscribeInfo subscribeInfo = redisCatchStorage.getSubscribe(key); - SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); - if (subscribeInfo == null) continue; + SubscribeInfo subscribeInfo = subscribeHolder.getCatalogSubscribe(platform.getServerGBId()); + if (subscribeInfo == null) { + continue; + } logger.info("[Catalog事件: {}]平台:{},影响通道{}", event.getType(), platform.getServerGBId(), gbId); List deviceChannelList = new ArrayList<>(); DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(platform.getServerGBId(), gbId); deviceChannelList.add(deviceChannel); GbStream gbStream = storager.queryStreamInParentPlatform(platform.getServerGBId(), gbId); - DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), platform.getDeviceGBId()); - deviceChannelList.add(deviceChannelByStream); - sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo, null); + if(gbStream != null){ + DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStream(gbStream, gbStream.getCatalogId(), platform); + deviceChannelList.add(deviceChannelByStream); + } + sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), platform, deviceChannelList, subscribeInfo, null); } } } @@ -178,3 +184,4 @@ public class CatalogEventLister implements ApplicationListener { } } } + \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java index e3b39749..62393d52 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java @@ -3,9 +3,10 @@ package com.genersoft.iot.vmp.gb28181.session; import com.genersoft.iot.vmp.gb28181.bean.CatalogData; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -23,52 +24,119 @@ public class CatalogDataCatch { private DeferredResultHolder deferredResultHolder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; - public void put(String key, int total, Device device, List deviceChannelList) { - CatalogData catalogData = data.get(key); + public void addReady(Device device, int sn ) { + CatalogData catalogData = data.get(device.getDeviceId()); + if (catalogData == null || catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end)) { + catalogData = new CatalogData(); + catalogData.setChannelList(new ArrayList<>()); + catalogData.setDevice(device); + catalogData.setSn(sn); + catalogData.setStatus(CatalogData.CatalogDataStatus.ready); + catalogData.setLastTime(new Date(System.currentTimeMillis())); + data.put(device.getDeviceId(), catalogData); + } + } + + public void put(String deviceId, int sn, int total, Device device, List deviceChannelList) { + CatalogData catalogData = data.get(deviceId); if (catalogData == null) { catalogData = new CatalogData(); + catalogData.setSn(sn); catalogData.setTotal(total); catalogData.setDevice(device); catalogData.setChannelList(new ArrayList<>()); - data.put(key, catalogData); + catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); + catalogData.setLastTime(new Date(System.currentTimeMillis())); + data.put(deviceId, catalogData); + }else { + // 同一个设备的通道同步请求只考虑一个,其他的直接忽略 + if (catalogData.getSn() != sn) { + return; + } + catalogData.setTotal(total); + catalogData.setDevice(device); + catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); + catalogData.getChannelList().addAll(deviceChannelList); + catalogData.setLastTime(new Date(System.currentTimeMillis())); } - catalogData.getChannelList().addAll(deviceChannelList); - catalogData.setLastTime(new Date(System.currentTimeMillis())); } - public List get(String key) { - CatalogData catalogData = data.get(key); - if (catalogData == null) return null; + public List get(String deviceId) { + CatalogData catalogData = data.get(deviceId); + if (catalogData == null) { + return null; + } return catalogData.getChannelList(); } - public void del(String key) { - data.remove(key); + public int getTotal(String deviceId) { + CatalogData catalogData = data.get(deviceId); + if (catalogData == null) { + return 0; + } + return catalogData.getTotal(); + } + + public SyncStatus getSyncStatus(String deviceId) { + CatalogData catalogData = data.get(deviceId); + if (catalogData == null) { + return null; + } + SyncStatus syncStatus = new SyncStatus(); + syncStatus.setCurrent(catalogData.getChannelList().size()); + syncStatus.setTotal(catalogData.getTotal()); + syncStatus.setErrorMsg(catalogData.getErrorMsg()); + return syncStatus; + } + + public boolean isSyncRunning(String deviceId) { + CatalogData catalogData = data.get(deviceId); + if (catalogData == null) { + return false; + } + return !catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end); } @Scheduled(fixedRate = 5 * 1000) //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时 private void timerTask(){ Set keys = data.keySet(); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(new Date()); - calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 5); - for (String key : keys) { - CatalogData catalogData = data.get(key); - if (catalogData.getLastTime().before(calendar.getTime())) { + Calendar calendarBefore5S = Calendar.getInstance(); + calendarBefore5S.setTime(new Date()); + calendarBefore5S.set(Calendar.SECOND, calendarBefore5S.get(Calendar.SECOND) - 5); - storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList()); - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - WVPResult result = new WVPResult<>(); - result.setCode(0); - result.setMsg("更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条"); - result.setData(catalogData.getDevice()); - msg.setData(result); - deferredResultHolder.invokeAllResult(msg); - data.remove(key); + Calendar calendarBefore30S = Calendar.getInstance(); + calendarBefore30S.setTime(new Date()); + calendarBefore30S.set(Calendar.SECOND, calendarBefore30S.get(Calendar.SECOND) - 30); + for (String deviceId : keys) { + CatalogData catalogData = data.get(deviceId); + if ( catalogData.getLastTime().before(calendarBefore5S.getTime())) { // 超过五秒收不到消息任务超时, 只更新这一部分数据 + if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.runIng)) { + storager.resetChannels(catalogData.getDevice().getDeviceId(), catalogData.getChannelList()); + if (catalogData.getTotal() != catalogData.getChannelList().size()) { + String errorMsg = "更新成功,共" + catalogData.getTotal() + "条,已更新" + catalogData.getChannelList().size() + "条"; + catalogData.setErrorMsg(errorMsg); + } + }else if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.ready)) { + String errorMsg = "同步失败,等待回复超时"; + catalogData.setErrorMsg(errorMsg); + } + catalogData.setStatus(CatalogData.CatalogDataStatus.end); + } + if (catalogData.getStatus().equals(CatalogData.CatalogDataStatus.end) && catalogData.getLastTime().before(calendarBefore30S.getTime())) { // 超过三十秒,如果标记为end则删除 + data.remove(deviceId); } } } + + + public void setChannelSyncEnd(String deviceId, String errorMsg) { + CatalogData catalogData = data.get(deviceId); + if (catalogData == null) { + return; + } + catalogData.setStatus(CatalogData.CatalogDataStatus.end); + catalogData.setErrorMsg(errorMsg); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java index ac54c2d9..2812c7df 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java @@ -136,4 +136,7 @@ public class SsrcConfig { this.notUsed = notUsed; } + public boolean checkSsrc(String ssrcInResponse) { + return !isUsed.contains(ssrcInResponse); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java index ba8f24c1..8d72a282 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java @@ -7,7 +7,7 @@ import javax.sip.ClientTransaction; import javax.sip.Dialog; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.utils.SerializeUtils; import com.genersoft.iot.vmp.utils.redis.RedisUtil; @@ -28,7 +28,13 @@ public class VideoStreamSessionManager { private RedisUtil redisUtil; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; + + public enum SessionType { + play, + playback, + download + } /** * 添加一个点播/回放的事务信息 @@ -40,7 +46,7 @@ public class VideoStreamSessionManager { * @param mediaServerId 所使用的流媒体ID * @param transaction 事务 */ - public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, ClientTransaction transaction){ + public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, ClientTransaction transaction, SessionType type){ SsrcTransaction ssrcTransaction = new SsrcTransaction(); ssrcTransaction.setDeviceId(deviceId); ssrcTransaction.setChannelId(channelId); @@ -50,10 +56,11 @@ public class VideoStreamSessionManager { ssrcTransaction.setCallId(callId); ssrcTransaction.setSsrc(ssrc); ssrcTransaction.setMediaServerId(mediaServerId); + ssrcTransaction.setType(type); - redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction); - redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction); } @@ -63,7 +70,7 @@ public class VideoStreamSessionManager { byte[] dialogByteArray = SerializeUtils.serialize(dialog); ssrcTransaction.setDialog(dialogByteArray); } - redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream(), ssrcTransaction); } @@ -71,7 +78,9 @@ public class VideoStreamSessionManager { public ClientTransaction getTransactionByStream(String deviceId, String channelId, String stream){ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) return null; + if (ssrcTransaction == null) { + return null; + } byte[] transactionByteArray = ssrcTransaction.getTransaction(); ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray); return clientTransaction; @@ -79,39 +88,63 @@ public class VideoStreamSessionManager { public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) return null; + if (ssrcTransaction == null) { + return null; + } byte[] dialogByteArray = ssrcTransaction.getDialog(); - if (dialogByteArray == null) return null; + if (dialogByteArray == null) { + return null; + } SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); return dialog; } public SIPDialog getDialogByCallId(String deviceId, String channelId, String callID){ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callID, null); - if (ssrcTransaction == null) return null; + if (ssrcTransaction == null) { + return null; + } byte[] dialogByteArray = ssrcTransaction.getDialog(); - if (dialogByteArray == null) return null; + if (dialogByteArray == null) { + return null; + } SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); return dialog; } public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){ - if (StringUtils.isEmpty(callId)) callId ="*"; - if (StringUtils.isEmpty(stream)) stream ="*"; - String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; + if (StringUtils.isEmpty(callId)) { + callId ="*"; + } + if (StringUtils.isEmpty(stream)) { + stream ="*"; + } + String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; List scanResult = redisUtil.scan(key); - if (scanResult.size() == 0) return null; + if (scanResult.size() == 0) { + return null; + } return (SsrcTransaction)redisUtil.get((String) scanResult.get(0)); } public List getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){ - if (StringUtils.isEmpty(deviceId)) deviceId ="*"; - if (StringUtils.isEmpty(channelId)) channelId ="*"; - if (StringUtils.isEmpty(callId)) callId ="*"; - if (StringUtils.isEmpty(stream)) stream ="*"; - String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; + if (StringUtils.isEmpty(deviceId)) { + deviceId ="*"; + } + if (StringUtils.isEmpty(channelId)) { + channelId ="*"; + } + if (StringUtils.isEmpty(callId)) { + callId ="*"; + } + if (StringUtils.isEmpty(stream)) { + stream ="*"; + } + String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream; List scanResult = redisUtil.scan(key); - if (scanResult.size() == 0) return null; + if (scanResult.size() == 0) { + return null; + } List result = new ArrayList<>(); for (Object keyObj : scanResult) { result.add((SsrcTransaction)redisUtil.get((String) keyObj)); @@ -121,26 +154,32 @@ public class VideoStreamSessionManager { public String getMediaServerId(String deviceId, String channelId, String stream){ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) return null; + if (ssrcTransaction == null) { + return null; + } return ssrcTransaction.getMediaServerId(); } public String getSSRC(String deviceId, String channelId, String stream){ SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) return null; + if (ssrcTransaction == null) { + return null; + } return ssrcTransaction.getSsrc(); } public void remove(String deviceId, String channelId, String stream) { SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) return; - redisUtil.del(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetup.getServerId() + "_" + if (ssrcTransaction == null) { + return; + } + redisUtil.del(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream()); } public List getAllSsrc() { - List ssrcTransactionKeys = redisUtil.scan(String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetup.getServerId() + "_" )); + List ssrcTransactionKeys = redisUtil.scan(String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetting.getServerId() + "_" )); List result= new ArrayList<>(); for (int i = 0; i < ssrcTransactionKeys.size(); i++) { String key = (String)ssrcTransactionKeys.get(i); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java deleted file mode 100644 index 4b21638c..00000000 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.genersoft.iot.vmp.gb28181.task; - -import com.genersoft.iot.vmp.gb28181.bean.GbStream; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; -import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; -import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; -import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; - -import java.text.SimpleDateFormat; -import java.util.List; - -public class GPSSubscribeTask implements Runnable{ - - private IRedisCatchStorage redisCatchStorage; - private IVideoManagerStorager storager; - private ISIPCommanderForPlatform sipCommanderForPlatform; - private SubscribeHolder subscribeHolder; - private String platformId; - private String sn; - private String key; - - private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - public GPSSubscribeTask(IRedisCatchStorage redisCatchStorage, ISIPCommanderForPlatform sipCommanderForPlatform, IVideoManagerStorager storager, String platformId, String sn, String key, SubscribeHolder subscribeInfo) { - this.redisCatchStorage = redisCatchStorage; - this.storager = storager; - this.platformId = platformId; - this.sn = sn; - this.key = key; - this.sipCommanderForPlatform = sipCommanderForPlatform; - this.subscribeHolder = subscribeInfo; - } - - @Override - public void run() { - - SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platformId); - - if (subscribe != null) { - ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); - if (parentPlatform == null || parentPlatform.isStatus()) { - // TODO 暂时只处理视频流的回复,后续增加对国标设备的支持 - List gbStreams = storager.queryGbStreamListInPlatform(platformId); - if (gbStreams.size() > 0) { - for (GbStream gbStream : gbStreams) { - String gbId = gbStream.getGbId(); - GPSMsgInfo gpsMsgInfo = redisCatchStorage.getGpsMsgInfo(gbId); - if (gbStream.isStatus()) { - if (gpsMsgInfo != null) { - // 发送GPS消息 - sipCommanderForPlatform.sendNotifyMobilePosition(parentPlatform, gpsMsgInfo, subscribe); - }else { - // 没有在redis找到新的消息就使用数据库的消息 - gpsMsgInfo = new GPSMsgInfo(); - gpsMsgInfo.setId(gbId); - gpsMsgInfo.setLat(gbStream.getLongitude()); - gpsMsgInfo.setLng(gbStream.getLongitude()); - // 发送GPS消息 - sipCommanderForPlatform.sendNotifyMobilePosition(parentPlatform, gpsMsgInfo, subscribe); - } - } - - } - } - } - } - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java new file mode 100644 index 00000000..c7a16ee5 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java @@ -0,0 +1,12 @@ +package com.genersoft.iot.vmp.gb28181.task; + +import javax.sip.DialogState; + +/** + * @author lin + */ +public interface ISubscribeTask extends Runnable{ + void stop(); + + DialogState getDialogState(); +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java new file mode 100644 index 00000000..577e7240 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java @@ -0,0 +1,102 @@ +package com.genersoft.iot.vmp.gb28181.task.impl; + +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import javax.sip.Dialog; +import javax.sip.DialogState; +import javax.sip.ResponseEvent; +import java.util.Timer; +import java.util.TimerTask; + +/** + * 目录订阅任务 + * @author lin + */ +public class CatalogSubscribeTask implements ISubscribeTask { + private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class); + private Device device; + private final ISIPCommander sipCommander; + private Dialog dialog; + + private DynamicTask dynamicTask; + + private String taskKey = "catalog-subscribe-timeout"; + + + public CatalogSubscribeTask(Device device, ISIPCommander sipCommander, DynamicTask dynamicTask) { + this.device = device; + this.sipCommander = sipCommander; + this.dynamicTask = dynamicTask; + } + + @Override + public void run() { + if (dynamicTask.get(taskKey) != null) { + dynamicTask.stop(taskKey); + } + sipCommander.catalogSubscribe(device, dialog, eventResult -> { + if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { + dialog = eventResult.dialog; + } + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 成功 + logger.info("[目录订阅]成功: {}", device.getDeviceId()); + }else { + // 成功 + logger.info("[目录订阅]成功: {}", device.getDeviceId()); + } + },eventResult -> { + dialog = null; + // 失败 + logger.warn("[目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); + dynamicTask.startDelay(taskKey, CatalogSubscribeTask.this, 2000); + }); + } + + @Override + public void stop() { + /** + * dialog 的各个状态 + * EARLY-> Early state状态-初始请求发送以后,收到了一个临时响应消息 + * CONFIRMED-> Confirmed Dialog状态-已确认 + * COMPLETED-> Completed Dialog状态-已完成 + * TERMINATED-> Terminated Dialog状态-终止 + */ + logger.info("取消目录订阅时dialog状态为{}", DialogState.CONFIRMED); + if (dynamicTask.get(taskKey) != null) { + dynamicTask.stop(taskKey); + } + if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { + device.setSubscribeCycleForCatalog(0); + sipCommander.catalogSubscribe(device, dialog, eventResult -> { + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 成功 + logger.info("[取消目录订阅订阅]成功: {}", device.getDeviceId()); + }else { + // 成功 + logger.info("[取消目录订阅订阅]成功: {}", device.getDeviceId()); + } + },eventResult -> { + // 失败 + logger.warn("[取消目录订阅订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); + }); + } + } + + @Override + public DialogState getDialogState() { + if (dialog == null) { + return null; + } + return dialog.getState(); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java new file mode 100644 index 00000000..c416766e --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java @@ -0,0 +1,95 @@ +package com.genersoft.iot.vmp.gb28181.task.impl; + +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; + +import javax.sip.DialogState; +import java.util.List; + +/** + * 向已经订阅(移动位置)的上级发送MobilePosition消息 + * @author lin + */ +public class MobilePositionSubscribeHandlerTask implements ISubscribeTask { + + private Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeHandlerTask.class); + + private IRedisCatchStorage redisCatchStorage; + private IVideoManagerStorage storager; + private ISIPCommanderForPlatform sipCommanderForPlatform; + private SubscribeHolder subscribeHolder; + private ParentPlatform platform; + + private String sn; + private String key; + + public MobilePositionSubscribeHandlerTask(IRedisCatchStorage redisCatchStorage, + ISIPCommanderForPlatform sipCommanderForPlatform, + IVideoManagerStorage storager, + String platformId, + String sn, + String key, + SubscribeHolder subscribeInfo, + DynamicTask dynamicTask) { + this.redisCatchStorage = redisCatchStorage; + this.storager = storager; + this.platform = storager.queryParentPlatByServerGBId(platformId); + this.sn = sn; + this.key = key; + this.sipCommanderForPlatform = sipCommanderForPlatform; + this.subscribeHolder = subscribeInfo; + } + + @Override + public void run() { + + if (platform == null) { + return; + } + SubscribeInfo subscribe = subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId()); + if (subscribe != null) { + +// if (!parentPlatform.isStatus()) { +// logger.info("发送订阅时发现平台已经离线:{}", platformId); +// return; +// } + // TODO 暂时只处理视频流的回复,后续增加对国标设备的支持 + List gbStreams = storager.queryGbStreamListInPlatform(platform.getServerGBId()); + if (gbStreams.size() == 0) { + logger.info("发送订阅时发现平台已经没有关联的直播流:{}", platform.getServerGBId()); + return; + } + for (GbStream gbStream : gbStreams) { + String gbId = gbStream.getGbId(); + GPSMsgInfo gpsMsgInfo = redisCatchStorage.getGpsMsgInfo(gbId); + if (gpsMsgInfo != null) { // 无最新位置不发送 + logger.info("无最新位置不发送"); + // 经纬度都为0不发送 + if (gpsMsgInfo.getLng() == 0 && gpsMsgInfo.getLat() == 0) { + continue; + } + // 发送GPS消息 + sipCommanderForPlatform.sendNotifyMobilePosition(platform, gpsMsgInfo, subscribe); + } + } + } + } + + @Override + public void stop() { + + } + + @Override + public DialogState getDialogState() { + return null; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java new file mode 100644 index 00000000..cf1f7cf6 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java @@ -0,0 +1,99 @@ +package com.genersoft.iot.vmp.gb28181.task.impl; + +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import org.dom4j.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; + +import javax.sip.Dialog; +import javax.sip.DialogState; +import javax.sip.ResponseEvent; +import java.util.Timer; +import java.util.TimerTask; + +/** + * 移动位置订阅的定时更新 + * @author lin + */ +public class MobilePositionSubscribeTask implements ISubscribeTask { + private final Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeTask.class); + private Device device; + private ISIPCommander sipCommander; + private Dialog dialog; + private DynamicTask dynamicTask; + private String taskKey = "mobile-position-subscribe-timeout"; + + public MobilePositionSubscribeTask(Device device, ISIPCommander sipCommander, DynamicTask dynamicTask) { + this.device = device; + this.sipCommander = sipCommander; + this.dynamicTask = dynamicTask; + } + + @Override + public void run() { + if (dynamicTask.get(taskKey) != null) { + dynamicTask.stop(taskKey); + } + sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { +// if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { +// dialog = eventResult.dialog; +// } + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 成功 + logger.info("[移动位置订阅]成功: {}", device.getDeviceId()); + }else { + // 成功 + logger.info("[移动位置订阅]成功: {}", device.getDeviceId()); + } + },eventResult -> { + dialog = null; + // 失败 + logger.warn("[移动位置订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); + dynamicTask.startDelay(taskKey, MobilePositionSubscribeTask.this, 2000); + }); + + } + + @Override + public void stop() { + /** + * dialog 的各个状态 + * EARLY-> Early state状态-初始请求发送以后,收到了一个临时响应消息 + * CONFIRMED-> Confirmed Dialog状态-已确认 + * COMPLETED-> Completed Dialog状态-已完成 + * TERMINATED-> Terminated Dialog状态-终止 + */ + if (dynamicTask.get(taskKey) != null) { + dynamicTask.stop(taskKey); + } + if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { + logger.info("取消移动订阅时dialog状态为{}", dialog.getState()); + device.setSubscribeCycleForMobilePosition(0); + sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 成功 + logger.info("[取消移动位置订阅]成功: {}", device.getDeviceId()); + }else { + // 成功 + logger.info("[取消移动位置订阅]成功: {}", device.getDeviceId()); + } + },eventResult -> { + // 失败 + logger.warn("[取消移动位置订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); + }); + } + } + @Override + public DialogState getDialogState() { + if (dialog == null) { + return null; + } + return dialog.getState(); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java index 6439e8cc..a9c9089c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java @@ -4,7 +4,6 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; -import gov.nist.javax.sip.message.SIPRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +13,6 @@ import org.springframework.stereotype.Component; import javax.sip.*; import javax.sip.header.CSeqHeader; import javax.sip.header.CallIdHeader; -import javax.sip.header.Header; import javax.sip.message.Response; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -36,6 +34,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @Autowired private SipSubscribe sipSubscribe; + // @Autowired // @Qualifier(value = "taskExecutor") // private ThreadPoolTaskExecutor poolTaskExecutor; @@ -63,7 +62,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { * @param processor 处理程序 */ public void addTimeoutProcessor(ITimeoutProcessor processor) { - this.timeoutProcessor = processor; + timeoutProcessor = processor; } /** diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java index dff74cfe..8a2e9009 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java @@ -29,6 +29,7 @@ public class CheckForAllRecordsThread extends Thread { this.recordInfo = recordInfo; } + @Override public void run() { String cacheKey = this.key; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java index ac77f7b9..cfb13c34 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java @@ -35,7 +35,7 @@ public class DeferredResultHolder { public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY"; - public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAY"; + public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAYBACK"; public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD"; @@ -65,12 +65,16 @@ public class DeferredResultHolder { public DeferredResult get(String key, String id) { Map deferredResultMap = map.get(key); - if (deferredResultMap == null) return null; + if (deferredResultMap == null) { + return null; + } return deferredResultMap.get(id); } public boolean exist(String key, String id){ - if (key == null) return false; + if (key == null) { + return false; + } Map deferredResultMap = map.get(key); if (id == null) { return deferredResultMap != null; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java index 409eedbf..f4bcbb64 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java @@ -1,13 +1,14 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.bean.SSRCInfo; +import javax.sip.Dialog; + /** * @description:设备能力接口,用于定义设备的控制、查询能力 * @author: swwheihei @@ -22,7 +23,6 @@ public interface ISIPCommander { * @param channelId 预览通道 * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 * @param upDown 镜头上移下移 0:停止 1:上移 2:下移 - * @param moveSpeed 镜头移动速度 */ boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown); @@ -52,7 +52,6 @@ public interface ISIPCommander { * @param device 控制设备 * @param channelId 预览通道 * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 - * @param zoomSpeed 镜头缩放速度 */ boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed); @@ -87,15 +86,15 @@ public interface ISIPCommander { * @param channelId 预览通道 * @param cmdString 前端控制指令串 */ - boolean fronEndCmd(Device device, String channelId, String cmdString); + boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent); /** * 请求预览视频流 * @param device 视频设备 * @param channelId 预览通道 */ - void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent); - + void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); + /** * 请求回放视频流 * @@ -115,7 +114,9 @@ public interface ISIPCommander { * @param endTime 结束时间,格式要求:yyyy-MM-dd HH:mm:ss * @param downloadSpeed 下载倍速参数 */ - void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, String startTime, String endTime, String downloadSpeed, InviteStreamCallback event, SipSubscribe.Event errorEvent); + void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, + String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, + SipSubscribe.Event errorEvent); /** * 视频流停止 @@ -179,7 +180,6 @@ public interface ISIPCommander { * 报警布防/撤防命令 * * @param device 视频设备 - * @param setGuard true: SetGuard, false: ResetGuard */ boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent); @@ -249,7 +249,7 @@ public interface ISIPCommander { * * @param device 视频设备 */ - boolean catalogQuery(Device device, SipSubscribe.Event errorEvent); + boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent); /** * 查询录像信息 @@ -303,11 +303,9 @@ public interface ISIPCommander { * 订阅、取消订阅移动位置 * * @param device 视频设备 - * @param expires 订阅超时时间(值=0时为取消订阅) - * @param interval 上报时间间隔 * @return true = 命令发送成功 */ - boolean mobilePositionSubscribe(Device device, int expires, int interval); + boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent); /** * 订阅、取消订阅报警信息 @@ -315,7 +313,6 @@ public interface ISIPCommander { * @param expires 订阅过期时间(0 = 取消订阅) * @param startPriority 报警起始级别(可选) * @param endPriority 报警终止级别(可选) - * @param alarmMethods 报警方式条件(可选) * @param alarmType 报警类型 * @param startTime 报警发生起始时间(可选) * @param endTime 报警发生终止时间(可选) @@ -328,7 +325,7 @@ public interface ISIPCommander { * @param device 视频设备 * @return true = 命令发送成功 */ - boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); + boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); /** * 拉框控制命令 @@ -338,4 +335,13 @@ public interface ISIPCommander { * @param cmdString 前端控制指令串 */ boolean dragZoomCmd(Device device, String channelId, String cmdString); + + + /** + * 向设备发送报警NOTIFY消息, 用于互联结构下,此时将设备当成一个平级平台看待 + * @param device 设备 + * @param deviceAlarm 报警信息信息 + * @return + */ + boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java index 1f58a151..7007e5a6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java @@ -1,9 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; -import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; @@ -46,6 +43,7 @@ public interface ISIPCommanderForPlatform { * @return */ boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size); + boolean catalogQuery(List channels, ParentPlatform parentPlatform, String sn, String fromTag); /** * 向上级回复DeviceInfo查询信息 @@ -74,6 +72,14 @@ public interface ISIPCommanderForPlatform { */ boolean sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo); + /** + * 向上级回复报警消息 + * @param parentPlatform 平台信息 + * @param deviceAlarm 报警信息信息 + * @return + */ + boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm); + /** * 回复catalog事件-增加/更新 * @param parentPlatform diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java index 43e26909..7d67e821 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java @@ -223,7 +223,7 @@ public class SIPRequestHeaderPlarformProvider { CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.MESSAGE), Request.MESSAGE); MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); // 设置编码, 防止中文乱码 - messageFactory.setDefaultContentEncodingCharset("gb2312"); + messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet()); request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); List agentParam = new ArrayList<>(); @@ -235,58 +235,4 @@ public class SIPRequestHeaderPlarformProvider { request.setContent(content, contentTypeHeader); return request; } - -// public Request createNotifyRequest(ParentPlatform parentPlatform, String content, CallIdHeader callIdHeader, String viaTag, String fromTag, SubscribeInfo subscribeInfo) throws PeerUnavailableException, ParseException, InvalidArgumentException { -// Request request = null; -// // sipuri -// SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort()); -// // via -// ArrayList viaHeaders = new ArrayList(); -// ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()), -// parentPlatform.getTransport(), viaTag); -// viaHeader.setRPort(); -// viaHeaders.add(viaHeader); -// // from -// SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), -// parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort()); -// Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); -// FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); -// // to -// SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain()); -// Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); -// ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, subscribeInfo.getFromTag()); -// -// // Forwards -// MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); -// // ceq -// CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.NOTIFY), Request.NOTIFY); -// MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); -// // 设置编码, 防止中文乱码 -// messageFactory.setDefaultContentEncodingCharset("gb2312"); -// request = messageFactory.createRequest(requestURI, Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader, -// toHeader, viaHeaders, maxForwards); -// List agentParam = new ArrayList<>(); -// agentParam.add("wvp-pro"); -// UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam); -// request.addHeader(userAgentHeader); -// -// EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); -// if (subscribeInfo.getEventId() != null) { -// event.setEventId(subscribeInfo.getEventId()); -// } -// -// request.addHeader(event); -// -// SubscriptionStateHeader active = sipFactory.createHeaderFactory().createSubscriptionStateHeader("active"); -// request.setHeader(active); -// -// String sipAddress = sipConfig.getIp() + ":" + sipConfig.getPort(); -// Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() -// .createSipURI(parentPlatform.getDeviceGBId(), sipAddress)); -// request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); -// -// ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); -// request.setContent(content, contentTypeHeader); -// return request; -// } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java index 1c368bf6..349732b8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java @@ -225,11 +225,16 @@ public class SIPRequestHeaderProvider { return request; } - public Request createInfoRequest(Device device, StreamInfo streamInfo, String content, Long cseq) + public Request createInfoRequest(Device device, StreamInfo streamInfo, String content) throws PeerUnavailableException, ParseException, InvalidArgumentException { Request request = null; - if (streamInfo == null) return null; + if (streamInfo == null) { + return null; + } Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream()); + if (dialog == null) { + return null; + } SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); @@ -255,9 +260,8 @@ public class SIPRequestHeaderProvider { // Forwards MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - if (cseq == null) { - cseq = redisCatchStorage.getCSEQ(Request.INFO); - } + + Long cseq = redisCatchStorage.getCSEQ(Request.INVITE); // ceq CSeqHeader cSeqHeader = sipFactory.createHeaderFactory() .createCSeqHeader(cseq, Request.INFO); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index d2ef5edd..7689a7bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -4,11 +4,8 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; +import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; @@ -20,9 +17,10 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; +import gov.nist.javax.sip.message.MessageFactoryImpl; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; @@ -35,8 +33,7 @@ import org.springframework.util.StringUtils; import javax.sip.*; import javax.sip.address.SipURI; -import javax.sip.header.CallIdHeader; -import javax.sip.header.ViaHeader; +import javax.sip.header.*; import javax.sip.message.Request; import java.lang.reflect.Field; import java.text.ParseException; @@ -56,6 +53,9 @@ public class SIPCommander implements ISIPCommander { @Autowired private SipConfig sipConfig; + @Autowired + private SipFactory sipFactory; + @Autowired @Qualifier(value="tcpSipProvider") private SipProviderImpl tcpSipProvider; @@ -71,13 +71,13 @@ public class SIPCommander implements ISIPCommander { private VideoStreamSessionManager streamSession; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private ZLMHttpHookSubscribe subscribe; @@ -229,13 +229,15 @@ public class SIPCommander implements ISIPCommander { try { String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); StringBuffer ptzXml = new StringBuffer(200); - ptzXml.append("\r\n"); + String charset = device.getCharset(); + ptzXml.append("\r\n"); ptzXml.append("\r\n"); ptzXml.append("DeviceControl\r\n"); ptzXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); ptzXml.append("" + channelId + "\r\n"); ptzXml.append("" + cmdStr + "\r\n"); ptzXml.append("\r\n"); + ptzXml.append("5\r\n"); ptzXml.append("\r\n"); ptzXml.append("\r\n"); @@ -270,13 +272,15 @@ public class SIPCommander implements ISIPCommander { String cmdStr= frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2); logger.debug("控制字符串:" + cmdStr); StringBuffer ptzXml = new StringBuffer(200); - ptzXml.append("\r\n"); + String charset = device.getCharset(); + ptzXml.append("\r\n"); ptzXml.append("\r\n"); ptzXml.append("DeviceControl\r\n"); ptzXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); ptzXml.append("" + channelId + "\r\n"); ptzXml.append("" + cmdStr + "\r\n"); ptzXml.append("\r\n"); + ptzXml.append("5\r\n"); ptzXml.append("\r\n"); ptzXml.append("\r\n"); @@ -301,16 +305,18 @@ public class SIPCommander implements ISIPCommander { * @param cmdString 前端控制指令串 */ @Override - public boolean fronEndCmd(Device device, String channelId, String cmdString) { + public boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) { try { StringBuffer ptzXml = new StringBuffer(200); - ptzXml.append("\r\n"); + String charset = device.getCharset(); + ptzXml.append("\r\n"); ptzXml.append("\r\n"); ptzXml.append("DeviceControl\r\n"); ptzXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); ptzXml.append("" + channelId + "\r\n"); ptzXml.append("" + cmdString + "\r\n"); ptzXml.append("\r\n"); + ptzXml.append("5\r\n"); ptzXml.append("\r\n"); ptzXml.append("\r\n"); @@ -320,7 +326,7 @@ public class SIPCommander implements ISIPCommander { : udpSipProvider.getNewCallId(); Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader); - transmitRequest(device, request); + transmitRequest(device, request, errorEvent, okEvent); return true; } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -334,13 +340,15 @@ public class SIPCommander implements ISIPCommander { * @param channelId 预览通道 * @param event hook订阅 * @param errorEvent sip错误订阅 - */ + */ @Override public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, - ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) { + ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { String streamId = ssrcInfo.getStream(); try { - if (device == null) return; + if (device == null) { + return; + } String streamMode = device.getStreamMode().toUpperCase(); logger.info("{} 分配的ZLM为: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); @@ -365,7 +373,7 @@ public class SIPCommander implements ISIPCommander { content.append("c=IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n"); content.append("t=0 0\r\n"); - if (userSetup.isSeniorSdp()) { + if (userSetting.isSeniorSdp()) { if("TCP-PASSIVE".equals(streamMode)) { content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { @@ -428,8 +436,9 @@ public class SIPCommander implements ISIPCommander { errorEvent.response(e); }), e ->{ // 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值 - streamSession.put(device.getDeviceId(), channelId ,"play", streamId, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction()); + streamSession.put(device.getDeviceId(), channelId ,"play", streamId, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play); streamSession.put(device.getDeviceId(), channelId ,"play", e.dialog); + okEvent.response(e); }); @@ -465,7 +474,7 @@ public class SIPCommander implements ISIPCommander { String streamMode = device.getStreamMode().toUpperCase(); - if (userSetup.isSeniorSdp()) { + if (userSetting.isSeniorSdp()) { if("TCP-PASSIVE".equals(streamMode)) { content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { @@ -537,7 +546,7 @@ public class SIPCommander implements ISIPCommander { transmitRequest(device, request, errorEvent, okEvent -> { ResponseEvent responseEvent = (ResponseEvent) okEvent.event; - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction()); + streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction(), VideoStreamSessionManager.SessionType.playback); streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), okEvent.dialog); }); if (inviteStreamCallback != null) { @@ -558,8 +567,9 @@ public class SIPCommander implements ISIPCommander { * @param downloadSpeed 下载倍速参数 */ @Override - public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, String startTime, String endTime, String downloadSpeed, InviteStreamCallback event - , SipSubscribe.Event errorEvent) { + public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, + String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, + SipSubscribe.Event errorEvent) { try { logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); @@ -572,11 +582,9 @@ public class SIPCommander implements ISIPCommander { content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" " +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n"); - - String streamMode = device.getStreamMode().toUpperCase(); - if (userSetup.isSeniorSdp()) { + if (userSetting.isSeniorSdp()) { if("TCP-PASSIVE".equals(streamMode)) { content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); }else if ("TCP-ACTIVE".equals(streamMode)) { @@ -639,15 +647,20 @@ public class SIPCommander implements ISIPCommander { logger.debug("录像回放添加订阅,订阅内容:" + subscribeKey.toString()); subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ - event.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); + hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); }); Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc()); + if (inviteStreamCallback != null) { + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); + } + transmitRequest(device, request, errorEvent, okEvent->{ + ResponseEvent responseEvent = (ResponseEvent) okEvent.event; + streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction(), VideoStreamSessionManager.SessionType.download); + streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), okEvent.dialog); + }); - ClientTransaction transaction = transmitRequest(device, request, errorEvent); - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), transaction); - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), transaction); } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -683,7 +696,9 @@ public class SIPCommander implements ISIPCommander { if (callId != null) { dialog = streamSession.getDialogByCallId(deviceId, channelId, callId); }else { - if (stream == null) return; + if (stream == null) { + return; + } dialog = streamSession.getDialogByStream(deviceId, channelId, stream); } if (ssrcTransaction != null) { @@ -718,7 +733,7 @@ public class SIPCommander implements ISIPCommander { Request byeRequest = dialog.createRequest(Request.BYE); SipURI byeURI = (SipURI) byeRequest.getRequestURI(); SIPRequest request = (SIPRequest)transaction.getRequest(); - byeURI.setHost(request.getRemoteAddress().getHostName()); + byeURI.setHost(request.getRemoteAddress().getHostAddress()); byeURI.setPort(request.getRemotePort()); ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); String protocol = viaHeader.getTransport().toUpperCase(); @@ -762,7 +777,8 @@ public class SIPCommander implements ISIPCommander { public boolean audioBroadcastCmd(Device device) { try { StringBuffer broadcastXml = new StringBuffer(200); - broadcastXml.append("\r\n"); + String charset = device.getCharset(); + broadcastXml.append("\r\n"); broadcastXml.append("\r\n"); broadcastXml.append("Broadcast\r\n"); broadcastXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -787,7 +803,8 @@ public class SIPCommander implements ISIPCommander { public void audioBroadcastCmd(Device device, SipSubscribe.Event errorEvent) { try { StringBuffer broadcastXml = new StringBuffer(200); - broadcastXml.append("\r\n"); + String charset = device.getCharset(); + broadcastXml.append("\r\n"); broadcastXml.append("\r\n"); broadcastXml.append("Broadcast\r\n"); broadcastXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -819,7 +836,8 @@ public class SIPCommander implements ISIPCommander { public boolean recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -854,7 +872,8 @@ public class SIPCommander implements ISIPCommander { public boolean teleBootCmd(Device device) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -886,7 +905,8 @@ public class SIPCommander implements ISIPCommander { public boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -917,7 +937,8 @@ public class SIPCommander implements ISIPCommander { public boolean alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -961,7 +982,8 @@ public class SIPCommander implements ISIPCommander { public boolean iFrameCmd(Device device, String channelId) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -999,7 +1021,8 @@ public class SIPCommander implements ISIPCommander { public boolean homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceControl\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1067,7 +1090,8 @@ public class SIPCommander implements ISIPCommander { String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("DeviceConfig\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1120,8 +1144,9 @@ public class SIPCommander implements ISIPCommander { @Override public boolean deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) { try { + String charset = device.getCharset(); StringBuffer catalogXml = new StringBuffer(200); - catalogXml.append("\r\n"); + catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("DeviceStatus\r\n"); catalogXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1153,7 +1178,8 @@ public class SIPCommander implements ISIPCommander { public boolean deviceInfoQuery(Device device) { try { StringBuffer catalogXml = new StringBuffer(200); - catalogXml.append("\r\n"); + String charset = device.getCharset(); + catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("DeviceInfo\r\n"); catalogXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1182,13 +1208,14 @@ public class SIPCommander implements ISIPCommander { * @param device 视频设备 */ @Override - public boolean catalogQuery(Device device, SipSubscribe.Event errorEvent) { + public boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) { try { StringBuffer catalogXml = new StringBuffer(200); - catalogXml.append("\r\n"); + String charset = device.getCharset(); + catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); - catalogXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); + catalogXml.append("" + sn + "\r\n"); catalogXml.append("" + device.getDeviceId() + "\r\n"); catalogXml.append("\r\n"); @@ -1224,7 +1251,8 @@ public class SIPCommander implements ISIPCommander { } try { StringBuffer recordInfoXml = new StringBuffer(200); - recordInfoXml.append("\r\n"); + String charset = device.getCharset(); + recordInfoXml.append("\r\n"); recordInfoXml.append("\r\n"); recordInfoXml.append("RecordInfo\r\n"); recordInfoXml.append("" + sn + "\r\n"); @@ -1277,7 +1305,8 @@ public class SIPCommander implements ISIPCommander { String startTime, String endTime, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("Alarm\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1327,7 +1356,8 @@ public class SIPCommander implements ISIPCommander { public boolean deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("ConfigDownload\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1362,7 +1392,8 @@ public class SIPCommander implements ISIPCommander { public boolean presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("PresetQuery\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1396,7 +1427,8 @@ public class SIPCommander implements ISIPCommander { public boolean mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) { try { StringBuffer mobilePostitionXml = new StringBuffer(200); - mobilePostitionXml.append("\r\n"); + String charset = device.getCharset(); + mobilePostitionXml.append("\r\n"); mobilePostitionXml.append("\r\n"); mobilePostitionXml.append("MobilePosition\r\n"); mobilePostitionXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1424,30 +1456,38 @@ public class SIPCommander implements ISIPCommander { * 订阅、取消订阅移动位置 * * @param device 视频设备 - * @param expires 订阅超时时间 - * @param interval 上报时间间隔 * @return true = 命令发送成功 */ - public boolean mobilePositionSubscribe(Device device, int expires, int interval) { + @Override + public boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) { try { StringBuffer subscribePostitionXml = new StringBuffer(200); - subscribePostitionXml.append("\r\n"); + String charset = device.getCharset(); + subscribePostitionXml.append("\r\n"); subscribePostitionXml.append("\r\n"); subscribePostitionXml.append("MobilePosition\r\n"); subscribePostitionXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); subscribePostitionXml.append("" + device.getDeviceId() + "\r\n"); - if (expires > 0) { - subscribePostitionXml.append("" + String.valueOf(interval) + "\r\n"); + if (device.getSubscribeCycleForMobilePosition() > 0) { + subscribePostitionXml.append("" + String.valueOf(device.getMobilePositionSubmissionInterval()) + "\r\n"); } subscribePostitionXml.append("\r\n"); - String tm = Long.toString(System.currentTimeMillis()); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), "z9hG4bK-viaPos-" + tm, "fromTagPos" + tm, null, expires, "presence" ,callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); - transmitRequest(device, request); + Request request; + if (dialog != null) { + logger.info("发送移动位置订阅消息时 dialog的状态为: {}", dialog.getState()); + request = dialog.createRequest(Request.SUBSCRIBE); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + request.setContent(subscribePostitionXml.toString(), contentTypeHeader); + ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForMobilePosition()); + request.addHeader(expireHeader); + }else { + String tm = Long.toString(System.currentTimeMillis()); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + request = headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), "z9hG4bK-viaPos-" + tm, "fromTagPos" + tm, null, device.getSubscribeCycleForMobilePosition(), "presence" ,callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); + } + transmitRequest(device, request, errorEvent, okEvent); return true; @@ -1470,10 +1510,12 @@ public class SIPCommander implements ISIPCommander { * @param endTime 报警发生终止时间(可选) * @return true = 命令发送成功 */ + @Override public boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("Alarm\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -1515,27 +1557,39 @@ public class SIPCommander implements ISIPCommander { } @Override - public boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { + public boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("\r\n"); + String charset = device.getCharset(); + cmdXml.append("\r\n"); cmdXml.append("\r\n"); cmdXml.append("Catalog\r\n"); cmdXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); cmdXml.append("" + device.getDeviceId() + "\r\n"); cmdXml.append("\r\n"); - String tm = Long.toString(System.currentTimeMillis()); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + Request request; + if (dialog != null) { + logger.info("发送目录订阅消息时 dialog的状态为: {}", dialog.getState()); + request = dialog.createRequest(Request.SUBSCRIBE); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + request.setContent(cmdXml.toString(), contentTypeHeader); + ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForMobilePosition()); + request.addHeader(expireHeader); + }else { + String tm = Long.toString(System.currentTimeMillis()); - // 有效时间默认为60秒以上 - Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), "z9hG4bK-viaPos-" + tm, - "fromTagPos" + tm, null, device.getSubscribeCycleForCatalog(), "Catalog" , - callIdHeader); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + // 有效时间默认为60秒以上 + request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), "z9hG4bK-viaPos-" + tm, + "fromTagPos" + tm, null, device.getSubscribeCycleForCatalog(), "Catalog" , + callIdHeader); + + } transmitRequest(device, request, errorEvent, okEvent); - return true; } catch ( NumberFormatException | ParseException | InvalidArgumentException | SipException e) { @@ -1548,7 +1602,8 @@ public class SIPCommander implements ISIPCommander { public boolean dragZoomCmd(Device device, String channelId, String cmdString) { try { StringBuffer dragXml = new StringBuffer(200); - dragXml.append("\r\n"); + String charset = device.getCharset(); + dragXml.append("\r\n"); dragXml.append("\r\n"); dragXml.append("DeviceControl\r\n"); dragXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); @@ -1620,7 +1675,7 @@ public class SIPCommander implements ISIPCommander { content.append("PAUSE RTSP/1.0\r\n"); content.append("CSeq: " + cseq + "\r\n"); content.append("PauseTime: now\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); if (request == null) { return; } @@ -1651,8 +1706,10 @@ public class SIPCommander implements ISIPCommander { content.append("PLAY RTSP/1.0\r\n"); content.append("CSeq: " + cseq + "\r\n"); content.append("Range: npt=now-\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); - if (request == null) return; + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + if (request == null) { + return; + } logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1680,8 +1737,10 @@ public class SIPCommander implements ISIPCommander { content.append("CSeq: " + cseq + "\r\n"); content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); - if (request == null) return; + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + if (request == null) { + return; + } logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1708,8 +1767,10 @@ public class SIPCommander implements ISIPCommander { content.append("PLAY RTSP/1.0\r\n"); content.append("CSeq: " + cseq + "\r\n"); content.append("Scale: " + String.format("%.1f",speed) + "\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq); - if (request == null) return; + Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); + if (request == null) { + return; + } logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { @@ -1724,4 +1785,103 @@ public class SIPCommander implements ISIPCommander { e.printStackTrace(); } } + + @Override + public boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) { + if (device == null) { + return false; + } + logger.info("[发送 报警通知] {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(), + deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); + try { + String characterSet = device.getCharset(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("Alarm\r\n"); + deviceStatusXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getChannelId() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmPriority() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmMethod() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmTime() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmDescription() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getLongitude() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getLatitude() + "\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmType() + "\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + String tm = Long.toString(System.currentTimeMillis()); + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader); + transmitRequest(device, request); + + + } catch (SipException | ParseException e) { + e.printStackTrace(); + return false; + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } + return true; + } + + private void sendNotify(Device device, String catalogXmlContent, + SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) + throws NoSuchFieldException, IllegalAccessException, SipException, ParseException { + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); + String characterSet = device.getCharset(); + // 设置编码, 防止中文乱码 + messageFactory.setDefaultContentEncodingCharset(characterSet); + Dialog dialog = subscribeInfo.getDialog(); + if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) { + return; + } + SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + notifyRequest.setContent(catalogXmlContent, contentTypeHeader); + + SubscriptionStateHeader subscriptionState = sipFactory.createHeaderFactory() + .createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE); + notifyRequest.addHeader(subscriptionState); + + EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); + if (subscribeInfo.getEventId() != null) { + event.setEventId(subscribeInfo.getEventId()); + } + notifyRequest.addHeader(event); + + SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); + if (subscribeInfo.getTransaction() != null) { + SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); + sipURI.setHost(request.getRemoteAddress().getHostAddress()); + sipURI.setPort(request.getRemotePort()); + }else { + sipURI.setHost(device.getIp()); + sipURI.setPort(device.getPort()); + } + + ClientTransaction transaction = null; + if ("TCP".equals(device.getTransport())) { + transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); + } else if ("UDP".equals(device.getTransport())) { + transaction = udpSipProvider.getNewClientTransaction(notifyRequest); + } + // 添加错误订阅 + if (errorEvent != null) { + sipSubscribe.addErrorSubscribe(subscribeInfo.getCallId(), errorEvent); + } + // 添加订阅 + if (okEvent != null) { + sipSubscribe.addOkSubscribe(subscribeInfo.getCallId(), okEvent); + } + if (transaction == null) { + logger.error("平台{}的Transport错误:{}",device.getDeviceId(), device.getTransport()); + return; + } + dialog.sendRequest(transaction); + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index 6f1d031b..2aafd98d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -32,6 +32,7 @@ import javax.sip.header.*; import javax.sip.message.Request; import java.lang.reflect.Field; import java.text.ParseException; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.UUID; @@ -145,9 +146,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { public String keepalive(ParentPlatform parentPlatform) { String callId = null; try { - + String characterSet = parentPlatform.getCharacterSet(); StringBuffer keepaliveXml = new StringBuffer(200); - keepaliveXml.append("\r\n"); + keepaliveXml.append("\r\n"); keepaliveXml.append("\r\n"); keepaliveXml.append("Keepalive\r\n"); keepaliveXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -215,43 +216,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return false; } try { - StringBuffer catalogXml = new StringBuffer(600); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("Catalog\r\n"); - catalogXml.append("" +sn + "\r\n"); - catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); - catalogXml.append("" + size + "\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); + List channels = new ArrayList<>(); if (channel != null) { - catalogXml.append("" + channel.getChannelId() + "\r\n"); - catalogXml.append("" + channel.getName() + "\r\n"); - catalogXml.append("" + channel.getManufacture() + "\r\n"); - catalogXml.append("" + channel.getModel() + "\r\n"); - catalogXml.append("" + channel.getOwner() + "\r\n"); - catalogXml.append("" + channel.getCivilCode() + "\r\n"); - catalogXml.append("
" + channel.getAddress() + "
\r\n"); - catalogXml.append("" + channel.getParental() + "\r\n"); - if (channel.getParentId() != null) { - catalogXml.append("" + channel.getParentId() + "\r\n"); - } - catalogXml.append("" + channel.getSecrecy() + "\r\n"); - catalogXml.append("" + channel.getRegisterWay() + "\r\n"); - catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n"); - catalogXml.append("" + channel.getLongitude() + "\r\n"); - catalogXml.append("" + channel.getLatitude() + "\r\n"); - catalogXml.append("" + channel.getIpAddress() + "\r\n"); - catalogXml.append("" + channel.getPort() + "\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("" + channel.getPTZType() + "\r\n"); - catalogXml.append("\r\n"); + channels.add(channel); } - - - catalogXml.append("
\r\n"); - catalogXml.append("
\r\n"); - catalogXml.append("
\r\n"); + String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); // callid CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() @@ -267,6 +236,92 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return true; } + @Override + public boolean catalogQuery(List channels, ParentPlatform parentPlatform, String sn, String fromTag) { + if ( parentPlatform ==null) { + return false; + } + sendCatalogResponse(channels, parentPlatform, sn, fromTag, 0); + return true; + } + private String getCatalogXml(List channels, String sn, ParentPlatform parentPlatform, int size) { + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer catalogXml = new StringBuffer(600); + catalogXml.append("\r\n"); + catalogXml.append("\r\n"); + catalogXml.append("Catalog\r\n"); + catalogXml.append("" +sn + "\r\n"); + catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); + catalogXml.append("" + size + "\r\n"); + catalogXml.append("\r\n"); + if (channels.size() > 0) { + for (DeviceChannel channel : channels) { + catalogXml.append("\r\n"); + catalogXml.append("" + channel.getChannelId() + "\r\n"); + catalogXml.append("" + channel.getName() + "\r\n"); + catalogXml.append("" + channel.getParental() + "\r\n"); + if (channel.getParentId() != null) { + catalogXml.append("" + channel.getParentId() + "\r\n"); + } + if (channel.getChannelId().length() == 20) { + if (Integer.parseInt(channel.getChannelId().substring(10, 13)) == 216) { // 虚拟组织增加BusinessGroupID字段 + catalogXml.append("" + channel.getParentId() + "\r\n"); + } + catalogXml.append("" + channel.getManufacture() + "\r\n"); + catalogXml.append("" + channel.getRegisterWay() + "\r\n"); + catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n"); + if (channel.getChannelType() != 2) { // 业务分组/虚拟组织/行政区划 不设置以下字段 + catalogXml.append("" + channel.getSecrecy() + "\r\n"); + catalogXml.append("" + channel.getModel() + "\r\n"); + catalogXml.append("" + channel.getOwner() + "\r\n"); + catalogXml.append("" + channel.getCivilCode() + "\r\n"); + catalogXml.append("
" + channel.getAddress() + "
\r\n"); + catalogXml.append("" + channel.getLongitude() + "\r\n"); + catalogXml.append("" + channel.getLatitude() + "\r\n"); + catalogXml.append("" + channel.getIpAddress() + "\r\n"); + catalogXml.append("" + channel.getPort() + "\r\n"); + catalogXml.append("\r\n"); + catalogXml.append("" + channel.getPTZType() + "\r\n"); + catalogXml.append("\r\n"); + } + } + + + catalogXml.append("
\r\n"); + } + } + + catalogXml.append("
\r\n"); + catalogXml.append("
\r\n"); + return catalogXml.toString(); + } + + private void sendCatalogResponse(List channels, ParentPlatform parentPlatform, String sn, String fromTag, int index) { + if (index >= channels.size()) { + return; + } + try { + List deviceChannels; + if (index + parentPlatform.getCatalogGroup() < channels.size()) { + deviceChannels = channels.subList(index, index + parentPlatform.getCatalogGroup()); + }else { + deviceChannels = channels.subList(index, channels.size()); + } + String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); + // callid + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, callIdHeader); + transmitRequest(parentPlatform, request, null, eventResult -> { + int indexNext = index + parentPlatform.getCatalogGroup(); + sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); + }); + } catch (SipException | ParseException | InvalidArgumentException e) { + e.printStackTrace(); + } + } + /** * 向上级回复DeviceInfo查询信息 * @param parentPlatform 平台信息 @@ -280,8 +335,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return false; } try { + String characterSet = parentPlatform.getCharacterSet(); StringBuffer deviceInfoXml = new StringBuffer(600); - deviceInfoXml.append("\r\n"); + deviceInfoXml.append("\r\n"); deviceInfoXml.append("\r\n"); deviceInfoXml.append("DeviceInfo\r\n"); deviceInfoXml.append("" +sn + "\r\n"); @@ -319,8 +375,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return false; } try { + String characterSet = parentPlatform.getCharacterSet(); StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); deviceStatusXml.append("\r\n"); deviceStatusXml.append("DeviceStatus\r\n"); deviceStatusXml.append("" +sn + "\r\n"); @@ -348,10 +405,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { if (parentPlatform == null) { return false; } - + logger.info("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); try { + String characterSet = parentPlatform.getCharacterSet(); StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); deviceStatusXml.append("\r\n"); deviceStatusXml.append("MobilePosition\r\n"); deviceStatusXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); @@ -368,7 +426,6 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { : udpSipProvider.getNewCallId(); callIdHeader.setCallId(subscribeInfo.getCallId()); -// sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> { logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, null); @@ -384,6 +441,48 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return true; } + @Override + public boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm) { + if (parentPlatform == null) { + return false; + } + logger.info("[发送 报警订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), + deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); + try { + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("Alarm\r\n"); + deviceStatusXml.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getChannelId() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmPriority() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmMethod() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmTime() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmDescription() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getLongitude() + "\r\n"); + deviceStatusXml.append("" + deviceAlarm.getLatitude() + "\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("" + deviceAlarm.getAlarmType() + "\r\n"); + deviceStatusXml.append("\r\n"); + deviceStatusXml.append("\r\n"); + + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + String tm = Long.toString(System.currentTimeMillis()); + Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), "FromPtz" + tm, callIdHeader); + transmitRequest(parentPlatform, request); + + } catch (SipException | ParseException e) { + e.printStackTrace(); + return false; + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } + return true; + } + @Override public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List deviceChannels, SubscribeInfo subscribeInfo, Integer index) { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { @@ -395,13 +494,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { if (index >= deviceChannels.size()) { return true; } + List channels; + if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) { + channels = deviceChannels.subList(index, index + parentPlatform.getCatalogGroup()); + }else { + channels = deviceChannels.subList(index, deviceChannels.size()); + } try { Integer finalIndex = index; - String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index ), deviceChannels.size(), type, subscribeInfo); + String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels, + deviceChannels.size(), type, subscribeInfo); sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, (eventResult -> { - sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1); + sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, + finalIndex + parentPlatform.getCatalogGroup()); })); } catch (SipException | ParseException e) { e.printStackTrace(); @@ -418,10 +525,13 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) throws NoSuchFieldException, IllegalAccessException, SipException, ParseException { MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); + String characterSet = parentPlatform.getCharacterSet(); // 设置编码, 防止中文乱码 - messageFactory.setDefaultContentEncodingCharset("gb2312"); + messageFactory.setDefaultContentEncodingCharset(characterSet); Dialog dialog = subscribeInfo.getDialog(); - if (dialog == null) return; + if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) { + return; + } SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); notifyRequest.setContent(catalogXmlContent, contentTypeHeader); @@ -435,11 +545,16 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { event.setEventId(subscribeInfo.getEventId()); } notifyRequest.addHeader(event); - SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); - SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); - sipURI.setHost(request.getRemoteAddress().getHostName()); - sipURI.setPort(request.getRemotePort()); + if (subscribeInfo.getTransaction() != null) { + SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); + sipURI.setHost(request.getRemoteAddress().getHostAddress()); + sipURI.setPort(request.getRemotePort()); + }else { + sipURI.setHost(parentPlatform.getServerIP()); + sipURI.setPort(parentPlatform.getServerPort()); + } + ClientTransaction transaction = null; if ("TCP".equals(parentPlatform.getTransport())) { transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); @@ -462,52 +577,48 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { } -// private Request getCatalogNotifyRequestForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type, -// SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException, -// PeerUnavailableException, NoSuchFieldException, IllegalAccessException { -// String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channel, size, type, subscribeInfo); -// -// CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() -// : udpSipProvider.getNewCallId(); -// callIdHeader.setCallId(subscribeInfo.getCallId()); -// String tm = Long.toString(System.currentTimeMillis()); -// -// Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, -// callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""),"FromRegister" + tm, subscribeInfo); -// return request; -// } - - private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int sumNum, String type, SubscribeInfo subscribeInfo) { + private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List channels, int sumNum, String type, SubscribeInfo subscribeInfo) { StringBuffer catalogXml = new StringBuffer(600); - if (parentPlatform.getServerGBId().equals(channel.getParentId())) { - channel.setParentId(parentPlatform.getDeviceGBId()); - } - catalogXml.append("\r\n"); + + String characterSet = parentPlatform.getCharacterSet(); + catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); catalogXml.append("1\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("" + channel.getChannelId() + "\r\n"); - catalogXml.append("" + channel.getName() + "\r\n"); - catalogXml.append("" + channel.getManufacture() + "\r\n"); - catalogXml.append("" + channel.getModel() + "\r\n"); - catalogXml.append("0\r\n"); - catalogXml.append("CivilCode\r\n"); - catalogXml.append("
" + channel.getAddress() + "
\r\n"); - catalogXml.append("" + channel.getParental() + "\r\n"); - if (channel.getParentId() != null) { - catalogXml.append("" + channel.getParentId() + "\r\n"); + catalogXml.append("\r\n"); + if (channels.size() > 0) { + for (DeviceChannel channel : channels) { + if (parentPlatform.getServerGBId().equals(channel.getParentId())) { + channel.setParentId(parentPlatform.getDeviceGBId()); + } + catalogXml.append("\r\n"); + catalogXml.append("" + channel.getChannelId() + "\r\n"); + catalogXml.append("" + channel.getName() + "\r\n"); + catalogXml.append("" + channel.getManufacture() + "\r\n"); + catalogXml.append("" + channel.getParental() + "\r\n"); + if (channel.getParentId() != null) { + catalogXml.append("" + channel.getParentId() + "\r\n"); + } + catalogXml.append("" + channel.getSecrecy() + "\r\n"); + catalogXml.append("" + channel.getRegisterWay() + "\r\n"); + catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n"); + if (channel.getChannelId().length() == 20 && Integer.parseInt(channel.getChannelId().substring(10, 13)) == 216) { // 虚拟组织增加BusinessGroupID字段 + catalogXml.append("" + channel.getParentId() + "\r\n"); + } + if (channel.getChannelType() == 2) { // 业务分组/虚拟组织/行政区划 不设置以下属性 + catalogXml.append("" + channel.getModel() + "\r\n"); + catalogXml.append("0\r\n"); + catalogXml.append("CivilCode\r\n"); + catalogXml.append("
" + channel.getAddress() + "
\r\n"); + } + if (!"presence".equals(subscribeInfo.getEventType())) { + catalogXml.append("" + type + "\r\n"); + } + catalogXml.append("
\r\n"); + } } - catalogXml.append("" + channel.getSecrecy() + "\r\n"); - catalogXml.append("" + channel.getRegisterWay() + "\r\n"); - catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n"); - if (!"presence".equals(subscribeInfo.getEventType())) { - catalogXml.append("" + type + "\r\n"); - } - catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); catalogXml.append("
\r\n"); return catalogXml.toString(); @@ -529,13 +640,20 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { if (index >= deviceChannels.size()) { return true; } + List channels; + if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) { + channels = deviceChannels.subList(index, index + parentPlatform.getCatalogGroup()); + }else { + channels = deviceChannels.subList(index, deviceChannels.size()); + } try { Integer finalIndex = index; - String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, deviceChannels.get(index), type); + String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type); sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg); }, (eventResult -> { - sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1); + sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, + finalIndex + parentPlatform.getCatalogGroup()); })); } catch (SipException e) { e.printStackTrace(); @@ -550,22 +668,28 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return true; } - private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, DeviceChannel channel, String type) { - if (parentPlatform.getServerGBId().equals(channel.getParentId())) { - channel.setParentId(parentPlatform.getDeviceGBId()); - } + private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, List channels, String type) { + + String characterSet = parentPlatform.getCharacterSet(); StringBuffer catalogXml = new StringBuffer(600); - catalogXml.append("\r\n"); + catalogXml.append("\r\n"); catalogXml.append("\r\n"); catalogXml.append("Catalog\r\n"); catalogXml.append("" + (int) ((Math.random() * 9 + 1) * 100000) + "\r\n"); catalogXml.append("" + parentPlatform.getDeviceGBId() + "\r\n"); catalogXml.append("1\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("\r\n"); - catalogXml.append("" + channel.getChannelId() + "\r\n"); - catalogXml.append("" + type + "\r\n"); - catalogXml.append("\r\n"); + catalogXml.append("\r\n"); + if (channels.size() > 0) { + for (DeviceChannel channel : channels) { + if (parentPlatform.getServerGBId().equals(channel.getParentId())) { + channel.setParentId(parentPlatform.getDeviceGBId()); + } + catalogXml.append("\r\n"); + catalogXml.append("" + channel.getChannelId() + "\r\n"); + catalogXml.append("" + type + "\r\n"); + catalogXml.append("\r\n"); + } + } catalogXml.append("\r\n"); catalogXml.append("\r\n"); return catalogXml.toString(); @@ -576,8 +700,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { return false; } try { + String characterSet = parentPlatform.getCharacterSet(); StringBuffer recordXml = new StringBuffer(600); - recordXml.append("\r\n"); + recordXml.append("\r\n"); recordXml.append("\r\n"); recordXml.append("RecordInfo\r\n"); recordXml.append("" +recordInfo.getSn() + "\r\n"); @@ -661,7 +786,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { SipURI byeURI = (SipURI) byeRequest.getRequestURI(); SIPRequest request = (SIPRequest) clientTransaction.getRequest(); - byeURI.setHost(request.getRemoteAddress().getHostName()); + byeURI.setHost(request.getRemoteAddress().getHostAddress()); byeURI.setPort(request.getRemotePort()); if ("TCP".equals(platform.getTransport())) { clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java index 34d45368..56078f10 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java @@ -139,7 +139,9 @@ public abstract class SIPRequestProcessorParent { serverTransaction.sendResponse(response); if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } } @@ -149,7 +151,9 @@ public abstract class SIPRequestProcessorParent { ServerTransaction serverTransaction = getServerTransaction(evt); serverTransaction.sendResponse(response); if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } } @@ -215,7 +219,9 @@ public abstract class SIPRequestProcessorParent { return getRootElement(evt, "gb2312"); } public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { - if (charset == null) charset = "gb2312"; + if (charset == null) { + charset = "gb2312"; + } Request request = evt.getRequest(); SAXReader reader = new SAXReader(); reader.setEncoding(charset); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java index ec83fa85..0f65bf52 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java @@ -72,7 +72,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In public void process(RequestEvent evt) { Dialog dialog = evt.getDialog(); CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); - if (dialog == null) return; + if (dialog == null) { + return; + } if (dialog.getState()== DialogState.CONFIRMED) { String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); logger.info("ACK请求: platformGbId->{}", platformGbId); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java index e487447a..75318093 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java @@ -2,7 +2,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.InviteStreamType; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; @@ -13,8 +13,9 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.SerializeUtils; import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; @@ -50,7 +51,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In private IRedisCatchStorage redisCatchStorage; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private ZLMRTPServerFactory zlmrtpServerFactory; @@ -80,7 +81,9 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In responseAck(evt, Response.OK); Dialog dialog = evt.getDialog(); CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); - if (dialog == null) return; + if (dialog == null) { + return; + } if (dialog.getState().equals(DialogState.TERMINATED)) { String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); @@ -99,10 +102,20 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In redisCatchStorage.deleteSendRTPServer(platformGbId, channelId, callIdHeader.getCallId(), null); int totalReaderCount = zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId); if (totalReaderCount <= 0) { - logger.info("收到bye: {}无其它观看者,通知设备停止推流", streamId); - if (sendRtpItem.isPlay()) { + logger.info("收到bye: {} 无其它观看者,通知设备停止推流", streamId); + if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) { cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId, streamId, null); } + if (sendRtpItem.getPlayType().equals(InviteStreamType.PUSH)) { + MessageForPushChannel messageForPushChannel = new MessageForPushChannel(); + messageForPushChannel.setType(0); + messageForPushChannel.setGbId(sendRtpItem.getChannelId()); + messageForPushChannel.setApp(sendRtpItem.getApp()); + messageForPushChannel.setStream(sendRtpItem.getStreamId()); + messageForPushChannel.setMediaServerId(sendRtpItem.getMediaServerId()); + messageForPushChannel.setPlatFormId(sendRtpItem.getPlatformId()); + redisCatchStorage.sendStreamPushRequestedMsg(messageForPushChannel); + } } } // 可能是设备主动停止 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index 77b4b322..bb46a71c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -1,14 +1,12 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; -import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; @@ -16,19 +14,18 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; +import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IPlayService; +import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.SerializeUtils; -import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; import gov.nist.javax.sdp.TimeDescriptionImpl; import gov.nist.javax.sdp.fields.TimeField; -import gov.nist.javax.sip.address.AddressImpl; -import gov.nist.javax.sip.address.SipUri; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -36,19 +33,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.sdp.*; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.ServerTransaction; -import javax.sip.SipException; +import javax.sip.*; import javax.sip.address.SipURI; import javax.sip.header.CallIdHeader; -import javax.sip.header.FromHeader; import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.List; import java.util.Vector; /** @@ -66,7 +58,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements private SIPCommanderFroPlatform cmderFroPlatform; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -95,6 +87,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @Autowired private VideoStreamSessionManager sessionManager; + @Autowired + private UserSetting userSetting; + + @Autowired + private ZLMMediaListManager mediaListManager; + @Override public void afterPropertiesSet() throws Exception { @@ -114,7 +112,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements try { Request request = evt.getRequest(); SipURI sipURI = (SipURI) request.getRequestURI(); - String channelId = sipURI.getUser(); + //从subject读取channelId,不再从request-line读取。 有些平台request-line是平台国标编码,不是设备国标编码。 + //String channelId = sipURI.getUser(); + String channelId = SipUtils.getChannelIdFromHeader(request); String requesterId = SipUtils.getUserIdFromFromHeader(request); CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); if (requesterId == null || channelId == null) { @@ -149,12 +149,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements responseAck(evt, Response.GONE); return; } - Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); - if (!streamReady ) { - logger.info("[ app={}, stream={} ]通道离线,返回400",gbStream.getApp(), gbStream.getStream()); - responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline"); - return; - } responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中 }else if (catalog != null) { responseAck(evt, Response.BAD_REQUEST, "catalog channel can not play"); // 目录不支持点播 @@ -221,6 +215,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements mediaTransmissionTCP = true; if ("active".equals(setup)) { tcpActive = true; + // 不支持tcp主动 + responseAck(evt, Response.NOT_IMPLEMENTED, "tcp active not support"); // 目录不支持点播 + return; } else if ("passive".equals(setup)) { tcpActive = false; } @@ -266,13 +263,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements return; } sendRtpItem.setCallId(callIdHeader.getCallId()); - sendRtpItem.setPlay("Play".equals(sessionName)); + sendRtpItem.setPlayType("Play".equals(sessionName)?InviteStreamType.PLAY:InviteStreamType.PLAYBACK); byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog()); sendRtpItem.setDialog(dialogByteArray); byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction()); sendRtpItem.setTransaction(transactionByteArray); - - Long finalStartTime = startTime; Long finalStopTime = stopTime; ZLMHttpHookSubscribe.Event hookEvent = (mediaServerItemInUSe, responseJSON)->{ @@ -308,7 +303,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements mediaServerService.releaseSsrc(mediaServerItemInUSe.getId(), ssrc); // 回复bye cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId()); - }, 60); + }, 60*1000); responseSdpAck(evt, content.toString(), platform); } catch (SipException e) { @@ -326,14 +321,16 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements response = getMessageFactory().createResponse(event.statusCode, evt.getRequest()); ServerTransaction serverTransaction = getServerTransaction(evt); serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } } catch (ParseException | SipException | InvalidArgumentException e) { e.printStackTrace(); } }); sendRtpItem.setApp("rtp"); if ("Playback".equals(sessionName)) { - sendRtpItem.setPlay(false); + sendRtpItem.setPlayType(InviteStreamType.PLAYBACK); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, true); sendRtpItem.setStreamId(ssrcInfo.getStream()); // 写入redis, 超时时回复 @@ -363,7 +360,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements } }); }else { - sendRtpItem.setPlay(true); + sendRtpItem.setPlayType(InviteStreamType.PLAY); SsrcTransaction playTransaction = sessionManager.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); if (playTransaction != null) { Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, "rtp", playTransaction.getStream()); @@ -394,48 +391,109 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements } } }else if (gbStream != null) { - SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, - gbStream.getApp(), gbStream.getStream(), channelId, - mediaTransmissionTCP); - if (tcpActive != null) { - sendRtpItem.setTcpActive(tcpActive); - } - if (sendRtpItem == null) { - logger.warn("服务器端口资源不足"); - responseAck(evt, Response.BUSY_HERE); - return; + Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); + if (!streamReady ) { + if ("proxy".equals(gbStream.getStreamType())) { + // TODO 控制启用以使设备上线 + logger.info("[ app={}, stream={} ]通道离线,启用流后开始推流",gbStream.getApp(), gbStream.getStream()); + responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline"); + }else if ("push".equals(gbStream.getStreamType())) { + if (!platform.isStartOfflinePush()) { + responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel unavailable"); + return; + } + // 发送redis消息以使设备上线 + logger.info("[ app={}, stream={} ]通道离线,发送redis信息控制设备开始推流",gbStream.getApp(), gbStream.getStream()); + MessageForPushChannel messageForPushChannel = new MessageForPushChannel(); + messageForPushChannel.setType(1); + messageForPushChannel.setGbId(gbStream.getGbId()); + messageForPushChannel.setApp(gbStream.getApp()); + messageForPushChannel.setStream(gbStream.getStream()); + // TODO 获取低负载的节点 + messageForPushChannel.setMediaServerId(gbStream.getMediaServerId()); + messageForPushChannel.setPlatFormId(platform.getServerGBId()); + messageForPushChannel.setPlatFormName(platform.getName()); + redisCatchStorage.sendStreamPushRequestedMsg(messageForPushChannel); + // 设置超时 + dynamicTask.startDelay(callIdHeader.getCallId(), ()->{ + logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream()); + try { + mediaListManager.removedChannelOnlineEventLister(gbStream.getGbId()); + responseAck(evt, Response.REQUEST_TIMEOUT); // 超时 + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + }, userSetting.getPlatformPlayTimeout()); + // 添加监听 + MediaServerItem finalMediaServerItem = mediaServerItem; + int finalPort = port; + boolean finalMediaTransmissionTCP = mediaTransmissionTCP; + Boolean finalTcpActive = tcpActive; + mediaListManager.addChannelOnlineEventLister(gbStream.getGbId(), (app, stream)->{ + SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(finalMediaServerItem, addressStr, finalPort, ssrc, requesterId, + app, stream, channelId, finalMediaTransmissionTCP); + + if (sendRtpItem == null) { + logger.warn("服务器端口资源不足"); + try { + responseAck(evt, Response.BUSY_HERE); + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return; + } + if (finalTcpActive != null) { + sendRtpItem.setTcpActive(finalTcpActive); + } + sendRtpItem.setPlayType(InviteStreamType.PUSH); + // 写入redis, 超时时回复 + sendRtpItem.setStatus(1); + sendRtpItem.setCallId(callIdHeader.getCallId()); + byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog()); + sendRtpItem.setDialog(dialogByteArray); + byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction()); + sendRtpItem.setTransaction(transactionByteArray); + redisCatchStorage.updateSendRTPSever(sendRtpItem); + sendStreamAck(finalMediaServerItem, sendRtpItem, platform, evt); + + }); + } + }else { + SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, + gbStream.getApp(), gbStream.getStream(), channelId, + mediaTransmissionTCP); + + + if (sendRtpItem == null) { + logger.warn("服务器端口资源不足"); + responseAck(evt, Response.BUSY_HERE); + return; + } + if (tcpActive != null) { + sendRtpItem.setTcpActive(tcpActive); + } + sendRtpItem.setPlayType(InviteStreamType.PUSH); + // 写入redis, 超时时回复 + sendRtpItem.setStatus(1); + sendRtpItem.setCallId(callIdHeader.getCallId()); + byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog()); + sendRtpItem.setDialog(dialogByteArray); + byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction()); + sendRtpItem.setTransaction(transactionByteArray); + redisCatchStorage.updateSendRTPSever(sendRtpItem); + sendStreamAck(mediaServerItem, sendRtpItem, platform, evt); } - // 写入redis, 超时时回复 - sendRtpItem.setStatus(1); - sendRtpItem.setCallId(callIdHeader.getCallId()); - byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog()); - sendRtpItem.setDialog(dialogByteArray); - byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction()); - sendRtpItem.setTransaction(transactionByteArray); - redisCatchStorage.updateSendRTPSever(sendRtpItem); - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o="+ channelId +" 0 0 IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); - content.append("s=Play\r\n"); - content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); - content.append("t=0 0\r\n"); - content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n"); - content.append("a=sendonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("y="+ ssrc + "\r\n"); - content.append("f=\r\n"); - try { - responseSdpAck(evt, content.toString(), platform); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } } } @@ -451,6 +509,39 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements } } + public void sendStreamAck(MediaServerItem mediaServerItem, SendRtpItem sendRtpItem, ParentPlatform platform, RequestEvent evt){ + + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o="+ sendRtpItem.getChannelId() +" 0 0 IN IP4 "+ mediaServerItem.getSdpIp()+"\r\n"); + content.append("s=Play\r\n"); + content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); + content.append("t=0 0\r\n"); + content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n"); + content.append("a=sendonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + if (sendRtpItem.isTcp()) { + content.append("a=connection:new\r\n"); + if (!sendRtpItem.isTcpActive()) { + content.append("a=setup:active\r\n"); + }else { + content.append("a=setup:passive\r\n"); + } + } + content.append("y="+ sendRtpItem.getSsrc() + "\r\n"); + content.append("f=\r\n"); + + try { + responseSdpAck(evt, content.toString(), platform); + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + } + public void inviteFromDeviceHandle(RequestEvent evt, String requesterId) throws InvalidArgumentException, ParseException, SipException, SdpException { // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java index 3961eeab..98cb3aa9 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java @@ -1,10 +1,10 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; +import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; @@ -12,12 +12,12 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.GpsUtil; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -46,10 +46,10 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements private final static Logger logger = LoggerFactory.getLogger(NotifyRequestProcessor.class); @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private EventPublisher eventPublisher; @@ -63,10 +63,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @Autowired private EventPublisher publisher; - @Autowired - private DeviceOffLineDetector offLineDetector; - - private String method = "NOTIFY"; @Autowired @@ -109,11 +105,15 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements */ private void processNotifyMobilePosition(RequestEvent evt) { try { + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); + String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader); + // 回复 200 OK Element rootElement = getRootElement(evt); + MobilePosition mobilePosition = new MobilePosition(); Element deviceIdElement = rootElement.element("DeviceID"); - String deviceId = deviceIdElement.getTextTrim().toString(); + String channelId = deviceIdElement.getTextTrim().toString(); Device device = redisCatchStorage.getDevice(deviceId); if (device != null) { if (!StringUtils.isEmpty(device.getName())) { @@ -121,7 +121,9 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements } } mobilePosition.setDeviceId(XmlUtil.getText(rootElement, "DeviceID")); - mobilePosition.setTime(XmlUtil.getText(rootElement, "Time")); + mobilePosition.setChannelId(channelId); + String time = XmlUtil.getText(rootElement, "Time"); + mobilePosition.setTime(time); mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude"))); mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude"))); if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Speed"))) { @@ -139,17 +141,31 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements } else { mobilePosition.setAltitude(0.0); } + logger.info("[收到 移动位置订阅]:{}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), + mobilePosition.getLongitude(), mobilePosition.getLatitude()); mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); - if (!userSetup.getSavePositionHistory()) { + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } storager.insertMobilePosition(mobilePosition); + storager.updateChannelPotion(deviceId, channelId, mobilePosition.getLongitude(), mobilePosition.getLatitude() ); + // 发送redis消息。 通知位置信息的变化 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("time", time); + jsonObject.put("serial", deviceId); + jsonObject.put("code", channelId); + jsonObject.put("longitude", mobilePosition.getLongitude()); + jsonObject.put("latitude", mobilePosition.getLatitude()); + jsonObject.put("altitude", mobilePosition.getAltitude()); + jsonObject.put("direction", mobilePosition.getDirection()); + jsonObject.put("speed", mobilePosition.getSpeed()); + redisCatchStorage.sendMobilePositionMsg(jsonObject); responseAck(evt, Response.OK); } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); @@ -195,7 +211,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements } else { deviceAlarm.setLatitude(0.00); } - + logger.info("[收到Notify-Alarm]:{}/{}", device.getDeviceId(), deviceAlarm.getChannelId()); if (deviceAlarm.getAlarmMethod().equals("4")) { MobilePosition mobilePosition = new MobilePosition(); mobilePosition.setDeviceId(deviceAlarm.getDeviceId()); @@ -203,13 +219,13 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); - if (!userSetup.getSavePositionHistory()) { + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } storager.insertMobilePosition(mobilePosition); @@ -218,7 +234,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements // 回复200 OK responseAck(evt, Response.OK); - if (offLineDetector.isOnline(deviceId)) { + if (redisCatchStorage.deviceIsOnline(deviceId)) { publisher.deviceAlarmEventPublish(deviceAlarm); } } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { @@ -261,7 +277,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements Element eventElement = itemDevice.element("Event"); DeviceChannel channel = XmlUtil.channelContentHander(itemDevice); channel.setDeviceId(device.getDeviceId()); - logger.debug("收到来自设备【{}】的通道: {}【{}】", device.getDeviceId(), channel.getName(), channel.getChannelId()); + logger.info("[收到 目录订阅]:{}/{}", device.getDeviceId(), channel.getChannelId()); switch (eventElement.getText().toUpperCase()) { case CatalogEvent.ON: // 上线 logger.info("收到来自设备【{}】的通道【{}】上线通知", device.getDeviceId(), channel.getChannelId()); @@ -309,7 +325,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements } - if (offLineDetector.isOnline(deviceId)) { + if (!redisCatchStorage.deviceIsOnline(deviceId)) { publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); } } @@ -321,7 +337,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements public void setCmder(SIPCommander cmder) { } - public void setStorager(IVideoManagerStorager storager) { + public void setStorager(IVideoManagerStorage storager) { this.storager = storager; } @@ -335,10 +351,6 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements public void setDeferredResultHolder(DeferredResultHolder deferredResultHolder) { } - public void setOffLineDetector(DeviceOffLineDetector offLineDetector) { - this.offLineDetector = offLineDetector; - } - public IRedisCatchStorage getRedisCatchStorage() { return redisCatchStorage; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java index cfc61c40..ce5ca439 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java @@ -3,7 +3,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper; -import com.genersoft.iot.vmp.gb28181.auth.RegisterLogicHandler; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; @@ -11,7 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.RequestEventExt; import gov.nist.javax.sip.address.AddressImpl; import gov.nist.javax.sip.address.SipUri; @@ -42,166 +41,165 @@ import java.util.Locale; @Component public class RegisterRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { - private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class); + private final Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class); - public String method = "REGISTER"; + public String method = "REGISTER"; - @Autowired - private SipConfig sipConfig; + @Autowired + private SipConfig sipConfig; - @Autowired - private RegisterLogicHandler handler; + @Autowired + private IRedisCatchStorage redisCatchStorage; - @Autowired - private IRedisCatchStorage redisCatchStorage; + @Autowired + private IVideoManagerStorage storager; - @Autowired - private IVideoManagerStorager storager; + @Autowired + private EventPublisher publisher; - @Autowired - private EventPublisher publisher; + @Autowired + private SIPProcessorObserver sipProcessorObserver; - @Autowired - private SIPProcessorObserver sipProcessorObserver; + @Override + public void afterPropertiesSet() throws Exception { + // 添加消息处理的订阅 + sipProcessorObserver.addRequestProcessor(method, this); + } - @Override - public void afterPropertiesSet() throws Exception { - // 添加消息处理的订阅 - sipProcessorObserver.addRequestProcessor(method, this); - } + /** + * 收到注册请求 处理 + * + * @param evt + */ + @Override + public void process(RequestEvent evt) { + try { + RequestEventExt evtExt = (RequestEventExt) evt; + String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort(); + logger.info("[{}] 收到注册请求,开始处理", requestAddress); + Request request = evt.getRequest(); + ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); + Response response = null; + boolean passwordCorrect = false; + // 注册标志 0:未携带授权头或者密码错误 1:注册成功 2:注销成功 + int registerFlag = 0; + FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); + AddressImpl address = (AddressImpl) fromHeader.getAddress(); + SipUri uri = (SipUri) address.getURI(); + String deviceId = uri.getUser(); - /** - * 收到注册请求 处理 - * @param evt - */ - @Override - public void process(RequestEvent evt) { - try { - RequestEventExt evtExt = (RequestEventExt)evt; - String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort(); - logger.info("[{}] 收到注册请求,开始处理", requestAddress); - Request request = evt.getRequest(); - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); - Response response = null; - boolean passwordCorrect = false; - // 注册标志 0:未携带授权头或者密码错误 1:注册成功 2:注销成功 - int registerFlag = 0; - FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); - AddressImpl address = (AddressImpl) fromHeader.getAddress(); - SipUri uri = (SipUri) address.getURI(); - String deviceId = uri.getUser(); - Device deviceInRedis = redisCatchStorage.getDevice(deviceId); - Device device = storager.queryVideoDevice(deviceId); - if (deviceInRedis != null && device == null) { - // redis 存在脏数据 - redisCatchStorage.clearCatchByDeviceId(deviceId); - } - AuthorizationHeader authorhead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - // 校验密码是否正确 - if (authorhead != null) { - passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, - sipConfig.getPassword()); - } - if (StringUtils.isEmpty(sipConfig.getPassword())){ - passwordCorrect = true; - } + AuthorizationHeader authHead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); + if (authHead == null) { + logger.info("[{}] 未携带授权头 回复401", requestAddress); + response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); + new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); + sendResponse(evt, response); + return; + } - // 未携带授权头或者密码错误 回复401 - if (authorhead == null ) { + // 校验密码是否正确 + passwordCorrect = StringUtils.isEmpty(sipConfig.getPassword()) || + new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword()); + // 未携带授权头或者密码错误 回复401 - logger.info("[{}] 未携带授权头 回复401", requestAddress); - response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); - new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); - }else { - if (!passwordCorrect){ - // 注册失败 - response = getMessageFactory().createResponse(Response.FORBIDDEN, request); - response.setReasonPhrase("wrong password"); - logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress); - }else { - // 携带授权头并且密码正确 - response = getMessageFactory().createResponse(Response.OK, request); - // 添加date头 - SIPDateHeader dateHeader = new SIPDateHeader(); - // 使用自己修改的 - WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis()); - dateHeader.setDate(wvpSipDate); - response.addHeader(dateHeader); + if (!passwordCorrect) { + // 注册失败 + response = getMessageFactory().createResponse(Response.FORBIDDEN, request); + response.setReasonPhrase("wrong password"); + logger.info("[{}] 密码/SIP服务器ID错误, 回复403", requestAddress); + sendResponse(evt, response); + return; + } + Device deviceInRedis = redisCatchStorage.getDevice(deviceId); + Device device = storager.queryVideoDevice(deviceId); + if (deviceInRedis != null && device == null) { + // redis 存在脏数据 + redisCatchStorage.clearCatchByDeviceId(deviceId); + } + // 携带授权头并且密码正确 + response = getMessageFactory().createResponse(Response.OK, request); + // 添加date头 + SIPDateHeader dateHeader = new SIPDateHeader(); + // 使用自己修改的 + WvpSipDate wvpSipDate = new WvpSipDate(Calendar.getInstance(Locale.ENGLISH).getTimeInMillis()); + dateHeader.setDate(wvpSipDate); + response.addHeader(dateHeader); - if (expiresHeader == null) { - response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); - ServerTransaction serverTransaction = getServerTransaction(evt); - serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); - return; - } - // 添加Contact头 - response.addHeader(request.getHeader(ContactHeader.NAME)); - // 添加Expires头 - response.addHeader(request.getExpires()); + if (expiresHeader == null) { + response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); + ServerTransaction serverTransaction = getServerTransaction(evt); + serverTransaction.sendResponse(response); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } + return; + } + // 添加Contact头 + response.addHeader(request.getHeader(ContactHeader.NAME)); + // 添加Expires头 + response.addHeader(request.getExpires()); - // 获取到通信地址等信息 - ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String received = viaHeader.getReceived(); - int rPort = viaHeader.getRPort(); - // 解析本地地址替代 - if (StringUtils.isEmpty(received) || rPort == -1) { - received = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - // + // 获取到通信地址等信息 + ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + String received = viaHeader.getReceived(); + int rPort = viaHeader.getRPort(); + // 解析本地地址替代 + if (StringUtils.isEmpty(received) || rPort == -1) { + received = viaHeader.getHost(); + rPort = viaHeader.getPort(); + } + if (device == null) { + device = new Device(); + device.setStreamMode("UDP"); + device.setCharset("GB2312"); + device.setDeviceId(deviceId); + device.setFirsRegister(true); + } else { + device.setFirsRegister(device.getOnline() == 0); + } + device.setIp(received); + device.setPort(rPort); + device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); + if (expiresHeader.getExpires() == 0) { + // 注销成功 + registerFlag = 2; + } else { + // 注册成功 + device.setExpires(expiresHeader.getExpires()); + registerFlag = 1; + // 判断TCP还是UDP + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); + String transport = reqViaHeader.getTransport(); + device.setTransport("TCP".equals(transport) ? "TCP" : "UDP"); + } - if (device == null) { - device = new Device(); - device.setStreamMode("UDP"); - device.setCharset("gb2312"); - device.setDeviceId(deviceId); - device.setFirsRegister(true); - }else { - if (device.getOnline() == 0) { - device.setFirsRegister(true); - } - } - device.setIp(received); - device.setPort(rPort); - device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); - // 注销成功 - if (expiresHeader.getExpires() == 0) { - registerFlag = 2; - } - // 注册成功 - else { - device.setExpires(expiresHeader.getExpires()); - registerFlag = 1; - // 判断TCP还是UDP - boolean isTcp = false; - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String transport = reqViaHeader.getTransport(); - if (transport.equals("TCP")) { - isTcp = true; - } - device.setTransport(isTcp ? "TCP" : "UDP"); - } - } - } + sendResponse(evt, response); + // 注册成功 + // 保存到redis + if (registerFlag == 1) { + logger.info("[{}] 注册成功! deviceId:" + deviceId, requestAddress); + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER, expiresHeader.getExpires()); + } else if (registerFlag == 2) { + logger.info("[{}] 注销成功! deviceId:" + deviceId, requestAddress); + publisher.outlineEventPublish(deviceId, VideoManagerConstants.EVENT_OUTLINE_UNREGISTER); + } + } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) { + e.printStackTrace(); + } - ServerTransaction serverTransaction = getServerTransaction(evt); - serverTransaction.sendResponse(response); - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); - // 注册成功 - // 保存到redis - if (registerFlag == 1 ) { - logger.info("[{}] 注册成功! deviceId:" + device.getDeviceId(), requestAddress); - publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_REGISTER, expiresHeader.getExpires()); - } else if (registerFlag == 2) { - logger.info("[{}] 注销成功! deviceId:" + device.getDeviceId(), requestAddress); - publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER); - } - } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) { - e.printStackTrace(); - } - - } + } + + private void sendResponse(RequestEvent evt, Response response) throws InvalidArgumentException, SipException { + ServerTransaction serverTransaction = getServerTransaction(evt); + if (serverTransaction == null) { + logger.warn("回复失败:{}", response); + return; + } + serverTransaction.sendResponse(response); + if (serverTransaction.getDialog() != null) { + serverTransaction.getDialog().delete(); + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java index 4acec149..548dbde8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java @@ -2,12 +2,12 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.DynamicTask; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.CmdType; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; -import com.genersoft.iot.vmp.gb28181.task.GPSSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; @@ -15,8 +15,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.SerializeUtils; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.SipProviderImpl; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -30,31 +29,25 @@ import org.springframework.stereotype.Component; import javax.sip.*; import javax.sip.header.ExpiresHeader; -import javax.sip.header.ToHeader; import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; /** * SIP命令类型: SUBSCRIBE请求 + * @author lin */ @Component public class SubscribeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { - private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); - private String method = "SUBSCRIBE"; + private final Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); + private final String method = "SUBSCRIBE"; @Autowired private SIPProcessorObserver sipProcessorObserver; @Autowired - private IRedisCatchStorage redisCatchStorage; - - @Autowired - private ISIPCommanderForPlatform sipCommanderForPlatform; - - @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Lazy @Autowired @@ -70,8 +63,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme private DynamicTask dynamicTask; @Autowired - private UserSetup userSetup; - + private UserSetting userSetting; @Autowired private SubscribeHolder subscribeHolder; @@ -85,7 +77,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme /** * 处理SUBSCRIBE请求 * - * @param evt + * @param evt 事件 */ @Override public void process(RequestEvent evt) { @@ -104,13 +96,12 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme } else { logger.info("接收到消息:" + cmd); - Response response = null; - response = getMessageFactory().createResponse(200, request); + Response response = getMessageFactory().createResponse(200, request); if (response != null) { ExpiresHeader expireHeader = getHeaderFactory().createExpiresHeader(30); response.setExpires(expireHeader); } - logger.info("response : " + response.toString()); + logger.info("response : " + response); ServerTransaction transaction = getServerTransaction(evt); if (transaction != null) { transaction.sendResponse(response); @@ -120,13 +111,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme logger.info("processRequest serverTransactionId is null."); } } - } catch (ParseException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (DocumentException e) { + } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { e.printStackTrace(); } @@ -135,42 +120,53 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme /** * 处理移动位置订阅消息 */ - private void processNotifyMobilePosition(RequestEvent evt, Element rootElement) { + private void processNotifyMobilePosition(RequestEvent evt, Element rootElement) throws SipException { String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); - String deviceID = XmlUtil.getText(rootElement, "DeviceID"); + String deviceId = XmlUtil.getText(rootElement, "DeviceID"); + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); + if (platform == null) { + return; + } + if (evt.getServerTransaction() == null) { + ServerTransaction serverTransaction = "TCP".equals(platform.getTransport()) ? tcpSipProvider.getNewServerTransaction(evt.getRequest()) + : udpSipProvider.getNewServerTransaction(evt.getRequest()); + subscribeInfo.setTransaction(serverTransaction); + Dialog dialog = serverTransaction.getDialog(); + dialog.terminateOnBye(false); + subscribeInfo.setDialog(dialog); + } String sn = XmlUtil.getText(rootElement, "SN"); - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_MobilePosition_" + platformId; - logger.info("接收到{}的MobilePosition订阅", platformId); + logger.info("[回复 移动位置订阅]: {}", platformId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("\r\n") .append("\r\n") .append("MobilePosition\r\n") - .append("" + sn + "\r\n") - .append("" + deviceID + "\r\n") + .append("").append(sn).append("\r\n") + .append("").append(deviceId).append("\r\n") .append("OK\r\n") .append("\r\n"); if (subscribeInfo.getExpires() > 0) { - if (subscribeHolder.getMobilePositionSubscribe(platformId) != null) { - dynamicTask.stop(key); + // GPS上报时间间隔 + String interval = XmlUtil.getText(rootElement, "Interval"); + if (interval == null) { + subscribeInfo.setGpsInterval(5); + }else { + subscribeInfo.setGpsInterval(Integer.parseInt(interval)); } - String interval = XmlUtil.getText(rootElement, "Interval"); // GPS上报时间间隔 - dynamicTask.startCron(key, new GPSSubscribeTask(redisCatchStorage, sipCommanderForPlatform, storager, platformId, sn, key, subscribeHolder), Integer.parseInt(interval)); + + subscribeInfo.setSn(sn); subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo); + }else if (subscribeInfo.getExpires() == 0) { - dynamicTask.stop(key); subscribeHolder.removeMobilePositionSubscribe(platformId); } try { ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); responseXmlAck(evt, resultXml.toString(), parentPlatform); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { + } catch (SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); } } @@ -181,11 +177,14 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme private void processNotifyCatalogList(RequestEvent evt, Element rootElement) throws SipException { String platformId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); - String deviceID = XmlUtil.getText(rootElement, "DeviceID"); + String deviceId = XmlUtil.getText(rootElement, "DeviceID"); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); + if (platform == null){ + return; + } SubscribeInfo subscribeInfo = new SubscribeInfo(evt, platformId); if (evt.getServerTransaction() == null) { - ServerTransaction serverTransaction = platform.getTransport().equals("TCP") ? tcpSipProvider.getNewServerTransaction(evt.getRequest()) + ServerTransaction serverTransaction = "TCP".equals(platform.getTransport()) ? tcpSipProvider.getNewServerTransaction(evt.getRequest()) : udpSipProvider.getNewServerTransaction(evt.getRequest()); subscribeInfo.setTransaction(serverTransaction); Dialog dialog = serverTransaction.getDialog(); @@ -193,14 +192,13 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme subscribeInfo.setDialog(dialog); } String sn = XmlUtil.getText(rootElement, "SN"); - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_Catalog_" + platformId; - logger.info("接收到{}的Catalog订阅", platformId); + logger.info("[回复 目录订阅]: {}/{}", platformId, deviceId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("\r\n") .append("\r\n") .append("Catalog\r\n") - .append("" + sn + "\r\n") - .append("" + deviceID + "\r\n") + .append("").append(sn).append("\r\n") + .append("").append(deviceId).append("\r\n") .append("OK\r\n") .append("\r\n"); @@ -213,11 +211,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme try { ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId); responseXmlAck(evt, resultXml.toString(), parentPlatform); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { + } catch (SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java index e126fba4..136b9120 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java @@ -3,13 +3,16 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceNotFoundEvent; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; +import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import gov.nist.javax.sip.message.SIPRequest; import org.dom4j.DocumentException; import org.dom4j.Element; import org.slf4j.Logger; @@ -21,6 +24,7 @@ import org.springframework.stereotype.Component; import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; import javax.sip.SipException; +import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.header.CallIdHeader; import javax.sip.message.Response; @@ -41,7 +45,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement private SIPProcessorObserver sipProcessorObserver; @Autowired - private IVideoManagerStorager storage; + private IVideoManagerStorage storage; @Autowired private SipSubscribe sipSubscribe; @@ -49,6 +53,9 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement @Autowired private IRedisCatchStorage redisCatchStorage; + @Autowired + private VideoStreamSessionManager sessionManager; + @Override public void afterPropertiesSet() throws Exception { // 添加消息处理的订阅 @@ -64,6 +71,11 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement logger.debug("接收到消息:" + evt.getRequest()); String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); + // 先从会话内查找 + SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, null, callIdHeader.getCallId()); + if (ssrcTransaction != null) { // 兼容海康 媒体通知 消息from字段不是设备ID的问题 + deviceId = ssrcTransaction.getDeviceId(); + } // 查询设备是否存在 CSeqHeader cseqHeader = (CSeqHeader) evt.getRequest().getHeader(CSeqHeader.NAME); String method = cseqHeader.getMethod(); @@ -71,6 +83,17 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement // 查询上级平台是否存在 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); try { + if (device != null && parentPlatform != null) { + logger.warn("[重复]平台与设备编号重复:{}", deviceId); + SIPRequest request = (SIPRequest) evt.getRequest(); + String hostAddress = request.getRemoteAddress().getHostAddress(); + int remotePort = request.getRemotePort(); + if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) { + parentPlatform = null; + }else { + device = null; + } + } if (device == null && parentPlatform == null) { // 不存在则回复404 responseAck(evt, Response.NOT_FOUND, "device "+ deviceId +" not found"); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java index 980ec5d7..129f5df1 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java @@ -8,8 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control.ControlMessageHandler; -import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.SpringBeanFactory; import gov.nist.javax.sip.SipStackImpl; import org.dom4j.Element; @@ -20,13 +19,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; -import javax.sip.ListeningPoint; -import javax.sip.ObjectInUseException; -import javax.sip.RequestEvent; -import javax.sip.SipProvider; +import javax.sip.*; import javax.sip.address.SipURI; import javax.sip.header.HeaderAddress; import javax.sip.header.ToHeader; +import javax.sip.message.Response; +import java.text.ParseException; import java.util.Iterator; import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; @@ -41,7 +39,7 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent private ControlMessageHandler controlMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommander cmder; @@ -106,7 +104,41 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent if (!StringUtils.isEmpty(getText(rootElement,"PTZCmd")) && !parentPlatform.getServerGBId().equals(targetGBId)) { String cmdString = getText(rootElement,"PTZCmd"); Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId); - cmder.fronEndCmd(deviceForPlatform, channelId, cmdString); + if (deviceForPlatform == null) { + try { + responseAck(evt, Response.NOT_FOUND); + return; + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + } + cmder.fronEndCmd(deviceForPlatform, channelId, cmdString, eventResult -> { + // 失败的回复 + try { + responseAck(evt, eventResult.statusCode, eventResult.msg); + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + }, eventResult -> { + // 成功的回复 + try { + responseAck(evt, eventResult.statusCode); + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + }); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index 8f412f7d..fa20d518 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -1,17 +1,17 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.service.IDeviceAlarmService; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.GpsUtil; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +20,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Response; + +import java.text.ParseException; import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.*; @@ -37,20 +42,20 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme private EventPublisher publisher; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private SipConfig sipConfig; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; + + @Autowired + private IRedisCatchStorage redisCatchStorage; @Autowired private IDeviceAlarmService deviceAlarmService; - @Autowired - private DeviceOffLineDetector offLineDetector; - @Override public void afterPropertiesSet() throws Exception { notifyMessageHandler.addHandler(cmdType, this); @@ -58,11 +63,22 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme @Override public void handForDevice(RequestEvent evt, Device device, Element rootElement) { - if (!sipConfig.isAlarm()) { - return; + logger.info("收到来自设备[{}]的报警通知", device.getDeviceId()); + // 回复200 OK + try { + responseAck(evt, Response.OK); + } catch (SipException e) { + throw new RuntimeException(e); + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); } + Element deviceIdElement = rootElement.element("DeviceID"); String channelId = deviceIdElement.getText().toString(); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); deviceAlarm.setDeviceId(device.getDeviceId()); deviceAlarm.setChannelId(channelId); @@ -93,13 +109,13 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); - if (!userSetup.getSavePositionHistory()) { + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } storager.insertMobilePosition(mobilePosition); @@ -110,17 +126,84 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); } } + + if (channelId.equals(sipConfig.getId())) { + // 发送给平台的报警信息。 发送redis通知 + AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); + alarmChannelMessage.setAlarmSn(Integer.parseInt(deviceAlarm.getAlarmMethod())); + alarmChannelMessage.setAlarmDescription(deviceAlarm.getAlarmDescription()); + alarmChannelMessage.setGbId(channelId); + redisCatchStorage.sendAlarmMsg(alarmChannelMessage); + + return; + } + logger.debug("存储报警信息、报警分类"); // 存储报警信息、报警分类 - deviceAlarmService.add(deviceAlarm); + if (sipConfig.isAlarm()) { + deviceAlarmService.add(deviceAlarm); + } - if (offLineDetector.isOnline(device.getDeviceId())) { + + if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) { publisher.deviceAlarmEventPublish(deviceAlarm); } } @Override - public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { + logger.info("收到来自平台[{}]的报警通知", parentPlatform.getServerGBId()); + // 回复200 OK + try { + responseAck(evt, Response.OK); + } catch (SipException e) { + throw new RuntimeException(e); + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + Element deviceIdElement = rootElement.element("DeviceID"); + String channelId = deviceIdElement.getText().toString(); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setDeviceId(parentPlatform.getServerGBId()); + deviceAlarm.setChannelId(channelId); + deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); + deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); + deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); + if (getText(rootElement, "AlarmDescription") == null) { + deviceAlarm.setAlarmDescription(""); + } else { + deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); + } + if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { + deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); + } else { + deviceAlarm.setLongitude(0.00); + } + if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { + deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); + } else { + deviceAlarm.setLatitude(0.00); + } + + if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { + + if (deviceAlarm.getAlarmMethod().equals("5")) { + deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); + } + } + + if (channelId.equals(parentPlatform.getDeviceGBId())) { + // 发送给平台的报警信息。 发送redis通知 + AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); + alarmChannelMessage.setAlarmSn(Integer.parseInt(deviceAlarm.getAlarmMethod())); + alarmChannelMessage.setAlarmDescription(deviceAlarm.getAlarmDescription()); + alarmChannelMessage.setGbId(channelId); + redisCatchStorage.sendAlarmMsg(alarmChannelMessage); + return; + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java index 21f36b3a..d714ee4f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/CatalogNotifyMessageHandler.java @@ -1,18 +1,13 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; -import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,26 +18,23 @@ import javax.sip.SipException; import javax.sip.header.FromHeader; import javax.sip.message.Response; import java.text.ParseException; +import java.util.ArrayList; import java.util.List; @Component public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { - private Logger logger = LoggerFactory.getLogger(CatalogNotifyMessageHandler.class); private final String cmdType = "Catalog"; @Autowired private NotifyMessageHandler notifyMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storage; @Autowired private SIPCommanderFroPlatform cmderFroPlatform; - @Autowired - private SipConfig config; - @Override public void afterPropertiesSet() throws Exception { notifyMessageHandler.addHandler(cmdType, this); @@ -64,12 +56,13 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple Element snElement = rootElement.element("SN"); String sn = snElement.getText(); // 准备回复通道信息 - List channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); + List deviceChannels = storage.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); // 查询关联的直播通道 - List gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); - int size = channelReduces.size() + gbStreams.size(); + List gbStreams = storage.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); + + List allChannels = new ArrayList<>(); // 回复目录信息 - List catalogs = storager.queryCatalogInPlatform(parentPlatform.getServerGBId()); + List catalogs = storage.queryCatalogInPlatform(parentPlatform.getServerGBId()); if (catalogs.size() > 0) { for (PlatformCatalog catalog : catalogs) { if (catalog.getParentId().equals(catalog.getPlatformId())) { @@ -86,27 +79,34 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple deviceChannel.setParental(1); deviceChannel.setParentId(catalog.getParentId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); + if (catalog.getParentId() != null && catalog.getParentId().length() <= 10) { + deviceChannel.setCivilCode(catalog.getParentId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setSecrecy("0"); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + allChannels.add(deviceChannel); } } // 回复级联的通道 - if (channelReduces.size() > 0) { - for (ChannelReduce channelReduce : channelReduces) { - if (channelReduce.getCatalogId().equals(parentPlatform.getServerGBId())) { - channelReduce.setCatalogId(parentPlatform.getDeviceGBId()); + if (deviceChannels.size() > 0) { + for (DeviceChannelInPlatform channel : deviceChannels) { + if (channel.getCatalogId().equals(parentPlatform.getServerGBId())) { + channel.setCatalogId(parentPlatform.getDeviceGBId()); } - DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); + DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId()); deviceChannel.setParental(0); - deviceChannel.setParentId(channelReduce.getCatalogId()); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + deviceChannel.setParentId(channel.getCatalogId()); + if (channel.getCatalogId() != null && channel.getCatalogId().length() <= 10) { + channel.setCivilCode(channel.getCatalogId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } + + allChannels.add(deviceChannel); } } // 回复直播的通道 @@ -122,30 +122,29 @@ public class CatalogNotifyMessageHandler extends SIPRequestProcessorParent imple deviceChannel.setLatitude(gbStream.getLatitude()); deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); deviceChannel.setManufacture("wvp-pro"); - deviceChannel.setStatus(gbStream.isStatus()?1:0); +// deviceChannel.setStatus(gbStream.isStatus()?1:0); + deviceChannel.setStatus(1); deviceChannel.setParentId(gbStream.getCatalogId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); + if (gbStream.getCatalogId() != null && gbStream.getCatalogId().length() <= 10) { + deviceChannel.setCivilCode(gbStream.getCatalogId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); deviceChannel.setSecrecy("0"); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + allChannels.add(deviceChannel); } } - if (size == 0) { + if (allChannels.size() > 0) { + cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag()); + }else { // 回复无通道 - cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); + cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0); } - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (InterruptedException e) { + } catch (SipException | InvalidArgumentException | ParseException e) { e.printStackTrace(); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java index edd9fe86..08a77518 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java @@ -7,9 +7,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; -import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,7 +16,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; -import springfox.documentation.service.Header; import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; @@ -39,7 +37,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp private EventPublisher publisher; @Autowired - private IVideoManagerStorager videoManagerStorager; + private IVideoManagerStorage videoManagerStorager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -72,7 +70,9 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp videoManagerStorager.updateDevice(device); redisCatchStorage.updateDevice(device); } - publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); + if (!redisCatchStorage.deviceIsOnline(device.getDeviceId())) { + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); + } } } catch (SipException e) { e.printStackTrace(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java index 8235ade1..e36a705a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java @@ -62,7 +62,12 @@ public class MediaStatusNotifyMessageHandler extends SIPRequestProcessorParent i if (NotifyType.equals("121")){ logger.info("媒体播放完毕,通知关流"); String channelId =getText(rootElement, "DeviceID"); - redisCatchStorage.stopPlayback(device.getDeviceId(), channelId, null, callIdHeader.getCallId()); +// redisCatchStorage.stopPlayback(device.getDeviceId(), channelId, null, callIdHeader.getCallId()); +// redisCatchStorage.stopDownload(device.getDeviceId(), channelId, null, callIdHeader.getCallId()); + StreamInfo streamInfo = redisCatchStorage.queryDownload(device.getDeviceId(), channelId, null, callIdHeader.getCallId()); + // 设置进度100% + streamInfo.setProgress(1); + redisCatchStorage.startDownload(streamInfo, callIdHeader.getCallId()); cmder.streamByeCmd(device.getDeviceId(), channelId, null, callIdHeader.getCallId()); // TODO 如果级联播放,需要给上级发送此通知 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java index ab7e5f63..2a53a3fb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java @@ -1,6 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; @@ -8,8 +8,9 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -38,10 +39,10 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen private NotifyMessageHandler notifyMessageHandler; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Override public void afterPropertiesSet() throws Exception { @@ -79,13 +80,13 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); - if (!userSetup.getSavePositionHistory()) { + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } storager.insertMobilePosition(mobilePosition); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/AlarmQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/AlarmQueryMessageHandler.java index 60cf4d07..8c884d5a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/AlarmQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/AlarmQueryMessageHandler.java @@ -2,17 +2,13 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query. import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; -import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,10 +19,8 @@ import org.springframework.stereotype.Component; import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; import javax.sip.SipException; -import javax.sip.header.FromHeader; import javax.sip.message.Response; import java.text.ParseException; -import java.util.List; @Component public class AlarmQueryMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { @@ -38,7 +32,7 @@ public class AlarmQueryMessageHandler extends SIPRequestProcessorParent implemen private QueryMessageHandler queryMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommanderFroPlatform cmderFroPlatform; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java index 925a21e5..0e979619 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java @@ -8,8 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +22,7 @@ import javax.sip.SipException; import javax.sip.header.FromHeader; import javax.sip.message.Response; import java.text.ParseException; +import java.util.ArrayList; import java.util.List; @Component @@ -35,7 +35,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem private QueryMessageHandler queryMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommanderFroPlatform cmderFroPlatform; @@ -46,6 +46,9 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem @Autowired private EventPublisher publisher; + @Autowired + private IVideoManagerStorage storage; + @Override public void afterPropertiesSet() throws Exception { queryMessageHandler.addHandler(cmdType, this); @@ -67,81 +70,92 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem Element snElement = rootElement.element("SN"); String sn = snElement.getText(); // 准备回复通道信息 - List channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); + List deviceChannelInPlatforms = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); // 查询关联的直播通道 List gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); // 回复目录信息 List catalogs = storager.queryCatalogInPlatform(parentPlatform.getServerGBId()); - int size = catalogs.size() + channelReduces.size() + gbStreams.size(); + + List allChannels = new ArrayList<>(); if (catalogs.size() > 0) { for (PlatformCatalog catalog : catalogs) { - if (catalog.getParentId().equals(parentPlatform.getServerGBId())) { + if (catalog.getParentId().equals(catalog.getPlatformId())) { catalog.setParentId(parentPlatform.getDeviceGBId()); } DeviceChannel deviceChannel = new DeviceChannel(); + // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划 + deviceChannel.setChannelType(2); deviceChannel.setChannelId(catalog.getId()); deviceChannel.setName(catalog.getName()); - deviceChannel.setLongitude(0.0); - deviceChannel.setLatitude(0.0); deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); deviceChannel.setManufacture("wvp-pro"); deviceChannel.setStatus(1); deviceChannel.setParental(1); deviceChannel.setParentId(catalog.getParentId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); - deviceChannel.setModel("live"); - deviceChannel.setOwner("wvp-pro"); - deviceChannel.setSecrecy("0"); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + if (catalog.getParentId() != null && catalog.getParentId().length() < 10) { + deviceChannel.setCivilCode(catalog.getParentId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } + allChannels.add(deviceChannel); } } // 回复级联的通道 - if (channelReduces.size() > 0) { - for (ChannelReduce channelReduce : channelReduces) { - if (channelReduce.getCatalogId().equals(parentPlatform.getServerGBId())) { - channelReduce.setCatalogId(parentPlatform.getDeviceGBId()); + if (deviceChannelInPlatforms.size() > 0) { + for (DeviceChannelInPlatform channel : deviceChannelInPlatforms) { + if (channel.getCatalogId().equals(parentPlatform.getServerGBId())) { + channel.setCatalogId(parentPlatform.getDeviceGBId()); } - DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); + DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId()); + // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划 + deviceChannel.setChannelType(0); deviceChannel.setParental(0); - deviceChannel.setParentId(channelReduce.getCatalogId()); - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + deviceChannel.setParentId(channel.getCatalogId()); + if (channel.getCatalogId() != null && channel.getCatalogId().length() < 10) { + deviceChannel.setCivilCode(channel.getCatalogId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } + allChannels.add(deviceChannel); } } // 回复直播的通道 if (gbStreams.size() > 0) { for (GbStream gbStream : gbStreams) { if (gbStream.getCatalogId().equals(parentPlatform.getServerGBId())) { - gbStream.setCatalogId(parentPlatform.getDeviceGBId()); + gbStream.setCatalogId(null); } DeviceChannel deviceChannel = new DeviceChannel(); + // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划 + deviceChannel.setChannelType(1); deviceChannel.setChannelId(gbStream.getGbId()); deviceChannel.setName(gbStream.getName()); deviceChannel.setLongitude(gbStream.getLongitude()); deviceChannel.setLatitude(gbStream.getLatitude()); deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); deviceChannel.setManufacture("wvp-pro"); - deviceChannel.setStatus(gbStream.isStatus()?1:0); +// deviceChannel.setStatus(gbStream.isStatus()?1:0); + deviceChannel.setStatus(1); deviceChannel.setParentId(gbStream.getCatalogId()); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(config.getDomain().substring(0, config.getDomain().length() - 2)); + if (gbStream.getCatalogId() != null && gbStream.getCatalogId().length() < 10) { + deviceChannel.setCivilCode(gbStream.getCatalogId()); + }else { + deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision()); + } deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); deviceChannel.setSecrecy("0"); - - cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); - // 防止发送过快 - Thread.sleep(100); + allChannels.add(deviceChannel); } } - if (size == 0) { + if (allChannels.size() > 0) { + cmderFroPlatform.catalogQuery(allChannels, parentPlatform, sn, fromHeader.getTag()); + }else { // 回复无通道 - cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); + cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), 0); } } catch (SipException e) { e.printStackTrace(); @@ -149,8 +163,6 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java index c56151cd..64df786a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java @@ -8,7 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +33,7 @@ public class DeviceStatusQueryMessageHandler extends SIPRequestProcessorParent i private QueryMessageHandler queryMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommanderFroPlatform cmderFroPlatform; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java index 460f0f93..efd6ffdf 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java @@ -4,16 +4,14 @@ import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEventListener; -import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; import com.genersoft.iot.vmp.gb28181.utils.DateUtil; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +37,7 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp private QueryMessageHandler queryMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommanderFroPlatform cmderFroPlatform; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java index 62ec5e9b..56b42caf 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java @@ -1,22 +1,19 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; -import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; +import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; -import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.bean.WVPResult; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.DocumentException; import org.dom4j.Element; import org.slf4j.Logger; @@ -24,6 +21,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; @@ -32,12 +30,9 @@ import javax.sip.message.Response; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.Iterator; import java.util.List; -import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; - @Component public class CatalogResponseMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { @@ -50,7 +45,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp private ResponseMessageHandler responseMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private DeferredResultHolder deferredResultHolder; @@ -58,15 +53,19 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp @Autowired private CatalogDataCatch catalogDataCatch; - @Autowired - private DeviceOffLineDetector offLineDetector; - @Autowired private SipConfig config; @Autowired private EventPublisher publisher; + //by brewswang + @Autowired + private UserSetting userSetting; + + @Autowired + private IRedisCatchStorage redisCatchStorage; + @Override public void afterPropertiesSet() throws Exception { responseMessageHandler.addHandler(cmdType, this); @@ -80,23 +79,17 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp rootElement = getRootElement(evt, device.getCharset()); Element deviceListElement = rootElement.element("DeviceList"); Element sumNumElement = rootElement.element("SumNum"); - if (sumNumElement == null || deviceListElement == null) { + Element snElement = rootElement.element("SN"); + if (snElement == null || sumNumElement == null || deviceListElement == null) { responseAck(evt, Response.BAD_REQUEST, "xml error"); return; } int sumNum = Integer.parseInt(sumNumElement.getText()); + if (sumNum == 0) { // 数据已经完整接收 storager.cleanChannelsForDevice(device.getDeviceId()); - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - WVPResult result = new WVPResult<>(); - result.setCode(0); - result.setData(device); - msg.setData(result); - result.setMsg("更新成功,共0条"); - deferredResultHolder.invokeAllResult(msg); - catalogDataCatch.del(key); + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null); }else { Iterator deviceListIterator = deviceListElement.elementIterator(); if (deviceListIterator != null) { @@ -108,36 +101,31 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp if (channelDeviceElement == null) { continue; } + //by brewswang +// if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {//如果包含位置信息,就更新一下位置 +// processNotifyMobilePosition(evt, itemDevice); +// } DeviceChannel deviceChannel = XmlUtil.channelContentHander(itemDevice); deviceChannel.setDeviceId(device.getDeviceId()); - logger.debug("收到来自设备【{}】的通道: {}【{}】", device.getDeviceId(), deviceChannel.getName(), deviceChannel.getChannelId()); + channelList.add(deviceChannel); } - - catalogDataCatch.put(key, sumNum, device, channelList); - if (catalogDataCatch.get(key).size() == sumNum) { + int sn = Integer.parseInt(snElement.getText()); + catalogDataCatch.put(device.getDeviceId(), sn, sumNum, device, channelList); + logger.info("收到来自设备【{}】的通道: {}个,{}/{}", device.getDeviceId(), channelList.size(), catalogDataCatch.get(device.getDeviceId()) == null ? 0 :catalogDataCatch.get(device.getDeviceId()).size(), sumNum); + if (catalogDataCatch.get(device.getDeviceId()).size() == sumNum) { // 数据已经完整接收 - boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(key)); - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - WVPResult result = new WVPResult<>(); - result.setCode(0); - result.setData(device); - if (resetChannelsResult || sumNum ==0) { - result.setMsg("更新成功,共" + sumNum + "条,已更新" + catalogDataCatch.get(key).size() + "条"); + boolean resetChannelsResult = storager.resetChannels(device.getDeviceId(), catalogDataCatch.get(device.getDeviceId())); + if (!resetChannelsResult) { + String errorMsg = "接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(device.getDeviceId()).size() + "条"; + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), errorMsg); }else { - result.setMsg("接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(key).size() + "条"); + catalogDataCatch.setChannelSyncEnd(device.getDeviceId(), null); } - msg.setData(result); - deferredResultHolder.invokeAllResult(msg); - catalogDataCatch.del(key); } } // 回复200 OK responseAck(evt, Response.OK); - if (offLineDetector.isOnline(device.getDeviceId())) { - publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); - } } } catch (DocumentException e) { e.printStackTrace(); @@ -154,4 +142,93 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { } + + /** + * 处理设备位置的更新 + * + * @param evt, itemDevice + */ + private void processNotifyMobilePosition(RequestEvent evt, Element itemDevice) { + try { + // 回复 200 OK + Element rootElement = getRootElement(evt); + MobilePosition mobilePosition = new MobilePosition(); + Element deviceIdElement = rootElement.element("DeviceID"); + String deviceId = deviceIdElement.getTextTrim().toString(); + Device device = redisCatchStorage.getDevice(deviceId); + if (device != null) { + if (!StringUtils.isEmpty(device.getName())) { + mobilePosition.setDeviceName(device.getName()); + } + } + mobilePosition.setDeviceId(XmlUtil.getText(rootElement, "DeviceID")); + + String time = XmlUtil.getText(itemDevice, "Time"); + if(time==null){ + time = XmlUtil.getText(itemDevice, "EndTime"); + } + mobilePosition.setTime(time); + String longitude = XmlUtil.getText(itemDevice, "Longitude"); + if(longitude!=null) { + mobilePosition.setLongitude(Double.parseDouble(longitude)); + } + String latitude = XmlUtil.getText(itemDevice, "Latitude"); + if(latitude!=null) { + mobilePosition.setLatitude(Double.parseDouble(latitude)); + } + if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Speed"))) { + mobilePosition.setSpeed(Double.parseDouble(XmlUtil.getText(itemDevice, "Speed"))); + } else { + mobilePosition.setSpeed(0.0); + } + if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Direction"))) { + mobilePosition.setDirection(Double.parseDouble(XmlUtil.getText(itemDevice, "Direction"))); + } else { + mobilePosition.setDirection(0.0); + } + if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Altitude"))) { + mobilePosition.setAltitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Altitude"))); + } else { + mobilePosition.setAltitude(0.0); + } + mobilePosition.setReportSource("Mobile Position"); + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { + storager.clearMobilePositionsByDeviceId(deviceId); + } + storager.insertMobilePosition(mobilePosition); + responseAck(evt, Response.OK); + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } + } + + public SyncStatus getChannelSyncProgress(String deviceId) { + if (catalogDataCatch.get(deviceId) == null) { + return null; + }else { + return catalogDataCatch.getSyncStatus(deviceId); + } + } + + public boolean isSyncRunning(String deviceId) { + if (catalogDataCatch.get(deviceId) == null) { + return false; + }else { + return catalogDataCatch.isSyncRunning(deviceId); + } + } + + public void setChannelSyncReady(Device device, int sn) { + catalogDataCatch.addReady(device, sn); + } + + public void setChannelSyncEnd(String deviceId, String errorMsg) { + catalogDataCatch.setChannelSyncEnd(deviceId, errorMsg); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoResponseMessageHandler.java index 78fc9361..276be490 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoResponseMessageHandler.java @@ -4,14 +4,14 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.dom4j.DocumentException; import org.dom4j.Element; import org.slf4j.Logger; @@ -39,14 +39,14 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent private ResponseMessageHandler responseMessageHandler; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; + + @Autowired + private IRedisCatchStorage redisCatchStorage; @Autowired private DeferredResultHolder deferredResultHolder; - @Autowired - private DeviceOffLineDetector offLineDetector; - @Autowired private SipConfig config; @@ -82,7 +82,7 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent deferredResultHolder.invokeAllResult(msg); // 回复200 OK responseAck(evt, Response.OK); - if (offLineDetector.isOnline(device.getDeviceId())) { + if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) { publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); } } catch (DocumentException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java index 1a7ab643..4e2f7f74 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -12,6 +11,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +34,6 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen @Autowired private ResponseMessageHandler responseMessageHandler; - @Autowired - private DeviceOffLineDetector offLineDetector; @Autowired private DeferredResultHolder deferredResultHolder; @@ -43,6 +41,9 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen @Autowired private EventPublisher publisher; + @Autowired + private IRedisCatchStorage redisCatchStorage; + @Override public void afterPropertiesSet() throws Exception { responseMessageHandler.addHandler(cmdType, this); @@ -74,10 +75,8 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen msg.setData(json); deferredResultHolder.invokeAllResult(msg); - if (offLineDetector.isOnline(device.getDeviceId())) { + if (redisCatchStorage.deviceIsOnline(device.getDeviceId())) { publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); - } else { - } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java index b456386f..b070ed52 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java @@ -1,6 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; @@ -8,8 +8,9 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -38,10 +39,10 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar private ResponseMessageHandler responseMessageHandler; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Override public void afterPropertiesSet() throws Exception { @@ -79,13 +80,13 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); - if (!userSetup.getSavePositionHistory()) { + // 默认来源坐标系为WGS-84处理 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02坐标:" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); + if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } storager.insertMobilePosition(mobilePosition); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java index 1b5081b1..c81aabb6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java @@ -81,7 +81,7 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract { } requestURI.setPort(event.getRemotePort()); reqAck.setRequestURI(requestURI); - logger.info("向 " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "回复ack"); + logger.info("[回复ack] {}-> {}:{} ",requestURI, event.getRemoteIpAddress(), event.getRemotePort()); dialog.sendAck(reqAck); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java index 6c33406f..02f5e1d0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java @@ -7,7 +7,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +33,7 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { private ISIPCommanderForPlatform sipCommanderForPlatform; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -90,10 +90,12 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { redisCatchStorage.delPlatformCatchInfo(platformGBId); // 取回Expires设置,避免注销过程中被置为0 ParentPlatform parentPlatformTmp = storager.queryParentPlatByServerGBId(platformGBId); - parentPlatformTmp.setStatus("注册".equals(action)); - redisCatchStorage.updatePlatformRegister(parentPlatformTmp); - redisCatchStorage.updatePlatformKeepalive(parentPlatformTmp); - parentPlatformCatch.setParentPlatform(parentPlatformTmp); + if (parentPlatformTmp != null) { + parentPlatformTmp.setStatus("注册".equals(action)); + redisCatchStorage.updatePlatformRegister(parentPlatformTmp); + redisCatchStorage.updatePlatformKeepalive(parentPlatformTmp); + parentPlatformCatch.setParentPlatform(parentPlatformTmp); + } redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch); storager.updateParentPlatformStatus(platformGBId, "注册".equals(action)); if ("注销".equals(action)) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java new file mode 100644 index 00000000..5c12ff6c --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java @@ -0,0 +1,126 @@ +package com.genersoft.iot.vmp.gb28181.utils; + +/** + * 坐标转换 + * 一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具类 + * 参考https://github.com/wandergis/coordtransform 写的Java版本 + * @author Xinconan + * @date 2016-03-18 + * @url https://github.com/xinconan/coordtransform + */ +public class Coordtransform { + + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private static double PI = 3.1415926535897932384626; + private static double a = 6378245.0; + private static double ee = 0.00669342162296594323; + + /** + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + * 即 百度 转 谷歌、高德 + * @param bd_lon + * @param bd_lat + * @return Double[lon,lat] + */ + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta); + arr[1] = z * Math.sin(theta); + return arr; + } + + /** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + * 即谷歌、高德 转 百度 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta) + 0.0065; + arr[1] = z * Math.sin(theta) + 0.006; + return arr; + } + + /** + * WGS84转GCJ02 + * @param wgs_lon + * @param wgs_lat + * @return Double[lon,lat] + */ + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ + if(outOfChina(wgs_lon, wgs_lat)){ + return new Double[]{wgs_lon,wgs_lat}; + } + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); + double radlat = wgs_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + Double[] arr = new Double[2]; + arr[0] = wgs_lon + dlng; + arr[1] = wgs_lat + dlat; + return arr; + } + + /** + * GCJ02转WGS84 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ + if(outOfChina(gcj_lon, gcj_lat)){ + return new Double[]{gcj_lon,gcj_lat}; + } + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); + double radlat = gcj_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + double mglat = gcj_lat + dlat; + double mglng = gcj_lon + dlng; + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; + } + + private static Double transformlat(double lng, double lat) { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static Double transformlng(double lng,double lat) { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + + /** + * outOfChina + * @描述: 判断是否在国内,不在国内则不做偏移 + * @param lng + * @param lat + * @return {boolean} + */ + private static boolean outOfChina(Double lng,Double lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); + }; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java index 9dd02715..35ec6404 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java @@ -2,8 +2,10 @@ package com.genersoft.iot.vmp.gb28181.utils; import gov.nist.javax.sip.address.AddressImpl; import gov.nist.javax.sip.address.SipUri; +import gov.nist.javax.sip.header.Subject; import javax.sip.header.FromHeader; +import javax.sip.header.Header; import javax.sip.message.Request; /** @@ -18,6 +20,16 @@ public class SipUtils { FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME); return getUserIdFromFromHeader(fromHeader); } + /** + * 从subject读取channelId + * */ + public static String getChannelIdFromHeader(Request request) { + Header subject = request.getHeader("subject"); + if (subject == null) { + return null; + } + return ((Subject) subject).getSubject().split(":")[0]; + } public static String getUserIdFromFromHeader(FromHeader fromHeader) { AddressImpl address = (AddressImpl)fromHeader.getAddress(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java index ba6eed5f..2caab0f8 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java @@ -20,8 +20,8 @@ import java.util.*; /** * 基于dom4j的工具包 - * - * + * + * */ public class XmlUtil { /** @@ -31,9 +31,9 @@ public class XmlUtil { /** * 解析XML为Document对象 - * + * * @param xml 被解析的XMl - * + * * @return Document */ public static Element parseXml(String xml) { @@ -51,7 +51,7 @@ public class XmlUtil { /** * 获取element对象的text的值 - * + * * @param em 节点的对象 * @param tag 节点的tag * @return 节点 @@ -62,12 +62,12 @@ public class XmlUtil { } Element e = em.element(tag); // - return null == e ? null : e.getText(); + return null == e ? null : e.getText().trim(); } /** * 递归解析xml节点,适用于 多节点数据 - * + * * @param node node * @param nodeName nodeName * @return List> @@ -106,7 +106,7 @@ public class XmlUtil { /** * xml转json - * + * * @param element * @param json */ @@ -204,13 +204,66 @@ public class XmlUtil { deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode")); deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block")); deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address")); + String businessGroupID = XmlUtil.getText(itemDevice, "BusinessGroupID"); if (XmlUtil.getText(itemDevice, "Parental") == null - || XmlUtil.getText(itemDevice, "Parental") == "") { - deviceChannel.setParental(0); + || XmlUtil.getText(itemDevice, "Parental").equals("")) { + if (deviceChannel.getChannelId().length() <= 10 + || (deviceChannel.getChannelId().length() == 20 && ( + Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 215 + || Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 216 + ) + ) + ) { + deviceChannel.setParental(1); + }else { + deviceChannel.setParental(0); + } } else { - deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental"))); + // 由于海康会错误的发送65535作为这里的取值,所以这里除非是0否则认为是1 + deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")) == 1?1:0); } - deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID")); + /** + * 行政区划展示设备树与业务分组展示设备树是两种不同的模式 + * 行政区划展示设备树 各个目录之间主要靠deviceId做关联,摄像头通过CivilCode指定其属于那个行政区划;都是不超过十位的编号; 结构如下: + * 河北省 + * --> 石家庄市 + * --> 摄像头 + * --> 正定县 + * --> 摄像头 + * --> 摄像头 + * + * 业务分组展示设备树是顶级是业务分组,其下的虚拟组织靠BusinessGroupID指定其所属的业务分组;摄像头通过ParentId来指定其所属于的虚拟组织: + * 业务分组 + * --> 虚拟组织 + * --> 摄像头 + * --> 虚拟组织 + * --> 摄像头 + * --> 摄像头 + */ + String parentId = XmlUtil.getText(itemDevice, "ParentID"); + if (parentId != null) { + if (parentId.contains("/")) { + String lastParentId = parentId.substring(parentId.lastIndexOf("/") + 1); + deviceChannel.setParentId(lastParentId); + }else { + deviceChannel.setParentId(parentId); + } + }else { + if (deviceChannel.getChannelId().length() <= 10) { // 此时为行政区划, 上下级行政区划使用DeviceId关联 + deviceChannel.setParentId(deviceChannel.getChannelId().substring(0, deviceChannel.getChannelId().length() - 2)); + }else if (deviceChannel.getChannelId().length() == 20) { + if (Integer.parseInt(deviceChannel.getChannelId().substring(10, 13)) == 216) { // 虚拟组织 + deviceChannel.setParentId(businessGroupID); + }else if (deviceChannel.getCivilCode() != null) { + // 设备, 无parentId的20位是使用CivilCode表示上级的设备, + // 注:215 业务分组是需要有parentId的 + deviceChannel.setParentId(deviceChannel.getCivilCode()); + } + }else { + deviceChannel.setParentId(deviceChannel.getDeviceId()); + } + } + if (XmlUtil.getText(itemDevice, "SafetyWay") == null || XmlUtil.getText(itemDevice, "SafetyWay") == "") { deviceChannel.setSafetyWay(0); @@ -269,4 +322,4 @@ public class XmlUtil { deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC return deviceChannel; } -} +} \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java new file mode 100644 index 00000000..249ec03c --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java @@ -0,0 +1,139 @@ +package com.genersoft.iot.vmp.media.zlm; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import okhttp3.*; +import okhttp3.logging.HttpLoggingInterceptor; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.ConnectException; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +@Component +public class AssistRESTfulUtils { + + private final static Logger logger = LoggerFactory.getLogger(AssistRESTfulUtils.class); + + public interface RequestCallback{ + void run(JSONObject response); + } + + private OkHttpClient getClient(){ + OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); + if (logger.isDebugEnabled()) { + HttpLoggingInterceptor logging = new HttpLoggingInterceptor(message -> { + logger.debug("http请求参数:" + message); + }); + logging.setLevel(HttpLoggingInterceptor.Level.BASIC); + // OkHttp進行添加攔截器loggingInterceptor + httpClientBuilder.addInterceptor(logging); + } + return httpClientBuilder.build(); + } + + + public JSONObject sendGet(MediaServerItem mediaServerItem, String api, Map param, RequestCallback callback) { + OkHttpClient client = getClient(); + + if (mediaServerItem == null) { + return null; + } + if (StringUtils.isEmpty(mediaServerItem.getRecordAssistPort())) { + logger.warn("未启用Assist服务"); + return null; + } + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(String.format("http://%s:%s/%s", mediaServerItem.getIp(), mediaServerItem.getRecordAssistPort(), api)); + JSONObject responseJSON = null; + + if (param != null && param.keySet().size() > 0) { + stringBuffer.append("?"); + int index = 1; + for (String key : param.keySet()){ + if (param.get(key) != null) { + stringBuffer.append(key + "=" + param.get(key)); + if (index < param.size()) { + stringBuffer.append("&"); + } + } + index++; + } + } + + String url = stringBuffer.toString(); + Request request = new Request.Builder() + .get() + .url(url) + .build(); + if (callback == null) { + try { + Response response = client.newCall(request).execute(); + if (response.isSuccessful()) { + ResponseBody responseBody = response.body(); + if (responseBody != null) { + String responseStr = responseBody.string(); + responseJSON = JSON.parseObject(responseStr); + } + }else { + response.close(); + Objects.requireNonNull(response.body()).close(); + } + } catch (ConnectException e) { + logger.error(String.format("连接Assist失败: %s, %s", e.getCause().getMessage(), e.getMessage())); + logger.info("请检查media配置并确认Assist已启动..."); + }catch (IOException e) { + logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage())); + } + }else { + client.newCall(request).enqueue(new Callback(){ + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response){ + if (response.isSuccessful()) { + try { + String responseStr = Objects.requireNonNull(response.body()).string(); + callback.run(JSON.parseObject(responseStr)); + } catch (IOException e) { + logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage())); + } + + }else { + response.close(); + Objects.requireNonNull(response.body()).close(); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + logger.error(String.format("连接Assist失败: %s, %s", e.getCause().getMessage(), e.getMessage())); + logger.info("请检查media配置并确认Assist已启动..."); + } + }); + } + + + + return responseJSON; + } + + + public JSONObject fileDuration(MediaServerItem mediaServerItem, String app, String stream, RequestCallback callback){ + Map param = new HashMap<>(); + param.put("app",app); + param.put("stream",stream); + param.put("recordIng",true); + return sendGet(mediaServerItem, "api/record/file/duration",param, callback); + } + +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 57ba4a5b..7f62968a 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -2,12 +2,10 @@ package com.genersoft.iot.vmp.media.zlm; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.MediaConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.GbStream; @@ -17,9 +15,8 @@ import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.media.zlm.dto.*; import com.genersoft.iot.vmp.service.*; -import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -54,7 +51,7 @@ public class ZLMHttpHookListener { private IPlayService playService; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -81,14 +78,11 @@ public class ZLMHttpHookListener { private ZLMHttpHookSubscribe subscribe; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private VideoStreamSessionManager sessionManager; - @Autowired - private ZLMRESTfulUtils zlmresTfulUtils; - /** * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 * @@ -192,6 +186,12 @@ public class ZLMHttpHookListener { ret.put("code", 0); ret.put("msg", "success"); ret.put("enable_hls", true); + if (json.getInteger("originType") == 1 + || json.getInteger("originType") == 2 + || json.getInteger("originType") == 3) { + ret.put("enable_audio", true); + } + String mediaServerId = json.getString("mediaServerId"); ZLMHttpHookSubscribe.Event subscribe = this.subscribe.getSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, json); if (subscribe != null) { @@ -206,9 +206,9 @@ public class ZLMHttpHookListener { String app = json.getString("app"); String stream = json.getString("stream"); if ("rtp".equals(app)) { - ret.put("enable_mp4", userSetup.getRecordSip()); + ret.put("enable_mp4", userSetting.getRecordSip()); }else { - ret.put("enable_mp4", userSetup.isRecordPushLive()); + ret.put("enable_mp4", userSetting.isRecordPushLive()); } List ssrcTransactionForAll = sessionManager.getSsrcTransactionForAll(null, null, null, stream); if (ssrcTransactionForAll != null && ssrcTransactionForAll.size() == 1) { @@ -218,7 +218,16 @@ public class ZLMHttpHookListener { if (deviceChannel != null) { ret.put("enable_audio", deviceChannel.isHasAudio()); } + // 如果是录像下载就设置视频间隔十秒 + if (ssrcTransactionForAll.get(0).getType() == VideoStreamSessionManager.SessionType.download) { + ret.put("mp4_max_second", 10); + ret.put("enable_mp4", true); + ret.put("enable_audio", true); + } + } + + return new ResponseEntity(ret.toString(), HttpStatus.OK); } @@ -327,7 +336,6 @@ public class ZLMHttpHookListener { if (mediaInfo != null) { subscribe.response(mediaInfo, json); } - } // 流消失移除redis play String app = item.getApp(); @@ -388,7 +396,7 @@ public class ZLMHttpHookListener { } } if (gbStreams.size() > 0) { - eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON); +// eventPublisher.catalogEventPublishForStream(null, gbStreams, CatalogEvent.ON); } }else { @@ -400,14 +408,14 @@ public class ZLMHttpHookListener { } GbStream gbStream = storager.getGbStream(app, streamId); if (gbStream != null) { - eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF); +// eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF); } zlmMediaListManager.removeMedia(app, streamId); } if (type != null) { // 发送流变化redis消息 JSONObject jsonObject = new JSONObject(); - jsonObject.put("serverId", userSetup.getServerId()); + jsonObject.put("serverId", userSetting.getServerId()); jsonObject.put("app", app); jsonObject.put("stream", streamId); jsonObject.put("register", regist); @@ -444,6 +452,7 @@ public class ZLMHttpHookListener { if ("rtp".equals(app)){ ret.put("close", true); StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId); + SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, null, streamId); if (streamInfoForPlayCatch != null) { // 如果在给上级推流,也不停止。 if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) { @@ -481,18 +490,6 @@ public class ZLMHttpHookListener { streamProxyService.del(app, streamId); String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url(); logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", app, streamId, url); - - }else if (streamProxyItem != null && streamProxyItem.isEnable()) { - MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); - if(null!=mediaServerItem){ - JSONObject jsonObject = zlmresTfulUtils.closeStreams(mediaServerItem,streamProxyItem.getApp(), streamProxyItem.getStream()); - if (jsonObject.getInteger("code") == 0) { - streamProxyItem.setEnable(false); - storager.updateStreamProxy(streamProxyItem); - } - }else { - ret.put("close", false); - } }else { ret.put("close", false); } @@ -512,7 +509,7 @@ public class ZLMHttpHookListener { } String mediaServerId = json.getString("mediaServerId"); MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); - if (userSetup.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) { + if (userSetting.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) { String app = json.getString("app"); String streamId = json.getString("stream"); if ("rtp".equals(app)) { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java index 84b36e3e..ffd8ec90 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -31,6 +32,7 @@ public class ZLMHttpHookSubscribe { on_server_keepalive } + @FunctionalInterface public interface Event{ void response(MediaServerItem mediaServerItem, JSONObject response); } @@ -38,12 +40,7 @@ public class ZLMHttpHookSubscribe { private Map> allSubscribes = new ConcurrentHashMap<>(); public void addSubscribe(HookType type, JSONObject hookResponse, ZLMHttpHookSubscribe.Event event) { - Map eventMap = allSubscribes.get(type); - if (eventMap == null) { - eventMap = new HashMap(); - allSubscribes.put(type,eventMap); - } - eventMap.put(hookResponse, event); + allSubscribes.computeIfAbsent(type, k -> new ConcurrentHashMap<>()).put(hookResponse, event); } public ZLMHttpHookSubscribe.Event getSubscribe(HookType type, JSONObject hookResponse) { @@ -80,21 +77,31 @@ public class ZLMHttpHookSubscribe { Set> entries = eventMap.entrySet(); if (entries.size() > 0) { - for (Map.Entry entry : entries) { + List> entriesToRemove = new ArrayList<>(); + for (Map.Entry entry : entries) { JSONObject key = entry.getKey(); Boolean result = null; for (String s : key.keySet()) { if (result == null) { result = key.getString(s).equals(hookResponse.getString(s)); }else { - if (key.getString(s) == null) continue; + if (key.getString(s) == null) { + continue; + } result = result && key.getString(s).equals(hookResponse.getString(s)); } } if (null != result && result){ + entriesToRemove.add(entry); + } + } + + if (!CollectionUtils.isEmpty(entriesToRemove)) { + for (Map.Entry entry : entriesToRemove) { entries.remove(entry); } } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java index c8844959..9beac16f 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java @@ -1,20 +1,18 @@ package com.genersoft.iot.vmp.media.zlm; import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.GbStream; -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.media.zlm.dto.*; import com.genersoft.iot.vmp.service.IStreamProxyService; import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper; import com.genersoft.iot.vmp.storager.dao.StreamPushMapper; +import org.checkerframework.checker.units.qual.C; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +20,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,7 +36,7 @@ public class ZLMMediaListManager { private IRedisCatchStorage redisCatchStorage; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private GbStreamMapper gbStreamMapper; @@ -58,7 +57,9 @@ public class ZLMMediaListManager { private ZLMHttpHookSubscribe subscribe; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; + + private Map channelOnlineEvents = new ConcurrentHashMap<>(); public void updateMediaList(MediaServerItem mediaServerItem) { @@ -66,7 +67,9 @@ public class ZLMMediaListManager { // 使用异步的当时更新媒体流列表 zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ - if (mediaList == null) return; + if (mediaList == null) { + return; + } String dataStr = mediaList.getString("data"); Integer code = mediaList.getInteger("code"); @@ -109,7 +112,7 @@ public class ZLMMediaListManager { // 查找此直播流是否存在redis预设gbId StreamPushItem transform = streamPushService.transform(mediaItem); // 从streamId取出查询关键值 - Pattern pattern = Pattern.compile(userSetup.getThirdPartyGBIdReg()); + Pattern pattern = Pattern.compile(userSetting.getThirdPartyGBIdReg()); Matcher matcher = pattern.matcher(mediaItem.getStream());// 指定要匹配的字符串 String queryKey = null; if (matcher.find()) { //此处find()每次被调用后,会偏移到下一个匹配 @@ -128,21 +131,44 @@ public class ZLMMediaListManager { if (gbStreams.size() > 0) { for (GbStream gbStream : gbStreams) { // 出现使用相同国标Id的视频流时,使用新流替换旧流, - gbStreamMapper.del(gbStream.getApp(), gbStream.getStream()); - if (!gbStream.isStatus()) { - streamPushMapper.del(gbStream.getApp(), gbStream.getStream()); + if (queryKey != null && gbStream.getApp().equals(mediaItem.getApp())) { + Matcher matcherForStream = pattern.matcher(gbStream.getStream()); + String queryKeyForStream = null; + if (matcherForStream.find()) { //此处find()每次被调用后,会偏移到下一个匹配 + queryKeyForStream = matcherForStream.group(); + } + if (queryKeyForStream == null || !queryKeyForStream.equals(queryKey)) { + // 此时不是同一个流 + gbStreamMapper.del(gbStream.getApp(), gbStream.getStream()); + if (!gbStream.isStatus()) { + streamPushMapper.del(gbStream.getApp(), gbStream.getStream()); + } + } } } } - StreamProxyItem streamProxyItem = gbStreamMapper.selectOne(transform.getApp(), transform.getStream()); - if (streamProxyItem != null) { - transform.setGbStreamId(streamProxyItem.getGbStreamId()); + // StreamProxyItem streamProxyItem = gbStreamMapper.selectOne(transform.getApp(), transform.getStream()); + List gbStreamList = gbStreamMapper.selectByGBId(transform.getGbId()); + if (gbStreamList != null && gbStreamList.size() == 1) { + transform.setGbStreamId(gbStreamList.get(0).getGbStreamId()); + transform.setPlatformId(gbStreamList.get(0).getPlatformId()); + transform.setCatalogId(gbStreamList.get(0).getCatalogId()); + transform.setGbId(gbStreamList.get(0).getGbId()); gbStreamMapper.update(transform); + streamPushMapper.del(gbStreamList.get(0).getApp(), gbStreamList.get(0).getStream()); }else { transform.setCreateStamp(System.currentTimeMillis()); gbStreamMapper.add(transform); } + if (transform != null) { + if (channelOnlineEvents.get(transform.getGbId()) != null) { + channelOnlineEvents.get(transform.getGbId()).run(transform.getApp(), transform.getStream()); + channelOnlineEvents.remove(transform.getGbId()); + } + } } + + storager.updateMedia(transform); return transform; } @@ -152,7 +178,9 @@ public class ZLMMediaListManager { //使用异步更新推流 zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId, "rtmp", json->{ - if (json == null) return; + if (json == null) { + return; + } String dataStr = json.getString("data"); Integer code = json.getInteger("code"); @@ -180,11 +208,20 @@ public class ZLMMediaListManager { if (streamProxyItem == null) { result = storager.removeMedia(app, streamId); }else { + // TODO 暂不设置为离线 result =storager.mediaOutline(app, streamId); } return result; } + public void addChannelOnlineEventLister(String key, ChannelOnlineEvent callback) { + this.channelOnlineEvents.put(key,callback); + } + + public void removedChannelOnlineEventLister(String key) { + this.channelOnlineEvents.remove(key); + } + // public void clearAllSessions() { diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index d0b1cb2d..4b2bf487 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -269,6 +269,11 @@ public class ZLMRESTfulUtils { param.put("url", url); param.put("enable_hls", enable_hls?1:0); param.put("enable_mp4", enable_mp4?1:0); + param.put("enable_rtmp", 1); + param.put("enable_fmp4", 1); + param.put("enable_audio", 1); + param.put("enable_rtsp", 1); + param.put("add_mute_audio", 1); param.put("rtp_type", rtp_type); return sendPost(mediaServerItem, "addStreamProxy",param, null); } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java index 9f22f826..a7e60167 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java @@ -23,7 +23,9 @@ public class ZLMRTPServerFactory { private int[] portRangeArray = new int[2]; public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List usedFreelist) { - if (endPort <= startPort) return -1; + if (endPort <= startPort) { + return -1; + } if (usedFreelist == null) { usedFreelist = new ArrayList<>(); } @@ -81,14 +83,20 @@ public class ZLMRTPServerFactory { return result; } - public int createRTPServer(MediaServerItem mediaServerItem, String streamId) { - - Map param = new HashMap<>(); + public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc) { int result = -1; + // 查询此rtp server 是否已经存在 + JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); + if (rtpInfo != null && rtpInfo.getInteger("code") == 0 && rtpInfo.getBoolean("exist")) { + result = rtpInfo.getInteger("local_port"); + return result; + } + Map param = new HashMap<>(); // 推流端口设置0则使用随机端口 param.put("enable_tcp", 1); param.put("stream_id", streamId); param.put("port", 0); + param.put("ssrc", ssrc); JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); if (openRtpServerResultJson != null) { @@ -244,7 +252,7 @@ public class ZLMRTPServerFactory { logger.error("RTP推流失败: 请检查ZLM服务"); } else if (jsonObject.getInteger("code") == 0) { result= true; - logger.info("RTP推流成功[ {}/{} ],本地推流端口:{}" ,param.get("app"), param.get("stream"), jsonObject.getString("local_port")); + logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); } else { logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); } @@ -301,7 +309,7 @@ public class ZLMRTPServerFactory { result= true; logger.info("停止RTP推流成功"); } else { - logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); + logger.error("停止RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); } return result; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index 9d0e354c..12829e90 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -51,6 +52,9 @@ public class ZLMRunner implements CommandLineRunner { @Autowired private MediaConfig mediaConfig; + @Autowired + private DynamicTask dynamicTask; + @Qualifier("taskExecutor") @Autowired private ThreadPoolTaskExecutor taskExecutor; @@ -67,7 +71,7 @@ public class ZLMRunner implements CommandLineRunner { } mediaServerService.syncCatchFromDatabase(); // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 - hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null, + hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,new JSONObject(), (MediaServerItem mediaServerItem, JSONObject response)->{ ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class); if (zlmServerConfig !=null ) { @@ -79,7 +83,7 @@ public class ZLMRunner implements CommandLineRunner { }); // 订阅 zlm保活事件, 当zlm离线时做业务的处理 - hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,null, + hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_keepalive,new JSONObject(), (MediaServerItem mediaServerItem, JSONObject response)->{ String mediaServerId = response.getString("mediaServerId"); if (mediaServerId !=null ) { @@ -97,27 +101,25 @@ public class ZLMRunner implements CommandLineRunner { all.add(mediaConfig.getMediaSerItem()); } for (MediaServerItem mediaServerItem : all) { - if (startGetMedia == null) startGetMedia = new HashMap<>(); + if (startGetMedia == null) { + startGetMedia = new HashMap<>(); + } startGetMedia.put(mediaServerItem.getId(), true); taskExecutor.execute(()->{ connectZlmServer(mediaServerItem); }); } - Timer timer = new Timer(); - // 10分钟后未连接到则不再去主动连接, TODO 并对重启前使用此在zlm的通道发送bye - timer.schedule(new TimerTask() { - @Override - public void run() { + String taskKey = "zlm-connect-timeout"; + dynamicTask.startDelay(taskKey, ()->{ if (startGetMedia != null) { Set allZlmId = startGetMedia.keySet(); for (String id : allZlmId) { - logger.error("[ {} ]]主动连接失败,不再主动连接", id); + logger.error("[ {} ]]主动连接失败,不再尝试连接", id); } startGetMedia = null; } - // TODO 清理数据库中与redis不匹配的zlm - } - }, 60 * 1000 * 10); + // TODO 清理数据库中与redis不匹配的zlm + }, 6 * 1000 ); } @Async @@ -139,12 +141,12 @@ public class ZLMRunner implements CommandLineRunner { if ( startGetMedia.get(mediaServerItem.getId()) == null || !startGetMedia.get(mediaServerItem.getId())) { return null; } - JSONObject responseJSON = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); - ZLMServerConfig ZLMServerConfig = null; - if (responseJSON != null) { - JSONArray data = responseJSON.getJSONArray("data"); + JSONObject responseJson = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); + ZLMServerConfig zlmServerConfig = null; + if (responseJson != null) { + JSONArray data = responseJson.getJSONArray("data"); if (data != null && data.size() > 0) { - ZLMServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); + zlmServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); } } else { logger.error("[ {} ]-[ {}:{} ]第{}次主动连接失败, 2s后重试", @@ -159,9 +161,9 @@ public class ZLMRunner implements CommandLineRunner { } catch (InterruptedException e) { e.printStackTrace(); } - ZLMServerConfig = getMediaServerConfig(mediaServerItem, index += 1); + zlmServerConfig = getMediaServerConfig(mediaServerItem, index += 1); } - return ZLMServerConfig; + return zlmServerConfig; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ChannelOnlineEvent.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ChannelOnlineEvent.java new file mode 100644 index 00000000..ba7daecd --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ChannelOnlineEvent.java @@ -0,0 +1,6 @@ +package com.genersoft.iot.vmp.media.zlm.dto; + +public interface ChannelOnlineEvent { + + void run(String app, String stream); +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java index 39685b0b..b7a13992 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java @@ -29,18 +29,22 @@ public class StreamProxyItem extends GbStream { this.type = type; } + @Override public String getApp() { return app; } + @Override public void setApp(String app) { this.app = app; } + @Override public String getStream() { return stream; } + @Override public void setStream(String stream) { this.stream = stream; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java index 13368070..81c9c768 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java @@ -124,18 +124,22 @@ public class StreamPushItem extends GbStream implements Comparable gbStreams); - DeviceChannel getDeviceChannelListByStream(GbStream gbStream, String catalogId, String deviceGBId); + DeviceChannel getDeviceChannelListByStream(GbStream gbStream, String catalogId, ParentPlatform platform); void sendCatalogMsg(GbStream gbStream, String type); void sendCatalogMsgs(List gbStreams, String type); diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java index 00ec0dd5..4614ee7d 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java @@ -44,9 +44,9 @@ public interface IMediaServerService { void updateVmServer(List mediaServerItemList); - SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId); + SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck); - SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback); + SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback); void closeRTPServer(String deviceId, String channelId, String ssrc); diff --git a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java index 4cff4a68..9e764931 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.service; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; @@ -34,4 +35,9 @@ public interface IPlayService { DeferredResult> playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); void zlmServerOffline(String mediaServerId); + + DeferredResult> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); + DeferredResult> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); + + StreamInfo getDownLoadInfo(String deviceId, String channelId, String stream); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/StreamGPSSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/service/StreamGPSSubscribeTask.java index fd5bb060..5bdd9f5d 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/StreamGPSSubscribeTask.java +++ b/src/main/java/com/genersoft/iot/vmp/service/StreamGPSSubscribeTask.java @@ -2,7 +2,7 @@ package com.genersoft.iot.vmp.service; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -20,7 +20,7 @@ public class StreamGPSSubscribeTask { private IRedisCatchStorage redisCatchStorage; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java deleted file mode 100644 index cb027c82..00000000 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.genersoft.iot.vmp.service.bean; - -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.sip.ResponseEvent; - -public class CatalogSubscribeTask implements Runnable{ - private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class); - private Device device; - private ISIPCommander sipCommander; - - public CatalogSubscribeTask(Device device, ISIPCommander sipCommander) { - this.device = device; - this.sipCommander = sipCommander; - } - - @Override - public void run() { - sipCommander.catalogSubscribe(device, eventResult -> { - ResponseEvent event = (ResponseEvent) eventResult.event; - Element rootElement = null; - if (event.getResponse().getRawContent() != null) { - // 成功 - logger.info("[目录订阅]成功: {}", device.getDeviceId()); - }else { - // 成功 - logger.info("[目录订阅]成功: {}", device.getDeviceId()); - } - },eventResult -> { - // 失败 - logger.warn("[目录订阅]失败,信令发送失败: {}-{} ", device.getDeviceId(), eventResult.msg); - }); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannel.java b/src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannel.java new file mode 100644 index 00000000..3ab1b80d --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannel.java @@ -0,0 +1,112 @@ +package com.genersoft.iot.vmp.service.bean; + +/** + * 当上级平台 + */ +public class MessageForPushChannel { + /** + * 消息类型 + * 0 流注销 1 流注册 + */ + private int type; + + /** + * 流应用名 + */ + private String app; + + /** + * 流Id + */ + private String stream; + + /** + * 国标ID + */ + private String gbId; + + /** + * 请求的平台ID + */ + private String platFormId; + + /** + * 请求平台名称 + */ + private String platFormName; + + /** + * WVP服务ID + */ + private String serverId; + + /** + * 目标流媒体节点ID + */ + private String mediaServerId; + + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + + public void setStream(String stream) { + this.stream = stream; + } + + public String getGbId() { + return gbId; + } + + public void setGbId(String gbId) { + this.gbId = gbId; + } + + public String getPlatFormId() { + return platFormId; + } + + public void setPlatFormId(String platFormId) { + this.platFormId = platFormId; + } + + public String getPlatFormName() { + return platFormName; + } + + public void setPlatFormName(String platFormName) { + this.platFormName = platFormName; + } + + public String getServerId() { + return serverId; + } + + public void setServerId(String serverId) { + this.serverId = serverId; + } + + public String getMediaServerId() { + return mediaServerId; + } + + public void setMediaServerId(String mediaServerId) { + this.mediaServerId = mediaServerId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java index 0fc6f4cf..39a59f80 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java @@ -3,13 +3,21 @@ package com.genersoft.iot.vmp.service.impl; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler; import com.genersoft.iot.vmp.service.IDeviceService; -import com.genersoft.iot.vmp.service.bean.CatalogSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; +import javax.sip.DialogState; + /** * 设备业务(目录订阅) */ @@ -20,29 +28,28 @@ public class DeviceServiceImpl implements IDeviceService { @Autowired private DynamicTask dynamicTask; -; @Autowired private ISIPCommander sipCommander; + @Autowired + private CatalogResponseMessageHandler catalogResponseMessageHandler; + + @Autowired + private IRedisCatchStorage redisCatchStorage; + @Override public boolean addCatalogSubscribe(Device device) { if (device == null || device.getSubscribeCycleForCatalog() < 0) { return false; } - if (dynamicTask.contains(device.getDeviceId())) { - // 存在则停止现有的,开启新的 - dynamicTask.stop(device.getDeviceId()); - } logger.info("[添加目录订阅] 设备{}", device.getDeviceId()); // 添加目录订阅 - CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander); - catalogSubscribeTask.run(); + CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander, dynamicTask); // 提前开始刷新订阅 - int subscribeCycleForCatalog = device.getSubscribeCycleForCatalog(); + int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30); // 设置最小值为30 - subscribeCycleForCatalog = Math.max(subscribeCycleForCatalog, 30); - dynamicTask.startCron(device.getDeviceId(), catalogSubscribeTask, subscribeCycleForCatalog - 5); + dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, subscribeCycleForCatalog -1); return true; } @@ -52,9 +59,56 @@ public class DeviceServiceImpl implements IDeviceService { return false; } logger.info("移除目录订阅: {}", device.getDeviceId()); - dynamicTask.stop(device.getDeviceId()); - device.setSubscribeCycleForCatalog(0); - sipCommander.catalogSubscribe(device, null, null); + dynamicTask.stop(device.getDeviceId() + "catalog"); return true; } + + @Override + public boolean addMobilePositionSubscribe(Device device) { + if (device == null || device.getSubscribeCycleForMobilePosition() < 0) { + return false; + } + logger.info("[添加移动位置订阅] 设备{}", device.getDeviceId()); + // 添加目录订阅 + MobilePositionSubscribeTask mobilePositionSubscribeTask = new MobilePositionSubscribeTask(device, sipCommander, dynamicTask); + // 设置最小值为30 + int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30); + // 提前开始刷新订阅 + dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog -1 ); + return true; + } + + @Override + public boolean removeMobilePositionSubscribe(Device device) { + if (device == null || device.getSubscribeCycleForCatalog() < 0) { + return false; + } + logger.info("移除移动位置订阅: {}", device.getDeviceId()); + dynamicTask.stop(device.getDeviceId() + "mobile_position"); + return true; + } + + @Override + public SyncStatus getChannelSyncStatus(String deviceId) { + return catalogResponseMessageHandler.getChannelSyncProgress(deviceId); + } + + @Override + public Boolean isSyncRunning(String deviceId) { + return catalogResponseMessageHandler.isSyncRunning(deviceId); + } + + @Override + public void sync(Device device) { + if (catalogResponseMessageHandler.isSyncRunning(device.getDeviceId())) { + logger.info("开启同步时发现同步已经存在"); + return; + } + int sn = (int)((Math.random()*9+1)*100000); + catalogResponseMessageHandler.setChannelSyncReady(device, sn); + sipCommander.catalogQuery(device, sn, event -> { + String errorMsg = String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg); + catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); + }); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java index 32a1305d..a7a55281 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java @@ -70,7 +70,9 @@ public class GbStreamServiceImpl implements IGbStreamService { boolean result = false; TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); ParentPlatform parentPlatform = platformMapper.getParentPlatByServerGBId(platformId); - if (catalogId == null) catalogId = parentPlatform.getCatalogId(); + if (catalogId == null) { + catalogId = parentPlatform.getCatalogId(); + } try { List deviceChannelList = new ArrayList<>(); for (GbStream gbStream : gbStreams) { @@ -78,7 +80,7 @@ public class GbStreamServiceImpl implements IGbStreamService { gbStream.setPlatformId(platformId); // TODO 修改为批量提交 platformGbStreamMapper.add(gbStream); - DeviceChannel deviceChannelListByStream = getDeviceChannelListByStream(gbStream, catalogId, parentPlatform.getDeviceGBId()); + DeviceChannel deviceChannelListByStream = getDeviceChannelListByStream(gbStream, catalogId, parentPlatform); deviceChannelList.add(deviceChannelListByStream); } dataSourceTransactionManager.commit(transactionStatus); //手动提交 @@ -92,18 +94,23 @@ public class GbStreamServiceImpl implements IGbStreamService { } @Override - public DeviceChannel getDeviceChannelListByStream(GbStream gbStream, String catalogId, String deviceGBId) { + public DeviceChannel getDeviceChannelListByStream(GbStream gbStream, String catalogId, ParentPlatform platform) { DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(gbStream.getGbId()); deviceChannel.setName(gbStream.getName()); deviceChannel.setLongitude(gbStream.getLongitude()); deviceChannel.setLatitude(gbStream.getLatitude()); - deviceChannel.setDeviceId(deviceGBId); + deviceChannel.setDeviceId(platform.getDeviceGBId()); deviceChannel.setManufacture("wvp-pro"); - deviceChannel.setStatus(gbStream.isStatus()?1:0); +// deviceChannel.setStatus(gbStream.isStatus()?1:0); + deviceChannel.setStatus(1); deviceChannel.setParentId(catalogId ==null?gbStream.getCatalogId():catalogId); deviceChannel.setRegisterWay(1); - deviceChannel.setCivilCode(sipConfig.getDomain().substring(0, sipConfig.getDomain().length() - 2)); + if (catalogId.length() <= 10) { // 父节点是行政区划,则设置CivilCode使用此行政区划 + deviceChannel.setCivilCode(catalogId); + }else { + deviceChannel.setCivilCode(platform.getAdministrativeDivision()); + } deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setParental(0); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index 43312a8f..e311890c 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -4,10 +4,8 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; -import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.session.SsrcConfig; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; @@ -15,11 +13,10 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamProxyService; import com.genersoft.iot.vmp.service.bean.SSRCInfo; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.MediaServerMapper; import com.genersoft.iot.vmp.utils.redis.JedisUtil; import com.genersoft.iot.vmp.utils.redis.RedisUtil; @@ -29,10 +26,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.CommandLineRunner; -import org.springframework.core.annotation.Order; import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; @@ -60,7 +54,7 @@ public class MediaServerServiceImpl implements IMediaServerService { private Integer serverPort; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; @@ -84,7 +78,7 @@ public class MediaServerServiceImpl implements IMediaServerService { private RedisUtil redisUtil; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IStreamProxyService streamProxyService; @@ -111,10 +105,10 @@ public class MediaServerServiceImpl implements IMediaServerService { if (mediaServerItem.getSsrcConfig() == null) { SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain()); mediaServerItem.setSsrcConfig(ssrcConfig); - redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerItem.getId(), mediaServerItem); + redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(), mediaServerItem); } // 查询redis是否存在此mediaServer - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerItem.getId(); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(); if (!redisUtil.hasKey(key)) { redisUtil.set(key, mediaServerItem); } @@ -123,17 +117,17 @@ public class MediaServerServiceImpl implements IMediaServerService { } @Override - public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId) { - return openRTPServer(mediaServerItem, streamId, false); + public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck) { + return openRTPServer(mediaServerItem, streamId, null, ssrcCheck,false); } @Override - public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback) { + public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck, boolean isPlayback) { if (mediaServerItem == null || mediaServerItem.getId() == null) { return null; } // 获取mediaServer可用的ssrc - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerItem.getId(); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(); SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig(); if (ssrcConfig == null) { @@ -141,10 +135,14 @@ public class MediaServerServiceImpl implements IMediaServerService { return null; }else { String ssrc = null; - if (isPlayback) { - ssrc = ssrcConfig.getPlayBackSsrc(); + if (presetSsrc != null) { + ssrc = presetSsrc; }else { - ssrc = ssrcConfig.getPlaySsrc(); + if (isPlayback) { + ssrc = ssrcConfig.getPlayBackSsrc(); + }else { + ssrc = ssrcConfig.getPlaySsrc(); + } } if (streamId == null) { @@ -152,7 +150,7 @@ public class MediaServerServiceImpl implements IMediaServerService { } int rtpServerPort = mediaServerItem.getRtpProxyPort(); if (mediaServerItem.isRtpEnable()) { - rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId); + rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0); } redisUtil.set(key, mediaServerItem); return new SSRCInfo(rtpServerPort, ssrc, streamId); @@ -181,7 +179,7 @@ public class MediaServerServiceImpl implements IMediaServerService { SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig(); ssrcConfig.releaseSsrc(ssrc); mediaServerItem.setSsrcConfig(ssrcConfig); - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerItem.getId(); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(); redisUtil.set(key, mediaServerItem); } @@ -191,7 +189,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public void clearRTPServer(MediaServerItem mediaServerItem) { mediaServerItem.setSsrcConfig(new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain())); - redisUtil.zAdd(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(), mediaServerItem.getId(), 0); + redisUtil.zAdd(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(), mediaServerItem.getId(), 0); } @@ -211,15 +209,15 @@ public class MediaServerServiceImpl implements IMediaServerService { ) ); } - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerItemInDataBase.getId(); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItemInDataBase.getId(); redisUtil.set(key, mediaServerItemInDataBase); } @Override public List getAll() { List result = new ArrayList<>(); - List mediaServerKeys = redisUtil.scan(String.format("%S*", VideoManagerConstants.MEDIA_SERVER_PREFIX+ userSetup.getServerId() + "_" )); - String onlineKey = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + List mediaServerKeys = redisUtil.scan(String.format("%S*", VideoManagerConstants.MEDIA_SERVER_PREFIX+ userSetting.getServerId() + "_" )); + String onlineKey = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); for (Object mediaServerKey : mediaServerKeys) { String key = (String) mediaServerKey; MediaServerItem mediaServerItem = (MediaServerItem) redisUtil.get(key); @@ -250,13 +248,13 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public List getAllOnline() { - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); Set mediaServerIdSet = redisUtil.zRevRange(key, 0, -1); List result = new ArrayList<>(); if (mediaServerIdSet != null && mediaServerIdSet.size() > 0) { for (String mediaServerId : mediaServerIdSet) { - String serverKey = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerId; + String serverKey = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId; result.add((MediaServerItem) redisUtil.get(serverKey)); } } @@ -274,7 +272,7 @@ public class MediaServerServiceImpl implements IMediaServerService { if (mediaServerId == null) { return null; } - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + mediaServerId; + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId; return (MediaServerItem)redisUtil.get(key); } @@ -286,7 +284,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public void clearMediaServerForOnline() { - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); redisUtil.del(key); } @@ -393,7 +391,7 @@ public class MediaServerServiceImpl implements IMediaServerService { return; } mediaServerMapper.update(serverItem); - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId(); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId(); if (redisUtil.get(key) == null) { SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain()); serverItem.setSsrcConfig(ssrcConfig); @@ -404,8 +402,9 @@ public class MediaServerServiceImpl implements IMediaServerService { redisUtil.set(key, serverItem); resetOnlineServerItem(serverItem); updateMediaServerKeepalive(serverItem.getId(), null); - setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable())); - + if (serverItem.isAutoConfig()) { + setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable())); + } publisher.zlmOnlineEventPublish(serverItem.getId()); logger.info("[ ZLM:{} ]-[ {}:{} ]连接成功", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); @@ -420,7 +419,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public void resetOnlineServerItem(MediaServerItem serverItem) { // 更新缓存 - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); // 使用zset的分数作为当前并发量, 默认值设置为0 if (redisUtil.zScore(key, serverItem.getId()) == null) { // 不存在则设置默认值 已存在则重置 redisUtil.zAdd(key, serverItem.getId(), 0L); @@ -446,14 +445,14 @@ public class MediaServerServiceImpl implements IMediaServerService { if (mediaServerId == null) { return; } - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); redisUtil.zIncrScore(key, mediaServerId, 1); } @Override public void removeCount(String mediaServerId) { - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); redisUtil.zIncrScore(key, mediaServerId, - 1); } @@ -463,7 +462,7 @@ public class MediaServerServiceImpl implements IMediaServerService { */ @Override public MediaServerItem getMediaServerForMinimumLoad() { - String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(); if (redisUtil.zSize(key) == null || redisUtil.zSize(key) == 0) { logger.info("获取负载最低的节点时无在线节点"); @@ -617,8 +616,8 @@ public class MediaServerServiceImpl implements IMediaServerService { @Override public void delete(String id) { - redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId(), id); - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + id; + redisUtil.zRemove(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(), id); + String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + id; redisUtil.del(key); } @Override @@ -636,7 +635,7 @@ public class MediaServerServiceImpl implements IMediaServerService { logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息"); return; } - String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetup.getServerId() + "_" + mediaServerId; + String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + mediaServerId; int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2; redisUtil.set(key, data, hookAliveInterval); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index 3c776b49..2c084a55 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -6,11 +6,10 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.service.IMediaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,7 +21,7 @@ public class MediaServiceImpl implements IMediaService { private IRedisCatchStorage redisCatchStorage; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IMediaServerService mediaServerService; @@ -55,7 +54,9 @@ public class MediaServiceImpl implements IMediaService { if (mediaList != null) { if (mediaList.getInteger("code") == 0) { JSONArray data = mediaList.getJSONArray("data"); - if (data == null) return null; + if (data == null) { + return null; + } JSONObject mediaJSON = JSON.parseObject(JSON.toJSONString(data.get(0)), JSONObject.class); JSONArray tracks = mediaJSON.getJSONArray("tracks"); streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java index 9ee58673..f2b6c282 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java @@ -4,7 +4,8 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; @@ -12,6 +13,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; +import com.genersoft.iot.vmp.gb28181.utils.DateUtil; +import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -21,14 +24,13 @@ import com.genersoft.iot.vmp.service.bean.PlayBackCallback; import com.genersoft.iot.vmp.service.bean.PlayBackResult; import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; import com.genersoft.iot.vmp.service.IMediaService; import com.genersoft.iot.vmp.service.IPlayService; import gov.nist.javax.sip.stack.SIPDialog; -import jdk.nashorn.internal.ir.RuntimeNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -38,10 +40,9 @@ import org.springframework.stereotype.Service; import org.springframework.util.ResourceUtils; import org.springframework.web.context.request.async.DeferredResult; -import javax.sip.header.CallIdHeader; -import javax.sip.header.Header; -import javax.sip.message.Request; +import javax.sip.ResponseEvent; import java.io.FileNotFoundException; +import java.math.BigDecimal; import java.util.*; @SuppressWarnings(value = {"rawtypes", "unchecked"}) @@ -51,7 +52,7 @@ public class PlayServiceImpl implements IPlayService { private final static Logger logger = LoggerFactory.getLogger(PlayServiceImpl.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommander cmder; @@ -71,6 +72,9 @@ public class PlayServiceImpl implements IPlayService { @Autowired private ZLMRESTfulUtils zlmresTfulUtils; + @Autowired + private AssistRESTfulUtils assistRESTfulUtils; + @Autowired private IMediaService mediaService; @@ -81,7 +85,10 @@ public class PlayServiceImpl implements IPlayService { private VideoStreamSessionManager streamSession; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; + + @Autowired + private DynamicTask dynamicTask; @@ -97,7 +104,7 @@ public class PlayServiceImpl implements IPlayService { String uuid = UUID.randomUUID().toString(); msg.setId(uuid); playResult.setUuid(uuid); - DeferredResult> result = new DeferredResult<>(userSetup.getPlayTimeout()); + DeferredResult> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); playResult.setResult(result); // 录像查询以channelId作为deviceId查询 resultHolder.put(key, uuid, result); @@ -186,7 +193,7 @@ public class PlayServiceImpl implements IPlayService { if (mediaServerItem.isRtpEnable()) { streamId = String.format("%s_%s", device.getDeviceId(), channelId); } - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck()); play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response)->{ if (hookEvent != null) { hookEvent.response(mediaServerItem, response); @@ -230,42 +237,67 @@ public class PlayServiceImpl implements IPlayService { streamId = String.format("%s_%s", device.getDeviceId(), channelId); } if (ssrcInfo == null) { - ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); + ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck()); } // 超时处理 - Timer timer = new Timer(); + String timeOutTaskKey = UUID.randomUUID().toString(); SSRCInfo finalSsrcInfo = ssrcInfo; - timer.schedule(new TimerTask() { - @Override - public void run() { - logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", device.getDeviceId(), channelId)); + dynamicTask.startDelay( timeOutTaskKey,()->{ + logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", device.getDeviceId(), channelId)); - SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - if (dialog != null) { - timeoutCallback.run(1, "收流超时"); - // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 - cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null); - }else { - timeoutCallback.run(0, "点播超时"); - mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - } + SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + if (dialog != null) { + timeoutCallback.run(1, "收流超时"); + // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 + cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null); + }else { + timeoutCallback.run(0, "点播超时"); + mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); + mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); } - }, userSetup.getPlayTimeout()); - + }, userSetting.getPlayTimeout()*1000); + final String ssrc = ssrcInfo.getSsrc(); cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { logger.info("收到订阅消息: " + response.toJSONString()); - timer.cancel(); + dynamicTask.stop(timeOutTaskKey); // hook响应 onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid); hookEvent.response(mediaServerItemInuse, response); }, (event) -> { - timer.cancel(); + ResponseEvent responseEvent = (ResponseEvent)event.event; + String contentString = new String(responseEvent.getResponse().getRawContent()); + // 获取ssrc + int ssrcIndex = contentString.indexOf("y="); + // 检查是否有y字段 + if (ssrcIndex >= 0) { + //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 TODO 后续对不规范的非10位ssrc兼容 + String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); + if (!ssrc.equals(ssrcInResponse) && device.isSsrcCheck()) { // 查询到ssrc不一致且开启了ssrc校验则需要针对处理 + // 查询 ssrcInResponse 是否可用 + if (mediaServerItem.isRtpEnable() && !mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { + // ssrc 不可用 + // 释放ssrc + mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); + streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + event.msg = "下级自定义了ssrc,但是此ssrc不可用"; + event.statusCode = 400; + errorEvent.response(event); + return; + } + // 关闭rtp server + mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + // 重新开启ssrc server + mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false); + } + } + }, (event) -> { + dynamicTask.stop(timeOutTaskKey); mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); // 释放ssrc mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); + streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); errorEvent.response(event); }); @@ -303,7 +335,9 @@ public class PlayServiceImpl implements IPlayService { @Override public MediaServerItem getNewMediaServerItem(Device device) { - if (device == null) return null; + if (device == null) { + return null; + } String mediaServerId = device.getMediaServerId(); MediaServerItem mediaServerItem; if (mediaServerId == null) { @@ -322,7 +356,9 @@ public class PlayServiceImpl implements IPlayService { String endTime,InviteStreamCallback inviteStreamCallback, PlayBackCallback callback) { Device device = storager.queryVideoDevice(deviceId); - if (device == null) return null; + if (device == null) { + return null; + } MediaServerItem newMediaServerItem = getNewMediaServerItem(device); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); @@ -334,7 +370,9 @@ public class PlayServiceImpl implements IPlayService { String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback) { - if (mediaServerItem == null || ssrcInfo == null) return null; + if (mediaServerItem == null || ssrcInfo == null) { + return null; + } String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; DeferredResult> result = new DeferredResult<>(30000L); @@ -344,39 +382,36 @@ public class PlayServiceImpl implements IPlayService { return result; } - resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId, uuid, result); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId, uuid, result); RequestMessage msg = new RequestMessage(); msg.setId(uuid); msg.setKey(key); PlayBackResult playBackResult = new PlayBackResult<>(); - - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId)); - playBackResult.setCode(-1); - playBackResult.setData(msg); - playBackCallback.call(playBackResult); - SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream()); + String playBackTimeOutTaskKey = UUID.randomUUID().toString(); + dynamicTask.startDelay(playBackTimeOutTaskKey, ()->{ + logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId)); + playBackResult.setCode(-1); + playBackResult.setData(msg); + playBackCallback.call(playBackResult); + SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream()); + // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 + if (dialog != null) { // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 - if (dialog != null) { - // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 - cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); - }else { - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); - mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream()); - streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); - } cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); - // 回复之前所有的点播请求 - playBackCallback.call(playBackResult); + }else { + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); + mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream()); + streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); } - }, userSetup.getPlayTimeout()); + cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); + // 回复之前所有的点播请求 + playBackCallback.call(playBackResult); + }, userSetting.getPlayTimeout()*1000); + cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, (InviteStreamInfo inviteStreamInfo) -> { logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); - timer.cancel(); + dynamicTask.stop(playBackTimeOutTaskKey); StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); if (streamInfo == null) { logger.warn("设备回放API调用失败!"); @@ -394,7 +429,7 @@ public class PlayServiceImpl implements IPlayService { playBackResult.setResponse(inviteStreamInfo.getResponse()); playBackCallback.call(playBackResult); }, event -> { - timer.cancel(); + dynamicTask.stop(playBackTimeOutTaskKey); msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); playBackResult.setCode(-1); playBackResult.setData(msg); @@ -405,6 +440,137 @@ public class PlayServiceImpl implements IPlayService { return result; } + @Override + public DeferredResult> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + return null; + } + MediaServerItem newMediaServerItem = getNewMediaServerItem(device); + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); + + return download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed,infoCallBack, hookCallBack); + } + + @Override + public DeferredResult> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { + if (mediaServerItem == null || ssrcInfo == null) { + return null; + } + String uuid = UUID.randomUUID().toString(); + String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; + DeferredResult> result = new DeferredResult<>(30000L); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + result.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); + return result; + } + + resultHolder.put(key, uuid, result); + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + WVPResult wvpResult = new WVPResult<>(); + msg.setData(wvpResult); + PlayBackResult downloadResult = new PlayBackResult<>(); + downloadResult.setData(msg); + + String downLoadTimeOutTaskKey = UUID.randomUUID().toString(); + dynamicTask.startDelay(downLoadTimeOutTaskKey, ()->{ + logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId)); + wvpResult.setCode(-1); + wvpResult.setMsg("录像下载请求超时"); + downloadResult.setCode(-1); + hookCallBack.call(downloadResult); + SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream()); + // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 + if (dialog != null) { + // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 + cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); + }else { + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); + mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream()); + streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); + } + cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); + // 回复之前所有的点播请求 + hookCallBack.call(downloadResult); + }, userSetting.getPlayTimeout()*1000); + cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack, + inviteStreamInfo -> { + logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); + dynamicTask.stop(downLoadTimeOutTaskKey); + StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); + streamInfo.setStartTime(startTime); + streamInfo.setEndTime(endTime); + if (streamInfo == null) { + logger.warn("录像下载API调用失败!"); + wvpResult.setCode(-1); + wvpResult.setMsg("录像下载API调用失败"); + downloadResult.setCode(-1); + hookCallBack.call(downloadResult); + return ; + } + redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); + wvpResult.setCode(0); + wvpResult.setMsg("success"); + wvpResult.setData(streamInfo); + downloadResult.setCode(0); + downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); + downloadResult.setResponse(inviteStreamInfo.getResponse()); + hookCallBack.call(downloadResult); + }, event -> { + dynamicTask.stop(downLoadTimeOutTaskKey); + downloadResult.setCode(-1); + wvpResult.setCode(-1); + wvpResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg)); + downloadResult.setEvent(event); + hookCallBack.call(downloadResult); + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); + }); + return result; + } + + @Override + public StreamInfo getDownLoadInfo(String deviceId, String channelId, String stream) { + StreamInfo streamInfo = redisCatchStorage.queryDownload(deviceId, channelId, stream, null); + if (streamInfo != null) { + if (streamInfo.getProgress() == 1) { + return streamInfo; + } + + // 获取当前已下载时长 + String mediaServerId = streamInfo.getMediaServerId(); + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); + if (mediaServerItem == null) { + logger.warn("查询录像信息时发现节点已离线"); + return null; + } + if (mediaServerItem.getRecordAssistPort() != 0) { + JSONObject jsonObject = assistRESTfulUtils.fileDuration(mediaServerItem, streamInfo.getApp(), streamInfo.getStream(), null); + if (jsonObject != null && jsonObject.getInteger("code") == 0) { + long duration = jsonObject.getLong("data"); + + if (duration == 0) { + streamInfo.setProgress(0); + }else { + String startTime = streamInfo.getStartTime(); + String endTime = streamInfo.getEndTime(); + long start = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime); + long end = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime); + + BigDecimal currentCount = new BigDecimal(duration/1000); + BigDecimal totalCount = new BigDecimal(end-start); + BigDecimal divide = currentCount.divide(totalCount,2, BigDecimal.ROUND_HALF_UP); + double process = divide.doubleValue(); + streamInfo.setProgress(process); + } + } + } + } + return streamInfo; + } + @Override public void onPublishHandlerForDownload(InviteStreamInfo inviteStreamInfo, String deviceId, String channelId, String uuid) { RequestMessage msg = new RequestMessage(); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java new file mode 100644 index 00000000..2bff8643 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java @@ -0,0 +1,69 @@ +package com.genersoft.iot.vmp.service.impl; + +import com.alibaba.fastjson.JSON; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; + +@Component +public class RedisAlarmMsgListener implements MessageListener { + + private final static Logger logger = LoggerFactory.getLogger(RedisAlarmMsgListener.class); + + @Autowired + private ISIPCommander commander; + + @Autowired + private ISIPCommanderForPlatform commanderForPlatform; + + @Autowired + private IVideoManagerStorage storage; + + private final SimpleDateFormat formatForGB = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + + @Override + public void onMessage(Message message, byte[] bytes) { + logger.info("收到来自REDIS的ALARM通知: {}", new String(message.getBody())); + AlarmChannelMessage alarmChannelMessage = JSON.parseObject(message.getBody(), AlarmChannelMessage.class); + if (alarmChannelMessage == null) { + logger.warn("[REDIS的ALARM通知]消息解析失败"); + return; + } + String gbId = alarmChannelMessage.getGbId(); + Device device = storage.queryVideoDevice(gbId); + ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setChannelId(gbId); + deviceAlarm.setAlarmDescription(alarmChannelMessage.getAlarmDescription()); + deviceAlarm.setAlarmMethod("" + alarmChannelMessage.getAlarmSn()); + deviceAlarm.setAlarmPriority("1"); + deviceAlarm.setAlarmTime(formatForGB.format(System.currentTimeMillis())); + deviceAlarm.setAlarmType("1"); + deviceAlarm.setLongitude(0); + deviceAlarm.setLatitude(0); + + + if (device != null && platform == null) { + commander.sendAlarmMessage(device, deviceAlarm); + }else if (device == null && platform != null){ + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + }else { + logger.warn("无法确定" + gbId + "是平台还是设备"); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java index 92bcd5e8..c688d13f 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisGPSMsgListener.java @@ -20,7 +20,7 @@ public class RedisGPSMsgListener implements MessageListener { @Override public void onMessage(Message message, byte[] bytes) { - logger.debug("收到来自REDIS的GPS通知: {}", new String(message.getBody())); + logger.info("收到来自REDIS的GPS通知: {}", new String(message.getBody())); GPSMsgInfo gpsMsgInfo = JSON.parseObject(message.getBody(), GPSMsgInfo.class); redisCatchStorage.updateGpsMsgInfo(gpsMsgInfo); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java index c1c7e24b..2fa043a2 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java @@ -1,25 +1,23 @@ package com.genersoft.iot.vmp.service.impl; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.IGbStreamService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IMediaService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper; import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper; @@ -44,7 +42,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { private final static Logger logger = LoggerFactory.getLogger(StreamProxyServiceImpl.class); @Autowired - private IVideoManagerStorager videoManagerStorager; + private IVideoManagerStorage videoManagerStorager; @Autowired private IMediaService mediaService; @@ -59,10 +57,10 @@ public class StreamProxyServiceImpl implements IStreamProxyService { private IRedisCatchStorage redisCatchStorage; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private SipConfig sipConfig; @@ -91,7 +89,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { MediaServerItem mediaInfo; WVPResult wvpResult = new WVPResult<>(); wvpResult.setCode(0); - if ("auto".equals(param.getMediaServerId())){ + if (param.getMediaServerId() == null || "auto".equals(param.getMediaServerId())){ mediaInfo = mediaServerService.getMediaServerForMinimumLoad(); }else { mediaInfo = mediaServerService.getOne(param.getMediaServerId()); @@ -196,7 +194,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @Override public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) { - if (param ==null) return null; + if (param ==null) { + return null; + } MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); JSONObject result = zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream()); return result; @@ -232,7 +232,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService { StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream); if (!streamProxy.isEnable() && streamProxy != null) { JSONObject jsonObject = addStreamProxyToZlm(streamProxy); - if (jsonObject == null) return false; + if (jsonObject == null) { + return false; + } if (jsonObject.getInteger("code") == 0) { result = true; streamProxy.setEnable(true); @@ -248,7 +250,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { StreamProxyItem streamProxyDto = videoManagerStorager.queryStreamProxy(app, stream); if (streamProxyDto != null && streamProxyDto.isEnable()) { JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyDto); - if (null==jsonObject.getInteger("code") || jsonObject.getInteger("code") == 0) { + if (jsonObject.getInteger("code") == 0) { streamProxyDto.setEnable(false); result = videoManagerStorager.updateStreamProxy(streamProxyDto); } @@ -288,9 +290,12 @@ public class StreamProxyServiceImpl implements IStreamProxyService { } streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId); + // 移除拉流代理生成的流信息 +// syncPullStream(mediaServerId); + // 恢复流代理, 只查找这个这个流媒体 List streamProxyListForEnable = storager.getStreamProxyListForEnableInMediaServer( - mediaServerId, true, false); + mediaServerId, true); for (StreamProxyItem streamProxyDto : streamProxyListForEnable) { logger.info("恢复流代理," + streamProxyDto.getApp() + "/" + streamProxyDto.getStream()); JSONObject jsonObject = addStreamProxyToZlm(streamProxyDto); @@ -321,7 +326,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { if (mediaItems.size() > 0) { for (MediaItem mediaItem : mediaItems) { JSONObject jsonObject = new JSONObject(); - jsonObject.put("serverId", userSetup.getServerId()); + jsonObject.put("serverId", userSetting.getServerId()); jsonObject.put("app", mediaItem.getApp()); jsonObject.put("stream", mediaItem.getStream()); jsonObject.put("register", false); @@ -342,4 +347,45 @@ public class StreamProxyServiceImpl implements IStreamProxyService { public int updateStatus(boolean status, String app, String stream) { return streamProxyMapper.updateStatus(status, app, stream); } + + private void syncPullStream(String mediaServerId){ + MediaServerItem mediaServer = mediaServerService.getOne(mediaServerId); + if (mediaServer != null) { + List allPullStream = redisCatchStorage.getStreams(mediaServerId, "PULL"); + if (allPullStream.size() > 0) { + zlmresTfulUtils.getMediaList(mediaServer, jsonObject->{ + Map stringStreamInfoMap = new HashMap<>(); + if (jsonObject.getInteger("code") == 0) { + JSONArray data = jsonObject.getJSONArray("data"); + if(data != null && data.size() > 0) { + for (int i = 0; i < data.size(); i++) { + JSONObject streamJSONObj = data.getJSONObject(i); + if ("rtmp".equals(streamJSONObj.getString("schema"))) { + StreamInfo streamInfo = new StreamInfo(); + String app = streamJSONObj.getString("app"); + String stream = streamJSONObj.getString("stream"); + streamInfo.setApp(app); + streamInfo.setStream(stream); + stringStreamInfoMap.put(app+stream, streamInfo); + } + } + } + } + if (stringStreamInfoMap.size() == 0) { + redisCatchStorage.removeStream(mediaServerId, "PULL"); + }else { + for (String key : stringStreamInfoMap.keySet()) { + StreamInfo streamInfo = stringStreamInfoMap.get(key); + if (stringStreamInfoMap.get(streamInfo.getApp() + streamInfo.getStream()) == null) { + redisCatchStorage.removeStream(mediaServerId, "PULL", streamInfo.getApp(), + streamInfo.getStream()); + } + } + } + }); + } + + } + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index aab22822..d710dad7 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -4,21 +4,17 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; -import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; import com.genersoft.iot.vmp.media.zlm.dto.*; import com.genersoft.iot.vmp.service.IGbStreamService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.dao.*; -import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.slf4j.Logger; @@ -63,14 +59,16 @@ public class StreamPushServiceImpl implements IStreamPushService { private IRedisCatchStorage redisCatchStorage; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private IMediaServerService mediaServerService; @Override public List handleJSON(String jsonData, MediaServerItem mediaServerItem) { - if (jsonData == null) return null; + if (jsonData == null) { + return null; + } Map result = new HashMap<>(); @@ -223,7 +221,9 @@ public class StreamPushServiceImpl implements IStreamPushService { } } zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ - if (mediaList == null) return; + if (mediaList == null) { + return; + } String dataStr = mediaList.getString("data"); Integer code = mediaList.getInteger("code"); @@ -263,7 +263,7 @@ public class StreamPushServiceImpl implements IStreamPushService { String type = "PUSH"; for (MediaItem offlineMediaItem : offlineMediaItemList) { JSONObject jsonObject = new JSONObject(); - jsonObject.put("serverId", userSetup.getServerId()); + jsonObject.put("serverId", userSetting.getServerId()); jsonObject.put("app", offlineMediaItem.getApp()); jsonObject.put("stream", offlineMediaItem.getStream()); jsonObject.put("register", false); @@ -293,7 +293,7 @@ public class StreamPushServiceImpl implements IStreamPushService { // 移除redis内流的信息 redisCatchStorage.removeStream(mediaServerId, type, mediaItem.getApp(), mediaItem.getStream()); JSONObject jsonObject = new JSONObject(); - jsonObject.put("serverId", userSetup.getServerId()); + jsonObject.put("serverId", userSetting.getServerId()); jsonObject.put("app", mediaItem.getApp()); jsonObject.put("stream", mediaItem.getStream()); jsonObject.put("register", false); @@ -424,9 +424,6 @@ public class StreamPushServiceImpl implements IStreamPushService { continue; } streamPushItemForPlatform.setPlatformId(platFormInfoArray[0]); - if (platFormInfoArray[0].equals("34020000002110000001")) { - System.out.println(111); - } List gbStreamList = platformForEvent.get(platFormInfoArray[0]); if (gbStreamList == null) { gbStreamList = new ArrayList<>(); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java index 32b6ad68..9f156d25 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java @@ -34,7 +34,9 @@ public class UserServiceImpl implements IUserService { @Override public int addUser(User user) { User userByUsername = userMapper.getUserByUsername(user.getUsername()); - if (userByUsername != null) return 0; + if (userByUsername != null) { + return 0; + } return userMapper.add(user); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java index 50948533..67697c8d 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; @@ -138,6 +139,12 @@ public interface IRedisCatchStorage { */ void sendStreamChangeMsg(String type, JSONObject jsonObject); + /** + * 发送报警消息 + * @param msg 消息内容 + */ + void sendAlarmMsg(AlarmChannelMessage msg); + /** * 添加流信息到redis * @param mediaServerItem @@ -169,6 +176,8 @@ public interface IRedisCatchStorage { StreamInfo queryDownload(String deviceId, String channelId, String stream, String callId); + boolean stopDownload(String deviceId, String channelId, String stream, String callId); + /** * 查找第三方系统留下的国标预设值 * @param queryKey @@ -210,4 +219,15 @@ public interface IRedisCatchStorage { void addNetInfo(Map networkInterfaces); + void sendMobilePositionMsg(JSONObject jsonObject); + + void sendStreamPushRequestedMsg(MessageForPushChannel messageForPushChannel); + + /** + * 判断设备状态 + * @param deviceId 设备ID + * @return + */ + public boolean deviceIsOnline(String deviceId); + } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java similarity index 90% rename from src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java rename to src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java index 710219ef..a29b7ae9 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java @@ -1,481 +1,474 @@ -package com.genersoft.iot.vmp.storager; - -import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; -import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; -import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; -import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; -import com.github.pagehelper.PageInfo; - -import java.util.List; - -/** - * @description:视频设备数据存储接口 - * @author: swwheihei - * @date: 2020年5月6日 下午2:14:31 - */ -@SuppressWarnings("rawtypes") -public interface IVideoManagerStorager { - - /** - * 根据设备ID判断设备是否存在 - * - * @param deviceId 设备ID - * @return true:存在 false:不存在 - */ - public boolean exists(String deviceId); - - /** - * 视频设备创建 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - public boolean create(Device device); - - /** - * 视频设备更新 - * - * @param device 设备对象 - * @return true:创建成功 false:创建失败 - */ - public boolean updateDevice(Device device); - - /** - * 添加设备通道 - * - * @param deviceId 设备id - * @param channel 通道 - */ - public void updateChannel(String deviceId, DeviceChannel channel); - - /** - * 批量添加设备通道 - * - * @param deviceId 设备id - * @param channels 多个通道 - */ - public int updateChannels(String deviceId, List channels); - - /** - * 开始播放 - * @param deviceId 设备id - * @param channelId 通道ID - * @param streamId 流地址 - */ - public void startPlay(String deviceId, String channelId, String streamId); - - /** - * 停止播放 - * @param deviceId 设备id - * @param channelId 通道ID - */ - public void stopPlay(String deviceId, String channelId); - - /** - * 获取设备 - * - * @param deviceId 设备ID - * @return DShadow 设备对象 - */ - public Device queryVideoDevice(String deviceId); - - /** - * 获取某个设备的通道列表 - * - * @param deviceId 设备ID - * @param page 分页 当前页 - * @param count 每页数量 - * @return - */ - public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, int page, int count); - - public List queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); - - /** - * 获取某个设备的通道树 - * @param deviceId 设备ID - * @return - */ - List tree(String deviceId); - - /** - * 获取某个设备的通道列表 - * - * @param deviceId 设备ID - * @return - */ - public List queryChannelsByDeviceId(String deviceId); - public List queryOnlineChannelsByDeviceId(String deviceId); - - /** - * 获取某个设备的通道 - * @param deviceId 设备ID - * @param channelId 通道ID - */ - public DeviceChannel queryChannel(String deviceId, String channelId); - - /** - * 删除通道 - * @param deviceId 设备ID - * @param channelId 通道ID - */ - public int delChannel(String deviceId, String channelId); - - /** - * 获取多个设备 - * @param page 当前页数 - * @param count 每页数量 - * @return List 设备对象数组 - */ - public PageInfo queryVideoDeviceList(int page, int count); - - /** - * 获取多个设备 - * - * @return List 设备对象数组 - */ - public List queryVideoDeviceList(); - - /** - * 删除设备 - * - * @param deviceId 设备ID - * @return true:删除成功 false:删除失败 - */ - public boolean delete(String deviceId); - - /** - * 更新设备在线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - public boolean online(String deviceId); - - /** - * 更新设备离线 - * - * @param deviceId 设备ID - * @return true:更新成功 false:更新失败 - */ - public boolean outline(String deviceId); - - /** - * 更新所有设备离线 - * - * @return true:更新成功 false:更新失败 - */ - public boolean outlineForAll(); - - - /** - * 查询子设备 - * - * @param deviceId - * @param channelId - * @param page - * @param count - * @return - */ - PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count); - - - /** - * 清空通道 - * @param deviceId - */ - void cleanChannelsForDevice(String deviceId); - - - /** - * 更新上级平台 - * @param parentPlatform - */ - boolean updateParentPlatform(ParentPlatform parentPlatform); - - - /** - * 添加上级平台 - * @param parentPlatform - */ - boolean addParentPlatform(ParentPlatform parentPlatform); - - /** - * 删除上级平台 - * @param parentPlatform - */ - boolean deleteParentPlatform(ParentPlatform parentPlatform); - - - /** - * 分页获取上级平台 - * @param page - * @param count - * @return - */ - PageInfo queryParentPlatformList(int page, int count); - - /** - * 获取所有已启用的平台 - * @return - */ - List queryEnableParentPlatformList(boolean enable); - - /** - * 获取上级平台 - * @param platformGbId - * @return - */ - ParentPlatform queryParentPlatByServerGBId(String platformGbId); - - /** - * 所有平台离线 - */ - void outlineForAllParentPlatform(); - - /** - * 查询通道信息,不区分设备(已关联平台或全部) - */ - PageInfo queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, String catalogId); - - /** - * 查询设备的通道信息 - */ - List queryChannelListInParentPlatform(String platformId); - - - /** - * 更新上级平台的通道信息 - * @param platformId - * @param channelReduces - * @return - */ - int updateChannelForGB(String platformId, List channelReduces, String catalogId); - - /** - * 移除上级平台的通道信息 - * @param platformId - * @param channelReduces - * @return - */ - int delChannelForGB(String platformId, List channelReduces); - - - DeviceChannel queryChannelInParentPlatform(String platformId, String channelId); - - List queryChannelInParentPlatformAndCatalog(String platformId, String catalogId); - List queryStreamInParentPlatformAndCatalog(String platformId, String catalogId); - - Device queryVideoDeviceByPlatformIdAndChannelId(String platformId, String channelId); - - - /** - * 添加Mobile Position设备移动位置 - * @param mobilePosition - * @return - */ - public boolean insertMobilePosition(MobilePosition mobilePosition); - - /** - * 查询移动位置轨迹 - * @param deviceId - * @param startTime - * @param endTime - */ - public List queryMobilePositions(String deviceId, String startTime, String endTime); - - /** - * 查询最新移动位置 - * @param deviceId - */ - public MobilePosition queryLatestPosition(String deviceId); - - /** - * 删除指定设备的所有移动位置 - * @param deviceId - */ - public int clearMobilePositionsByDeviceId(String deviceId); - - /** - * 新增代理流 - * @param streamProxyDto - * @return - */ - public boolean addStreamProxy(StreamProxyItem streamProxyDto); - - /** - * 更新代理流 - * @param streamProxyDto - * @return - */ - public boolean updateStreamProxy(StreamProxyItem streamProxyDto); - - /** - * 移除代理流 - * @param app - * @param stream - * @return - */ - public int deleteStreamProxy(String app, String stream); - - /** - * 按照是否启用获取代理流 - * @param enable - * @return - */ - public List getStreamProxyListForEnable(boolean enable); - - /** - * 按照是app和stream获取代理流 - * @param app - * @param stream - * @return - */ - public StreamProxyItem queryStreamProxy(String app, String stream); - - /** - * 获取代理流 - * @param page - * @param count - * @return - */ - PageInfo queryStreamProxyList(Integer page, Integer count); - - /** - * 根据国标ID获取平台关联的直播流 - * @param platformId - * @param channelId - * @return - */ - GbStream queryStreamInParentPlatform(String platformId, String channelId); - - /** - * 获取平台关联的直播流 - * @param platformId - * @return - */ - List queryGbStreamListInPlatform(String platformId); - - /** - * 批量更新推流列表 - * @param streamPushItems - */ - void updateMediaList(List streamPushItems); - - /** - * 更新单个推流 - * @param streamPushItem - */ - void updateMedia(StreamPushItem streamPushItem); - - /** - * 移除单个推流 - * @param app - * @param stream - */ - int removeMedia(String app, String stream); - - - /** - * 清空推流列表 - */ - void clearMediaList(); - - /** - * 设置流离线 - * @param app - * @param streamId - */ - int mediaOutline(String app, String streamId); - - /** - * 设置平台在线/离线 - * @param online - */ - void updateParentPlatformStatus(String platformGbID, boolean online); - - /** - * 根据媒体ID获取启用/不启用的代理列表 - * @param id 媒体ID - * @param enable 启用/不启用 - * @param status 状态 - * @return - */ - List getStreamProxyListForEnableInMediaServer(String id, boolean enable, boolean status); - - /** - * 根据通道ID获取其所在设备 - * @param channelId 通道ID - * @return - */ - Device queryVideoDeviceByChannelId(String channelId); - - /** - * 通道上线 - * @param channelId 通道ID - */ - void deviceChannelOnline(String deviceId, String channelId); - - /** - * 通道离线 - * @param channelId 通道ID - */ - void deviceChannelOffline(String deviceId, String channelId); - - /** - * 通过app与stream获取StreamProxy - * @param app - * @param streamId - * @return - */ - StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId); - - /** - * catlog查询结束后完全重写通道信息 - * @param deviceId - * @param deviceChannelList - */ - boolean resetChannels(String deviceId, List deviceChannelList); - - /** - * 获取目录信息 - * @param platformId - * @param parentId - * @return - */ - List getChildrenCatalogByPlatform(String platformId, String parentId); - - int addCatalog(PlatformCatalog platformCatalog); - - PlatformCatalog getCatalog(String id); - - int delCatalog(String id); - - int updateCatalog(PlatformCatalog platformCatalog); - - int setDefaultCatalog(String platformId, String catalogId); - - List queryCatalogInPlatform(String serverGBId); - - int delRelation(PlatformCatalog platformCatalog); - - int updateStreamGPS(List gpsMsgInfo); - - List queryPlatFormListForGBWithGBId(String channelId, List platforms); - - List queryPlatFormListForStreamWithGBId(String app, String stream, List platforms); - - GbStream getGbStream(String app, String streamId); - - void delCatalogByPlatformId(String serverGBId); - - void delRelationByPlatformId(String serverGBId); - - PlatformCatalog queryDefaultCatalogInPlatform(String platformId); - - List getChannelSource(String platformId, String gbId); -} +package com.genersoft.iot.vmp.storager; + +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; +import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @description:视频设备数据存储接口 + * @author: swwheihei + * @date: 2020年5月6日 下午2:14:31 + */ +@SuppressWarnings("rawtypes") +public interface IVideoManagerStorage { + + /** + * 根据设备ID判断设备是否存在 + * + * @param deviceId 设备ID + * @return true:存在 false:不存在 + */ + public boolean exists(String deviceId); + + /** + * 视频设备创建 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + public boolean create(Device device); + + /** + * 视频设备更新 + * + * @param device 设备对象 + * @return true:创建成功 false:创建失败 + */ + public boolean updateDevice(Device device); + + /** + * 添加设备通道 + * + * @param deviceId 设备id + * @param channel 通道 + */ + public void updateChannel(String deviceId, DeviceChannel channel); + + /** + * 批量添加设备通道 + * + * @param deviceId 设备id + * @param channels 多个通道 + */ + public int updateChannels(String deviceId, List channels); + + /** + * 开始播放 + * @param deviceId 设备id + * @param channelId 通道ID + * @param streamId 流地址 + */ + public void startPlay(String deviceId, String channelId, String streamId); + + /** + * 停止播放 + * @param deviceId 设备id + * @param channelId 通道ID + */ + public void stopPlay(String deviceId, String channelId); + + /** + * 获取设备 + * + * @param deviceId 设备ID + * @return DShadow 设备对象 + */ + public Device queryVideoDevice(String deviceId); + + /** + * 获取某个设备的通道列表 + * + * @param deviceId 设备ID + * @param page 分页 当前页 + * @param count 每页数量 + * @return + */ + public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, Boolean catalogUnderDevice, int page, int count); + + public List queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); + + + /** + * 获取某个设备的通道列表 + * + * @param deviceId 设备ID + * @return + */ + public List queryChannelsByDeviceId(String deviceId); + public List queryOnlineChannelsByDeviceId(String deviceId); + + /** + * 获取某个设备的通道 + * @param deviceId 设备ID + * @param channelId 通道ID + */ + public DeviceChannel queryChannel(String deviceId, String channelId); + + /** + * 删除通道 + * @param deviceId 设备ID + * @param channelId 通道ID + */ + public int delChannel(String deviceId, String channelId); + + /** + * 获取多个设备 + * @param page 当前页数 + * @param count 每页数量 + * @return List 设备对象数组 + */ + public PageInfo queryVideoDeviceList(int page, int count); + + /** + * 获取多个设备 + * + * @return List 设备对象数组 + */ + public List queryVideoDeviceList(); + + /** + * 删除设备 + * + * @param deviceId 设备ID + * @return true:删除成功 false:删除失败 + */ + public boolean delete(String deviceId); + + /** + * 更新设备在线 + * + * @param deviceId 设备ID + * @return true:更新成功 false:更新失败 + */ + public boolean online(String deviceId); + + /** + * 更新设备离线 + * + * @param deviceId 设备ID + * @return true:更新成功 false:更新失败 + */ + public boolean outline(String deviceId); + + /** + * 更新所有设备离线 + * + * @return true:更新成功 false:更新失败 + */ + public boolean outlineForAll(); + + + /** + * 查询子设备 + * + * @param deviceId + * @param channelId + * @param page + * @param count + * @return + */ + PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, Boolean online, int page, int count); + + + /** + * 清空通道 + * @param deviceId + */ + void cleanChannelsForDevice(String deviceId); + + + /** + * 更新上级平台 + * @param parentPlatform + */ + boolean updateParentPlatform(ParentPlatform parentPlatform); + + + /** + * 添加上级平台 + * @param parentPlatform + */ + boolean addParentPlatform(ParentPlatform parentPlatform); + + /** + * 删除上级平台 + * @param parentPlatform + */ + boolean deleteParentPlatform(ParentPlatform parentPlatform); + + + /** + * 分页获取上级平台 + * @param page + * @param count + * @return + */ + PageInfo queryParentPlatformList(int page, int count); + + /** + * 获取所有已启用的平台 + * @return + */ + List queryEnableParentPlatformList(boolean enable); + + /** + * 获取上级平台 + * @param platformGbId + * @return + */ + ParentPlatform queryParentPlatByServerGBId(String platformGbId); + + /** + * 所有平台离线 + */ + void outlineForAllParentPlatform(); + + /** + * 查询通道信息,不区分设备(已关联平台或全部) + */ + PageInfo queryAllChannelList(int page, int count, String query, Boolean online, Boolean channelType, String platformId, String catalogId); + + /** + * 查询设备的通道信息 + */ + List queryChannelListInParentPlatform(String platformId); + + + /** + * 更新上级平台的通道信息 + * @param platformId + * @param channelReduces + * @return + */ + int updateChannelForGB(String platformId, List channelReduces, String catalogId); + + /** + * 移除上级平台的通道信息 + * @param platformId + * @param channelReduces + * @return + */ + int delChannelForGB(String platformId, List channelReduces); + + + DeviceChannel queryChannelInParentPlatform(String platformId, String channelId); + + List queryChannelInParentPlatformAndCatalog(String platformId, String catalogId); + List queryStreamInParentPlatformAndCatalog(String platformId, String catalogId); + + Device queryVideoDeviceByPlatformIdAndChannelId(String platformId, String channelId); + + + /** + * 添加Mobile Position设备移动位置 + * @param mobilePosition + * @return + */ + public boolean insertMobilePosition(MobilePosition mobilePosition); + + /** + * 查询移动位置轨迹 + * @param deviceId + * @param startTime + * @param endTime + */ + public List queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); + + /** + * 查询最新移动位置 + * @param deviceId + */ + public MobilePosition queryLatestPosition(String deviceId); + + /** + * 删除指定设备的所有移动位置 + * @param deviceId + */ + public int clearMobilePositionsByDeviceId(String deviceId); + + /** + * 新增代理流 + * @param streamProxyDto + * @return + */ + public boolean addStreamProxy(StreamProxyItem streamProxyDto); + + /** + * 更新代理流 + * @param streamProxyDto + * @return + */ + public boolean updateStreamProxy(StreamProxyItem streamProxyDto); + + /** + * 移除代理流 + * @param app + * @param stream + * @return + */ + public int deleteStreamProxy(String app, String stream); + + /** + * 按照是否启用获取代理流 + * @param enable + * @return + */ + public List getStreamProxyListForEnable(boolean enable); + + /** + * 按照是app和stream获取代理流 + * @param app + * @param stream + * @return + */ + public StreamProxyItem queryStreamProxy(String app, String stream); + + /** + * 获取代理流 + * @param page + * @param count + * @return + */ + PageInfo queryStreamProxyList(Integer page, Integer count); + + /** + * 根据国标ID获取平台关联的直播流 + * @param platformId + * @param channelId + * @return + */ + GbStream queryStreamInParentPlatform(String platformId, String channelId); + + /** + * 获取平台关联的直播流 + * @param platformId + * @return + */ + List queryGbStreamListInPlatform(String platformId); + + /** + * 批量更新推流列表 + * @param streamPushItems + */ + void updateMediaList(List streamPushItems); + + /** + * 更新单个推流 + * @param streamPushItem + */ + void updateMedia(StreamPushItem streamPushItem); + + /** + * 移除单个推流 + * @param app + * @param stream + */ + int removeMedia(String app, String stream); + + + /** + * 清空推流列表 + */ + void clearMediaList(); + + /** + * 设置流离线 + * @param app + * @param streamId + */ + int mediaOutline(String app, String streamId); + + /** + * 设置平台在线/离线 + * @param online + */ + void updateParentPlatformStatus(String platformGbID, boolean online); + + /** + * 根据媒体ID获取启用/不启用的代理列表 + * @param id 媒体ID + * @param enable 启用/不启用 + * @return + */ + List getStreamProxyListForEnableInMediaServer(String id, boolean enable); + + /** + * 根据通道ID获取其所在设备 + * @param channelId 通道ID + * @return + */ + Device queryVideoDeviceByChannelId(String channelId); + + /** + * 通道上线 + * @param channelId 通道ID + */ + void deviceChannelOnline(String deviceId, String channelId); + + /** + * 通道离线 + * @param channelId 通道ID + */ + void deviceChannelOffline(String deviceId, String channelId); + + /** + * 通过app与stream获取StreamProxy + * @param app + * @param streamId + * @return + */ + StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId); + + /** + * catlog查询结束后完全重写通道信息 + * @param deviceId + * @param deviceChannelList + */ + boolean resetChannels(String deviceId, List deviceChannelList); + + /** + * 获取目录信息 + * @param platformId + * @param parentId + * @return + */ + List getChildrenCatalogByPlatform(String platformId, String parentId); + + int addCatalog(PlatformCatalog platformCatalog); + + PlatformCatalog getCatalog(String id); + + int delCatalog(String id); + + int updateCatalog(PlatformCatalog platformCatalog); + + int setDefaultCatalog(String platformId, String catalogId); + + List queryCatalogInPlatform(String serverGBId); + + int delRelation(PlatformCatalog platformCatalog); + + int updateStreamGPS(List gpsMsgInfo); + + List queryPlatFormListForGBWithGBId(String channelId, List platforms); + + List queryPlatFormListForStreamWithGBId(String app, String stream, List platforms); + + GbStream getGbStream(String app, String streamId); + + void delCatalogByPlatformId(String serverGBId); + + void delRelationByPlatformId(String serverGBId); + + PlatformCatalog queryDefaultCatalogInPlatform(String platformId); + + List getChannelSource(String platformId, String gbId); + + void updateChannelPotion(String deviceId, String channelId, double longitude, double latitude); +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index e4fc1ebe..312d3e03 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -1,7 +1,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannelInPlatform; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -105,13 +105,26 @@ public interface DeviceChannelMapper { " AND dc.status=1 " + " AND dc.status=0 " + " AND dc.subCount > 0 " + - " AND dc.subCount == 0 " + + " AND dc.subCount = 0 " + " AND dc.id not in (select deviceChannelId from platform_gb_channel where platformId=#{platformId} ) " + " AND pgc.platformId = #{platformId} and pgc.catalogId=#{catalogId} " + " ORDER BY dc.deviceId, dc.channelId ASC" + " "}) List queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, String catalogId); + @Select(value = {" "}) + List queryChannelByPlatformId(String platformId); + + @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}") List queryChannelByChannelId( String channelId); @@ -222,21 +235,6 @@ public interface DeviceChannelMapper { @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") List queryOnlineChannelsByDeviceId(String deviceId); - @Select(" SELECT\n" + - " id,\n" + - " channelId,\n" + - " deviceId,\n" + - " parentId,\n" + - " status,\n" + - " name as title,\n" + - " channelId as \"value\",\n" + - " channelId as \"key\",\n" + - " longitude,\n" + - " latitude\n" + - " from device_channel\n" + - " where deviceId = #{deviceId}") - List tree(String deviceId); - @Delete(value = {" "}) int update(Device device); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java index f3e42615..51da4a8b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java @@ -16,12 +16,12 @@ public interface DeviceMobilePositionMapper { @Select(value = {" "}) - List queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); + List queryPositionByDeviceIdAndTime(String deviceId, String channelId, String startTime, String endTime); @Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + " ORDER BY time DESC LIMIT 1") diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index 230b23b6..9ac90bbe 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -33,6 +33,19 @@ public interface GbStreamMapper { "mediaServerId=#{mediaServerId}," + "status=${status} " + "WHERE app=#{app} AND stream=#{stream}") + int updateByAppAndStream(GbStream gbStream); + + @Update("UPDATE gb_stream " + + "SET app=#{app}," + + "stream=#{stream}," + + "gbId=#{gbId}," + + "name=#{name}," + + "streamType=#{streamType}," + + "longitude=#{longitude}, " + + "latitude=#{latitude}," + + "mediaServerId=#{mediaServerId}," + + "status=${status} " + + "WHERE gbStreamId=#{gbStreamId}") int update(GbStream gbStream); @Delete("DELETE FROM gb_stream WHERE app=#{app} AND stream=#{stream}") @@ -42,15 +55,15 @@ public interface GbStreamMapper { "SELECT gs.* FROM gb_stream gs " + "WHERE " + "1=1 " + - " AND gs.gbId in" + + " AND gs.gbStreamId in" + "(select pgs.gbStreamId from platform_gb_stream pgs where pgs.platformId = #{platformId} and pgs.catalogId=#{catalogId}) " + - " AND gs.gbId not in" + + " AND gs.gbStreamId not in" + "(select pgs.gbStreamId from platform_gb_stream pgs where pgs.platformId = #{platformId}) " + " AND (gs.app LIKE '%${query}%' OR gs.stream LIKE '%${query}%' OR gs.gbId LIKE '%${query}%' OR gs.name LIKE '%${query}%') " + " AND gs.status=1" + " AND gs.status=0" + " AND gs.mediaServerId=#{mediaServerId} " + - " order by gs.gbId asc " + + " order by gs.gbStreamId asc " + "") List selectAll(String platformId, String catalogId, String query, Boolean pushing, String mediaServerId); @@ -61,18 +74,18 @@ public interface GbStreamMapper { List selectByGBId(String gbId); @Select("SELECT gs.*, pgs.platformId as platformId, pgs.catalogId as catalogId FROM gb_stream gs " + - "LEFT JOIN platform_gb_stream pgs ON gs.gbId = pgs.gbStreamId " + + "LEFT JOIN platform_gb_stream pgs ON gs.gbStreamId = pgs.gbStreamId " + "WHERE gs.gbId = '${gbId}' AND pgs.platformId = '${platformId}'") GbStream queryStreamInPlatform(String platformId, String gbId); @Select("SELECT gs.*, pgs.platformId as platformId, pgs.catalogId as catalogId FROM gb_stream gs " + - "LEFT JOIN platform_gb_stream pgs ON gs.gbId = pgs.gbStreamId " + + "LEFT JOIN platform_gb_stream pgs ON gs.gbStreamId = pgs.gbStreamId " + "WHERE pgs.platformId = #{platformId}") List queryGbStreamListInPlatform(String platformId); @Select("SELECT gs.* FROM gb_stream gs LEFT JOIN platform_gb_stream pgs " + - "ON gs.gbId = pgs.gbStreamId WHERE pgs.gbStreamId is NULL") + "ON gs.gbStreamId = pgs.gbStreamId WHERE pgs.gbStreamId is NULL") List queryStreamNotInPlatform(); @Update("UPDATE gb_stream " + @@ -129,10 +142,10 @@ public interface GbStreamMapper { int updateStreamGPS(List gpsMsgInfos); @Select("") + "SELECT * FROM gb_stream where " + + "" + + "(app=#{item.app} and stream=#{item.stream}) " + + "" + + "") List selectAllForAppAndStream(List streamPushItems); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java index f74b6d4d..2cbb426d 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java @@ -16,10 +16,10 @@ public interface ParentPlatformMapper { @Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp, " + " devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, " + - " status, shareAllLiveStream, catalogId) " + + " status, shareAllLiveStream, startOfflinePush, catalogId, administrativeDivision, catalogGroup) " + " VALUES (${enable}, '${name}', '${serverGBId}', '${serverGBDomain}', '${serverIP}', ${serverPort}, '${deviceGBId}', '${deviceIp}', " + " '${devicePort}', '${username}', '${password}', '${expires}', '${keepTimeout}', '${transport}', '${characterSet}', ${ptz}, ${rtcp}, " + - " ${status}, ${shareAllLiveStream}, #{catalogId})") + " ${status}, ${shareAllLiveStream}, ${startOfflinePush}, #{catalogId}, #{administrativeDivision}, #{catalogGroup})") int addParentPlatform(ParentPlatform parentPlatform); @Update("UPDATE parent_platform " + @@ -42,6 +42,9 @@ public interface ParentPlatformMapper { "rtcp=#{rtcp}, " + "status=#{status}, " + "shareAllLiveStream=#{shareAllLiveStream}, " + + "startOfflinePush=${startOfflinePush}, " + + "catalogGroup=#{catalogGroup}, " + + "administrativeDivision=#{administrativeDivision}, " + "catalogId=#{catalogId} " + "WHERE id=#{id}") int updateParentPlatform(ParentPlatform parentPlatform); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java index b411b599..98afd6b7 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java @@ -17,7 +17,7 @@ import java.util.List; public interface PlatformGbStreamMapper { @Insert("REPLACE INTO platform_gb_stream (gbStreamId, platformId, catalogId) VALUES" + - "( #{gbId}, #{platformId}, #{catalogId})") + "( #{gbStreamId}, #{platformId}, #{catalogId})") int add(PlatformGbStream platformGbStream); @@ -26,12 +26,12 @@ public interface PlatformGbStreamMapper { "(gbStreamId, platformId, catalogId) " + "values " + " " + - "(#{item.gbId}, #{item.platformId}, #{item.catalogId})" + + "(${item.gbStreamId}, '${item.platformId}', '${item.catalogId}')" + " " + "") int batchAdd(List streamPushItems); - @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbId from gb_stream where app=#{app} AND stream=#{stream})") + @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbStreamId from gb_stream where app=#{app} AND stream=#{stream})") int delByAppAndStream(String app, String stream); @Delete("DELETE FROM platform_gb_stream WHERE platformId=#{platformId}") @@ -42,28 +42,28 @@ public interface PlatformGbStreamMapper { "FROM " + "platform_gb_stream pgs " + "LEFT JOIN parent_platform pp ON pp.serverGBId = pgs.platformId " + - "LEFT JOIN gb_stream gs ON gs.gbId = pgs.gbStreamId " + + "LEFT JOIN gb_stream gs ON gs.gbStreamId = pgs.gbStreamId " + "WHERE " + "gs.app =#{app} " + "AND gs.stream =#{stream} ") List selectByAppAndStream(String app, String stream); @Select("SELECT pgs.*, gs.gbId FROM platform_gb_stream pgs " + - "LEFT JOIN gb_stream gs ON pgs.gbStreamId = gs.gbId " + + "LEFT JOIN gb_stream gs ON pgs.gbStreamId = gs.gbStreamId " + "WHERE gs.app=#{app} AND gs.stream=#{stream} AND pgs.platformId=#{serverGBId}") StreamProxyItem selectOne(String app, String stream, String serverGBId); @Select("select gs.* \n" + "from gb_stream gs\n" + " left join platform_gb_stream pgs\n" + - " on gs.gbId = pgs.gbStreamId\n" + + " on gs.gbStreamId = pgs.gbStreamId\n" + "where pgs.platformId=#{platformId} and pgs.catalogId=#{catalogId}") List queryChannelInParentPlatformAndCatalog(String platformId, String catalogId); @Select("select gs.gbId as id, gs.name as name, pgs.platformId as platformId, pgs.catalogId as catalogId , 0 as childrenCount, 2 as type\n" + "from gb_stream gs\n" + " left join platform_gb_stream pgs\n" + - " on gs.gbId = pgs.gbStreamId\n" + + " on gs.gbStreamId = pgs.gbStreamId\n" + "where pgs.platformId=#{platformId} and pgs.catalogId=#{catalogId}") List queryChannelInParentPlatformAndCatalogForCatalog(String platformId, String catalogId); @@ -78,7 +78,7 @@ public interface PlatformGbStreamMapper { "left join platform_gb_stream pgs on " + "pp.serverGBId = pgs.platformId " + "left join gb_stream gs " + - "gs.gbId = pgs.gbStreamId " + + "on gs.gbStreamId = pgs.gbStreamId " + "WHERE " + "gs.app = #{app} " + "AND gs.stream = #{stream}" + @@ -87,13 +87,13 @@ public interface PlatformGbStreamMapper { " ") List queryPlatFormListForGBWithGBId(String app, String stream, List platforms); - @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select gbId from gb_stream where app=#{app} AND stream=#{stream}) AND platformId=#{platformId}") + @Delete("DELETE FROM platform_gb_stream WHERE gbStreamId = (select id from gb_stream where app=#{app} AND stream=#{stream}) AND platformId=#{platformId}") int delByAppAndStreamAndPlatform(String app, String stream, String platformId); @Delete("") void delByGbStreams(List gbStreams); @@ -101,7 +101,7 @@ public interface PlatformGbStreamMapper { @Delete("") void delByAppAndStreamsByPlatformId(List gbStreams, String platformId); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java index 8ee3e384..29c0b012 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java @@ -10,9 +10,9 @@ import java.util.List; @Repository public interface StreamProxyMapper { - @Insert("INSERT INTO stream_proxy (type, app, name, stream,mediaServerId, url, src_url, dst_url, " + + @Insert("INSERT INTO stream_proxy (type, name, app, stream,mediaServerId, url, src_url, dst_url, " + "timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, createTime) VALUES" + - "('${type}','${app}','${name}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + + "('${type}','${name}', '${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " + "'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, ${status}, " + "${enable_remove_none_reader}, '${createTime}' )") int add(StreamProxyItem streamProxyDto); @@ -21,7 +21,6 @@ public interface StreamProxyMapper { "SET type=#{type}, " + "name=#{name}," + "app=#{app}," + - "name=#{name}," + "stream=#{stream}," + "url=#{url}, " + "mediaServerId=#{mediaServerId}, " + @@ -52,8 +51,8 @@ public interface StreamProxyMapper { @Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " + "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " + - "WHERE st.enable=${enable} and st.status=${status} and st.mediaServerId = '${id}' order by st.createTime desc") - List selectForEnableInMediaServer(String id, boolean enable, boolean status); + "WHERE st.enable=${enable} and st.mediaServerId = #{id} order by st.createTime desc") + List selectForEnableInMediaServer(String id, boolean enable); @Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " + "LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index 6ad654e6..ae7647f8 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -1,16 +1,16 @@ package com.genersoft.iot.vmp.storager.impl; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.SystemInfoDto; import com.genersoft.iot.vmp.common.VideoManagerConstants; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; -import com.genersoft.iot.vmp.service.bean.SSRCInfo; +import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; @@ -18,9 +18,7 @@ import com.genersoft.iot.vmp.utils.redis.RedisUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import java.text.SimpleDateFormat; import java.util.*; @@ -29,7 +27,7 @@ import java.util.*; @Component public class RedisCatchStorageImpl implements IRedisCatchStorage { - private Logger logger = LoggerFactory.getLogger(RedisCatchStorageImpl.class); + private final Logger logger = LoggerFactory.getLogger(RedisCatchStorageImpl.class); @Autowired private RedisUtil redis; @@ -38,13 +36,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { private DeviceChannelMapper deviceChannelMapper; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; - private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public Long getCSEQ(String method) { - String key = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetup.getServerId() + "_" + method; + String key = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetting.getServerId() + "_" + method; long result = redis.incr(key, 1L); if (result > Integer.MAX_VALUE) { @@ -56,7 +54,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public Long getSN(String method) { - String key = VideoManagerConstants.SIP_SN_PREFIX + userSetup.getServerId() + "_" + method; + String key = VideoManagerConstants.SIP_SN_PREFIX + userSetting.getServerId() + "_" + method; long result = redis.incr(key, 1L); if (result > Integer.MAX_VALUE) { @@ -68,20 +66,20 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void resetAllCSEQ() { - String scanKey = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetup.getServerId() + "_*"; + String scanKey = VideoManagerConstants.SIP_CSEQ_PREFIX + userSetting.getServerId() + "_*"; List keys = redis.scan(scanKey); - for (int i = 0; i < keys.size(); i++) { - String key = (String) keys.get(i); + for (Object o : keys) { + String key = (String) o; redis.set(key, 1); } } @Override public void resetAllSN() { - String scanKey = VideoManagerConstants.SIP_SN_PREFIX + userSetup.getServerId() + "_*"; + String scanKey = VideoManagerConstants.SIP_SN_PREFIX + userSetting.getServerId() + "_*"; List keys = redis.scan(scanKey); - for (int i = 0; i < keys.size(); i++) { - String key = (String) keys.get(i); + for (Object o : keys) { + String key = (String) o; redis.set(key, 1); } } @@ -93,7 +91,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { */ @Override public boolean startPlay(StreamInfo stream) { - return redis.set(String.format("%S_%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, userSetup.getServerId(), + return redis.set(String.format("%S_%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), stream.getStream(), stream.getDeviceID(), stream.getChannelId()), stream); } @@ -105,9 +103,11 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { */ @Override public boolean stopPlay(StreamInfo streamInfo) { - if (streamInfo == null) return false; + if (streamInfo == null) { + return false; + } return redis.del(String.format("%S_%s_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), streamInfo.getStream(), streamInfo.getDeviceID(), streamInfo.getChannelId())); @@ -121,25 +121,29 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { public StreamInfo queryPlay(StreamInfo streamInfo) { return (StreamInfo)redis.get(String.format("%S_%s_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), streamInfo.getStream(), streamInfo.getDeviceID(), streamInfo.getChannelId())); } @Override public StreamInfo queryPlayByStreamId(String streamId) { - List playLeys = redis.scan(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetup.getServerId(), streamId)); - if (playLeys == null || playLeys.size() == 0) return null; + List playLeys = redis.scan(String.format("%S_%s_%s_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(), streamId)); + if (playLeys == null || playLeys.size() == 0) { + return null; + } return (StreamInfo)redis.get(playLeys.get(0).toString()); } @Override public StreamInfo queryPlayByDevice(String deviceId, String channelId) { List playLeys = redis.scan(String.format("%S_%s_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId, channelId)); - if (playLeys == null || playLeys.size() == 0) return null; + if (playLeys == null || playLeys.size() == 0) { + return null; + } return (StreamInfo)redis.get(playLeys.get(0).toString()); } @@ -147,11 +151,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { public Map queryPlayByDeviceId(String deviceId) { Map streamInfos = new HashMap<>(); // List playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId)); - List players = redis.scan(String.format("%S_%s_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, userSetup.getServerId(),deviceId)); - if (players.size() == 0) return streamInfos; - for (int i = 0; i < players.size(); i++) { - String key = (String) players.get(i); - StreamInfo streamInfo = (StreamInfo)redis.get(key); + List players = redis.scan(String.format("%S_%s_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, userSetting.getServerId(),deviceId)); + if (players.size() == 0) { + return streamInfos; + } + for (Object player : players) { + String key = (String) player; + StreamInfo streamInfo = (StreamInfo) redis.get(key); streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getChannelId(), streamInfo); } return streamInfos; @@ -161,13 +167,55 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public boolean startPlayback(StreamInfo stream, String callId) { return redis.set(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - userSetup.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); + userSetting.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); } @Override public boolean startDownload(StreamInfo stream, String callId) { - return redis.set(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, - userSetup.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); + boolean result; + if (stream.getProgress() == 1) { + result = redis.set(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, + userSetting.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); + }else { + result = redis.set(String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, + userSetting.getServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream, 60*60); + } + return result; + } + @Override + public boolean stopDownload(String deviceId, String channelId, String stream, String callId) { + DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(deviceId, channelId); + if (deviceChannel != null) { + deviceChannel.setStreamId(null); + deviceChannel.setDeviceId(deviceId); + deviceChannelMapper.update(deviceChannel); + } + if (deviceId == null) { + deviceId = "*"; + } + if (channelId == null) { + channelId = "*"; + } + if (stream == null) { + stream = "*"; + } + if (callId == null) { + callId = "*"; + } + String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, + userSetting.getServerId(), + deviceId, + channelId, + stream, + callId + ); + List scan = redis.scan(key); + if (scan.size() > 0) { + for (Object keyObj : scan) { + redis.del((String) keyObj); + } + } + return true; } @Override @@ -178,12 +226,20 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { deviceChannel.setDeviceId(deviceId); deviceChannelMapper.update(deviceChannel); } - if (deviceId == null) deviceId = "*"; - if (channelId == null) channelId = "*"; - if (stream == null) stream = "*"; - if (callId == null) callId = "*"; + if (deviceId == null) { + deviceId = "*"; + } + if (channelId == null) { + channelId = "*"; + } + if (stream == null) { + stream = "*"; + } + if (callId == null) { + callId = "*"; + } String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId, channelId, stream, @@ -203,12 +259,20 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { if (stream == null && callId == null) { return null; } - if (deviceId == null) deviceId = "*"; - if (channelId == null) channelId = "*"; - if (stream == null) stream = "*"; - if (callId == null) callId = "*"; + if (deviceId == null) { + deviceId = "*"; + } + if (channelId == null) { + channelId = "*"; + } + if (stream == null) { + stream = "*"; + } + if (callId == null) { + callId = "*"; + } String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId, channelId, stream, @@ -224,63 +288,63 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void updatePlatformCatchInfo(ParentPlatformCatch parentPlatformCatch) { - String key = VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetup.getServerId() + "_" + parentPlatformCatch.getId(); + String key = VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetting.getServerId() + "_" + parentPlatformCatch.getId(); redis.set(key, parentPlatformCatch); } @Override public void updatePlatformKeepalive(ParentPlatform parentPlatform) { - String key = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetup.getServerId() + "_" + parentPlatform.getServerGBId(); + String key = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + parentPlatform.getServerGBId(); redis.set(key, "", Integer.parseInt(parentPlatform.getKeepTimeout())); } @Override public void updatePlatformRegister(ParentPlatform parentPlatform) { - String key = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetup.getServerId() + "_" + parentPlatform.getServerGBId(); + String key = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_" + parentPlatform.getServerGBId(); redis.set(key, "", Integer.parseInt(parentPlatform.getExpires())); } @Override public ParentPlatformCatch queryPlatformCatchInfo(String platformGbId) { - return (ParentPlatformCatch)redis.get(VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetup.getServerId() + "_" + platformGbId); + return (ParentPlatformCatch)redis.get(VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetting.getServerId() + "_" + platformGbId); } @Override public void delPlatformCatchInfo(String platformGbId) { - redis.del(VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetup.getServerId() + "_" + platformGbId); + redis.del(VideoManagerConstants.PLATFORM_CATCH_PREFIX + userSetting.getServerId() + "_" + platformGbId); } @Override public void delPlatformKeepalive(String platformGbId) { - redis.del(VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetup.getServerId() + "_" + platformGbId); + redis.del(VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + platformGbId); } @Override public void delPlatformRegister(String platformGbId) { - redis.del(VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetup.getServerId() + "_" + platformGbId); + redis.del(VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_" + platformGbId); } @Override public void updatePlatformRegisterInfo(String callId, String platformGbId) { - String key = VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetup.getServerId() + "_" + callId; + String key = VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetting.getServerId() + "_" + callId; redis.set(key, platformGbId, 30); } @Override public String queryPlatformRegisterInfo(String callId) { - return (String)redis.get(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetup.getServerId() + "_" + callId); + return (String)redis.get(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetting.getServerId() + "_" + callId); } @Override public void delPlatformRegisterInfo(String callId) { - redis.del(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetup.getServerId() + "_" + callId); + redis.del(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetting.getServerId() + "_" + callId); } @Override public void cleanPlatformRegisterInfos() { - List regInfos = redis.scan(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetup.getServerId() + "_" + "*"); + List regInfos = redis.scan(VideoManagerConstants.PLATFORM_REGISTER_INFO_PREFIX + userSetting.getServerId() + "_" + "*"); for (Object key : regInfos) { redis.del(key.toString()); } @@ -288,7 +352,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void updateSendRTPSever(SendRtpItem sendRtpItem) { - String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetup.getServerId() + "_" + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + sendRtpItem.getPlatformId() + "_" + sendRtpItem.getChannelId() + "_" + sendRtpItem.getStreamId() + "_" + sendRtpItem.getCallId(); redis.set(key, sendRtpItem); @@ -296,11 +360,19 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public SendRtpItem querySendRTPServer(String platformGbId, String channelId, String streamId, String callId) { - if (platformGbId == null) platformGbId = "*"; - if (channelId == null) channelId = "*"; - if (streamId == null) streamId = "*"; - if (callId == null) callId = "*"; - String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetup.getServerId() + "_" + platformGbId + if (platformGbId == null) { + platformGbId = "*"; + } + if (channelId == null) { + channelId = "*"; + } + if (streamId == null) { + streamId = "*"; + } + if (callId == null) { + callId = "*"; + } + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + "_" + channelId + "_" + streamId + "_" + callId; List scan = redis.scan(key); if (scan.size() > 0) { @@ -312,14 +384,16 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public List querySendRTPServer(String platformGbId) { - if (platformGbId == null) platformGbId = "*"; - String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetup.getServerId() + "_" + platformGbId + "_*" + "_*" + "_*"; + if (platformGbId == null) { + platformGbId = "*"; + } + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + "_*" + "_*" + "_*"; List queryResult = redis.scan(key); List result= new ArrayList<>(); - for (int i = 0; i < queryResult.size(); i++) { - String keyItem = (String) queryResult.get(i); - result.add((SendRtpItem)redis.get(keyItem)); + for (Object o : queryResult) { + String keyItem = (String) o; + result.add((SendRtpItem) redis.get(keyItem)); } return result; @@ -332,9 +406,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { */ @Override public void deleteSendRTPServer(String platformGbId, String channelId, String callId, String streamId) { - if (streamId == null) streamId = "*"; - if (callId == null) callId = "*"; - String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetup.getServerId() + "_" + platformGbId + if (streamId == null) { + streamId = "*"; + } + if (callId == null) { + callId = "*"; + } + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + platformGbId + "_" + channelId + "_" + streamId + "_" + callId; List scan = redis.scan(key); if (scan.size() > 0) { @@ -352,7 +430,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { */ @Override public boolean isChannelSendingRTP(String channelId) { - String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetup.getServerId() + "_" + "*_" + channelId + "*_" + "*_"; + String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX + userSetting.getServerId() + "_" + "*_" + channelId + "*_" + "*_"; List RtpStreams = redis.scan(key); if (RtpStreams.size() > 0) { return true; @@ -364,7 +442,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void clearCatchByDeviceId(String deviceId) { List playLeys = redis.scan(String.format("%S_%s_*_%s_*", VideoManagerConstants.PLAYER_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId)); if (playLeys.size() > 0) { for (Object key : playLeys) { @@ -373,7 +451,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { } List playBackers = redis.scan(String.format("%S_%s_%s_*_*_*", VideoManagerConstants.PLAY_BLACK_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId)); if (playBackers.size() > 0) { for (Object key : playBackers) { @@ -382,7 +460,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { } List deviceCache = redis.scan(String.format("%S%s_%s", VideoManagerConstants.DEVICE_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId)); if (deviceCache.size() > 0) { for (Object key : deviceCache) { @@ -393,7 +471,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void outlineForAll() { - List onlineDevices = redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + "*" ); + List onlineDevices = redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + "*" ); for (int i = 0; i < onlineDevices.size(); i++) { String key = (String) onlineDevices.get(i); redis.del(key); @@ -403,7 +481,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public List getOnlineForAll() { List result = new ArrayList<>(); - List onlineDevices = redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetup.getServerId() + "_" + "*" ); + List onlineDevices = redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + "*" ); for (int i = 0; i < onlineDevices.size(); i++) { String key = (String) onlineDevices.get(i); result.add((String) redis.get(key)); @@ -413,7 +491,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void updateWVPInfo(JSONObject jsonObject, int time) { - String key = VideoManagerConstants.WVP_SERVER_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.WVP_SERVER_PREFIX + userSetting.getServerId(); redis.set(key, jsonObject, time); } @@ -426,13 +504,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, MediaItem mediaItem) { - String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); redis.set(key, mediaItem); } @Override public void removeStream(String mediaServerId, String type, String app, String streamId) { - String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerId; + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerId; redis.del(key); } @@ -441,12 +519,20 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { if (stream == null && callId == null) { return null; } - if (deviceId == null) deviceId = "*"; - if (channelId == null) channelId = "*"; - if (stream == null) stream = "*"; - if (callId == null) callId = "*"; + if (deviceId == null) { + deviceId = "*"; + } + if (channelId == null) { + channelId = "*"; + } + if (stream == null) { + stream = "*"; + } + if (callId == null) { + callId = "*"; + } String key = String.format("%S_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, - userSetup.getServerId(), + userSetting.getServerId(), deviceId, channelId, stream, @@ -469,7 +555,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void removeStream(String mediaServerId, String type) { - String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_*_*_" + mediaServerId; + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId; List streams = redis.scan(key); for (Object stream : streams) { redis.del((String) stream); @@ -479,7 +565,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public List getStreams(String mediaServerId, String type) { List result = new ArrayList<>(); - String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_" + type + "_*_*_" + mediaServerId; + String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId; List streams = redis.scan(key); for (Object stream : streams) { MediaItem mediaItem = (MediaItem)redis.get((String) stream); @@ -490,37 +576,37 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void updateDevice(Device device) { - String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + device.getDeviceId(); + String key = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_" + device.getDeviceId(); redis.set(key, device); } @Override public void removeDevice(String deviceId) { - String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + deviceId; + String key = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_" + deviceId; redis.del(key); } @Override public Device getDevice(String deviceId) { - String key = VideoManagerConstants.DEVICE_PREFIX + userSetup.getServerId() + "_" + deviceId; + String key = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_" + deviceId; return (Device)redis.get(key); } @Override public void updateGpsMsgInfo(GPSMsgInfo gpsMsgInfo) { - String key = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetup.getServerId() + "_" + gpsMsgInfo.getId(); + String key = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetting.getServerId() + "_" + gpsMsgInfo.getId(); redis.set(key, gpsMsgInfo, 60); // 默认GPS消息保存1分钟 } @Override public GPSMsgInfo getGpsMsgInfo(String gbId) { - String key = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetup.getServerId() + "_" + gbId; + String key = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetting.getServerId() + "_" + gbId; return (GPSMsgInfo)redis.get(key); } @Override public List getAllGpsMsgInfo() { - String scanKey = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetup.getServerId() + "_*"; + String scanKey = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetting.getServerId() + "_*"; List result = new ArrayList<>(); List keys = redis.scan(scanKey); for (int i = 0; i < keys.size(); i++) { @@ -536,7 +622,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public MediaItem getStreamInfo(String app, String streamId, String mediaServerId) { - String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetup.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId; + String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId; MediaItem result = null; List keys = redis.scan(scanKey); @@ -550,7 +636,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void addCpuInfo(double cpuInfo) { - String key = VideoManagerConstants.SYSTEM_INFO_CPU_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.SYSTEM_INFO_CPU_PREFIX + userSetting.getServerId(); SystemInfoDto systemInfoDto = new SystemInfoDto<>(); systemInfoDto.setTime(format.format(System.currentTimeMillis())); systemInfoDto.setData(cpuInfo); @@ -565,7 +651,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void addMemInfo(double memInfo) { - String key = VideoManagerConstants.SYSTEM_INFO_MEM_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.SYSTEM_INFO_MEM_PREFIX + userSetting.getServerId(); SystemInfoDto systemInfoDto = new SystemInfoDto<>(); systemInfoDto.setTime(format.format(System.currentTimeMillis())); systemInfoDto.setData(memInfo); @@ -580,7 +666,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @Override public void addNetInfo(Map networkInterfaces) { - String key = VideoManagerConstants.SYSTEM_INFO_NET_PREFIX + userSetup.getServerId(); + String key = VideoManagerConstants.SYSTEM_INFO_NET_PREFIX + userSetting.getServerId(); SystemInfoDto> systemInfoDto = new SystemInfoDto<>(); systemInfoDto.setTime(format.format(System.currentTimeMillis())); systemInfoDto.setData(networkInterfaces); @@ -592,4 +678,31 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { } } } + + @Override + public void sendMobilePositionMsg(JSONObject jsonObject) { + String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION; + logger.info("[redis 移动位置订阅通知] {}: {}", key, jsonObject.toString()); + redis.convertAndSend(key, jsonObject); + } + + @Override + public void sendStreamPushRequestedMsg(MessageForPushChannel msg) { + String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED; + logger.info("[redis 推流被请求通知] {}: {}-{}", key, msg.getApp(), msg.getStream()); + redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); + } + + @Override + public void sendAlarmMsg(AlarmChannelMessage msg) { + String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM; + logger.info("[redis 报警通知] {}: {}", key, JSON.toJSON(msg)); + redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); + } + + @Override + public boolean deviceIsOnline(String deviceId) { + String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + deviceId; + return redis.hasKey(key); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java similarity index 93% rename from src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java rename to src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java index feabbf10..2dc88f8d 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java @@ -5,18 +5,14 @@ import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; -import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.IGbStreamService; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.*; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.utils.node.ForestNodeMerger; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -40,9 +36,9 @@ import java.util.*; */ @SuppressWarnings("rawtypes") @Component -public class VideoManagerStoragerImpl implements IVideoManagerStorager { +public class VideoManagerStorageImpl implements IVideoManagerStorage { - private final Logger logger = LoggerFactory.getLogger(VideoManagerStoragerImpl.class); + private final Logger logger = LoggerFactory.getLogger(VideoManagerStorageImpl.class); @Autowired EventPublisher eventPublisher; @@ -85,7 +81,6 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Autowired private PlatformCatalogMapper catalogMapper; -; @Autowired private PlatformGbStreamMapper platformGbStreamMapper; @@ -96,13 +91,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Autowired private ParentPlatformMapper parentPlatformMapper; - @Autowired - private VideoStreamSessionManager streamSession; - - @Autowired - private MediaServerMapper mediaServerMapper; - - private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** @@ -141,6 +130,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { String now = this.format.format(System.currentTimeMillis()); device.setUpdateTime(now); Device deviceByDeviceId = deviceMapper.getDeviceByDeviceId(device.getDeviceId()); + device.setCharset(device.getCharset().toUpperCase()); if (deviceByDeviceId == null) { device.setCreateTime(now); redisCatchStorage.updateDevice(device); @@ -246,12 +236,15 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Override public boolean resetChannels(String deviceId, List deviceChannelList) { + if (deviceChannelList == null) { + return false; + } TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); // 数据去重 List channels = new ArrayList<>(); StringBuilder stringBuilder = new StringBuilder(); Map subContMap = new HashMap<>(); - if (deviceChannelList.size() > 1) { + if (deviceChannelList != null && deviceChannelList.size() > 1) { // 数据去重 Set gbIdSet = new HashSet<>(); for (DeviceChannel deviceChannel : deviceChannelList) { @@ -267,7 +260,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { } } }else { - stringBuilder.append(deviceChannel.getChannelId() + ","); + stringBuilder.append(deviceChannel.getChannelId()).append(","); } } if (channels.size() > 0) { @@ -282,10 +275,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { channels = deviceChannelList; } if (stringBuilder.length() > 0) { - logger.debug("[目录查询]收到的数据存在重复: {}" , stringBuilder); + logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); } try { -// int cleanChannelsResult = deviceChannelMapper.cleanChannelsByDeviceId(deviceId); int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels); int limitCount = 300; boolean result = cleanChannelsResult < 0; @@ -309,6 +301,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { dataSourceTransactionManager.commit(transactionStatus); //手动提交 return true; }catch (Exception e) { + e.printStackTrace(); dataSourceTransactionManager.rollback(transactionStatus); return false; } @@ -347,10 +340,15 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { } @Override - public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { + public PageInfo queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, Boolean online, Boolean catalogUnderDevice, int page, int count) { // 获取到所有正在播放的流 PageHelper.startPage(page, count); - List all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online); + List all; + if (catalogUnderDevice != null && catalogUnderDevice) { + all = deviceChannelMapper.queryChannels(deviceId, deviceId, query, hasSubChannel, online); + }else { + all = deviceChannelMapper.queryChannels(deviceId, null, query, hasSubChannel, online); + } return new PageInfo<>(all); } @@ -359,10 +357,6 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); } - @Override - public List tree(String deviceId) { - return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); - } @Override public List queryChannelsByDeviceId(String deviceId) { @@ -370,9 +364,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { } @Override - public PageInfo querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { + public PageInfo querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { PageHelper.startPage(page, count); - List all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, null, null, null); + List all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online); return new PageInfo<>(all); } @@ -424,10 +418,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); boolean result = false; try { - if (platformChannelMapper.delChannelForDeviceId(deviceId) <0 // 删除与国标平台的关联 - || deviceChannelMapper.cleanChannelsByDeviceId(deviceId) < 0 // 删除他的通道 - || deviceMapper.del(deviceId) < 0 // 移除设备信息 - ) { + platformChannelMapper.delChannelForDeviceId(deviceId); + deviceChannelMapper.cleanChannelsByDeviceId(deviceId); + if ( deviceMapper.del(deviceId) < 0 ) { //事务回滚 dataSourceTransactionManager.rollback(transactionStatus); } @@ -454,8 +447,6 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { device.setOnline(1); logger.info("更新设备在线: " + deviceId); redisCatchStorage.updateDevice(device); - List deviceChannelList = deviceChannelMapper.queryOnlineChannelsByDeviceId(deviceId); - eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON); return deviceMapper.update(device) > 0; } @@ -469,7 +460,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { public synchronized boolean outline(String deviceId) { logger.info("更新设备离线: " + deviceId); Device device = deviceMapper.getDeviceByDeviceId(deviceId); - if (device == null) return false; + if (device == null) { + return false; + } device.setOnline(0); redisCatchStorage.updateDevice(device); return deviceMapper.update(device) > 0; @@ -512,8 +505,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { * @param endTime */ @Override - public synchronized List queryMobilePositions(String deviceId, String startTime, String endTime) { - return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime); + public synchronized List queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) { + return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime); } @Override @@ -528,6 +521,12 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Override public boolean updateParentPlatform(ParentPlatform parentPlatform) { int result = 0; + if (parentPlatform.getCatalogGroup() == 0) { + parentPlatform.setCatalogGroup(1); + } + if (parentPlatform.getAdministrativeDivision() == null) { + parentPlatform.setAdministrativeDivision(parentPlatform.getAdministrativeDivision()); + } ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); // .getDeviceGBId()); if (parentPlatform.getId() == null ) { if (parentPlatform.getCatalogId() == null) { @@ -547,6 +546,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { parentPlatformCatch.setId(parentPlatform.getServerGBId()); redisCatchStorage.delPlatformCatchInfo(parentPlatById.getServerGBId()); } + result = platformMapper.updateParentPlatform(parentPlatform); } // 更新缓存 @@ -611,9 +611,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { } @Override - public List queryChannelListInParentPlatform(String platformId) { + public List queryChannelListInParentPlatform(String platformId) { - return deviceChannelMapper.queryChannelListInAll(null, null, null, platformId, platformId); + return deviceChannelMapper.queryChannelByPlatformId(platformId); } @Override @@ -716,6 +716,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { * 删除指定设备的所有移动位置 * @param deviceId */ + @Override public int clearMobilePositionsByDeviceId(String deviceId) { return deviceMobilePositionMapper.clearMobilePositionsByDeviceId(deviceId); } @@ -772,7 +773,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { try { if (streamProxyMapper.update(streamProxyItem) > 0) { if (!StringUtils.isEmpty(streamProxyItem.getGbId())) { - if (gbStreamMapper.update(streamProxyItem) < 0) { + if (gbStreamMapper.updateByAppAndStream(streamProxyItem) == 0) { //事务回滚 dataSourceTransactionManager.rollback(transactionStatus); return false; @@ -861,7 +862,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @Override public void updateMediaList(List streamPushItems) { - if (streamPushItems == null || streamPushItems.size() == 0) return; + if (streamPushItems == null || streamPushItems.size() == 0) { + return; + } logger.info("updateMediaList: " + streamPushItems.size()); streamPushMapper.addAll(streamPushItems); // TODO 待优化 @@ -885,9 +888,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { List parentPlatforms = parentPlatformMapper.selectAllAhareAllLiveStream(); if (parentPlatforms.size() > 0) { for (ParentPlatform parentPlatform : parentPlatforms) { - StreamProxyItem streamProxyItems = platformGbStreamMapper.selectOne(streamPushItem.getApp(), streamPushItem.getStream(), + StreamProxyItem streamProxyItem = platformGbStreamMapper.selectOne(streamPushItem.getApp(), streamPushItem.getStream(), parentPlatform.getServerGBId()); - if (streamProxyItems == null) { + if (streamProxyItem == null) { streamPushItem.setCatalogId(parentPlatform.getCatalogId()); streamPushItem.setPlatformId(parentPlatform.getServerGBId()); platformGbStreamMapper.add(streamPushItem); @@ -920,8 +923,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { } @Override - public List getStreamProxyListForEnableInMediaServer(String id, boolean enable, boolean status) { - return streamProxyMapper.selectForEnableInMediaServer(id, enable, status); + public List getStreamProxyListForEnableInMediaServer(String id, boolean enable) { + return streamProxyMapper.selectForEnableInMediaServer(id, enable); } @@ -1082,7 +1085,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { deviceChannel.setParentId(catalog.getParentId()); deviceChannel.setRegisterWay(1); // 行政区划应该是Domain的前八位 - deviceChannel.setCivilCode(sipConfig.getDomain().substring(0, sipConfig.getDomain().length() - 2)); + deviceChannel.setCivilCode(parentPlatByServerGBId.getAdministrativeDivision()); deviceChannel.setModel("live"); deviceChannel.setOwner("wvp-pro"); deviceChannel.setSecrecy("0"); @@ -1132,4 +1135,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { public List getChannelSource(String platformId, String gbId) { return platformMapper.getChannelSource(platformId, gbId); } + + @Override + public void updateChannelPotion(String deviceId, String channelId, double longitude, double latitude) { + deviceChannelMapper.updatePotion(deviceId, channelId, longitude, latitude); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/Coordtransform.java b/src/main/java/com/genersoft/iot/vmp/utils/Coordtransform.java new file mode 100644 index 00000000..c10357c5 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/Coordtransform.java @@ -0,0 +1,126 @@ +package com.genersoft.iot.vmp.utils; + +/** + * 坐标转换 + * 一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具类 + * 参考https://github.com/wandergis/coordtransform 写的Java版本 + * @author Xinconan + * @date 2016-03-18 + * @url https://github.com/xinconan/coordtransform + */ +public class Coordtransform { + + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private static double PI = 3.1415926535897932384626; + private static double a = 6378245.0; + private static double ee = 0.00669342162296594323; + + /** + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + * 即 百度 转 谷歌、高德 + * @param bd_lon + * @param bd_lat + * @return Double[lon,lat] + */ + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta); + arr[1] = z * Math.sin(theta); + return arr; + } + + /** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + * 即谷歌、高德 转 百度 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta) + 0.0065; + arr[1] = z * Math.sin(theta) + 0.006; + return arr; + } + + /** + * WGS84转GCJ02 + * @param wgs_lon + * @param wgs_lat + * @return Double[lon,lat] + */ + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ + if(outOfChina(wgs_lon, wgs_lat)){ + return new Double[]{wgs_lon,wgs_lat}; + } + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); + double radlat = wgs_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + Double[] arr = new Double[2]; + arr[0] = wgs_lon + dlng; + arr[1] = wgs_lat + dlat; + return arr; + } + + /** + * GCJ02转WGS84 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ + if(outOfChina(gcj_lon, gcj_lat)){ + return new Double[]{gcj_lon,gcj_lat}; + } + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); + double radlat = gcj_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + double mglat = gcj_lat + dlat; + double mglng = gcj_lon + dlng; + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; + } + + private static Double transformlat(double lng, double lat) { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static Double transformlng(double lng,double lat) { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + + /** + * outOfChina + * @描述: 判断是否在国内,不在国内则不做偏移 + * @param lng + * @param lat + * @return {boolean} + */ + private static boolean outOfChina(Double lng,Double lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); + }; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/GpsUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/GpsUtil.java index 53e6a61d..47f94210 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/GpsUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/GpsUtil.java @@ -17,48 +17,57 @@ public class GpsUtil { public static BaiduPoint Wgs84ToBd09(String xx, String yy) { - try { - Socket s = new Socket("api.map.baidu.com", 80); - BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); - OutputStream out = s.getOutputStream(); - StringBuffer sb = new StringBuffer("GET /ag/coord/convert?from=0&to=4"); - sb.append("&x=" + xx + "&y=" + yy); - sb.append("&callback=BMap.Convertor.cbk_3976 HTTP/1.1\r\n"); - sb.append("User-Agent: Java/1.6.0_20\r\n"); - sb.append("Host: api.map.baidu.com:80\r\n"); - sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); - sb.append("Connection: Close\r\n"); - sb.append("\r\n"); - out.write(sb.toString().getBytes()); - String json = ""; - String tmp = ""; - while ((tmp = br.readLine()) != null) { - // logger.info(tmp); - json += tmp; - } +// try { +// Socket s = new Socket("api.map.baidu.com", 80); +// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); +// OutputStream out = s.getOutputStream(); +// StringBuffer sb = new StringBuffer("GET /ag/coord/convert?from=0&to=4"); +// sb.append("&x=" + xx + "&y=" + yy); +// sb.append("&callback=BMap.Convertor.cbk_3976 HTTP/1.1\r\n"); +// sb.append("User-Agent: Java/1.6.0_20\r\n"); +// sb.append("Host: api.map.baidu.com:80\r\n"); +// sb.append("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n"); +// sb.append("Connection: Close\r\n"); +// sb.append("\r\n"); +// out.write(sb.toString().getBytes()); +// String json = ""; +// String tmp = ""; +// while ((tmp = br.readLine()) != null) { +// // logger.info(tmp); +// json += tmp; +// } +// +// s.close(); +// int start = json.indexOf("cbk_3976"); +// int end = json.lastIndexOf("}"); +// if (start != -1 && end != -1 && json.contains("\"x\":\"")) { +// json = json.substring(start, end); +// String[] point = json.split(","); +// String x = point[1].split(":")[1].replace("\"", ""); +// String y = point[2].split(":")[1].replace("\"", ""); +// BaiduPoint bdPoint= new BaiduPoint(); +// bdPoint.setBdLng(new String(decode(x))); +// bdPoint.setBdLat(new String(decode(y))); +// return bdPoint; +// //return (new String(decode(x)) + "," + new String(decode(y))); +// } else { +// logger.info("gps坐标无效!!"); +// } +// out.close(); +// br.close(); +// } catch (Exception e) { +// e.printStackTrace(); +// } - s.close(); - int start = json.indexOf("cbk_3976"); - int end = json.lastIndexOf("}"); - if (start != -1 && end != -1 && json.contains("\"x\":\"")) { - json = json.substring(start, end); - String[] point = json.split(","); - String x = point[1].split(":")[1].replace("\"", ""); - String y = point[2].split(":")[1].replace("\"", ""); - BaiduPoint bdPoint= new BaiduPoint(); - bdPoint.setBdLng(new String(decode(x))); - bdPoint.setBdLat(new String(decode(y))); - return bdPoint; - //return (new String(decode(x)) + "," + new String(decode(y))); - } else { - logger.info("gps坐标无效!!"); - } - out.close(); - br.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + + double lng = Double.parseDouble(xx); + double lat = Double.parseDouble(yy); + Double[] gcj02 = Coordtransform.WGS84ToGCJ02(lng, lat); + Double[] doubles = Coordtransform.GCJ02ToBD09(gcj02[0], gcj02[1]); + BaiduPoint bdPoint= new BaiduPoint(); + bdPoint.setBdLng(doubles[0] + ""); + bdPoint.setBdLat(doubles[1] + ""); + return bdPoint; } /** diff --git a/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java b/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java index 3d2b2ba0..b155bcd2 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/SpringBeanFactory.java @@ -34,7 +34,9 @@ public class SpringBeanFactory implements ApplicationContextAware { * 获取对象 这里重写了bean方法,起主要作用 */ public static Object getBean(String beanId) throws BeansException { - if (applicationContext == null) return null; + if (applicationContext == null) { + return null; + } return applicationContext.getBean(beanId); } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java deleted file mode 100644 index 7835feba..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.util.ArrayList; -import java.util.List; - -/** - * 节点基类 - * - */ -public class BaseNode implements INode { - - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - protected int id; - - /** - * 父节点ID - */ - protected String parentId; - - /** - * 子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - protected List children = new ArrayList(); - - /** - * 是否有子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - /** - * 是否有子孙节点 - * - * @return Boolean - */ - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - @Override - public String getParentId() { - return parentId; - } - - public void setParentId(String parentId) { - this.parentId = parentId; - } - - @Override - public List getChildren() { - return children; - } - - public void setChildren(List children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java deleted file mode 100644 index 21a48df3..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 森林节点类 - * - */ -public class ForestNode extends BaseNode { - - private static final long serialVersionUID = 1L; - - /** - * 节点内容 - */ - private Object content; - - public ForestNode(int id, String parentId, Object content) { - this.id = id; - this.parentId = parentId; - this.content = content; - } - - public Object getContent() { - return content; - } - - public void setContent(Object content) { - this.content = content; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java deleted file mode 100644 index 895e6de0..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 森林管理类 - * - * @author smallchill - */ -public class ForestNodeManager> { - - /** - * 森林的所有节点 - */ - private final ImmutableMap nodeMap; - - /** - * 森林的父节点ID - */ - private final Map parentIdMap = Maps.newHashMap(); - - public ForestNodeManager(List nodes) { - nodeMap = Maps.uniqueIndex(nodes, INode::getId); - } - - /** - * 根据节点ID获取一个节点 - * - * @param id 节点ID - * @return 对应的节点对象 - */ - public INode getTreeNodeAt(String id) { - if (nodeMap.containsKey(id)) { - return nodeMap.get(id); - } - return null; - } - - /** - * 增加父节点ID - * - * @param parentId 父节点ID - */ - public void addParentId(int parentId) { - parentIdMap.put(parentId, ""); - } - - /** - * 获取树的根节点(一个森林对应多颗树) - * - * @return 树的根节点集合 - */ - public List getRoot() { - List roots = new ArrayList<>(); - nodeMap.forEach((key, node) -> { - if (node.getParentId() == null || parentIdMap.containsKey(node.getId())) { - roots.add(node); - } - }); - return roots; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java deleted file mode 100644 index 062d4cd9..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.genersoft.iot.vmp.utils.CollectionUtil; - -import java.util.List; - -/** - * 森林节点归并类 - * - */ -public class ForestNodeMerger { - - /** - * 将节点数组归并为一个森林(多棵树)(填充节点的children域) - * 时间复杂度为O(n^2) - * - * @param items 节点域 - * @return 多棵树的根节点集合 - */ - public static > List merge(List items) { - ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (node != null) { - node.getChildren().add(forestNode); - } else { - forestNodeManager.addParentId(forestNode.getId()); - } - } - }); - return forestNodeManager.getRoot(); - } - - public static > List merge(List items, String[] parentIds) { - ForestNodeManager forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (CollectionUtil.contains(parentIds, forestNode.getId())){ - forestNodeManager.addParentId(forestNode.getId()); - } else { - if (node != null){ - node.getChildren().add(forestNode); - } - } - } - }); - return forestNodeManager.getRoot(); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java deleted file mode 100644 index c82d6f76..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import java.io.Serializable; -import java.util.List; - -/** - * - * 节点 - */ -public interface INode extends Serializable { - - /** - * 主键 - * - * @return String - */ - int getId(); - - /** - * 父主键 - * - * @return String - */ - String getParentId(); - - /** - * 子孙节点 - * - * @return List - */ - List getChildren(); - - /** - * 是否有子孙节点 - * - * @return Boolean - */ - default Boolean getHasChildren() { - return false; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java deleted file mode 100644 index 71f1b2b5..00000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 树型节点类 - * - */ -public class TreeNode extends BaseNode { - - private static final long serialVersionUID = 1L; - - private String title; - - private String key; - - private String value; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java deleted file mode 100644 index 73928a46..00000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.utils.node.INode; -import io.swagger.annotations.ApiModel; - -import java.util.ArrayList; -import java.util.List; - -@ApiModel(value = "DeviceChannelTree对象", description = "DeviceChannelTree对象") -public class DeviceChannelTree extends DeviceChannel implements INode { - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - private int id; - - /** - * 父节点ID - */ - private String parentId; - - private String parentName; - - private String title; - - private String key; - - private String value; - - /** - * 子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List children; - - /** - * 是否有子孙节点 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - @Override - public List getChildren() { - if (this.children == null) { - this.children = new ArrayList<>(); - } - return this.children; - } - - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public int getId() { - return id; - } - - @Override - public void setId(int id) { - this.id = id; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public void setParentId(String parentId) { - this.parentId = parentId; - } - - public String getParentName() { - return parentName; - } - - public void setParentName(String parentName) { - this.parentName = parentName; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public void setChildren(List children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java deleted file mode 100644 index 96577d1f..00000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.genersoft.iot.vmp.utils.node.TreeNode; - -public class DeviceChannelTreeNode extends TreeNode { - - private Integer status; - - private String deviceId; - - private String channelId; - - private Double lng; - - private Double lat; - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getChannelId() { - return channelId; - } - - public void setChannelId(String channelId) { - this.channelId = channelId; - } - - public Double getLng() { - return lng; - } - - public void setLng(Double lng) { - this.lng = lng; - } - - public Double getLat() { - return lat; - } - - public void setLat(Double lat) { - this.lat = lat; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java index 860f6a38..7d11b15c 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java @@ -3,14 +3,14 @@ package com.genersoft.iot.vmp.vmanager.gb28181.MobilePosition; import java.util.List; import java.util.UUID; -import javax.sip.message.Response; - import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.service.IDeviceService; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.util.StringUtil; import io.swagger.annotations.Api; @@ -42,7 +42,7 @@ public class MobilePositionController { private final static Logger logger = LoggerFactory.getLogger(MobilePositionController.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommander cmder; @@ -50,6 +50,9 @@ public class MobilePositionController { @Autowired private DeferredResultHolder resultHolder; + @Autowired + private IDeviceService deviceService; + /** * 查询历史轨迹 * @param deviceId 设备ID @@ -63,10 +66,11 @@ public class MobilePositionController { @ApiImplicitParam(name = "start", value = "开始时间", required = true, dataTypeClass = String.class), @ApiImplicitParam(name = "end", value = "结束时间", required = true, dataTypeClass = String.class), }) - @GetMapping("/history/{deviceId}") - public ResponseEntity> positions(@PathVariable String deviceId, - @RequestParam(required = false) String start, - @RequestParam(required = false) String end) { + @GetMapping("/history/{deviceId}/{channelId}") + public ResponseEntity>> positions(@PathVariable String deviceId, + @PathVariable String channelId, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { // if (logger.isDebugEnabled()) { // logger.debug("查询设备" + deviceId + "的历史轨迹"); // } @@ -77,9 +81,11 @@ public class MobilePositionController { if (StringUtil.isEmpty(end)) { end = null; } - - List result = storager.queryMobilePositions(deviceId, start, end); - return new ResponseEntity<>(result, HttpStatus.OK); + WVPResult> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + List result = storager.queryMobilePositions(deviceId, channelId, start, end); + wvpResult.setData(result); + return new ResponseEntity<>(wvpResult, HttpStatus.OK); } /** @@ -161,9 +167,11 @@ public class MobilePositionController { interval = "5"; } Device device = storager.queryVideoDevice(deviceId); - + device.setSubscribeCycleForMobilePosition(Integer.parseInt(expires)); + device.setMobilePositionSubmissionInterval(Integer.parseInt(interval)); + storager.updateDevice(device); String result = msg; - if (cmder.mobilePositionSubscribe(device, Integer.parseInt(expires), Integer.parseInt(interval))) { + if (deviceService.removeMobilePositionSubscribe(device)) { result += ",成功"; } else { result += ",失败"; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java index 434bbd49..addc431e 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java @@ -1,8 +1,14 @@ package com.genersoft.iot.vmp.vmanager.gb28181.alarm; +import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.service.IGbStreamService; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; @@ -31,7 +37,17 @@ public class AlarmController { @Autowired private IDeviceAlarmService deviceAlarmService; + @Autowired + private ISIPCommander commander; + + @Autowired + private ISIPCommanderForPlatform commanderForPlatform; + + @Autowired + private IVideoManagerStorage storage; + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private SimpleDateFormat formatForGB = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); /** * 分页查询报警 @@ -69,16 +85,30 @@ public class AlarmController { @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime ) { - if (StringUtils.isEmpty(alarmPriority)) alarmPriority = null; - if (StringUtils.isEmpty(alarmMethod)) alarmMethod = null; - if (StringUtils.isEmpty(alarmType)) alarmType = null; - if (StringUtils.isEmpty(startTime)) startTime = null; - if (StringUtils.isEmpty(endTime)) endTime = null; + if (StringUtils.isEmpty(alarmPriority)) { + alarmPriority = null; + } + if (StringUtils.isEmpty(alarmMethod)) { + alarmMethod = null; + } + if (StringUtils.isEmpty(alarmType)) { + alarmType = null; + } + if (StringUtils.isEmpty(startTime)) { + startTime = null; + } + if (StringUtils.isEmpty(endTime)) { + endTime = null; + } try { - if (startTime != null) format.parse(startTime); - if (endTime != null) format.parse(endTime); + if (startTime != null) { + format.parse(startTime); + } + if (endTime != null) { + format.parse(endTime); + } } catch (ParseException e) { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } @@ -109,9 +139,15 @@ public class AlarmController { @RequestParam(required = false) String deviceIds, @RequestParam(required = false) String time ) { - if (StringUtils.isEmpty(id)) id = null; - if (StringUtils.isEmpty(deviceIds)) deviceIds = null; - if (StringUtils.isEmpty(time)) time = null; + if (StringUtils.isEmpty(id)) { + id = null; + } + if (StringUtils.isEmpty(deviceIds)) { + deviceIds = null; + } + if (StringUtils.isEmpty(time)) { + time = null; + } try { if (time != null) { format.parse(time); @@ -133,5 +169,51 @@ public class AlarmController { return new ResponseEntity>(wvpResult, HttpStatus.OK); } + /** + * 测试向上级/设备发送模拟报警通知 + * + * @param deviceId 报警id + * @return + */ + @ApiOperation("测试向上级/设备发送模拟报警通知") + @GetMapping("/test/notify/alarm") + @ApiImplicitParams({ + @ApiImplicitParam(name="deviceId", value = "deviceId", required = true ,dataTypeClass = Integer.class) + }) + public ResponseEntity> delete( + @RequestParam(required = false) String deviceId + ) { + if (StringUtils.isEmpty(deviceId)) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + Device device = storage.queryVideoDevice(deviceId); + ParentPlatform platform = storage.queryParentPlatByServerGBId(deviceId); + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setChannelId(deviceId); + deviceAlarm.setAlarmDescription("test"); + deviceAlarm.setAlarmMethod("1"); + deviceAlarm.setAlarmPriority("1"); + deviceAlarm.setAlarmTime(formatForGB.format(System.currentTimeMillis())); + deviceAlarm.setAlarmType("1"); + deviceAlarm.setLongitude(115.33333); + deviceAlarm.setLatitude(39.33333); + + if (device != null && platform == null) { + commander.sendAlarmMessage(device, deviceAlarm); + }else if (device == null && platform != null){ + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + }else { + WVPResult wvpResult = new WVPResult(); + wvpResult.setCode(0); + wvpResult.setMsg("无法确定" + deviceId + "是平台还是设备"); + return new ResponseEntity>(wvpResult, HttpStatus.OK); + } + + WVPResult wvpResult = new WVPResult(); + wvpResult.setCode(0); + wvpResult.setMsg("success"); + return new ResponseEntity>(wvpResult, HttpStatus.OK); + } + } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java index b3de5af8..88c15a45 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java @@ -7,14 +7,12 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; -import javax.sip.message.Response; - import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -39,7 +37,7 @@ public class DeviceConfig { private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommander cmder; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java index 183561ae..4db11e30 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java @@ -7,14 +7,12 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; -import javax.sip.message.Response; - import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -40,7 +38,7 @@ public class DeviceControl { private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private SIPCommander cmder; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 178ad9bf..d6e614d9 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -4,14 +4,17 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; +import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; @@ -27,8 +30,8 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import java.util.List; -import java.util.UUID; +import javax.sip.DialogState; +import java.util.*; @Api(tags = "国标设备查询", value = "国标设备查询") @SuppressWarnings("rawtypes") @@ -40,7 +43,7 @@ public class DeviceQuery { private final static Logger logger = LoggerFactory.getLogger(DeviceQuery.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -50,9 +53,6 @@ public class DeviceQuery { @Autowired private DeferredResultHolder resultHolder; - - @Autowired - private DeviceOffLineDetector offLineDetector; @Autowired private IDeviceService deviceService; @@ -60,6 +60,9 @@ public class DeviceQuery { @Autowired private DynamicTask dynamicTask; + @Autowired + private SubscribeHolder subscribeHolder; + /** * 使用ID查询国标设备 * @param deviceId 国标ID @@ -121,12 +124,14 @@ public class DeviceQuery { @ApiImplicitParam(name="query", value = "查询内容" ,dataTypeClass = String.class), @ApiImplicitParam(name="online", value = "是否在线" ,dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "设备/子目录-> false/true" ,dataTypeClass = Boolean.class), + @ApiImplicitParam(name="catalogUnderDevice", value = "是否直属与设备的目录" ,dataTypeClass = Boolean.class), }) public ResponseEntity channels(@PathVariable String deviceId, int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, - @RequestParam(required = false) Boolean channelType) { + @RequestParam(required = false) Boolean channelType, + @RequestParam(required = false) Boolean catalogUnderDevice) { // if (logger.isDebugEnabled()) { // logger.debug("查询视频设备通道API调用"); // } @@ -134,7 +139,7 @@ public class DeviceQuery { query = null; } - PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); + PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } @@ -148,48 +153,27 @@ public class DeviceQuery { @ApiImplicitParam(name="deviceId", value = "设备id", required = true, dataTypeClass = String.class), }) @PostMapping("/devices/{deviceId}/sync") - public DeferredResult> devicesSync(@PathVariable String deviceId){ + public WVPResult devicesSync(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { logger.debug("设备通道信息同步API调用,deviceId:" + deviceId); } Device device = storager.queryVideoDevice(deviceId); - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + deviceId; - String uuid = UUID.randomUUID().toString(); - // 默认超时时间为30分钟 - DeferredResult> result = new DeferredResult>(30*60*1000L); - result.onTimeout(()->{ - logger.warn("设备[{}]通道信息同步超时", deviceId); - // 释放rtpserver - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - msg.setId(uuid); - WVPResult wvpResult = new WVPResult<>(); - wvpResult.setCode(-1); - wvpResult.setData(device); - wvpResult.setMsg("更新超时"); - msg.setData(wvpResult); - resultHolder.invokeAllResult(msg); - - }); - // 等待其他相同请求返回时一起返回 - if (resultHolder.exist(key, null)) { - return result; + boolean status = deviceService.isSyncRunning(deviceId); + // 已存在则返回进度 + if (status) { + WVPResult wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); + wvpResult.setData(channelSyncStatus); + return wvpResult; } - cmder.catalogQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - msg.setId(uuid); - WVPResult wvpResult = new WVPResult<>(); - wvpResult.setCode(-1); - wvpResult.setData(device); - wvpResult.setMsg(String.format("同步通道失败,错误码: %s, %s", event.statusCode, event.msg)); - msg.setData(wvpResult); - resultHolder.invokeAllResult(msg); - }); + deviceService.sync(device); - resultHolder.put(key, uuid, result); - return result; + WVPResult wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + wvpResult.setMsg("开始同步"); + return wvpResult; } /** @@ -213,7 +197,12 @@ public class DeviceQuery { if (isSuccess) { redisCatchStorage.clearCatchByDeviceId(deviceId); // 停止此设备的订阅更新 - dynamicTask.stop(deviceId); + Set allKeys = dynamicTask.getAllKeys(); + for (String key : allKeys) { + if (key.startsWith(deviceId)) { + dynamicTask.stop(key); + } + } JSONObject json = new JSONObject(); json.put("deviceId", deviceId); return new ResponseEntity<>(json.toString(),HttpStatus.OK); @@ -241,7 +230,7 @@ public class DeviceQuery { @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="count", value = "每页条数", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="query", value = "查询内容", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "是否在线", dataTypeClass = String.class), + @ApiImplicitParam(name="online", value = "是否在线", dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "通道类型, 子目录", dataTypeClass = Boolean.class), }) @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") @@ -250,7 +239,7 @@ public class DeviceQuery { int page, int count, @RequestParam(required = false) String query, - @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean online, @RequestParam(required = false) Boolean channelType){ // if (logger.isDebugEnabled()) { @@ -317,22 +306,48 @@ public class DeviceQuery { if (device != null && device.getDeviceId() != null) { Device deviceInStore = storager.queryVideoDevice(device.getDeviceId()); - if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName()); - if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset()); - if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId()); + if (!StringUtils.isEmpty(device.getName())) { + deviceInStore.setName(device.getName()); + } + if (!StringUtils.isEmpty(device.getCharset())) { + deviceInStore.setCharset(device.getCharset()); + } + if (!StringUtils.isEmpty(device.getMediaServerId())) { + deviceInStore.setMediaServerId(device.getMediaServerId()); + } + // 目录订阅相关的信息 if (device.getSubscribeCycleForCatalog() > 0) { if (deviceInStore.getSubscribeCycleForCatalog() == 0 || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { + deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); // 开启订阅 deviceService.addCatalogSubscribe(deviceInStore); } }else if (device.getSubscribeCycleForCatalog() == 0) { if (deviceInStore.getSubscribeCycleForCatalog() != 0) { + deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); // 取消订阅 deviceService.removeCatalogSubscribe(deviceInStore); } } + // 移动位置订阅相关的信息 + if (device.getSubscribeCycleForMobilePosition() > 0) { + if (deviceInStore.getSubscribeCycleForMobilePosition() == 0 || deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) { + deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval()); + deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); + // 开启订阅 + deviceService.addMobilePositionSubscribe(deviceInStore); + } + }else if (device.getSubscribeCycleForMobilePosition() == 0) { + if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) { + // 取消订阅 + deviceService.removeMobilePositionSubscribe(deviceInStore); + } + } + + // TODO 报警订阅相关的信息 + storager.updateDevice(device); cmder.deviceInfoQuery(device); } @@ -436,9 +451,47 @@ public class DeviceQuery { return result; } - @GetMapping("/{deviceId}/tree") - @ApiOperation(value = "通道树形结构", notes = "通道树形结构") - public WVPResult> tree(@PathVariable String deviceId) { - return WVPResult.Data(storager.tree(deviceId)); + + @GetMapping("/{deviceId}/sync_status") + @ApiOperation(value = "获取通道同步进度", notes = "获取通道同步进度") + public WVPResult getSyncStatus(@PathVariable String deviceId) { + SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); + WVPResult wvpResult = new WVPResult<>(); + if (channelSyncStatus == null) { + wvpResult.setCode(-1); + wvpResult.setMsg("同步尚未开始"); + }else { + wvpResult.setCode(0); + wvpResult.setData(channelSyncStatus); + if (channelSyncStatus.getErrorMsg() != null) { + wvpResult.setMsg(channelSyncStatus.getErrorMsg()); + } + } + return wvpResult; + } + + @GetMapping("/{deviceId}/subscribe_info") + @ApiOperation(value = "获取设备的订阅状态", notes = "获取设备的订阅状态") + public WVPResult> getSubscribeInfo(@PathVariable String deviceId) { + Set allKeys = dynamicTask.getAllKeys(); + Map dialogStateMap = new HashMap<>(); + for (String key : allKeys) { + if (key.startsWith(deviceId)) { + ISubscribeTask subscribeTask = (ISubscribeTask)dynamicTask.get(key); + DialogState dialogState = subscribeTask.getDialogState(); + if (dialogState == null) { + continue; + } + if (subscribeTask instanceof CatalogSubscribeTask) { + dialogStateMap.put("catalog", dialogState.toString()); + }else if (subscribeTask instanceof MobilePositionSubscribeTask) { + dialogStateMap.put("mobilePosition", dialogState.toString()); + } + } + } + WVPResult> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + wvpResult.setData(dialogStateMap); + return wvpResult; } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java index 46be6816..300546f9 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/gbStream/GbStreamController.java @@ -1,7 +1,7 @@ package com.genersoft.iot.vmp.vmanager.gb28181.gbStream; import com.genersoft.iot.vmp.gb28181.bean.GbStream; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.gb28181.gbStream.bean.GbStreamParam; import com.genersoft.iot.vmp.service.IGbStreamService; import com.github.pagehelper.PageInfo; @@ -27,7 +27,7 @@ public class GbStreamController { private IGbStreamService gbStreamService; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; /** diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java index e07c81d8..d4995a01 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/media/MediaController.java @@ -4,13 +4,12 @@ import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamPushService; import com.genersoft.iot.vmp.service.IMediaService; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +26,7 @@ public class MediaController { private final static Logger logger = LoggerFactory.getLogger(MediaController.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IStreamPushService streamPushService; @@ -66,7 +65,4 @@ public class MediaController { } return result; } - - - } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java index c3435fd1..a3f1d6aa 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java @@ -4,13 +4,13 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.DynamicTask; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog; import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.UpdateChannelParam; @@ -42,10 +42,10 @@ public class PlatformController { private final static Logger logger = LoggerFactory.getLogger(PlatformController.class); @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -117,7 +117,7 @@ public class PlatformController { PageInfo parentPlatformPageInfo = storager.queryParentPlatformList(page, count); if (parentPlatformPageInfo.getList().size() > 0) { for (ParentPlatform platform : parentPlatformPageInfo.getList()) { - platform.setGpsSubscribe(subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId()) != null); + platform.setMobilePositionSubscribe(subscribeHolder.getMobilePositionSubscribe(platform.getServerGBId()) != null); platform.setCatalogSubscribe(subscribeHolder.getCatalogSubscribe(platform.getServerGBId()) != null); } } @@ -230,6 +230,7 @@ public class PlatformController { wvpResult.setMsg("missing parameters"); return new ResponseEntity<>(wvpResult, HttpStatus.BAD_REQUEST); } + parentPlatform.setCharacterSet(parentPlatform.getCharacterSet().toUpperCase()); ParentPlatform parentPlatformOld = storager.queryParentPlatByServerGBId(parentPlatform.getServerGBId()); boolean updateResult = storager.updateParentPlatform(parentPlatform); @@ -285,7 +286,9 @@ public class PlatformController { return new ResponseEntity<>("missing parameters", HttpStatus.BAD_REQUEST); } ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(serverGBId); - if (parentPlatform == null) return new ResponseEntity<>("fail", HttpStatus.OK); + if (parentPlatform == null) { + return new ResponseEntity<>("fail", HttpStatus.OK); + } // 发送离线消息,无论是否成功都删除缓存 commanderForPlatform.unregister(parentPlatform, (event -> { // 清空redis缓存 @@ -303,8 +306,10 @@ public class PlatformController { storager.delCatalogByPlatformId(parentPlatform.getServerGBId()); storager.delRelationByPlatformId(parentPlatform.getServerGBId()); // 停止发送位置订阅定时任务 - String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetup.getServerId() + "_MobilePosition_" + parentPlatform.getServerGBId(); + String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "_MobilePosition_" + parentPlatform.getServerGBId(); dynamicTask.stop(key); + // 删除缓存的订阅信息 + subscribeHolder.removeAllSubscribe(parentPlatform.getServerGBId()); if (deleteResult) { return new ResponseEntity<>("success", HttpStatus.OK); } else { @@ -341,7 +346,6 @@ public class PlatformController { * @param platformId 上级平台ID * @param query 查询内容 * @param online 是否在线 - * @param choosed 是否已选中 * @param channelType 通道类型 * @return */ diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java index 930bb33e..20ffc000 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java @@ -33,14 +33,12 @@ import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.web.context.request.async.DeferredResult; import java.util.List; import java.util.UUID; -import javax.sip.message.Response; - @Api(tags = "国标设备点播") @CrossOrigin @RestController @@ -56,7 +54,7 @@ public class PlayController { private VideoStreamSessionManager streamSession; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java deleted file mode 100644 index 4ffbd4b0..00000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.gb28181.playback; - -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; -import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; -import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import com.genersoft.iot.vmp.service.IMediaServerService; -import com.genersoft.iot.vmp.service.bean.SSRCInfo; -import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.service.IPlayService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import org.springframework.web.context.request.async.DeferredResult; - -import javax.sip.message.Response; -import java.util.UUID; - -@Api(tags = "历史媒体下载") -@CrossOrigin -@RestController -@RequestMapping("/api/download") -public class DownloadController { - - private final static Logger logger = LoggerFactory.getLogger(DownloadController.class); - - @Autowired - private SIPCommander cmder; - - @Autowired - private IVideoManagerStorager storager; - - @Autowired - private IRedisCatchStorage redisCatchStorage; - - // @Autowired - // private ZLMRESTfulUtils zlmresTfulUtils; - - @Autowired - private IPlayService playService; - - @Autowired - private DeferredResultHolder resultHolder; - - @Autowired - private IMediaServerService mediaServerService; - - @ApiOperation("开始历史媒体下载") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "startTime", value = "开始时间", dataTypeClass = String.class), - @ApiImplicitParam(name = "endTime", value = "结束时间", dataTypeClass = String.class), - @ApiImplicitParam(name = "downloadSpeed", value = "下载倍速", dataTypeClass = String.class), - }) - @GetMapping("/start/{deviceId}/{channelId}") - public DeferredResult> play(@PathVariable String deviceId, @PathVariable String channelId, - String startTime, String endTime, String downloadSpeed) { - - if (logger.isDebugEnabled()) { - logger.debug(String.format("历史媒体下载 API调用,deviceId:%s,channelId:%s,downloadSpeed:%s", deviceId, channelId, downloadSpeed)); - } - String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; - String uuid = UUID.randomUUID().toString(); - DeferredResult> result = new DeferredResult>(30000L); - // 超时处理 - result.onTimeout(()->{ - logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId)); - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData("Timeout"); - resultHolder.invokeAllResult(msg); - }); - if(resultHolder.exist(key, null)) { - return result; - } - resultHolder.put(key, uuid, result); - Device device = storager.queryVideoDevice(deviceId); - - MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); - if (newMediaServerItem == null) { - logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId)); - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData("Timeout"); - resultHolder.invokeAllResult(msg); - return result; - } - - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); - - cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (InviteStreamInfo inviteStreamInfo) -> { - logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); - playService.onPublishHandlerForDownload(inviteStreamInfo, deviceId, channelId, uuid); - }, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); - resultHolder.invokeAllResult(msg); - }); - - return result; - } - - @ApiOperation("停止历史媒体下载") - @ApiImplicitParams({ - @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class), - @ApiImplicitParam(name = "stream", value = "流ID", dataTypeClass = String.class), - }) - @GetMapping("/stop/{deviceId}/{channelId}/{stream}") - public ResponseEntity playStop(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { - - cmder.streamByeCmd(deviceId, channelId, stream, null); - - if (logger.isDebugEnabled()) { - logger.debug(String.format("设备历史媒体下载停止 API调用,deviceId/channelId:%s_%s", deviceId, channelId)); - } - - if (deviceId != null && channelId != null) { - JSONObject json = new JSONObject(); - json.put("deviceId", deviceId); - json.put("channelId", channelId); - return new ResponseEntity(json.toString(), HttpStatus.OK); - } else { - logger.warn("设备历史媒体下载停止API调用失败!"); - return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); - } - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java index 2fccaa8c..e095a6a5 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java @@ -2,11 +2,8 @@ package com.genersoft.iot.vmp.vmanager.gb28181.playback; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; -import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; //import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; -import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.service.IPlayService; import io.swagger.annotations.Api; @@ -28,11 +25,9 @@ import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.web.context.request.async.DeferredResult; -import java.util.UUID; - @Api(tags = "视频回放") @CrossOrigin @RestController @@ -45,7 +40,7 @@ public class PlaybackController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private IRedisCatchStorage redisCatchStorage; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java index 95d1aefa..4a29f8ea 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java @@ -13,13 +13,11 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import javax.sip.message.Response; - import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import java.util.UUID; @@ -35,7 +33,7 @@ public class PtzController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private DeferredResultHolder resultHolder; diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java index e5659814..6fdadf26 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java @@ -1,6 +1,10 @@ package com.genersoft.iot.vmp.vmanager.gb28181.record; +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; +import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.IPlayService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -8,6 +12,7 @@ import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +25,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import java.util.UUID; @@ -36,11 +41,17 @@ public class GBRecordController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired private DeferredResultHolder resultHolder; + @Autowired + private IPlayService playService; + + @Autowired + private IMediaServerService mediaServerService; + @ApiOperation("录像查询") @ApiImplicitParams({ @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), @@ -52,7 +63,7 @@ public class GBRecordController { public DeferredResult> recordinfo(@PathVariable String deviceId,@PathVariable String channelId, String startTime, String endTime){ if (logger.isDebugEnabled()) { - logger.debug(String.format("录像信息查询 API调用,deviceId:%s ,startTime:%s, startTime:%s",deviceId, startTime, endTime)); + logger.debug(String.format("录像信息查询 API调用,deviceId:%s ,startTime:%s, endTime:%s",deviceId, startTime, endTime)); } Device device = storager.queryVideoDevice(deviceId); @@ -77,4 +88,111 @@ public class GBRecordController { }); return result; } + + @ApiOperation("开始历史媒体下载") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "startTime", value = "开始时间", dataTypeClass = String.class), + @ApiImplicitParam(name = "endTime", value = "结束时间", dataTypeClass = String.class), + @ApiImplicitParam(name = "downloadSpeed", value = "下载倍速", dataTypeClass = String.class), + }) + @GetMapping("/download/start/{deviceId}/{channelId}") + public DeferredResult> download(@PathVariable String deviceId, @PathVariable String channelId, + String startTime, String endTime, String downloadSpeed) { + + if (logger.isDebugEnabled()) { + logger.debug(String.format("历史媒体下载 API调用,deviceId:%s,channelId:%s,downloadSpeed:%s", deviceId, channelId, downloadSpeed)); + } +// String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; +// String uuid = UUID.randomUUID().toString(); +// DeferredResult> result = new DeferredResult>(30000L); +// // 超时处理 +// result.onTimeout(()->{ +// logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId)); +// RequestMessage msg = new RequestMessage(); +// msg.setId(uuid); +// msg.setKey(key); +// msg.setData("Timeout"); +// resultHolder.invokeAllResult(msg); +// }); +// if(resultHolder.exist(key, null)) { +// return result; +// } +// resultHolder.put(key, uuid, result); +// Device device = storager.queryVideoDevice(deviceId); +// +// MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); +// if (newMediaServerItem == null) { +// logger.warn(String.format("设备下载响应超时,deviceId:%s ,channelId:%s", deviceId, channelId)); +// RequestMessage msg = new RequestMessage(); +// msg.setId(uuid); +// msg.setKey(key); +// msg.setData("Timeout"); +// resultHolder.invokeAllResult(msg); +// return result; +// } +// +// SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); +// +// cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (InviteStreamInfo inviteStreamInfo) -> { +// logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); +// playService.onPublishHandlerForDownload(inviteStreamInfo, deviceId, channelId, uuid); +// }, event -> { +// RequestMessage msg = new RequestMessage(); +// msg.setId(uuid); +// msg.setKey(key); +// msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); +// resultHolder.invokeAllResult(msg); +// }); + + if (logger.isDebugEnabled()) { + logger.debug(String.format("设备回放 API调用,deviceId:%s ,channelId:%s", deviceId, channelId)); + } + + DeferredResult> result = playService.download(deviceId, channelId, startTime, endTime, Integer.parseInt(downloadSpeed), null, hookCallBack->{ + resultHolder.invokeResult(hookCallBack.getData()); + }); + + return result; + } + + @ApiOperation("停止历史媒体下载") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "stream", value = "流ID", dataTypeClass = String.class), + }) + @GetMapping("/download/stop/{deviceId}/{channelId}/{stream}") + public ResponseEntity playStop(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { + + cmder.streamByeCmd(deviceId, channelId, stream, null); + + if (logger.isDebugEnabled()) { + logger.debug(String.format("设备历史媒体下载停止 API调用,deviceId/channelId:%s_%s", deviceId, channelId)); + } + + if (deviceId != null && channelId != null) { + JSONObject json = new JSONObject(); + json.put("deviceId", deviceId); + json.put("channelId", channelId); + return new ResponseEntity(json.toString(), HttpStatus.OK); + } else { + logger.warn("设备历史媒体下载停止API调用失败!"); + return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @ApiOperation("获取历史媒体下载进度") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class), + @ApiImplicitParam(name = "stream", value = "流ID", dataTypeClass = String.class), + }) + @GetMapping("/download/progress/{deviceId}/{channelId}/{stream}") + public ResponseEntity getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { + + StreamInfo streamInfo = playService.getDownLoadInfo(deviceId, channelId, stream); + return new ResponseEntity<>(streamInfo, HttpStatus.OK); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java index 650dbe03..44b16883 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/log/LogController.java @@ -1,7 +1,6 @@ package com.genersoft.iot.vmp.vmanager.log; -import com.genersoft.iot.vmp.conf.UserSetup; -import com.genersoft.iot.vmp.media.zlm.ZLMRunner; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.service.ILogService; import com.genersoft.iot.vmp.storager.dao.dto.LogDto; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; @@ -33,7 +32,7 @@ public class LogController { private ILogService logService; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -66,16 +65,26 @@ public class LogController { @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime ) { - if (StringUtils.isEmpty(query)) query = null; - if (StringUtils.isEmpty(startTime)) startTime = null; - if (StringUtils.isEmpty(endTime)) endTime = null; - if (!userSetup.getLogInDatebase()) { + if (StringUtils.isEmpty(query)) { + query = null; + } + if (StringUtils.isEmpty(startTime)) { + startTime = null; + } + if (StringUtils.isEmpty(endTime)) { + endTime = null; + } + if (!userSetting.getLogInDatebase()) { logger.warn("自动记录日志功能已关闭,查询结果可能不完整。"); } try { - if (startTime != null) format.parse(startTime); - if (endTime != null) format.parse(endTime); + if (startTime != null) { + format.parse(startTime); + } + if (endTime != null) { + format.parse(endTime); + } } catch (ParseException e) { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java index 1500f351..faed2c82 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java @@ -4,8 +4,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.VManageBootstrap; import com.genersoft.iot.vmp.common.VersionPo; +import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.VersionInfo; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; @@ -27,6 +28,7 @@ import javax.sip.ObjectInUseException; import javax.sip.SipProvider; import java.util.Iterator; import java.util.List; +import java.util.Set; @SuppressWarnings("rawtypes") @Api(tags = "服务控制") @@ -42,13 +44,16 @@ public class ServerController { private IMediaServerService mediaServerService; @Autowired - VersionInfo versionInfo; + private VersionInfo versionInfo; @Autowired - SipConfig sipConfig; + private SipConfig sipConfig; @Autowired - UserSetup userSetup; + private UserSetting userSetting; + + @Autowired + private DynamicTask dynamicTask; @Value("${server.port}") private int serverPort; @@ -232,14 +237,14 @@ public class ServerController { jsonObject.put("server.port", serverPort); if (StringUtils.isEmpty(type)) { jsonObject.put("sip", JSON.toJSON(sipConfig)); - jsonObject.put("base", JSON.toJSON(userSetup)); + jsonObject.put("base", JSON.toJSON(userSetting)); }else { switch (type){ case "sip": jsonObject.put("sip", sipConfig); break; case "base": - jsonObject.put("base", userSetup); + jsonObject.put("base", userSetting); break; default: break; @@ -248,4 +253,35 @@ public class ServerController { result.setData(jsonObject); return result; } + +// @ApiOperation("当前进行中的动态任务") +// @GetMapping(value = "/dynamicTask") +// @ResponseBody +// public WVPResult getDynamicTask(){ +// WVPResult result = new WVPResult<>(); +// result.setCode(0); +// result.setMsg("success"); +// +// JSONObject jsonObject = new JSONObject(); +// +// Set allKeys = dynamicTask.getAllKeys(); +// jsonObject.put("server.port", serverPort); +// if (StringUtils.isEmpty(type)) { +// jsonObject.put("sip", JSON.toJSON(sipConfig)); +// jsonObject.put("base", JSON.toJSON(userSetting)); +// }else { +// switch (type){ +// case "sip": +// jsonObject.put("sip", sipConfig); +// break; +// case "base": +// jsonObject.put("base", userSetting); +// break; +// default: +// break; +// } +// } +// result.setData(jsonObject); +// return result; +// } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java index 5f02b2aa..f2e48d87 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java @@ -69,34 +69,19 @@ public class StreamProxyController { @ResponseBody public WVPResult save(@RequestBody StreamProxyItem param){ logger.info("添加代理: " + JSONObject.toJSONString(param)); - if (StringUtils.isEmpty(param.getMediaServerId())) param.setMediaServerId("auto"); - if (StringUtils.isEmpty(param.getType())) param.setType("default"); - if (StringUtils.isEmpty(param.getGbId())) param.setGbId(null); + if (StringUtils.isEmpty(param.getMediaServerId())) { + param.setMediaServerId("auto"); + } + if (StringUtils.isEmpty(param.getType())) { + param.setType("default"); + } + if (StringUtils.isEmpty(param.getGbId())) { + param.setGbId(null); + } WVPResult result = streamProxyService.save(param); return result; } - @ApiOperation("修改代理") - @ApiImplicitParams({ - @ApiImplicitParam(name = "param", value = "代理参数", dataTypeClass = StreamProxyItem.class), - }) - @PostMapping(value = "/update") - @ResponseBody - public WVPResult update(@RequestBody StreamProxyItem param){ - logger.info("修改代理: " + JSONObject.toJSONString(param)); - WVPResult result = new WVPResult<>(); - if(StringUtils.isEmpty(param.getApp())||StringUtils.isEmpty(param.getStream())){ - result.setCode(400); - result.setMsg("app不能为null且stream不能为null,请检查具体参数!"); - return result; - } - streamProxyService.del(param.getApp(), param.getStream()); - if (StringUtils.isEmpty(param.getMediaServerId())) param.setMediaServerId("auto"); - if (StringUtils.isEmpty(param.getType())) param.setType("default"); - if (StringUtils.isEmpty(param.getGbId())) param.setGbId(null); - param.setEnable(false); - result = streamProxyService.save(param); - return result; - } + @ApiOperation("获取ffmpeg.cmd模板") @GetMapping(value = "/ffmpeg_cmd/list") @ApiImplicitParams({ diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java index eac742c8..9bbe1d7e 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.web.gb28181; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,7 @@ public class ApiControlController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; /** * 设备控制 - 云台控制 diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java index 2e96fbe2..d4928ec7 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.github.pagehelper.PageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +25,7 @@ public class ApiDeviceController { private final static Logger logger = LoggerFactory.getLogger(ApiDeviceController.class); @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; // @Autowired // private SIPCommander cmder; diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java index dfc2c442..ddbf20b6 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java @@ -2,15 +2,14 @@ package com.genersoft.iot.vmp.web.gb28181; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.conf.UserSetup; +import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IPlayService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,10 +32,10 @@ public class ApiStreamController { private SIPCommander cmder; @Autowired - private IVideoManagerStorager storager; + private IVideoManagerStorage storager; @Autowired - private UserSetup userSetup; + private UserSetting userSetting; @Autowired private IRedisCatchStorage redisCatchStorage; @@ -69,7 +68,7 @@ public class ApiStreamController { @RequestParam(required = false)String timeout ){ - DeferredResult resultDeferredResult = new DeferredResult<>(userSetup.getPlayTimeout() + 10); + DeferredResult resultDeferredResult = new DeferredResult<>(userSetting.getPlayTimeout().longValue() + 10); Device device = storager.queryVideoDevice(serial); if (device == null ) { JSONObject result = new JSONObject(); diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml index f7f86041..3f148d6f 100644 --- a/src/main/resources/all-application.yml +++ b/src/main/resources/all-application.yml @@ -170,6 +170,8 @@ user-settings: save-position-history: false # 点播等待超时时间,单位:毫秒 play-timeout: 3000 + # 上级点播等待超时时间,单位:毫秒 + platform-play-timeout: 60000 # 是否开启接口鉴权 interface-authentication: true # 自动配置redis 可以过期事件 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3d7808a0..d74c444c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: profiles: - active: dev + active: local diff --git a/src/main/resources/logback-spring-local.xml b/src/main/resources/logback-spring-local.xml index 9951c696..ec80d2dd 100644 --- a/src/main/resources/logback-spring-local.xml +++ b/src/main/resources/logback-spring-local.xml @@ -80,12 +80,12 @@ - - - - - - + + + + + + diff --git a/web_src/build/webpack.dev.conf.js b/web_src/build/webpack.dev.conf.js index 070ae221..55efd304 100755 --- a/web_src/build/webpack.dev.conf.js +++ b/web_src/build/webpack.dev.conf.js @@ -32,6 +32,7 @@ const devWebpackConfig = merge(baseWebpackConfig, { contentBase: false, // since we use CopyWebpackPlugin. compress: true, host: HOST || config.dev.host, + // host:'127.0.0.1', port: PORT || config.dev.port, open: config.dev.autoOpenBrowser, overlay: config.dev.errorOverlay diff --git a/web_src/config/index.js b/web_src/config/index.js index cec91b87..b1e1cbe1 100644 --- a/web_src/config/index.js +++ b/web_src/config/index.js @@ -29,11 +29,13 @@ module.exports = { }, // Various Dev Server settings - host: 'localhost', // can be overwritten by process.env.HOST + host:"127.0.0.1", + useLocalIp: false, // can be overwritten by process.env.HOST port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined autoOpenBrowser: false, errorOverlay: true, notifyOnErrors: true, + hot: true,//自动保存 poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- diff --git a/web_src/index.html b/web_src/index.html index af1cad22..f69f16be 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -9,11 +9,29 @@ - + -
+ diff --git a/web_src/package-lock.json b/web_src/package-lock.json index 356bbccb..e680d5ba 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -1,14249 +1,44 @@ { "name": "gb_web", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "gb_web", - "version": "1.0.0", - "dependencies": { - "axios": "^0.24.0", - "core-js": "^2.6.5", - "echarts": "^4.9.0", - "element-ui": "^2.15.6", - "fingerprintjs2": "^2.1.2", - "moment": "^2.29.1", - "postcss-pxtorem": "^5.1.1", - "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", - "vue-clipboard2": "^0.3.1", - "vue-clipboards": "^1.3.0", - "vue-contextmenujs": "^1.3.13", - "vue-cookies": "^1.7.4", - "vue-router": "^3.1.6" - }, - "devDependencies": { - "autoprefixer": "^7.1.2", - "babel-core": "^6.22.1", - "babel-helper-vue-jsx-merge-props": "^2.0.3", - "babel-loader": "^7.1.1", - "babel-plugin-syntax-jsx": "^6.18.0", - "babel-plugin-transform-runtime": "^6.22.0", - "babel-plugin-transform-vue-jsx": "^3.5.0", - "babel-preset-env": "^1.3.2", - "babel-preset-stage-2": "^6.22.0", - "chalk": "^2.0.1", - "copy-webpack-plugin": "^4.6.0", - "css-loader": "^0.28.11", - "extract-text-webpack-plugin": "^3.0.0", - "file-loader": "^1.1.4", - "friendly-errors-webpack-plugin": "^1.6.1", - "html-webpack-plugin": "^2.30.1", - "node-notifier": "^5.1.2", - "optimize-css-assets-webpack-plugin": "^3.2.0", - "ora": "^1.2.0", - "portfinder": "^1.0.13", - "postcss-import": "^11.0.0", - "postcss-loader": "^2.0.8", - "postcss-url": "^7.2.1", - "rimraf": "^2.6.0", - "semver": "^5.3.0", - "shelljs": "^0.7.6", - "uglifyjs-webpack-plugin": "^1.1.1", - "url-loader": "^0.5.8", - "vue-loader": "^13.3.0", - "vue-style-loader": "^3.0.1", - "vue-template-compiler": "^2.5.2", - "webpack": "^3.6.0", - "webpack-bundle-analyzer": "^2.9.0", - "webpack-dev-server": "^2.9.1", - "webpack-merge": "^4.1.0" - }, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "dev": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz", - "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/acorn-dynamic-import/download/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "dependencies": { - "acorn": "^4.0.3" - } - }, - "node_modules/acorn-dynamic-import/node_modules/acorn": { - "version": "4.0.13", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz", - "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/array-includes/download/array-includes-3.1.1.tgz", - "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-5.4.1.tgz", - "integrity": "sha1-EamAuE67kXgc41sP3C7ilON4Pwc=", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", - "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1596697422093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", - "dev": true - }, - "node_modules/async-validator": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", - "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", - "dependencies": { - "babel-runtime": "6.x" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-7.2.6.tgz?cache=0&sync_timestamp=1601167517316&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fautoprefixer%2Fdownload%2Fautoprefixer-7.2.6.tgz", - "integrity": "sha1-JWZy+G98c12oScTwfQCKuwVgZ9w=", - "dev": true, - "dependencies": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" - }, - "bin": { - "autoprefixer-info": "bin/autoprefixer-info" - } - }, - "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/axios/node_modules/follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npm.taobao.org/babel-core/download/babel-core-6.26.3.tgz", - "integrity": "sha1-suLwnjQtDwyI4vAuBneUEl51wgc=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npm.taobao.org/babel-generator/download/babel-generator-6.26.1.tgz", - "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", - "dev": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-bindify-decorators/download/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-builder-binary-assignment-operator-visitor/download/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-call-delegate/download/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-helper-define-map/download/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-explode-assignable-expression/download/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-explode-class/download/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "dependencies": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-function-name/download/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-get-function-arity/download/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-hoist-variables/download/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-optimise-call-expression/download/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-helper-regex/download/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-remap-async-to-generator/download/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helper-replace-supers/download/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-vue-jsx-merge-props": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz", - "integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY=" - }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-helpers/download/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-7.1.5.tgz", - "integrity": "sha1-4+4M1zlKpVfgE7AtPkkr/QeqbWg=", - "dev": true, - "dependencies": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "babel-core": "6", - "webpack": "2 || 3 || 4" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-check-es2015-constants/download/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-functions/download/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "node_modules/babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-async-generators/download/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "node_modules/babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-class-properties/download/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "node_modules/babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-decorators/download/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "node_modules/babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-dynamic-import/download/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-exponentiation-operator/download/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-jsx/download/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-object-rest-spread/download/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-syntax-trailing-function-commas/download/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "node_modules/babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-generator-functions/download/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-async-to-generator/download/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-class-properties/download/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-decorators/download/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "dependencies": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-arrow-functions/download/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoped-functions/download/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-block-scoping/download/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-classes/download/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-computed-properties/download/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-destructuring/download/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-duplicate-keys/download/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-for-of/download/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-function-name/download/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-literals/download/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-amd/download/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-commonjs/download/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha1-WKeThjqefKhwvcWogRF/+sJ9tvM=", - "dev": true, - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-systemjs/download/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-modules-umd/download/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-object-super/download/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-parameters/download/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-shorthand-properties/download/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz?cache=0&sync_timestamp=1589682670915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-transform-es2015-shorthand-properties%2Fdownload%2Fbabel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-spread/download/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-sticky-regex/download/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-template-literals/download/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-typeof-symbol/download/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-es2015-unicode-regex/download/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-exponentiation-operator/download/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-object-rest-spread/download/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-regenerator/download/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "dependencies": { - "regenerator-transform": "^0.10.0" - } - }, - "node_modules/babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-strict-mode/download/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-vue-jsx": { - "version": "3.7.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-vue-jsx/download/babel-plugin-transform-vue-jsx-3.7.0.tgz", - "integrity": "sha1-1ASS5mkqNrWU9+mhko9D6Wl0CWA=", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "peerDependencies": { - "babel-helper-vue-jsx-merge-props": "^2.0.0" - } - }, - "node_modules/babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/babel-preset-env/download/babel-preset-env-1.7.0.tgz?cache=0&sync_timestamp=1591204557603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-preset-env%2Fdownload%2Fbabel-preset-env-1.7.0.tgz", - "integrity": "sha1-3qefpOvriDzTXasH4mDBycBN93o=", - "dev": true, - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "node_modules/babel-preset-env/node_modules/browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-3.2.8.tgz", - "integrity": "sha1-sABTYdZHHw9ZUnl6dvyYXx+Xj8Y=", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-preset-stage-2/download/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npm.taobao.org/babel-preset-stage-3/download/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-template/download/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", - "dev": true - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "node_modules/bfj-node4": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/bfj-node4/download/bfj-node4-5.3.1.tgz", - "integrity": "sha1-4j2LJwV/HQIU/FYRQq2duZjyaDA=", - "deprecated": "Switch to the `bfj` package for fixes and new features!", - "dev": true, - "dependencies": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "tryer": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", - "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&sync_timestamp=1593261283449&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz", - "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", - "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", - "dev": true - }, - "node_modules/bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "node_modules/bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "node_modules/bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "node_modules/bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "dependencies": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "node_modules/bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, - "node_modules/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", - "integrity": "sha1-vsoAVAj2Quvr6oCwQrTRjSrA7ms=", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/bonjour/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", - "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898201980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.1.tgz?cache=0&sync_timestamp=1596557809886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserify-sign%2Fdownload%2Fbrowserify-sign-4.2.1.tgz", - "integrity": "sha1-6vSt1G3VS+O7OzbAzxWrvrp5VsM=", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-2.11.3.tgz", - "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz", - "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "dependencies": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-api/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dev": true, - "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/caniuse-db": { - "version": "1.0.30001244", - "resolved": "https://registry.nlark.com/caniuse-db/download/caniuse-db-1.0.30001244.tgz?cache=0&sync_timestamp=1626154539434&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcaniuse-db%2Fdownload%2Fcaniuse-db-1.0.30001244.tgz", - "integrity": "sha1-pt/zJHNkjfCwrg+Z2YeXrft89Fk=", - "dev": true - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", - "dev": true - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-types": { - "version": "7.4.0", - "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-7.4.0.tgz", - "integrity": "sha1-A3jsG5YW7HH3dJMaPGUW+tjBUvQ=", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.2.tgz?cache=0&sync_timestamp=1597763177396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.2.tgz", - "integrity": "sha1-ONyOZY3sOAl0HrPve7Ckf+QkIy0=", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", - "dev": true - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clap": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/clap/download/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", - "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-1.3.1.tgz", - "integrity": "sha1-ACwZkJEtDVlYDJO9NsBW3pnkJZo=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.6.tgz", - "integrity": "sha1-UpISlu7A/fd+rRdJQhshyWhkc3Y=", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz?cache=0&sync_timestamp=1597606145227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coa": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/coa/download/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "dependencies": { - "q": "^1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "0.11.4", - "resolved": "https://registry.npm.taobao.org/color/download/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "dependencies": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/color-string": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-0.3.0.tgz?cache=0&sync_timestamp=1602228058149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolor-string%2Fdownload%2Fcolor-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/colormin": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/colormin/download/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "dependencies": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } - }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/colors/download/colors-1.1.2.tgz?cache=0&sync_timestamp=1589682043437&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolors%2Fdownload%2Fcolors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1598576136669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", - "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", - "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", - "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", - "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", - "dev": true - }, - "node_modules/consolidate": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.14.5.tgz?cache=0&sync_timestamp=1599596654038&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", - "dev": true, - "dependencies": { - "bluebird": "^3.1.1" - } - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", - "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", - "dev": true, - "dependencies": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/core-js": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz", - "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", - "dev": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz?cache=0&sync_timestamp=1590172281856&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz?cache=0&sync_timestamp=1596557441827&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcreate-ecdh%2Fdownload%2Fcreate-ecdh-4.0.4.tgz", - "integrity": "sha1-1uf0v/pmc2CFoHYv06YyaE2rzE4=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "engines": { - "node": ">4" - } - }, - "node_modules/css-declaration-sorter/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-declaration-sorter/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/css-loader": { - "version": "0.28.11", - "resolved": "https://registry.nlark.com/css-loader/download/css-loader-0.28.11.tgz?cache=0&sync_timestamp=1621865230592&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-loader%2Fdownload%2Fcss-loader-0.28.11.tgz", - "integrity": "sha1-w/mGSnAL4nEbtaJGKyOJsaOS2rc=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "engines": { - "node": ">=0.12.0 || >= 4.3.0 < 5.0.0 || >=5.10" - } - }, - "node_modules/css-loader/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-loader/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-loader/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/css-loader/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-loader/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/css-loader/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-loader/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.3.tgz?cache=0&sync_timestamp=1595335280942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-selector-tokenizer%2Fdownload%2Fcss-selector-tokenizer-0.7.3.tgz", - "integrity": "sha1-c18mGG5nx0mq8nV4NAXPBmH66PE=", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", - "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-3.10.0.tgz?cache=0&sync_timestamp=1599670481279&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssnano%2Fdownload%2Fcssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "dependencies": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } - }, - "node_modules/cssnano-preset-default": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.3", - "postcss-unique-selectors": "^4.0.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/cssnano-preset-default/node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, - "node_modules/cssnano-preset-default/node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/cssnano-preset-default/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/cssnano-preset-default/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cssnano-preset-default/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/cssnano-preset-default/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano-preset-default/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cssnano-preset-default/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/cssnano-preset-default/node_modules/normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-calc/node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "node_modules/cssnano-preset-default/node_modules/postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "dependencies": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-svgo": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-preset-default/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cssnano-preset-default/node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cssnano-util-raw-cache/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssnano/node_modules/autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-6.7.7.tgz?cache=0&sync_timestamp=1601167517316&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fautoprefixer%2Fdownload%2Fautoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "dependencies": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "node_modules/cssnano/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dev": true, - "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/cssnano/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssnano/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cssnano/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssnano/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/cssnano/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssnano/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/csso": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/csso/download/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "dependencies": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "bin": { - "csso": "bin/csso" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/csso/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz", - "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "node_modules/deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/del": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/del/download/del-3.0.0.tgz?cache=0&sync_timestamp=1601076806416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "dependencies": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", - "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", - "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/detect-indent/download/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", - "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", - "dev": true - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", - "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", - "dev": true, - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", - "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1600028888021&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.2.tgz?cache=0&sync_timestamp=1600028450905&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.0.2.tgz", - "integrity": "sha1-87blSSAeRvWItZRj3XcYcTH+aXE=", - "dev": true - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1600028450905&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", - "dev": true - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz", - "integrity": "sha1-Or5DrvODX4rgd9E23c4PJ2sEAOY=", - "dev": true - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/echarts": { - "version": "4.9.0", - "resolved": "https://registry.nlark.com/echarts/download/echarts-4.9.0.tgz?cache=0&sync_timestamp=1619495447964&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fecharts%2Fdownload%2Fecharts-4.9.0.tgz", - "integrity": "sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0=", - "dependencies": { - "zrender": "4.3.2" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz?cache=0&sync_timestamp=1597678424776&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fejs%2Fdownload%2Fejs-2.7.4.tgz", - "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.742", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.742.tgz", - "integrity": "sha512-ihL14knI9FikJmH2XUIDdZFWJxvr14rPSdOhJ7PpS27xbz8qmaRwCwyg/bmFwjWKmWK9QyamiCZVCvXm5CH//Q==", - "dev": true - }, - "node_modules/element-ui": { - "version": "2.15.6", - "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.6.tgz", - "integrity": "sha512-rcYXEKd/j2G0AgficAOk1Zd1AsnHRkhmrK4yLHmNOiimU2JfsywgfKUjMoFuT6pQx0luhovj8lFjpE4Fnt58Iw==", - "dependencies": { - "async-validator": "~1.8.1", - "babel-helper-vue-jsx-merge-props": "^2.0.0", - "deepmerge": "^1.2.0", - "normalize-wheel": "^1.0.1", - "resize-observer-polyfill": "^1.5.0", - "throttle-debounce": "^1.0.1" - }, - "peerDependencies": { - "vue": "^2.5.17" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", - "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/entities": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.0.3.tgz", - "integrity": "sha1-XEh+V0Krk8Fau12iJ1m4WQ7AO38=", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz", - "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", - "dev": true, - "dependencies": { - "stackframe": "^1.1.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz", - "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/es6-map/download/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set/node_modules/es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz", - "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz", - "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escope": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/escope/download/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "dependencies": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596642941915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642941915&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npm.taobao.org/event-emitter/download/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz?cache=0&sync_timestamp=1598517795415&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.7.tgz", - "integrity": "sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=", - "dev": true - }, - "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/events/download/events-3.2.0.tgz?cache=0&sync_timestamp=1595422602348&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevents%2Fdownload%2Fevents-3.2.0.tgz", - "integrity": "sha1-k7h8GPjvzUICpGGuxN/AVWtjk3k=", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/eventsource/download/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "dependencies": { - "original": ">=0.0.5" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.7.0.tgz?cache=0&sync_timestamp=1594145111640&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", - "dev": true, - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz", - "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", - "dev": true, - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/type/download/type-2.1.0.tgz?cache=0&sync_timestamp=1598016600310&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-2.1.0.tgz", - "integrity": "sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8=", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extract-text-webpack-plugin/download/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha1-XwQ+qgL5dQqSWLeMCm4NwUCPsvc=", - "deprecated": "Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin", - "dev": true, - "dependencies": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - }, - "engines": { - "node": ">= 4.8 < 5.0.0 || >= 5.10" - }, - "peerDependencies": { - "webpack": "^3.1.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz", - "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=", - "dev": true - }, - "node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-1.1.11.tgz", - "integrity": "sha1-b+iGRJsPKpNuQ8q6rAzb+zaVBvg=", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - }, - "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.5", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.5.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.5.tgz", - "integrity": "sha1-GbDouuj0duW6ZmMAOHd1+xoApNo=", - "dev": true, - "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" - } - }, - "node_modules/file-loader/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599334207614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz?cache=0&sync_timestamp=1601922251376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-0.4.7.tgz", - "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", - "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", - "dev": true, - "optional": true - }, - "node_modules/filesize": { - "version": "3.6.1", - "resolved": "https://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz", - "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz?cache=0&sync_timestamp=1597756298124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fingerprintjs2": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fingerprintjs2/-/fingerprintjs2-2.1.2.tgz", - "integrity": "sha512-ZPsLgjziFRbUb5tXWpEMtWp4XFnzSah8SiNfl3aoURDZ+2zi2tuIOYUULqDBV+Cb6paN+raWT+Q2qpOaCbX/Yw==", - "deprecated": "Package has been renamed to @fingerprintjs/fingerprintjs. Install @fingerprintjs/fingerprintjs to get updates." - }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/flatten/download/flatten-1.0.3.tgz", - "integrity": "sha1-wSg6yfJ7Noq8HjbR/3sEUBowNWs=", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", - "dev": true - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.0.tgz?cache=0&sync_timestamp=1597057997789&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.0.tgz", - "integrity": "sha1-tC6Nk6Kn7qXtiGM2dtZZe8jjhNs=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/friendly-errors-webpack-plugin/download/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha1-78hsu4FiJFZYYaG+ep2E0Kr+oTY=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/friendly-errors-webpack-plugin/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/friendly-errors-webpack-plugin/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/friendly-errors-webpack-plugin/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz", - "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz?cache=0&sync_timestamp=1597056464385&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz?cache=0&sync_timestamp=1596709369054&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globby": { - "version": "7.1.1", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dependencies": { - "delegate": "^3.1.2" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/growly/download/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "node_modules/gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz", - "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz", - "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - }, - "node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/home-or-tmp/download/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz", - "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", - "dev": true - }, - "node_modules/html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.3.1.tgz", - "integrity": "sha1-+5oaS1sUxdq6gtPjTGrk/nAaDkQ=", - "dev": true - }, - "node_modules/html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", - "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", - "dev": true, - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-2.30.1.tgz?cache=0&sync_timestamp=1600690506465&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "deprecated": "out of support", - "dev": true, - "dependencies": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" - }, - "peerDependencies": { - "webpack": "1 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3" - } - }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407611415&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.5.2.tgz", - "integrity": "sha1-2i4x0jezk6rnKs5DiC3X4nCo/3c=", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz", - "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "0.19.2", - "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.2.tgz", - "integrity": "sha1-7nPcyDSBZa/v6N4v9xd1HRgWCO4=", - "dev": true, - "dependencies": { - "http-proxy": "^1.18.1", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184325364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "node_modules/icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz?cache=0&sync_timestamp=1600767333663&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "dependencies": { - "postcss": "^6.0.1" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz?cache=0&sync_timestamp=1590809380232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-1.0.0.tgz", - "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", - "dev": true, - "dependencies": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", - "dev": true - }, - "node_modules/internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-1.2.0.tgz?cache=0&sync_timestamp=1596563415126&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finternal-ip%2Fdownload%2Finternal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "dependencies": { - "meow": "^3.3.0" - }, - "bin": { - "internal-ip": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", - "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", - "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-finite/download/is-finite-1.1.0.tgz", - "integrity": "sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", - "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz?cache=0&sync_timestamp=1599667279942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-object%2Fdownload%2Fis-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-svg/download/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "dependencies": { - "html-comment-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1599897619557&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz", - "integrity": "sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/json-loader/download/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz?cache=0&sync_timestamp=1599334207614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", - "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", - "dev": true - }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", - "dev": true - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/last-call-webpack-plugin": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/last-call-webpack-plugin/download/last-call-webpack-plugin-2.1.2.tgz", - "integrity": "sha1-rYDG4xCZgpTS7SGApo6VieR2jEQ=", - "dev": true, - "dependencies": { - "lodash": "^4.17.4", - "webpack-sources": "^1.0.1" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1601450715716&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", - "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz?cache=0&sync_timestamp=1597081904643&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flocate-path%2Fdownload%2Flocate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz?cache=0&sync_timestamp=1589682056270&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-symbols%2Fdownload%2Flog-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loglevel": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.7.0.tgz?cache=0&sync_timestamp=1598447642950&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floglevel%2Fdownload%2Floglevel-1.7.0.tgz", - "integrity": "sha1-coFmhVp0DVnTjbAc9G8ELKoEG7A=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427519396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/math-expression-evaluator": { - "version": "1.3.8", - "resolved": "https://registry.nlark.com/math-expression-evaluator/download/math-expression-evaluator-1.3.8.tgz", - "integrity": "sha1-Mg2jsrwVEvT1D8MCCysc1cjp1Xc=", - "dev": true - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/mem/download/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz?cache=0&sync_timestamp=1598693287069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmeow%2Fdownload%2Fmeow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1597756298124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831212519&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "dev": true, - "dependencies": { - "mime-db": "1.44.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596094012686&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true - }, - "node_modules/mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983423917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz", - "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M=", - "engines": { - "node": "*" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", - "dev": true, - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.1.tgz", - "integrity": "sha1-174036MQW5FJTDFHCJMV7/iHSwE=", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317437265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", - "dev": true, - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz?cache=0&sync_timestamp=1599010730714&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.10.0.tgz", - "integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", - "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npm.taobao.org/node-notifier/download/node-notifier-5.4.3.tgz?cache=0&sync_timestamp=1597311297466&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-notifier%2Fdownload%2Fnode-notifier-5.4.3.tgz", - "integrity": "sha1-y3La+UyTkECY4oucWQ/YZuRkvVA=", - "dev": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "node_modules/node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz?cache=0&sync_timestamp=1601463025217&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-url%2Fdownload%2Fnormalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", - "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", - "dev": true, - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", - "dev": true - }, - "node_modules/object-is": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.3.tgz?cache=0&sync_timestamp=1601503177879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.3.tgz", - "integrity": "sha1-LjueZVYBN0Ve471irsTZCi6hzIE=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz", - "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1597005190531&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz?cache=0&sync_timestamp=1598733310448&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopener%2Fdownload%2Fopener-1.5.2.tgz", - "integrity": "sha1-XTfh81B3udysQwE3InGv3rKhNZg=", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", - "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optimize-css-assets-webpack-plugin": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/optimize-css-assets-webpack-plugin/download/optimize-css-assets-webpack-plugin-3.2.1.tgz?cache=0&sync_timestamp=1598800822300&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptimize-css-assets-webpack-plugin%2Fdownload%2Foptimize-css-assets-webpack-plugin-3.2.1.tgz", - "integrity": "sha1-nRhlSg4FjAkL3ZkbBLyw9vJIZXM=", - "dev": true, - "dependencies": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^2.1.2" - } - }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/cssnano": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", - "dev": true, - "dependencies": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.8", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/optimize-css-assets-webpack-plugin/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/ora/download/ora-1.4.0.tgz?cache=0&sync_timestamp=1599423139882&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-1.4.0.tgz", - "integrity": "sha1-iERYIVs6XUCXWSKF+TMhu3p54uU=", - "dev": true, - "dependencies": { - "chalk": "^2.1.0", - "cli-cursor": "^2.1.0", - "cli-spinners": "^1.0.1", - "log-symbols": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", - "dev": true, - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "dependencies": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1594559720897&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz?cache=0&sync_timestamp=1597081785924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-locate%2Fdownload%2Fp-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz", - "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", - "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz", - "integrity": "sha1-OFCAo+wTy2KmLTlAnLPoiETNrtQ=", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", - "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", - "integrity": "sha1-y4cksPramEWWhW0abrr9NYRlS5Q=", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true, - "optional": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz?cache=0&sync_timestamp=1596018172434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fportfinder%2Fdownload%2Fportfinder-1.0.28.tgz", - "integrity": "sha1-Z8RiKFK9U3TdHdkA93n1NGL6x3g=", - "dev": true, - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "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)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-5.3.1.tgz?cache=0&sync_timestamp=1601732624081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "dependencies": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } - }, - "node_modules/postcss-calc/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-calc/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-calc/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-calc/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-calc/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-calc/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-calc/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-2.2.2.tgz?cache=0&sync_timestamp=1599670485775&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-colormin%2Fdownload%2Fpostcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "dependencies": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "node_modules/postcss-colormin/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-colormin/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-colormin/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-colormin/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-colormin/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-colormin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-colormin/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-2.6.1.tgz?cache=0&sync_timestamp=1599674174819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-convert-values%2Fdownload%2Fpostcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "dependencies": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - } - }, - "node_modules/postcss-convert-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-convert-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-convert-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-convert-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-convert-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-convert-values/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-convert-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-2.0.4.tgz?cache=0&sync_timestamp=1599674175141&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-comments%2Fdownload%2Fpostcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "dev": true, - "dependencies": { - "postcss": "^5.0.14" - } - }, - "node_modules/postcss-discard-comments/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-discard-comments/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-2.1.0.tgz?cache=0&sync_timestamp=1599674175412&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-duplicates%2Fdownload%2Fpostcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-duplicates/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-2.1.0.tgz?cache=0&sync_timestamp=1599670482017&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-empty%2Fdownload%2Fpostcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "dev": true, - "dependencies": { - "postcss": "^5.0.14" - } - }, - "node_modules/postcss-discard-empty/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-empty/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-empty/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-empty/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-empty/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-discard-empty/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-empty/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-0.1.1.tgz?cache=0&sync_timestamp=1599670482109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-overridden%2Fdownload%2Fpostcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "dev": true, - "dependencies": { - "postcss": "^5.0.16" - } - }, - "node_modules/postcss-discard-overridden/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-discard-overridden/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npm.taobao.org/postcss-discard-unused/download/postcss-discard-unused-2.2.3.tgz?cache=0&sync_timestamp=1599672334828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-discard-unused%2Fdownload%2Fpostcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "dependencies": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-discard-unused/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-unused/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-filter-plugins/download/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha1-giRf34IzcEFkXkdxFNjlk6oYuOw=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4" - } - }, - "node_modules/postcss-filter-plugins/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-filter-plugins/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-filter-plugins/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-filter-plugins/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-filter-plugins/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-filter-plugins/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-filter-plugins/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-import": { - "version": "11.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-import/download/postcss-import-11.1.0.tgz", - "integrity": "sha1-Vck2LJGSmU7GiGXSJEGd8dspgfA=", - "dev": true, - "dependencies": { - "postcss": "^6.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "node_modules/postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.1.2.tgz?cache=0&sync_timestamp=1601607668112&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-load-config%2Fdownload%2Fpostcss-load-config-2.1.2.tgz", - "integrity": "sha1-xepQTyxK7zPHNZo03jVzdyrXUCo=", - "dev": true, - "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-load-options/download/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "dependencies": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-load-options/node_modules/cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-2.2.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-load-options/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/postcss-load-plugins/download/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "dev": true, - "dependencies": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-load-plugins/node_modules/cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-2.2.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-load-plugins/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-2.1.6.tgz", - "integrity": "sha1-HX3XsXxrojS5vtWvE+C+pApC10A=", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^0.4.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-loader/node_modules/ajv": { - "version": "6.12.5", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.5.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.5.tgz", - "integrity": "sha1-GbDouuj0duW6ZmMAOHd1+xoApNo=", - "dev": true, - "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" - } - }, - "node_modules/postcss-loader/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "node_modules/postcss-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599334207614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "node_modules/postcss-loader/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz?cache=0&sync_timestamp=1601922251376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-0.4.7.tgz", - "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npm.taobao.org/postcss-merge-idents/download/postcss-merge-idents-2.1.7.tgz?cache=0&sync_timestamp=1599672336407&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-merge-idents%2Fdownload%2Fpostcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "dev": true, - "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - } - }, - "node_modules/postcss-merge-idents/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-merge-idents/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-idents/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-2.0.2.tgz?cache=0&sync_timestamp=1599670482411&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-merge-longhand%2Fdownload%2Fpostcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4" - } - }, - "node_modules/postcss-merge-longhand/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-merge-longhand/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-2.1.2.tgz?cache=0&sync_timestamp=1599670482522&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-merge-rules%2Fdownload%2Fpostcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "dev": true, - "dependencies": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "deprecated": "Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.", - "dev": true, - "dependencies": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - }, - "bin": { - "browserslist": "cli.js" - } - }, - "node_modules/postcss-merge-rules/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-merge-rules/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-rules/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-message-helpers/download/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "node_modules/postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-1.0.5.tgz?cache=0&sync_timestamp=1599670482669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-font-values%2Fdownload%2Fpostcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "node_modules/postcss-minify-font-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-minify-font-values/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-font-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-1.0.5.tgz?cache=0&sync_timestamp=1599670482761&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-gradients%2Fdownload%2Fpostcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "dev": true, - "dependencies": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-minify-gradients/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-1.2.2.tgz?cache=0&sync_timestamp=1599670482880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-params%2Fdownload%2Fpostcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - } - }, - "node_modules/postcss-minify-params/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-params/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-params/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-params/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-params/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-minify-params/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-params/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-2.1.1.tgz?cache=0&sync_timestamp=1599670483082&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-minify-selectors%2Fdownload%2Fpostcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-minify-selectors/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.2.1.tgz?cache=0&sync_timestamp=1600776084988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha1-3IfjQUjsfqtfeR981YSYMzdbdBo=", - "dev": true, - "dependencies": { - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz?cache=0&sync_timestamp=1600778003060&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz?cache=0&sync_timestamp=1602187018990&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-1.1.1.tgz?cache=0&sync_timestamp=1599670482967&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-charset%2Fdownload%2Fpostcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "dependencies": { - "postcss": "^5.0.5" - } - }, - "node_modules/postcss-normalize-charset/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-charset/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-charset/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-normalize-charset/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-charset/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-normalize-charset/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-charset/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-display-values/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-display-values/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-positions/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-positions/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "dev": true, - "dependencies": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-repeat-style/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "dependencies": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-string/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-string/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "dependencies": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-timing-functions/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-3.0.8.tgz?cache=0&sync_timestamp=1599670483753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-normalize-url%2Fdownload%2Fpostcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "dependencies": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - } - }, - "node_modules/postcss-normalize-url/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-normalize-url/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-normalize-url/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/postcss-normalize-whitespace/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-normalize-whitespace/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-2.2.3.tgz?cache=0&sync_timestamp=1599670483946&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-ordered-values%2Fdownload%2Fpostcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - } - }, - "node_modules/postcss-ordered-values/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-ordered-values/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-ordered-values/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-pxtorem": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-pxtorem/-/postcss-pxtorem-5.1.1.tgz", - "integrity": "sha512-uvgIujL/pn0GbZ+rczESD2orHsbXrrCqi+q9wJO8PCk3ZGCoVVtu5hZTbtk+tbZHZP5UkTfCvqOrTZs9Ncqfsg==", - "dependencies": { - "postcss": "^7.0.27" - } - }, - "node_modules/postcss-pxtorem/node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pxtorem/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-idents/download/postcss-reduce-idents-2.4.0.tgz?cache=0&sync_timestamp=1599672339373&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-reduce-idents%2Fdownload%2Fpostcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "node_modules/postcss-reduce-idents/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-idents/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-idents/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-reduce-idents/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-idents/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-reduce-idents/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-idents/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-1.0.1.tgz?cache=0&sync_timestamp=1599670484036&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-reduce-initial%2Fdownload%2Fpostcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "dev": true, - "dependencies": { - "postcss": "^5.0.4" - } - }, - "node_modules/postcss-reduce-initial/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-initial/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-initial/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-reduce-initial/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-initial/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-reduce-initial/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-initial/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-1.0.4.tgz?cache=0&sync_timestamp=1599670484213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-reduce-transforms%2Fdownload%2Fpostcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "dev": true, - "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-reduce-transforms/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-2.2.3.tgz?cache=0&sync_timestamp=1601045323543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "node_modules/postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-2.1.6.tgz?cache=0&sync_timestamp=1599670484324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-svgo%2Fdownload%2Fpostcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "dev": true, - "dependencies": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" - } - }, - "node_modules/postcss-svgo/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-svgo/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-2.0.2.tgz?cache=0&sync_timestamp=1599670484407&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-unique-selectors%2Fdownload%2Fpostcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "dependencies": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-unique-selectors/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-unique-selectors/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-url": { - "version": "7.3.2", - "resolved": "https://registry.npm.taobao.org/postcss-url/download/postcss-url-7.3.2.tgz", - "integrity": "sha1-X+onOAf7hLOMRhw8mp6KvSNfcSA=", - "dev": true, - "dependencies": { - "mime": "^1.4.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.0", - "postcss": "^6.0.1", - "xxhashjs": "^0.2.1" - } - }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - }, - "node_modules/postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-zindex/download/postcss-zindex-2.2.0.tgz?cache=0&sync_timestamp=1599670556187&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-zindex%2Fdownload%2Fpostcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "dev": true, - "dependencies": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } - }, - "node_modules/postcss-zindex/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-zindex/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-zindex/node_modules/chalk/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/postcss-zindex/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-zindex/node_modules/postcss": { - "version": "5.2.18", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/postcss-zindex/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-zindex/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-3.2.3.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1600217249280&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz", - "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "dependencies": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", - "dev": true, - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "4.3.4", - "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "dependencies": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.2.0.tgz", - "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz", - "integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/reduce-css-calc/download/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "dependencies": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - } - }, - "node_modules/reduce-css-calc/node_modules/balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "node_modules/reduce-function-call": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/reduce-function-call/download/reduce-function-call-1.0.3.tgz", - "integrity": "sha1-YDUPf7JSwKZ+sQ/UaU0WkJlxMA8=", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.1.tgz", - "integrity": "sha1-ytkq2Oa1kXc0hfvgWkhcr09Ffm8=", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&sync_timestamp=1595456117883&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-2.0.0.tgz?cache=0&sync_timestamp=1600413529161&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.2.0.tgz?cache=0&sync_timestamp=1590335923060&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregjsgen%2Fdownload%2Fregjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "node_modules/renderkid/node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "node_modules/renderkid/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/renderkid/node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/require-from-string/download/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.17.0.tgz", - "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz?cache=0&sync_timestamp=1589682064084&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsax%2Fdownload%2Fsax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", - "dev": true - }, - "node_modules/schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.3.0.tgz?cache=0&sync_timestamp=1601922251376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "dependencies": { - "ajv": "^5.0.0" - }, - "engines": { - "node": ">= 4.3 < 5.0.0 || >= 5.10" - } - }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "node_modules/selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.8.tgz?cache=0&sync_timestamp=1600186082996&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.8.tgz", - "integrity": "sha1-DRcgi30Swz+OrIXEGDXyf8PYGjA=", - "dev": true, - "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1593407611415&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz?cache=0&sync_timestamp=1596697357985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fshebang-regex%2Fdownload%2Fshebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npm.taobao.org/shelljs/download/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "iojs": "*", - "node": ">=0.11.0" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/shellwords/download/shellwords-0.1.1.tgz", - "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", - "dev": true - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz", - "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", - "dev": true, - "dependencies": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "node_modules/sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.1.5.tgz?cache=0&sync_timestamp=1596409908572&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, - "dependencies": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - } - }, - "node_modules/sockjs-client/node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz", - "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", - "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz?cache=0&sync_timestamp=1590161967473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-correct%2Fdownload%2Fspdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz?cache=0&sync_timestamp=1589682217985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-expression-parse%2Fdownload%2Fspdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.6.tgz?cache=0&sync_timestamp=1600286627478&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.6.tgz", - "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz", - "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", - "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "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)", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy-transport/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/spdy/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", - "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", - "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)", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/spdy/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.1" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz?cache=0&sync_timestamp=1590854186823&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstackframe%2Fdownload%2Fstackframe-1.2.0.tgz", - "integrity": "sha1-UkKUktY8YuuYmATBFVLj0i53kwM=", - "dev": true - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", - "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz", - "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", - "dev": true - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1596697387823&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1596697387823&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylehacks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.0.tgz", - "integrity": "sha1-ZLMjlRxKJOX8ey7AbBN78y0VXoo=", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "postcss": "^6.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/stylehacks/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo": { - "version": "0.7.2", - "resolved": "https://registry.npm.taobao.org/svgo/download/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dev": true, - "dependencies": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/tapable": { - "version": "0.2.9", - "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-0.2.9.tgz?cache=0&sync_timestamp=1600381257656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-0.2.9.tgz", - "integrity": "sha1-ry2LvJsE907hevK02QSPgHrNGKg=", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/throttle-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", - "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz?cache=0&sync_timestamp=1593478647766&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrough2%2Fdownload%2Fthrough2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz", - "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", - "dev": true - }, - "node_modules/time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/time-stamp/download/time-stamp-2.2.0.tgz", - "integrity": "sha1-kX4KZpBWiHkOx7u94EBGJZr4P1c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", - "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", - "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/trim-right/download/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", - "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", - "dev": true - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz?cache=0&sync_timestamp=1598016600310&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftype%2Fdownload%2Ftype-1.2.0.tgz", - "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=", - "dev": true - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz?cache=0&sync_timestamp=1596697411295&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypedarray%2Fdownload%2Ftypedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", - "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", - "dev": true, - "dependencies": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/commander": { - "version": "2.19.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1598576136669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "node_modules/uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha1-dfVIFghYFjoIZD4IbV/v4YpdZ94=", - "dev": true, - "dependencies": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "engines": { - "node": ">= 4.8 < 5.0.0 || >= 5.10" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/ajv": { - "version": "6.12.5", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.5.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.5.tgz", - "integrity": "sha1-GbDouuj0duW6ZmMAOHd1+xoApNo=", - "dev": true, - "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" - } - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/commander": { - "version": "2.13.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.13.0.tgz?cache=0&sync_timestamp=1598576136669&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=", - "dev": true - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599334207614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz?cache=0&sync_timestamp=1601922251376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-0.4.7.tgz", - "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/uglifyjs-webpack-plugin/node_modules/uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.9.tgz", - "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=", - "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", - "dev": true, - "dependencies": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.0.tgz?cache=0&sync_timestamp=1598814377097&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.0.tgz", - "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.2", - "mime": "1.3.x" - }, - "peerDependencies": { - "file-loader": "*" - } - }, - "node_modules/url-loader/node_modules/mime": { - "version": "1.3.6", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", - "dev": true, - "bin": { - "mime": "cli.js" - } - }, - "node_modules/url-parse": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz?cache=0&sync_timestamp=1596697422093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "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.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz", - "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", - "dev": true - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz", - "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", - "dev": true - }, - "node_modules/vue": { - "version": "2.6.12", - "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", - "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" - }, - "node_modules/vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "dependencies": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - }, - "peerDependencies": { - "vue": "^2.1.8" - } - }, - "node_modules/vue-clipboard2": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz", - "integrity": "sha1-blUft704SImyiw2jsSKJ7WvKSJQ=", - "dependencies": { - "clipboard": "^2.0.0" - } - }, - "node_modules/vue-clipboards": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vue-clipboards/-/vue-clipboards-1.3.0.tgz", - "integrity": "sha512-VMDYHpLQH0EUmqfk9b5XMrkvSu/HjNsLW2EBR4OS6JZHcv/PxmWYdoTBPVlp5eYrhWy07La8nWpRwAh09Mgufw==", - "dependencies": { - "clipboard": "^1.7.1" - } - }, - "node_modules/vue-clipboards/node_modules/clipboard": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", - "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "node_modules/vue-contextmenujs": { - "version": "1.3.13", - "resolved": "https://registry.npmmirror.com/vue-contextmenujs/download/vue-contextmenujs-1.3.13.tgz", - "integrity": "sha1-O9rgI8e9QgleeNpCWAACUNUKuO8=" - }, - "node_modules/vue-cookies": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/vue-cookies/download/vue-cookies-1.7.4.tgz?cache=0&sync_timestamp=1598941352058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-cookies%2Fdownload%2Fvue-cookies-1.7.4.tgz", - "integrity": "sha1-0kHQoEMdoHlYN2UdELTXPnyNPo0=" - }, - "node_modules/vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", - "dev": true - }, - "node_modules/vue-loader": { - "version": "13.7.3", - "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-13.7.3.tgz?cache=0&sync_timestamp=1600850410121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-13.7.3.tgz", - "integrity": "sha1-4HRA94IwpjnQCtpNp7ltDp1iA38=", - "dev": true, - "dependencies": { - "consolidate": "^0.14.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "lru-cache": "^4.1.1", - "postcss": "^6.0.8", - "postcss-load-config": "^1.1.0", - "postcss-selector-parser": "^2.0.0", - "prettier": "^1.7.0", - "resolve": "^1.4.0", - "source-map": "^0.6.1", - "vue-hot-reload-api": "^2.2.0", - "vue-style-loader": "^3.0.0", - "vue-template-es2015-compiler": "^1.6.0" - }, - "peerDependencies": { - "css-loader": "*", - "vue-template-compiler": "^2.0.0" - } - }, - "node_modules/vue-loader/node_modules/cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-2.2.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/vue-loader/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vue-loader/node_modules/postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-1.2.0.tgz?cache=0&sync_timestamp=1601607668112&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-load-config%2Fdownload%2Fpostcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "dependencies": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/vue-router": { - "version": "3.4.6", - "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.4.6.tgz?cache=0&sync_timestamp=1602076636169&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.4.6.tgz", - "integrity": "sha1-972iyaQ9OYN2IcmgK6d4n12qJLI=" - }, - "node_modules/vue-style-loader": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-3.1.2.tgz", - "integrity": "sha1-a2atNJmPyVIMLx5NX6QJFkHBWXo=", - "dev": true, - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "node_modules/vue-template-compiler": { - "version": "2.6.12", - "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.12.tgz?cache=0&sync_timestamp=1597927391993&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-template-compiler%2Fdownload%2Fvue-template-compiler-2.6.12.tgz", - "integrity": "sha1-lH7XGWdEyKUoXr4SM/6WBDf8xX4=", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "node_modules/vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", - "dev": true - }, - "node_modules/watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.4.tgz?cache=0&sync_timestamp=1600385388649&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.4.tgz", - "integrity": "sha1-bp2lOzyAuy1lCBiPWyAEEIZs0ws=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.0" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha1-mUihhmy71suCTeoTp+1pH2yN3/A=", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - }, - "engines": { - "node": "<8.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261283449&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1597763177396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", - "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", - "dev": true, - "dependencies": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.1.tgz", - "integrity": "sha512-rwxyfecTAxoarCC9VlHlIpfQCmmJ/qWD5bpbjkof+7HrNhTNZIwZITxN6CdlYL2axGmwNUQ+tFgcSOiNXMf/sQ==", - "dev": true, - "dependencies": { - "acorn": "^5.3.0", - "bfj-node4": "^5.2.0", - "chalk": "^2.3.0", - "commander": "^2.13.0", - "ejs": "^2.5.7", - "express": "^4.16.2", - "filesize": "^3.5.11", - "gzip-size": "^4.1.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "opener": "^1.4.3", - "ws": "^4.0.0" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-1.12.2.tgz?cache=0&sync_timestamp=1594744509096&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-1.12.2.tgz", - "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", - "dev": true, - "dependencies": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "engines": { - "node": ">=0.6" - }, - "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", - "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", - "dev": true, - "dependencies": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^2.1.2", - "compression": "^1.7.3", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "^0.19.1", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">=4.7" - }, - "peerDependencies": { - "webpack": "^2.2.0 || ^3.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261283449&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1597763177396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz?cache=0&sync_timestamp=1597606145227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "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)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz?cache=0&sync_timestamp=1597756298124&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "6.6.0", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-6.6.0.tgz?cache=0&sync_timestamp=1600660100032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-4.2.1.tgz?cache=0&sync_timestamp=1601576779920&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.2.tgz?cache=0&sync_timestamp=1602063025787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-4.2.2.tgz", - "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", - "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.5", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.5.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.5.tgz", - "integrity": "sha1-GbDouuj0duW6ZmMAOHd1+xoApNo=", - "dev": true, - "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" - } - }, - "node_modules/webpack/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "node_modules/webpack/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz?cache=0&sync_timestamp=1599334207614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema-traverse%2Fdownload%2Fjson-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "node_modules/webpack/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz?cache=0&sync_timestamp=1598611719015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "dependencies": { - "has-flag": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack/node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/webpack/node_modules/uglify-js/node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1600660100032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "node_modules/webpack/node_modules/uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - }, - "peerDependencies": { - "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.4.tgz?cache=0&sync_timestamp=1591289007652&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebsocket-driver%2Fdownload%2Fwebsocket-driver-0.7.4.tgz", - "integrity": "sha1-ia1Slbv2S0gKvLox5JU6ynBvV2A=", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz", - "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npm.taobao.org/whet.extend/download/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", - "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", - "dev": true, - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/ws": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ws/download/ws-4.1.0.tgz?cache=0&sync_timestamp=1593925601875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-4.1.0.tgz", - "integrity": "sha1-qXm119TaaL9U7+BAiWfDJIaacok=", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/xxhashjs/download/xxhashjs-0.2.2.tgz", - "integrity": "sha1-imJRVnYhocRqWuIE2gJJx/jKqdg=", - "dev": true, - "dependencies": { - "cuint": "^0.2.2" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yargs": { - "version": "8.0.2", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-8.0.2.tgz?cache=0&sync_timestamp=1600660100032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "node_modules/yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-7.0.0.tgz?cache=0&sync_timestamp=1601576779920&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz?cache=0&sync_timestamp=1597606145227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/yargs/node_modules/cliui/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/zrender": { - "version": "4.3.2", - "resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.2.tgz", - "integrity": "sha1-7HQy+UFcgsc1hLa3uMR+GwFiCcY=" - } - }, "dependencies": { + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -14299,8 +94,7 @@ "version": "3.5.2", "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz", "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", - "dev": true, - "requires": {} + "dev": true }, "align-text": { "version": "0.1.4", @@ -14360,6 +154,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -15493,34 +1288,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "requires": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -16579,6 +2346,11 @@ "source-map": "^0.6.1" } }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", @@ -18425,6 +4197,27 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "requires": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "dependencies": { + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -18892,8 +4685,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "iferr": { "version": "0.1.5", @@ -19367,6 +5159,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -19419,13 +5216,10 @@ "invert-kv": "^1.0.0" } }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "requires": { - "uc.micro": "^1.0.1" - } + "lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "load-json-file": { "version": "2.0.0", @@ -19604,24 +5398,10 @@ "object-visit": "^1.0.0" } }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } + "mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "math-expression-evaluator": { "version": "1.3.8", @@ -19646,11 +5426,6 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", @@ -19976,8 +5751,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "mississippi": { "version": "2.0.0", @@ -20372,6 +6146,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "requires": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -20589,6 +6384,11 @@ "safe-buffer": "^5.1.1" } }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -20668,6 +6468,15 @@ "pify": "^3.0.0" } }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, "pbkdf2": { "version": "3.1.1", "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz", @@ -23119,6 +8928,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -23230,6 +9044,16 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -23267,6 +9091,14 @@ "unpipe": "1.0.0" } }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/read-cache/download/read-cache-1.0.0.tgz", @@ -23648,6 +9480,14 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -23719,6 +9559,11 @@ "aproba": "^1.1.1" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", @@ -24097,6 +9942,14 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -24124,6 +9977,16 @@ } } }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -24133,6 +9996,15 @@ "is-plain-obj": "^1.0.0" } }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", @@ -24296,7 +10168,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "5.3.0", @@ -24391,15 +10264,6 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", @@ -24447,6 +10311,15 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1596697387823&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", @@ -24703,11 +10576,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", @@ -25034,10 +10902,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -25072,18 +10939,6 @@ "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" }, - "vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "requires": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - } - }, "vue-clipboard2": { "version": "0.3.1", "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz", @@ -25421,6 +11276,16 @@ "minimalistic-assert": "^1.0.0" } }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" + }, "webpack": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", @@ -26091,6 +11956,11 @@ "safe-buffer": "~5.1.0" } }, + "xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", diff --git a/web_src/package.json b/web_src/package.json index 20fc3a2b..1e7f0432 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -16,9 +16,10 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", diff --git a/web_src/src/App.vue b/web_src/src/App.vue index e1145454..3590f737 100644 --- a/web_src/src/App.vue +++ b/web_src/src/App.vue @@ -81,4 +81,24 @@ body, text-align: center; padding-top: 0px !important; } + +/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +/*定义滚动条轨道 内阴影+圆角*/ +::-webkit-scrollbar-track { + border-radius: 4px; + background-color: #F5F5F5; +} + +/*定义滑块 内阴影+圆角*/ +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: #c8c8c8; + box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); +} diff --git a/web_src/src/api/deviceApi.js b/web_src/src/api/deviceApi.js deleted file mode 100644 index 830164f4..00000000 --- a/web_src/src/api/deviceApi.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; - -export const tree = (deviceId) => { - return axios({ - url: `/api/device/query/${deviceId}/tree`, - method: 'get' - }) -} - -export const deviceList = (page, count) => { - return axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page, - count - } - }) -} \ No newline at end of file diff --git a/web_src/src/components/CloudRecord.vue b/web_src/src/components/CloudRecord.vue index 78f8a46e..1d0819b0 100644 --- a/web_src/src/components/CloudRecord.vue +++ b/web_src/src/components/CloudRecord.vue @@ -1,67 +1,57 @@ diff --git a/web_src/src/components/MediaServerManger.vue b/web_src/src/components/MediaServerManger.vue index c412bcb9..2e3eeeff 100644 --- a/web_src/src/components/MediaServerManger.vue +++ b/web_src/src/components/MediaServerManger.vue @@ -1,45 +1,38 @@ diff --git a/web_src/src/components/StreamProxyList.vue b/web_src/src/components/StreamProxyList.vue index 9ecb9330..d5533927 100644 --- a/web_src/src/components/StreamProxyList.vue +++ b/web_src/src/components/StreamProxyList.vue @@ -1,115 +1,108 @@ @@ -117,7 +110,7 @@ import streamProxyEdit from './dialog/StreamProxyEdit.vue' import onvifEdit from './dialog/onvifEdit.vue' import devicePlayer from './dialog/devicePlayer.vue' - import uiHeader from './UiHeader.vue' + import uiHeader from '../layout/UiHeader.vue' export default { name: 'streamProxyList', components: { diff --git a/web_src/src/components/UiHeader.vue b/web_src/src/components/UiHeader.vue deleted file mode 100644 index 828dda97..00000000 --- a/web_src/src/components/UiHeader.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue index 6eae383d..7e0637c4 100644 --- a/web_src/src/components/channelList.vue +++ b/web_src/src/components/channelList.vue @@ -1,393 +1,405 @@ diff --git a/web_src/src/components/channelTree.vue b/web_src/src/components/channelTree.vue deleted file mode 100644 index ae9eac7b..00000000 --- a/web_src/src/components/channelTree.vue +++ /dev/null @@ -1,70 +0,0 @@ - - \ No newline at end of file diff --git a/web_src/src/components/channelTreeItem.vue b/web_src/src/components/channelTreeItem.vue deleted file mode 100644 index 7f2a2a59..00000000 --- a/web_src/src/components/channelTreeItem.vue +++ /dev/null @@ -1,74 +0,0 @@ - - diff --git a/web_src/src/components/common/DeviceTree.vue b/web_src/src/components/common/DeviceTree.vue new file mode 100644 index 00000000..066c344c --- /dev/null +++ b/web_src/src/components/common/DeviceTree.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/web_src/src/components/common/MapComponent.vue b/web_src/src/components/common/MapComponent.vue new file mode 100644 index 00000000..2d8600d1 --- /dev/null +++ b/web_src/src/components/common/MapComponent.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/web_src/src/components/common/jessibuca.vue b/web_src/src/components/common/jessibuca.vue new file mode 100644 index 00000000..2eda2dc8 --- /dev/null +++ b/web_src/src/components/common/jessibuca.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/web_src/src/components/control.vue b/web_src/src/components/control.vue index 36515932..a0b2834f 100644 --- a/web_src/src/components/control.vue +++ b/web_src/src/components/control.vue @@ -1,584 +1,702 @@ diff --git a/web_src/src/components/devicePosition.vue b/web_src/src/components/devicePosition.vue index 777b11ed..16675c90 100644 --- a/web_src/src/components/devicePosition.vue +++ b/web_src/src/components/devicePosition.vue @@ -1,391 +1,364 @@ diff --git a/web_src/src/components/dialog/StreamProxyEdit.vue b/web_src/src/components/dialog/StreamProxyEdit.vue index dea93ded..77ee1d88 100644 --- a/web_src/src/components/dialog/StreamProxyEdit.vue +++ b/web_src/src/components/dialog/StreamProxyEdit.vue @@ -131,6 +131,22 @@ export default { computed: {}, created() {}, data() { + // var deviceGBIdRules = async (rule, value, callback) => { + // console.log(value); + // if (value === "") { + // callback(new Error("请输入设备国标编号")); + // } else { + // var exit = await this.deviceGBIdExit(value); + // console.log(exit); + // console.log(exit == "true"); + // console.log(exit === "true"); + // if (exit) { + // callback(new Error("设备国标编号已存在")); + // } else { + // callback(); + // } + // } + // }; return { listChangeCallback: null, showDialog: false, @@ -169,7 +185,6 @@ export default { timeout_ms: [{ required: true, message: "请输入FFmpeg推流成功超时时间", trigger: "blur" }], ffmpeg_cmd_key: [{ required: false, message: "请输入FFmpeg命令参数模板(可选)", trigger: "blur" }], }, - isUpdate: false, }; }, methods: { @@ -177,7 +192,6 @@ export default { this.showDialog = true; this.listChangeCallback = callback; if (proxyParam != null) { - this.isUpdate=true this.proxyParam = proxyParam; } @@ -217,54 +231,28 @@ export default { onSubmit: function () { this.dialogLoading = true; var that = this; - if(this.isUpdate){ - that.$axios({ - method: 'post', - url:`/api/proxy/update`, - data: that.proxyParam - }).then(function (res) { - that.dialogLoading = false; - if (typeof (res.data.code) != "undefined" && res.data.code === 0) { - that.$message({ - showClose: true, - message: res.data.msg, - type: "success", - }); - that.showDialog = false; - if (that.listChangeCallback != null) { - that.listChangeCallback(); - that.dialogLoading = false; - } + that.$axios({ + method: 'post', + url:`/api/proxy/save`, + data: that.proxyParam + }).then(function (res) { + that.dialogLoading = false; + if (typeof (res.data.code) != "undefined" && res.data.code === 0) { + that.$message({ + showClose: true, + message: res.data.msg, + type: "success", + }); + that.showDialog = false; + if (that.listChangeCallback != null) { + that.listChangeCallback(); + that.dialogLoading = false; } - }).catch(function (error) { - console.log(error); - this.dialogLoading = false; - }); - }else{ - that.$axios({ - method: 'post', - url:`/api/proxy/save`, - data: that.proxyParam - }).then(function (res) { - that.dialogLoading = false; - if (typeof (res.data.code) != "undefined" && res.data.code === 0) { - that.$message({ - showClose: true, - message: res.data.msg, - type: "success", - }); - that.showDialog = false; - if (that.listChangeCallback != null) { - that.listChangeCallback(); - that.dialogLoading = false; - } - } - }).catch(function (error) { - console.log(error); - this.dialogLoading = false; - }); - } - + } + }).catch(function (error) { + console.log(error); + this.dialogLoading = false; + }); }, close: function () { this.showDialog = false; diff --git a/web_src/src/components/dialog/SyncChannelProgress.vue b/web_src/src/components/dialog/SyncChannelProgress.vue new file mode 100644 index 00000000..246f1ae7 --- /dev/null +++ b/web_src/src/components/dialog/SyncChannelProgress.vue @@ -0,0 +1,115 @@ + + + diff --git a/web_src/src/components/dialog/catalogEdit.vue b/web_src/src/components/dialog/catalogEdit.vue index 20b21684..13cabfb5 100644 --- a/web_src/src/components/dialog/catalogEdit.vue +++ b/web_src/src/components/dialog/catalogEdit.vue @@ -12,12 +12,22 @@ >
+ + + + + + + + + - + +
确认 @@ -52,13 +62,14 @@ export default { }, rules: { name: [{ required: true, message: "请输入名称", trigger: "blur" }], - id: [{ required: true, message: "请输入id", trigger: "blur" }] + id: [{ required: true, message: "请输入ID", trigger: "blur" }] }, }; }, methods: { openDialog: function (isEdit, id, name, parentId, callback) { console.log("parentId: " + parentId) + console.log(this.form) this.isEdit = isEdit; this.form.id = id; this.form.name = name; @@ -92,8 +103,14 @@ export default { }); }, close: function () { + this.isEdit = false; + this.form.id = null; + this.form.name = null; + this.form.platformId = null; + this.form.parentId = null; + this.callback = null; this.showDialog = false; - this.$refs.form.resetFields(); + console.log(this.form) }, }, }; diff --git a/web_src/src/components/dialog/channelMapInfobox.vue b/web_src/src/components/dialog/channelMapInfobox.vue new file mode 100644 index 00000000..2ef0e529 --- /dev/null +++ b/web_src/src/components/dialog/channelMapInfobox.vue @@ -0,0 +1,65 @@ + + + diff --git a/web_src/src/components/dialog/deviceEdit.vue b/web_src/src/components/dialog/deviceEdit.vue index 4f868511..b4dd2855 100644 --- a/web_src/src/components/dialog/deviceEdit.vue +++ b/web_src/src/components/dialog/deviceEdit.vue @@ -10,7 +10,7 @@ @close="close()" >
- + @@ -36,9 +36,18 @@ - + + + + + + + + + +
确认 @@ -92,6 +101,9 @@ export default { onSubmit: function () { console.log("onSubmit"); console.log(this.form); + this.form.subscribeCycleForCatalog = this.form.subscribeCycleForCatalog||0 + this.form.subscribeCycleForMobilePosition = this.form.subscribeCycleForMobilePosition||0 + this.form.mobilePositionSubmissionInterval = this.form.mobilePositionSubmissionInterval||0 this.$axios({ method: 'post', url:`/api/device/query/device/update/`, diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index 5a080060..f0b45125 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -3,7 +3,9 @@ - +
+ +
@@ -175,6 +177,7 @@
+
@@ -182,16 +185,16 @@ // import player from '../dialog/rtcPlayer.vue' // import LivePlayer from '@liveqing/liveplayer' // import player from '../dialog/easyPlayer.vue' -import player from '../dialog/jessibuca.vue' +import player from '../common/jessibuca.vue' +import recordDownload from '../dialog/recordDownload.vue' export default { name: 'devicePlayer', props: {}, components: { - player, + player,recordDownload, }, computed: { getPlayerShared: function () { - return { sharedUrl: window.location.origin + '/#/play/wasm/' + encodeURIComponent(this.videoUrl), sharedIframe: '', @@ -250,7 +253,7 @@ export default { that.tracks = []; that.tracksLoading = true; that.tracksNotLoaded = false; - if (tab.name == "codec") { + if (tab.name === "codec") { this.$axios({ method: 'get', url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtmp&app='+ this.app +'&stream='+ this.streamId @@ -340,7 +343,7 @@ export default { this.$refs.videoPlayer.pause() that.$axios({ method: 'post', - url: '/api/play/convert/' + that.streamId + url: '/api/gb_record/convert/' + that.streamId }).then(function (res) { if (res.data.code == 0) { that.convertKey = res.data.key; @@ -474,8 +477,8 @@ export default { console.log(this.seekTime) if (that.streamId != "") { that.stopPlayRecord(function () { - that.streamId = "", - that.playRecord(row); + that.streamId = ""; + that.playRecord(row); }) } else { this.$axios({ @@ -506,22 +509,36 @@ export default { downloadRecord: function (row) { let that = this; if (that.streamId != "") { - that.stopDownloadRecord(function () { - that.streamId = "", - that.downloadRecord(row); + that.stopDownloadRecord(function (res) { + if (res.code == 0) { + that.streamId = ""; + that.downloadRecord(row); + }else { + this.$message({ + showClose: true, + message: res.data.msg, + type: "error", + }); + } + }) } else { this.$axios({ method: 'get', - url: '/api/download/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + row.startTime + '&endTime=' + + url: '/api/gb_record/download/start/' + this.deviceId + '/' + this.channelId + '?startTime=' + row.startTime + '&endTime=' + row.endTime + '&downloadSpeed=4' }).then(function (res) { - var streamInfo = res.data; - that.app = streamInfo.app; - that.streamId = streamInfo.stream; - that.mediaServerId = streamInfo.mediaServerId; - that.videoUrl = that.getUrlByStreamInfo(streamInfo); - that.recordPlay = true; + if (res.data.code == 0) { + let streamInfo = res.data.data; + that.recordPlay = false; + that.$refs.recordDownload.openDialog(that.deviceId, that.channelId, streamInfo.app, streamInfo.stream, streamInfo.mediaServerId); + }else { + that.$message({ + showClose: true, + message: res.data.msg, + type: "error", + }); + } }); } }, @@ -530,9 +547,9 @@ export default { this.videoUrl = ''; this.$axios({ method: 'get', - url: '/api/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.streamId - }).then(function (res) { - if (callback) callback() + url: '/api/gb_record/download/stop/' + this.deviceId + "/" + this.channelId+ "/" + this.streamId + }).then((res)=> { + if (callback) callback(res) }); }, ptzCamera: function (command) { diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/dialog/jessibuca.vue deleted file mode 100644 index c073719d..00000000 --- a/web_src/src/components/dialog/jessibuca.vue +++ /dev/null @@ -1,298 +0,0 @@ - - - - - diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue index 38a2aef7..0caec322 100644 --- a/web_src/src/components/dialog/platformEdit.vue +++ b/web_src/src/components/dialog/platformEdit.vue @@ -44,6 +44,9 @@ + + + @@ -63,6 +66,18 @@
+ + + + + + + + + {{ @@ -138,6 +154,9 @@ export default { transport: "UDP", characterSet: "GB2312", shareAllLiveStream: false, + startOfflinePush: false, + catalogGroup: 1, + administrativeDivision: null, }, rules: { name: [{ required: true, message: "请输入平台名称", trigger: "blur" }], @@ -175,6 +194,7 @@ export default { that.platform.devicePort = res.data.devicePort; that.platform.username = res.data.username; that.platform.password = res.data.password; + that.platform.administrativeDivision = res.data.username.substr(0, 6); }).catch(function (error) { console.log(error); }); @@ -199,6 +219,9 @@ export default { this.platform.characterSet = platform.characterSet; this.platform.shareAllLiveStream = platform.shareAllLiveStream; this.platform.catalogId = platform.catalogId; + this.platform.startOfflinePush = platform.startOfflinePush; + this.platform.catalogGroup = platform.catalogGroup; + this.platform.administrativeDivision = platform.administrativeDivision; this.onSubmit_text = "保存"; this.saveUrl = "/api/platform/save"; } @@ -213,6 +236,10 @@ export default { deviceGBIdChange: function () { this.platform.username = this.platform.deviceGBId ; + if (this.platform.administrativeDivision == null) { + this.platform.administrativeDivision = this.platform.deviceGBId.substr(0, 6); + } + }, onSubmit: function () { var that = this; @@ -253,6 +280,7 @@ export default { rtcp: false, name: null, serverGBId: null, + administrativeDivision: null, serverGBDomain: null, serverIP: null, serverPort: null, @@ -266,6 +294,8 @@ export default { transport: "UDP", characterSet: "GB2312", shareAllLiveStream: false, + startOfflinePush: false, + catalogGroup: 1, } }, deviceGBIdExit: async function (deviceGbId) { diff --git a/web_src/src/components/dialog/queryTrace.vue b/web_src/src/components/dialog/queryTrace.vue new file mode 100644 index 00000000..bb127653 --- /dev/null +++ b/web_src/src/components/dialog/queryTrace.vue @@ -0,0 +1,100 @@ + + + diff --git a/web_src/src/components/dialog/recordDownload.vue b/web_src/src/components/dialog/recordDownload.vue new file mode 100644 index 00000000..6b7ca1f6 --- /dev/null +++ b/web_src/src/components/dialog/recordDownload.vue @@ -0,0 +1,195 @@ + + + + + + diff --git a/web_src/src/components/jessibuca.vue b/web_src/src/components/jessibuca.vue deleted file mode 100644 index b66a9c6f..00000000 --- a/web_src/src/components/jessibuca.vue +++ /dev/null @@ -1,317 +0,0 @@ - - - - - diff --git a/web_src/src/components/live.vue b/web_src/src/components/live.vue index beab9e45..797be84a 100644 --- a/web_src/src/components/live.vue +++ b/web_src/src/components/live.vue @@ -1,357 +1,304 @@ diff --git a/web_src/src/components/service/DeviceService.js b/web_src/src/components/service/DeviceService.js new file mode 100644 index 00000000..dbe10d18 --- /dev/null +++ b/web_src/src/components/service/DeviceService.js @@ -0,0 +1,124 @@ +import axios from 'axios'; + +class DeviceService{ + + constructor() { + this.$axios = axios; + } + + getDeviceList(currentPage, count, callback, errorCallback){ + this.$axios({ + method: 'get', + url:`/api/device/query/devices`, + params: { + page: currentPage, + count: count + } + }).then((res) => { + if (typeof (callback) == "function") callback(res.data) + }).catch((error) => { + console.log(error); + if (typeof (errorCallback) == "function") errorCallback(error) + }); + } + getAllDeviceList(callback, errorCallback) { + let currentPage = 1; + let count = 100; + let deviceList = [] + this.getAllDeviceListIteration(deviceList, currentPage, count, (data) => { + if (typeof (callback) == "function") callback(data) + }, errorCallback) + } + + getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) { + this.getDeviceList(currentPage, count, (data) => { + if (data.list) { + deviceList = deviceList.concat(data.list); + if (deviceList.length < data.total) { + currentPage ++ + this.getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(deviceList) + } + } + }, errorCallback) + } + + + getAllChannel(isCatalog, catalogUnderDevice, deviceId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllChannelIteration(isCatalog, catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllChannelIteration(isCatalog, catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, errorCallback) { + this.getChanel(isCatalog, catalogUnderDevice, deviceId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllChannelIteration(isCatalog,catalogUnderDevice, deviceId, catalogList, currentPage, count, callback, errorCallback) + }else { + console.log(1) + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getChanel(isCatalog, catalogUnderDevice, deviceId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/devices/${deviceId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog, + catalogUnderDevice: catalogUnderDevice + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } + + + getAllSubChannel(isCatalog, deviceId, channelId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { + this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } +} + +export default DeviceService; diff --git a/web_src/src/components/service/MediaServer.js b/web_src/src/components/service/MediaServer.js index 36474ead..d4446f06 100644 --- a/web_src/src/components/service/MediaServer.js +++ b/web_src/src/components/service/MediaServer.js @@ -10,9 +10,9 @@ class MediaServer{ this.$axios({ method: 'get', url:`/api/server/media_server/online/list`, - }).then(function (res) { + }).then((res) => { if (typeof (callback) == "function") callback(res.data) - }).catch(function (error) { + }).catch((error) => { console.log(error); }); } diff --git a/web_src/src/components/setting/Media.vue b/web_src/src/components/setting/Media.vue index cfc4e12a..19465b96 100644 --- a/web_src/src/components/setting/Media.vue +++ b/web_src/src/components/setting/Media.vue @@ -1,85 +1,78 @@ - - diff --git a/web_src/src/components/test2.vue b/web_src/src/components/test2.vue deleted file mode 100644 index 75f182eb..00000000 --- a/web_src/src/components/test2.vue +++ /dev/null @@ -1,190 +0,0 @@ - - - - - diff --git a/web_src/src/layout/UiHeader.vue b/web_src/src/layout/UiHeader.vue new file mode 100644 index 00000000..a0a252c2 --- /dev/null +++ b/web_src/src/layout/UiHeader.vue @@ -0,0 +1,151 @@ + + + + diff --git a/web_src/src/layout/index.vue b/web_src/src/layout/index.vue new file mode 100644 index 00000000..dccf6627 --- /dev/null +++ b/web_src/src/layout/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js index ad573cfa..88448621 100644 --- a/web_src/src/router/index.js +++ b/web_src/src/router/index.js @@ -1,5 +1,6 @@ import Vue from 'vue' import VueRouter from 'vue-router' +import Layout from "../layout/index.vue" import control from '../components/control.vue' import deviceList from '../components/DeviceList.vue' @@ -11,13 +12,13 @@ import login from '../components/Login.vue' import parentPlatformList from '../components/ParentPlatformList.vue' import cloudRecord from '../components/CloudRecord.vue' import mediaServerManger from '../components/MediaServerManger.vue' -import test from '../components/test.vue' import web from '../components/setting/Web.vue' import sip from '../components/setting/Sip.vue' import media from '../components/setting/Media.vue' import live from '../components/live.vue' +import deviceTree from '../components/common/DeviceTree.vue' -import wasmPlayer from '../components/dialog/jessibuca.vue' +import wasmPlayer from '../components/common/jessibuca.vue' import rtcPlayer from '../components/dialog/rtcPlayer.vue' const originalPush = VueRouter.prototype.push @@ -33,73 +34,86 @@ export default new VueRouter({ routes: [ { path: '/', - component: control, - }, - { - path: '/live', - component: live, - }, - { - path: '/deviceList', - component: deviceList, - }, - { - path: '/pushVideoList', - component: pushVideoList, - }, - { - path: '/streamProxyList', - component: streamProxyList, + name: 'home', + component: Layout, + redirect: '/control', + children: [ + { + path: '/control', + component: control, + }, + { + path: '/live', + component: live, + }, + { + path: '/deviceList', + component: deviceList, + }, + { + path: '/pushVideoList', + component: pushVideoList, + }, + { + path: '/streamProxyList', + component: streamProxyList, + }, + { + path: '/channelList/:deviceId/:parentChannelId/:count/:page', + name: 'channelList', + component: channelList, + }, + { + path: '/parentPlatformList/:count/:page', + name: 'parentPlatformList', + component: parentPlatformList, + }, + { + path: '/devicePosition/:deviceId/:parentChannelId/:count/:page', + name: 'devicePosition', + component: devicePosition, + }, + { + path: '/cloudRecord', + name: 'cloudRecord', + component: cloudRecord, + }, + { + path: '/mediaServerManger', + name: 'mediaServerManger', + component: mediaServerManger, + }, + { + path: '/setting/web', + name: 'web', + component: web, + }, + { + path: '/setting/sip', + name: 'sip', + component: sip, + }, + { + path: '/setting/media', + name: 'media', + component: media, + }, + { + path: '/map', + name: 'devicePosition', + component: devicePosition, + }, + ] }, { path: '/login', name: '登录', component: login, }, - { - path: '/channelList/:deviceId/:parentChannelId/:count/:page', - name: 'channelList', - component: channelList, - }, - { - path: '/parentPlatformList/:count/:page', - name: 'parentPlatformList', - component: parentPlatformList, - }, - { - path: '/devicePosition/:deviceId/:parentChannelId/:count/:page', - name: 'devicePosition', - component: devicePosition, - }, - { - path: '/cloudRecord', - name: 'cloudRecord', - component: cloudRecord, - }, - { - path: '/mediaServerManger', - name: 'mediaServerManger', - component: mediaServerManger, - }, - { - path: '/setting/web', - name: 'web', - component: web, - }, - { - path: '/setting/sip', - name: 'sip', - component: sip, - }, - { - path: '/setting/media', - name: 'media', - component: media, - }, { path: '/test', - name: 'test', - component: test, + name: 'deviceTree', + component: deviceTree, }, { path: '/play/wasm/:url', diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css index 06982714..2a08b07f 100644 --- a/web_src/static/css/iconfont.css +++ b/web_src/static/css/iconfont.css @@ -1,8 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 1291092 */ - src: url('iconfont.woff2?t=1647245982270') format('woff2'), - url('iconfont.woff?t=1647245982270') format('woff'), - url('iconfont.ttf?t=1647245982270') format('truetype'); + src: url('iconfont.woff2?t=1650436696596') format('woff2'); } .iconfont { @@ -13,6 +11,50 @@ -moz-osx-font-smoothing: grayscale; } +.icon-jiedianleizhukongzhongxin1:before { + content: "\e9d0"; +} + +.icon-jiedianleizhukongzhongxin2:before { + content: "\e9d1"; +} + +.icon-jiedianleilianjipingtai:before { + content: "\e9d3"; +} + +.icon-jiedianleiquyu:before { + content: "\e9d4"; +} + +.icon-shebeileigis:before { + content: "\e9ec"; +} + +.icon-shebeileibanqiu:before { + content: "\e9f5"; +} + +.icon-shebeileibanqiugis:before { + content: "\e9f6"; +} + +.icon-shebeileijiankongdian:before { + content: "\ea07"; +} + +.icon-shebeileiqiangjitongdao:before { + content: "\ea15"; +} + +.icon-shebeileiqiuji:before { + content: "\ea17"; +} + +.icon-shebeileiqiujigis:before { + content: "\ea18"; +} + .icon-xitongxinxi:before { content: "\e7d6"; } diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2 index 4833708c2fabdba21bdd9160985cb62f719918cd..7204137aaf543d0e818cfe56aaed1056f957ea87 100644 GIT binary patch literal 54140 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 literal 52504 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 J!EJW*?*KW9L_q)m diff --git a/web_src/static/images/arrow.png b/web_src/static/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8df4625dcd3e544b283e99326e88ef8f86298f GIT binary patch literal 5053 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 VNVBF(leF0l(9ty1C{wcw{U1y96~zDm literal 0 HcmV?d00001 diff --git a/web_src/static/images/gis/camera.png b/web_src/static/images/gis/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..a93bd5517a51582e9344793b5295273762bc14e6 GIT binary patch literal 10315 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 literal 0 HcmV?d00001 diff --git a/web_src/static/images/gis/camera1-offline.png b/web_src/static/images/gis/camera1-offline.png new file mode 100644 index 0000000000000000000000000000000000000000..597209bf125df3ded88afc22254f51c79df0e924 GIT binary patch literal 10463 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 Js--M~{trf|4QK!W literal 0 HcmV?d00001 diff --git a/web_src/static/images/gis/camera3-offline.png b/web_src/static/images/gis/camera3-offline.png new file mode 100644 index 0000000000000000000000000000000000000000..f05c2a3411010e8aab4703f577fbeb31cbda7737 GIT binary patch literal 10460 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

XJU&wz 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 literal 0 HcmV?d00001 diff --git a/web_src/static/images/gis/camera3.png b/web_src/static/images/gis/camera3.png new file mode 100644 index 0000000000000000000000000000000000000000..b40f67be08ec496ab909351d3f50a0cb2cf58198 GIT binary patch literal 13009 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.argv[1].replace(/\\/g,"/")),process.argv.slice(2),e.exports=t,process.on("uncaughtException",(function(e){if(!(e instanceof Zr))throw e})),process.on("unhandledRejection",ee),t.inspect=function(){return"[Emscripten Module object]"}):(p||h)&&(h?v=self.location.href:"undefined"!=typeof document&&document.currentScript&&(v=document.currentScript.src),v=0!==v.indexOf("blob:")?v.substr(0,v.lastIndexOf("/")+1):"",s=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},h&&(c=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),u=function(e,r,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?r(n.response):t()},n.onerror=t,n.send(null)});var y,g,w=t.print||console.log.bind(console),E=t.printErr||console.warn.bind(console);for(r in n)n.hasOwnProperty(r)&&(t[r]=n[r]);function b(e){b.shown||(b.shown={}),b.shown[e]||(b.shown[e]=1,E(e))}n=null,t.arguments,t.thisProgram&&(d=t.thisProgram),t.quit,t.wasmBinary&&(y=t.wasmBinary),t.noExitRuntime,"object"!=typeof WebAssembly&&ee("no native wasm support detected");var _=!1;function k(e,r){e||ee("Assertion failed: "+r)}var T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function P(e,r,t){for(var n=r+t,o=r;e[o]&&!(o>=n);)++o;if(o-r>16&&e.subarray&&T)return T.decode(e.subarray(r,o));for(var i="";r>10,56320|1023&c)}}else i+=String.fromCharCode((31&a)<<6|s)}else i+=String.fromCharCode(a)}return i}function C(e,r){return e?P($,e,r):""}function A(e,r,t,n){if(!(n>0))return 0;for(var o=t,i=t+n-1,a=0;a=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a);if(s<=127){if(t>=i)break;r[t++]=s}else if(s<=2047){if(t+1>=i)break;r[t++]=192|s>>6,r[t++]=128|63&s}else if(s<=65535){if(t+2>=i)break;r[t++]=224|s>>12,r[t++]=128|s>>6&63,r[t++]=128|63&s}else{if(t+3>=i)break;r[t++]=240|s>>18,r[t++]=128|s>>12&63,r[t++]=128|s>>6&63,r[t++]=128|63&s}}return r[t]=0,t-o}function D(e,r,t){return A(e,$,r,t)}function S(e){for(var r=0,t=0;t=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++t)),n<=127?++r:r+=n<=2047?2:n<=65535?3:4}return r}var F,x,$,R,M,O,I,j,U,N,B="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function L(e,r){for(var t=e,n=t>>1,o=n+r/2;!(n>=o)&&M[n];)++n;if((t=n<<1)-e>32&&B)return B.decode($.subarray(e,t));for(var i="",a=0;!(a>=r/2);++a){var s=R[e+2*a>>1];if(0==s)break;i+=String.fromCharCode(s)}return i}function W(e,r,t){if(void 0===t&&(t=2147483647),t<2)return 0;for(var n=r,o=(t-=2)<2*e.length?t/2:e.length,i=0;i>1]=a,r+=2}return R[r>>1]=0,r-n}function z(e){return 2*e.length}function H(e,r){for(var t=0,n="";!(t>=r/4);){var o=O[e+4*t>>2];if(0==o)break;if(++t,o>=65536){var i=o-65536;n+=String.fromCharCode(55296|i>>10,56320|1023&i)}else n+=String.fromCharCode(o)}return n}function V(e,r,t){if(void 0===t&&(t=2147483647),t<4)return 0;for(var n=r,o=n+t-4,i=0;i=55296&&a<=57343)a=65536+((1023&a)<<10)|1023&e.charCodeAt(++i);if(O[r>>2]=a,(r+=4)+4>o)break}return O[r>>2]=0,r-n}function X(e){for(var r=0,t=0;t=55296&&n<=57343&&++t,r+=4}return r}t.INITIAL_MEMORY;var G=[],q=[],Y=[];var K=0,J=null;function Q(e){K++,t.monitorRunDependencies&&t.monitorRunDependencies(K)}function Z(e){if(K--,t.monitorRunDependencies&&t.monitorRunDependencies(K),0==K&&J){var r=J;J=null,r()}}function ee(e){throw t.onAbort&&t.onAbort(e),E(e+=""),_=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(e)}t.preloadedImages={},t.preloadedAudios={};var re,te,ne;function oe(e){return e.startsWith("data:application/octet-stream;base64,")}function ie(e){return e.startsWith("file://")}function ae(e){try{if(e==re&&y)return new Uint8Array(y);if(c)return c(e);throw"both async and sync fetching of the wasm failed"}catch(e){ee(e)}}function se(e){for(;e.length>0;){var r=e.shift();if("function"!=typeof r){var n=r.func;"number"==typeof n?void 0===r.arg?N.get(n)():N.get(n)(r.arg):n(void 0===r.arg?null:r.arg)}else r(t)}}function ue(){var e=new Error;if(!e.stack){try{throw new Error}catch(r){e=r}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}oe(re="decoder.wasm")||(re=function(e){return t.locateFile?t.locateFile(e,v):v+e}(re));var ce={splitPath:function(e){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1)},normalizeArray:function(e,r){for(var t=0,n=e.length-1;n>=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),t++):t&&(e.splice(n,1),t--)}if(r)for(;t;t--)e.unshift("..");return e},normalize:function(e){var r="/"===e.charAt(0),t="/"===e.substr(-1);return(e=ce.normalizeArray(e.split("/").filter((function(e){return!!e})),!r).join("/"))||r||(e="."),e&&t&&(e+="/"),(r?"/":"")+e},dirname:function(e){var r=ce.splitPath(e),t=r[0],n=r[1];return t||n?(n&&(n=n.substr(0,n.length-1)),t+n):"."},basename:function(e){if("/"===e)return"/";var r=(e=(e=ce.normalize(e)).replace(/\/$/,"")).lastIndexOf("/");return-1===r?e:e.substr(r+1)},extname:function(e){return ce.splitPath(e)[3]},join:function(){var e=Array.prototype.slice.call(arguments,0);return ce.normalize(e.join("/"))},join2:function(e,r){return ce.normalize(e+"/"+r)}};var fe={resolve:function(){for(var e="",r=!1,t=arguments.length-1;t>=-1&&!r;t--){var n=t>=0?arguments[t]:he.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");if(!n)return"";e=n+"/"+e,r="/"===n.charAt(0)}return(r?"/":"")+(e=ce.normalizeArray(e.split("/").filter((function(e){return!!e})),!r).join("/"))||"."},relative:function(e,r){function t(e){for(var r=0;r=0&&""===e[t];t--);return r>t?[]:e.slice(r,t-r+1)}e=fe.resolve(e).substr(1),r=fe.resolve(r).substr(1);for(var n=t(e.split("/")),o=t(r.split("/")),i=Math.min(n.length,o.length),a=i,s=0;s0?t.slice(0,n).toString("utf-8"):null}else"undefined"!=typeof window&&"function"==typeof window.prompt?null!==(r=window.prompt("Input: "))&&(r+="\n"):"function"==typeof readline&&null!==(r=readline())&&(r+="\n");if(!r)return null;e.input=Hr(r,!0)}return e.input.shift()},put_char:function(e,r){null===r||10===r?(w(P(e.output,0)),e.output=[]):0!=r&&e.output.push(r)},flush:function(e){e.output&&e.output.length>0&&(w(P(e.output,0)),e.output=[])}},default_tty1_ops:{put_char:function(e,r){null===r||10===r?(E(P(e.output,0)),e.output=[]):0!=r&&e.output.push(r)},flush:function(e){e.output&&e.output.length>0&&(E(P(e.output,0)),e.output=[])}}};function de(e){e=function(e,r){return Math.ceil(e/r)*r}(e,65536);var r=Qr(65536,e);return r?(function(e,r){$.fill(0,e,e+r)}(r,e),r):0}var pe={ops_table:null,mount:function(e){return pe.createNode(null,"/",16895,0)},createNode:function(e,r,t,n){if(he.isBlkdev(t)||he.isFIFO(t))throw new he.ErrnoError(63);pe.ops_table||(pe.ops_table={dir:{node:{getattr:pe.node_ops.getattr,setattr:pe.node_ops.setattr,lookup:pe.node_ops.lookup,mknod:pe.node_ops.mknod,rename:pe.node_ops.rename,unlink:pe.node_ops.unlink,rmdir:pe.node_ops.rmdir,readdir:pe.node_ops.readdir,symlink:pe.node_ops.symlink},stream:{llseek:pe.stream_ops.llseek}},file:{node:{getattr:pe.node_ops.getattr,setattr:pe.node_ops.setattr},stream:{llseek:pe.stream_ops.llseek,read:pe.stream_ops.read,write:pe.stream_ops.write,allocate:pe.stream_ops.allocate,mmap:pe.stream_ops.mmap,msync:pe.stream_ops.msync}},link:{node:{getattr:pe.node_ops.getattr,setattr:pe.node_ops.setattr,readlink:pe.node_ops.readlink},stream:{}},chrdev:{node:{getattr:pe.node_ops.getattr,setattr:pe.node_ops.setattr},stream:he.chrdev_stream_ops}});var o=he.createNode(e,r,t,n);return he.isDir(o.mode)?(o.node_ops=pe.ops_table.dir.node,o.stream_ops=pe.ops_table.dir.stream,o.contents={}):he.isFile(o.mode)?(o.node_ops=pe.ops_table.file.node,o.stream_ops=pe.ops_table.file.stream,o.usedBytes=0,o.contents=null):he.isLink(o.mode)?(o.node_ops=pe.ops_table.link.node,o.stream_ops=pe.ops_table.link.stream):he.isChrdev(o.mode)&&(o.node_ops=pe.ops_table.chrdev.node,o.stream_ops=pe.ops_table.chrdev.stream),o.timestamp=Date.now(),e&&(e.contents[r]=o,e.timestamp=o.timestamp),o},getFileDataAsTypedArray:function(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage:function(e,r){var t=e.contents?e.contents.length:0;if(!(t>=r)){r=Math.max(r,t*(t<1048576?2:1.125)>>>0),0!=t&&(r=Math.max(r,256));var n=e.contents;e.contents=new Uint8Array(r),e.usedBytes>0&&e.contents.set(n.subarray(0,e.usedBytes),0)}},resizeFileStorage:function(e,r){if(e.usedBytes!=r)if(0==r)e.contents=null,e.usedBytes=0;else{var t=e.contents;e.contents=new Uint8Array(r),t&&e.contents.set(t.subarray(0,Math.min(r,e.usedBytes))),e.usedBytes=r}},node_ops:{getattr:function(e){var r={};return r.dev=he.isChrdev(e.mode)?e.id:1,r.ino=e.id,r.mode=e.mode,r.nlink=1,r.uid=0,r.gid=0,r.rdev=e.rdev,he.isDir(e.mode)?r.size=4096:he.isFile(e.mode)?r.size=e.usedBytes:he.isLink(e.mode)?r.size=e.link.length:r.size=0,r.atime=new Date(e.timestamp),r.mtime=new Date(e.timestamp),r.ctime=new Date(e.timestamp),r.blksize=4096,r.blocks=Math.ceil(r.size/r.blksize),r},setattr:function(e,r){void 0!==r.mode&&(e.mode=r.mode),void 0!==r.timestamp&&(e.timestamp=r.timestamp),void 0!==r.size&&pe.resizeFileStorage(e,r.size)},lookup:function(e,r){throw he.genericErrors[44]},mknod:function(e,r,t,n){return pe.createNode(e,r,t,n)},rename:function(e,r,t){if(he.isDir(e.mode)){var n;try{n=he.lookupNode(r,t)}catch(e){}if(n)for(var o in n.contents)throw new he.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=t,r.contents[t]=e,r.timestamp=e.parent.timestamp,e.parent=r},unlink:function(e,r){delete e.contents[r],e.timestamp=Date.now()},rmdir:function(e,r){var t=he.lookupNode(e,r);for(var n in t.contents)throw new he.ErrnoError(55);delete e.contents[r],e.timestamp=Date.now()},readdir:function(e){var r=[".",".."];for(var t in e.contents)e.contents.hasOwnProperty(t)&&r.push(t);return r},symlink:function(e,r,t){var n=pe.createNode(e,r,41471,0);return n.link=t,n},readlink:function(e){if(!he.isLink(e.mode))throw new he.ErrnoError(28);return e.link}},stream_ops:{read:function(e,r,t,n,o){var i=e.node.contents;if(o>=e.node.usedBytes)return 0;var a=Math.min(e.node.usedBytes-o,n);if(a>8&&i.subarray)r.set(i.subarray(o,o+a),t);else for(var s=0;s0||n+t8)throw new he.ErrnoError(32);for(var o=ce.normalizeArray(e.split("/").filter((function(e){return!!e})),!1),i=he.root,a="/",s=0;s40)throw new he.ErrnoError(32)}}return{path:a,node:i}},getPath:function(e){for(var r;;){if(he.isRoot(e)){var t=e.mount.mountpoint;return r?"/"!==t[t.length-1]?t+"/"+r:t+r:t}r=r?e.name+"/"+r:e.name,e=e.parent}},hashName:function(e,r){for(var t=0,n=0;n>>0)%he.nameTable.length},hashAddNode:function(e){var r=he.hashName(e.parent.id,e.name);e.name_next=he.nameTable[r],he.nameTable[r]=e},hashRemoveNode:function(e){var r=he.hashName(e.parent.id,e.name);if(he.nameTable[r]===e)he.nameTable[r]=e.name_next;else for(var t=he.nameTable[r];t;){if(t.name_next===e){t.name_next=e.name_next;break}t=t.name_next}},lookupNode:function(e,r){var t=he.mayLookup(e);if(t)throw new he.ErrnoError(t,e);for(var n=he.hashName(e.id,r),o=he.nameTable[n];o;o=o.name_next){var i=o.name;if(o.parent.id===e.id&&i===r)return o}return he.lookup(e,r)},createNode:function(e,r,t,n){var o=new he.FSNode(e,r,t,n);return he.hashAddNode(o),o},destroyNode:function(e){he.hashRemoveNode(e)},isRoot:function(e){return e===e.parent},isMountpoint:function(e){return!!e.mounted},isFile:function(e){return 32768==(61440&e)},isDir:function(e){return 16384==(61440&e)},isLink:function(e){return 40960==(61440&e)},isChrdev:function(e){return 8192==(61440&e)},isBlkdev:function(e){return 24576==(61440&e)},isFIFO:function(e){return 4096==(61440&e)},isSocket:function(e){return 49152==(49152&e)},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(e){var r=he.flagModes[e];if(void 0===r)throw new Error("Unknown file open mode: "+e);return r},flagsToPermissionString:function(e){var r=["r","w","rw"][3&e];return 512&e&&(r+="w"),r},nodePermissions:function(e,r){return he.ignorePermissions||(!r.includes("r")||292&e.mode)&&(!r.includes("w")||146&e.mode)&&(!r.includes("x")||73&e.mode)?0:2},mayLookup:function(e){var r=he.nodePermissions(e,"x");return r||(e.node_ops.lookup?0:2)},mayCreate:function(e,r){try{he.lookupNode(e,r);return 20}catch(e){}return he.nodePermissions(e,"wx")},mayDelete:function(e,r,t){var n;try{n=he.lookupNode(e,r)}catch(e){return e.errno}var o=he.nodePermissions(e,"wx");if(o)return o;if(t){if(!he.isDir(n.mode))return 54;if(he.isRoot(n)||he.getPath(n)===he.cwd())return 10}else if(he.isDir(n.mode))return 31;return 0},mayOpen:function(e,r){return e?he.isLink(e.mode)?32:he.isDir(e.mode)&&("r"!==he.flagsToPermissionString(r)||512&r)?31:he.nodePermissions(e,he.flagsToPermissionString(r)):44},MAX_OPEN_FDS:4096,nextfd:function(e,r){e=e||0,r=r||he.MAX_OPEN_FDS;for(var t=e;t<=r;t++)if(!he.streams[t])return t;throw new he.ErrnoError(33)},getStream:function(e){return he.streams[e]},createStream:function(e,r,t){he.FSStream||(he.FSStream=function(){},he.FSStream.prototype={object:{get:function(){return this.node},set:function(e){this.node=e}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var n=new he.FSStream;for(var o in e)n[o]=e[o];e=n;var i=he.nextfd(r,t);return e.fd=i,he.streams[i]=e,e},closeStream:function(e){he.streams[e]=null},chrdev_stream_ops:{open:function(e){var r=he.getDevice(e.node.rdev);e.stream_ops=r.stream_ops,e.stream_ops.open&&e.stream_ops.open(e)},llseek:function(){throw new he.ErrnoError(70)}},major:function(e){return e>>8},minor:function(e){return 255&e},makedev:function(e,r){return e<<8|r},registerDevice:function(e,r){he.devices[e]={stream_ops:r}},getDevice:function(e){return he.devices[e]},getMounts:function(e){for(var r=[],t=[e];t.length;){var n=t.pop();r.push(n),t.push.apply(t,n.mounts)}return r},syncfs:function(e,r){"function"==typeof e&&(r=e,e=!1),he.syncFSRequests++,he.syncFSRequests>1&&E("warning: "+he.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var t=he.getMounts(he.root.mount),n=0;function o(e){return he.syncFSRequests--,r(e)}function i(e){if(e)return i.errored?void 0:(i.errored=!0,o(e));++n>=t.length&&o(null)}t.forEach((function(r){if(!r.type.syncfs)return i(null);r.type.syncfs(r,e,i)}))},mount:function(e,r,t){var n,o="/"===t,i=!t;if(o&&he.root)throw new he.ErrnoError(10);if(!o&&!i){var a=he.lookupPath(t,{follow_mount:!1});if(t=a.path,n=a.node,he.isMountpoint(n))throw new he.ErrnoError(10);if(!he.isDir(n.mode))throw new he.ErrnoError(54)}var s={type:e,opts:r,mountpoint:t,mounts:[]},u=e.mount(s);return u.mount=s,s.root=u,o?he.root=u:n&&(n.mounted=s,n.mount&&n.mount.mounts.push(s)),u},unmount:function(e){var r=he.lookupPath(e,{follow_mount:!1});if(!he.isMountpoint(r.node))throw new he.ErrnoError(28);var t=r.node,n=t.mounted,o=he.getMounts(n);Object.keys(he.nameTable).forEach((function(e){for(var r=he.nameTable[e];r;){var t=r.name_next;o.includes(r.mount)&&he.destroyNode(r),r=t}})),t.mounted=null;var i=t.mount.mounts.indexOf(n);t.mount.mounts.splice(i,1)},lookup:function(e,r){return e.node_ops.lookup(e,r)},mknod:function(e,r,t){var n=he.lookupPath(e,{parent:!0}).node,o=ce.basename(e);if(!o||"."===o||".."===o)throw new he.ErrnoError(28);var i=he.mayCreate(n,o);if(i)throw new he.ErrnoError(i);if(!n.node_ops.mknod)throw new he.ErrnoError(63);return n.node_ops.mknod(n,o,r,t)},create:function(e,r){return r=void 0!==r?r:438,r&=4095,r|=32768,he.mknod(e,r,0)},mkdir:function(e,r){return r=void 0!==r?r:511,r&=1023,r|=16384,he.mknod(e,r,0)},mkdirTree:function(e,r){for(var t=e.split("/"),n="",o=0;othis.length-1||e<0)){var r=e%this.chunkSize,t=e/this.chunkSize|0;return this.getter(t)[r]}},i.prototype.setDataGetter=function(e){this.getter=e},i.prototype.cacheLength=function(){var e=new XMLHttpRequest;if(e.open("HEAD",t,!1),e.send(null),!(e.status>=200&&e.status<300||304===e.status))throw new Error("Couldn't load "+t+". Status: "+e.status);var r,n=Number(e.getResponseHeader("Content-length")),o=(r=e.getResponseHeader("Accept-Ranges"))&&"bytes"===r,i=(r=e.getResponseHeader("Content-Encoding"))&&"gzip"===r,a=1048576;o||(a=n);var s=this;s.setDataGetter((function(e){var r=e*a,o=(e+1)*a-1;if(o=Math.min(o,n-1),void 0===s.chunks[e]&&(s.chunks[e]=function(e,r){if(e>r)throw new Error("invalid range ("+e+", "+r+") or no bytes requested!");if(r>n-1)throw new Error("only "+n+" bytes available! programmer error!");var o=new XMLHttpRequest;if(o.open("GET",t,!1),n!==a&&o.setRequestHeader("Range","bytes="+e+"-"+r),"undefined"!=typeof Uint8Array&&(o.responseType="arraybuffer"),o.overrideMimeType&&o.overrideMimeType("text/plain; charset=x-user-defined"),o.send(null),!(o.status>=200&&o.status<300||304===o.status))throw new Error("Couldn't load "+t+". Status: "+o.status);return void 0!==o.response?new Uint8Array(o.response||[]):Hr(o.responseText||"",!0)}(r,o)),void 0===s.chunks[e])throw new Error("doXHR failed!");return s.chunks[e]})),!i&&n||(a=n=1,n=this.getter(0).length,a=n,w("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=n,this._chunkSize=a,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest){if(!h)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var a=new i;Object.defineProperties(a,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var s={isDevice:!1,contents:a}}else s={isDevice:!1,url:t};var u=he.createFile(e,r,s,n,o);s.contents?u.contents=s.contents:s.url&&(u.contents=null,u.url=s.url),Object.defineProperties(u,{usedBytes:{get:function(){return this.contents.length}}});var c={};return Object.keys(u.stream_ops).forEach((function(e){var r=u.stream_ops[e];c[e]=function(){return he.forceLoadFile(u),r.apply(null,arguments)}})),c.read=function(e,r,t,n,o){he.forceLoadFile(u);var i=e.node.contents;if(o>=i.length)return 0;var a=Math.min(i.length-o,n);if(i.slice)for(var s=0;s>2]=n.dev,O[t+4>>2]=0,O[t+8>>2]=n.ino,O[t+12>>2]=n.mode,O[t+16>>2]=n.nlink,O[t+20>>2]=n.uid,O[t+24>>2]=n.gid,O[t+28>>2]=n.rdev,O[t+32>>2]=0,ne=[n.size>>>0,(te=n.size,+Math.abs(te)>=1?te>0?(0|Math.min(+Math.floor(te/4294967296),4294967295))>>>0:~~+Math.ceil((te-+(~~te>>>0))/4294967296)>>>0:0)],O[t+40>>2]=ne[0],O[t+44>>2]=ne[1],O[t+48>>2]=4096,O[t+52>>2]=n.blocks,O[t+56>>2]=n.atime.getTime()/1e3|0,O[t+60>>2]=0,O[t+64>>2]=n.mtime.getTime()/1e3|0,O[t+68>>2]=0,O[t+72>>2]=n.ctime.getTime()/1e3|0,O[t+76>>2]=0,ne=[n.ino>>>0,(te=n.ino,+Math.abs(te)>=1?te>0?(0|Math.min(+Math.floor(te/4294967296),4294967295))>>>0:~~+Math.ceil((te-+(~~te>>>0))/4294967296)>>>0:0)],O[t+80>>2]=ne[0],O[t+84>>2]=ne[1],0},doMsync:function(e,r,t,n,o){var i=$.slice(e,e+t);he.msync(r,i,o,t,n)},doMkdir:function(e,r){return"/"===(e=ce.normalize(e))[e.length-1]&&(e=e.substr(0,e.length-1)),he.mkdir(e,r,0),0},doMknod:function(e,r,t){switch(61440&r){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return he.mknod(e,r,t),0},doReadlink:function(e,r,t){if(t<=0)return-28;var n=he.readlink(e),o=Math.min(t,S(n)),i=x[r+o];return D(n,r,t+1),x[r+o]=i,o},doAccess:function(e,r){if(-8&r)return-28;var t;if(!(t=he.lookupPath(e,{follow:!0}).node))return-44;var n="";return 4&r&&(n+="r"),2&r&&(n+="w"),1&r&&(n+="x"),n&&he.nodePermissions(t,n)?-2:0},doDup:function(e,r,t){var n=he.getStream(t);return n&&he.close(n),he.open(e,r,0,t,t).fd},doReadv:function(e,r,t,n){for(var o=0,i=0;i>2],s=O[r+(8*i+4)>>2],u=he.read(e,x,a,s,n);if(u<0)return-1;if(o+=u,u>2],s=O[r+(8*i+4)>>2],u=he.write(e,x,a,s,n);if(u<0)return-1;o+=u}return o},varargs:void 0,get:function(){return me.varargs+=4,O[me.varargs-4>>2]},getStr:function(e){return C(e)},getStreamFromFD:function(e){var r=he.getStream(e);if(!r)throw new he.ErrnoError(8);return r},get64:function(e,r){return e}};function ve(e){switch(e){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+e)}}var ye=void 0;function ge(e){for(var r="",t=e;$[t];)r+=ye[$[t++]];return r}var we={},Ee={},be={};function _e(e){if(void 0===e)return"_unknown";var r=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return r>=48&&r<=57?"_"+e:e}function ke(e,r){return e=_e(e),new Function("body","return function "+e+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(r)}function Te(e,r){var t=ke(r,(function(e){this.name=r,this.message=e;var t=new Error(e).stack;void 0!==t&&(this.stack=this.toString()+"\n"+t.replace(/^Error(:[^\n]*)?\n/,""))}));return t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},t}var Pe=void 0;function Ce(e){throw new Pe(e)}var Ae=void 0;function De(e){throw new Ae(e)}function Se(e,r,t){function n(r){var n=t(r);n.length!==e.length&&De("Mismatched type converter count");for(var o=0;o>2])}function Ze(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e}function er(e){this.rawDestructor&&this.rawDestructor(e)}function rr(e){null!==e&&e.delete()}function tr(e,r,t){if(r===t)return e;if(void 0===t.baseClass)return null;var n=tr(e,r,t.baseClass);return null===n?null:t.downcast(n)}function nr(){return Object.keys(ar).length}function or(){var e=[];for(var r in ar)ar.hasOwnProperty(r)&&e.push(ar[r]);return e}function ir(e){Be=e,Le.length&&Be&&Be(We)}var ar={};function sr(e,r){return r=function(e,r){for(void 0===r&&Ce("ptr should not be undefined");e.baseClass;)r=e.upcast(r),e=e.baseClass;return r}(e,r),ar[r]}function ur(e,r){return r.ptrType&&r.ptr||De("makeClassHandle requires ptr and ptrType"),!!r.smartPtrType!==!!r.smartPtr&&De("Both smartPtrType and smartPtr must be specified"),r.count={value:1},Ie(Object.create(e,{$$:{value:r}}))}function cr(e){var r=this.getPointee(e);if(!r)return this.destructor(e),null;var t=sr(this.registeredClass,r);if(void 0!==t){if(0===t.$$.count.value)return t.$$.ptr=r,t.$$.smartPtr=e,t.clone();var n=t.clone();return this.destructor(e),n}function o(){return this.isSmartPointer?ur(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:r,smartPtrType:this,smartPtr:e}):ur(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var i,a=this.registeredClass.getActualType(r),s=Ve[a];if(!s)return o.call(this);i=this.isConst?s.constPointerType:s.pointerType;var u=tr(r,this.registeredClass,i.registeredClass);return null===u?o.call(this):this.isSmartPointer?ur(i.registeredClass.instancePrototype,{ptrType:i,ptr:u,smartPtrType:this,smartPtr:e}):ur(i.registeredClass.instancePrototype,{ptrType:i,ptr:u})}function fr(e,r,t,n,o,i,a,s,u,c,f){this.name=e,this.registeredClass=r,this.isReference=t,this.isConst=n,this.isSmartPointer=o,this.pointeeType=i,this.sharingPolicy=a,this.rawGetPointee=s,this.rawConstructor=u,this.rawShare=c,this.rawDestructor=f,o||void 0!==r.baseClass?this.toWireType=Ke:n?(this.toWireType=Ye,this.destructorFunction=null):(this.toWireType=Je,this.destructorFunction=null)}function lr(e,r,n){return e.includes("j")?function(e,r,n){var o=t["dynCall_"+e];return n&&n.length?o.apply(null,[r].concat(n)):o.call(null,r)}(e,r,n):N.get(r).apply(null,n)}function dr(e,r){var t,n,o,i=(e=ge(e)).includes("j")?(t=e,n=r,o=[],function(){o.length=arguments.length;for(var e=0;e>2)+n]);return t}function yr(e){for(;e.length;){var r=e.pop();e.pop()(r)}}function gr(e,r){if(!(e instanceof Function))throw new TypeError("new_ called with constructor type "+typeof e+" which is not a function");var t=ke(e.name||"unknownFunctionName",(function(){}));t.prototype=e.prototype;var n=new t,o=e.apply(n,r);return o instanceof Object?o:n}function wr(e,r,t,n,o){var i=r.length;i<2&&Ce("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var a=null!==r[1]&&null!==t,s=!1,u=1;u0?", ":"")+l),d+=(c?"var rv = ":"")+"invoker(fn"+(l.length>0?", ":"")+l+");\n",s)d+="runDestructors(destructors);\n";else for(u=a?1:2;u4&&0==--_r[e].refcount&&(_r[e]=void 0,br.push(e))}function Tr(){for(var e=0,r=5;r<_r.length;++r)void 0!==_r[r]&&++e;return e}function Pr(){for(var e=5;e<_r.length;++e)if(void 0!==_r[e])return _r[e];return null}function Cr(e){switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var r=br.length?br.pop():_r.length;return _r[r]={refcount:1,value:e},r}}function Ar(e){if(null===e)return"null";var r=typeof e;return"object"===r||"array"===r||"function"===r?e.toString():""+e}function Dr(e,r){switch(r){case 2:return function(e){return this.fromWireType(j[e>>2])};case 3:return function(e){return this.fromWireType(U[e>>3])};default:throw new TypeError("Unknown float type: "+e)}}function Sr(e,r,t){switch(r){case 0:return t?function(e){return x[e]}:function(e){return $[e]};case 1:return t?function(e){return R[e>>1]}:function(e){return M[e>>1]};case 2:return t?function(e){return O[e>>2]}:function(e){return I[e>>2]};default:throw new TypeError("Unknown integer type: "+e)}}function Fr(e){return e||Ce("Cannot use deleted val. handle = "+e),_r[e].value}function xr(e,r){var t=Ee[e];return void 0===t&&Ce(r+" has unknown type "+hr(e)),t}var $r={};var Rr=[];function Mr(e,r){return(e>>>0)+4294967296*r}function Or(e,r){if(e<=0)return e;var t=r<=32?Math.abs(1<=t&&(r<=32||e>t)&&(e=-2*t+e),e}function Ir(e,r){return e>=0?e:r<=32?2*Math.abs(1<0?"\n":"")+function(e){var r=ue(),t=r.lastIndexOf("_emscripten_log"),n=r.lastIndexOf("_emscripten_get_callstack"),o=r.indexOf("\n",Math.max(t,n))+1;r=r.slice(o),32&e&&b("EM_LOG_DEMANGLE is deprecated; ignoring"),8&e&&"undefined"==typeof emscripten_source_map&&(b('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.'),e^=8,e|=16);var i=null;if(128&e)for(i=jr(arguments);i[1].includes("_emscripten_");)i=jr(i[0]);var a=r.split("\n");r="";var s=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)"),u=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?"),c=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var f in a){var l=a[f],d="",p="",h=0,m=0,v=c.exec(l);if(v&&5==v.length)d=v[1],p=v[2],h=v[3],m=v[4];else{if((v=s.exec(l))||(v=u.exec(l)),!(v&&v.length>=4)){r+=l+"\n";continue}d=v[1],p=v[2],h=v[3],m=0|v[4]}var y=!1;if(8&e){var g=emscripten_source_map.originalPositionFor({line:h,column:m});(y=g&&g.source)&&(64&e&&(g.source=g.source.substring(g.source.replace(/\\/g,"/").lastIndexOf("/")+1)),r+=" at "+d+" ("+g.source+":"+g.line+":"+g.column+")\n")}(16&e||!y)&&(64&e&&(p=p.substring(p.replace(/\\/g,"/").lastIndexOf("/")+1)),r+=(y?" = "+d:" at "+d)+" ("+p+":"+h+":"+m+")\n"),128&e&&i[0]&&(i[1]==d&&i[2].length>0&&(r=r.replace(/\s+$/,""),r+=" with values: "+i[1]+i[2]+"\n"),i=jr(i[0]))}return r.replace(/\s+$/,"")}(e)),1&e?4&e?E(r):2&e?console.warn(r):512&e?console.info(r):256&e?console.debug(r):w(r):6&e?E(r):w(r)}var Nr={};function Br(){if(!Br.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:d||"./this.program"};for(var r in Nr)void 0===Nr[r]?delete e[r]:e[r]=Nr[r];var t=[];for(var r in e)t.push(r+"="+e[r]);Br.strings=t}return Br.strings}var Lr=function(e,r,t,n){e||(e=this),this.parent=e,this.mount=e.mount,this.mounted=null,this.id=he.nextInode++,this.name=r,this.mode=t,this.node_ops={},this.stream_ops={},this.rdev=n},Wr=365,zr=146;function Hr(e,r,t){var n=t>0?t:S(e)+1,o=new Array(n),i=A(e,o,0,o.length);return r&&(o.length=i),o}Object.defineProperties(Lr.prototype,{read:{get:function(){return(this.mode&Wr)===Wr},set:function(e){e?this.mode|=Wr:this.mode&=-366}},write:{get:function(){return(this.mode&zr)===zr},set:function(e){e?this.mode|=zr:this.mode&=-147}},isFolder:{get:function(){return he.isDir(this.mode)}},isDevice:{get:function(){return he.isChrdev(this.mode)}}}),he.FSNode=Lr,he.staticInit(),function(){for(var e=new Array(256),r=0;r<256;++r)e[r]=String.fromCharCode(r);ye=e}(),Pe=t.BindingError=Te(Error,"BindingError"),Ae=t.InternalError=Te(Error,"InternalError"),He.prototype.isAliasOf=xe,He.prototype.clone=je,He.prototype.delete=Ue,He.prototype.isDeleted=Ne,He.prototype.deleteLater=ze,fr.prototype.getPointee=Ze,fr.prototype.destructor=er,fr.prototype.argPackAdvance=8,fr.prototype.readValueFromPointer=Qe,fr.prototype.deleteObject=rr,fr.prototype.fromWireType=cr,t.getInheritedInstanceCount=nr,t.getLiveInheritedInstances=or,t.flushPendingDeletes=We,t.setDelayFunction=ir,pr=t.UnboundTypeError=Te(Error,"UnboundTypeError"),t.count_emval_handles=Tr,t.get_first_emval=Pr;var Vr={y:function(e,r,t){me.varargs=t;try{var n=me.getStreamFromFD(e);switch(r){case 0:return(o=me.get())<0?-28:he.open(n.path,n.flags,0,o).fd;case 1:case 2:case 13:case 14:return 0;case 3:return n.flags;case 4:var o=me.get();return n.flags|=o,0;case 12:o=me.get();return R[o+0>>1]=2,0;case 16:case 8:default:return-28;case 9:return i=28,O[qr()>>2]=i,-1}}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),-e.errno}var i},x:function(e,r,t){me.varargs=t;try{var n=me.getStr(e),o=t?me.get():0;return he.open(n,r,o).fd}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),-e.errno}},s:function(e,r,t,n,o){},D:function(e,r,t,n,o){var i=ve(t);Fe(e,{name:r=ge(r),fromWireType:function(e){return!!e},toWireType:function(e,r){return r?n:o},argPackAdvance:8,readValueFromPointer:function(e){var n;if(1===t)n=x;else if(2===t)n=R;else{if(4!==t)throw new TypeError("Unknown boolean type size: "+r);n=O}return this.fromWireType(n[e>>i])},destructorFunction:null})},n:function(e,r,n,o,i,a,s,u,c,f,l,d,p){l=ge(l),a=dr(i,a),u&&(u=dr(s,u)),f&&(f=dr(c,f)),p=dr(d,p);var h=_e(l);!function(e,r,n){t.hasOwnProperty(e)?((void 0===n||void 0!==t[e].overloadTable&&void 0!==t[e].overloadTable[n])&&Ce("Cannot register public name '"+e+"' twice"),Xe(t,e,e),t.hasOwnProperty(n)&&Ce("Cannot register multiple overloads of a function with the same number of arguments ("+n+")!"),t[e].overloadTable[n]=r):(t[e]=r,void 0!==n&&(t[e].numArguments=n))}(h,(function(){mr("Cannot construct "+l+" due to unbound types",[o])})),Se([e,r,n],o?[o]:[],(function(r){var n,i;r=r[0],i=o?(n=r.registeredClass).instancePrototype:He.prototype;var s=ke(h,(function(){if(Object.getPrototypeOf(this)!==c)throw new Pe("Use 'new' to construct "+l);if(void 0===d.constructor_body)throw new Pe(l+" has no accessible constructor");var e=d.constructor_body[arguments.length];if(void 0===e)throw new Pe("Tried to invoke ctor of "+l+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(d.constructor_body).toString()+") parameters instead!");return e.apply(this,arguments)})),c=Object.create(i,{constructor:{value:s}});s.prototype=c;var d=new Ge(l,s,c,p,n,a,u,f),m=new fr(l,d,!0,!1,!1),v=new fr(l+"*",d,!1,!1,!1),y=new fr(l+" const*",d,!1,!0,!1);return Ve[e]={pointerType:v,constPointerType:y},function(e,r,n){t.hasOwnProperty(e)||De("Replacing nonexistant public symbol"),void 0!==t[e].overloadTable&&void 0!==n?t[e].overloadTable[n]=r:(t[e]=r,t[e].argCount=n)}(h,s),[m,v,y]}))},i:function(e,r,t,n,o,i){k(r>0);var a=vr(r,t);o=dr(n,o),Se([],[e],(function(e){var t="constructor "+(e=e[0]).name;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[r-1])throw new Pe("Cannot register multiple constructors with identical number of parameters ("+(r-1)+") for class '"+e.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return e.registeredClass.constructor_body[r-1]=function(){mr("Cannot construct "+e.name+" due to unbound types",a)},Se([],a,(function(n){return n.splice(1,0,null),e.registeredClass.constructor_body[r-1]=wr(t,n,null,o,i),[]})),[]}))},f:function(e,r,t,n,o,i,a,s){var u=vr(t,n);r=ge(r),i=dr(o,i),Se([],[e],(function(e){var n=(e=e[0]).name+"."+r;function o(){mr("Cannot call "+n+" due to unbound types",u)}r.startsWith("@@")&&(r=Symbol[r.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(r);var c=e.registeredClass.instancePrototype,f=c[r];return void 0===f||void 0===f.overloadTable&&f.className!==e.name&&f.argCount===t-2?(o.argCount=t-2,o.className=e.name,c[r]=o):(Xe(c,r,n),c[r].overloadTable[t-2]=o),Se([],u,(function(o){var s=wr(n,o,e,i,a);return void 0===c[r].overloadTable?(s.argCount=t-2,c[r]=s):c[r].overloadTable[t-2]=s,[]})),[]}))},I:function(e,r,t,n,o,i,a,s,u,c){r=ge(r),o=dr(n,o),Se([],[e],(function(e){var n=(e=e[0]).name+"."+r,f={get:function(){mr("Cannot access "+n+" due to unbound types",[t,a])},enumerable:!0,configurable:!0};return f.set=u?function(){mr("Cannot access "+n+" due to unbound types",[t,a])}:function(e){Ce(n+" is a read-only property")},Object.defineProperty(e.registeredClass.instancePrototype,r,f),Se([],u?[t,a]:[t],(function(t){var a=t[0],f={get:function(){var r=Er(this,e,n+" getter");return a.fromWireType(o(i,r))},enumerable:!0};if(u){u=dr(s,u);var l=t[1];f.set=function(r){var t=Er(this,e,n+" setter"),o=[];u(c,t,l.toWireType(o,r)),yr(o)}}return Object.defineProperty(e.registeredClass.instancePrototype,r,f),[]})),[]}))},C:function(e,r){Fe(e,{name:r=ge(r),fromWireType:function(e){var r=_r[e].value;return kr(e),r},toWireType:function(e,r){return Cr(r)},argPackAdvance:8,readValueFromPointer:Qe,destructorFunction:null})},l:function(e,r,t){var n=ve(t);Fe(e,{name:r=ge(r),fromWireType:function(e){return e},toWireType:function(e,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+Ar(r)+'" to '+this.name);return r},argPackAdvance:8,readValueFromPointer:Dr(r,n),destructorFunction:null})},c:function(e,r,t,n,o){r=ge(r),-1===o&&(o=4294967295);var i=ve(t),a=function(e){return e};if(0===n){var s=32-8*t;a=function(e){return e<>>s}}var u=r.includes("unsigned");Fe(e,{name:r,fromWireType:a,toWireType:function(e,t){if("number"!=typeof t&&"boolean"!=typeof t)throw new TypeError('Cannot convert "'+Ar(t)+'" to '+this.name);if(to)throw new TypeError('Passing a number "'+Ar(t)+'" from JS side to C/C++ side to an argument of type "'+r+'", which is outside the valid range ['+n+", "+o+"]!");return u?t>>>0:0|t},argPackAdvance:8,readValueFromPointer:Sr(r,i,0!==n),destructorFunction:null})},b:function(e,r,t){var n=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][r];function o(e){var r=I,t=r[e>>=2],o=r[e+1];return new n(F,o,t)}Fe(e,{name:t=ge(t),fromWireType:o,argPackAdvance:8,readValueFromPointer:o},{ignoreDuplicateRegistrations:!0})},m:function(e,r){var t="std::string"===(r=ge(r));Fe(e,{name:r,fromWireType:function(e){var r,n=I[e>>2];if(t)for(var o=e+4,i=0;i<=n;++i){var a=e+4+i;if(i==n||0==$[a]){var s=C(o,a-o);void 0===r?r=s:(r+=String.fromCharCode(0),r+=s),o=a+1}}else{var u=new Array(n);for(i=0;i>2]=o,t&&n)D(r,i+4,o+1);else if(n)for(var a=0;a255&&(Xr(i),Ce("String has UTF-16 code units that do not fit in 8 bits")),$[i+4+a]=s}else for(a=0;a>2],a=i(),u=e+4,c=0;c<=o;++c){var f=e+4+c*r;if(c==o||0==a[f>>s]){var l=n(u,f-u);void 0===t?t=l:(t+=String.fromCharCode(0),t+=l),u=f+r}}return Xr(e),t},toWireType:function(e,n){"string"!=typeof n&&Ce("Cannot pass non-string to C++ string type "+t);var i=a(n),u=Gr(4+i+r);return I[u>>2]=i>>s,o(n,u+4,i+r),null!==e&&e.push(Xr,u),u},argPackAdvance:8,readValueFromPointer:Qe,destructorFunction:function(e){Xr(e)}})},E:function(e,r){Fe(e,{isVoid:!0,name:r=ge(r),argPackAdvance:0,fromWireType:function(){},toWireType:function(e,r){}})},v:function(e,r,t){e=Fr(e),r=xr(r,"emval::as");var n=[],o=Cr(n);return O[t>>2]=o,r.toWireType(n,e)},e:function(e,r,t,n){var o,i;(e=Rr[e])(r=Fr(r),t=void 0===(i=$r[o=t])?ge(o):i,null,n)},p:kr,d:function(e,r){for(var t=function(e,r){for(var t=new Array(e),n=0;n>2)+n],"parameter "+n);return t}(e,r),n=t[0],o=n.name+"_$"+t.slice(1).map((function(e){return e.name})).join("_")+"$",i=["retType"],a=[n],s="",u=0;u4&&(_r[e].refcount+=1)},q:function(e){yr(_r[e].value),kr(e)},B:function(e,r){return Cr((e=xr(e,"_emval_take_value")).readValueFromPointer(r))},a:function(){ee()},G:function e(){return void 0===e.start&&(e.start=Date.now()),1e3*(Date.now()-e.start)|0},H:function(e,r,t){var n=function(e,r){var t=e,n=r;function o(e){var r;return n=function(e,r){return"double"!==r&&"i64"!==r||7&e&&(e+=4),e}(n,e),"double"===e?(r=U[n>>3],n+=8):"i64"==e?(r=[O[n>>2],O[n+4>>2]],n+=8):(e="i32",r=O[n>>2],n+=4),r}for(var i,a,s,u,c=[];;){var f=t;if(0===(i=x[t>>0]))break;if(a=x[t+1>>0],37==i){var l=!1,d=!1,p=!1,h=!1,m=!1;e:for(;;){switch(a){case 43:l=!0;break;case 45:d=!0;break;case 35:p=!0;break;case 48:if(h)break e;h=!0;break;case 32:m=!0;break;default:break e}t++,a=x[t+1>>0]}var v=0;if(42==a)v=o("i32"),t++,a=x[t+1>>0];else for(;a>=48&&a<=57;)v=10*v+(a-48),t++,a=x[t+1>>0];var y,g=!1,w=-1;if(46==a){if(w=0,g=!0,t++,42==(a=x[t+1>>0]))w=o("i32"),t++;else for(;;){var E=x[t+1>>0];if(E<48||E>57)break;w=10*w+(E-48),t++}a=x[t+1>>0]}switch(w<0&&(w=6,g=!1),String.fromCharCode(a)){case"h":104==x[t+2>>0]?(t++,y=1):y=2;break;case"l":108==x[t+2>>0]?(t++,y=8):y=4;break;case"L":case"q":case"j":y=8;break;case"z":case"t":case"I":y=4;break;default:y=null}switch(y&&t++,a=x[t+1>>0],String.fromCharCode(a)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":var b=100==a||105==a;s=o("i"+8*(y=y||4)),8==y&&(s=117==a?(s[0]>>>0)+4294967296*(s[1]>>>0):Mr(s[0],s[1])),y<=4&&(s=(b?Or:Ir)(s&Math.pow(256,y)-1,8*y));var _=Math.abs(s),k="";if(100==a||105==a)C=Or(s,8*y).toString(10);else if(117==a)C=Ir(s,8*y).toString(10),s=Math.abs(s);else if(111==a)C=(p?"0":"")+_.toString(8);else if(120==a||88==a){if(k=p&&0!=s?"0x":"",s<0){s=-s,C=(_-1).toString(16);for(var T=[],P=0;P=0&&(l?k="+"+k:m&&(k=" "+k)),"-"==C.charAt(0)&&(k="-"+k,C=C.substr(1));k.length+C.lengthS&&S>=-4?(a=(103==a?"f":"F").charCodeAt(0),w-=S+1):(a=(103==a?"e":"E").charCodeAt(0),w--),D=Math.min(w,20)}101==a||69==a?(C=s.toExponential(D),/[eE][-+]\d$/.test(C)&&(C=C.slice(0,-1)+"0"+C.slice(-1))):102!=a&&70!=a||(C=s.toFixed(D),0===s&&((u=s)<0||0===u&&1/u==-1/0)&&(C="-"+C));var F=C.split("e");if(A&&!p)for(;F[0].length>1&&F[0].includes(".")&&("0"==F[0].slice(-1)||"."==F[0].slice(-1));)F[0]=F[0].slice(0,-1);else for(p&&-1==C.indexOf(".")&&(F[0]+=".");w>D++;)F[0]+="0";C=F[0]+(F.length>1?"e"+F[1]:""),69==a&&(C=C.toUpperCase()),s>=0&&(l?C="+"+C:m&&(C=" "+C))}else C=(s<0?"-":"")+"inf",h=!1;for(;C.length>0]);else c=c.concat(Hr("(null)".substr(0,M),!0));if(d)for(;M0;)c.push(32);d||c.push(o("i8"));break;case"n":var I=o("i32*");O[I>>2]=c.length;break;case"%":c.push(i);break;default:for(P=f;P>0])}t+=2}else c.push(i),t+=1}return c}(r,t);Ur(e,P(n,0))},t:function(e){$.length,ee("OOM")},u:function(e,r){var t=0;return Br().forEach((function(n,o){var i=r+t;O[e+4*o>>2]=i,function(e,r,t){for(var n=0;n>0]=e.charCodeAt(n);t||(x[r>>0]=0)}(n,i),t+=n.length+1})),0},w:function(e,r){var t=Br();O[e>>2]=t.length;var n=0;return t.forEach((function(e){n+=e.length+1})),O[r>>2]=n,0},k:function(e){try{var r=me.getStreamFromFD(e);return he.close(r),0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),e.errno}},z:function(e,r){try{var t=me.getStreamFromFD(e),n=t.tty?2:he.isDir(t.mode)?3:he.isLink(t.mode)?7:4;return x[r>>0]=n,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),e.errno}},A:function(e,r,t,n){try{var o=me.getStreamFromFD(e),i=me.doReadv(o,r,t);return O[n>>2]=i,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),e.errno}},r:function(e,r,t,n,o){try{var i=me.getStreamFromFD(e),a=4294967296*t+(r>>>0),s=9007199254740992;return a<=-s||a>=s?-61:(he.llseek(i,a,n),ne=[i.position>>>0,(te=i.position,+Math.abs(te)>=1?te>0?(0|Math.min(+Math.floor(te/4294967296),4294967295))>>>0:~~+Math.ceil((te-+(~~te>>>0))/4294967296)>>>0:0)],O[o>>2]=ne[0],O[o+4>>2]=ne[1],i.getdents&&0===a&&0===n&&(i.getdents=null),0)}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),e.errno}},j:function(e,r,t,n){try{var o=me.getStreamFromFD(e),i=me.doWritev(o,r,t);return O[n>>2]=i,0}catch(e){return void 0!==he&&e instanceof he.ErrnoError||ee(e),e.errno}},F:function(e){var r=Date.now();return O[e>>2]=r/1e3|0,O[e+4>>2]=r%1e3*1e3|0,0},g:function(e){}};!function(){var e={a:Vr};function r(e,r){var n,o,i=e.exports;t.asm=i,g=t.asm.J,n=g.buffer,F=n,t.HEAP8=x=new Int8Array(n),t.HEAP16=R=new Int16Array(n),t.HEAP32=O=new Int32Array(n),t.HEAPU8=$=new Uint8Array(n),t.HEAPU16=M=new Uint16Array(n),t.HEAPU32=I=new Uint32Array(n),t.HEAPF32=j=new Float32Array(n),t.HEAPF64=U=new Float64Array(n),N=t.asm.N,o=t.asm.K,q.unshift(o),Z()}function n(e){r(e.instance)}function o(r){return function(){if(!y&&(p||h)){if("function"==typeof fetch&&!ie(re))return fetch(re,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+re+"'";return e.arrayBuffer()})).catch((function(){return ae(re)}));if(u)return new Promise((function(e,r){u(re,(function(r){e(new Uint8Array(r))}),r)}))}return Promise.resolve().then((function(){return ae(re)}))}().then((function(r){return WebAssembly.instantiate(r,e)})).then((function(e){return e})).then(r,(function(e){E("failed to asynchronously prepare wasm: "+e),ee(e)}))}if(Q(),t.instantiateWasm)try{return t.instantiateWasm(e,r)}catch(e){return E("Module.instantiateWasm callback failed with error: "+e),!1}y||"function"!=typeof WebAssembly.instantiateStreaming||oe(re)||ie(re)||"function"!=typeof fetch?o(n):fetch(re,{credentials:"same-origin"}).then((function(r){return WebAssembly.instantiateStreaming(r,e).then(n,(function(e){return E("wasm streaming compile failed: "+e),E("falling back to ArrayBuffer instantiation"),o(n)}))}))}(),t.___wasm_call_ctors=function(){return(t.___wasm_call_ctors=t.asm.K).apply(null,arguments)};var Xr=t._free=function(){return(Xr=t._free=t.asm.L).apply(null,arguments)},Gr=t._malloc=function(){return(Gr=t._malloc=t.asm.M).apply(null,arguments)},qr=t.___errno_location=function(){return(qr=t.___errno_location=t.asm.O).apply(null,arguments)},Yr=t._strlen=function(){return(Yr=t._strlen=t.asm.P).apply(null,arguments)},Kr=t.___getTypeName=function(){return(Kr=t.___getTypeName=t.asm.Q).apply(null,arguments)};t.___embind_register_native_and_builtin_types=function(){return(t.___embind_register_native_and_builtin_types=t.asm.R).apply(null,arguments)};var Jr,Qr=t._memalign=function(){return(Qr=t._memalign=t.asm.S).apply(null,arguments)};function Zr(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function et(e){function r(){Jr||(Jr=!0,t.calledRun=!0,_||(t.noFSInit||he.init.initialized||he.init(),he.ignorePermissions=!1,se(q),t.onRuntimeInitialized&&t.onRuntimeInitialized(),function(){if(t.postRun)for("function"==typeof t.postRun&&(t.postRun=[t.postRun]);t.postRun.length;)e=t.postRun.shift(),Y.unshift(e);var e;se(Y)}()))}K>0||(!function(){if(t.preRun)for("function"==typeof t.preRun&&(t.preRun=[t.preRun]);t.preRun.length;)e=t.preRun.shift(),G.unshift(e);var e;se(G)}(),K>0||(t.setStatus?(t.setStatus("Running..."),setTimeout((function(){setTimeout((function(){t.setStatus("")}),1),r()}),1)):r()))}if(t.dynCall_ijiii=function(){return(t.dynCall_ijiii=t.asm.T).apply(null,arguments)},t.dynCall_viiijj=function(){return(t.dynCall_viiijj=t.asm.U).apply(null,arguments)},t.dynCall_jij=function(){return(t.dynCall_jij=t.asm.V).apply(null,arguments)},t.dynCall_jii=function(){return(t.dynCall_jii=t.asm.W).apply(null,arguments)},t.dynCall_jiji=function(){return(t.dynCall_jiji=t.asm.X).apply(null,arguments)},t._ff_h264_cabac_tables=83749,J=function e(){Jr||et(),Jr||(J=e)},t.run=et,t.preInit)for("function"==typeof t.preInit&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();et(),e.exports=t}));const u=1e3,c=!1,f=!0,l=!1,d="initVideo",p="render",h="playAudio",m="print",v="printErr",y="initAudio",g="audioCode",w="videoCode",E=1,b=2,_="init",k="decode",T="audioDecode",P="videoDecode",C="close",A="key",D="delta";(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(e instanceof WebAssembly.Module)return new WebAssembly.Instance(e)instanceof WebAssembly.Instance}}catch(e){}})(),Date.now||(Date.now=function(){return(new Date).getTime()}),s.print=function(e){postMessage({cmd:m,text:e})},s.printErr=function(e){postMessage({cmd:v,text:e})},s.postRun=function(){var e=[],r=[],t={};"VideoEncoder"in self&&(t={hasInit:!1,isEmitInfo:!1,offscreenCanvas:null,offscreenCanvasCtx:null,decoder:new VideoDecoder({output:function(e){t.isEmitInfo||(n.opt.debug&&console.log("Jessibuca: [worker] Webcodecs Video Decoder initSize"),postMessage({cmd:d,w:e.codedWidth,h:e.codedHeight}),t.isEmitInfo=!0,t.offscreenCanvas=new OffscreenCanvas(e.codedWidth,e.codedHeight),t.offscreenCanvasCtx=t.offscreenCanvas.getContext("2d")),t.offscreenCanvasCtx.drawImage(e,0,0,e.codedWidth,e.codedHeight);let r=t.offscreenCanvas.transferToImageBitmap();postMessage({cmd:p,buffer:r,delay:n.delay,ts:0},[r]),setTimeout((function(){e.close?e.close():e.destroy()}),100)},error:function(e){console.error(e)}}),decode:function(e,r){const o=e[0]>>4==1;if(t.hasInit){const n=new EncodedVideoChunk({data:e.slice(5),timestamp:r,type:o?A:D});t.decoder.decode(n)}else if(o&&0===e[1]){const r=15&e[0];n.setVideoCodec(r);const o=function(e){let r=e.subarray(1,4),t="avc1.";for(let e=0;e<3;e++){let n=r[e].toString(16);n.length<2&&(n="0"+n),t+=n}return{codec:t,description:e}}(e.slice(5));t.decoder.configure(o),t.hasInit=!0}},reset(){t.hasInit=!1,t.isEmitInfo=!1,t.offscreenCanvas=null,t.offscreenCanvasCtx=null}});var n={opt:{debug:c,forceNoOffscreen:f,useWCS:l,videoBuffer:u},useOffscreen:function(){return!n.opt.forceNoOffscreen&&"undefined"!=typeof OffscreenCanvas},initAudioPlanar:function(e,t){postMessage({cmd:y,sampleRate:t,channels:e});var n=[],o=0;this.playAudioPlanar=function(t,i,a){for(var u=i,c=[],f=0,l=0;l<2;l++){var d=s.HEAPU32[(t>>2)+l]>>2;c[l]=s.HEAPF32.subarray(d,d+u)}if(o){if(!(u>=(i=1024-o)))return o+=u,r[0]=Float32Array.of(...r[0],...c[0]),void(2==e&&(r[1]=Float32Array.of(...r[1],...c[1])));n[0]=Float32Array.of(...r[0],...c[0].subarray(0,i)),2==e&&(n[1]=Float32Array.of(...r[1],...c[1].subarray(0,i))),postMessage({cmd:h,buffer:n,ts:a},n.map((e=>e.buffer))),f=i,u-=i}for(o=u;o>=1024;o-=1024)n[0]=c[0].slice(f,f+=1024),2==e&&(n[1]=c[1].slice(f-1024,f)),postMessage({cmd:h,buffer:n,ts:a},n.map((e=>e.buffer)));o&&(r[0]=c[0].slice(f),2==e&&(r[1]=c[1].slice(f)))}},setVideoCodec:function(e){postMessage({cmd:w,code:e})},setAudioCodec:function(e){postMessage({cmd:g,code:e})},setVideoSize:function(e,r){postMessage({cmd:d,w:e,h:r});var t=e*r,o=t>>2;n.useOffscreen()?(this.offscreenCanvas=new OffscreenCanvas(e,r),this.offscreenCanvasGL=this.offscreenCanvas.getContext("webgl"),this.webglObj=(e=>{var r=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),t=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n"),n=e.createShader(e.VERTEX_SHADER);e.shaderSource(n,r),e.compileShader(n),e.getShaderParameter(n,e.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+e.getShaderInfoLog(n));var o=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(o,t),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+e.getShaderInfoLog(o));var i=e.createProgram();e.attachShader(i,n),e.attachShader(i,o),e.linkProgram(i),e.getProgramParameter(i,e.LINK_STATUS)||console.log("Program failed to compile: "+e.getProgramInfoLog(i)),e.useProgram(i);var a=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),e.STATIC_DRAW);var s=e.getAttribLocation(i,"vertexPos");e.enableVertexAttribArray(s),e.vertexAttribPointer(s,2,e.FLOAT,!1,0,0);var u=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,u),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),e.STATIC_DRAW);var c=e.getAttribLocation(i,"texturePos");function f(r,t){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(e.getUniformLocation(i,r),t),n}e.enableVertexAttribArray(c),e.vertexAttribPointer(c,2,e.FLOAT,!1,0,0);var l=f("ySampler",0),d=f("uSampler",1),p=f("vSampler",2);return{render:function(r,t,n,o,i){e.viewport(0,0,r,t),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,l),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r,t,0,e.LUMINANCE,e.UNSIGNED_BYTE,n),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,d),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r/2,t/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,o),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,p),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,r/2,t/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,i),e.drawArrays(e.TRIANGLE_STRIP,0,4)},destroy:function(){try{e.deleteProgram(i),e.deleteBuffer(a),e.deleteBuffer(u),e.deleteTexture(l),e.deleteTexture(d),e.deleteBuffer(p)}catch(e){}}}})(this.offscreenCanvasGL),this.draw=function(n,i,a,u){this.webglObj.render(e,r,s.HEAPU8.subarray(i,i+t),s.HEAPU8.subarray(a,a+o),s.HEAPU8.subarray(u,u+o));let c=this.offscreenCanvas.transferToImageBitmap();postMessage({cmd:p,buffer:c,delay:this.delay,ts:n},[c])}):this.draw=function(e,r,n,i){var a=[s.HEAPU8.subarray(r,r+t),s.HEAPU8.subarray(n,n+o),s.HEAPU8.subarray(i,i+o)].map((e=>Uint8Array.from(e)));postMessage({cmd:p,output:a,delay:this.delay,ts:e},a.map((e=>e.buffer)))}},getDelay:function(e){return e?(this.firstTimestamp?e&&(this.delay=Date.now()-this.startTimestamp-(e-this.firstTimestamp)):(this.firstTimestamp=e,this.startTimestamp=Date.now(),this.delay=-1),this.delay):-1},resetDelay:function(){this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1},init:function(){n.opt.debug&&console.log("Jessibuca: [worker] init");const r=e=>{n.opt.useWCS&&n.useOffscreen()&&e.type===b&&t.decode?t.decode(e.payload,e.ts):e.decoder.decode(e.payload,e.ts)};this.stopId=setInterval((()=>{if(e.length)if(this.dropping){for((t=e.shift()).type===E&&0===t.payload[1]&&r(t);!t.isIFrame&&e.length;)(t=e.shift()).type===E&&0===t.payload[1]&&r(t);t.isIFrame&&(this.dropping=!1,r(t))}else{var t=e[0];if(-1===this.getDelay(t.ts))n.opt.debug&&console.log("Jessibuca: [worker]: common dumex delay is -1"),e.shift(),r(t);else if(this.delay>n.opt.videoBuffer+1e3)this.resetDelay(),this.dropping=!0;else for(;e.length&&(t=e[0],this.getDelay(t.ts)>n.opt.videoBuffer);)e.shift(),r(t)}}),10)},close:function(){n.opt.debug&&console.log("Jessibuca: [worker]: close"),clearInterval(this.stopId),this.stopId=null,o.clear(),i.clear(),t.reset&&t.reset(),this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.dropping=!1,this.webglObj&&(this.webglObj.destroy(),this.offscreenCanvas=null,this.offscreenCanvasGL=null,this.offscreenCanvasCtx=null),e=[],r=[],delete this.playAudioPlanar,delete this.draw},pushBuffer:function(r,t){t.type===E?e.push({ts:t.ts,payload:r,decoder:o,type:E}):t.type===b&&e.push({ts:t.ts,payload:r,decoder:i,type:b,isIFrame:t.isIFrame})}},o=new s.AudioDecoder(n),i=new s.VideoDecoder(n);postMessage({cmd:_}),self.onmessage=function(e){var r=e.data;switch(r.cmd){case _:try{n.opt=Object.assign(n.opt,JSON.parse(r.opt))}catch(e){}o.sample_rate=r.sampleRate,n.init();break;case k:n.pushBuffer(r.buffer,r.options);break;case T:o.decode(r.buffer,r.ts);break;case P:i.decode(r.buffer,r.ts);break;case C:n.close()}}}})); diff --git a/web_src/static/js/jessibuca/decoder.wasm b/web_src/static/js/jessibuca/decoder.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7ea58dfb9b319c5d4e45e8e5252b26c40d5816d9 GIT binary patch literal 1226828 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

A5UWiBD2>hGE1Iwg$^;j-ae56E4uuutSfq!}C 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

LAkWe|O$=N-=?yNy~@u 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 z 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%0ANfvt;i~K}v#x(2@ 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 m%VQ8j=hmK(-IH>?9ql3;V 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 literal 0 HcmV?d00001 diff --git a/web_src/static/js/jessibuca/ff.js b/web_src/static/js/jessibuca/ff.js deleted file mode 100644 index 62625619..00000000 --- a/web_src/static/js/jessibuca/ff.js +++ /dev/null @@ -1 +0,0 @@ -var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile="ff.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["J"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["N"];addOnInit(Module["asm"]["K"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){var result=WebAssembly.instantiate(binary,info);return result}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,65536);var ptr=_malloc(alignedSize);while(size=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function reallyNegative(x){return x<0||x===0&&1/x===-Infinity}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function convertU32PairToI53(lo,hi){return(lo>>>0)+(hi>>>0)*4294967296}function reSign(value,bits){if(value<=0){return value}var half=bits<=32?Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}function unSign(value,bits){if(value>=0){return value}return bits<=32?2*Math.abs(1<>3];argIndex+=8}else if(type=="i64"){ret=[HEAP32[argIndex>>2],HEAP32[argIndex+4>>2]];argIndex+=8}else{type="i32";ret=HEAP32[argIndex>>2];argIndex+=4}return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>0];if(curr===0)break;next=HEAP8[textIndex+1>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break}case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>0]}var width=0;if(next==42){width=getNextArg("i32");textIndex++;next=HEAP8[textIndex+1>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>0];if(next==42){precision=getNextArg("i32");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case"h":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case"l":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case"L":case"q":case"j":argSize=8;break;case"z":case"t":case"I":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>0];switch(String.fromCharCode(next)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":{var signed=next==100||next==105;argSize=argSize||4;currArg=getNextArg("i"+argSize*8);var argText;if(argSize==8){currArg=next==117?convertU32PairToI53(currArg[0],currArg[1]):convertI32PairToI53(currArg[0],currArg[1])}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix="";if(next==100||next==105){argText=reSign(currArg,8*argSize,1).toString(10)}else if(next==117){argText=unSign(currArg,8*argSize,1).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?"0":"")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?"0x":"";if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.lengthexponent&&exponent>=-4){next=(next==103?"f":"F").charCodeAt(0);precision-=exponent+1}else{next=(next==103?"e":"E").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+"0"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&reallyNegative(currArg)){argText="-"+argText}}var parts=argText.split("e");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].includes(".")&&(parts[0].slice(-1)=="0"||parts[0].slice(-1)==".")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(".")==-1)parts[0]+=".";while(precision>effectivePrecision++)parts[0]+="0"}argText=parts[0]+(parts.length>1?"e"+parts[1]:"");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText="+"+argText}else if(flagPadSign){argText=" "+argText}}}while(argText.length>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg("i8"));break}case"n":{var ptr=getNextArg("i32*");HEAP32[ptr>>2]=ret.length;break}case"%":{ret.push(curr);break}default:{for(var i=startTextIndex;i>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}function traverseStack(args){if(!args||!args.callee||!args.callee.name){return[null,"",""]}var funstr=args.callee.toString();var funcname=args.callee.name;var str="(";var first=true;for(var i in args){var a=args[i];if(!first){str+=", "}first=false;if(typeof a==="number"||typeof a==="string"){str+=a}else{str+="("+typeof a+")"}}str+=")";var caller=args.callee.caller;args=caller?caller.arguments:[];if(first)str="";return[args,funcname,str]}function _emscripten_get_callstack_js(flags){var callstack=jsStackTrace();var iThisFunc=callstack.lastIndexOf("_emscripten_log");var iThisFunc2=callstack.lastIndexOf("_emscripten_get_callstack");var iNextLine=callstack.indexOf("\n",Math.max(iThisFunc,iThisFunc2))+1;callstack=callstack.slice(iNextLine);if(flags&32){warnOnce("EM_LOG_DEMANGLE is deprecated; ignoring")}if(flags&8&&typeof emscripten_source_map==="undefined"){warnOnce('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.');flags^=8;flags|=16}var stack_args=null;if(flags&128){stack_args=traverseStack(arguments);while(stack_args[1].includes("_emscripten_"))stack_args=traverseStack(stack_args[0])}var lines=callstack.split("\n");callstack="";var newFirefoxRe=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)");var firefoxRe=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?");var chromeRe=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var l in lines){var line=lines[l];var symbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=newFirefoxRe.exec(line);if(!parts)parts=firefoxRe.exec(line);if(parts&&parts.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig&&orig.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=" at "+symbolName+" ("+orig.source+":"+orig.line+":"+orig.column+")\n"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?" = "+symbolName:" at "+symbolName)+" ("+file+":"+lineno+":"+column+")\n"}if(flags&128&&stack_args[0]){if(stack_args[1]==symbolName&&stack_args[2].length>0){callstack=callstack.replace(/\s+$/,"");callstack+=" with values: "+stack_args[1]+stack_args[2]+"\n"}stack_args=traverseStack(stack_args[0])}}callstack=callstack.replace(/\s+$/,"");return callstack}function _emscripten_log_js(flags,str){if(flags&24){str=str.replace(/\s+$/,"");str+=(str.length>0?"\n":"")+_emscripten_get_callstack_js(flags)}if(flags&1){if(flags&4){console.error(str)}else if(flags&2){console.warn(str)}else if(flags&512){console.info(str)}else if(flags&256){console.debug(str)}else{console.log(str)}}else if(flags&6){err(str)}else{out(str)}}function _emscripten_log(flags,format,varargs){var result=formatString(format,varargs);var str=UTF8ArrayToString(result,0);_emscripten_log_js(flags,str)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){try{var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _environ_sizes_get(penviron_count,penviron_buf_size){try{var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _setTempRet0(val){setTempRet0(val)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"z":___sys_fcntl64,"y":___sys_open,"t":__embind_register_bigint,"D":__embind_register_bool,"o":__embind_register_class,"j":__embind_register_class_constructor,"g":__embind_register_class_function,"I":__embind_register_class_property,"C":__embind_register_emval,"m":__embind_register_float,"c":__embind_register_integer,"b":__embind_register_memory_view,"n":__embind_register_std_string,"i":__embind_register_std_wstring,"E":__embind_register_void,"r":__emval_as,"e":__emval_call_void_method,"p":__emval_decref,"d":__emval_get_method_caller,"H":__emval_incref,"q":__emval_run_destructors,"w":__emval_take_value,"a":_abort,"G":_clock,"f":_emscripten_log,"u":_emscripten_resize_heap,"v":_environ_get,"x":_environ_sizes_get,"l":_fd_close,"A":_fd_fdstat_get,"B":_fd_read,"s":_fd_seek,"k":_fd_write,"F":_gettimeofday,"h":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["K"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["L"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["M"]).apply(null,arguments)};var _strlen=Module["_strlen"]=function(){return(_strlen=Module["_strlen"]=Module["asm"]["O"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["P"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["Q"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["R"]).apply(null,arguments)};var dynCall_ijiii=Module["dynCall_ijiii"]=function(){return(dynCall_ijiii=Module["dynCall_ijiii"]=Module["asm"]["S"]).apply(null,arguments)};var dynCall_viiijj=Module["dynCall_viiijj"]=function(){return(dynCall_viiijj=Module["dynCall_viiijj"]=Module["asm"]["T"]).apply(null,arguments)};var dynCall_jij=Module["dynCall_jij"]=function(){return(dynCall_jij=Module["dynCall_jij"]=Module["asm"]["U"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["V"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["W"]).apply(null,arguments)};var _ff_h264_cabac_tables=Module["_ff_h264_cabac_tables"]=77157;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();module.exports=Module; diff --git a/web_src/static/js/jessibuca/ff.wasm b/web_src/static/js/jessibuca/ff.wasm deleted file mode 100755 index 9b2d12d23b67b5e4176dd5693045e9ca696764da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1216411 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%0A{s8TO&tXdMBjIykf9qZ5 zlSXx)0`3#MwMGBvVD9td@FN_~WXObK!(vmgm9oCXRiGB3 z>d_&ms7InTSXzuVn8KUj7E_yQ%()pt14tS&xUNQI~JGXzgz~t-VuLlBq#*{(z)id1*HhS z+Wc@vP)f%PbONAW_Y_%F#-)T;;G%`#!Q+T>=6dj7BKDj3HuKQih?(7Xa#Hre}?34lmKsNbJehh_ET~me5WB zn*vRs6d%dP%CfYO3WuY?C4!thsnkekN=6RBC8iRDz8kJ>AZLp(@lj*GbtDrJCGv}L zM)DuX8h1uK2}2=>1dE_agzwCD30}YZwo5v83X{&+447JI8@$}mfGNAB%vsnT%z&xz zdvCy8RX1Ql$>IzI;iv)A!upmPFk8WZxnx3>rI6{Qt3Zs}gep=S8Zfbs$pc~*$4mx0 zZ*wfWX%BS7MoP`(X2`2bap-6{&8Y#+fnqV=iM{8gq8#>)IQE~5zx1zGgSbg3a>Nuo=s;m zg-Wf}b*5?@!#aY_WXfetXYzXB+Mr8GW0%%5lsGB(O5kkaxTgCIH4{pCXdosk&?fxApN z!AQsB=LjAMDj~*CrW5RZ^jXIrDagYe)r~r6=NVLbpoJ7vdS5v(MzplMnk$#|xD|p4 zln&UN;*#)T1?pjs%g}+d49Eux;Nns!#5O`9*!_@AC`SO>8MHT@5rKvEXXv3G+bGKg zj*$>d(#}?6=?e&FXWfDstYqrejBe`pm(f%#bEe1IR1#$aY+8JX>6!3@1q;NlePS;2 znobU;31kaIgF8dmBWcr0q7>HV*)w}cx9;4g5aV-wti;LEf-*WBxc1XB3NMKBpRx( zu0&=H;KS-Vj%{|e>c(pNRjAH9)0Ma)@T21TYZZROs zje(++aC|ZNQ%(b_CVEyU4)c(%Yb9`?KTds{gWXG5+Rjj_vrL|JA2f@BP#d zKd^Xg$Lrpt|9+iwy;X_|ved42JpA$_pZu$D-g*DA9j88W@BQ!pyZkkjKJkO^TX_9- zH-B>R808trvD+3Gd%vna`L6Ia-yh4;9oK&04}a{HU;NtlAKURa?|Z?!{_<--#y5Jo z<84oW_;}UVet6 zS+oe13qA30*c59XyX{yO-oOysh`OX4<$mwiCURS^iv`%<5qGR{dc2ru*hY zzkIzN>>k~3r^b^7jH7aIFhpW}dh(g*hsUwaaoBt9M0fQfoQnRA*`H)W;@0EE9|GTW zpZ@YAPjf6c+g061KJ&ZJ*wLa?@}m~_(%fG#6I$wzgvIPyxTqz#8CQiJkJ+M=qhpC0?! zkNx*|ee&3jSNz~#zT@}*@FCI5$G&v;``3MbrBM8fZ+aSR{}_a};|U>q>NY*~-RFe+ ziflWx;I?t>Hb^9N~BcnscaiYnAqk?C!>m9*fIpU`o`vqE{}IgSKRV$CCr zs07RqWDgi2h35}FU;wKPaIyR(I(f`m5p1BoVV8NzNt5ll6WcF&#{2b>T~|h+y33( zq|<-$aCqZc%-&Gh^*6upBcHkNx2Wt#<6oZH+k!Mz*=OJNqwo9L^P^e2xoYdXHeC41 z^rYQXnEYVx?{$EE`Zk@V?vI@&8jRU?Vd2pRvlR%EP>03-$<9x=H#)zb%zwSdHH_fvYX#y zs}(By`vo0U?~+jDWT@igWw)q8U(ls_Y}IGcdwQx^>wVh1rQnQ&TZ%^3cj}dmz}Noik%TxG9vndf21Y1Btc>;GMjj-5M8r67 zY@jkAP|0#dzomtfmy`)VV=ZUDRujRtC>*?IVl++g#sp)dX;-|bu>N5u&|Xdir=X_l zZ5DjY#YdS3xA6PxzfT^n&0PHF&vTKvh(G`IIgB#sHzAc*>VAvDI>o^XD{kww3KMl) z6;{T$f%N>;-AiG8Z-oKAdqRa(G}P=%TG~s}-o2=hE*lNLC?V1Ng-QVeh8}@pG zZ!+2WdHr>frE`?Bw*BzS(wFlixo!V(KUi{4OcNiwp~ItZ8gcTl$Wrjqq@;`TT|^w3Y)$neUu<&kZTUU1T9iiPmSZj2h@B{oFDmO ziZQ-s4LQ~H-x7Y@x9ofrBolb31HDLfP%XhT{k&zgM>kqF@|H$!JIZ;YHdrhQ9xp#S$Gi zwsf;FD;b;;v;XqhCG?(uNF>j{I0!FEqU*>A_~%J3hBUZFy|1Q8brBC`-|WH_1*bQA}N$KhRx~>%N`I8;TaW$gKlh z$2{h3`?_ljT_B>k)U$W+1;otrIBUG|#I^JdX?|_d{NWSV<_&jQ*l!YDF6|1TbmGYN z_=c>pJ$}cH1puY_I7{9*^ERXy7e97_I(cPCAskwU=3WgQ8Z20t$*~+YCVSht;lbN0 zc{XzMrWpn)vA`ivfHq6t3cBCc``b8ydqQsDM!9+-afP^SGe3)WvkxHCIkQNDKf(i5 z`7T(VUCw+;#!s=_iK4kZeMgoaR|}j5+uHv0H-s(mnv7s4Q0x~v*Iwt5_(m=H7^Jb0 zu{KR*a|EKk|8wMe7@W^g9q_Qy9!vi!i%(=tsN_fXD}gA}f^5N7hoZyjE?KjD9rvpa z$e5&z4nL=)h$cnm9@cg0KZ_pqncWKs-2F5S*sd`iEDA!z!;wVzKgD5dv)F7gaVwd} zY_Bt{WVuu&Q^-X~PvBW-435_%VXv7vLj6DproSD^vf8DWaGHV@G{p6Or9m$9^O?2$ z@>RkM;b90MF`V!KvjRjR;49kS!^50S+KdfA>W(+9mw>89YWjd1d;*s^z zx?x38@pxA-)q?|lVpoP0lck*MvD3x-W#2%p9FY2g0Tl6IH{pnQI{*-!p(}7>Yw$P9 zXix7i)y1Km(y!4MS2rJjZ4NV5kJBDI}D~r0>@JsINfA z@FCyPbA}!dUM(rFdQ1Q(y&n_~u_B?Bcq-8Sz_M6I?r|ncO(?r&ieSb_>>2-DVUGyL z%o5Zo2oVyTA3WMv-|Kyph1y~1^XO4CN8)oQhqG}g`)l|4$?W}}g&ZE4%?7w>7#yT%pc zgjMG;_rF48%%!cX99=))z7p-*xu5v|HaTwf&suWnxlE^rpNt?&%^&XV_t+=BAAmjV zqfZU?&6tvnn?l1%(-@;_XdbmJ1p?Oijf;(4RPZ~C^dY%oKOFbKue_+pN(&uDh!3Z<7sI4TE-kOMq0PCLH`dT#rgy_KF z?;0!)Id6boAI1LIl@PWjZshc3Woy^!D!idC2U#08eHo4nUnEOHNCFxRtv zNho#v{Q&%} zB;Mp+B19RDi@6nD6c-6N1(EQH+7^niFBi2Ex9 zn1)#*Ky!|!vf6uIJ-JQJCOyqrtmTGD0LeB4Ho9=ZEU+7JNro`CBG#F#ZFlGSB+SjY z*+zu-$NuBtz3h?Ujxj$I?RBT0*@Qzz4>GnqeC3hrh-gqU`j-2%|Kl*%gbQ%}!Otkt zfo&CBf8dUoYx`uDRS8hDnhF+n`n2WVzHoT25>EM#`zotAoE$bUP!(*|mNqO=BwPn&KwZO}Fj`|>T}OY5AR43rQA%Qn@O(4DTV<`5>I{rgQFP-+u=$WQ7t-Z8i0z<%it zTAA|$Yv~6~!&Db>0A4c=;q*gKg#gh)$FPTV6fOn5jN!qBV&zo7XmE=^W|2>m7Pktb-wtq;qy79fl>neO zP3af)i}O_E-13J=n8ZY0C0>hucZ0L6HMbz>M(37?{IQyY>&0;hREFiRCF+_^uWg1w zJ$AR&CLbmv{+KXzTs_C^gXMzGYlcC#F#iyYuw(+#&*swkWLG8nNf|+c&87LJlY#~Qe)eK~lo{e6} zs-__9vP^B7fLpVUI=D81F9jbl!Q0%E+p;kW(_oU&WX0SexoAUjPfgkEA2Dax zEB*mNev^lLY}#IqMY#cYVG?5CL!$tm@TawRulrkOi`jYCJ~-FAzZI_(Q7rh`kK=<_ z4eV;@{EryGYC;m9N}Fc|#PrG>Ym1_+fEqvr2e2ZXxI#7?Qg90wEec7k2LZ@JznURJ z72CbU1yWRB$*M^SS@fl)yjk7jw0N=u==Wr-v^hjgvi^#h*7#kBi*d3MAaX9{n&PlD z=ZIWNS#Gd`k=~K*VqG>b(gjw3dW^V0E4Y+;K}S1-Np$+cCeAsX%X)7WjnEZZ)+1#* z<`I0zCrckKEd}QQT~Z1WJmhxRdcpA3ljWRaVwJ5yEJ+@J;7@Ox z(v<)Wi$A++&ht8Q0J^1np4%_`HkIC0uN0{fUfHjn%IDs~~%We^W%1 z=M3t#wlE?x#SQk)Df2EiIus-B8{CrvV_pQ*1g#VEh)p9drpOhXDk5cv3~lq;s?AYb z<5f*7`I3`Us+v07lh#}NSl47LA(E=(THc6m$~ODl2P%bfKwMRF18-m@E6D){C?}Gx zz5mjTCrkEWDSbBfkq%q2k8w-JEDlLWAhW;>BKE=Brw5*WkY|D-`wMyRuThnCItvU0 z7ZJDQ*@uai+vV7YxWJNq`XlTE<1NHgKEghTJ+TIppa4{{PoL>2un$U=*oRZY#VgFn zU1Og!NM4H35-w2C#*#;%cxfpfEiI)Pb;*aCS4ST)8`RjxCI;wG@*dj;Bqu&8?xHfWS6G@#Q82j)QEfS)|#tU^j+R_Qu1>t4jnnK?Sn zYdXXD)T-JMG2CmYP+R}OpiO00`!kBf0 zevC~uhw0`GNLhX|%}$V+mMIhZ8HhHJOk{8#opX$;;eVT|wAFTmEQK`?Tc^|@l{B3) zHbk|!6sw!Qof9FU@`->r?p}}PMd@Qo@J|PI@U>=;4%~|5I;ciDQ(R9ugs{z1t%Z_< zs-~%@WE*XYvsD(xAcrP{k0=3jSPRZ$h)^R1Jy93<0}?1);foAzA)}chj?MkjsgjLt|lbA1ZM$R(-=2hIFFx(rgsBypXrDPi9wiYYhJl? zqzO#T*{Uj#Kelr?4e)d*KuyT84$mk9wb_tpeZWaoz>m}-0D>_ZY*{HKhtL|tZUTqS z1O_??Up|H#0VD5KE&TzG75t4{vHW8MJR$PU z5WpNM*LR!bi_%g*Qtsbq_r9VvgSmiDRPC-AesL=8;&eOr=vSxR!(SzXrR6%Ea;Lbz zy}F;26%Z;nL*~k&@%nKsU$viRBQ!5_sKo;}C_;;m{nK=&K!B{3_hbws6^P~~GzM0k zKqNghw*@iRbZbfHO1dzNiBGln?bkKAmY!xE%Bw^Bm0!QT?|@r%$UQZ=4|)WfEa_?2 zHTNQa$g}z((_hH#K+OY|SrkbCv^m$vXALqsj)_Ba9w@tNX4p9KwWLF>HO_TtoL5!j ztW&eOLmX!eowcc4_6hP4`E{Hu7{j{FH4a{CeS^)~aAG#Ww16E?at=tz7^iLfo36k? zD=FB>MRNAgj6JwR{_?Jr#iU#r{!lNu31im58a%9N5GbY%08jvjdeKJFrU@`$+wsAH zkc74+&>Mg{1^LiC=vx{+N77fI=Q@m@R~kJ>tkgi?66nolH^{pQh!vc}0bP@fvLPrd zTL*tJLs#uQH;Sztx&oAeroow&of_kZ_z8bpWz$>VtSL?C%QSV4LjugBO<}prnnEe( z{@_F~b*UVPP^xXI9?o!aiA+ISBEZ|HDrDBMX@@eI+Erq+LM01Ci9Hc7fP-9$2zIzM z;sKBE)ng(db*L+@eO9o2dW=~y>3wo4o)Ul0GQGp!Vq@cPNCF-P`1~@O*gg7Bwu%$I za5%0quV%fSq}G+a$B}O_YtG~=kq@MspUJ1(z3}=Ie=)6_wlV&VFn)6edF$BC;|p(c zul9v+k)S9GBO%6sDB|SKCQ6O35Mmz5BM9cW zqwfuZQP(muB{3NjQvWZw{;uLWLk%1_k86dU)u%H#gTr)2o0xC~dq{94)7dn;10-Z6 z9r8&Cq5;=WZjJh4kRj7ISr{49v)^7!-#&MyZ;#Ayf$6DaV5wj0{JjF*uB{nP&I>d= z^oXjRu4YnB53FWVuER{qE6t?VPMCHA({(k&VZ;@Gcl`|4^?Qk}DZjK+;A0C>QZ@D5 z{Oz0S+6*^rO8nie_*<5A1Z=2X{LSGNp6n4R6=#pCE1tnotZ?Af_!%R<_&FNlxI%EE za3A4Q>N$)Lg55SE6`hd|2HDg%xx@`vA@fnB8&O( zQ-ylP%Y0x(Fj!a|PiRJE>D(EWLx4+*=?J1)AFlQX92iOqqJJOTSYhGz9-m0taRgTR7)?{9_`#_|&YLGN zN$n;)EfD6oh>HNRvVT!I5EiM*4M{WZF+VhW(inDK$)T&RtKmqI8onZv5B|PJhb)BT zaLvXzd=IM_I!{#{y%IlGRbU}2@7XvU#w&KwfFt+^0M=@T{CHx+g*b)7Xg3i~fQwR} z#n^0z2er3G#}oTnHS|3SwZa_BS0=Msv@zO{8aWbI@G+=dZ3M6~TMh0NCrD$sj$Joj zNg3Km^;ugxG_AZ!4-kru5gm{pzaPF(X_XZ@sA6AGFR@|zl6}m5MAuV2h7e69Dk-zc zxWkJPQFh?|v*EJBz+#g#w9<4-+!G(`BO6UVMUb`Qf;Fs1eU2oHV) z(7wi`D9=AjpySr)zv)mDp_9=ngARkWcX~tgBz|f_x3PqK^k%jf)K}Uvytdp&RVmnu z8{OlV^Dyc@fM+KHNA)lDg05ZfCb z0I*PmFjOkR8mG4J;owstOM*u7lkWc`qhma$8eUK+CwM6dY>EkLmzb%~Hi!kp)* zFZErNtuS&3tqB3;uvC$a`5xO;fEk@LXcdgy*kv8#f;|IthEClIQ6LmKU5=l~9|Z>r zBqqkR$4N9L6^c>2#VZ+&VLMGiF$D~WxHakS2%gc8SVdr52Bd~;QWGURLBwPU-%^lb z=--lDf`~Ww{P>n+Gu~fON)W3Di9=bP@w{QDS48P7y@E<*Fain(@cpXW?^A%<8U?TH zW$8B>3WZ^EHKudYz(}{7iugW9E(9``WdeS>CsFt5u)yt4%CNT1fYjB@4rhbYR2@#7 zOk0N&I>p)Hl$;$-r~ULY3MWMQmH?-(hxZ02o_Db1MY;9;+lABAv%$&4ZI}5F+l<&S zo`V#{9p&_#qy7x>h70z9#dRXWBwY-StlA+p9XBX64j;Y#448sklmQ)>CSOt4Ppb-p zC#J&BgQn5dAzFO`Gb0>~nLUmxN=FLXFh=o5wV^Fs_`|k1cwpGpl$st=dG(34B`Pl? zFV1MoKo-GHUehzcVb5LyDq_)1=_w0UP_1bWdRI;RRXffSZD^TYjsmX^b4jRfRCDkU z44Q<|xiW0p{5bA))i~kYL^ze&Rvlo1Q>Er#ZG$pI%I7gNV90T7ct?K8YU>nEZmC1tKA9$5(%R0VQ+5MHs00deXKKaFBN^JiaYBT(&~*Wi2tpa+meX0LB% z(^t+EYxsr;8E!70$!ApX_%&FnvFORn^5FfYoasBQxLg_Uphw`_Q;*$m+&9= z2)`QzO@7ZaJ}g$_L|7;HlRrf&+jKd-Btzl8T(NDWJ>;;3u&s8DUNOL@URt11a7xaF zczBz8`^Y6y9jm_*l*fg4IL?Upw$}IfJtlzbXbejhm z(*YSXtUlG7Co5#oK_EOthO|ZQ6<#KLrN>Z-4q9CX6O&kcSJS2b<;B>HV)>@P3V#6< z^B-5j$`n)oI##6+4MCI)c+%(vJ4XrL9^mCKUm*>pZY>4xfT~Ii5oKc-Dr@H;HZ-%9OOa$^SJ~LT`~zX&#Y`#^u;{XI8)~0>kl$7Op5|8y z-b4Jt>3KJu#ma4`X=!@wGA95iK_`;nyet=Ui;z5fH?xg8v*Elm`5Jx7_`02q*O(YCn&8`Z?GcQV?4~EE zD!WY|4=g^xGVwQKluJ>zU5be*Ow=mRJoOvpQ6nXT3_xm(4Zf9n{$0x#)a$<(pguX1 z6C-7iYSL{nVifG5R<#B%*pw%$OPC!L@1h4&L=mw~a)$+op#dXOpp3Q4v9J0zWM7R* zcgwS{f5)lQNM@sqSnQjv2<&T{>%a@lJD#lpVk;2h)>ldTT{H8*YGpvgYRzfunbT9E zY>c(X^!wn2Vr{lxW*Zb>8(0~n$d8BzHLy0ZCv}XVLm=2-QavvQw#uTsa8jWmKvwQ~ zA+qTBQXYwv8o`m`GFsU{(Z_U;#=F^iaE8D&gq6=V1FZAU&xWM2;W~xMv5udy+6v`a z@S|az8-7Ymj%Sn2Y}J|giDd8SLST7UtMFzvBQDlco-1+!Wx=q;(wOyrFUzuYKJ3}< z!`;oT(bs-jY>uLH{2H7=$xb$d+TIUTBg!&Cr}KlS&{^0cs?7;Z*2$G41@tzVwJ)=V z-}%d@;X8#ZkQ>mOE9l8Rt1%M7`j=CnNns(A!qibK$wMot?S|#&_E9iRtCHStZYD`b zL)(-eCvX&#lpiRfM^ePXD@$(4Uyg_mawva=l*vo-SE~3Tnk>OX(qvvGeIm;*)?>T@ zS{H9)*OfaN4Yr{BxZ4xANSA$r!wY$!Wi>x6stbibP!xC_C^qV!txP3@E%_8+>6h9n zK<-~09Zf9d0gYga8QU7I67c!`A{z{JqL8(Y)-C(#nA_%Fq$V-FuTu6QpMl3TJT}KZ zehu8Cg|tbdVel!VO?PgHL>H%V_koXqLK zI<5S02=*KxbFa932A=6LfwmbHO`sB~;lN`u-@FdxyT+SU?8nO(=S%cw?N!-N2`mf^veYl!q1`XNnIXKknIv+n}5IMR-< zn_8;6$3Qv5l`V|=dw`r33I_axd6xC)Adt-3wuJRhIjO+E921Y|%ZVh4;RQC)$(QXO zg0v}xclw)6t+L83)gU=xXL3v5yL-RY%-6en_;+2liC(*} zsG>}@C}-+Q^BQidTByCC5mmp=np!Wnz#_Nn-Dy3fE;jc)zND@mHhSOZ1Mc*<)Zx%u zwZGo_vd*34`g!gl{=GmFh%tr2+CQtI)w*oOo@bw20P5gCg2`UvUf`aui*0Vwp$N?6 zm${4F7Cm{fczU-0aOJ*y)*)GWTI4RB%UzbcF^8x`-DIZQoL%Vt-M-@cNF9@L8rAOo z`F8iE$bFFyAphbeGx=+gnZ*u3mha3qLLI`-C1kD;bc-zq$i$t$G+T2bzdT!gJij9A z9?!2txNOW;y2hd6Qd4i&c&Z1T(>{o4I$NhfvRIks>~dYLkY;<4%@}iYMS;|v-pR{L zuMWOOPTI|0s@10ovK0nX$kyoPY&(Ssxc4R%NxlZp(v#OSS;yvh06 z`~Y6kQuBGhBeZlA=7gOYw6J^s3^EuSG-+$Jbrd35zbktYG{!7=e2cjZBlA_!FVGsk zzww%#)|zw-Y{J3oCrf2Za*7y!RqD{9=NU9B8->lta)E)jdLSb+)&c$0#aGoAMWVYq zeIL>&JI@qW52>4&NQeR`TlOQ73zCoNy$#~LGlnoM-?Ssvj0*UKe6YTimiNjrcO(B< z(l*p2@3Sq)i#d0yUP?Pe3uZuQP14JyN<>5^2H+AgZTnsBuI-;{_0btV?O_n(3A!{! zFUqRlG7$J??k$IGvuH5<3$)o*7wIpPRWqGM!)zItsRc7W>qnwtfwRDZHNTO)y0qq7 z41OKNuR@`G`N8aBj9u9)4rZ^Eg<~qaxaz^Jz6X)~f{#b&#VD5;7s!(E6uv|BY=*iS z`huez)G5{>iw+~VV2wt08S%V&*>J14(t_j9m>382nO>MN&!)q`#t^ZV<nT+BtI&OoOf>4i(2TCo$Vfbr&Pj9@>4N5xlBaITE7ITidc#%6+pf@RM2b zSPacEhUpo)JEwjQULy}Sy{|PYcUM$4m`HV_E5%wA6ye2s6WUpXhiTPxoSj202Spyg z{w|DsTch8@5`HM}_Q;Lg(O(>HMK+VI*|{&1^aaP$Gy97fK#&g*FKfs*xFH+g8fBKd ztd$j-oJnF2DCRUg23sl?16(+a96MDbdkI09za-bAMVHbiiy9S?a+=}>cbHJ;4bBLD z4U1KY`zuKDpaUH%^`G~3geXliRfvH2&eSH8$*j%+6uXyM;!g3YEzZyW zVNc=Olfu+RN`Wu4430juZtO9;=JFTNAmz0=uJf&s`u56=aZM2rQLEUxj)wD_`DS|-ZN#BwN)BwnMQ04uXr@RbMh@@BY zS`@c<4PD)xwT}ZIl&0>1<8NxrGDyOOlqyCs^$iq(4&nWbV`p|g32P|#0&yeUlN>70 z4NX|fzXZj?c;~C2x=5EA2d?G|oAWjN|33j;X~6=}5iCSqEQPzl+XL?`02d7%&vysF zORGH_;NjtA01rtZiOB1N=;U=TD^RpR{y-+24wgPS_mk_A>xMERd%m~K?A{(_yWeJ7 z-|jouM9q?A23~vF?wNcyDc^Y4BbRxk*phd-ngZ_cl;=UDciE z{dn)yt9R?;>AR$orTeaAEIW2^h>;x+;5rhP`~{ed)6JS;0<#t~3#y7~Bug4*#g@ug zfF?L#Bsmz`OuT?#$H*OZLa@7GOojFYuM8i~;59Lc2}&?&r^gVbaf7FE&x@Q0W{OX(XtKJXI zAJ9>KJ2|~>zy0dWwdbE7zmR4WO@V_yyG-8~d30JswA|#?Gm}-1(qxVO!uUPX!g=k z0u6Tqt_X>P*)b>YVfg^za#kU9D#FNmS~lIoDqq8O>;tzWxnT>jqQf}_%;M|^vj~p( z!#tzpYxT)OIu94CpGg?&!Q1^BSHo#m=%CJ7y>4K&H{H`?>!WfJkrSdMLOnv1PN-ny zhr^ED1lMpG2RG5P)fUp-eRfER^>)JIv^8d}g>-7%ItyuKbG?ORY>o_TSU9CH_QuU2 z*ls4lO1*1WgIN`YQTongV;E(#ujSC`Ep{*mn}CHC#hB~tMgJUQe=I7jj-UxwabJyq zq}2xR?LwcVsf^`gs(%z5SIsQ;RfuR)n@Sw@C62yOiRX|sA60SMQ>NljXAM)-W^Ev_ z26lXL+RT6225yk+t2Q8@))Dd)H%SN*Tu=Qai6*KK$;ArUzy~8ycCK1PPDDwf zoVaFjB2liZ56pS>G%$fgV+d0r+;Z{>3yJZqwUCY=S!W@{DxJu~K@d{c{rHxAxajx-2Z(B^0-@1BR61Lb(l}0I(Y%0!XwB0O{)(!WDh(24 zr>okggEs0U>Ip#=V4xRK4cE(Bim0Ga><}soN1df8l(N_*&G|Wl1gfhP7Lr4sK)VYF zlr=`dzo~*=6oG1QKfNTsD7{hA6?4psB+!lsROB8AbXiHD6!d}w>d)7LcSD(Roj^a( z;wWk(PmvpQO%PcU$U*igGZgr_1{~F9UoWok!ki4$eRBwb`Z9pZgk>$`l-&R?M2z|% z4lMzACNnDzUl8*%eY0s)+X3Xz3nA)Kx(sIytslf9H?Mx6CAAG_8=M%XEg>9 zP=j|Spup6uf~`%kB~6TPKod=N7>FiJ`sMTw2xhVT9>&V#cg>1keh&cX z%kMDer37PS3^lL`Jt6s05n@6(jU?veG!zRL5uJusrL+plvsNMNO)&@2B|C?Ms`D8y z4zkZwjg>5jIAyY+cK}J)KciT$JeX``f|gtWYFs>UOMgm9Dn_QGMM~A8l+i5vX=D#& zM}D+kEs_=1f=N0uk{=xQ(7^~G+UL{R`+u%p*^vEQz54%;dWBtM+|A_+)Qz)Ou9hzE zELE$e3p*>tilWe~7WVV3)GCTX09;s9UuHW)rHW$EsTLOVqE#x2L8Dq&%!^j2Cs`nfvwvs9-T4Ahmu!T2eZsiliMJ5_4wvd%`4qNF9r=xo#|NZPA;6Kpe>&x9G2~tn)oF3D zFNxx`xY(COZCYIHOQJL_F7_o+nHCrOk|<1zi#?6H^z6^oB^j$1s!PDobH%e!mZ||b zt*Z3(EY44}-qb`T93EI`8cuL)G&Ngg@&;?4u(HVT ziZ;10i&klfR z#)mY0o!iO^i)GGd3F}=fw1hTUnqc`T%PK7&J`1K2rDg|QXt&iDY#PK_S*1%qcsi-D7AM4v2I39WAl`6^!B9OlEo6h{`&qx2$kujFozZ1>)CJnbt9?*vgU& zH0*8({i?Omj4Lw12ipv7M3`IHMnuepx1?@nLC?U}P|2Zztk(u$)Jkq^rDu%N`X!Go zF1asoo{Ok#CF9aw>$;~^4-{KG8U>g7MIv4=Y%G#z@W|W5!iFDX8JGeSuysX@sJ=*B zw;MqU>K8e(xJX3MuxiIS0KQ080vn~ds$9HdU4TB<)&+njtb1VtQ4Pbg-EdwAi~+f9 zr;%Fr^e6G3vCh^E@sx!eIapRO>|qgHuuk@K#STXIGh8QQFqXi)M7-f_R>_tw?(7u1 zrOWEm*_p49QPL8;;A|8-N?L*rUbJFIF(`I}BoO6&OUoH5b`*nRx3HMLrR5A2JBnFE zkpEN^JKBa~x3G&pwPLpzaxaNux477sM6p|3>`S89EiU#YQS25M`;sVji;I0p6uZU6 zo<_0z-_jSk4)%|wUQ`QXcD}~I!q}G6u8aL*ocndLUyLWbJRr}z?u-{BInLilA{%A{d<<)fxrXik@wyT>PEcF>Fy1HknAMr87Z|o zKSn;xxEwP^i}YDa3c9Q-RaP!;s5yg~(`NUdh%U>qkA6*kkuJ;q5MiEa~8CauR_ zm-YUdij%*l*JUebu%NmIf6YxKFkMutY}d3@^k3sPVT~RIG^npqpuHaKjSjeip}W*v z!BP`(8%t`dHAgU6tWMzxX604d@6zSfl~trEnZK5H1hc{_Wpe4l5SUNz2Bz|d)z6wA z7)2rFF6<}ra_|DvBDr{0sf&9{kTrFox<^s)>V-uiFb8#STrO8NFHNQd)V)PsniPYW zyRaCf<=~?k#N05Uuo1==vyk^w3}WuWVvv>_UX|}i`Q-eXvSXD481Sj-ofM;i8NdVY z!7fAJ&-KoKRR2r{1HE%_Fn)>!#iffoJH2!1vd%{Dq@*P%@@(`@N?L*-U$ovyF-s8S zi`F|SW(k6P(RwGvEF#E%DtaevL+@OOpFg$UxfpUUiQc)m*q21_TwLr+qIWJX_9f9f z7Z>}I=$(s;eM$7r#l@aR?_4isB;KNv<`t5j!H<8>F7{_Hrkq%dszAE)qv%rhyQdO3 z*#d8FoR-0_o@A!lP=IT9-`~hKSlLqgc*6slZ4>gZ3=!ESzI0sMgUhpIReuntgflh= zp=qVv@7V%PILGQtGkt#`)7#PA(ka)_K7WqkwIfQ)brT&j!HJwY_+Cxpt*X|mzFHQN zF!`cd*LV?KI-AzfzcXpwAQ&oupT2d2nQo7hct5HyZgP8VQ*MmL$1qw4wF{%6y&O3U zndWjUyzuU(f*Y8E;l8o&{%yC+9h|#;Za&)IOI*~emjM=CnsQRT9$o(s(eeh&g=jHv zeu>U+aQUs%x5!3H3XSdg_}Mq-BT3wmWk5S&xYW3(5DR&wlBFdj7V@-yvVBXy8!yQY5kT?PpMk^EmCje&^~d=$wV?$he+02EM}^T!3ttAZ>?f% zwToPHT0Ze*p-ot#yZcdy^A zmQ}5994Q%SgFQ>-Hq3s~*ERdNT_B zoUm8%Rr|W0#&cbn&`OK&9F(P6?9_RoYrpaTrBU52GNd!foEQ?r+AJ|kTeGDA=_smx zWM<>SaXz&;mY+FPf%ZCxw#wd7_EDrb4J2D|NW#iAjcEvv#%=p43y5r6)?uOhZ1a7a zEo0(W>=op}p>AC7=+Rt_^XW+8*!@w}L;oB~QT47Cvzw-Rw+g7iDnZQ#E~%KkW0z@} zNaw-~<;!H5;Ff!>pVMY^V#_4!1_~hSh>FGJ7GiY@YfEO8p?plE$DU}7DQ7wg?Q}jL zbV3eRFGG$o+;dqP7Z3K!?m$+wqod$F?dS?czX+}q$UW^~Td{)++ZAH5e5sN}G`2OS zpcxDyIaD8~AQ;hvNM<~XfoMVuuJ#rK(S#Vt!D2)-AqsM^C=pGFGVgrK7SV(#Q`CtH zL_@Q*DV#Y-=m$=PJ$rq;Lp0R6$JvJ(Fcp7GLn`$1$j5bzH(DP=I;gtIBz*)tDA}_W z2NwJkEylBdS3g>tCFS7{xP@Fc7gl>N`q3Px3W)pfpaU@@{TNoxIcc``&hhyy$W~*> zpn)NV+=i5VVjC-$!fG*C@#cWR87da9;z5b(U|o{xMq%4mW}Edam8cgpo~MSYE)I|a zi)2-1T&vg)u@I{t?JBnIA^_tt1@R=XAW{xuiXHg_rU*yiLcAJ(&?{VsS8*Zx3K!y4 zT*zLv@yc@{dxZ<}DlTNNa3Nkt%2&^Ys9Nl&;ow3l)_8i)=C~R{aQcxD;w>Df5$`9S zSvaLHaoV4SHRBnauQGdcM8k%0IN7Ji4v=5oLa(cC0qYrX8Kvh8_R6yNc zSSsgx0fQO85( zE*C*^lZ{xb0v}GY5cT;o>h>z?p)#tU>VGezNcF~_YFw8Z$)!syF}~KVaFC19FJE@buc&hS_or%_<)>;=FjeoY9eO*1TN zp@!FBz_8bp8Sz#dXLU}FgPd~Ay*M0Mruvpj%lH}~fb?>|(y(MQqZ%FHuF?%hmrRB) zoJwN}i1JM6A=#2C5qgzUx4qcGN!5h8s5ji5gCy?p8CyL`IPn0$`Jp%3Qa(Q@ zPp&+S?RXD&qx)Pn&J%m>2r`h2jG_xezATazCJM4M&Y;jvoSupwWghmKO?A!(k+1Y>9?TrgA~ zrnn+64@0xEj9N#lmYA`)HDC$gb0H+B&C`Nnvc!bmdhA4rwrVdcmKRyEvKTE^7i&1a zXR_!Ntzt!y6!NmB8?d8lT2r@SWYs%rN~uqfHFD5Q^-bC>{G@tEhS3}oIdHU!%mQ5Y z73wp9QGy!gupOHS>@Zc1l9qJk30LB1d>nkR`p)?}p-f=4ui#8Vxo(#PTH+}u{uAE; z);2N~Ml)p*uj_adl~Pehp@t$tbN-dZmy<5jQM|`akmF!f`q$OQ?~;2JtHNxqFI<_Y z`*=!XhX7R&P4rW}VK$72ERooY&RM1Yb=C6N1DOM$F3$GKL=cs~Mx%JH$m-y4pd2}d^5{?;56#=yDkzQ@6~{wu zO|7jKr*2E=K>=102}!U+nS%I#Utw1RAz-Ow<|>uUwH+#%i9qc|icy)^;nh<4^TSX} zV)ofB--yrG@%h?5pY(Cd&iORr#U)?x`K%&57?gw?aP^P~&!a_QE%9&e!>F~>QjYkP zQot<(EYD93^^{haH1|;SYWy|02&A4Q`vhuo7r=68 zwiVT`vXLK@D%5O=2O5bWw%f$KAkgLiv|2K3CBj~X!~9w$ZgW^Z8SNxm)rIs6a@7E+(&Tr z(y)#T9-wo~G{F?4q#|GGgvb}DFNzU%iY_Ds6}?J4hocz5G9Oi;;inOxCz*ZUqv&L9io`G@dXvOxiX#1v42xi)o z(r+&uc#I->FoWx%lgxR@#K5Cs;1IKCwLGMkBEM*Rj-LR;m-flPkHnyK@MS$P9_u0A z%>$`d4{M%^Vj~NsfFQ=FLw3t2Bcf%ud}6tl9lB8VahRLt@Y=k?@vNMz?r|*?WF?3v zTR~QWfMo@-_bN;{nlgRc5wwgB%ZNms!Rbt$VXai1LGkpRp^sMoih;zIN(5$!snH9J zaL!OitRi)(k69V=b%B|&56;>U9zGFiN3tJxw3~4WMrz2qkdgYK7-Xa-639r>XQXB! z$pe;Z-j^6!F;dQ=Ucg8zV~GUYx*=qt;EQ1D>WtKS89F6i?&>=Z)GhvICYK*dNkV4gdc{E`Wi7`WtWQGszs?pM-%a-QXRLquh6 zuk0GE04bwbFVHi#Il$RA*ylP|U6G$t83Y94LN`gU7!h)B0<%n;2;k8nLxuyQtt8jQ z7fQYgT-l^h_*zTEeKAJgoHIEn^_m*9it0O*Sa5M`$iL5Pu`m}kr=yD4(dX+M4kG8q zP=P*+KJBw4;(R(URE}j8`Q<$%$}*B7fFnk()bEieTLOfVzyMM^r%5fqGdK7 z6$`Zak}}I;CB9iQD^T6wO>VLiLEz|%*bGNGXEWz{w#`G!dpyJ}dEloB|DhGW220k} z2g#R~3{h6e*k~G9VJXr;X8u~766*>kUGa4uT3O^FM`<2902ek}R>EqU?vvmlnUseJ zkcWXaC{?oi7#7hz*~55tc z?}eg_FWUSk7K^`RV7u7V`Ya6j2<4;Zo+eKce?64?ae61M1d?mz4@-dq{0%iGKcHjYqO}py7f_+KY z;UUU4o~D*o#S$Z-h6jG#dPrj7q1snK;>Pv*5)65bHI??b0`XO}jy1y+e*h>LYN)g`*f_aaMD}TMTsm{0V=rX#0`e$M z7q(MrStT(NOnHdfdB868kiyJDv$V(3*sc}vI_O|S5IzHxHbYzAz>5A9WsJpmGOCCeOW?_x@930OK&%YwJc8^Q zWLEXPiQHzgFK!zYY9#ezlXb<@?7^>cS zr17)<=_VkKNDXiU1i)1=5|0kG1ukmUs88a>#xBb-)-rqvd9Eu^C3ML5kt+|qeX2}M z^;HE{2hH$2ay2EFLWO-XX2O*qT=HHU*HDnpW!`2?wS6y=QcljE?!>E>wB?$@FB!AG z5NI?=TwRpJRtq13ANFkutTl1}av&mZ*A!lO)@V$MWd<|Gp+Ljp;D+X^vxNPCrG-J6 zH|D)=>{a{fGOrb@t|N2DJ#jk3YZ;Y!pnd8=oqBYc#d&c1_kzi(*M=i_n{{ap)8P+` z4eQ+c!{i6Z;h_QAz15{{H^z#)g66Nn#=Fd0bL$pbiQ{z(Ee$jyf~#9-`^X}&17sMd zgTBjYN2iewT4+lXr?Grn0jk+&#dm55LgS!&MTo3RHbgy~UFs1`X9N3q^)l-T|KPfk z_*h~pk6rh38Ct8lu!b+5GXq?)4lSlhsMuE^hb}Uqay5%kI9d!#ZZ% zPejDXc*sMQu$&4L52;Lr;hr8$D8BU*L0^!~A;`g218h!7yn$3^BC{C?D9k~%iezmh zo#w^Sy7cVj_)tk*w6%I{GBe3tvZl>xL7Z3lmF&p}$##}n<;&X2i$H04G@)gN29>eW z=7J#3a;St_W;25zk;$g%LBt0cGc7f1u;OGU+{)}jGAomm9);@CE0VDin@Fop$Ne&~ zcZzZHkUVMDPgs>w%Mi`tS-Ak_O|V$tlrq>!X`fQ+B=l-BCI$nxPi7@`7=5!LS6FXJ zyzP`W@g@@tdPmt$`)+wvQ%eTq%JN{}ER!T)?V|I*QLUQLkd;bfGf~;YL-EQ=s5KWw z(Vxk#OrqwfCeGY6qhhHxudo+(e> zh>6CavAAfJlqNC+m4J$v9Vig2kOr%Yq+9mC zO-c|(11>v8DlNS82pV`;&XU}XY*(wrinWv?P~OxDFJbc{p_%5%B4`h5EOL;4vv0CB z@=YqTJ?xuEk~b|k*~7j`Q{YWzQF~aV#A)7SZ?%WLskOX`ka>hgB-ytT?*^#F5y&mj zl%aM&CEf8*_mK&TDN~3juJn-s=_+GazZ{cD$$+?~QHDq)*w(yFQJ>-XC64K1-J?RD zrB*?iv+k5&MwJ@wD0AI)!?1GTJA&wdGe_DVGa9(S<%wMkTpm{U{V_+vG@YWorPmXV zf7o->7y&zGgJ#*{K{?|0gPUiyyj0c2LZ>$>>N;~R3(%qn3YPMG~N-Fd6KyQI} z8dtzp2G>z14;Zy|NeR_TQ7xnxFwDlh*M(HIw=SgCHP;>@B(_soxR5>IIbdAJnpaMA z7|0fAqe#z;+hT#VsTH7d=xy{D56AexP?*;l4pgV~^tdgF+nTQ!p1t)+phq8x#AnR# zu$qJIrj!c6h+v<@~MwhPeQy7?eQd31i|SKlB%-1zYjHmM*|ImM*>>#hzwG)9`(g`(^kbi!)6##Nd~AZQ2psqFlb3P zkWtXjoh9PQG^@`+#7z3kL_QDJVH+KF*mx*h!$XaSfa7Ir`8R-iB~$WAYmn<_RUY0X z4RT4$;IsfJ1uh<1S2Dn=V0B)~_8_R>Bzf|pY5ai3-SJmXONY!`ck~Jx zKRk{75lfY1vXehxuL4)byW_XAOJ+R)Xy5Vq-|3x~cmANa$wj>pYp~taxbC88Wj=B( z?mzLCerzu!)Rm0hx6j-hkLzz_<}_K*~9KO{OHf& z*b&yU$8|-*3a)x!B|CFNd!RkI9@i;6BkK@%Q*&}*I+d@yC_>Q7hgC1SfHn~3=b;(d zy*qStm5wvf!h$_F9XBw3quW1n z``2G{xY+Ok0rn059lhFcFRkPPm$|ujXSfoLz7GC4>OT5DJ2a;0xabps03w>eU@oUA1m>@E3blI!x@S`U!dsK^() z5kzR^8-IPW*l5YmttZrNaJ^xV7%hef6Q}l%%5L)D^Wa&ujubD;Uv~5` z5zFjDFK-<^0&i#?J#2_k4c1V8?qL-b+HnWp%{f5#*5&zz!};dJTuQBBMOVBmkrig> zG7(yyUzSJ%>1<6z?L&Ef8o$?G7&F}Zq}-dK4*QXME~~s(`GK2~8wM)2#A~6Z zaLX=+sbP9Z?+psVXx1?-s^)S+%nl%H6kT~GDTCFXvhU@fqfHbtI7}rQcfHE+bBWYaA z;BJh_%=mW=t8P&N34wymKkD*XV^OALTcExiMWggGEp}kvq zSHDH?1{Zi>^=VF@7*RxapLQxFE#IT;y-7T*jj{QR$($T&=XWSF3)|Ks?a)93ERb8; zC@<0k?)ioZI~L6fVeMKjwse|kH$hWqPsbWE2T`|a=bX$9tWwS(g=odRNCrQv^)jWZ zZB-sIZYXXbQf)wdX-Fv1I5XWRa?T-r)RnYQ1 z7+G`Jt{d5nXTEQfUfa95o>Q-gM`QFy?YE+P_Tfa7TCW>+y8=JP7Kp$3o!FGH`bp_*5CVw+uYA5oS#7Sa4uS6%R(34f@DIa2JjjHbaTKsyu7II5+^lP$P zJ^G7@?mcgyM?~(f(toQPKp#})3X}uS@qDrU;b)bm**>>kdBdJXbOiUrTsZYpmI>6`$LA7}fIdA{ezILxGll%!`MYKkF%0~= zg(izirM9_8f3GQ`ld1)CK})_bc9+eflb*Pjh8t`w#VFfZWoYZQOr@h?SLwFbGM7q%H+ijIO{S^z3m=iQ-Bro5JWuq?7Gwf4h|l%1oh2&tn|LEnv>OM>=r2yEPGALdLMNPrsg0nuM2$?Dz;{B%!g-K zR5ifGyJ$^&G|K4r3l9q8^YcOZ84gOo=4wzfNC^~&xrnB=CU6}B403mC0-J$$jwd?H z;%{Od3?zAE3mg4xUXdCUXpr?K1dWCcOYTt~A0W1-y>bqLi1HD32!hP|a#aIsnjEyT zYM%Hjo13I(%*DIh(7p_@4mKcmP1Z6aLuIXCxP2hseO;d`LZ4f9o;}a z0Lx-yU6LhHp&o)E3iCBZCVO>|i`AjIIA?;%+<_iN#@VGDZUz(XA}hgz$-EWgQ|e@m zhTyv&6gT1pX*9g(l#e{hKBn20j2A=nn`vTiD4EKmE3F?)Gs%=*jpGOcsf#rTC~?>E zhLK)x+;*p=emeH41|4H^Nf^A|kl4!u-}(N3`iAVLt8K4avBnU3=8vxw-ksdd^tHZVd}f?!=sl zfKneZBjxGUlUrp_btev5yjo<5L8xmb=Hudp>_SS8liA15oKC?cR`nH$Je%A5lx5Q0 z{*56Cm$IcYi6k@b3K?&>vL{OQSCroCf?`ltW zcOz~ZM1TSyw?AefsX(#b^LSZ{`7J@1PP(rmhY+Q0qQwZ`*^Nv~D9lnTN8J4u=Vc`X zxJbE3G?_xwZ}uVDvaA`c1E;nm>j67uZJ~LaO;#t0@$1e34+S5O`r(Ib;a5#}e-x5H zVr6h;KR7boy%=b&hunNK9&J?ZxMV>)r1H5-RK11PPj}x7C+eO@3*BQd2%2cbNsAsw z-nd2}5!%44W-XTp+0NZD5Wz0t_fj;UX!%y049^K})Ap^IC{h7s06Z5eChh)(sEyye zDcuG5b&qR6I8UGc6XT9G1rs%ndLC^0=ZN0R6emcbl+Ok|=(+IxY^wMMJ+rav+StJ) zR2np}(%ub-HpZ7n>-|tSvVWU;`8hWZj98xD*c&x|)w&K=fn;{wq@*{%!@t&5lj5ax z6_HllR6>&%42!m=i8huHg!^3zw|cZj!X1T>4`XSst;xl>I!l#1Al4D7R;6rN3@IBk zC`F7~5pC@Yr`qdCiZvn5JJ%tFVb+zE+2m1_;|3q$#3NghH)UIsx8|7EG}Xe-u`_r7 z#!S0%T}6qR&XB0!m)DJ=45%=g)&u{U3(8(tanwam28&~99|lNq80vHYeMgVZ2rSdj z0dP@q&%a>oEc;g@-jqcb zKwQR?LZBmZh@zQ1G!n$g&PAG7DRNXSl#9Rlvf^#<(SqSiO4o*AiO-7J?s1QiW_kxo zqL>6+Z0Bg=juB@+qRIVv@;~p=UW(?hC%MtF=JO6ezbnRJk^w zR(iM6EMHO4pwTeL{+sBUMBuSjjT%KdkW`0^A;`cJy2=WYir{!k3n&}1UQ1nj+!IgI z71`G!lfl#qsA4pB$JHPG`2I9}f6(GJOXD(4;d!(Je|?|hO6hiBvXFx;UE{~r8*SGi z&4i~^aWLN1O>RW656tU%(+>}mdb*R!KTEw{{DFR$eElLHqq|!nMwnJI0WgVppn-vH zfh-i`XYHnY*f*b^Sx{nI~H5`_foOhYinE+tOGD00%$;YABCKJJ^+F7us1JFMxJU z;gU^?324_8+Ldp8w3G8l;?b`B$gBd|(GDB^1!xy(a8&)-p&cEppr4X9a-if2fC~u%0Z3fS zB1HgTG{tDdm@=6U;739yS-N_rj>@~HaAUlFH{H}*M`q4Rq(!;4Gj`|N1W7As(FM{4BX=$nf7u*^=(#(ld(oLTONdD;#h0r# zsXsK!8ihZ?HKWq6*_kq$jSOe`x^1yqmMYRONvoB@um{cVM@vyhWEm$EV|D07e)RDE z5w@$%$)21|G3;T2YFvD+G`0qMG=w24RH^B-0N3@eT^U7~!Wo3D2krDmRUge(m5_U6 zOIUiy2xPbeB$QxU^@nkLP>O59HUJ`GdC!`V)?+M{5(e@;z(9VTJSllG+NlFi=!2b6 z-m!u+kQGe8g}}2Pk2AEU;r=+98N0mE;a{WC;lETr9p3$qJ^j~4BWg4|u}|1Y_|oVk z9kFjH8gdudo{Dx9F~sZkJA}+h><3^-J;Bpug4D%60V5(iLxLNJH#g|a6*{VQ1$dzP z7`vAv-0UbCXc#m)b~*Za-k9V}#J`MohzM9H|Gr_vi2F{26qEyW{b9UMBqQl;pLN|^ zTMGX)B;d)Vq!tcW_1GpP93%m%$&+Kn8iuXQI1g4>9HKzrV}qYNo_1`wuYds5%>3) z8NXvycXOF_j*CQ_P$^8s1YX& zajL{MD+-<<|Iu#=nMOL9yQmlY7Gh*-s2WU=o@S-oGmF7_gsPE5iiWM~YWkvdW4T=&NDI)GjiXpM^g5e0h@%L0E z85a{0Bkxc~?Eb|rGG1)UpJ(0*_m*AYvE+2&`WZLg{n@`977DoT)q#Mn1ktc7RFi=a zOcI0uYRrh$yh-Mdq|ACPBPq&UNOXZwxQG85-DEu?*|ta;ee60+UFspWc{dEO84PAr z#u0Y^Vw&y?xRw&{{KLQfN_?%Y7gPMKjX5>l-&=zm=7z5Yr`K%j?1$zW_xINJ2ls_$ zZ=}+)5)QezsaUh^W7PCf{?`6CyXk}qWlLt`{$lO61Mhv45=aIZ6O6pGoaT-F z*ZtYYhi&}@@8J@C;OqUK??whjvAE*wdfxCoZ|2MP^qSNRg9truylynwb|7DNe=%{0 zUaz@fG!m$-^8&^D4xVMNDHzq8E8vM`XykT({AG!yU z{P0gArX7Zu{o9~=Psrs#&B zqLOR z?2qs~fXh8d58@u!F^cJ(jhu8_0Y#q)(i3Q=P=*O$EHph}3b`S3dEplekcv98<}o_p$InI zEBRC#UBf6)QWHlQ9)Z$sg7ytjGX}LX_WVmhW{(%zGtdq?b`klZ59R3LyEBdp5LicQ zYgoJcs=TAMP+XMczmcbyaP%DSVd3%E7-fHvCC!^#2ewCCS*?XgBk}kP#jx1+^FzC| zlojRC7mAK??NrFyDZg=-r8xQP0Lzf(kmrW3wh1N5rxf_mGnVUk5}(H>VJ8A>$Xpf z9`(PzP1M+Shcp0!(+eaQ@bbheJzPZF-}SpsZ#`=8Au75;A$@!3==RUtci(FcA3bt( z`+s%cgI_#)7}k*J+kFpSakNMdf5FYYb=O05I5~2}W!LXe0uQY1tp`v;C4w~E)oV7P0#+~AXA9&|q>g{76U30_NH z6W9c=Z@JRaK7Qv-NWcUG-x&tEAHTElhTVQbqZJ_gv+xY};MQ!j()V!NSz0u6xe0bMGM+7#x3#CR-b94JaQ+UVjUjj5( znYZ8e&=+5+VN+9&Y@bj(u%z$A*}tO*RpHpuTWzkGE2*njxeA2EEt_J_ZD8IS)y z+xmGM+6zPYS+k?i zf1ZkS)M?$`Yt)|YOyUFVTt-Tofe*1@wI|0|+n)J_6lpJo^x;qvwZMi?s3jzr=G)y` z+mmqQ9Yz{in|}Vrw)j`Gcd^Ic?|_kb&BEaQH`&n%OeRQD_)OztjN9ow?uuQu%mcoZ z7t1h@V{y1B!luT-mXaM(H}7q5qPi`~yOyO9#7)O!Y&6*^%hvlf7MzA;b4J*k|J0Z* z%`hWm8O;LUqV5AN^V@SDCyjm6i2C4zxEc;qP=ba$!K$9X`oXL2zlpKp*q2OK6)qhNg1Newz{DLX`_n&-}iXa9Z7X7A4 z#s(i1MZfm20t;39%&Nf0?keS<&B>rbA3Eec{M0}?IB z4u&-+rDKv$tA*}|{kC9`7De+R6qroWDD}$P>ALLES2HH|>_%2>qX$(D?CvSs$j8t> zOQGg6;zp_<(O_diQ7VKH>?Up5NU^Sl@h#X&X_Dlzi6lmvXfjKw;c=;Pine^4;I2lun-Dl@k9 zD%_D^%+?t_aPVS`oSBQXCSlW3-qBeOX+AQ;;vxvZXAL>aUP5YLNrvTB%hP!q*ia%>8QE06>#cz955DP2%jFvOgRjScS)YlZN!b{|)9e*rd^XOiKwIz{RdZA)jwj ziYQ2vcvB^65}OFwQm-cEv>_j24-@=@D#PfXvj0gSjL$hba;k?G}`Wp-90?&06|L=rpOX5 zowwfrZF1OO_usM*ryjuE6@B%nreuB5jt%rHgyIqvI0R1PjlZ;^1n7`Adqv?W500uazbp?i1=JRrJ zM#PLrNAA~+a*mDk>1O$r+_u36&VdjETN^iPV?H{Q$^Mi91f>86G(i9qM1c(AGS$^~ zm1Xe3Ow1i)N_!7vU@!EP5!8&*VEIQ@ELIUxvz5|3j~jBSp>z`=ZvUF!t;p>~=5D5F zAf*?4f_{5gg!CLkpLQR`;9!eH;!u97adXq)X zC570Ytf+I|k6guUspqHif@#9!*R9EB`-BG%;Fg~SJ3*~P9Ez<(B#528NYcx7ax5g& zeWrN!Wgi`lhY&wW08Ta(xN&{bQLt9i50EPQ_Y_Dj>Z`_zvz2#zRkktr|-HneV1}#rN1{CdCauz3e zH^IOm%neYI5YY@cKRfX+=7llmhZm+L%{ble4F!&%Bfv`Y5AxApBV&xBA7TvdUMv%M zB+J)HTB+&pDW2{bcH&%|SmDnkg@hHdCzM1NI3uWxz&6J)h3-Agx2Hq+B;k{?iMZ!f zk~)dgIIi?tlIJLoW>>{MXT`CW!nfPg!Ed)i!&i>7T4;+cT$Rj%yi)?{6-1FEO@kDg{dS?n;`mP}?7p7oi6!LJ!qp z4YY=JzeznkfGv&(%{Rr~NpfA))f3c1^VL_&+r5u#%jsN+5@sUa zPZ-BV#eucZqLcBj@|~$gE;aq$;e4|tnF^g8QYRa}leQPV-bs=nUse6oL_=CCngUch zd`;cz{yu1s_UJ)^(*f#*&AdPmSyF{d9+!tFl{>~>b)T}k(9IlJGPxa)xka&TaCcY)z|C2E)|RKB|stSi1sgUOw?FSvVyv@ey) zyeT(FhRQ1Ro$!g6ZAFI^^6UcYc-E*Ru^G<#Zyhth3$=vAT8CtIggm#YrL;zkv?hT} zKmZjDGNJQO`IO;cz!|WSwKjigG@-7)H=0nuBSQJ5X--Z;TP{tv_|V0drckuvF1s|n z3=n7paE1jyl-~Ux7>*TG=JFd=r~Bh*#;v=0GJBI=U^(aUkX7By;jD<;{x(=Jlh?NQ zVD+Io_?Otw6sd4yT*;e^O?KE|WCjA7c^R=EC-&Pn(x|LM!P@16qWEShg&;3P#PCYz zehLoT1x*u3T%sW(z?4J^h6<;Rt;yT;#yd`UlyYygNcZCL_tp>_&*b+0W;*p2>e;sC zeZfjG|9o^S@0Y#rAionK_QVy6Yx}p88*e?RkL^Rs^6a=iO(^`_(5;H!Lii`C6>{j{ z!Gqarkp!&yk6a?ucVYuH41wnro)nN8cwtjFTKy}g-63ofXw6wKR%5p&k6ePE=w%e5 zj$jxO3Al;r?)&h5lYny`54Pp#aUyI2dcvNOw(^`uP2KOL6vaC0boWUgV!SLgfA3~D zmv?WAeY)_KgAl&!)3G(lLi6_)ZmwIU3tyQ7{??~s7O>F#y*;#}DqZ->2BUv(>E_GO z{8PD`Ybf2z)IR@pYNq>?B~v#nH2(<65+yrV$^2I&u)nip7l*+7gQSY9RQ@A?`45%~ zNLgV1c&>?6fZzl7=FVWiIb0(*lT5LBgf$&g z7>^u{hsPFd)deVX0SA(_^|-7U!a{wxXmV&+S)q%fO_xVoQYIBKm8X8V{0$PMC`lq~(mnU`Xk%>x%{~)jH%)JfZ)W15 zLNC+g$pdzv5L38Wn$rhf8`*y+uDJWP6BoVqh9CFVPJO~wNE2#eTdXC6flJmcngA2M z6DYI(&$ez^z!@F}%C%-5_(VSRNtF9f$9X55KFMKH-Ot4z%azZfBxF>wVt=;J9xeB) zas)+?7n?gs+u32Oe~Bx0S|^t6oW$Et0#V94e+X(AVt_((2Qw`;U02L5KAppED}_R)r3wm@Z!QqXZ%vA%pSZA z>xcPNQRvuGBs-T!V6#Hm7<*fG zISQwRmR}xWN>Pdxmq(npt(;unabdL5XSZ8KFO1eGN*4l9B6kAnjf;yejC5fgQ7kIx zZBjqFxQeJ{K5C<)Ht2`jkS>hYPjlp8gU`$T=bj?*0#*(#M+Srv{euZ&$zfruXgMs1 zjv5y1NW(q&mhhJ`q@%9UlXC+2ZyqHi1Kga8L~?JJ8}=iIAxO6$=!FzBUi+>$LgmZS zk$o#>qoa#)gqE8M6k@27fGX6QPPte(B&-phgWqA{#ZUsO*1`HH0{$FB9m^3qDjmn; zt!ffZ&<6EhFZi5M6@OA6?5jVv3SvVXg|D$RAmpV+A*{Mj&FU%Za;)sCPIZ{)^wM?4 zp|2yrhekXq5(h;s6HyR^%!JW|zzw0h4~Z5CanOwj#fL;Zgz(7@d0Qeh zi)(t~<0~OiCZUEWTOSfB6G}aKC-91#A00UeHHZoDF}a*r3*q-893usgg$Ma$Vl^ZK z>kWrX{5jPSiFzUp5oUf#(mcp-o0Tct`rG5(hw>`4u?lUdLg!Q=_N*xfaG9(^w$;|+ z*oPLra;CCEz-mnu;&|o|x2g)+j@64IAj!pN`bvmRQ3?S`7z#KaRqf*xOiKXYmb zF+L$QFeVVAXC}}2Lp?bPs!@z?NshgPoj;@QslSV)3~&?_areH1qo_yS6CrLqfgB-7 z)Pqqa8iO3Al5wm{AC#j3rq3dEDfY_2o7xaebC(QEd?XPA^}(X1HiA6qdEz;ZiN>XezE{3XlWjk4QFi&u@C&x2e2`=Ri>Ej(`z&!ge_ z%qxAmx$u5xcs?8Ap9{}JD}1`!!}GTAJi*Zqc7WcK7RY{_L};e07Q2UI4m+^(5M+Uz z!>+>kw0-ojp$lG)bFrzefHZO(-p&sL7Pi?mu?*=Thp8FB#N;L0B80%a7h<&M930gt z%*t!0F&oyBDCHn4+(I~x4Mh%*pM>Qbb6cf|r2LjF_{Id8yc3+znxhWF0wvNL&9*)_ z7qi#)ovg09?%r94_W&{_2|`&Ltsdl#x%tTZ6EK1>MKuFwgXbmku|buY+qdia_(m-o z%)y)IbpDD>r*@d!Y!Ndxmzgl}bJd3;=!`Pa;wlsVJksgWjKZ<0*)B=tOrrW@l20KN zFHZoFmOSc!QQ+;My1YA35192;Ldoe3(^bIka$hxUI|*gl1jiUA=ot>YV#hsOh?&ou8hys5l?vH+meRy zGA<)hbBmQMT8tK&UaUO@t4Jr`j=876S#?Wt{2j&EtSZ^dL70VHc-1S;@F(%zt9z5+ zKIq6LHhPTc5%y``xz&q{urdzJzkn|B_@yg*oTW14j>faS9z39PrEFQ8V9S$hyI=$G zznP+7Ynm3RNT4=+_8p4cw4=bucs+3AHmfUl7dhVM5J^VKIwyy2+%^glt_@9OVAa|j zA-f@(3eh`zt5^Xr|ITr8(~CJ8s*eR;tU@MB%}SqNab3kkImQa4_}uBM(Lj3W?9`cb zr>ldcRRt|7z)GmaY?*UAr>=)9-Iy*y9aU9Y&=~Aa(e)itcXXgWi@-CpIt55Zv&(y+*K?d$Wp&boKce>90FlcQ+JjZzHpoQ&#YiZ zMLxMYfJ9U#*A??Wptm_95Bo25+vTQuqX%K&G0vzyGRgqkX4p_CzNlaG=~1>+ji`*T|mRSbbA zX)okG-8)Cj)sa;s+?X^A387=}Ku)0CJ;gd*R{o?H(u&63Lh>(<4eY`9nNGf)TSFA3 z_5Kz-epE%>`wp(~dc2=4hdYsGqfSk(r!JN`PW?{zy7wbT!3AMN;#qM{y>MM-fi2kn zmggI0bM7dYgw~dXw!%w`pktb!LrU8CL4V3$JR_H8Ees+gEhp0kBqu2|Y;x${iw#2T zTq>YK5-qm~pIh$nry|u4I%%uJl&yGerif*Fy<`t!(j2!nckdY@ZZq!fyrILfJ&}_N z@oS@?w^~KGzZC?hHZDKIl7#OZL9)IF2iKV_@MM-q zZBq{cZ3wU-CBC=2{~7CpK@~3_O7#cyuAUY}`a;Sg#NLE; ziwog&Uqt3TMN3YDT#^p^qY>Z}W6P>nDCcFqo)>5k8Pp~%JK--vW{J;zm>>?%PA>#Y zo^M(JmNks{yxIz#wSdkryp)0jov?;y(6NqNgU&rIggj*6PFVPAkf~=sHFVgdV$d;{ z$^ab+@f`Yk3h11=F(q{9QcFIJ`H;CU1_+;5gRoG0V6>RXbrZ41nESp1PJK3pe-*R& z216+H3W1F?ME>6t^%bZw=ZoDT*m+#2kKs}^u>VDUl_5(gYsL2#6mLzi8Z?LNP9NW* z6tH8alD8R^mZbcYC*@3qkY4>m>S0yNQlW@(mMT9i z@N?t~*FcKy*Fl|{??F=BgE>_(J?Ln5h1w) z$JP0!026)Dp=y{gcziXy0BVo1q#EZjRir>jk`1LE)e`brtSLK4l$`Toi|F7I*{j%M zXeX^7Oj)FU3%eSVNPCW?9N-KopWpro-7dWrnj--!f*nM?RH# z4V^!%a?w}tz5;ZWGDM9SE65URT>R0RN_C8hvdInkMm5y3SwpFA(MQBRbMv-6K!a@dGEhktCa`gJ z2g%6VzD{8=i3!dKqW0R9jnbyF6Zu&K6IC$;e~{wKn_Mw@P%IWBJK5GZ%{#oAPTkOg zfg}vWJ;`SRmEf`jyqIA1(GEOc2+ZJHl7rll*(vI1sW^%>Xf9E%eJqh+0W^KiQ{jQ- zJOv(r0?llK;-rqDwVlA>iE^gh1=HQvWKYDLN8_NwV721T4wPe-d2ZB5?U1k(xhKtY za?*VneX0RmlXQwCUzY12A#@pUN>>F^6EU=XnSk*I@dTUw_=NjM!<~E%PmDy83Ti3` z2tFI>NLJhno3rjBc=CnOoh$efRL{ODJL?*Ir;!ZZ@6bXi?|FP9Pki*Ai*$TU%=4N_ znOGB5Y`#g^tLZ56hWh>pa@avzJTaRdF{q#MUPHup%+k%6;=Sq;9@($~E$WVEa863H zH9K45_q`T3;sgF1xMM_7_qTC#gX;vINGE%I&_n8U%}>AG{ZKR8U`5i{E^ojXW-LE} z5Rv^0b}q2rCUPWmGCWWeVg9tzkgDR;pq_HohV4#{iDcfgNZCVWhEPvfh{I%veE;i{ zGES&<)}Gn`ag5i_1!fKkD_0DumENgq7Bcq~2u?%=uoralddiU-MfZsI@XSpe<@Yzg zbeP|f?fUJ0iOoA7AmFcni|z$9*k9}lI1M638P0!?of((#z|8*n=^Dl;(xxpG`w>4n z8cxV-OVqF!ao|%l^zY{N@uK`vYcBRafklqU?n0n7yV)i*RE+|KyNUX^T9xN zW_7I{adQDLI(lALZ1v#KWJDZ}-T17uAM&G4;CznX7el}q9bwG~Ny&=gB!288DnnLa z3)jukfj{SD#zThGnkhKb0>TGAg%){x7ov0@eW1FiA5I?V78|s zILU5=!(mcZ=H5kP>9DG$(_CbAjj8BV2pOns z;X7)MeP3bU0oEzLFSqZA=R>~yp#|kH6MPJcI&s@W5z^K^F~&?-uf5lS&%7=Mri}02 zUIKfJ=>%3r&lJT07+M*Aw#~g~?$F%b*gb8BRsEGBE5gjqw6ueBx6jREy9}lEU(c#E zE9*UTM&2~F|9V!X(JplsmojGAZE9wC9Vkui*NNs5^8n?ODOP?a=I&0YyAVHr)eKIN zfSu6vb>7kaBIAodP2->y2Q~r0Rpw9#h|)Wj*)OxI)*SaavbSf; zgIe{?vndKf*KUEXDKeiDNqhrRpah*iBqq#r4sR9#HMr|0Q;dmSnLrsDwT634 zh9niKQ>x8QZF?rs^>*koR-5)te$Ga)mol=Ns*|Tb$2yj*>@g)$f!7dCt331=+XhY8 zm#?&wJ`ua4e-ck$Vgr2i0Sn!fw~lR#-)HCV$b0pq&IM#@DN6^_H3cbes65129kkrz z7LL`@#^Y`80YPD0Cz+(Ty_fK#l=-Y|CWrw!SKFdSh~w}F%aAA3fotrvNSogpUOMJr zl2P;o0Ga57@`B??X{-<6tJ5zsq?~KdIakn-9J?!{pDVOmZ_SlnP=9QUDA`lsFUyEtM=-V9)LCFyUPCp&< zY?ZJyEs#nYoKdiG)<0;)taGwLt?&PnUO0c^i!b5)y4AiBJL)-+5^RVivJ& zDb?Qs7aCJ|m@$}|d;FNG(#BQXsZqcUBsjO6po8q27=r=u?p`9Go|ZeN0JnBIK&gAc zDUYbouk0$=+_=q>Gy>YzBo4vqfTcWsJsZ$PYD_;u(-9rX+R-~Rd-vlBI7NftP7+JX zbNEG*elReMo0-E83m$B`vPI}i>q!nAxLeT=RS5|ANz#3&Y0@Q00JdR(jRl-q-~!Qg z;)*{g4fZ|kzQ0PVpu_I39$?^gr@%-4ji^i_kh`Cmm5Xw^tjq3a4ym@z&~&CRHG}`V zZW3;*m!n#bqSdxXg7;(M-bSO2y%yHX2OG9?-)~-#VadJRHVwM>f6l5;-8U5Q)qm-a zKv!S=w_EYXQ2(e%7ON(f#!+lF-MiqTqCiNAfFv+{hzRpX7;C7@W?3a@=n%zKJm9bx z)zLm!IYKv@)d`BQ7}k>-t~J|R$75)g)nbN@C5F8${}F1>_Qo0FBo!&!h22R$KHHOT zRAZLw!*R^p*TZ{?VZ!vmm)uA7$TUo*;d}+inHZSx29g6xb04Y>Q2J~G&154?*fcOV zwu=Qyc`;+}l}C=$GDR-i4YyVL2if4j`W7>*uneDo5ah@$KR5e55Y(`KmKxx*nuP5x zLAkn~4S`(%*PWrTyKMbewuaTx2i;8f71Hs;%CCmTegox6IQ=wBNV zRb0<$PHE?bie5WSpJ+Y$mu9g^UN`HNIVD&pu^5lt$eNTsujBI=pJ!M{8&RVe-x0KU zK27jxgiqSo%l&Ek$lln2qR7#u_rP7vUwvBwR+GvB0Bf^^f# zW}=2<3DQ!-@lP9oW%3!zRXrb3MP(+ceNrRV&gKB@XulwIYv>K7$hNfHLsm(pNv?e{>3^Yj_Wu)@Q}Oz@mCW{`ce8LtWi zX1gX>RAm6NKwyaoECI^=8BqaZdZF;joOA1pP{tI3P*$Z=babU8>Q252!htVAd#iba zNOWGUL=v30io~RDv!w-6$k)s=#G)opwnTldvSL(egUw)kG3VZrDB?gAtoM~f(O-xj zBnmlV;v&L%{UV7W8LVaH>PP8TODZ-)fc%KtTqD>w)7GiQr~)3HaM+!wVuEhr=GLbQ zj${QVH6B+yN#=)t%o4zALjMMQuG_Vt#71}*kQ^*9j?F3EJ??kyuJ zhY3g}S@0oG%+nh?mQDz=dX2&RX@MnL*fWHOOeUlk(tw6-99q7Ap2(6AYt(T2+pM zX5khC=0~CaA?LnNeblzu#-jdKBQR@L(-#^9nk#3bavZ{Ie<4#4-6ejO2 z9s!}l&#E!H$9?H>keFN>2O!M8Eur@iutVh0wg3}`#1q39h|e?WNZm<}Qes$S z(u=T~HJl2oz0l*a8chYscU#n3sX^tr!p6$4QE;p%|Dgkcy+Yw#A3|n6EhS>KKNTs^4a>fc6Rc zeJjk3gflOacl@^4j;2ewDH-4SZiBnh5Qi~JJ^OpHy3d8w2qByj^=V|>XNW^U|I~e` zc2K$S6qpe6@O@_ESMeGQJ~27E=l-2Hc~tmdb`7y3?(<|Unl#?agcboJ%kqcT5|%Z! zn}iXgH=LY;mYYBbci+<_Cs)C1{X3R^poStP%G=|_r}fdhYRlLprJOUC5KVijo4d!( zot0ZjsB}ojpwL*|QOoKBC+#x;OMJuLjqF>E6gQFf^Vw1ab*iP*1Ju>T%-YC=66+uj zzy`_ZY|E1om&GcMpAaN-E<1kA0$h&ss0Co=Us1q4@q4Iu-k?{jnjtu(N97jVVr_ES}_L{Xso&8yofxy!Gh(=V*pl_5>`ED&P@Wc z57aEmiBLcMH_L)4O7)?=37w6b*YeP|EIT!t-TpYh`6qy8Cm)w$dZXZv9W{*Cu zMH9gMvqm$T_;WNnEt<)P5AjPk2d^U7EpHBO$Oz1b?5`7+2`~{%vEdUTt0^n$W&Uxo ze{AuO971Vg{{yEXUr~_b2&eAz z^Q)@vf6v4BY36)q=42ScXwq`#7-~R*vBeM(&Fo=F!h=G8K2%%V(x2Fdnb04BgnDZr zg9I8Z+LS~Jl%Gxl7HmU}NCD*`0|Z13{7_L*BSb}viW(6$)kyC9v-UaP?{`Ab_P$>C zk9z~j_ndw9!`f@Fwf5R;uf2A_f*Ec*nq_}o&W@3h2`O{EH#SjkFu%%Cn{U`E@uAZPTt{W|N%w_$pGE62Pvn|g$G*nP#e`-UwSS0r#+nqTlcXAH zcesK@s{4K#$?NidG6SXVVM*O*{#`Y5{J*$n*mo19nD`)6bHyVpIGMH7Ro?-KhntMq zlHm)tq}|ZNo|`GlenKA|&O-Hf1IK8`dZzLAGJu;Gln(`DoAT@IzL*4Hyo- z)(s7%hhnxKbgWx}tdw>lHPn{7nH;B}sX1jD&vX5=BHbNb+~+KKn`3V9RB?u{@YwQ! zlk@2uH6%5m=+Ozhan~&4e*=5=y9h!l>)8!VjCHpbOZ-Gkim@%$T6D$JdN_pSP}dj- zcc1J`Zsw`H7i{hE>ztQ@w7KqwcM5GUa{Z!*9&`{I2ys#bUTk=1k@881TaPP2#sde zZcuw1OKqRN27t*MG2bH_SCEg3 zDzpS$o^>fyoDxc1xx?aQbGW|v8%!#0?IYb|Qf)MJ`#?_dte@u|W;s4L8rG5lT>M5% zABbnlw(z`_jS?aH=BR~ff)9Xc$n(W8O$MXhZZ{RY2&z?WS?LRrU1C?5E)d^==_!95 z8Q1fBKpbzyPue|yj0uC4%@i;4*W_zOVu^W_DTNhmf1!Bq;e8qJ4;SxE-p}Iw!Q#D(_cM9Fw|Gx@e+ShfagXJPiRc7=n6l@SX$zTd zxgCK(riBQ-`R-db6A}96Wm*_;c$aa~G&;Y0%b2JqLNSSAPuU!HE+ucUa-7Fto=M!+ zUvK`>dvrv$=B`j-JrJo*8d@U%>~v|)VA{%!-wV!%V3IF}=J6p(&o-V!H~M+826Qm_ zyxT_E2KR77iw?SWz`_iHL^dVM-j}YN8`Gk(g1wKXUBVf*Vb2qKX|Mk;fy5pzVeg zl@1pyp}_uMaXrMzw1O$uhXCY55%)@PN2sFy##U9YLqr$wUP*r1jJmz1n6fubu)7dG zpp%bQhPu5nW79Gz4V@H_q#&0uB<8xxX+GxQkDGW_2k@l!%^pj?7Up%UxlBhoP&D01 z%xZ-#W-l6L*QXK0o64XsGgJX4(-ZijOq1J2pf6%r=FO9E89EQG zi!U4rWQPkDV4ATh0?XU!s1R|wL=M?-3-?5v4jIG#c0#PFBI&n`9Pn=-8`NSD*mOg) zw#^(0$y}xMo)yN)Tslnf#lm`$Wh)$`jbxJN5@l17ImyHRXlMEq>9_jy zJ37<1lYWO!-(r?3tK}h5xA@e%+NnE8y(maG7*2m|b$IJ}};sSiiS1Rm_M4?XFd zU?cmisn~4g&%#9oA+sj6Z@6JxtOF$gi5$X-3nqRa1g|qaWIfIJIHSC(R>)c5hMc?P z2gjNUTvb^oL1Wa-vfXg0Gr?Ge2ekW2QA)%!>YAV!1!HzFJ3**VDR%m5rn2?%j7A_n z=TNz)Tz?50U>4l0Ae%!drOt@yjP%c8IieZx9bG?>ml*d(Yg3t{>{wVUC@k{5lob&~ zaz!W?XvtHIHuM)wy%wW7aGoA`DaF#8A2{DNPW7(wR3eKu@N3?c8;NEF;pij3rUuQ) zH9vV!TwLch7BWiI1J5lgF>!o5DRqZnI;>4Y>C+C15{c;ciF2BeO+I<+kBk540L9UoYJemKi#$ zLm1Aw;D2L+dBM3Zl@&hJ>pR*qShALqZDIe>=L`pUz`jdc%f{z%GQuq8?)>J{zrK)J zPF3gp!$A48DlqdNC~?rYcr-q|Y)fIpVg=PM!@>QzD|5MHhP3z6-6v+_<=$ovTgu{FB||6KUIEUtN*Z z<--X6mhum2S92AF==Q`Q2-fIwBFlL-r=)x$*M_uiIilXLT)mnvQZpzpd@^C-?t=Si zvX8roSGx6I>C#OfV#dtws`<>78}7{GQ7RAa+4jhy&GvNSF;6d=gcjq?d1dotW}l}% zbIT?E^Te^^TlfrZZ_X;4`Ht2=r0V+E%_GNNwr%rmN%FArd{BvnTa3cNVj!;8d}UxFIZFsUOKDdf4@DT>Brzb!9EqguU%HzWR55+{Hp zUIQn1tU7~~tY9%h*#=#V9sOr3Tu9{y?==C7FQ$eEBsM^f7L>pa0X{}eV~b^4<5M%Y zbCX+0bNWZ)cTpDojUux9@k1VIP6r6P;)ybYLz-M{c$&F|

;cbBi=WQBiXIfMB? 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 re4qxhY+S8Y2AKb+13GsYq~AoGo3$eSFiSI0 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

}Vqx=~SzcSC+wI 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

InR{ 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 AR{#J2 diff --git a/web_src/static/js/jessibuca/ff.worker.js b/web_src/static/js/jessibuca/ff.worker.js deleted file mode 100644 index 8f909e36..00000000 --- a/web_src/static/js/jessibuca/ff.worker.js +++ /dev/null @@ -1 +0,0 @@ -var initializedJS=false;var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}moduleLoaded()}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);if(!initializedJS){Module["___embind_register_native_and_builtin_types"]();initializedJS=true}try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}}; diff --git a/web_src/static/js/jessibuca/index.js b/web_src/static/js/jessibuca/index.js deleted file mode 100644 index e68fc3bf..00000000 --- a/web_src/static/js/jessibuca/index.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{};function e(t){return t&&t.__esModule?t.default:t}function r(t,e,r){Object.defineProperty(t,e,{get:r,enumerable:!0})}var i,n,o=!1;function s(){return o||(o=!0,n=t=>{var e=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),r=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n"),i=t.createShader(t.VERTEX_SHADER);t.shaderSource(i,e),t.compileShader(i),t.getShaderParameter(i,t.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+t.getShaderInfoLog(i));var n=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(n,r),t.compileShader(n),t.getShaderParameter(n,t.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+t.getShaderInfoLog(n));var o=t.createProgram();t.attachShader(o,i),t.attachShader(o,n),t.linkProgram(o),t.getProgramParameter(o,t.LINK_STATUS)||console.log("Program failed to compile: "+t.getProgramInfoLog(o)),t.useProgram(o);var s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.bufferData(t.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),t.STATIC_DRAW);var a=t.getAttribLocation(o,"vertexPos");t.enableVertexAttribArray(a),t.vertexAttribPointer(a,2,t.FLOAT,!1,0,0);var h=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),t.STATIC_DRAW);var u=t.getAttribLocation(o,"texturePos");function f(e,r){var i=t.createTexture();return t.bindTexture(t.TEXTURE_2D,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),t.uniform1i(t.getUniformLocation(o,e),r),i}t.enableVertexAttribArray(u),t.vertexAttribPointer(u,2,t.FLOAT,!1,0,0);var l=f("ySampler",0),d=f("uSampler",1),c=f("vSampler",2);return function(e,r,i,n,o){t.viewport(0,0,e,r),t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,l),t.texImage2D(t.TEXTURE_2D,0,t.LUMINANCE,e,r,0,t.LUMINANCE,t.UNSIGNED_BYTE,i),t.activeTexture(t.TEXTURE1),t.bindTexture(t.TEXTURE_2D,d),t.texImage2D(t.TEXTURE_2D,0,t.LUMINANCE,e/2,r/2,0,t.LUMINANCE,t.UNSIGNED_BYTE,n),t.activeTexture(t.TEXTURE2),t.bindTexture(t.TEXTURE_2D,c),t.texImage2D(t.TEXTURE_2D,0,t.LUMINANCE,e/2,r/2,0,t.LUMINANCE,t.UNSIGNED_BYTE,o),t.drawArrays(t.TRIANGLE_STRIP,0,4)}},r(i={},"default",(function(){return n}))),i}var a,h,u=!1;function f(){a={},s(),h=t=>{const e=document.createElement("canvas");e.style.position="absolute",e.style.top=0,e.style.left=0,t.$container.appendChild(e),t.$canvasElement=e,t.$container.style.overflow="hidden","absolute"!==t.$container.style.position&&(t.$container.style.position="relative");if(!t._supportOffscreen()){const e=(()=>{const e=t.$canvasElement;let r=null;const i=["webgl","experimental-webgl","moz-webgl","webkit-3d"];let n=0;for(;!r&&n{t._contextGL&&(t._contextGL=null),t._contextGLRender&&(t._contextGLRender=null),t._bitmaprenderer&&(t._bitmaprenderer=null)}},r(a,"default",(function(){return h}))}function l(){return u||(u=!0,f()),a}var d,c,p,m,g,v,b,y=!1;function w(){return y||(y=!0,c={videoBuffer:.5,vod:!1,isResize:!0,isFullSize:!1,isFlv:!1,debug:!1,timeout:30,supportDblclickFullscreen:!1,showBandwidth:!1,keepScreenOn:!1,isNotMute:!1,hasAudio:!0,operateBtns:{fullscreen:!1,screenshot:!1,play:!1,audio:!1},loadingText:"",background:"",decoder:"index.js",rotate:0,text:"",forceNoOffscreen:!0,hiddenAutoPause:!1},r(d={},"DEFAULT_OPTIONS",(function(){return c})),p={init:"init",initSize:"initSize",render:"render",playAudio:"playAudio",print:"print",printErr:"printErr",initAudioPlanar:"initAudioPlanar",kBps:"kBps"},r(d,"CMD_TYPE",(function(){return p})),m={close:"close",play:"play",setVideoBuffer:"setVideoBuffer",init:"init"},r(d,"POST_MESSAGE",(function(){return m})),g={fullscreen:"fullscreen",play:"play",pause:"pause",mute:"mute",load:"load",videoInfo:"videoInfo",timeUpdate:"timeUpdate",audioInfo:"audioInfo",log:"log",error:"error",kBps:"kBps",timeout:"timeout",stats:"stats",performance:"performance",record:"record",buffer:"buffer",videoFrame:"videoFrame",start:"start",metadata:"metadata"},r(d,"EVEMTS",(function(){return g})),v={empty:"empty",buffering:"buffering",full:"full"},r(d,"BUFFER_STATUS",(function(){return v})),b={download:"download",base64:"base64",blob:"blob"},r(d,"SCREENSHOT_TYPE",(function(){return b}))),d}var M,_=!1;function A(t){t.resume();const e=t.createBufferSource();e.buffer=t.createBuffer(1,1,22050),e.connect(t.destination),e.noteOn?e.noteOn(0):e.start(0)}function E(t,e){t&&(t.style.display=e?"block":"none")}function S(t=""){const e=t.split(","),r=atob(e[1]),i=e[0].replace("data:","").replace(";base64","");let n=r.length,o=new Uint8Array(n);for(;n--;)o[n]=r.charCodeAt(n);return new File([o],"file",{type:i})}function k(t,e){const r=document.createElement("a");r.download=e,r.href=URL.createObjectURL(t),r.click(),URL.revokeObjectURL(t)}function B(t){if(null==t||""===t)return"0 KB/S";let e=parseFloat(t);return e=e.toFixed(2),e+"KB/S"}function R(t){let e=0;return t>=24?e=2:t>=15&&(e=1),e}function T(t,e){Object.keys(e||{}).forEach((function(r){t.style[r]=e[r]}))}function x(){let t=document.fullscreenElement||window.webkitFullscreenElement||document.msFullscreenElement;return void 0===t&&(t=!1),!!t}function I(){}function C(){return(new Date).getTime()}function P(t){Object.keys(t||{}).forEach((e=>{"bgDom"!==e&&E(t[e],!1)}))}function D(t){E(t.pauseDom,!0),E(t.screenshotsDom,!0),E(t.fullscreenDom,!0),E(t.quietAudioDom,!0),E(t.textDom,!0),E(t.speedDom,!0),E(t.recordDom,!0),E(t.loadingDom,!1),E(t.playDom,!1),E(t.playBigDom,!1),E(t.bgDom,!1)}function L(t,e){let r=w().BUFFER_STATUS.buffering;return 0===t?r=w().BUFFER_STATUS.empty:t>=e&&(r=w().BUFFER_STATUS.full),r}function O(){return _||(_=!0,M={},w(),r(M,"audioContextUnlock",(function(){return A})),r(M,"$domToggle",(function(){return E})),r(M,"dataURLToFile",(function(){return S})),r(M,"downloadImg",(function(){return k})),r(M,"bpsSize",(function(){return B})),r(M,"fpsStatus",(function(){return R})),r(M,"setStyle",(function(){return T})),r(M,"checkFull",(function(){return x})),r(M,"noop",(function(){return I})),r(M,"now",(function(){return C})),r(M,"$hideBtns",(function(){return P})),r(M,"$initBtns",(function(){return D})),r(M,"bufferStatus",(function(){return L}))),M}var j,U,N=!1;function z(){return N||(N=!0,j={},O(),U=t=>{t._audioContext=new(window.AudioContext||window.webkitAudioContext),t._gainNode=t._audioContext.createGain(),t._audioEnabled=e=>{e?(O().audioContextUnlock(t._audioContext),t._audioEnabled=e=>{e?t._audioContext.resume():t._audioContext.suspend()},t._audioContext.resume()):t._audioContext.suspend()},t._audioEnabled(!0),t._mute=()=>{t._audioEnabled(!1),t.quieting=!0},t._cancelMute=()=>{t._audioEnabled(!0),t.quieting=!1},t._audioResume=()=>{t._cancelMute()},t._initAudioPlanar=e=>{const r=t._audioContext;if(!r)return!1;let i=[];const n=r.createScriptProcessor(1024,0,2);n.onaudioprocess=function(t){if(i.length){const r=i.shift();for(let i=0;i{n.disconnect(t._gainNode),t._gainNode.disconnect(r.destination),delete t._closeAudio,i=[]},t._gainNode.connect(r.destination),t._playAudio=t=>i.push(t)},t._destroyAudioContext=()=>{t._audioContext.close(),t._audioContext=null,t._gainNode=null}},r(j,"default",(function(){return U}))),j}var q,F,Z=!1;function H(){return Z||(Z=!0,q={},O(),F=t=>{t._resize$2=()=>t.resize(),t._handleVisibilityChange$2=()=>t._handleVisibilityChange(),t._onfullscreenchange$2=()=>t._onfullscreenchange(),t._handleWakeLock$2=()=>t._handleWakeLock(),window.addEventListener("resize",t._resize$2),window.addEventListener("fullscreenchange",t._onfullscreenchange$2),document.addEventListener("visibilitychange",t._handleVisibilityChange$2),document.addEventListener("visibilitychange",t._handleWakeLock$2),window.addEventListener("fullscreenchange",t._handleWakeLock$2),t._opt.supportDblclickFullscreen&&t.$canvasElement.addEventListener("dblclick",(()=>{t.fullscreen=!t.fullscreen}),!1),t._removeEventListener=()=>{window.removeEventListener("resize",t._resize$2),window.removeEventListener("fullscreenchange",t._onfullscreenchange$2),document.removeEventListener("visibilitychange",t._handleWakeLock$2),document.removeEventListener("visibilitychange",t._handleVisibilityChange$2),window.removeEventListener("fullscreenchange",t._handleWakeLock$2)},t.$doms.playDom&&t.$doms.playDom.addEventListener("click",(e=>{e.stopPropagation(),t._play()}),!1),t.$doms.playBigDom&&t.$doms.playBigDom.addEventListener("click",(e=>{e.stopPropagation(),t._play()}),!1),t.$doms.pauseDom&&t.$doms.pauseDom.addEventListener("click",(e=>{e.stopPropagation(),t._pause()}),!1),t.$doms.screenshotsDom&&t.$doms.screenshotsDom.addEventListener("click",(e=>{e.stopPropagation();const r=(t._opt.text||"")+""+O().now();t._screenshot(r)}),!1),t.$doms.fullscreenDom&&t.$doms.fullscreenDom.addEventListener("click",(e=>{e.stopPropagation(),t.fullscreen=!0}),!1),t.$doms.minScreenDom&&t.$doms.minScreenDom.addEventListener("click",(e=>{e.stopPropagation(),t.fullscreen=!1}),!1),t.$doms.recordDom&&t.$doms.recordDom.addEventListener("click",(e=>{e.stopPropagation(),t.recording=!0}),!1),t.$doms.recordingDom&&t.$doms.recordingDom.addEventListener("click",(e=>{e.stopPropagation(),t.recording=!1}),!1),t.$doms.quietAudioDom&&t.$doms.quietAudioDom.addEventListener("click",(e=>{e.stopPropagation(),t._cancelMute()}),!1),t.$doms.playAudioDom&&t.$doms.playAudioDom.addEventListener("click",(e=>{e.stopPropagation(),t._mute()}),!1),t._enableWakeLock()},r(q,"default",(function(){return F}))),q}var K,W,G=!1;function Y(){return G||(G=!0,K={},O(),H(),W=t=>{t._showControl=()=>{let e=!1,r=!1;return Object.keys(t._opt.operateBtns).forEach((e=>{t._opt.operateBtns[e]&&(r=!0)})),(t._opt.showBandwidth||t._opt.text||r)&&(e=!0),e};const e={},r=document.createDocumentFragment(),i=document.createElement("div"),n=document.createElement("div"),o=document.createElement("div"),s=document.createElement("div"),a=document.createElement("div"),h=document.createElement("div"),u=document.createElement("div"),f=document.createElement("div"),l=document.createElement("div"),d=document.createElement("div"),c=document.createElement("div"),p=document.createElement("div"),m=document.createElement("div"),g=document.createElement("div"),v=document.createElement("div"),b=document.createElement("div"),y=document.createElement("div"),w=document.createElement("div");m.innerText=t._opt.loadingText||"",s.innerText=t._opt.text||"",a.innerText="",h.title="播放",f.title="暂停",l.title="截屏",d.title="全屏",c.title="退出全屏",g.title="静音",v.title="取消静音",b.title="录制",y.title="取消录制";let M={position:"absolute",width:"100%",height:"100%"};t._opt.background&&(M=Object.assign({},M,{backgroundRepeat:"no-repeat",backgroundPosition:"center",backgroundSize:"100%",backgroundImage:"url('"+t._opt.background+"')"}));const _={position:"absolute",width:"100%",height:"100%",textAlign:"center",color:"#fff",display:"none",backgroundImage:"url('data:image/gif;base64,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')",backgroundRepeat:"no-repeat",backgroundPosition:"center",backgroundSize:"40px 40px"},A={position:"absolute",width:"100%",height:"100%",display:"none",background:"rgba(0,0,0,0.4)",backgroundImage:"url('data:image/png;base64,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')",backgroundRepeat:"no-repeat",backgroundPosition:"center",backgroundSize:"48px 48px",cursor:"pointer"},E={position:"absolute",top:0,height:"100%",display:"flex",alignItems:"center"},S={display:"none",position:"relative",fontSize:"13px",color:"#fff",lineHeight:"20px",marginLeft:"5px",marginRight:"5px",userSelect:"none"},k={display:"none",position:"relative",width:"16px",height:"16px",marginLeft:"8px",marginRight:"8px",backgroundRepeat:"no-repeat",backgroundPosition:"center",backgroundSize:"100%",cursor:"pointer"};O().setStyle(w,M),O().setStyle(i,{height:"38px",zIndex:11,position:"absolute",left:0,bottom:0,width:"100%",background:"rgba(0,0,0)"}),O().setStyle(p,_),O().setStyle(u,A),O().setStyle(m,{position:"absolute",width:"100%",top:"60%",textAlign:"center"}),O().setStyle(n,Object.assign({},E,{left:0})),O().setStyle(o,Object.assign({},E,{right:0})),O().setStyle(s,S),O().setStyle(a,S),O().setStyle(h,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAARVJREFUSMe9laEOglAUhs+5k9lJFpsJ5QWMJoNGbEY0mEy+gr6GNo0a3SiQCegMRILzGdw4hl+Cd27KxPuXb2zA/91z2YXoGRERkX4fvN3A2QxUiv4dFM3n8jZRBLbbVfd+ubJuF4xjiCyXkksueb1uSKCIZYGLBTEx8ekEoV7PkICeVgs8HiGyXoO2bUigCDM4HoPnM7bI8wwJ6Gk0sEXbLSay30Oo2TQkoGcwgFCSQMhxDAvoETEscDiQkJC4LjMz8+XyZ4HrFYWjEQqHQ1asWGWZfmdFAsVINxuw00HhbvfpydpvxWkKTqdYaRCUfUPJCdzv4Gr1uqfli0tOIAzByUT/iCrL6+84y3Bw+D6ui5Ou+jwA8FnIO++FACgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEl0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvYm9mYW5nLnN2Z8fICi0AAAAASUVORK5CYII=')"})),O().setStyle(f,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAHVJREFUSMftkCESwCAMBEOnCtdXVMKHeC7oInkEeQJXkRoEZWraipxZc8lsQqQZBACAlIS1oqGhhTCdu3oyxyyMcdRf79c5J7SWDBky+z4173rbJvR+VF/e/qwKqIAKqMBDgZyFzAQCoZTpxq7HLDyOrw/9b07l3z4dDnI2IAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMIo/vCcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDD7YgSbAAAASnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9nZjcwMHM3YjNmdy96YW50aW5nLnN2ZxqNZJkAAAAASUVORK5CYII=')"})),O().setStyle(l,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAaxJREFUSMfNlLFOAkEQhmevAZMjR6OGRBJKsFBzdkYNpYSaWkopIOFRCBWh1ieA+ALGRgutjK0HzV2H5SX7W/zsmY3cnTEhcZovOzcz9+/s7Ir8d4OGht7fBwAgjvEri2OTl1ffSf0xAMBxRIkS1e3Se3+vcszEMe/6OqmT/aN2m1wsNu/o5YVsNHI7BgA4PCRfXzfXCwKy1RLbcXZG9nrkzc12jvT8nPU/PtatOThgAx8fuS4WyZ0de2e+T87n5OcnuVqRsxl5cpImQDnKUc7DA1fVqpimZCu+vCSjiNH9PlmpJNTQ0INBErfeafZRAakC6FWKfH9nwU7H/l6rGdqCOx3y7c3U+aOARsMMp+1vNskwTLjulB23XJL1epqA9OshIiKeJxAIoug7UyA4OuLi6Ynr52deu+NjOy4MSc9Ln8rMDpTLybBpaOjdXbJUIqdTm8a/t2fn/RSQewR24HicTLmGhnbdzcPquvYtGY3+PIR24UKBUXd35v6Sk4lN47+9NXm/FBAEedfGTjw9JYdDm76fm6+hoS8ujGAxT6L9Im7bTKeurvIEb92+AES1b6x283XSAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABJdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2NhbWVyYS5zdmeyubWEAAAAAElFTkSuQmCC')"})),O().setStyle(d,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAALZJREFUSMftVbsORUAQVSj8DomChvh3lU5CoSVCQq2RObeYu8XG3deVoHCak81kds7Oaz3vxRcAAMwztOg6vX9d6/3XFQQC+b7iAoFhYE7Tvx9EIFAcy/ftO3MQGAQkCfM4MmeZWyajiLnvmYuCeduMAuSzvRBVYNluFHCssSgFp7Sq9ALKkjnPf9ubRtkDL27HNT3QtsY9cAjsNAVheHIKBOwD2wpxFHDbJpwmaHH2L1iWx+2BDy8RbXXtqbRBAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABTdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3F1YW5waW5nenVpZGFodWEuc3ZnTBoI7AAAAABJRU5ErkJggg==')"})),O().setStyle(c,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAYJJREFUSMfdVbGKwkAQnQn+geAfWBixUTsVgp3YGKxSWflVNmIjARULwc5KO40ipNHWRgs/wGLniucKa+Jd5ODuuGle5u3szGRmd5bor4iIiMhuB3Sc+HXXBdp2/Lpta7v4dccRJUrUdhtNQIkSVa3C8HwG1uumg34f2OnEB+h0tF1Sv5b+YIsttpZLEhKSdhvscPi8IXFF74GJiYnHY7Cex8zMvFgkbInjmJnv98kqoO30vmhLtaRMB60WtEbDNDudgMUiKiQSzfjOMzFxoQAyCPSfw7/nQZ/PUYnpNGV6OR6BmYzJbzYIoBQCzGaRBDQvJCTdLnTLolg5HN5t6f8V1h/oUT4PrVKJWBotmEzQw+vV3J9Ow851P2/BaoX9Yfh0BrJZYKlk8uUyHOpDeLuBHwzMBJtN2PV6IPUhXK9Nf5cLMAxfluanrmGkRBggtRo03wfq66P/6CsJAnOg+f6rgfZI4BGYiYlHIx048eR6krcnq34kkj1GuVz8+jceo9+SD5A8yGh8CTq7AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABNdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3p1aXhpYW9odWEuc3ZnoCFr0AAAAABJRU5ErkJggg==')"})),O().setStyle(g,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAR9JREFUSMfVlD0LglAYhe9VkwgNihpsjbYQf4JTS7+iuaGxpcGfJjS0NFRLk2NDi6MogafhJGRIX9yEzvJwrx/nvPd9VYh/F3LkyBuN2g3J1QoAgCQhPe/Hxq5Lo+0WlfJ9dYYAgGaTDAIyy/BUnwcwWJlhcLnZkN2ugIBAuy2kkEL2ep8F73S4kjfFcfn6cMj9KLodrWVBiXyf75tMyOOR+4MBOZ8XLXzorboA5UpnM/J0Ivd7+vX7xX2asqGpVKtFXi5sqWmypXefrfIWAACmU/JwKCoun8hu9zA0uk6u13wgirg+n7+bAcsibbt6SB3n9TQXPxwAwHJJpum7M6BcDDQa0SgMaw9QPkJNIxcLMo4ZcDz+eYDqQFLWbqxKV57EtW1WtMbmAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2ppbmd5aW4uc3ZnIlMYaQAAAABJRU5ErkJggg==')"})),O().setStyle(v,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAU5JREFUSMftkzGKwlAURf9PULBQwULSCKK1bZAgNuoaFFyAC3AdZg0uQCwshWzAShEEO7Gy0soUCu9Occ3An5nMGCfdzGsO7+Xy3/03iVL/lbAAACiVIBCI77O37Vi9QCDZbEqLm03ycEBUAoHk818v7nYpul5Jz4tf8HBKYa1mcjwmbzd8rG8NFIsU7ffk8UjmcjE3XK+RtB4G2PT75GbDeblMttumfjSKMRCGLxsQCKTReE9KIJDJxDw/SmKxiOZWWh+ntrSlre2WXRAorbTSrZapip7X66kbMKtQUFBQCENznsmQ93vqBhh5r8fO85jAcsnIrcce1yV3uxgD8zl5uZgU+dGBVlrp6GbTKRPwffaDAek45Gz2/M0AAJ0OeTol+w0rFYrOZ3K1MhNJEjEAwHF4cBA8Z8B1zcXV6msv+JMR2yaHQ1LrXx/8Z+sNRxsWcwZeb6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEt0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvc2hlbmd5aW4uc3ZnFog1MQAAAABJRU5ErkJggg==')"})),O().setStyle(b,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAPRJREFUSMflVDEOwjAQO0e8gr2sZYVunREbD6ISfAgmkBjpC/hBEQ+AtTWD6QAI0gBlqRfLp+TiXC5n1nXgMUCS5HBoNBqj6IOMMFwuEpsNAABl6d3HihWrOJaBsuRPkGW+c929HAxuYefb6L+R0ZgkMrJYiItCnCT1sl5Y1jwXj0bNniJNJWqujfX7LyrwJh8AYDxWgulU0dPp20IFlxoODm61kpE4VnS9/puBXyPYgH7LbKY3PhwUnUw+NdC4CdW9+71UgyZspwIBB9No3O0klktxUahyx+Pz+lYG0Xzu84lXRqTqwRQAGAzns8R223gUdxZXGcAK5Hp0ClIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvbHV6aGlzaGlwaW4uc3Zn5Zd7GQAAAABJRU5ErkJggg==')"})),O().setStyle(y,Object.assign({},k,{backgroundImage:"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAahJREFUSMdjYBjpgBFd4NZK+f+soQYG//T+yzFuUFUl2cApjEWM/758UZvysPDn3127GBkZGBgY/v4l6ICb9xTWsRbp6/9f9W8N44Jz5xgCGI4wfGFiIttrR/5n/3/U3KyR8rj8t0RdHS5lcAv+//yXzzhZTY1ii2FAmsGZocna+maD3GnWY62tNzbJBbDOffLkxie5eJYwa2uYMhaigzb2/zyGguPH/y9mTGKYYGlJUIMiYxDjHCen/4oMDAxznJzg4k8Z/jP+l5LCCAFCQP30Y5dfXVZWDI7/zzIs8PNjNGJ4/7/r+XNKA4rkoNZ4/lj0V9TmzUxJv0J+F+jrM3YyvPq/acsWujmA2oBkB9y4LifLxhoa+teAzYFtwtWr/8sZxBj9fHxo7oCbprJ72MqOHWNgZGBkYFy1isGGoZahTFSU0hAgOhcQnfph4P7/df9T9u1jPMn4nyHmxIn/bAzLGe7GxTHsZyj+f+zpUwYGBmmG6bQsiMr+L/v/rqlJY9Njm9889fW4lGEUxXCHwAomUgH3vxBG8c+f1WWf9P98sns3oaJ4FAAAbtWqHTT84QYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6MzU6MjMrMDg6MDBLHbvEAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjM1OjIzKzA4OjAwOkADeAAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fcTM1YTFhNHBtY2MvbHV6aGlzaGlwaW4uc3Zn6xlv1QAAAABJRU5ErkJggg==')"})),p.appendChild(m),t._opt.text&&(n.appendChild(s),e.textDom=s),t._opt.showBandwidth&&(n.appendChild(a),e.speedDom=a),t._opt.operateBtns.record&&(o.appendChild(y),o.appendChild(b),e.recordingDom=y,e.recordDom=b),t._opt.operateBtns.screenshot&&(o.appendChild(l),e.screenshotsDom=l),t._opt.operateBtns.play&&(o.appendChild(h),o.appendChild(f),e.playDom=h,e.pauseDom=f),t._opt.operateBtns.audio&&(o.appendChild(v),o.appendChild(g),e.playAudioDom=v,e.quietAudioDom=g),t._opt.operateBtns.fullscreen&&(o.appendChild(d),o.appendChild(c),e.fullscreenDom=d,e.minScreenDom=c),i.appendChild(n),i.appendChild(o),r.appendChild(w),e.bgDom=w,r.appendChild(p),e.loadingDom=p,t._showControl()&&r.appendChild(i),t._opt.operateBtns.play&&(r.appendChild(u),e.playBigDom=u),t.$container.appendChild(r),t.$doms=e,t._removeContainerChild=()=>{for(;t.$container.firstChild;)t.$container.removeChild(t.$container.firstChild)},H().default(t),O().$hideBtns(t.$doms),t._opt.isNotMute||t._mute()},r(K,"default",(function(){return W}))),K}var V,$,X=!1;function J(){return X||(X=!0,V={},w(),O(),$=t=>{const e=new Worker(t._opt.decoder);e.onmessage=r=>{const i=r.data;switch(i.cmd){case w().CMD_TYPE.init:t.setBufferTime(t._opt.videoBuffer),e.postMessage({cmd:w().POST_MESSAGE.init,opt:JSON.stringify(t._opt),sampleRate:t._audioContext.sampleRate}),t._hasLoaded||(t._hasLoaded=!0,t.onLoad(),t._trigger(w().EVEMTS.load));break;case w().CMD_TYPE.initSize:t.$canvasElement.width=i.w,t.$canvasElement.height=i.h,t.onInitSize(),t._resize(),t._trigger(w().EVEMTS.videoInfo,{w:i.w,h:i.h}),t._trigger(w().EVEMTS.start),t._supportOffscreen()&&(t._bitmaprenderer=t.$canvasElement.getContext("bitmaprenderer"));break;case w().CMD_TYPE.render:t.loading&&(t.loading=!1,t.playing=!0,t._clearCheckLoading()),t.playing&&(t._supportOffscreen()?t._bitmaprenderer.transferFromImageBitmap(i.buffer):t._contextGLRender(t.$canvasElement.width,t.$canvasElement.height,i.output[0],i.output[1],i.output[2])),t._trigger(w().EVEMTS.timeUpdate,i.ts),t.onTimeUpdate(i.ts),t._updateStats({buf:i.delay,ts:i.ts}),t._checkHeart();break;case w().CMD_TYPE.playAudio:t.playing&&!t.quieting&&t._playAudio(i.buffer);break;case w().CMD_TYPE.print:t.onLog(i.text),t._trigger(w().EVEMTS.log,i.text);break;case w().CMD_TYPE.printErr:t.onLog(i.text),t._trigger(w().EVEMTS.log,i.text),t.onError(i.text),t._trigger(w().EVEMTS.error,i.text);break;case w().CMD_TYPE.initAudioPlanar:t._initAudioPlanar(i),t._trigger(w().EVEMTS.audioInfo,{numOfChannels:i.channels,sampleRate:i.samplerate});break;case w().CMD_TYPE.kBps:t.playing&&(t.$doms.speedDom&&(t.$doms.speedDom.innerText=O().bpsSize(i.kBps)),t._trigger(w().EVEMTS.kBps,i.kBps));default:t[i.cmd]&&t[i.cmd](i)}},t._decoderWorker=e},r(V,"default",(function(){return $}))),V}var Q,tt,et=!1;function rt(){return et||(et=!0,Q={},O(),w(),tt=t=>{t._loading=!0,t._recording=!1,t._playing=!1,t._audioPlaying=!1,t._quieting=!1,t._fullscreen=!1,t._stats={buf:0,fps:0,abps:"",vbps:"",ts:""},t._hasLoaded=!1,t._playUrl="",t._startBpsTime="",t._bps=0,t._checkHeartTimeout=null,t._wakeLock=null,t._contextGL=null,t._contextGLRender=null,t._checkLoadingTimeout=null,t._bitmaprenderer=null,t._isPlayingBeforePageHidden=!1,t._initCheckVariable=()=>{t._startBpsTime="",t._bps=0,t._clearCheckHeartTimeout(),t._clearCheckLoading()},t._clearCheckHeartTimeout=()=>{t._checkHeartTimeout&&(clearTimeout(t._checkHeartTimeout),t._checkHeartTimeout=null)},t._startCheckHeartTimeout=()=>{t._checkHeartTimeout=setTimeout((function(){t._trigger(w().EVEMTS.timeout),t.recording=!1,t.playing=!1,t._close()}),1e3*t._opt.timeout)},t._clearCheckLoading=()=>{t._checkLoadingTimeout&&(clearTimeout(t._checkLoadingTimeout),t._checkLoadingTimeout=null)},t._checkLoading=()=>{t._clearCheckLoading(),t._checkLoadingTimeout=setTimeout((()=>{t._trigger(w().EVEMTS.timeout),t.playing=!1,t._close(),O().$domToggle(t.$doms.loadingDom,!1)}),1e3*t._opt.timeout)}},r(Q,"default",(function(){return tt}))),Q}var it,nt,ot=!1;function st(){return ot||(ot=!0,it={},O(),nt=t=>{t.onPlay=O().noop,t.onPause=O().noop,t.onRecord=O().noop,t.onFullscreen=O().noop,t.onMute=O().noop,t.onLoad=O().noop,t.onLog=O().noop,t.onError=O().noop,t.onTimeUpdate=O().noop,t.onInitSize=O().noop},r(it,"default",(function(){return nt}))),it}var at,ht,ut=!1;function ft(){return ut||(ut=!0,ht=t=>{t._on=(e,r)=>{let i,n,o;if(!r)return t;for(i=t.__events||(t.__events={}),e=e.split(/\s+/);n=e.shift();)o=i[n]||(i[n]=[]),o.push(r);return t},t._off=()=>{let e;return(e=t.__events)?(delete t.__events,t):t},t._trigger=(e,...r)=>{function i(t,e){if(t)for(let r=0,i=t.length;r{t._pause=()=>{t._close(),t.loading&&O().$domToggle(t.$doms.loadingDom,!1),t.recording=!1,t.playing=!1},t._play=e=>{if(!t._playUrl&&!e)return;let r=!1;e?(t._playUrl&&(t._close(),r=!0,t.clearView()),t.loading=!0,O().$domToggle(t.$doms.bgDom,!1),t._checkLoading(),t._playUrl=e):t._playUrl&&(t.loading?(O().$hideBtns(t.$doms),O().$domToggle(t.$doms.fullscreenDom,!0),O().$domToggle(t.$doms.pauseDom,!0),O().$domToggle(t.$doms.loadingDom,!0),t._checkLoading()):t.playing=!0),t._initCheckVariable(),r?setTimeout((()=>{t._decoderWorker.postMessage({cmd:w().POST_MESSAGE.play,url:t._playUrl})}),300):t._decoderWorker.postMessage({cmd:w().POST_MESSAGE.play,url:t._playUrl})},t._screenshot=(e,r,i,n)=>{e=e||O().now(),n=n||w().SCREENSHOT_TYPE.download;const o={png:"image/png",jpeg:"image/jpeg",webp:"image/webp"};let s=.92;!o[r]&&w().SCREENSHOT_TYPE[r]&&(n=r,r="png",i=void 0),"string"==typeof i&&(n=i,i=void 0),void 0!==i&&(s=Number(i));const a=t.$canvasElement.toDataURL(o[r]||o.png,s),h=O().dataURLToFile(a);return n===w().SCREENSHOT_TYPE.base64?a:n===w().SCREENSHOT_TYPE.blob?h:void(n===w().SCREENSHOT_TYPE.download&&O().downloadImg(h,e))},t._close=()=>{t._close$2(),t._clearView()},t._close$2=()=>{t._opt.debug&&console.log("_close$2-START"),t._closeAudio&&t._closeAudio(),t._audioPlayBuffers=[],t._audioPlaying=!1,t._decoderWorker.postMessage({cmd:w().POST_MESSAGE.close}),delete t._playAudio,t._releaseWakeLock(),t._initCheckVariable(),t._opt.debug&&console.log("_close$2-END")},t._releaseWakeLock=()=>{t._wakeLock&&(t._wakeLock.release(),t._wakeLock=null)},t._clearView=()=>{t._contextGL&&t._contextGL.clear(t._contextGL.COLOR_BUFFER_BIT)},t._resize=()=>{let e=t.$container.clientWidth,r=t.$container.clientHeight;t._showControl()&&(r-=38);let i=t.$canvasElement.width,n=t.$canvasElement.height;const o=t._opt.rotate;let s=(e-i)/2,a=(r-n)/2;270!==o&&90!==o||(i=t.$canvasElement.height,n=t.$canvasElement.width);let h=e/i,u=r/n,f=h>u?u:h;t._opt.isResize||h!==u&&(f=h+","+u),t._opt.isFullResize&&(f=h>u?h:u);let l="scale("+f+")";o&&(l+=" rotate("+o+"deg)"),t.$canvasElement.style.transform=l,t.$canvasElement.style.left=s+"px",t.$canvasElement.style.top=a+"px"},t._enableWakeLock=()=>{t._opt.keepScreenOn&&"wakeLock"in navigator&&navigator.wakeLock.request("screen").then((e=>{t._wakeLock=e}))},t._supportOffscreen=()=>!t._opt.forceNoOffscreen&&"function"==typeof t.$canvasElement.transferControlToOffscreen,t._checkHeart=()=>{t._clearCheckHeartTimeout(),t._startCheckHeartTimeout()},t._updateStats=e=>{e=e||{},t._startBpsTime||(t._startBpsTime=O().now());const r=O().now();r-t._startBpsTime<1e3?t._stats.fps+=1:(t._stats.ts=e.ts,t._stats.buf=e.buf,t._trigger(w().EVEMTS.stats,t._stats),t._trigger(w().EVEMTS.performance,O().fpsStatus(t._stats.fps)),t._trigger(w().EVEMTS.buffer,O().bufferStatus(t._stats.buf,1e3*t._opt.videoBuffer)),t._stats.fps=0,t._startBpsTime=r)},t._onfullscreenchange=()=>{t.fullscreen=O().checkFull()},t._handleVisibilityChange=()=>{t._opt.hiddenAutoPause&&(t._opt.debug&&console.log(document.visibilityState,t._isPlayingBeforePageHidden),"visible"===document.visibilityState?t._isPlayingBeforePageHidden&&t._play():(t._isPlayingBeforePageHidden=t.playing,t.playing&&t._pause()))},t._handleWakeLock=()=>{null!==t._wakeLock&&"visible"===document.visibilityState&&t._enableWakeLock()}},r(lt,"default",(function(){return dt}))),lt}var mt,gt,vt=!1;function bt(){return vt||(vt=!0,mt={},rt(),st(),ft(),pt(),gt=t=>{rt().default(t),st().default(t),ft().default(t),pt().default(t)},r(mt,"default",(function(){return gt}))),mt}var yt,wt=!1;var Mt,_t,At,Et,St,kt,Bt,Rt,Tt=!1;function xt(){throw new Error("setTimeout has not been defined")}function It(){throw new Error("clearTimeout has not been defined")}function Ct(t){if(At===setTimeout)return setTimeout(t,0);if((At===xt||!At)&&setTimeout)return At=setTimeout,setTimeout(t,0);try{return At(t,0)}catch(e){try{return At.call(null,t,0)}catch(e){return At.call(this,t,0)}}}function Pt(){kt&&Bt&&(kt=!1,Bt.length?St=Bt.concat(St):Rt=-1,St.length&&Dt())}function Dt(){if(!kt){var t=Ct(Pt);kt=!0;for(var e=St.length;e;){for(Bt=St,St=[];++Rt1)for(var r=1;r0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function Yt(t){var e,r,i=Gt(t),n=i[0],o=i[1],s=new Ft(function(t,e,r){return 3*(e+r)/4-r}(0,n,o)),a=0,h=o>0?n-4:n;for(r=0;r>16&255,s[a++]=e>>8&255,s[a++]=255&e;return 2===o&&(e=qt[t.charCodeAt(r)]<<2|qt[t.charCodeAt(r+1)]>>4,s[a++]=255&e),1===o&&(e=qt[t.charCodeAt(r)]<<10|qt[t.charCodeAt(r+1)]<<4|qt[t.charCodeAt(r+2)]>>2,s[a++]=e>>8&255,s[a++]=255&e),s}function Vt(t,e,r){for(var i,n,o=[],s=e;s>18&63]+zt[n>>12&63]+zt[n>>6&63]+zt[63&n]);return o.join("")}function $t(t){for(var e,r=t.length,i=r%3,n=[],o=16383,s=0,a=r-i;sa?a:s+o));return 1===i?(e=t[r-1],n.push(zt[e>>2]+zt[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],n.push(zt[e>>10]+zt[e>>4&63]+zt[e<<2&63]+"=")),n.join("")}function Xt(){return Wt||(Wt=!0,function(){for((Ut={}).toByteArray=Yt,Nt=$t,Ut.fromByteArray=Nt,zt=[],qt=[],Ft="undefined"!=typeof Uint8Array?Uint8Array:Array,Ht=0,Kt=(Zt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/").length;Ht*/ -(Jt={}).read=function(t,e,r,i,n){var o,s,a=8*n-i-1,h=(1<>1,f=-7,l=r?n-1:0,d=r?-1:1,c=t[e+l];for(l+=d,o=c&(1<<-f)-1,c>>=-f,f+=a;f>0;o=256*o+t[e+l],l+=d,f-=8);for(s=o&(1<<-f)-1,o>>=-f,f+=i;f>0;s=256*s+t[e+l],l+=d,f-=8);if(0===o)o=1-u;else{if(o===h)return s?NaN:1/0*(c?-1:1);s+=Math.pow(2,i),o-=u}return(c?-1:1)*s*Math.pow(2,o-i)},Qt=function(t,e,r,i,n,o){var s,a,h,u=8*o-n-1,f=(1<>1,d=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,c=i?0:o-1,p=i?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=f):(s=Math.floor(Math.log(e)/Math.LN2),e*(h=Math.pow(2,-s))<1&&(s--,h*=2),(e+=s+l>=1?d/h:d*Math.pow(2,1-l))*h>=2&&(s++,h/=2),s+l>=f?(a=0,s=f):s+l>=1?(a=(e*h-1)*Math.pow(2,n),s+=l):(a=e*Math.pow(2,l-1)*Math.pow(2,n),s=0));n>=8;t[r+c]=255&a,c+=p,a/=256,n-=8);for(s=s<0;t[r+c]=255&s,c+=p,s/=256,u-=8);t[r+c-p]|=128*m},Jt.write=Qt),Jt}var re,ie,ne,oe,se,ae,he,ue,fe,le=!1;function de(t){if(t>se)throw new RangeError('The value "'+t+'" is invalid for option "size"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,ce.prototype),e}function ce(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return ge(t)}return pe(t,e,r)}function pe(t,e,r){if("string"==typeof t)return function(t,e){"string"==typeof e&&""!==e||(e="utf8");if(!ce.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|Me(t,e),i=de(r),n=i.write(t,e);n!==r&&(i=i.slice(0,n));return i}(t,e);if(ArrayBuffer.isView(t))return function(t){if(Ke(t,Uint8Array)){var e=new Uint8Array(t);return be(e.buffer,e.byteOffset,e.byteLength)}return ve(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(Ke(t,ArrayBuffer)||t&&Ke(t.buffer,ArrayBuffer))return be(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(Ke(t,SharedArrayBuffer)||t&&Ke(t.buffer,SharedArrayBuffer)))return be(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=t.valueOf&&t.valueOf();if(null!=i&&i!==t)return ce.from(i,e,r);var n=function(t){if(ce.isBuffer(t)){var e=0|ye(t.length),r=de(e);return 0===r.length||t.copy(r,0,0,e),r}if(void 0!==t.length)return"number"!=typeof t.length||We(t.length)?de(0):ve(t);if("Buffer"===t.type&&Array.isArray(t.data))return ve(t.data)}(t);if(n)return n;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return ce.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function me(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function ge(t){return me(t),de(t<0?0:0|ye(t))}function ve(t){for(var e=t.length<0?0:0|ye(t.length),r=de(e),i=0;i=se)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+se.toString(16)+" bytes");return 0|t}function we(t){return+t!=t&&(t=0),ce.alloc(+t)}function Me(t,e){if(ce.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||Ke(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);var r=t.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return Fe(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Ze(t).length;default:if(n)return i?-1:Fe(t).length;e=(""+e).toLowerCase(),n=!0}}function _e(t,e,r){var i=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Le(this,e,r);case"utf8":case"utf-8":return Ce(this,e,r);case"ascii":return Pe(this,e,r);case"latin1":case"binary":return De(this,e,r);case"base64":return Ie(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Oe(this,e,r);default:if(i)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),i=!0}}function Ae(t,e,r){var i=t[e];t[e]=t[r],t[r]=i}function Ee(t,e,r,i,n){if(0===t.length)return-1;if("string"==typeof r?(i=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),We(r=+r)&&(r=n?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(n)return-1;r=t.length-1}else if(r<0){if(!n)return-1;r=0}if("string"==typeof e&&(e=ce.from(e,i)),ce.isBuffer(e))return 0===e.length?-1:Se(t,e,r,i,n);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):Se(t,[e],r,i,n);throw new TypeError("val must be string, number or Buffer")}function Se(t,e,r,i,n){var o,s=1,a=t.length,h=e.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(t.length<2||e.length<2)return-1;s=2,a/=2,h/=2,r/=2}function u(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(n){var f=-1;for(o=r;oa&&(r=a-h),o=r;o>=0;o--){for(var l=!0,d=0;dn&&(i=n):i=n;var o=e.length;i>o/2&&(i=o/2);for(var s=0;s>8,n=r%256,o.push(n),o.push(i);return o}(e,t.length-r),t,r,i)}function Ie(t,e,r){return 0===e&&r===t.length?Xt().fromByteArray(t):Xt().fromByteArray(t.slice(e,r))}function Ce(t,e,r){r=Math.min(t.length,r);for(var i=[],n=e;n239?4:u>223?3:u>191?2:1;if(n+l<=r)switch(l){case 1:u<128&&(f=u);break;case 2:128==(192&(o=t[n+1]))&&(h=(31&u)<<6|63&o)>127&&(f=h);break;case 3:o=t[n+1],s=t[n+2],128==(192&o)&&128==(192&s)&&(h=(15&u)<<12|(63&o)<<6|63&s)>2047&&(h<55296||h>57343)&&(f=h);break;case 4:o=t[n+1],s=t[n+2],a=t[n+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(h=(15&u)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&h<1114112&&(f=h)}null===f?(f=65533,l=1):f>65535&&(f-=65536,i.push(f>>>10&1023|55296),f=56320|1023&f),i.push(f),n+=l}return function(t){var e=t.length;if(e<=he)return String.fromCharCode.apply(String,t);var r="",i=0;for(;ii)&&(r=i);for(var n="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function Ue(t,e,r,i,n,o){if(!ce.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||et.length)throw new RangeError("Index out of range")}function Ne(t,e,r,i,n,o){if(r+i>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function ze(t,e,r,i,n){return e=+e,r>>>=0,n||Ne(t,0,r,4),ee().write(t,e,r,i,23,4),r+4}function qe(t,e,r,i,n){return e=+e,r>>>=0,n||Ne(t,0,r,8),ee().write(t,e,r,i,52,8),r+8}function Fe(t,e){var r;e=e||1/0;for(var i=t.length,n=null,o=[],s=0;s55295&&r<57344){if(!n){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===i){(e-=3)>-1&&o.push(239,191,189);continue}n=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),n=r;continue}r=65536+(n-55296<<10|r-56320)}else n&&(e-=3)>-1&&o.push(239,191,189);if(n=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Ze(t){return Xt().toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(ue,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function He(t,e,r,i){for(var n=0;n=e.length||n>=t.length);++n)e[n+r]=t[n];return n}function Ke(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function We(t){return t!=t}function Ge(){re={},Xt(),ee(),ie="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null,ne=ce,re.Buffer=ne,oe=we,re.SlowBuffer=oe,50,re.INSPECT_MAX_BYTES=50,ae=se=2147483647,re.kMaxLength=ae,ce.TYPED_ARRAY_SUPPORT=function(){try{var t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}(),ce.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(ce.prototype,"parent",{enumerable:!0,get:function(){if(ce.isBuffer(this))return this.buffer}}),Object.defineProperty(ce.prototype,"offset",{enumerable:!0,get:function(){if(ce.isBuffer(this))return this.byteOffset}}),ce.poolSize=8192,ce.from=function(t,e,r){return pe(t,e,r)},Object.setPrototypeOf(ce.prototype,Uint8Array.prototype),Object.setPrototypeOf(ce,Uint8Array),ce.alloc=function(t,e,r){return function(t,e,r){return me(t),t<=0?de(t):void 0!==e?"string"==typeof r?de(t).fill(e,r):de(t).fill(e):de(t)}(t,e,r)},ce.allocUnsafe=function(t){return ge(t)},ce.allocUnsafeSlow=function(t){return ge(t)},ce.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==ce.prototype},ce.compare=function(t,e){if(Ke(t,Uint8Array)&&(t=ce.from(t,t.offset,t.byteLength)),Ke(e,Uint8Array)&&(e=ce.from(e,e.offset,e.byteLength)),!ce.isBuffer(t)||!ce.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;for(var r=t.length,i=e.length,n=0,o=Math.min(r,i);ni.length?ce.from(o).copy(i,n):Uint8Array.prototype.set.call(i,o,n);else{if(!ce.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n)}n+=o.length}return i},ce.byteLength=Me,ce.prototype._isBuffer=!0,ce.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e50&&(t+=" ... "),""},ie&&(ce.prototype[ie]=ce.prototype.inspect),ce.prototype.compare=function(t,e,r,i,n){if(Ke(t,Uint8Array)&&(t=ce.from(t,t.offset,t.byteLength)),!ce.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),e<0||r>t.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&e>=r)return 0;if(i>=n)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(n>>>=0)-(i>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),h=this.slice(i,n),u=t.slice(e,r),f=0;f>>=0,isFinite(r)?(r>>>=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}var n=this.length-e;if((void 0===r||r>n)&&(r=n),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return ke(this,t,e,r);case"utf8":case"utf-8":return Be(this,t,e,r);case"ascii":case"latin1":case"binary":return Re(this,t,e,r);case"base64":return Te(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return xe(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},ce.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},he=4096,ce.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||je(t,e,this.length);for(var i=this[t],n=1,o=0;++o>>=0,e>>>=0,r||je(t,e,this.length);for(var i=this[t+--e],n=1;e>0&&(n*=256);)i+=this[t+--e]*n;return i},ce.prototype.readUint8=ce.prototype.readUInt8=function(t,e){return t>>>=0,e||je(t,1,this.length),this[t]},ce.prototype.readUint16LE=ce.prototype.readUInt16LE=function(t,e){return t>>>=0,e||je(t,2,this.length),this[t]|this[t+1]<<8},ce.prototype.readUint16BE=ce.prototype.readUInt16BE=function(t,e){return t>>>=0,e||je(t,2,this.length),this[t]<<8|this[t+1]},ce.prototype.readUint32LE=ce.prototype.readUInt32LE=function(t,e){return t>>>=0,e||je(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ce.prototype.readUint32BE=ce.prototype.readUInt32BE=function(t,e){return t>>>=0,e||je(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ce.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||je(t,e,this.length);for(var i=this[t],n=1,o=0;++o=(n*=128)&&(i-=Math.pow(2,8*e)),i},ce.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||je(t,e,this.length);for(var i=e,n=1,o=this[t+--i];i>0&&(n*=256);)o+=this[t+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*e)),o},ce.prototype.readInt8=function(t,e){return t>>>=0,e||je(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ce.prototype.readInt16LE=function(t,e){t>>>=0,e||je(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},ce.prototype.readInt16BE=function(t,e){t>>>=0,e||je(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},ce.prototype.readInt32LE=function(t,e){return t>>>=0,e||je(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ce.prototype.readInt32BE=function(t,e){return t>>>=0,e||je(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ce.prototype.readFloatLE=function(t,e){return t>>>=0,e||je(t,4,this.length),ee().read(this,t,!0,23,4)},ce.prototype.readFloatBE=function(t,e){return t>>>=0,e||je(t,4,this.length),ee().read(this,t,!1,23,4)},ce.prototype.readDoubleLE=function(t,e){return t>>>=0,e||je(t,8,this.length),ee().read(this,t,!0,52,8)},ce.prototype.readDoubleBE=function(t,e){return t>>>=0,e||je(t,8,this.length),ee().read(this,t,!1,52,8)},ce.prototype.writeUintLE=ce.prototype.writeUIntLE=function(t,e,r,i){(t=+t,e>>>=0,r>>>=0,i)||Ue(this,t,e,r,Math.pow(2,8*r)-1,0);var n=1,o=0;for(this[e]=255&t;++o>>=0,r>>>=0,i)||Ue(this,t,e,r,Math.pow(2,8*r)-1,0);var n=r-1,o=1;for(this[e+n]=255&t;--n>=0&&(o*=256);)this[e+n]=t/o&255;return e+r},ce.prototype.writeUint8=ce.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,1,255,0),this[e]=255&t,e+1},ce.prototype.writeUint16LE=ce.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},ce.prototype.writeUint16BE=ce.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},ce.prototype.writeUint32LE=ce.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},ce.prototype.writeUint32BE=ce.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},ce.prototype.writeIntLE=function(t,e,r,i){if(t=+t,e>>>=0,!i){var n=Math.pow(2,8*r-1);Ue(this,t,e,r,n-1,-n)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},ce.prototype.writeIntBE=function(t,e,r,i){if(t=+t,e>>>=0,!i){var n=Math.pow(2,8*r-1);Ue(this,t,e,r,n-1,-n)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},ce.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},ce.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},ce.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},ce.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},ce.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||Ue(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},ce.prototype.writeFloatLE=function(t,e,r){return ze(this,t,e,!0,r)},ce.prototype.writeFloatBE=function(t,e,r){return ze(this,t,e,!1,r)},ce.prototype.writeDoubleLE=function(t,e,r){return qe(this,t,e,!0,r)},ce.prototype.writeDoubleBE=function(t,e,r){return qe(this,t,e,!1,r)},ce.prototype.copy=function(t,e,r,i){if(!ce.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),i||0===i||(i=this.length),e>=t.length&&(e=t.length),e||(e=0),i>0&&i=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o2){var h=i.lastIndexOf("/");if(h!==i.length-1){-1===h?(i="",n=0):n=(i=i.slice(0,h)).length-1-i.lastIndexOf("/"),o=a,s=0;continue}}else if(2===i.length||1===i.length){i="",n=0,o=a,s=0;continue}e&&(i.length>0?i+="/..":i="..",n=2)}else i.length>0?i+="/"+t.slice(o+1,a):i=t.slice(o+1,a),n=a-o-1;o=a,s=0}else 46===r&&-1!==s?++s:s=-1}return i}function tr(){return Xe||(Xe=!0,Ve={},jt(),$e={resolve:function(){for(var t,e="",r=!1,i=arguments.length-1;i>=-1&&!r;i--){var n;i>=0?n=arguments[i]:(void 0===t&&(t=jt().cwd()),n=t),Je(n),0!==n.length&&(e=n+"/"+e,r=47===n.charCodeAt(0))}return e=Qe(e,!r),r?e.length>0?"/"+e:"/":e.length>0?e:"."},normalize:function(t){if(Je(t),0===t.length)return".";var e=47===t.charCodeAt(0),r=47===t.charCodeAt(t.length-1);return 0!==(t=Qe(t,!e)).length||e||(t="."),t.length>0&&r&&(t+="/"),e?"/"+t:t},isAbsolute:function(t){return Je(t),t.length>0&&47===t.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var t,e=0;e0&&(void 0===t?t=r:t+="/"+r)}return void 0===t?".":$e.normalize(t)},relative:function(t,e){if(Je(t),Je(e),t===e)return"";if((t=$e.resolve(t))===(e=$e.resolve(e)))return"";for(var r=1;ra){if(47===e.charCodeAt(o+u))return e.slice(o+u+1);if(0===u)return e.slice(o+u)}else n>a&&(47===t.charCodeAt(r+u)?h=u:0===u&&(h=0));break}var f=t.charCodeAt(r+u);if(f!==e.charCodeAt(o+u))break;47===f&&(h=u)}var l="";for(u=r+h+1;u<=i;++u)u!==i&&47!==t.charCodeAt(u)||(0===l.length?l+="..":l+="/..");return l.length>0?l+e.slice(o+h):(o+=h,47===e.charCodeAt(o)&&++o,e.slice(o))},_makeLong:function(t){return t},dirname:function(t){if(Je(t),0===t.length)return".";for(var e=t.charCodeAt(0),r=47===e,i=-1,n=!0,o=t.length-1;o>=1;--o)if(47===(e=t.charCodeAt(o))){if(!n){i=o;break}}else n=!1;return-1===i?r?"/":".":r&&1===i?"//":t.slice(0,i)},basename:function(t,e){if(void 0!==e&&"string"!=typeof e)throw new TypeError('"ext" argument must be a string');Je(t);var r,i=0,n=-1,o=!0;if(void 0!==e&&e.length>0&&e.length<=t.length){if(e.length===t.length&&e===t)return"";var s=e.length-1,a=-1;for(r=t.length-1;r>=0;--r){var h=t.charCodeAt(r);if(47===h){if(!o){i=r+1;break}}else-1===a&&(o=!1,a=r+1),s>=0&&(h===e.charCodeAt(s)?-1==--s&&(n=r):(s=-1,n=a))}return i===n?n=a:-1===n&&(n=t.length),t.slice(i,n)}for(r=t.length-1;r>=0;--r)if(47===t.charCodeAt(r)){if(!o){i=r+1;break}}else-1===n&&(o=!1,n=r+1);return-1===n?"":t.slice(i,n)},extname:function(t){Je(t);for(var e=-1,r=0,i=-1,n=!0,o=0,s=t.length-1;s>=0;--s){var a=t.charCodeAt(s);if(47!==a)-1===i&&(n=!1,i=s+1),46===a?-1===e?e=s:1!==o&&(o=1):-1!==e&&(o=-1);else if(!n){r=s+1;break}}return-1===e||-1===i||0===o||1===o&&e===i-1&&e===r+1?"":t.slice(e,i)},format:function(t){if(null===t||"object"!=typeof t)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof t);return function(t,e){var r=e.dir||e.root,i=e.base||(e.name||"")+(e.ext||"");return r?r===e.root?r+i:r+t+i:i}("/",t)},parse:function(t){Je(t);var e={root:"",dir:"",base:"",ext:"",name:""};if(0===t.length)return e;var r,i=t.charCodeAt(0),n=47===i;n?(e.root="/",r=1):r=0;for(var o=-1,s=0,a=-1,h=!0,u=t.length-1,f=0;u>=r;--u)if(47!==(i=t.charCodeAt(u)))-1===a&&(h=!1,a=u+1),46===i?-1===o?o=u:1!==f&&(f=1):-1!==o&&(f=-1);else if(!h){s=u+1;break}return-1===o||-1===a||0===f||1===f&&o===a-1&&o===s+1?-1!==a&&(e.base=e.name=0===s&&n?t.slice(1,a):t.slice(s,a)):(0===s&&n?(e.name=t.slice(1,o),e.base=t.slice(1,a)):(e.name=t.slice(s,o),e.base=t.slice(s,a)),e.ext=t.slice(o,a)),s>0?e.dir=t.slice(0,s-1):n&&(e.dir="/"),e},sep:"/",delimiter:":",win32:null,posix:null},$e.posix=$e,Ve=$e),Ve}var er,rr=!1;function ir(){return rr||(rr=!0,er={}),er}var nr,or,sr,ar,hr=!1;function ur(t,e){for(var r in t)e[r]=t[r]}function fr(t,e,r){return ar(t,e,r)}function lr(){return hr||(hr=!0,nr={},sr=Ye(),(ar=sr.Buffer).from&&ar.alloc&&ar.allocUnsafe&&ar.allocUnsafeSlow?nr=sr:(ur(sr,nr),or=fr,nr.Buffer=or),fr.prototype=Object.create(ar.prototype),ur(ar,fr),fr.from=function(t,e,r){if("number"==typeof t)throw new TypeError("Argument must not be a number");return ar(t,e,r)},fr.alloc=function(t,e,r){if("number"!=typeof t)throw new TypeError("Argument must be a number");var i=ar(t);return void 0!==e?"string"==typeof r?i.fill(e,r):i.fill(e):i.fill(0),i},fr.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return ar(t)},fr.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return sr.SlowBuffer(t)}),nr}var dr,cr,pr,mr,gr,vr=!1;function br(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}function yr(t,e){if(t>pr)throw new RangeError("requested too many random bytes");var r=mr.allocUnsafe(t);if(t>0)if(t>cr)for(var i=0;i0&&s.length>n&&!s.warned){s.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=t,h.type=e,h.count=s.length,a=h,console&&console.warn&&console.warn(a)}return t}function Lr(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Or(t,e,r){var i={fired:!1,wrapFn:void 0,target:t,type:e,listener:r},n=Lr.bind(i);return n.listener=r,i.wrapFn=n,n}function jr(t,e,r){var i=t._events;if(void 0===i)return[];var n=i[e];return void 0===n?[]:"function"==typeof n?r?[n.listener||n]:[n]:r?function(t){for(var e=new Array(t.length),r=0;r0&&(o=e[0]),o instanceof Error)throw o;var s=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw s.context=o,s}var a=n[t];if(void 0===a)return!1;if("function"==typeof a)kr(a,this,e);else{var h=a.length,u=Nr(a,h);for(r=0;r=0;o--)if(r[o]===e||r[o].listener===e){s=r[o].listener,n=o;break}if(n<0)return this;0===n?r.shift():function(t,e){for(;e+1=0;i--)this.removeListener(t,e[i]);return this},Ir.prototype.listeners=function(t){return jr(this,t,!0)},Ir.prototype.rawListeners=function(t){return jr(this,t,!1)},Ir.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):Ur.call(t,e)},Ir.prototype.listenerCount=Ur,Ir.prototype.eventNames=function(){return this._eventsCount>0?Br(this._events):[]}),Er}var qr,Fr=!1;function Zr(){return Fr||(Fr=!0,qr={},qr=zr().EventEmitter),qr}var Hr,Kr,Wr,Gr,Yr=!1;function Vr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function $r(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Xr(t,e){for(var r=0;r0?this.tail.next=e:this.head=e,this.tail=e,++this.length}},{key:"unshift",value:function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length}},{key:"shift",value:function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r}},{key:"concat",value:function(t){if(0===this.length)return Kr.alloc(0);for(var e,r,i,n=Kr.allocUnsafe(t>>>0),o=this.head,s=0;o;)e=o.data,r=n,i=s,Kr.prototype.copy.call(e,r,i),s+=o.data.length,o=o.next;return n}},{key:"consume",value:function(t,e){var r;return tn.length?n.length:t;if(o===n.length?i+=n:i+=n.slice(0,t),0==(t-=o)){o===n.length?(++r,e.next?this.head=e.next:this.head=this.tail=null):(this.head=e,e.data=n.slice(o));break}++r}return this.length-=r,i}},{key:"_getBuffer",value:function(t){var e=Kr.allocUnsafe(t),r=this.head,i=1;for(r.data.copy(e),t-=r.data.length;r=r.next;){var n=r.data,o=t>n.length?n.length:t;if(n.copy(e,e.length-t,0,o),0==(t-=o)){o===n.length?(++i,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=n.slice(o));break}++i}return this.length-=i,e}},{key:Gr,value:function(t,e){return Wr(this,function(t){for(var e=1;e2?"one of ".concat(e," ").concat(t.slice(0,r-1).join(", "),", or ")+t[r-1]:2===r?"one of ".concat(e," ").concat(t[0]," or ").concat(t[1]):"of ".concat(e," ").concat(t[0])}return"of ".concat(e," ").concat(String(t))}function pi(){return li||(li=!0,hi={},ui={},di("ERR_INVALID_OPT_VALUE",(function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'}),TypeError),di("ERR_INVALID_ARG_TYPE",(function(t,e,r){var i,n,o,s;if("string"==typeof e&&(n="not ",e.substr(!o||o<0?0:+o,n.length)===n)?(i="must not be",e=e.replace(/^not /,"")):i="must be",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}(t," argument"))s="The ".concat(t," ").concat(i," ").concat(ci(e,"type"));else{var a=function(t,e,r){return"number"!=typeof r&&(r=0),!(r+e.length>t.length)&&-1!==t.indexOf(e,r)}(t,".")?"property":"argument";s='The "'.concat(t,'" ').concat(a," ").concat(i," ").concat(ci(e,"type"))}return s+". Received type ".concat(typeof r)}),TypeError),di("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),di("ERR_METHOD_NOT_IMPLEMENTED",(function(t){return"The "+t+" method is not implemented"})),di("ERR_STREAM_PREMATURE_CLOSE","Premature close"),di("ERR_STREAM_DESTROYED",(function(t){return"Cannot call "+t+" after a stream was destroyed"})),di("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),di("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),di("ERR_STREAM_WRITE_AFTER_END","write after end"),di("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),di("ERR_UNKNOWN_ENCODING",(function(t){return"Unknown encoding: "+t}),TypeError),di("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),fi=ui,hi.codes=fi),hi}var mi,gi,vi=!1;function bi(t,e,r,i){var n=function(t,e,r){return null!=t.highWaterMark?t.highWaterMark:e?t[r]:null}(e,i,r);if(null!=n){if(!isFinite(n)||Math.floor(n)!==n||n<0)throw new gi(i?r:"highWaterMark",n);return Math.floor(n)}return t.objectMode?16:16384}function yi(){return vi||(vi=!0,mi={},gi=pi().codes.ERR_INVALID_OPT_VALUE,mi={getHighWaterMark:bi}),mi}var wi,Mi=!1;function _i(t,e){if(Ai("noDeprecation"))return t;var r=!1;return function(){if(!r){if(Ai("throwDeprecation"))throw new Error(e);Ai("traceDeprecation")?console.trace(e):console.warn(e),r=!0}return t.apply(this,arguments)}}function Ai(e){try{if(!t.localStorage)return!1}catch(t){return!1}var r=t.localStorage[e];return null!=r&&"true"===String(r).toLowerCase()}function Ei(){return Mi||(Mi=!0,wi={},wi=_i),wi}var Si,ki,Bi,Ri,Ti,xi,Ii,Ci,Pi,Di,Li,Oi,ji,Ui,Ni,zi,qi,Fi,Zi=!1;function Hi(t){var e=this;this.next=null,this.entry=null,this.finish=function(){!function(t,e,r){var i=t.entry;t.entry=null;for(;i;){var n=i.callback;e.pendingcb--,n(r),i=i.next}e.corkedRequestsFree.next=t}(e,t)}}function Ki(){}function Wi(t,e,r){ki=ki||pn(),t=t||{},"boolean"!=typeof r&&(r=e instanceof ki),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=Ii(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=!1===t.decodeStrings;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,i=r.sync,n=r.writecb;if("function"!=typeof n)throw new Li;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,i,n){--e.pendingcb,r?(jt().nextTick(n,i),jt().nextTick(tn,t,e),t._writableState.errorEmitted=!0,qi(t,i)):(n(i),t._writableState.errorEmitted=!0,qi(t,i),tn(t,e))}(t,r,i,e,n);else{var o=Ji(r)||t.destroyed;o||r.corked||r.bufferProcessing||!r.bufferedRequest||Xi(t,r),i?jt().nextTick($i,t,r,o,n):$i(t,r,o,n)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==t.emitClose,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Hi(this)}function Gi(t){var e=this instanceof(ki=ki||pn());if(!e&&!Fi.call(Gi,this))return new Gi(t);this._writableState=new Wi(t,this,e),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev),"function"==typeof t.destroy&&(this._destroy=t.destroy),"function"==typeof t.final&&(this._final=t.final)),Ri.call(this)}function Yi(t,e,r,i,n,o){if(!r){var s=function(t,e,r){return t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=Ti.from(e,r)),e}(e,i,n);i!==s&&(r=!0,n="buffer",i=s)}var a=e.objectMode?1:i.length;e.length+=a;var h=e.length-1))throw new zi(t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(Gi.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(Gi.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),Gi.prototype._write=function(t,e,r){r(new Di("_write()"))},Gi.prototype._writev=null,Gi.prototype.end=function(t,e,r){var i=this._writableState;return"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),i.corked&&(i.corked=1,this.uncork()),i.ending||function(t,e,r){e.ending=!0,tn(t,e),r&&(e.finished?jt().nextTick(r):t.once("finish",r)),e.ended=!0,t.writable=!1}(this,i,r),this},Object.defineProperty(Gi.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(Gi.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),Gi.prototype.destroy=ai().destroy,Gi.prototype._undestroy=ai().undestroy,Gi.prototype._destroy=function(t,e){e(t)}}function rn(){return Zi||(Zi=!0,en()),Si}var nn,on,sn,an,hn,un,fn=!1;function ln(t){if(!(this instanceof ln))return new ln(t);sn.call(this,t),rn().call(this,t),this.allowHalfOpen=!0,t&&(!1===t.readable&&(this.readable=!1),!1===t.writable&&(this.writable=!1),!1===t.allowHalfOpen&&(this.allowHalfOpen=!1,this.once("end",dn)))}function dn(){this._writableState.ended||jt().nextTick(cn,this)}function cn(t){t.end()}function pn(){return fn||(fn=!0,function(){for(nn={},jt(),on=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e},nn=ln,sn=Wo(),rn(),Ar()(ln,sn),an=on(rn().prototype),hn=0;hn>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function _n(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function An(t,e){var r=function(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(2===n?n=0:t.lastNeed=n-3),n):0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function En(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"�":e}function Sn(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function kn(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function Bn(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Rn(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Tn(t){return t.toString(this.encoding)}function xn(t){return t&&t.length?this.write(t):""}function In(){return yn||(yn=!0,mn={},gn=lr().Buffer,vn=gn.isEncoding||function(t){switch((t=""+t)&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},bn=wn,mn.StringDecoder=bn,wn.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r0)if("string"==typeof e||s.objectMode||Object.getPrototypeOf(e)===uo.prototype||(e=function(t){return uo.from(t)}(e)),i)s.endEmitted?Eo(t,new wo):Io(t,s,e,!0);else if(s.ended)Eo(t,new bo);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?Io(t,s,e,!1):Lo(t,s)):Io(t,s,e,!1)}else i||(s.reading=!1,Lo(t,s));return!s.ended&&(s.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=ko?t=ko:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function Po(t){var e=t._readableState;co("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(co("emitReadable",e.flowing),e.emittedReadable=!0,jt().nextTick(Do,t))}function Do(t){var e=t._readableState;co("emitReadable_",e.destroyed,e.length,e.ended),e.destroyed||!e.length&&!e.ended||(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,zo(t)}function Lo(t,e){e.readingMore||(e.readingMore=!0,jt().nextTick(Oo,t,e))}function Oo(t,e){for(;!e.reading&&!e.ended&&(e.length0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function Uo(t){co("readable nexttick read 0"),t.read(0)}function No(t,e){co("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),zo(t),e.flowing&&!e.reading&&t.read(0)}function zo(t){var e=t._readableState;for(co("flow",e.flowing);e.flowing&&null!==t.read(););}function qo(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.first():e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r);var r}function Fo(t){var e=t._readableState;co("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,jt().nextTick(Zo,e,t))}function Zo(t,e){if(co("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&0===t.length&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}function Ho(t,e){for(var r=0,i=t.length;r=e.highWaterMark:e.length>0)||e.ended))return co("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?Fo(this):Po(this),null;if(0===(t=Co(t,e))&&e.ended)return 0===e.length&&Fo(this),null;var i,n=e.needReadable;return co("need readable",n),(0===e.length||e.length-t0?qo(t,e):null)?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&Fo(this)),null!==i&&this.emit("data",i),i},To.prototype._read=function(t){Eo(this,new yo("_read()"))},To.prototype.pipe=function(t,e){var r=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=t;break;case 1:i.pipes=[i.pipes,t];break;default:i.pipes.push(t)}i.pipesCount+=1,co("pipe count=%d opts=%j",i.pipesCount,e);var n=(!e||!1!==e.end)&&t!==jt().stdout&&t!==jt().stderr?s:c;function o(e,n){co("onunpipe"),e===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,co("cleanup"),t.removeListener("close",l),t.removeListener("finish",d),t.removeListener("drain",a),t.removeListener("error",f),t.removeListener("unpipe",o),r.removeListener("end",s),r.removeListener("end",c),r.removeListener("data",u),h=!0,!i.awaitDrain||t._writableState&&!t._writableState.needDrain||a())}function s(){co("onend"),t.end()}i.endEmitted?jt().nextTick(n):r.once("end",n),t.on("unpipe",o);var a=function(t){return function(){var e=t._readableState;co("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&ao(t,"data")&&(e.flowing=!0,zo(t))}}(r);t.on("drain",a);var h=!1;function u(e){co("ondata");var n=t.write(e);co("dest.write",n),!1===n&&((1===i.pipesCount&&i.pipes===t||i.pipesCount>1&&-1!==Ho(i.pipes,t))&&!h&&(co("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function f(e){co("onerror",e),c(),t.removeListener("error",f),0===ao(t,"error")&&Eo(t,e)}function l(){t.removeListener("finish",d),c()}function d(){co("onfinish"),t.removeListener("close",l),c()}function c(){co("unpipe"),r.unpipe(t)}return r.on("data",u),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",f),t.once("close",l),t.once("finish",d),t.emit("pipe",r),i.flowing||(co("pipe resume"),r.resume()),t},To.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r)),this;if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o0,!1!==i.flowing&&this.resume()):"readable"===t&&(i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,co("on readable",i.length,i.reading),i.length?Po(this):i.reading||jt().nextTick(Uo,this))),r},To.prototype.addListener=To.prototype.on,To.prototype.removeListener=function(t,e){var r=ho.prototype.removeListener.call(this,t,e);return"readable"===t&&jt().nextTick(jo,this),r},To.prototype.removeAllListeners=function(t){var e=ho.prototype.removeAllListeners.apply(this,arguments);return"readable"!==t&&void 0!==t||jt().nextTick(jo,this),e},To.prototype.resume=function(){var t=this._readableState;return t.flowing||(co("resume"),t.flowing=!t.readableListening,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,jt().nextTick(No,t,e))}(this,t)),t.paused=!1,this},To.prototype.pause=function(){return co("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(co("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},To.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;for(var n in t.on("end",(function(){if(co("wrapped end"),r.decoder&&!r.ended){var t=r.decoder.end();t&&t.length&&e.push(t)}e.push(null)})),t.on("data",(function(n){(co("wrapped data"),r.decoder&&(n=r.decoder.write(n)),r.objectMode&&null==n)||(r.objectMode||n&&n.length)&&(e.push(n)||(i=!0,t.pause()))})),t)void 0===this[n]&&"function"==typeof t[n]&&(this[n]=function(e){return function(){return t[e].apply(t,arguments)}}(n));for(var o=0;o0,(function(t){i||(i=t),t&&o.forEach(ys),s||(o.forEach(ys),n(i))}))}));return e.reduce(ws)}function As(){return gs||(gs=!0,ls={},cs=pi().codes,ps=cs.ERR_MISSING_ARGS,ms=cs.ERR_STREAM_DESTROYED,ls=_s),ls}var Es,Ss,ks,Bs,Rs,Ts,xs,Is,Cs,Ps,Ds=!1;function Ls(){return Ds||(Ds=!0,Ss={},Es=Ss=Wo(),ks=Es,Ss.Stream=ks,Bs=Es,Ss.Readable=Bs,Rs=rn(),Ss.Writable=Rs,Ts=pn(),Ss.Duplex=Ts,xs=os(),Ss.Transform=xs,Is=fs(),Ss.PassThrough=Is,Cs=jn(),Ss.finished=Cs,Ps=As(),Ss.pipeline=Ps),Ss}var Os,js,Us,Ns=!1;function zs(t){Us.call(this),this._block=js.allocUnsafe(t),this._blockSize=t,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}function qs(){Os={},js=lr().Buffer,Us=Ls().Transform,Ar()(zs,Us),zs.prototype._transform=function(t,e,r){var i=null;try{this.update(t,e)}catch(t){i=t}r(i)},zs.prototype._flush=function(t){var e=null;try{this.push(this.digest())}catch(t){e=t}t(e)},zs.prototype.update=function(t,e){if(function(t,e){if(!js.isBuffer(t)&&"string"!=typeof t)throw new TypeError(e+" must be a string or a buffer")}(t,"Data"),this._finalized)throw new Error("Digest already called");js.isBuffer(t)||(t=js.from(t,e));for(var r=this._block,i=0;this._blockOffset+t.length-i>=this._blockSize;){for(var n=this._blockOffset;n0;++o)this._length[o]+=s,(s=this._length[o]/4294967296|0)>0&&(this._length[o]-=4294967296*s);return this},zs.prototype._update=function(){throw new Error("_update is not implemented")},zs.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var e=this._digest();void 0!==t&&(e=e.toString(t)),this._block.fill(0),this._blockOffset=0;for(var r=0;r<4;++r)this._length[r]=0;return e},zs.prototype._digest=function(){throw new Error("_digest is not implemented")},Os=zs}function Fs(){return Ns||(Ns=!0,qs()),Os}var Zs,Hs,Ks,Ws,Gs,Ys=!1;function Vs(){Ks.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}function $s(t,e){return t<>>32-e}function Xs(t,e,r,i,n,o,s){return $s(t+(e&r|~e&i)+n+o|0,s)+e|0}function Js(t,e,r,i,n,o,s){return $s(t+(e&i|r&~i)+n+o|0,s)+e|0}function Qs(t,e,r,i,n,o,s){return $s(t+(e^r^i)+n+o|0,s)+e|0}function ta(t,e,r,i,n,o,s){return $s(t+(r^(e|~i))+n+o|0,s)+e|0}function ea(){return Ys||(Ys=!0,Zs={},Hs=Ar(),Ks=Fs(),Ws=lr().Buffer,Gs=new Array(16),Hs(Vs,Ks),Vs.prototype._update=function(){for(var t=Gs,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,i=this._b,n=this._c,o=this._d;r=Xs(r,i,n,o,t[0],3614090360,7),o=Xs(o,r,i,n,t[1],3905402710,12),n=Xs(n,o,r,i,t[2],606105819,17),i=Xs(i,n,o,r,t[3],3250441966,22),r=Xs(r,i,n,o,t[4],4118548399,7),o=Xs(o,r,i,n,t[5],1200080426,12),n=Xs(n,o,r,i,t[6],2821735955,17),i=Xs(i,n,o,r,t[7],4249261313,22),r=Xs(r,i,n,o,t[8],1770035416,7),o=Xs(o,r,i,n,t[9],2336552879,12),n=Xs(n,o,r,i,t[10],4294925233,17),i=Xs(i,n,o,r,t[11],2304563134,22),r=Xs(r,i,n,o,t[12],1804603682,7),o=Xs(o,r,i,n,t[13],4254626195,12),n=Xs(n,o,r,i,t[14],2792965006,17),r=Js(r,i=Xs(i,n,o,r,t[15],1236535329,22),n,o,t[1],4129170786,5),o=Js(o,r,i,n,t[6],3225465664,9),n=Js(n,o,r,i,t[11],643717713,14),i=Js(i,n,o,r,t[0],3921069994,20),r=Js(r,i,n,o,t[5],3593408605,5),o=Js(o,r,i,n,t[10],38016083,9),n=Js(n,o,r,i,t[15],3634488961,14),i=Js(i,n,o,r,t[4],3889429448,20),r=Js(r,i,n,o,t[9],568446438,5),o=Js(o,r,i,n,t[14],3275163606,9),n=Js(n,o,r,i,t[3],4107603335,14),i=Js(i,n,o,r,t[8],1163531501,20),r=Js(r,i,n,o,t[13],2850285829,5),o=Js(o,r,i,n,t[2],4243563512,9),n=Js(n,o,r,i,t[7],1735328473,14),r=Qs(r,i=Js(i,n,o,r,t[12],2368359562,20),n,o,t[5],4294588738,4),o=Qs(o,r,i,n,t[8],2272392833,11),n=Qs(n,o,r,i,t[11],1839030562,16),i=Qs(i,n,o,r,t[14],4259657740,23),r=Qs(r,i,n,o,t[1],2763975236,4),o=Qs(o,r,i,n,t[4],1272893353,11),n=Qs(n,o,r,i,t[7],4139469664,16),i=Qs(i,n,o,r,t[10],3200236656,23),r=Qs(r,i,n,o,t[13],681279174,4),o=Qs(o,r,i,n,t[0],3936430074,11),n=Qs(n,o,r,i,t[3],3572445317,16),i=Qs(i,n,o,r,t[6],76029189,23),r=Qs(r,i,n,o,t[9],3654602809,4),o=Qs(o,r,i,n,t[12],3873151461,11),n=Qs(n,o,r,i,t[15],530742520,16),r=ta(r,i=Qs(i,n,o,r,t[2],3299628645,23),n,o,t[0],4096336452,6),o=ta(o,r,i,n,t[7],1126891415,10),n=ta(n,o,r,i,t[14],2878612391,15),i=ta(i,n,o,r,t[5],4237533241,21),r=ta(r,i,n,o,t[12],1700485571,6),o=ta(o,r,i,n,t[3],2399980690,10),n=ta(n,o,r,i,t[10],4293915773,15),i=ta(i,n,o,r,t[1],2240044497,21),r=ta(r,i,n,o,t[8],1873313359,6),o=ta(o,r,i,n,t[15],4264355552,10),n=ta(n,o,r,i,t[6],2734768916,15),i=ta(i,n,o,r,t[13],1309151649,21),r=ta(r,i,n,o,t[4],4149444226,6),o=ta(o,r,i,n,t[11],3174756917,10),n=ta(n,o,r,i,t[2],718787259,15),i=ta(i,n,o,r,t[9],3951481745,21),this._a=this._a+r|0,this._b=this._b+i|0,this._c=this._c+n|0,this._d=this._d+o|0},Vs.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=Ws.allocUnsafe(16);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t},Zs=Vs),Zs}var ra,ia,na,oa,sa,aa,ha,ua,fa,la,da,ca=!1;function pa(){oa.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function ma(t,e){return t<>>32-e}function ga(t,e,r,i,n,o,s,a){return ma(t+(e^r^i)+o+s|0,a)+n|0}function va(t,e,r,i,n,o,s,a){return ma(t+(e&r|~e&i)+o+s|0,a)+n|0}function ba(t,e,r,i,n,o,s,a){return ma(t+((e|~r)^i)+o+s|0,a)+n|0}function ya(t,e,r,i,n,o,s,a){return ma(t+(e&i|r&~i)+o+s|0,a)+n|0}function wa(t,e,r,i,n,o,s,a){return ma(t+(e^(r|~i))+o+s|0,a)+n|0}function Ma(){return ca||(ca=!0,ra={},ia=Ye().Buffer,na=Ar(),oa=Fs(),sa=new Array(16),aa=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],ha=[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11],ua=[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],fa=[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11],la=[0,1518500249,1859775393,2400959708,2840853838],da=[1352829926,1548603684,1836072691,2053994217,0],na(pa,oa),pa.prototype._update=function(){for(var t=sa,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);for(var r=0|this._a,i=0|this._b,n=0|this._c,o=0|this._d,s=0|this._e,a=0|this._a,h=0|this._b,u=0|this._c,f=0|this._d,l=0|this._e,d=0;d<80;d+=1){var c,p;d<16?(c=ga(r,i,n,o,s,t[aa[d]],la[0],ua[d]),p=wa(a,h,u,f,l,t[ha[d]],da[0],fa[d])):d<32?(c=va(r,i,n,o,s,t[aa[d]],la[1],ua[d]),p=ya(a,h,u,f,l,t[ha[d]],da[1],fa[d])):d<48?(c=ba(r,i,n,o,s,t[aa[d]],la[2],ua[d]),p=ba(a,h,u,f,l,t[ha[d]],da[2],fa[d])):d<64?(c=ya(r,i,n,o,s,t[aa[d]],la[3],ua[d]),p=va(a,h,u,f,l,t[ha[d]],da[3],fa[d])):(c=wa(r,i,n,o,s,t[aa[d]],la[4],ua[d]),p=ga(a,h,u,f,l,t[ha[d]],da[4],fa[d])),r=s,s=o,o=ma(n,10),n=i,i=c,a=l,l=f,f=ma(u,10),u=h,h=p}var m=this._b+n+f|0;this._b=this._c+o+l|0,this._c=this._d+s+a|0,this._d=this._e+r+h|0,this._e=this._a+i+u|0,this._a=m},pa.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=ia.alloc?ia.alloc(20):new ia(20);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t.writeInt32LE(this._e,16),t},ra=pa),ra}var _a,Aa,Ea=!1;function Sa(t,e){this._block=Aa.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}function ka(){return Ea||(Ea=!0,_a={},Aa=lr().Buffer,Sa.prototype.update=function(t,e){"string"==typeof t&&(e=e||"utf8",t=Aa.from(t,e));for(var r=this._block,i=this._blockSize,n=t.length,o=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var i=(4294967295&r)>>>0,n=(r-i)/4294967296;this._block.writeUInt32BE(n,this._blockSize-8),this._block.writeUInt32BE(i,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},Sa.prototype._update=function(){throw new Error("_update must be implemented by subclass")},_a=Sa),_a}var Ba,Ra,Ta,xa,Ia,Ca,Pa=!1;function Da(){this.init(),this._w=Ca,Ta.call(this,64,56)}function La(t){return t<<30|t>>>2}function Oa(t,e,r,i){return 0===t?e&r|~e&i:2===t?e&r|e&i|r&i:e^r^i}function ja(){return Pa||(Pa=!0,Ba={},Ra=Ar(),Ta=ka(),xa=lr().Buffer,Ia=[1518500249,1859775393,-1894007588,-899497514],Ca=new Array(80),Ra(Da,Ta),Da.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Da.prototype._update=function(t){for(var e,r=this._w,i=0|this._a,n=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,h=0;h<16;++h)r[h]=t.readInt32BE(4*h);for(;h<80;++h)r[h]=r[h-3]^r[h-8]^r[h-14]^r[h-16];for(var u=0;u<80;++u){var f=~~(u/20),l=0|((e=i)<<5|e>>>27)+Oa(f,n,o,s)+a+r[u]+Ia[f];a=s,s=o,o=La(n),n=i,i=l}this._a=i+this._a|0,this._b=n+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0},Da.prototype._hash=function(){var t=xa.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},Ba=Da),Ba}var Ua,Na,za,qa,Fa,Za,Ha=!1;function Ka(){this.init(),this._w=Za,za.call(this,64,56)}function Wa(t){return t<<5|t>>>27}function Ga(t){return t<<30|t>>>2}function Ya(t,e,r,i){return 0===t?e&r|~e&i:2===t?e&r|e&i|r&i:e^r^i}function Va(){return Ha||(Ha=!0,Ua={},Na=Ar(),za=ka(),qa=lr().Buffer,Fa=[1518500249,1859775393,-1894007588,-899497514],Za=new Array(80),Na(Ka,za),Ka.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Ka.prototype._update=function(t){for(var e,r=this._w,i=0|this._a,n=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,h=0;h<16;++h)r[h]=t.readInt32BE(4*h);for(;h<80;++h)r[h]=(e=r[h-3]^r[h-8]^r[h-14]^r[h-16])<<1|e>>>31;for(var u=0;u<80;++u){var f=~~(u/20),l=Wa(i)+Ya(f,n,o,s)+a+r[u]+Fa[f]|0;a=s,s=o,o=Ga(n),n=i,i=l}this._a=i+this._a|0,this._b=n+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0},Ka.prototype._hash=function(){var t=qa.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},Ua=Ka),Ua}var $a,Xa,Ja,Qa,th,eh,rh=!1;function ih(){this.init(),this._w=eh,Ja.call(this,64,56)}function nh(t,e,r){return r^t&(e^r)}function oh(t,e,r){return t&e|r&(t|e)}function sh(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function ah(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function hh(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}function uh(){return rh||(rh=!0,$a={},Xa=Ar(),Ja=ka(),Qa=lr().Buffer,th=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],eh=new Array(64),Xa(ih,Ja),ih.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},ih.prototype._update=function(t){for(var e,r=this._w,i=0|this._a,n=0|this._b,o=0|this._c,s=0|this._d,a=0|this._e,h=0|this._f,u=0|this._g,f=0|this._h,l=0;l<16;++l)r[l]=t.readInt32BE(4*l);for(;l<64;++l)r[l]=0|(((e=r[l-2])>>>17|e<<15)^(e>>>19|e<<13)^e>>>10)+r[l-7]+hh(r[l-15])+r[l-16];for(var d=0;d<64;++d){var c=f+ah(a)+nh(a,h,u)+th[d]+r[d]|0,p=sh(i)+oh(i,n,o)|0;f=u,u=h,h=a,a=s+c|0,s=o,o=n,n=i,i=c+p|0}this._a=i+this._a|0,this._b=n+this._b|0,this._c=o+this._c|0,this._d=s+this._d|0,this._e=a+this._e|0,this._f=h+this._f|0,this._g=u+this._g|0,this._h=f+this._h|0},ih.prototype._hash=function(){var t=Qa.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},$a=ih),$a}var fh,lh,dh,ch,ph,mh=!1;function gh(){this.init(),this._w=ph,ka().call(this,64,56)}function vh(){return mh||(mh=!0,fh={},lh=Ar(),dh=uh(),ka(),ch=lr().Buffer,ph=new Array(64),lh(gh,dh),gh.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},gh.prototype._hash=function(){var t=ch.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},fh=gh),fh}var bh,yh,wh,Mh,_h,Ah,Eh=!1;function Sh(){this.init(),this._w=Ah,wh.call(this,128,112)}function kh(t,e,r){return r^t&(e^r)}function Bh(t,e,r){return t&e|r&(t|e)}function Rh(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function Th(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function xh(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^t>>>7}function Ih(t,e){return(t>>>1|e<<31)^(t>>>8|e<<24)^(t>>>7|e<<25)}function Ch(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^t>>>6}function Ph(t,e){return(t>>>19|e<<13)^(e>>>29|t<<3)^(t>>>6|e<<26)}function Dh(t,e){return t>>>0>>0?1:0}function Lh(){return Eh||(Eh=!0,bh={},yh=Ar(),wh=ka(),Mh=lr().Buffer,_h=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],Ah=new Array(160),yh(Sh,wh),Sh.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sh.prototype._update=function(t){for(var e=this._w,r=0|this._ah,i=0|this._bh,n=0|this._ch,o=0|this._dh,s=0|this._eh,a=0|this._fh,h=0|this._gh,u=0|this._hh,f=0|this._al,l=0|this._bl,d=0|this._cl,c=0|this._dl,p=0|this._el,m=0|this._fl,g=0|this._gl,v=0|this._hl,b=0;b<32;b+=2)e[b]=t.readInt32BE(4*b),e[b+1]=t.readInt32BE(4*b+4);for(;b<160;b+=2){var y=e[b-30],w=e[b-30+1],M=xh(y,w),_=Ih(w,y),A=Ch(y=e[b-4],w=e[b-4+1]),E=Ph(w,y),S=e[b-14],k=e[b-14+1],B=e[b-32],R=e[b-32+1],T=_+k|0,x=M+S+Dh(T,_)|0;x=(x=x+A+Dh(T=T+E|0,E)|0)+B+Dh(T=T+R|0,R)|0,e[b]=x,e[b+1]=T}for(var I=0;I<160;I+=2){x=e[I],T=e[I+1];var C=Bh(r,i,n),P=Bh(f,l,d),D=Rh(r,f),L=Rh(f,r),O=Th(s,p),j=Th(p,s),U=_h[I],N=_h[I+1],z=kh(s,a,h),q=kh(p,m,g),F=v+j|0,Z=u+O+Dh(F,v)|0;Z=(Z=(Z=Z+z+Dh(F=F+q|0,q)|0)+U+Dh(F=F+N|0,N)|0)+x+Dh(F=F+T|0,T)|0;var H=L+P|0,K=D+C+Dh(H,L)|0;u=h,v=g,h=a,g=m,a=s,m=p,s=o+Z+Dh(p=c+F|0,c)|0,o=n,c=d,n=i,d=l,i=r,l=f,r=Z+K+Dh(f=F+H|0,F)|0}this._al=this._al+f|0,this._bl=this._bl+l|0,this._cl=this._cl+d|0,this._dl=this._dl+c|0,this._el=this._el+p|0,this._fl=this._fl+m|0,this._gl=this._gl+g|0,this._hl=this._hl+v|0,this._ah=this._ah+r+Dh(this._al,f)|0,this._bh=this._bh+i+Dh(this._bl,l)|0,this._ch=this._ch+n+Dh(this._cl,d)|0,this._dh=this._dh+o+Dh(this._dl,c)|0,this._eh=this._eh+s+Dh(this._el,p)|0,this._fh=this._fh+a+Dh(this._fl,m)|0,this._gh=this._gh+h+Dh(this._gl,g)|0,this._hh=this._hh+u+Dh(this._hl,v)|0},Sh.prototype._hash=function(){var t=Mh.allocUnsafe(64);function e(e,r,i){t.writeInt32BE(e,i),t.writeInt32BE(r,i+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),e(this._gh,this._gl,48),e(this._hh,this._hl,56),t},bh=Sh),bh}var Oh,jh,Uh,Nh,zh,qh=!1;function Fh(){this.init(),this._w=zh,ka().call(this,128,112)}function Zh(){return qh||(qh=!0,Oh={},jh=Ar(),Uh=Lh(),ka(),Nh=lr().Buffer,zh=new Array(160),jh(Fh,Uh),Fh.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Fh.prototype._hash=function(){var t=Nh.allocUnsafe(48);function e(e,r,i){t.writeInt32BE(e,i),t.writeInt32BE(r,i+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),t},Oh=Fh),Oh}var Hh,Kh,Wh=!1;function Gh(){return Wh||(Wh=!0,Hh={},(Kh=Hh=function(t){t=t.toLowerCase();var e=Kh[t];if(!e)throw new Error(t+" is not supported (we accept pull requests)");return new e}).sha=ja(),Kh.sha1=Va(),Kh.sha224=vh(),Kh.sha256=uh(),Kh.sha384=Zh(),Kh.sha512=Lh()),Hh}var Yh,Vh,$h,Xh,Jh=!1;function Qh(t){$h.call(this),this.hashMode="string"==typeof t,this.hashMode?this[t]=this._finalOrDigest:this.final=this._finalOrDigest,this._final&&(this.__final=this._final,this._final=null),this._decoder=null,this._encoding=null}function tu(){return Jh||(Jh=!0,Yh={},Vh=lr().Buffer,$h=Ls().Transform,Xh=In().StringDecoder,Ar()(Qh,$h),Qh.prototype.update=function(t,e,r){"string"==typeof t&&(t=Vh.from(t,e));var i=this._update(t);return this.hashMode?this:(r&&(i=this._toString(i,r)),i)},Qh.prototype.setAutoPadding=function(){},Qh.prototype.getAuthTag=function(){throw new Error("trying to get auth tag in unsupported state")},Qh.prototype.setAuthTag=function(){throw new Error("trying to set auth tag in unsupported state")},Qh.prototype.setAAD=function(){throw new Error("trying to set aad in unsupported state")},Qh.prototype._transform=function(t,e,r){var i;try{this.hashMode?this._update(t):this.push(this._update(t))}catch(t){i=t}finally{r(i)}},Qh.prototype._flush=function(t){var e;try{this.push(this.__final())}catch(t){e=t}t(e)},Qh.prototype._finalOrDigest=function(t){var e=this.__final()||Vh.alloc(0);return t&&(e=this._toString(e,t,!0)),e},Qh.prototype._toString=function(t,e,r){if(this._decoder||(this._decoder=new Xh(e),this._encoding=e),this._encoding!==e)throw new Error("can't switch encodings");var i=this._decoder.write(t);return r&&(i+=this._decoder.end()),i},Yh=Qh),Yh}var eu,ru,iu,nu,ou,su,au=!1;function hu(t){su.call(this,"digest"),this._hash=t}function uu(){return au||(au=!0,eu={},ru=Ar(),iu=ea(),nu=Ma(),ou=Gh(),su=tu(),ru(hu,su),hu.prototype._update=function(t){this._hash.update(t)},hu.prototype._final=function(){return this._hash.digest()},eu=function(t){return"md5"===(t=t.toLowerCase())?new iu:"rmd160"===t||"ripemd160"===t?new nu:new hu(ou(t))}),eu}var fu,lu,du,cu,pu,mu,gu=!1;function vu(t,e){cu.call(this,"digest"),"string"==typeof e&&(e=du.from(e)),this._alg=t,this._key=e,e.length>mu?e=t(e):e.lengthr)?e=("rmd160"===t?new Tu:xu(t)).update(e).digest():e.lengthFu||e!=e)throw new TypeError("Bad key length")}),qu}var Ku,Wu,Gu,Yu=!1;function Vu(){return Yu||(Yu=!0,Ku={},jt(),t.process&&t.process.browser?Wu="utf-8":t.process&&t.process.version?(Gu=parseInt(jt().version.split(".")[0].slice(1),10),Wu=Gu>=6?"utf-8":"binary"):Wu="utf-8",Ku=Wu),Ku}var $u,Xu,Ju=!1;function Qu(){return Ju||(Ju=!0,$u={},Xu=lr().Buffer,$u=function(t,e,r){if(Xu.isBuffer(t))return t;if("string"==typeof t)return Xu.from(t,e);if(ArrayBuffer.isView(t))return Xu.from(t.buffer);throw new TypeError(r+" must be a string, a Buffer, a typed array or a DataView")}),$u}var tf,ef,rf,nf,of,sf,af,hf,uf,ff,lf=!1;function df(t,e,r){var i=function(t){function e(e){return nf(t).update(e).digest()}function r(t){return(new rf).update(t).digest()}return"rmd160"===t||"ripemd160"===t?r:"md5"===t?ef:e}(t),n="sha512"===t||"sha384"===t?128:64;e.length>n?e=i(e):e.length>>0},jf=function(t,e,r){t[0+r]=e>>>24,t[1+r]=e>>>16&255,t[2+r]=e>>>8&255,t[3+r]=255&e},Of.writeUInt32BE=jf,Uf=function(t,e,r,i){for(var n=0,o=0,s=6;s>=0;s-=2){for(var a=0;a<=24;a+=8)n<<=1,n|=e>>>a+s&1;for(a=0;a<=24;a+=8)n<<=1,n|=t>>>a+s&1}for(s=6;s>=0;s-=2){for(a=1;a<=25;a+=8)o<<=1,o|=e>>>a+s&1;for(a=1;a<=25;a+=8)o<<=1,o|=t>>>a+s&1}r[i+0]=n>>>0,r[i+1]=o>>>0},Of.ip=Uf,Nf=function(t,e,r,i){for(var n=0,o=0,s=0;s<4;s++)for(var a=24;a>=0;a-=8)n<<=1,n|=e>>>a+s&1,n<<=1,n|=t>>>a+s&1;for(s=4;s<8;s++)for(a=24;a>=0;a-=8)o<<=1,o|=e>>>a+s&1,o<<=1,o|=t>>>a+s&1;r[i+0]=n>>>0,r[i+1]=o>>>0},Of.rip=Nf,zf=function(t,e,r,i){for(var n=0,o=0,s=7;s>=5;s--){for(var a=0;a<=24;a+=8)n<<=1,n|=e>>a+s&1;for(a=0;a<=24;a+=8)n<<=1,n|=t>>a+s&1}for(a=0;a<=24;a+=8)n<<=1,n|=e>>a+s&1;for(s=1;s<=3;s++){for(a=0;a<=24;a+=8)o<<=1,o|=e>>a+s&1;for(a=0;a<=24;a+=8)o<<=1,o|=t>>a+s&1}for(a=0;a<=24;a+=8)o<<=1,o|=t>>a+s&1;r[i+0]=n>>>0,r[i+1]=o>>>0},Of.pc1=zf,qf=function(t,e){return t<>>28-e},Of.r28shl=qf,Ff=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24],Zf=function(t,e,r,i){for(var n=0,o=0,s=Ff.length>>>1,a=0;a>>Ff[a]&1;for(a=s;a>>Ff[a]&1;r[i+0]=n>>>0,r[i+1]=o>>>0},Of.pc2=Zf,Hf=function(t,e,r){var i=0,n=0;i=(1&t)<<5|t>>>27;for(var o=23;o>=15;o-=4)i<<=6,i|=t>>>o&63;for(o=11;o>=3;o-=4)n|=t>>>o&63,n<<=6;n|=(31&t)<<1|t>>>31,e[r+0]=i>>>0,e[r+1]=n>>>0},Of.expand=Hf,Kf=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11],Wf=function(t,e){for(var r=0,i=0;i<4;i++)r<<=4,r|=Kf[64*i+(t>>>18-6*i&63)];for(i=0;i<4;i++)r<<=4,r|=Kf[256+64*i+(e>>>18-6*i&63)];return r>>>0},Of.substitute=Wf,Gf=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7],Yf=function(t){for(var e=0,r=0;r>>Gf[r]&1;return e>>>0},Of.permute=Yf,Vf=function(t,e,r){for(var i=t.toString(2);i.length0;i--)e+=this._buffer(t,e),r+=this._flushBuffer(n,r);return e+=this._buffer(t,e),n},nl.prototype.final=function(t){var e,r;return t&&(e=this.update(t)),r="encrypt"===this.type?this._finalEncrypt():this._finalDecrypt(),e?e.concat(r):r},nl.prototype._pad=function(t,e){if(0===e)return!1;for(;e>>1];r=Xf().r28shl(r,o),i=Xf().r28shl(i,o),Xf().pc2(r,i,t.keys,n)}},dl.prototype._update=function(t,e,r,i){var n=this._desState,o=Xf().readUInt32BE(t,e),s=Xf().readUInt32BE(t,e+4);Xf().ip(o,s,n.tmp,0),o=n.tmp[0],s=n.tmp[1],"encrypt"===this.type?this._encrypt(n,o,s,n.tmp,0):this._decrypt(n,o,s,n.tmp,0),o=n.tmp[0],s=n.tmp[1],Xf().writeUInt32BE(r,o,i),Xf().writeUInt32BE(r,s,i+4)},dl.prototype._pad=function(t,e){for(var r=t.length-e,i=e;i>>0,o=l}Xf().rip(s,o,i,n)},dl.prototype._decrypt=function(t,e,r,i,n){for(var o=r,s=e,a=t.keys.length-2;a>=0;a-=2){var h=t.keys[a],u=t.keys[a+1];Xf().expand(o,t.tmp,0),h^=t.tmp[0],u^=t.tmp[1];var f=Xf().substitute(h,u),l=o;o=(s^Xf().permute(f))>>>0,s=l}Xf().rip(o,s,i,n)}),sl}var pl,ml,gl,vl,bl=!1;function yl(t){el().equal(t.length,8,"Invalid IV length"),this.iv=new Array(8);for(var e=0;e>o%8,t._prev=Ad(t._prev,r?i:n);return s}function Ad(t,e){var r=t.length,i=-1,n=yd.allocUnsafe(t.length);for(t=yd.concat([t,yd.from([e])]);++i>7;return n}function Ed(){return Md||(Md=!0,bd={},yd=lr().Buffer,wd=function(t,e,r){for(var i=e.length,n=yd.allocUnsafe(i),o=-1;++o>>24]^f[p>>>16&255]^l[m>>>8&255]^d[255&g]^e[v++],s=u[p>>>24]^f[m>>>16&255]^l[g>>>8&255]^d[255&c]^e[v++],a=u[m>>>24]^f[g>>>16&255]^l[c>>>8&255]^d[255&p]^e[v++],h=u[g>>>24]^f[c>>>16&255]^l[p>>>8&255]^d[255&m]^e[v++],c=o,p=s,m=a,g=h;return o=(i[c>>>24]<<24|i[p>>>16&255]<<16|i[m>>>8&255]<<8|i[255&g])^e[v++],s=(i[p>>>24]<<24|i[m>>>16&255]<<16|i[g>>>8&255]<<8|i[255&c])^e[v++],a=(i[m>>>24]<<24|i[g>>>16&255]<<16|i[c>>>8&255]<<8|i[255&p])^e[v++],h=(i[g>>>24]<<24|i[c>>>16&255]<<16|i[p>>>8&255]<<8|i[255&m])^e[v++],[o>>>=0,s>>>=0,a>>>=0,h>>>=0]}function hc(t){this._key=oc(t),this._reset()}function uc(){return nc||(nc=!0,Qd={},tc=lr().Buffer,ec=[0,1,2,4,8,16,32,64,128,27,54],rc=function(){for(var t=new Array(256),e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=[],i=[],n=[[],[],[],[]],o=[[],[],[],[]],s=0,a=0,h=0;h<256;++h){var u=a^a<<1^a<<2^a<<3^a<<4;u=u>>>8^255&u^99,r[s]=u,i[u]=s;var f=t[s],l=t[f],d=t[l],c=257*t[u]^16843008*u;n[0][s]=c<<24|c>>>8,n[1][s]=c<<16|c>>>16,n[2][s]=c<<8|c>>>24,n[3][s]=c,c=16843009*d^65537*l^257*f^16843008*s,o[0][u]=c<<24|c>>>8,o[1][u]=c<<16|c>>>16,o[2][u]=c<<8|c>>>24,o[3][u]=c,0===s?s=a=1:(s=f^t[t[t[d^f]]],a^=t[t[a]])}return{SBOX:r,INV_SBOX:i,SUB_MIX:n,INV_SUB_MIX:o}}(),hc.blockSize=16,hc.keySize=32,hc.prototype.blockSize=hc.blockSize,hc.prototype.keySize=hc.keySize,hc.prototype._reset=function(){for(var t=this._key,e=t.length,r=e+6,i=4*(r+1),n=[],o=0;o>>24,s=rc.SBOX[s>>>24]<<24|rc.SBOX[s>>>16&255]<<16|rc.SBOX[s>>>8&255]<<8|rc.SBOX[255&s],s^=ec[o/e|0]<<24):e>6&&o%e==4&&(s=rc.SBOX[s>>>24]<<24|rc.SBOX[s>>>16&255]<<16|rc.SBOX[s>>>8&255]<<8|rc.SBOX[255&s]),n[o]=n[o-e]^s}for(var a=[],h=0;h>>24]]^rc.INV_SUB_MIX[1][rc.SBOX[f>>>16&255]]^rc.INV_SUB_MIX[2][rc.SBOX[f>>>8&255]]^rc.INV_SUB_MIX[3][rc.SBOX[255&f]]}this._nRounds=r,this._keySchedule=n,this._invKeySchedule=a},hc.prototype.encryptBlockRaw=function(t){return ac(t=oc(t),this._keySchedule,rc.SUB_MIX,rc.SBOX,this._nRounds)},hc.prototype.encryptBlock=function(t){var e=this.encryptBlockRaw(t),r=tc.allocUnsafe(16);return r.writeUInt32BE(e[0],0),r.writeUInt32BE(e[1],4),r.writeUInt32BE(e[2],8),r.writeUInt32BE(e[3],12),r},hc.prototype.decryptBlock=function(t){var e=(t=oc(t))[1];t[1]=t[3],t[3]=e;var r=ac(t,this._invKeySchedule,rc.INV_SUB_MIX,rc.INV_SBOX,this._nRounds),i=tc.allocUnsafe(16);return i.writeUInt32BE(r[0],0),i.writeUInt32BE(r[3],4),i.writeUInt32BE(r[2],8),i.writeUInt32BE(r[1],12),i},hc.prototype.scrub=function(){sc(this._keySchedule),sc(this._invKeySchedule),sc(this._key)},ic=hc,Qd.AES=ic),Qd}var fc,lc,dc,cc=!1;function pc(t){var e=lc.allocUnsafe(16);return e.writeUInt32BE(t[0]>>>0,0),e.writeUInt32BE(t[1]>>>0,4),e.writeUInt32BE(t[2]>>>0,8),e.writeUInt32BE(t[3]>>>0,12),e}function mc(t){this.h=t,this.state=lc.alloc(16,0),this.cache=lc.allocUnsafe(0)}function gc(){return cc||(cc=!0,fc={},lc=lr().Buffer,dc=lc.alloc(16,0),mc.prototype.ghash=function(t){for(var e=-1;++e0;e--)i[e]=i[e]>>>1|(1&i[e-1])<<31;i[0]=i[0]>>>1,r&&(i[0]=i[0]^225<<24)}this.state=pc(n)},mc.prototype.update=function(t){var e;for(this.cache=lc.concat([this.cache,t]);this.cache.length>=16;)e=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(e)},mc.prototype.final=function(t,e){return this.cache.length&&this.ghash(lc.concat([this.cache,dc],16)),this.ghash(pc([0,t,0,e])),this.state},fc=mc),fc}var vc,bc,yc,wc,Mc,_c,Ac,Ec=!1;function Sc(t,e,r,i){yc.call(this);var n=bc.alloc(4,0);this._cipher=new(uc().AES)(e);var o=this._cipher.encryptBlock(n);this._ghash=new Mc(o),r=function(t,e,r){if(12===e.length)return t._finID=bc.concat([e,bc.from([0,0,0,1])]),bc.concat([e,bc.from([0,0,0,2])]);var i=new Mc(r),n=e.length,o=n%16;i.update(e),o&&(o=16-o,i.update(bc.alloc(o,0))),i.update(bc.alloc(8,0));var s=8*n,a=bc.alloc(8);a.writeUIntBE(s,0,8),i.update(a),t._finID=i.state;var h=bc.from(t._finID);return Ac(h),h}(this,r,o),this._prev=bc.from(r),this._cache=bc.allocUnsafe(0),this._secCache=bc.allocUnsafe(0),this._decrypt=i,this._alen=0,this._len=0,this._mode=t,this._authTag=null,this._called=!1}function kc(){vc={},uc(),bc=lr().Buffer,yc=tu(),wc=Ar(),Mc=gc(),_c=Jl(),Ac=Ld(),wc(Sc,yc),Sc.prototype._update=function(t){if(!this._called&&this._alen){var e=16-this._alen%16;e<16&&(e=bc.alloc(e,0),this._ghash.update(e))}this._called=!0;var r=this._mode.encrypt(this,t);return this._decrypt?this._ghash.update(t):this._ghash.update(r),this._len+=t.length,r},Sc.prototype._final=function(){if(this._decrypt&&!this._authTag)throw new Error("Unsupported state or unable to authenticate data");var t=_c(this._ghash.final(8*this._alen,8*this._len),this._cipher.encryptBlock(this._finID));if(this._decrypt&&function(t,e){var r=0;t.length!==e.length&&r++;for(var i=Math.min(t.length,e.length),n=0;n0||i>0;){var h=new Oc;h.update(a),h.update(t),e&&h.update(e),a=h.digest();var u=0;if(n>0){var f=o.length-n;u=Math.min(n,a.length),a.copy(o,f,0,u),n-=u}if(u0){var l=s.length-i,d=Math.min(i,a.length-u);a.copy(s,l,u,u+d),i-=d}}return a.fill(0),{key:o,iv:s}}function Nc(){return jc||(jc=!0,Dc={},Lc=lr().Buffer,Oc=ea(),Dc=Uc),Dc}var zc,qc,Fc,Zc,Hc,Kc,Wc,Gc,Yc,Vc,$c=!1;function Xc(t,e,r){Kc.call(this),this._cache=new Jc,this._cipher=new(uc().AES)(e),this._prev=Zc.from(r),this._mode=t,this._autopadding=!0}function Jc(){this.cache=Zc.allocUnsafe(0)}function Qc(t,e,r){var i=qc[t.toLowerCase()];if(!i)throw new TypeError("invalid suite type");if("string"==typeof e&&(e=Zc.from(e)),e.length!==i.key/8)throw new TypeError("invalid key length "+e.length);if("string"==typeof r&&(r=Zc.from(r)),"GCM"!==i.mode&&r.length!==i.iv)throw new TypeError("invalid iv length "+r.length);return"stream"===i.type?new Hc(i.module,e,r):"auth"===i.type?new Fc(i.module,e,r):new Xc(i.module,e,r)}function tp(t,e){var r=qc[t.toLowerCase()];if(!r)throw new TypeError("invalid suite type");var i=Wc(e,!1,r.key,r.iv);return Qc(t,i.key,i.iv)}function ep(){return $c||($c=!0,zc={},qc=Jd(),Fc=Bc(),Zc=lr().Buffer,Hc=Pc(),Kc=tu(),uc(),Wc=Nc(),Ar()(Xc,Kc),Xc.prototype._update=function(t){var e,r;this._cache.add(t);for(var i=[];e=this._cache.get();)r=this._mode.encrypt(this,e),i.push(r);return Zc.concat(i)},Gc=Zc.alloc(16,16),Xc.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return t=this._mode.encrypt(this,t),this._cipher.scrub(),t;if(!t.equals(Gc))throw this._cipher.scrub(),new Error("data not multiple of block length")},Xc.prototype.setAutoPadding=function(t){return this._autopadding=!!t,this},Jc.prototype.add=function(t){this.cache=Zc.concat([this.cache,t])},Jc.prototype.get=function(){if(this.cache.length>15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},Jc.prototype.flush=function(){for(var t=16-this.cache.length,e=Zc.allocUnsafe(t),r=-1;++r16)throw new Error("unable to decrypt data");for(var r=-1;++r16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},cp.prototype.flush=function(){if(this.cache.length)return this.cache},up=mp,rp.createDecipher=up,fp=pp,rp.createDecipheriv=fp}function vp(){return lp||(lp=!0,gp()),rp}var bp,yp,wp,Mp,_p,Ap,Ep,Sp,kp,Bp,Rp,Tp,xp=!1;function Ip(){return Object.keys(Ep)}function Cp(){return xp||(xp=!0,Ap={},ep(),vp(),Ep=Wd(),bp=ep().createCipher,Sp=Ap.Cipher=bp,Ap.createCipher=Sp,yp=ep().createCipheriv,kp=Ap.Cipheriv=yp,Ap.createCipheriv=kp,wp=vp().createDecipher,Bp=Ap.Decipher=wp,Ap.createDecipher=Bp,Mp=vp().createDecipheriv,Rp=Ap.Decipheriv=Mp,Ap.createDecipheriv=Rp,_p=Ip,Tp=Ap.getCiphers=_p,Ap.listCiphers=Tp),Ap}var Pp,Dp,Lp,Op,jp,Up,Np,zp,qp=!1;function Fp(){return qp||(qp=!0,(Lp={})["des-ecb"]={key:8,iv:0},Pp={key:8,iv:8},Op=Lp.des=Pp,Lp["des-cbc"]=Op,Dp={key:24,iv:8},jp=Lp.des3=Dp,Lp["des-ede3-cbc"]=jp,Up={key:24,iv:0},Lp["des-ede3"]=Up,Np={key:16,iv:8},Lp["des-ede-cbc"]=Np,zp={key:16,iv:0},Lp["des-ede"]=zp),Lp}var Zp,Hp,Kp,Wp,Gp,Yp,Vp,$p,Xp,Jp,Qp,tm,em,rm,im,nm=!1;function om(t,e){var r,i;if(t=t.toLowerCase(),$p[t])r=$p[t].key,i=$p[t].iv;else{if(!Xp[t])throw new TypeError("invalid suite type");r=8*Xp[t].key,i=Xp[t].iv}var n=Jp(e,!1,r,i);return am(t,n.key,n.iv)}function sm(t,e){var r,i;if(t=t.toLowerCase(),$p[t])r=$p[t].key,i=$p[t].iv;else{if(!Xp[t])throw new TypeError("invalid suite type");r=8*Xp[t].key,i=Xp[t].iv}var n=Jp(e,!1,r,i);return hm(t,n.key,n.iv)}function am(t,e,r){if(t=t.toLowerCase(),$p[t])return Cp().createCipheriv(t,e,r);if(Xp[t])return new Vp({key:e,iv:r,mode:t});throw new TypeError("invalid suite type")}function hm(t,e,r){if(t=t.toLowerCase(),$p[t])return Cp().createDecipheriv(t,e,r);if(Xp[t])return new Vp({key:e,iv:r,mode:t,decrypt:!0});throw new TypeError("invalid suite type")}function um(){return Object.keys(Xp).concat(Cp().getCiphers())}function fm(){return nm||(nm=!0,Yp={},Vp=Hl(),Cp(),$p=Jd(),Xp=Fp(),Jp=Nc(),Zp=om,Qp=Yp.Cipher=Zp,Yp.createCipher=Qp,Hp=am,tm=Yp.Cipheriv=Hp,Yp.createCipheriv=tm,Kp=sm,em=Yp.Decipher=Kp,Yp.createDecipher=em,Wp=hm,rm=Yp.Decipheriv=Wp,Yp.createDecipheriv=rm,Gp=um,im=Yp.getCiphers=Gp,Yp.listCiphers=im),Yp}var lm,dm=!1;function cm(){lm=function(){var t={exports:this};return function(t,e){function r(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function n(t,e,r){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{o="undefined"!=typeof window&&void 0!==window.Buffer?window.Buffer:ir().Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}function pm(){return dm||(dm=!0,cm()),lm}var mm,gm=!1;function vm(){mm=function(){var t={exports:this};return function(t,e){function r(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function n(t,e,r){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{o="undefined"!=typeof window&&void 0!==window.Buffer?window.Buffer:ir().Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}var bm,ym,wm,Mm=!1;function _m(t){this.rand=t}function Am(){return Mm||(Mm=!0,function(){if(bm={},bm=function(t){return ym||(ym=new _m(null)),ym.generate(t)},wm=_m,bm.Rand=wm,_m.prototype.generate=function(t){return this._rand(t)},_m.prototype._rand=function(t){if(this.rand.getBytes)return this.rand.getBytes(t);for(var e=new Uint8Array(t),r=0;r=0);return i},Bm.prototype._randrange=function(t,e){var r=e.sub(t);return t.add(this._randbelow(r))},Bm.prototype.test=function(t,e,r){var i=t.bitLength(),n=Sm.mont(t),o=new Sm(1).toRed(n);e||(e=Math.max(1,i/48|0));for(var s=t.subn(1),a=0;!s.testn(a);a++);for(var h=t.shrn(a),u=s.toRed(n);e>0;e--){var f=this._randrange(new Sm(2),s);r&&r(f);var l=f.toRed(n).redPow(h);if(0!==l.cmp(o)&&0!==l.cmp(u)){for(var d=1;d0;e--){var u=this._randrange(new Sm(2),o),f=t.gcd(u);if(0!==f.cmpn(1))return f;var l=u.toRed(i).redPow(a);if(0!==l.cmp(n)&&0!==l.cmp(h)){for(var d=1;dt;)r.ishrn(1);if(r.isEven()&&r.iadd(Om),r.testn(1)||r.iadd(jm),e.cmp(jm)){if(!e.cmp(Um))for(;r.mod(Nm).cmp(zm);)r.iadd(Fm)}else for(;r.mod(Pm).cmp(qm);)r.iadd(Fm);if(Km(i=r.shrn(1))&&Km(r)&&Wm(i)&&Wm(r)&&Lm.test(i)&&Lm.test(r))return r}}function Ym(){return Hm||(Hm=!0,xm={},Im=wr(),xm=Gm,Gm.simpleSieve=Km,Gm.fermatTest=Wm,Cm=pm(),Pm=new Cm(24),Dm=Tm(),Lm=new Dm,Om=new Cm(1),jm=new Cm(2),Um=new Cm(5),new Cm(16),new Cm(8),Nm=new Cm(10),zm=new Cm(3),new Cm(7),qm=new Cm(11),Fm=new Cm(4),new Cm(12),Zm=null),xm}var Vm,$m=!1;function Xm(){return $m||($m=!0,Vm={},Vm=JSON.parse('{"modp1":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},"modp2":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},"modp5":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},"modp14":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},"modp15":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},"modp16":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},"modp17":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},"modp18":{"gen":"02","prime":"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}')),Vm}var Jm,Qm,tg,eg,rg,ig,ng,og,sg,ag,hg,ug,fg=!1;function lg(t,e){return e=e||"utf8",Qm.isBuffer(t)||(t=new Qm(t,e)),this._pub=new tg(t),this}function dg(t,e){return e=e||"utf8",Qm.isBuffer(t)||(t=new Qm(t,e)),this._priv=new tg(t),this}function cg(t,e,r){this.setGenerator(e),this.__prime=new tg(t),this._prime=tg.mont(this.__prime),this._primeLen=t.length,this._pub=void 0,this._priv=void 0,this._primeCode=void 0,r?(this.setPublicKey=lg,this.setPrivateKey=dg):this._primeCode=8}function pg(t,e){var r=new Qm(t.toArray());return e?r.toString(e):r}function mg(){Jm={},Qm=Ye().Buffer,tg=pm(),eg=Tm(),rg=new eg,ig=new tg(24),ng=new tg(11),og=new tg(10),sg=new tg(3),ag=new tg(7),Ym(),hg=wr(),Jm=cg,ug={},Object.defineProperty(cg.prototype,"verifyError",{enumerable:!0,get:function(){return"number"!=typeof this._primeCode&&(this._primeCode=function(t,e){var r=e.toString("hex"),i=[r,t.toString(16)].join("_");if(i in ug)return ug[i];var n,o=0;if(t.isEven()||!Ym().simpleSieve||!Ym().fermatTest(t)||!rg.test(t))return o+=1,o+="02"===r||"05"===r?8:4,ug[i]=o,o;switch(rg.test(t.shrn(1))||(o+=2),r){case"02":t.mod(ig).cmp(ng)&&(o+=8);break;case"05":(n=t.mod(og)).cmp(sg)&&n.cmp(ag)&&(o+=8);break;default:o+=4}return ug[i]=o,o}(this.__prime,this.__gen)),this._primeCode}}),cg.prototype.generateKeys=function(){return this._priv||(this._priv=new tg(hg(this._primeLen))),this._pub=this._gen.toRed(this._prime).redPow(this._priv).fromRed(),this.getPublicKey()},cg.prototype.computeSecret=function(t){var e=(t=(t=new tg(t)).toRed(this._prime)).redPow(this._priv).fromRed(),r=new Qm(e.toArray()),i=this.getPrime();if(r.length=48&&i<=57?i-48:i>=65&&i<=70?i-55:i>=97&&i<=102?i-87:void r(!1,"Invalid character in "+t)}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,i,n){for(var o=0,s=0,a=Math.min(t.length,i),h=e;h=49?u-49+10:u>=17?u-17+10:u,r(u>=0&&s0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this._strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this._strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},"undefined"!=typeof Symbol&&"function"==typeof Symbol.for)try{n.prototype[Symbol.for("nodejs.util.inspect.custom")]=f}catch(t){n.prototype.inspect=f}else n.prototype.inspect=f;function f(){return(this.red?""}var l=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],d=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],c=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?l[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var u=d[t],f=c[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modrn(f).toString(t);i=(p=p.idivn(f)).isZero()?m+i:l[u-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16,2)},o&&(n.prototype.toBuffer=function(t,e){return this.toArrayLike(o,t,e)}),n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)};function p(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r._strip()}n.prototype.toArrayLike=function(t,e,i){this._strip();var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0");var s=function(t,e){return t.allocUnsafe?t.allocUnsafe(e):new t(e)}(t,o);return this["_toArrayLike"+("le"===e?"LE":"BE")](s,n),s},n.prototype._toArrayLikeLE=function(t,e){for(var r=0,i=0,n=0,o=0;n>8&255),r>16&255),6===o?(r>24&255),i=0,o=0):(i=s>>>24,o+=2)}if(r=0&&(t[r--]=s>>8&255),r>=0&&(t[r--]=s>>16&255),6===o?(r>=0&&(t[r--]=s>>24&255),i=0,o=0):(i=s>>>24,o+=2)}if(r>=0)for(t[r--]=i;r>=0;)t[r--]=0},Math.clz32?n.prototype._countBits=function(t){return 32-Math.clz32(t)}:n.prototype._countBits=function(t){var e=t,r=0;return e>=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this._strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function g(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r._strip()}function v(t,e,r){return g(t,e,r)}function b(t,e){this.x=t,this.y=e}Math.imul||(m=p),n.prototype.mulTo=function(t,e){var r=this.length+t.length;return 10===this.length&&10===t.length?m(this,t,e):r<63?p(this,t,e):r<1024?g(this,t,e):v(this,t,e)},b.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},b.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,i+=o/67108864|0,i+=s>>>26,this.words[n]=67108863&s}return 0!==i&&(this.words[n]=i,this.length++),e?this.ineg():this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n&1}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this._strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this._strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this._strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a._strip(),i._strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modrn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modrn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modrn=function(t){var e=t<0;e&&(t=-t),r(t<=67108863);for(var i=(1<<26)%t,n=0,o=this.length-1;o>=0;o--)n=(i*n+(0|this.words[o]))%t;return e?-n:n},n.prototype.modn=function(t){return this.modrn(t)},n.prototype.idivn=function(t){var e=t<0;e&&(t=-t),r(t<=67108863);for(var i=0,n=this.length-1;n>=0;n--){var o=(0|this.words[n])+67108864*i;this.words[n]=o/t|0,i=o%t}return this._strip(),e?this.ineg():this},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this._strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new S(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var y={k256:null,p224:null,p192:null,p25519:null};function w(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function M(){w.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function _(){w.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function A(){w.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function E(){w.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function S(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function k(t){S.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}w.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},w.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},w.prototype.split=function(t,e){t.iushrn(this.n,0,e)},w.prototype.imulK=function(t){return t.imul(this.k)},i(M,w),M.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},M.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(y[t])return y[t];var e;if("k256"===t)e=new M;else if("p224"===t)e=new _;else if("p192"===t)e=new A;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new E}return y[t]=e,e},S.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},S.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},S.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):(u(t,t.umod(this.m)._forceRed(this)),t)},S.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},S.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},S.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},S.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},S.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},S.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},S.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},S.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},S.prototype.isqr=function(t){return this.imul(t,t.clone())},S.prototype.sqr=function(t){return this.mul(t,t)},S.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},S.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},S.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new k(t)},i(k,S),k.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},k.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},k.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},k.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},k.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}function Dg(){return Cg||(Cg=!0,Pg()),Ig}var Lg,Og,jg,Ug,Ng=!1;function zg(t){var e,r=t.modulus.byteLength();do{e=new jg(Ug(r))}while(e.cmp(t.modulus)>=0||!e.umod(t.prime1)||!e.umod(t.prime2));return e}function qg(t,e){var r=function(t){var e=zg(t);return{blinder:e.toRed(jg.mont(t.modulus)).redPow(new jg(t.publicExponent)).fromRed(),unblinder:e.invm(t.modulus)}}(e),i=e.modulus.byteLength(),n=new jg(t).mul(r.blinder).umod(e.modulus),o=n.toRed(jg.mont(e.prime1)),s=n.toRed(jg.mont(e.prime2)),a=e.coefficient,h=e.prime1,u=e.prime2,f=o.redPow(e.exponent1).fromRed(),l=s.redPow(e.exponent2).fromRed(),d=f.isub(l).imul(a).umod(h).imul(u);return l.iadd(d).imul(r.unblinder).umod(e.modulus).toArrayLike(Og,"be",i)}function Fg(){return Ng||(Ng=!0,Lg={},Og=Ye().Buffer,jg=Dg(),Ug=wr(),qg.getr=zg,Lg=qg),Lg}var Zg,Hg=!1;function Kg(){return Hg||(Hg=!0,Zg={},Zg=JSON.parse('{"_from":"elliptic@^6.5.3","_id":"elliptic@6.5.4","_inBundle":false,"_integrity":"sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==","_location":"/elliptic","_phantomChildren":{},"_requested":{"type":"range","registry":true,"raw":"elliptic@^6.5.3","name":"elliptic","escapedName":"elliptic","rawSpec":"^6.5.3","saveSpec":null,"fetchSpec":"^6.5.3"},"_requiredBy":["/browserify-sign","/create-ecdh"],"_resolved":"https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz","_shasum":"da37cebd31e79a1367e941b592ed1fbebd58abbb","_spec":"elliptic@^6.5.3","_where":"/home/lin/server/jessibuca/node_modules/browserify-sign","author":{"name":"Fedor Indutny","email":"fedor@indutny.com"},"bugs":{"url":"https://github.com/indutny/elliptic/issues"},"bundleDependencies":false,"dependencies":{"bn.js":"^4.11.9","brorand":"^1.1.0","hash.js":"^1.0.0","hmac-drbg":"^1.0.1","inherits":"^2.0.4","minimalistic-assert":"^1.0.1","minimalistic-crypto-utils":"^1.0.1"},"deprecated":false,"description":"EC cryptography","devDependencies":{"brfs":"^2.0.2","coveralls":"^3.1.0","eslint":"^7.6.0","grunt":"^1.2.1","grunt-browserify":"^5.3.0","grunt-cli":"^1.3.2","grunt-contrib-connect":"^3.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^5.0.0","grunt-mocha-istanbul":"^5.0.2","grunt-saucelabs":"^9.0.1","istanbul":"^0.4.5","mocha":"^8.0.1"},"files":["lib"],"homepage":"https://github.com/indutny/elliptic","keywords":["EC","Elliptic","curve","Cryptography"],"license":"MIT","main":"lib/elliptic.js","name":"elliptic","repository":{"type":"git","url":"git+ssh://git@github.com/indutny/elliptic.git"},"scripts":{"lint":"eslint lib test","lint:fix":"npm run lint -- --fix","test":"npm run lint && npm run unit","unit":"istanbul test _mocha --reporter=spec test/index.js","version":"grunt dist && git add dist/"},"version":"6.5.4"}')),Zg}var Wg,Gg=!1;function Yg(){Wg=function(){var t={exports:this};return function(t,e){function r(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function n(t,e,r){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{o="undefined"!=typeof window&&void 0!==window.Buffer?window.Buffer:ir().Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}function Vg(){return Gg||(Gg=!0,Yg()),Wg}var $g,Xg,Jg=!1;function Qg(t,e){if(Array.isArray(t))return t.slice();if(!t)return[];var r=[];if("string"!=typeof t){for(var i=0;i>8,s=255&n;o?r.push(o,s):r.push(s)}return r}function tv(t){return 1===t.length?"0"+t:t}function ev(t){for(var e="",r=0;r(n>>1)-1?(n>>1)-h:h,o.isubn(a)):a=0,i[s]=a,o.iushrn(1)}return i}function uv(t,e){var r=[[],[]];t=t.clone(),e=e.clone();for(var i,n=0,o=0;t.cmpn(-n)>0||e.cmpn(-o)>0;){var s,a,h=t.andln(3)+n&3,u=e.andln(3)+o&3;3===h&&(h=-1),3===u&&(u=-1),s=0==(1&h)?0:3!==(i=t.andln(7)+n&7)&&5!==i||2!==u?h:-h,r[0].push(s),a=0==(1&u)?0:3!==(i=e.andln(7)+o&7)&&5!==i||2!==h?u:-u,r[1].push(a),2*n===s+1&&(n=1-n),2*o===a+1&&(o=1-o),t.iushrn(1),e.iushrn(1)}return r}function fv(t,e,r){var i="_"+e;t.prototype[e]=function(){return void 0!==this[i]?this[i]:this[i]=r.call(this)}}function lv(t){return"string"==typeof t?nv.toArray(t,"hex"):t}function dv(t){return new ov(t,"hex","le")}function cv(){return av||(av=!0,nv=iv={},ov=Vg(),sv=el(),rv(),nv.assert=sv,nv.toArray=rv().toArray,nv.zero2=rv().zero2,nv.toHex=rv().toHex,nv.encode=rv().encode,nv.getNAF=hv,nv.getJSF=uv,nv.cachedProperty=fv,nv.parseBytes=lv,nv.intFromLE=dv),iv}var pv,mv,gv,vv,bv,yv=!1;function wv(t,e){this.type=t,this.p=new mv(e.p,16),this.red=e.prime?mv.red(e.prime):mv.mont(this.p),this.zero=new mv(0).toRed(this.red),this.one=new mv(1).toRed(this.red),this.two=new mv(2).toRed(this.red),this.n=e.n&&new mv(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4),this._bitLength=this.n?this.n.bitLength():0;var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function Mv(t,e){this.curve=t,this.type=e,this.precomputed=null}function _v(){return yv||(yv=!0,pv={},mv=Vg(),cv(),gv=cv().getNAF,vv=cv().getJSF,bv=cv().assert,pv=wv,wv.prototype.point=function(){throw new Error("Not implemented")},wv.prototype.validate=function(){throw new Error("Not implemented")},wv.prototype._fixedNafMul=function(t,e){bv(t.precomputed);var r=t._getDoubles(),i=gv(e,1,this._bitLength),n=(1<=o;h--)s=(s<<1)+i[h];a.push(s)}for(var u=this.jpoint(null,null,null),f=this.jpoint(null,null,null),l=n;l>0;l--){for(o=0;o=0;a--){for(var h=0;a>=0&&0===o[a];a--)h++;if(a>=0&&h++,s=s.dblp(h),a<0)break;var u=o[a];bv(0!==u),s="affine"===t.type?u>0?s.mixedAdd(n[u-1>>1]):s.mixedAdd(n[-u-1>>1].neg()):u>0?s.add(n[u-1>>1]):s.add(n[-u-1>>1].neg())}return"affine"===t.type?s.toP():s},wv.prototype._wnafMulAdd=function(t,e,r,i,n){var o,s,a,h=this._wnafT1,u=this._wnafT2,f=this._wnafT3,l=0;for(o=0;o=1;o-=2){var c=o-1,p=o;if(1===h[c]&&1===h[p]){var m=[e[c],null,null,e[p]];0===e[c].y.cmp(e[p].y)?(m[1]=e[c].add(e[p]),m[2]=e[c].toJ().mixedAdd(e[p].neg())):0===e[c].y.cmp(e[p].y.redNeg())?(m[1]=e[c].toJ().mixedAdd(e[p]),m[2]=e[c].add(e[p].neg())):(m[1]=e[c].toJ().mixedAdd(e[p]),m[2]=e[c].toJ().mixedAdd(e[p].neg()));var g=[-3,-1,-5,-7,0,7,5,1,3],v=vv(r[c],r[p]);for(l=Math.max(v[0].length,l),f[c]=new Array(l),f[p]=new Array(l),s=0;s=0;o--){for(var _=0;o>=0;){var A=!0;for(s=0;s=0&&_++,w=w.dblp(_),o<0)break;for(s=0;s0?a=u[s][E-1>>1]:E<0&&(a=u[s][-E-1>>1].neg()),w="affine"===a.type?w.mixedAdd(a):w.add(a))}}for(o=0;o=Math.ceil((t.bitLength()+1)/e.step)},Mv.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],i=this,n=0;n=0&&(o=e,s=r),i.negative&&(i=i.neg(),n=n.neg()),o.negative&&(o=o.neg(),s=s.neg()),[{a:i,b:n},{a:o,b:s}]},Tv.prototype._endoSplit=function(t){var e=this.endo.basis,r=e[0],i=e[1],n=i.b.mul(t).divRound(this.n),o=r.b.neg().mul(t).divRound(this.n),s=n.mul(r.a),a=o.mul(i.a),h=n.mul(r.b),u=o.mul(i.b);return{k1:t.sub(s).sub(a),k2:h.add(u).neg()}},Tv.prototype.pointFromX=function(t,e){(t=new Ev(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr().redMul(t).redIAdd(t.redMul(this.a)).redIAdd(this.b),i=r.redSqrt();if(0!==i.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var n=i.fromRed().isOdd();return(e&&!n||!e&&n)&&(i=i.redNeg()),this.point(t,i)},Tv.prototype.validate=function(t){if(t.inf)return!0;var e=t.x,r=t.y,i=this.a.redMul(e),n=e.redSqr().redMul(e).redIAdd(i).redIAdd(this.b);return 0===r.redSqr().redISub(n).cmpn(0)},Tv.prototype._endoWnafMulAdd=function(t,e,r){for(var i=this._endoWnafT1,n=this._endoWnafT2,o=0;o":""},xv.prototype.isInfinity=function(){return this.inf},xv.prototype.add=function(t){if(this.inf)return t;if(t.inf)return this;if(this.eq(t))return this.dbl();if(this.neg().eq(t))return this.curve.point(null,null);if(0===this.x.cmp(t.x))return this.curve.point(null,null);var e=this.y.redSub(t.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(t.x).redInvm()));var r=e.redSqr().redISub(this.x).redISub(t.x),i=e.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,i)},xv.prototype.dbl=function(){if(this.inf)return this;var t=this.y.redAdd(this.y);if(0===t.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,r=this.x.redSqr(),i=t.redInvm(),n=r.redAdd(r).redIAdd(r).redIAdd(e).redMul(i),o=n.redSqr().redISub(this.x.redAdd(this.x)),s=n.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,s)},xv.prototype.getX=function(){return this.x.fromRed()},xv.prototype.getY=function(){return this.y.fromRed()},xv.prototype.mul=function(t){return t=new Ev(t,16),this.isInfinity()?this:this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve.endo?this.curve._endoWnafMulAdd([this],[t]):this.curve._wnafMul(this,t)},xv.prototype.mulAdd=function(t,e,r){var i=[this,e],n=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(i,n):this.curve._wnafMulAdd(1,i,n,2)},xv.prototype.jmulAdd=function(t,e,r){var i=[this,e],n=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(i,n,!0):this.curve._wnafMulAdd(1,i,n,2,!0)},xv.prototype.eq=function(t){return this===t||this.inf===t.inf&&(this.inf||0===this.x.cmp(t.x)&&0===this.y.cmp(t.y))},xv.prototype.neg=function(t){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(t&&this.precomputed){var r=this.precomputed,i=function(t){return t.neg()};e.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(i)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(i)}}}return e},xv.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},Sv(Iv,kv.BasePoint),Tv.prototype.jpoint=function(t,e,r){return new Iv(this,t,e,r)},Iv.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var t=this.z.redInvm(),e=t.redSqr(),r=this.x.redMul(e),i=this.y.redMul(e).redMul(t);return this.curve.point(r,i)},Iv.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},Iv.prototype.add=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.z.redSqr(),r=this.z.redSqr(),i=this.x.redMul(e),n=t.x.redMul(r),o=this.y.redMul(e.redMul(t.z)),s=t.y.redMul(r.redMul(this.z)),a=i.redSub(n),h=o.redSub(s);if(0===a.cmpn(0))return 0!==h.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=a.redSqr(),f=u.redMul(a),l=i.redMul(u),d=h.redSqr().redIAdd(f).redISub(l).redISub(l),c=h.redMul(l.redISub(d)).redISub(o.redMul(f)),p=this.z.redMul(t.z).redMul(a);return this.curve.jpoint(d,c,p)},Iv.prototype.mixedAdd=function(t){if(this.isInfinity())return t.toJ();if(t.isInfinity())return this;var e=this.z.redSqr(),r=this.x,i=t.x.redMul(e),n=this.y,o=t.y.redMul(e).redMul(this.z),s=r.redSub(i),a=n.redSub(o);if(0===s.cmpn(0))return 0!==a.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var h=s.redSqr(),u=h.redMul(s),f=r.redMul(h),l=a.redSqr().redIAdd(u).redISub(f).redISub(f),d=a.redMul(f.redISub(l)).redISub(n.redMul(u)),c=this.z.redMul(s);return this.curve.jpoint(l,d,c)},Iv.prototype.dblp=function(t){if(0===t)return this;if(this.isInfinity())return this;if(!t)return this.dbl();var e;if(this.curve.zeroA||this.curve.threeA){var r=this;for(e=0;e=0)return!1;if(r.redIAdd(n),0===this.x.cmp(r))return!0}},Iv.prototype.inspect=function(){return this.isInfinity()?"":""},Iv.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}),Av}var Pv,Dv,Lv,Ov,jv=!1;function Uv(t){Ov.call(this,"mont",t),this.a=new Dv(t.a,16).toRed(this.red),this.b=new Dv(t.b,16).toRed(this.red),this.i4=new Dv(4).toRed(this.red).redInvm(),this.two=new Dv(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function Nv(t,e,r){Ov.BasePoint.call(this,t,"projective"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new Dv(e,16),this.z=new Dv(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}function zv(){return jv||(jv=!0,Pv={},Dv=Vg(),Lv=Ar(),Ov=_v(),cv(),Lv(Uv,Ov),Pv=Uv,Uv.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),i=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e);return 0===i.redSqrt().redSqr().cmp(i)},Lv(Nv,Ov.BasePoint),Uv.prototype.decodePoint=function(t,e){return this.point(cv().toArray(t,e),1)},Uv.prototype.point=function(t,e){return new Nv(this,t,e)},Uv.prototype.pointFromJSON=function(t){return Nv.fromJSON(this,t)},Nv.prototype.precompute=function(){},Nv.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},Nv.fromJSON=function(t,e){return new Nv(t,e[0],e[1]||t.one)},Nv.prototype.inspect=function(){return this.isInfinity()?"":""},Nv.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},Nv.prototype.dbl=function(){var t=this.x.redAdd(this.z).redSqr(),e=this.x.redSub(this.z).redSqr(),r=t.redSub(e),i=t.redMul(e),n=r.redMul(e.redAdd(this.curve.a24.redMul(r)));return this.curve.point(i,n)},Nv.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},Nv.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),i=this.x.redSub(this.z),n=t.x.redAdd(t.z),o=t.x.redSub(t.z).redMul(r),s=n.redMul(i),a=e.z.redMul(o.redAdd(s).redSqr()),h=e.x.redMul(o.redISub(s).redSqr());return this.curve.point(a,h)},Nv.prototype.mul=function(t){for(var e=t.clone(),r=this,i=this.curve.point(null,null),n=[];0!==e.cmpn(0);e.iushrn(1))n.push(e.andln(1));for(var o=n.length-1;o>=0;o--)0===n[o]?(r=r.diffAdd(i,this),i=i.dbl()):(i=r.diffAdd(i,this),r=r.dbl());return i},Nv.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},Nv.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},Nv.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},Nv.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},Nv.prototype.getX=function(){return this.normalize(),this.x.fromRed()}),Pv}var qv,Fv,Zv,Hv,Kv,Wv=!1;function Gv(t){this.twisted=1!=(0|t.a),this.mOneA=this.twisted&&-1==(0|t.a),this.extended=this.mOneA,Hv.call(this,"edwards",t),this.a=new Fv(t.a,16).umod(this.red.m),this.a=this.a.toRed(this.red),this.c=new Fv(t.c,16).toRed(this.red),this.c2=this.c.redSqr(),this.d=new Fv(t.d,16).toRed(this.red),this.dd=this.d.redAdd(this.d),Kv(!this.twisted||0===this.c.fromRed().cmpn(1)),this.oneC=1==(0|t.c)}function Yv(t,e,r,i,n){Hv.BasePoint.call(this,t,"projective"),null===e&&null===r&&null===i?(this.x=this.curve.zero,this.y=this.curve.one,this.z=this.curve.one,this.t=this.curve.zero,this.zOne=!0):(this.x=new Fv(e,16),this.y=new Fv(r,16),this.z=i?new Fv(i,16):this.curve.one,this.t=n&&new Fv(n,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.t&&!this.t.red&&(this.t=this.t.toRed(this.curve.red)),this.zOne=this.z===this.curve.one,this.curve.extended&&!this.t&&(this.t=this.x.redMul(this.y),this.zOne||(this.t=this.t.redMul(this.z.redInvm()))))}function Vv(){return Wv||(Wv=!0,qv={},cv(),Fv=Vg(),Zv=Ar(),Hv=_v(),Kv=cv().assert,Zv(Gv,Hv),qv=Gv,Gv.prototype._mulA=function(t){return this.mOneA?t.redNeg():this.a.redMul(t)},Gv.prototype._mulC=function(t){return this.oneC?t:this.c.redMul(t)},Gv.prototype.jpoint=function(t,e,r,i){return this.point(t,e,r,i)},Gv.prototype.pointFromX=function(t,e){(t=new Fv(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr(),i=this.c2.redSub(this.a.redMul(r)),n=this.one.redSub(this.c2.redMul(this.d).redMul(r)),o=i.redMul(n.redInvm()),s=o.redSqrt();if(0!==s.redSqr().redSub(o).cmp(this.zero))throw new Error("invalid point");var a=s.fromRed().isOdd();return(e&&!a||!e&&a)&&(s=s.redNeg()),this.point(t,s)},Gv.prototype.pointFromY=function(t,e){(t=new Fv(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr(),i=r.redSub(this.c2),n=r.redMul(this.d).redMul(this.c2).redSub(this.a),o=i.redMul(n.redInvm());if(0===o.cmp(this.zero)){if(e)throw new Error("invalid point");return this.point(this.zero,t)}var s=o.redSqrt();if(0!==s.redSqr().redSub(o).cmp(this.zero))throw new Error("invalid point");return s.fromRed().isOdd()!==e&&(s=s.redNeg()),this.point(s,t)},Gv.prototype.validate=function(t){if(t.isInfinity())return!0;t.normalize();var e=t.x.redSqr(),r=t.y.redSqr(),i=e.redMul(this.a).redAdd(r),n=this.c2.redMul(this.one.redAdd(this.d.redMul(e).redMul(r)));return 0===i.cmp(n)},Zv(Yv,Hv.BasePoint),Gv.prototype.pointFromJSON=function(t){return Yv.fromJSON(this,t)},Gv.prototype.point=function(t,e,r,i){return new Yv(this,t,e,r,i)},Yv.fromJSON=function(t,e){return new Yv(t,e[0],e[1],e[2])},Yv.prototype.inspect=function(){return this.isInfinity()?"":""},Yv.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},Yv.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var i=this.curve._mulA(t),n=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),o=i.redAdd(e),s=o.redSub(r),a=i.redSub(e),h=n.redMul(s),u=o.redMul(a),f=n.redMul(a),l=s.redMul(o);return this.curve.point(h,u,l,f)},Yv.prototype._projDbl=function(){var t,e,r,i,n,o,s=this.x.redAdd(this.y).redSqr(),a=this.x.redSqr(),h=this.y.redSqr();if(this.curve.twisted){var u=(i=this.curve._mulA(a)).redAdd(h);this.zOne?(t=s.redSub(a).redSub(h).redMul(u.redSub(this.curve.two)),e=u.redMul(i.redSub(h)),r=u.redSqr().redSub(u).redSub(u)):(n=this.z.redSqr(),o=u.redSub(n).redISub(n),t=s.redSub(a).redISub(h).redMul(o),e=u.redMul(i.redSub(h)),r=u.redMul(o))}else i=a.redAdd(h),n=this.curve._mulC(this.z).redSqr(),o=i.redSub(n).redSub(n),t=this.curve._mulC(s.redISub(i)).redMul(o),e=this.curve._mulC(i).redMul(a.redISub(h)),r=i.redMul(o);return this.curve.point(t,e,r)},Yv.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},Yv.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),i=this.t.redMul(this.curve.dd).redMul(t.t),n=this.z.redMul(t.z.redAdd(t.z)),o=r.redSub(e),s=n.redSub(i),a=n.redAdd(i),h=r.redAdd(e),u=o.redMul(s),f=a.redMul(h),l=o.redMul(h),d=s.redMul(a);return this.curve.point(u,f,d,l)},Yv.prototype._projAdd=function(t){var e,r,i=this.z.redMul(t.z),n=i.redSqr(),o=this.x.redMul(t.x),s=this.y.redMul(t.y),a=this.curve.d.redMul(o).redMul(s),h=n.redSub(a),u=n.redAdd(a),f=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(o).redISub(s),l=i.redMul(h).redMul(f);return this.curve.twisted?(e=i.redMul(u).redMul(s.redSub(this.curve._mulA(o))),r=h.redMul(u)):(e=i.redMul(u).redMul(s.redSub(o)),r=this.curve._mulC(h).redMul(u)),this.curve.point(l,e,r)},Yv.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},Yv.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},Yv.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!1)},Yv.prototype.jmulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!0)},Yv.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},Yv.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},Yv.prototype.getX=function(){return this.normalize(),this.x.fromRed()},Yv.prototype.getY=function(){return this.normalize(),this.y.fromRed()},Yv.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},Yv.prototype.eqXToP=function(t){var e=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(e))return!0;for(var r=t.clone(),i=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(e.redIAdd(i),0===this.x.cmp(e))return!0}},Yv.prototype.toP=Yv.prototype.normalize,Yv.prototype.mixedAdd=Yv.prototype.add),qv}var $v,Xv,Jv=!1;function Qv(){return Jv||(Jv=!0,(Xv=$v={}).base=_v(),Xv.short=Cv(),Xv.mont=zv(),Xv.edwards=Vv()),$v}var tb,eb,rb,ib,nb,ob,sb,ab,hb,ub,fb,lb,db,cb,pb,mb,gb,vb,bb,yb,wb,Mb,_b,Ab,Eb,Sb,kb,Bb,Rb,Tb=!1;function xb(t,e){return 55296==(64512&t.charCodeAt(e))&&(!(e<0||e+1>=t.length)&&56320==(64512&t.charCodeAt(e+1)))}function Ib(t,e){if(Array.isArray(t))return t.slice();if(!t)return[];var r=[];if("string"==typeof t)if(e){if("hex"===e)for((t=t.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(t="0"+t),n=0;n>6|192,r[i++]=63&o|128):xb(t,n)?(o=65536+((1023&o)<<10)+(1023&t.charCodeAt(++n)),r[i++]=o>>18|240,r[i++]=o>>12&63|128,r[i++]=o>>6&63|128,r[i++]=63&o|128):(r[i++]=o>>12|224,r[i++]=o>>6&63|128,r[i++]=63&o|128)}else for(n=0;n>>24|t>>>8&65280|t<<8&16711680|(255&t)<<24)>>>0}function Db(t,e){for(var r="",i=0;i>>0}return o}function Ub(t,e){for(var r=new Array(4*t.length),i=0,n=0;i>>24,r[n+1]=o>>>16&255,r[n+2]=o>>>8&255,r[n+3]=255&o):(r[n+3]=o>>>24,r[n+2]=o>>>16&255,r[n+1]=o>>>8&255,r[n]=255&o)}return r}function Nb(t,e){return t>>>e|t<<32-e}function zb(t,e){return t<>>32-e}function qb(t,e){return t+e>>>0}function Fb(t,e,r){return t+e+r>>>0}function Zb(t,e,r,i){return t+e+r+i>>>0}function Hb(t,e,r,i,n){return t+e+r+i+n>>>0}function Kb(t,e,r,i){var n=t[e],o=i+t[e+1]>>>0,s=(o>>0,t[e+1]=o}function Wb(t,e,r,i){return(e+i>>>0>>0}function Gb(t,e,r,i){return e+i>>>0}function Yb(t,e,r,i,n,o,s,a){var h=0,u=e;return h+=(u=u+i>>>0)>>0)>>0)>>0}function Vb(t,e,r,i,n,o,s,a){return e+i+o+a>>>0}function $b(t,e,r,i,n,o,s,a,h,u){var f=0,l=e;return f+=(l=l+i>>>0)>>0)>>0)>>0)>>0}function Xb(t,e,r,i,n,o,s,a,h,u){return e+i+o+a+u>>>0}function Jb(t,e,r){return(e<<32-r|t>>>r)>>>0}function Qb(t,e,r){return(t<<32-r|e>>>r)>>>0}function ty(t,e,r){return t>>>r}function ey(t,e,r){return(t<<32-r|e>>>r)>>>0}function ry(){return Tb||(Tb=!0,tb={},eb=el(),rb=Ar(),ib=rb,tb.inherits=ib,nb=Ib,tb.toArray=nb,ob=Cb,tb.toHex=ob,sb=Pb,tb.htonl=sb,ab=Db,tb.toHex32=ab,hb=Lb,tb.zero2=hb,ub=Ob,tb.zero8=ub,fb=jb,tb.join32=fb,lb=Ub,tb.split32=lb,db=Nb,tb.rotr32=db,cb=zb,tb.rotl32=cb,pb=qb,tb.sum32=pb,mb=Fb,tb.sum32_3=mb,gb=Zb,tb.sum32_4=gb,vb=Hb,tb.sum32_5=vb,bb=Kb,tb.sum64=bb,yb=Wb,tb.sum64_hi=yb,wb=Gb,tb.sum64_lo=wb,Mb=Yb,tb.sum64_4_hi=Mb,_b=Vb,tb.sum64_4_lo=_b,Ab=$b,tb.sum64_5_hi=Ab,Eb=Xb,tb.sum64_5_lo=Eb,Sb=Jb,tb.rotr64_hi=Sb,kb=Qb,tb.rotr64_lo=kb,Bb=ty,tb.shr64_hi=Bb,Rb=ey,tb.shr64_lo=Rb),tb}var iy,ny,oy,sy=!1;function ay(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}function hy(){return sy||(sy=!0,iy={},ry(),ny=el(),oy=ay,iy.BlockHash=oy,ay.prototype.update=function(t,e){if(t=ry().toArray(t,e),this.pending?this.pending=this.pending.concat(t):this.pending=t,this.pendingTotal+=t.length,this.pending.length>=this._delta8){var r=(t=this.pending).length%this._delta8;this.pending=t.slice(t.length-r,t.length),0===this.pending.length&&(this.pending=null),t=ry().join32(t,0,t.length-r,this.endian);for(var i=0;i>>24&255,i[n++]=t>>>16&255,i[n++]=t>>>8&255,i[n++]=255&t}else for(i[n++]=255&t,i[n++]=t>>>8&255,i[n++]=t>>>16&255,i[n++]=t>>>24&255,i[n++]=0,i[n++]=0,i[n++]=0,i[n++]=0,o=8;o>>3}function Sy(t){return fy(t,17)^fy(t,19)^t>>>10}function ky(){return by||(by=!0,uy={},ry(),fy=ry().rotr32,ly=yy,uy.ft_1=ly,dy=wy,uy.ch32=dy,cy=My,uy.maj32=cy,py=_y,uy.s0_256=py,my=Ay,uy.s1_256=my,gy=Ey,uy.g0_256=gy,vy=Sy,uy.g1_256=vy),uy}var By,Ry,Ty,xy,Iy,Cy,Py,Dy=!1;function Ly(){if(!(this instanceof Ly))return new Ly;Cy.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}function Oy(){return Dy||(Dy=!0,By={},ry(),hy(),ky(),Ry=ry().rotl32,Ty=ry().sum32,xy=ry().sum32_5,Iy=ky().ft_1,Cy=hy().BlockHash,Py=[1518500249,1859775393,2400959708,3395469782],ry().inherits(Ly,Cy),By=Ly,Ly.blockSize=512,Ly.outSize=160,Ly.hmacStrength=80,Ly.padLength=64,Ly.prototype._update=function(t,e){for(var r=this.W,i=0;i<16;i++)r[i]=t[e+i];for(;ithis.blockSize&&(t=(new this.Hash).update(t).digest()),uM(t.length<=this.blockSize);for(var e=t.length;e=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,r,i)}function CM(){return xM||(xM=!0,RM={},gM(),rv(),TM=el(),RM=IM,IM.prototype._init=function(t,e,r){var i=t.concat(e).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var n=0;n=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(r||[])),this._reseed=1},IM.prototype.generate=function(t,e,r,i){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(i=r,r=e,e=null),r&&(r=rv().toArray(r,i||"hex"),this._update(r));for(var n=[];n.length"}),PM}var NM,zM,qM,FM=!1;function ZM(t,e){if(t instanceof ZM)return t;this._importDER(t,e)||(qM(t.r&&t.s,"Signature without r or s"),this.r=new zM(t.r,16),this.s=new zM(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam)}function HM(){this.place=0}function KM(t,e){var r=t[e.place++];if(!(128&r))return r;var i=15&r;if(0===i||i>4)return!1;for(var n=0,o=0,s=e.place;o>>=0;return!(n<=127)&&(e.place=s,n)}function WM(t){for(var e=0,r=t.length-1;!t[e]&&!(128&t[e+1])&&e>>3);for(t.push(128|r);--r;)t.push(e>>>(r<<3)&255);t.push(e)}}function YM(){return FM||(FM=!0,NM={},zM=Vg(),cv(),qM=cv().assert,NM=ZM,ZM.prototype._importDER=function(t,e){t=cv().toArray(t,e);var r=new HM;if(48!==t[r.place++])return!1;var i=KM(t,r);if(!1===i)return!1;if(i+r.place!==t.length)return!1;if(2!==t[r.place++])return!1;var n=KM(t,r);if(!1===n)return!1;var o=t.slice(r.place,n+r.place);if(r.place+=n,2!==t[r.place++])return!1;var s=KM(t,r);if(!1===s)return!1;if(t.length!==s+r.place)return!1;var a=t.slice(r.place,s+r.place);if(0===o[0]){if(!(128&o[1]))return!1;o=o.slice(1)}if(0===a[0]){if(!(128&a[1]))return!1;a=a.slice(1)}return this.r=new zM(o),this.s=new zM(a),this.recoveryParam=null,!0},ZM.prototype.toDER=function(t){var e=this.r.toArray(),r=this.s.toArray();for(128&e[0]&&(e=[0].concat(e)),128&r[0]&&(r=[0].concat(r)),e=WM(e),r=WM(r);!(r[0]||128&r[1]);)r=r.slice(1);var i=[2];GM(i,e.length),(i=i.concat(e)).push(2),GM(i,r.length);var n=i.concat(r),o=[48];return GM(o,n.length),o=o.concat(n),cv().encode(o,t)}),NM}var VM,$M,XM,JM,QM,t_,e_,r_,i_=!1;function n_(t){if(!(this instanceof n_))return new n_(t);"string"==typeof t&&(t_(Object.prototype.hasOwnProperty.call(JM,t),"Unknown curve "+t),t=JM[t]),t instanceof JM.PresetCurve&&(t={curve:t}),this.curve=t.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=t.curve.g,this.g.precompute(t.curve.n.bitLength()+1),this.hash=t.hash||t.curve.hash}function o_(){return i_||(i_=!0,VM={},$M=Vg(),XM=CM(),cv(),JM=BM(),QM=Am(),t_=cv().assert,e_=UM(),r_=YM(),VM=n_,n_.prototype.keyPair=function(t){return new e_(this,t)},n_.prototype.keyFromPrivate=function(t,e){return e_.fromPrivate(this,t,e)},n_.prototype.keyFromPublic=function(t,e){return e_.fromPublic(this,t,e)},n_.prototype.genKeyPair=function(t){t||(t={});for(var e=new XM({hash:this.hash,pers:t.pers,persEnc:t.persEnc||"utf8",entropy:t.entropy||QM(this.hash.hmacStrength),entropyEnc:t.entropy&&t.entropyEnc||"utf8",nonce:this.n.toArray()}),r=this.n.byteLength(),i=this.n.sub(new $M(2));;){var n=new $M(e.generate(r));if(!(n.cmp(i)>0))return n.iaddn(1),this.keyFromPrivate(n)}},n_.prototype._truncateToN=function(t,e){var r=8*t.byteLength()-this.n.bitLength();return r>0&&(t=t.ushrn(r)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},n_.prototype.sign=function(t,e,r,i){"object"==typeof r&&(i=r,r=null),i||(i={}),e=this.keyFromPrivate(e,r),t=this._truncateToN(new $M(t,16));for(var n=this.n.byteLength(),o=e.getPrivate().toArray("be",n),s=t.toArray("be",n),a=new XM({hash:this.hash,entropy:o,nonce:s,pers:i.pers,persEnc:i.persEnc||"utf8"}),h=this.n.sub(new $M(1)),u=0;;u++){var f=i.k?i.k(u):new $M(a.generate(this.n.byteLength()));if(!((f=this._truncateToN(f,!0)).cmpn(1)<=0||f.cmp(h)>=0)){var l=this.g.mul(f);if(!l.isInfinity()){var d=l.getX(),c=d.umod(this.n);if(0!==c.cmpn(0)){var p=f.invm(this.n).mul(c.mul(e.getPrivate()).iadd(t));if(0!==(p=p.umod(this.n)).cmpn(0)){var m=(l.getY().isOdd()?1:0)|(0!==d.cmp(c)?2:0);return i.canonical&&p.cmp(this.nh)>0&&(p=this.n.sub(p),m^=1),new r_({r:c,s:p,recoveryParam:m})}}}}}},n_.prototype.verify=function(t,e,r,i){t=this._truncateToN(new $M(t,16)),r=this.keyFromPublic(r,i);var n=(e=new r_(e,"hex")).r,o=e.s;if(n.cmpn(1)<0||n.cmp(this.n)>=0)return!1;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;var s,a=o.invm(this.n),h=a.mul(t).umod(this.n),u=a.mul(n).umod(this.n);return this.curve._maxwellTrick?!(s=this.g.jmulAdd(h,r.getPublic(),u)).isInfinity()&&s.eqXToP(n):!(s=this.g.mulAdd(h,r.getPublic(),u)).isInfinity()&&0===s.getX().umod(this.n).cmp(n)},n_.prototype.recoverPubKey=function(t,e,r,i){t_((3&r)===r,"The recovery param is more than two bits"),e=new r_(e,i);var n=this.n,o=new $M(t),s=e.r,a=e.s,h=1&r,u=r>>1;if(s.cmp(this.curve.p.umod(this.curve.n))>=0&&u)throw new Error("Unable to find sencond key candinate");s=u?this.curve.pointFromX(s.add(this.curve.n),h):this.curve.pointFromX(s,h);var f=e.r.invm(n),l=n.sub(o).mul(f).umod(n),d=a.mul(f).umod(n);return this.g.mulAdd(l,s,d)},n_.prototype.getKeyRecoveryParam=function(t,e,r,i){if(null!==(e=new r_(e,i)).recoveryParam)return e.recoveryParam;for(var n=0;n<4;n++){var o;try{o=this.recoverPubKey(t,e,n)}catch(t){continue}if(o.eq(r))return n}throw new Error("Unable to find valid recovery factor")}),VM}var s_,a_,h_,u_,f_=!1;function l_(t,e){this.eddsa=t,this._secret=h_(e.secret),t.isPoint(e.pub)?this._pub=e.pub:this._pubBytes=h_(e.pub)}function d_(){return f_||(f_=!0,s_={},cv(),a_=cv().assert,h_=cv().parseBytes,u_=cv().cachedProperty,l_.fromPublic=function(t,e){return e instanceof l_?e:new l_(t,{pub:e})},l_.fromSecret=function(t,e){return e instanceof l_?e:new l_(t,{secret:e})},l_.prototype.secret=function(){return this._secret},u_(l_,"pubBytes",(function(){return this.eddsa.encodePoint(this.pub())})),u_(l_,"pub",(function(){return this._pubBytes?this.eddsa.decodePoint(this._pubBytes):this.eddsa.g.mul(this.priv())})),u_(l_,"privBytes",(function(){var t=this.eddsa,e=this.hash(),r=t.encodingLength-1,i=e.slice(0,t.encodingLength);return i[0]&=248,i[r]&=127,i[r]|=64,i})),u_(l_,"priv",(function(){return this.eddsa.decodeInt(this.privBytes())})),u_(l_,"hash",(function(){return this.eddsa.hash().update(this.secret()).digest()})),u_(l_,"messagePrefix",(function(){return this.hash().slice(this.eddsa.encodingLength)})),l_.prototype.sign=function(t){return a_(this._secret,"KeyPair can only verify"),this.eddsa.sign(t,this)},l_.prototype.verify=function(t,e){return this.eddsa.verify(t,e,this)},l_.prototype.getSecret=function(t){return a_(this._secret,"KeyPair is public only"),cv().encode(this.secret(),t)},l_.prototype.getPublic=function(t){return cv().encode(this.pubBytes(),t)},s_=l_),s_}var c_,p_,m_,g_,v_,b_=!1;function y_(t,e){this.eddsa=t,"object"!=typeof e&&(e=v_(e)),Array.isArray(e)&&(e={R:e.slice(0,t.encodingLength),S:e.slice(t.encodingLength)}),m_(e.R&&e.S,"Signature without R or S"),t.isPoint(e.R)&&(this._R=e.R),e.S instanceof p_&&(this._S=e.S),this._Rencoded=Array.isArray(e.R)?e.R:e.Rencoded,this._Sencoded=Array.isArray(e.S)?e.S:e.Sencoded}function w_(){return b_||(b_=!0,c_={},p_=Vg(),cv(),m_=cv().assert,g_=cv().cachedProperty,v_=cv().parseBytes,g_(y_,"S",(function(){return this.eddsa.decodeInt(this.Sencoded())})),g_(y_,"R",(function(){return this.eddsa.decodePoint(this.Rencoded())})),g_(y_,"Rencoded",(function(){return this.eddsa.encodePoint(this.R())})),g_(y_,"Sencoded",(function(){return this.eddsa.encodeInt(this.S())})),y_.prototype.toBytes=function(){return this.Rencoded().concat(this.Sencoded())},y_.prototype.toHex=function(){return cv().encode(this.toBytes(),"hex").toUpperCase()},c_=y_),c_}var M_,__,A_,E_,S_,k_=!1;function B_(t){if(A_("ed25519"===t,"only tested with ed25519 so far"),!(this instanceof B_))return new B_(t);t=__[t].curve,this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=gM().sha512}function R_(){return k_||(k_=!0,M_={},gM(),__=BM(),cv(),A_=cv().assert,E_=cv().parseBytes,d_(),S_=w_(),M_=B_,B_.prototype.sign=function(t,e){t=E_(t);var r=this.keyFromSecret(e),i=this.hashInt(r.messagePrefix(),t),n=this.g.mul(i),o=this.encodePoint(n),s=this.hashInt(o,r.pubBytes(),t).mul(r.priv()),a=i.add(s).umod(this.curve.n);return this.makeSignature({R:n,S:a,Rencoded:o})},B_.prototype.verify=function(t,e,r){t=E_(t),e=this.makeSignature(e);var i=this.keyFromPublic(r),n=this.hashInt(e.Rencoded(),i.pubBytes(),t),o=this.g.mul(e.S());return e.R().add(i.pub().mul(n)).eq(o)},B_.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}function O_(){return D_||(D_=!0,L_()),P_}var j_,U_,N_,z_,q_,F_,Z_=!1;function H_(){return Z_||(Z_=!0,function(){for(q_ in j_={},jt(),U_=Ye(),N_=U_.Buffer,z_={},U_)U_.hasOwnProperty(q_)&&"SlowBuffer"!==q_&&"Buffer"!==q_&&(z_[q_]=U_[q_]);for(q_ in F_=z_.Buffer={},N_)N_.hasOwnProperty(q_)&&"allocUnsafe"!==q_&&"allocUnsafeSlow"!==q_&&(F_[q_]=N_[q_]);if(z_.Buffer.prototype=N_.prototype,F_.from&&F_.from!==Uint8Array.from||(F_.from=function(t,e,r){if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type '+typeof t);if(t&&void 0===t.length)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);return N_(t,e,r)}),F_.alloc||(F_.alloc=function(t,e,r){if("number"!=typeof t)throw new TypeError('The "size" argument must be of type number. Received type '+typeof t);if(t<0||t>=2*(1<<30))throw new RangeError('The value "'+t+'" is invalid for option "size"');var i=N_(t);return e&&0!==e.length?"string"==typeof r?i.fill(e,r):i.fill(e):i.fill(0),i}),!z_.kStringMaxLength)try{z_.kStringMaxLength=jt().binding("buffer").kStringMaxLength}catch(t){}z_.constants||(z_.constants={MAX_LENGTH:z_.kMaxLength},z_.kStringMaxLength&&(z_.constants.MAX_STRING_LENGTH=z_.kStringMaxLength)),j_=z_}()),j_}var K_,W_,G_,Y_=!1;function V_(t){this._reporterState={obj:null,path:[],options:t||{},errors:[]}}function $_(t,e){this.path=t,this.rethrow(e)}function X_(){return Y_||(Y_=!0,K_={},W_=Ar(),G_=V_,K_.Reporter=G_,V_.prototype.isError=function(t){return t instanceof $_},V_.prototype.save=function(){const t=this._reporterState;return{obj:t.obj,pathLen:t.path.length}},V_.prototype.restore=function(t){const e=this._reporterState;e.obj=t.obj,e.path=e.path.slice(0,t.pathLen)},V_.prototype.enterKey=function(t){return this._reporterState.path.push(t)},V_.prototype.exitKey=function(t){const e=this._reporterState;e.path=e.path.slice(0,t-1)},V_.prototype.leaveKey=function(t,e,r){const i=this._reporterState;this.exitKey(t),null!==i.obj&&(i.obj[e]=r)},V_.prototype.path=function(){return this._reporterState.path.join("/")},V_.prototype.enterObject=function(){const t=this._reporterState,e=t.obj;return t.obj={},e},V_.prototype.leaveObject=function(t){const e=this._reporterState,r=e.obj;return e.obj=t,r},V_.prototype.error=function(t){let e;const r=this._reporterState,i=t instanceof $_;if(e=i?t:new $_(r.path.map((function(t){return"["+JSON.stringify(t)+"]"})).join(""),t.message||t,t.stack),!r.options.partial)throw e;return i||r.errors.push(e),e},V_.prototype.wrapResult=function(t){const e=this._reporterState;return e.options.partial?{result:this.isError(t)?null:t,errors:e.errors}:t},W_($_,Error),$_.prototype.rethrow=function(t){if(this.message=t+" at: "+(this.path||"(shallow)"),Error.captureStackTrace&&Error.captureStackTrace(this,$_),!this.stack)try{throw new Error(this.message)}catch(t){this.stack=t.stack}return this}),K_}var J_,Q_,tA,eA,rA,iA,nA=!1;function oA(t,e){tA.call(this,e),eA.isBuffer(t)?(this.base=t,this.offset=0,this.length=t.length):this.error("Input not Buffer")}function sA(t,e){if(Array.isArray(t))this.length=0,this.value=t.map((function(t){return sA.isEncoderBuffer(t)||(t=new sA(t,e)),this.length+=t.length,t}),this);else if("number"==typeof t){if(!(0<=t&&t<=255))return e.error("non-byte EncoderBuffer value");this.value=t,this.length=1}else if("string"==typeof t)this.value=t,this.length=eA.byteLength(t);else{if(!eA.isBuffer(t))return e.error("Unsupported type: "+typeof t);this.value=t,this.length=t.length}}function aA(){return nA||(nA=!0,J_={},Q_=Ar(),tA=X_().Reporter,eA=H_().Buffer,Q_(oA,tA),rA=oA,J_.DecoderBuffer=rA,oA.isDecoderBuffer=function(t){return t instanceof oA||"object"==typeof t&&eA.isBuffer(t.base)&&"DecoderBuffer"===t.constructor.name&&"number"==typeof t.offset&&"number"==typeof t.length&&"function"==typeof t.save&&"function"==typeof t.restore&&"function"==typeof t.isEmpty&&"function"==typeof t.readUInt8&&"function"==typeof t.skip&&"function"==typeof t.raw},oA.prototype.save=function(){return{offset:this.offset,reporter:tA.prototype.save.call(this)}},oA.prototype.restore=function(t){const e=new oA(this.base);return e.offset=t.offset,e.length=this.offset,this.offset=t.offset,tA.prototype.restore.call(this,t.reporter),e},oA.prototype.isEmpty=function(){return this.offset===this.length},oA.prototype.readUInt8=function(t){return this.offset+1<=this.length?this.base.readUInt8(this.offset++,!0):this.error(t||"DecoderBuffer overrun")},oA.prototype.skip=function(t,e){if(!(this.offset+t<=this.length))return this.error(e||"DecoderBuffer overrun");const r=new oA(this.base);return r._reporterState=this._reporterState,r.offset=this.offset,r.length=this.offset+t,this.offset+=t,r},oA.prototype.raw=function(t){return this.base.slice(t?t.offset:this.offset,this.length)},iA=sA,J_.EncoderBuffer=iA,sA.isEncoderBuffer=function(t){return t instanceof sA||"object"==typeof t&&"EncoderBuffer"===t.constructor.name&&"number"==typeof t.length&&"function"==typeof t.join},sA.prototype.join=function(t,e){return t||(t=eA.alloc(this.length)),e||(e=0),0===this.length||(Array.isArray(this.value)?this.value.forEach((function(r){r.join(t,e),e+=r.length})):("number"==typeof this.value?t[e]=this.value:"string"==typeof this.value?t.write(this.value,e):eA.isBuffer(this.value)&&this.value.copy(t,e),e+=this.length)),t}),J_}var hA,uA,fA,lA,dA,cA,pA,mA,gA,vA=!1;function bA(t,e,r){const i={};this._baseState=i,i.name=r,i.enc=t,i.parent=e||null,i.children=null,i.tag=null,i.args=null,i.reverseArgs=null,i.choice=null,i.optional=!1,i.any=!1,i.obj=!1,i.use=null,i.useDecoder=null,i.key=null,i.default=null,i.explicit=null,i.implicit=null,i.contains=null,i.parent||(i.children=[],this._wrap())}function yA(){return vA||(vA=!0,hA={},uA=X_().Reporter,fA=aA().EncoderBuffer,lA=aA().DecoderBuffer,dA=el(),pA=["key","obj","use","optional","explicit","implicit","def","choice","any","contains"].concat(cA=["seq","seqof","set","setof","objid","bool","gentime","utctime","null_","enum","int","objDesc","bitstr","bmpstr","charstr","genstr","graphstr","ia5str","iso646str","numstr","octstr","printstr","t61str","unistr","utf8str","videostr"]),mA=["_peekTag","_decodeTag","_use","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeInt","_decodeBool","_decodeList","_encodeComposite","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool"],hA=bA,gA=["enc","parent","children","tag","args","reverseArgs","choice","optional","any","obj","use","alteredUse","key","default","explicit","implicit","contains"],bA.prototype.clone=function(){const t=this._baseState,e={};gA.forEach((function(r){e[r]=t[r]}));const r=new this.constructor(e.parent);return r._baseState=e,r},bA.prototype._wrap=function(){const t=this._baseState;pA.forEach((function(e){this[e]=function(){const r=new this.constructor(this);return t.children.push(r),r[e].apply(r,arguments)}}),this)},bA.prototype._init=function(t){const e=this._baseState;dA(null===e.parent),t.call(this),e.children=e.children.filter((function(t){return t._baseState.parent===this}),this),dA.equal(e.children.length,1,"Root node can have only one child")},bA.prototype._useArgs=function(t){const e=this._baseState,r=t.filter((function(t){return t instanceof this.constructor}),this);t=t.filter((function(t){return!(t instanceof this.constructor)}),this),0!==r.length&&(dA(null===e.children),e.children=r,r.forEach((function(t){t._baseState.parent=this}),this)),0!==t.length&&(dA(null===e.args),e.args=t,e.reverseArgs=t.map((function(t){if("object"!=typeof t||t.constructor!==Object)return t;const e={};return Object.keys(t).forEach((function(r){r==(0|r)&&(r|=0);const i=t[r];e[i]=r})),e})))},mA.forEach((function(t){bA.prototype[t]=function(){const e=this._baseState;throw new Error(t+" not implemented for encoding: "+e.enc)}})),cA.forEach((function(t){bA.prototype[t]=function(){const e=this._baseState,r=Array.prototype.slice.call(arguments);return dA(null===e.tag),e.tag=t,this._useArgs(r),this}})),bA.prototype.use=function(t){dA(t);const e=this._baseState;return dA(null===e.use),e.use=t,this},bA.prototype.optional=function(){return this._baseState.optional=!0,this},bA.prototype.def=function(t){const e=this._baseState;return dA(null===e.default),e.default=t,e.optional=!0,this},bA.prototype.explicit=function(t){const e=this._baseState;return dA(null===e.explicit&&null===e.implicit),e.explicit=t,this},bA.prototype.implicit=function(t){const e=this._baseState;return dA(null===e.explicit&&null===e.implicit),e.implicit=t,this},bA.prototype.obj=function(){const t=this._baseState,e=Array.prototype.slice.call(arguments);return t.obj=!0,0!==e.length&&this._useArgs(e),this},bA.prototype.key=function(t){const e=this._baseState;return dA(null===e.key),e.key=t,this},bA.prototype.any=function(){return this._baseState.any=!0,this},bA.prototype.choice=function(t){const e=this._baseState;return dA(null===e.choice),e.choice=t,this._useArgs(Object.keys(t).map((function(e){return t[e]}))),this},bA.prototype.contains=function(t){const e=this._baseState;return dA(null===e.use),e.contains=t,this},bA.prototype._decode=function(t,e){const r=this._baseState;if(null===r.parent)return t.wrapResult(r.children[0]._decode(t,e));let i,n=r.default,o=!0,s=null;if(null!==r.key&&(s=t.enterKey(r.key)),r.optional){let i=null;if(null!==r.explicit?i=r.explicit:null!==r.implicit?i=r.implicit:null!==r.tag&&(i=r.tag),null!==i||r.any){if(o=this._peekTag(t,i,r.any),t.isError(o))return o}else{const i=t.save();try{null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e),o=!0}catch(t){o=!1}t.restore(i)}}if(r.obj&&o&&(i=t.enterObject()),o){if(null!==r.explicit){const e=this._decodeTag(t,r.explicit);if(t.isError(e))return e;t=e}const i=t.offset;if(null===r.use&&null===r.choice){let e;r.any&&(e=t.save());const i=this._decodeTag(t,null!==r.implicit?r.implicit:r.tag,r.any);if(t.isError(i))return i;r.any?n=t.raw(e):t=i}if(e&&e.track&&null!==r.tag&&e.track(t.path(),i,t.length,"tagged"),e&&e.track&&null!==r.tag&&e.track(t.path(),t.offset,t.length,"content"),r.any||(n=null===r.choice?this._decodeGeneric(r.tag,t,e):this._decodeChoice(t,e)),t.isError(n))return n;if(r.any||null!==r.choice||null===r.children||r.children.forEach((function(r){r._decode(t,e)})),r.contains&&("octstr"===r.tag||"bitstr"===r.tag)){const i=new lA(n);n=this._getUse(r.contains,t._reporterState.obj)._decode(i,e)}}return r.obj&&o&&(n=t.leaveObject(i)),null===r.key||null===n&&!0!==o?null!==s&&t.exitKey(s):t.leaveKey(s,r.key,n),n},bA.prototype._decodeGeneric=function(t,e,r){const i=this._baseState;return"seq"===t||"set"===t?null:"seqof"===t||"setof"===t?this._decodeList(e,t,i.args[0],r):/str$/.test(t)?this._decodeStr(e,t,r):"objid"===t&&i.args?this._decodeObjid(e,i.args[0],i.args[1],r):"objid"===t?this._decodeObjid(e,null,null,r):"gentime"===t||"utctime"===t?this._decodeTime(e,t,r):"null_"===t?this._decodeNull(e,r):"bool"===t?this._decodeBool(e,r):"objDesc"===t?this._decodeStr(e,t,r):"int"===t||"enum"===t?this._decodeInt(e,i.args&&i.args[0],r):null!==i.use?this._getUse(i.use,e._reporterState.obj)._decode(e,r):e.error("unknown tag: "+t)},bA.prototype._getUse=function(t,e){const r=this._baseState;return r.useDecoder=this._use(t,e),dA(null===r.useDecoder._baseState.parent),r.useDecoder=r.useDecoder._baseState.children[0],r.implicit!==r.useDecoder._baseState.implicit&&(r.useDecoder=r.useDecoder.clone(),r.useDecoder._baseState.implicit=r.implicit),r.useDecoder},bA.prototype._decodeChoice=function(t,e){const r=this._baseState;let i=null,n=!1;return Object.keys(r.choice).some((function(o){const s=t.save(),a=r.choice[o];try{const r=a._decode(t,e);if(t.isError(r))return!1;i={type:o,value:r},n=!0}catch(e){return t.restore(s),!1}return!0}),this),n?i:t.error("Choice not matched")},bA.prototype._createEncoderBuffer=function(t){return new fA(t,this.reporter)},bA.prototype._encode=function(t,e,r){const i=this._baseState;if(null!==i.default&&i.default===t)return;const n=this._encodeValue(t,e,r);return void 0===n||this._skipDefault(n,e,r)?void 0:n},bA.prototype._encodeValue=function(t,e,r){const i=this._baseState;if(null===i.parent)return i.children[0]._encode(t,e||new uA);let n=null;if(this.reporter=e,i.optional&&void 0===t){if(null===i.default)return;t=i.default}let o=null,s=!1;if(i.any)n=this._createEncoderBuffer(t);else if(i.choice)n=this._encodeChoice(t,e);else if(i.contains)o=this._getUse(i.contains,r)._encode(t,e),s=!0;else if(i.children)o=i.children.map((function(r){if("null_"===r._baseState.tag)return r._encode(null,e,t);if(null===r._baseState.key)return e.error("Child should have a key");const i=e.enterKey(r._baseState.key);if("object"!=typeof t)return e.error("Child expected, but input is not object");const n=r._encode(t[r._baseState.key],e,t);return e.leaveKey(i),n}),this).filter((function(t){return t})),o=this._createEncoderBuffer(o);else if("seqof"===i.tag||"setof"===i.tag){if(!i.args||1!==i.args.length)return e.error("Too many args for : "+i.tag);if(!Array.isArray(t))return e.error("seqof/setof, but data is not Array");const r=this.clone();r._baseState.implicit=null,o=this._createEncoderBuffer(t.map((function(r){const i=this._baseState;return this._getUse(i.args[0],t)._encode(r,e)}),r))}else null!==i.use?n=this._getUse(i.use,r)._encode(t,e):(o=this._encodePrimitive(i.tag,t),s=!0);if(!i.any&&null===i.choice){const t=null!==i.implicit?i.implicit:i.tag,r=null===i.implicit?"universal":"context";null===t?null===i.use&&e.error("Tag could be omitted only for .use()"):null===i.use&&(n=this._encodeComposite(t,s,r,o))}return null!==i.explicit&&(n=this._encodeComposite(i.explicit,!1,"context",n)),n},bA.prototype._encodeChoice=function(t,e){const r=this._baseState,i=r.choice[t.type];return i||dA(!1,t.type+" not found in "+JSON.stringify(Object.keys(r.choice))),i._encode(t.value,e)},bA.prototype._encodePrimitive=function(t,e){const r=this._baseState;if(/str$/.test(t))return this._encodeStr(e,t);if("objid"===t&&r.args)return this._encodeObjid(e,r.reverseArgs[0],r.args[1]);if("objid"===t)return this._encodeObjid(e,null,null);if("gentime"===t||"utctime"===t)return this._encodeTime(e,t);if("null_"===t)return this._encodeNull();if("int"===t||"enum"===t)return this._encodeInt(e,r.args&&r.reverseArgs[0]);if("bool"===t)return this._encodeBool(e);if("objDesc"===t)return this._encodeStr(e,t);throw new Error("Unsupported tag: "+t)},bA.prototype._isNumstr=function(t){return/^[0-9 ]*$/.test(t)},bA.prototype._isPrintstr=function(t){return/^[A-Za-z0-9 '()+,-./:=?]*$/.test(t)}),hA}var wA,MA,_A,AA,EA,SA=!1;function kA(t){const e={};return Object.keys(t).forEach((function(r){(0|r)==r&&(r|=0);const i=t[r];e[i]=r})),e}function BA(){return SA||(SA=!0,(wA={}).tagClass=MA={0:"universal",1:"application",2:"context",3:"private"},_A=kA(MA),wA.tagClassByName=_A,AA={0:"end",1:"bool",2:"int",3:"bitstr",4:"octstr",5:"null_",6:"objid",7:"objDesc",8:"external",9:"real",10:"enum",11:"embed",12:"utf8str",13:"relativeOid",16:"seq",17:"set",18:"numstr",19:"printstr",20:"t61str",21:"videostr",22:"ia5str",23:"utctime",24:"gentime",25:"graphstr",26:"iso646str",27:"genstr",28:"unistr",29:"charstr",30:"bmpstr"},wA.tag=AA,EA=kA(AA),wA.tagByName=EA),wA}var RA,TA,xA,IA,CA=!1;function PA(t){this.enc="der",this.name=t.name,this.entity=t,this.tree=new DA,this.tree._init(t.body)}function DA(t){IA.call(this,"der",t)}function LA(t){return t<10?"0"+t:t}function OA(){RA={},TA=Ar(),xA=H_().Buffer,IA=yA(),BA(),RA=PA,PA.prototype.encode=function(t,e){return this.tree._encode(t,e).join()},TA(DA,IA),DA.prototype._encodeComposite=function(t,e,r,i){const n=function(t,e,r,i){let n;if("seqof"===t?t="seq":"setof"===t&&(t="set"),BA().tagByName.hasOwnProperty(t))n=BA().tagByName[t];else{if("number"!=typeof t||(0|t)!==t)return i.error("Unknown tag: "+t);n=t}return n>=31?i.error("Multi-octet tag encoding unsupported"):(e||(n|=32),n|=BA().tagClassByName[r||"universal"]<<6,n)}(t,e,r,this.reporter);if(i.length<128){const t=xA.alloc(2);return t[0]=n,t[1]=i.length,this._createEncoderBuffer([t,i])}let o=1;for(let t=i.length;t>=256;t>>=8)o++;const s=xA.alloc(2+o);s[0]=n,s[1]=128|o;for(let t=1+o,e=i.length;e>0;t--,e>>=8)s[t]=255&e;return this._createEncoderBuffer([s,i])},DA.prototype._encodeStr=function(t,e){if("bitstr"===e)return this._createEncoderBuffer([0|t.unused,t.data]);if("bmpstr"===e){const e=xA.alloc(2*t.length);for(let r=0;r=40)return this.reporter.error("Second objid identifier OOB");t.splice(0,2,40*t[0]+t[1])}let i=0;for(let e=0;e=128;r>>=7)i++}const n=xA.alloc(i);let o=n.length-1;for(let e=t.length-1;e>=0;e--){let r=t[e];for(n[o--]=127&r;(r>>=7)>0;)n[o--]=128|127&r}return this._createEncoderBuffer(n)},DA.prototype._encodeTime=function(t,e){let r;const i=new Date(t);return"gentime"===e?r=[LA(i.getUTCFullYear()),LA(i.getUTCMonth()+1),LA(i.getUTCDate()),LA(i.getUTCHours()),LA(i.getUTCMinutes()),LA(i.getUTCSeconds()),"Z"].join(""):"utctime"===e?r=[LA(i.getUTCFullYear()%100),LA(i.getUTCMonth()+1),LA(i.getUTCDate()),LA(i.getUTCHours()),LA(i.getUTCMinutes()),LA(i.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+e+" time is not supported yet"),this._encodeStr(r,"octstr")},DA.prototype._encodeNull=function(){return this._createEncoderBuffer("")},DA.prototype._encodeInt=function(t,e){if("string"==typeof t){if(!e)return this.reporter.error("String int or enum given, but no values map");if(!e.hasOwnProperty(t))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(t));t=e[t]}if("number"!=typeof t&&!xA.isBuffer(t)){const e=t.toArray();!t.sign&&128&e[0]&&e.unshift(0),t=xA.from(e)}if(xA.isBuffer(t)){let e=t.length;0===t.length&&e++;const r=xA.alloc(e);return t.copy(r),0===t.length&&(r[0]=0),this._createEncoderBuffer(r)}if(t<128)return this._createEncoderBuffer(t);if(t<256)return this._createEncoderBuffer([0,t]);let r=1;for(let e=t;e>=256;e>>=8)r++;const i=new Array(r);for(let e=i.length-1;e>=0;e--)i[e]=255&t,t>>=8;return 128&i[0]&&i.unshift(0),this._createEncoderBuffer(xA.from(i))},DA.prototype._encodeBool=function(t){return this._createEncoderBuffer(t?255:0)},DA.prototype._use=function(t,e){return"function"==typeof t&&(t=t(e)),t._getEncoder("der").tree},DA.prototype._skipDefault=function(t,e,r){const i=this._baseState;let n;if(null===i.default)return!1;const o=t.join();if(void 0===i.defaultBuffer&&(i.defaultBuffer=this._encodeValue(i.default,e,r).join()),o.length!==i.defaultBuffer.length)return!1;for(n=0;n>6],n=0==(32&r);if(31==(31&r)){let i=r;for(r=0;128==(128&i);){if(i=t.readUInt8(e),t.isError(i))return i;r<<=7,r|=127&i}}else r&=31;return{cls:i,primitive:n,tag:r,tagStr:BA().tag[r]}}function iE(t,e,r){let i=t.readUInt8(r);if(t.isError(i))return i;if(!e&&128===i)return null;if(0==(128&i))return i;const n=127&i;if(n>4)return t.error("length octect is too long");i=0;for(let e=0;e0&&r.ishrn(i),r}function JS(t,e,r){var i,n;do{for(i=NS.alloc(0);8*i.length=e)throw new Error("invalid sig")}function fk(){return ak||(ak=!0,ek={},rk=lr().Buffer,ik=Dg(),nk=C_().ec,ok=DS(),sk=jS(),ek=hk),ek}var lk,dk,ck,pk,mk,gk,vk,bk=!1;function yk(t){Ls().Writable.call(this);var e=vk[t];if(!e)throw new Error("Unknown message digest");this._hashType=e.hash,this._hash=ck(e.hash),this._tag=e.id,this._signType=e.sign}function wk(t){Ls().Writable.call(this);var e=vk[t];if(!e)throw new Error("Unknown message digest");this._hash=ck(e.hash),this._tag=e.id,this._signType=e.sign}function Mk(t){return new yk(t)}function _k(t){return new wk(t)}function Ak(){return bk||(bk=!0,lk={},dk=lr().Buffer,ck=uu(),Ls(),pk=Ar(),mk=tk(),gk=fk(),vk=ju(),Object.keys(vk).forEach((function(t){vk[t].id=dk.from(vk[t].id,"hex"),vk[t.toLowerCase()]=vk[t]})),pk(yk,Ls().Writable),yk.prototype._write=function(t,e,r){this._hash.update(t),r()},yk.prototype.update=function(t,e){return"string"==typeof t&&(t=dk.from(t,e)),this._hash.update(t),this},yk.prototype.sign=function(t,e){this.end();var r=this._hash.digest(),i=mk(r,t,this._hashType,this._signType,this._tag);return e?i.toString(e):i},pk(wk,Ls().Writable),wk.prototype._write=function(t,e,r){this._hash.update(t),r()},wk.prototype.update=function(t,e){return"string"==typeof t&&(t=dk.from(t,e)),this._hash.update(t),this},wk.prototype.verify=function(t,e,r){"string"==typeof e&&(e=dk.from(e,r)),this.end();var i=this._hash.digest();return gk(e,i,t,this._signType,this._tag)},lk={Sign:Mk,Verify:_k,createSign:Mk,createVerify:_k}),lk}var Ek,Sk=!1;function kk(){Ek=function(){var t={exports:this};return function(t,e){function r(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function n(t,e,r){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof t?t.exports=n:e.BN=n,n.BN=n,n.wordSize=26;try{o="undefined"!=typeof window&&void 0!==window.Buffer?window.Buffer:ir().Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}var Bk,Rk,Tk,xk,Ik=!1;function Ck(t){this.curveType=xk[t],this.curveType||(this.curveType={name:t}),this.curve=new(C_().ec)(this.curveType.name),this.keys=void 0}function Pk(t,e,r){Array.isArray(t)||(t=t.toArray());var i=new Rk(t);if(r&&i.length=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function a(t,e,r){var i=s(t,r);return r-1>=e&&(i|=s(t,r-1)<<4),i}function h(t,e,r,i){for(var n=0,o=Math.min(t.length,r),s=e;s=49?a-49+10:a>=17?a-17+10:a}return n}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,e){return t.cmp(e)>0?t:e},n.min=function(t,e){return t.cmp(e)<0?t:e},n.prototype._init=function(t,e,i){if("number"==typeof t)return this._initNumber(t,e,i);if("object"==typeof t)return this._initArray(t,e,i);"hex"===e&&(e=16),r(e===(0|e)&&e>=2&&e<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(n++,this.negative=1),n=0;n-=3)s=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[o]|=s<>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);else if("le"===i)for(n=0,o=0;n>>26-a&67108863,(a+=24)>=26&&(a-=26,o++);return this.strip()},n.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var i=0;i=e;i-=2)n=a(t,e,i)<=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;else for(i=(t.length-e)%2==0?e+1:e;i=18?(o-=18,s+=1,this.words[s]|=n>>>26):o+=8;this.strip()},n.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var i=0,n=1;n<=67108863;n*=e)i++;i--,n=n/e|0;for(var o=t.length-r,s=o%i,a=Math.min(o,o-s)+r,u=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var u=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],l=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var i=t.length+e.length|0;r.length=i,i=i-1|0;var n=0|t.words[0],o=0|e.words[0],s=n*o,a=67108863&s,h=s/67108864|0;r.words[0]=a;for(var u=1;u>>26,l=67108863&h,d=Math.min(u,e.length-1),c=Math.max(0,u-t.length+1);c<=d;c++){var p=u-c|0;f+=(s=(n=0|t.words[p])*(o=0|e.words[c])+l)/67108864|0,l=67108863&s}r.words[u]=0|l,h=0|f}return 0!==h?r.words[u]=0|h:r.length--,r.strip()}n.prototype.toString=function(t,e){var i;if(e=0|e||1,16===(t=t||10)||"hex"===t){i="";for(var n=0,o=0,s=0;s>>24-n&16777215)||s!==this.length-1?u[6-h.length]+h+i:h+i,(n+=2)>=26&&(n-=26,s--)}for(0!==o&&(i=o.toString(16)+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}if(t===(0|t)&&t>=2&&t<=36){var d=f[t],c=l[t];i="";var p=this.clone();for(p.negative=0;!p.isZero();){var m=p.modn(c).toString(t);i=(p=p.idivn(c)).isZero()?m+i:u[d-m.length]+m+i}for(this.isZero()&&(i="0"+i);i.length%e!=0;)i="0"+i;return 0!==this.negative&&(i="-"+i),i}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,e){return r(void 0!==o),this.toArrayLike(o,t,e)},n.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},n.prototype.toArrayLike=function(t,e,i){var n=this.byteLength(),o=i||Math.max(1,n);r(n<=o,"byte array longer than desired length"),r(o>0,"Requested array length <= 0"),this.strip();var s,a,h="le"===e,u=new t(o),f=this.clone();if(h){for(a=0;!f.isZero();a++)s=f.andln(255),f.iushrn(8),u[a]=s;for(;a=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},n.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var i=0;it.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),i=t%26;this._expand(e),i>0&&e--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-i),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,e){r("number"==typeof t&&t>=0);var i=t/26|0,n=t%26;return this._expand(i+1),this.words[i]=e?this.words[i]|1<t.length?(r=this,i=t):(r=t,i=this);for(var n=0,o=0;o>>26;for(;0!==n&&o>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,i,n=this.cmp(t);if(0===n)return this.negative=0,this.length=1,this.words[0]=0,this;n>0?(r=this,i=t):(r=t,i=this);for(var o=0,s=0;s>26,this.words[s]=67108863&e;for(;0!==o&&s>26,this.words[s]=67108863&e;if(0===o&&s>>13,c=0|s[1],p=8191&c,m=c>>>13,g=0|s[2],v=8191&g,b=g>>>13,y=0|s[3],w=8191&y,M=y>>>13,_=0|s[4],A=8191&_,E=_>>>13,S=0|s[5],k=8191&S,B=S>>>13,R=0|s[6],T=8191&R,x=R>>>13,I=0|s[7],C=8191&I,P=I>>>13,D=0|s[8],L=8191&D,O=D>>>13,j=0|s[9],U=8191&j,N=j>>>13,z=0|a[0],q=8191&z,F=z>>>13,Z=0|a[1],H=8191&Z,K=Z>>>13,W=0|a[2],G=8191&W,Y=W>>>13,V=0|a[3],$=8191&V,X=V>>>13,J=0|a[4],Q=8191&J,tt=J>>>13,et=0|a[5],rt=8191&et,it=et>>>13,nt=0|a[6],ot=8191&nt,st=nt>>>13,at=0|a[7],ht=8191&at,ut=at>>>13,ft=0|a[8],lt=8191&ft,dt=ft>>>13,ct=0|a[9],pt=8191&ct,mt=ct>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(i=Math.imul(l,q))|0)+((8191&(n=(n=Math.imul(l,F))+Math.imul(d,q)|0))<<13)|0;u=((o=Math.imul(d,F))+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,i=Math.imul(p,q),n=(n=Math.imul(p,F))+Math.imul(m,q)|0,o=Math.imul(m,F);var vt=(u+(i=i+Math.imul(l,H)|0)|0)+((8191&(n=(n=n+Math.imul(l,K)|0)+Math.imul(d,H)|0))<<13)|0;u=((o=o+Math.imul(d,K)|0)+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,i=Math.imul(v,q),n=(n=Math.imul(v,F))+Math.imul(b,q)|0,o=Math.imul(b,F),i=i+Math.imul(p,H)|0,n=(n=n+Math.imul(p,K)|0)+Math.imul(m,H)|0,o=o+Math.imul(m,K)|0;var bt=(u+(i=i+Math.imul(l,G)|0)|0)+((8191&(n=(n=n+Math.imul(l,Y)|0)+Math.imul(d,G)|0))<<13)|0;u=((o=o+Math.imul(d,Y)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,i=Math.imul(w,q),n=(n=Math.imul(w,F))+Math.imul(M,q)|0,o=Math.imul(M,F),i=i+Math.imul(v,H)|0,n=(n=n+Math.imul(v,K)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,K)|0,i=i+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Y)|0)+Math.imul(m,G)|0,o=o+Math.imul(m,Y)|0;var yt=(u+(i=i+Math.imul(l,$)|0)|0)+((8191&(n=(n=n+Math.imul(l,X)|0)+Math.imul(d,$)|0))<<13)|0;u=((o=o+Math.imul(d,X)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,i=Math.imul(A,q),n=(n=Math.imul(A,F))+Math.imul(E,q)|0,o=Math.imul(E,F),i=i+Math.imul(w,H)|0,n=(n=n+Math.imul(w,K)|0)+Math.imul(M,H)|0,o=o+Math.imul(M,K)|0,i=i+Math.imul(v,G)|0,n=(n=n+Math.imul(v,Y)|0)+Math.imul(b,G)|0,o=o+Math.imul(b,Y)|0,i=i+Math.imul(p,$)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(m,$)|0,o=o+Math.imul(m,X)|0;var wt=(u+(i=i+Math.imul(l,Q)|0)|0)+((8191&(n=(n=n+Math.imul(l,tt)|0)+Math.imul(d,Q)|0))<<13)|0;u=((o=o+Math.imul(d,tt)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,i=Math.imul(k,q),n=(n=Math.imul(k,F))+Math.imul(B,q)|0,o=Math.imul(B,F),i=i+Math.imul(A,H)|0,n=(n=n+Math.imul(A,K)|0)+Math.imul(E,H)|0,o=o+Math.imul(E,K)|0,i=i+Math.imul(w,G)|0,n=(n=n+Math.imul(w,Y)|0)+Math.imul(M,G)|0,o=o+Math.imul(M,Y)|0,i=i+Math.imul(v,$)|0,n=(n=n+Math.imul(v,X)|0)+Math.imul(b,$)|0,o=o+Math.imul(b,X)|0,i=i+Math.imul(p,Q)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(m,Q)|0,o=o+Math.imul(m,tt)|0;var Mt=(u+(i=i+Math.imul(l,rt)|0)|0)+((8191&(n=(n=n+Math.imul(l,it)|0)+Math.imul(d,rt)|0))<<13)|0;u=((o=o+Math.imul(d,it)|0)+(n>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,i=Math.imul(T,q),n=(n=Math.imul(T,F))+Math.imul(x,q)|0,o=Math.imul(x,F),i=i+Math.imul(k,H)|0,n=(n=n+Math.imul(k,K)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,K)|0,i=i+Math.imul(A,G)|0,n=(n=n+Math.imul(A,Y)|0)+Math.imul(E,G)|0,o=o+Math.imul(E,Y)|0,i=i+Math.imul(w,$)|0,n=(n=n+Math.imul(w,X)|0)+Math.imul(M,$)|0,o=o+Math.imul(M,X)|0,i=i+Math.imul(v,Q)|0,n=(n=n+Math.imul(v,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0,i=i+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,it)|0)+Math.imul(m,rt)|0,o=o+Math.imul(m,it)|0;var _t=(u+(i=i+Math.imul(l,ot)|0)|0)+((8191&(n=(n=n+Math.imul(l,st)|0)+Math.imul(d,ot)|0))<<13)|0;u=((o=o+Math.imul(d,st)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,i=Math.imul(C,q),n=(n=Math.imul(C,F))+Math.imul(P,q)|0,o=Math.imul(P,F),i=i+Math.imul(T,H)|0,n=(n=n+Math.imul(T,K)|0)+Math.imul(x,H)|0,o=o+Math.imul(x,K)|0,i=i+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Y)|0)+Math.imul(B,G)|0,o=o+Math.imul(B,Y)|0,i=i+Math.imul(A,$)|0,n=(n=n+Math.imul(A,X)|0)+Math.imul(E,$)|0,o=o+Math.imul(E,X)|0,i=i+Math.imul(w,Q)|0,n=(n=n+Math.imul(w,tt)|0)+Math.imul(M,Q)|0,o=o+Math.imul(M,tt)|0,i=i+Math.imul(v,rt)|0,n=(n=n+Math.imul(v,it)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,it)|0,i=i+Math.imul(p,ot)|0,n=(n=n+Math.imul(p,st)|0)+Math.imul(m,ot)|0,o=o+Math.imul(m,st)|0;var At=(u+(i=i+Math.imul(l,ht)|0)|0)+((8191&(n=(n=n+Math.imul(l,ut)|0)+Math.imul(d,ht)|0))<<13)|0;u=((o=o+Math.imul(d,ut)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,i=Math.imul(L,q),n=(n=Math.imul(L,F))+Math.imul(O,q)|0,o=Math.imul(O,F),i=i+Math.imul(C,H)|0,n=(n=n+Math.imul(C,K)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,K)|0,i=i+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Y)|0)+Math.imul(x,G)|0,o=o+Math.imul(x,Y)|0,i=i+Math.imul(k,$)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(B,$)|0,o=o+Math.imul(B,X)|0,i=i+Math.imul(A,Q)|0,n=(n=n+Math.imul(A,tt)|0)+Math.imul(E,Q)|0,o=o+Math.imul(E,tt)|0,i=i+Math.imul(w,rt)|0,n=(n=n+Math.imul(w,it)|0)+Math.imul(M,rt)|0,o=o+Math.imul(M,it)|0,i=i+Math.imul(v,ot)|0,n=(n=n+Math.imul(v,st)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,st)|0,i=i+Math.imul(p,ht)|0,n=(n=n+Math.imul(p,ut)|0)+Math.imul(m,ht)|0,o=o+Math.imul(m,ut)|0;var Et=(u+(i=i+Math.imul(l,lt)|0)|0)+((8191&(n=(n=n+Math.imul(l,dt)|0)+Math.imul(d,lt)|0))<<13)|0;u=((o=o+Math.imul(d,dt)|0)+(n>>>13)|0)+(Et>>>26)|0,Et&=67108863,i=Math.imul(U,q),n=(n=Math.imul(U,F))+Math.imul(N,q)|0,o=Math.imul(N,F),i=i+Math.imul(L,H)|0,n=(n=n+Math.imul(L,K)|0)+Math.imul(O,H)|0,o=o+Math.imul(O,K)|0,i=i+Math.imul(C,G)|0,n=(n=n+Math.imul(C,Y)|0)+Math.imul(P,G)|0,o=o+Math.imul(P,Y)|0,i=i+Math.imul(T,$)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(x,$)|0,o=o+Math.imul(x,X)|0,i=i+Math.imul(k,Q)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,i=i+Math.imul(A,rt)|0,n=(n=n+Math.imul(A,it)|0)+Math.imul(E,rt)|0,o=o+Math.imul(E,it)|0,i=i+Math.imul(w,ot)|0,n=(n=n+Math.imul(w,st)|0)+Math.imul(M,ot)|0,o=o+Math.imul(M,st)|0,i=i+Math.imul(v,ht)|0,n=(n=n+Math.imul(v,ut)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,ut)|0,i=i+Math.imul(p,lt)|0,n=(n=n+Math.imul(p,dt)|0)+Math.imul(m,lt)|0,o=o+Math.imul(m,dt)|0;var St=(u+(i=i+Math.imul(l,pt)|0)|0)+((8191&(n=(n=n+Math.imul(l,mt)|0)+Math.imul(d,pt)|0))<<13)|0;u=((o=o+Math.imul(d,mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,i=Math.imul(U,H),n=(n=Math.imul(U,K))+Math.imul(N,H)|0,o=Math.imul(N,K),i=i+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Y)|0)+Math.imul(O,G)|0,o=o+Math.imul(O,Y)|0,i=i+Math.imul(C,$)|0,n=(n=n+Math.imul(C,X)|0)+Math.imul(P,$)|0,o=o+Math.imul(P,X)|0,i=i+Math.imul(T,Q)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(x,Q)|0,o=o+Math.imul(x,tt)|0,i=i+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,it)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,it)|0,i=i+Math.imul(A,ot)|0,n=(n=n+Math.imul(A,st)|0)+Math.imul(E,ot)|0,o=o+Math.imul(E,st)|0,i=i+Math.imul(w,ht)|0,n=(n=n+Math.imul(w,ut)|0)+Math.imul(M,ht)|0,o=o+Math.imul(M,ut)|0,i=i+Math.imul(v,lt)|0,n=(n=n+Math.imul(v,dt)|0)+Math.imul(b,lt)|0,o=o+Math.imul(b,dt)|0;var kt=(u+(i=i+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,mt)|0)+Math.imul(m,pt)|0))<<13)|0;u=((o=o+Math.imul(m,mt)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,i=Math.imul(U,G),n=(n=Math.imul(U,Y))+Math.imul(N,G)|0,o=Math.imul(N,Y),i=i+Math.imul(L,$)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(O,$)|0,o=o+Math.imul(O,X)|0,i=i+Math.imul(C,Q)|0,n=(n=n+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,i=i+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,it)|0)+Math.imul(x,rt)|0,o=o+Math.imul(x,it)|0,i=i+Math.imul(k,ot)|0,n=(n=n+Math.imul(k,st)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,st)|0,i=i+Math.imul(A,ht)|0,n=(n=n+Math.imul(A,ut)|0)+Math.imul(E,ht)|0,o=o+Math.imul(E,ut)|0,i=i+Math.imul(w,lt)|0,n=(n=n+Math.imul(w,dt)|0)+Math.imul(M,lt)|0,o=o+Math.imul(M,dt)|0;var Bt=(u+(i=i+Math.imul(v,pt)|0)|0)+((8191&(n=(n=n+Math.imul(v,mt)|0)+Math.imul(b,pt)|0))<<13)|0;u=((o=o+Math.imul(b,mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,i=Math.imul(U,$),n=(n=Math.imul(U,X))+Math.imul(N,$)|0,o=Math.imul(N,X),i=i+Math.imul(L,Q)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(O,Q)|0,o=o+Math.imul(O,tt)|0,i=i+Math.imul(C,rt)|0,n=(n=n+Math.imul(C,it)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,it)|0,i=i+Math.imul(T,ot)|0,n=(n=n+Math.imul(T,st)|0)+Math.imul(x,ot)|0,o=o+Math.imul(x,st)|0,i=i+Math.imul(k,ht)|0,n=(n=n+Math.imul(k,ut)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,ut)|0,i=i+Math.imul(A,lt)|0,n=(n=n+Math.imul(A,dt)|0)+Math.imul(E,lt)|0,o=o+Math.imul(E,dt)|0;var Rt=(u+(i=i+Math.imul(w,pt)|0)|0)+((8191&(n=(n=n+Math.imul(w,mt)|0)+Math.imul(M,pt)|0))<<13)|0;u=((o=o+Math.imul(M,mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,i=Math.imul(U,Q),n=(n=Math.imul(U,tt))+Math.imul(N,Q)|0,o=Math.imul(N,tt),i=i+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,it)|0)+Math.imul(O,rt)|0,o=o+Math.imul(O,it)|0,i=i+Math.imul(C,ot)|0,n=(n=n+Math.imul(C,st)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,st)|0,i=i+Math.imul(T,ht)|0,n=(n=n+Math.imul(T,ut)|0)+Math.imul(x,ht)|0,o=o+Math.imul(x,ut)|0,i=i+Math.imul(k,lt)|0,n=(n=n+Math.imul(k,dt)|0)+Math.imul(B,lt)|0,o=o+Math.imul(B,dt)|0;var Tt=(u+(i=i+Math.imul(A,pt)|0)|0)+((8191&(n=(n=n+Math.imul(A,mt)|0)+Math.imul(E,pt)|0))<<13)|0;u=((o=o+Math.imul(E,mt)|0)+(n>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,i=Math.imul(U,rt),n=(n=Math.imul(U,it))+Math.imul(N,rt)|0,o=Math.imul(N,it),i=i+Math.imul(L,ot)|0,n=(n=n+Math.imul(L,st)|0)+Math.imul(O,ot)|0,o=o+Math.imul(O,st)|0,i=i+Math.imul(C,ht)|0,n=(n=n+Math.imul(C,ut)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,ut)|0,i=i+Math.imul(T,lt)|0,n=(n=n+Math.imul(T,dt)|0)+Math.imul(x,lt)|0,o=o+Math.imul(x,dt)|0;var xt=(u+(i=i+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,mt)|0)+Math.imul(B,pt)|0))<<13)|0;u=((o=o+Math.imul(B,mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,i=Math.imul(U,ot),n=(n=Math.imul(U,st))+Math.imul(N,ot)|0,o=Math.imul(N,st),i=i+Math.imul(L,ht)|0,n=(n=n+Math.imul(L,ut)|0)+Math.imul(O,ht)|0,o=o+Math.imul(O,ut)|0,i=i+Math.imul(C,lt)|0,n=(n=n+Math.imul(C,dt)|0)+Math.imul(P,lt)|0,o=o+Math.imul(P,dt)|0;var It=(u+(i=i+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,mt)|0)+Math.imul(x,pt)|0))<<13)|0;u=((o=o+Math.imul(x,mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863,i=Math.imul(U,ht),n=(n=Math.imul(U,ut))+Math.imul(N,ht)|0,o=Math.imul(N,ut),i=i+Math.imul(L,lt)|0,n=(n=n+Math.imul(L,dt)|0)+Math.imul(O,lt)|0,o=o+Math.imul(O,dt)|0;var Ct=(u+(i=i+Math.imul(C,pt)|0)|0)+((8191&(n=(n=n+Math.imul(C,mt)|0)+Math.imul(P,pt)|0))<<13)|0;u=((o=o+Math.imul(P,mt)|0)+(n>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,i=Math.imul(U,lt),n=(n=Math.imul(U,dt))+Math.imul(N,lt)|0,o=Math.imul(N,dt);var Pt=(u+(i=i+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,mt)|0)+Math.imul(O,pt)|0))<<13)|0;u=((o=o+Math.imul(O,mt)|0)+(n>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Dt=(u+(i=Math.imul(U,pt))|0)+((8191&(n=(n=Math.imul(U,mt))+Math.imul(N,pt)|0))<<13)|0;return u=((o=Math.imul(N,mt))+(n>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,h[0]=gt,h[1]=vt,h[2]=bt,h[3]=yt,h[4]=wt,h[5]=Mt,h[6]=_t,h[7]=At,h[8]=Et,h[9]=St,h[10]=kt,h[11]=Bt,h[12]=Rt,h[13]=Tt,h[14]=xt,h[15]=It,h[16]=Ct,h[17]=Pt,h[18]=Dt,0!==u&&(h[19]=u,r.length++),r};function p(t,e,r){return(new m).mulp(t,e,r)}function m(t,e){this.x=t,this.y=e}Math.imul||(c=d),n.prototype.mulTo=function(t,e){var r,i=this.length+t.length;return r=10===this.length&&10===t.length?c(this,t,e):i<63?d(this,t,e):i<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var i=0,n=0,o=0;o>>26)|0)>>>26,s&=67108863}r.words[o]=a,i=s,s=n}return 0!==i?r.words[o]=i:r.length--,r.strip()}(this,t,e):p(this,t,e),r},m.prototype.makeRBT=function(t){for(var e=new Array(t),r=n.prototype._countBits(t)-1,i=0;i>=1;return i},m.prototype.permute=function(t,e,r,i,n,o){for(var s=0;s>>=1)n++;return 1<>>=13,i[2*s+1]=8191&o,o>>>=13;for(s=2*e;s>=26,e+=n/67108864|0,e+=o>>>26,this.words[i]=67108863&o}return 0!==e&&(this.words[i]=e,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>n}return e}(t);if(0===e.length)return new n(1);for(var r=this,i=0;i=0);var e,i=t%26,n=(t-i)/26,o=67108863>>>26-i<<26-i;if(0!==i){var s=0;for(e=0;e>>26-i}s&&(this.words[e]=s,this.length++)}if(0!==n){for(e=this.length-1;e>=0;e--)this.words[e+n]=this.words[e];for(e=0;e=0),n=e?(e-e%26)/26:0;var o=t%26,s=Math.min((t-o)/26,this.length),a=67108863^67108863>>>o<s)for(this.length-=s,u=0;u=0&&(0!==f||u>=n);u--){var l=0|this.words[u];this.words[u]=f<<26-o|l>>>o,f=l&a}return h&&0!==f&&(h.words[h.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,e,i){return r(0===this.negative),this.iushrn(t,e,i)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var e=t%26,i=(t-e)/26,n=1<=0);var e=t%26,i=(t-e)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=i)return this;if(0!==e&&i++,this.length=Math.min(i,this.length),0!==e){var n=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(h/67108864|0),this.words[n+i]=67108863&o}for(;n>26,this.words[n+i]=67108863&o;if(0===a)return this.strip();for(r(-1===a),a=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,e){var r=(this.length,t.length),i=this.clone(),o=t,s=0|o.words[o.length-1];0!==(r=26-this._countBits(s))&&(o=o.ushln(r),i.iushln(r),s=0|o.words[o.length-1]);var a,h=i.length-o.length;if("mod"!==e){(a=new n(null)).length=h+1,a.words=new Array(a.length);for(var u=0;u=0;l--){var d=67108864*(0|i.words[o.length+l])+(0|i.words[o.length+l-1]);for(d=Math.min(d/s|0,67108863),i._ishlnsubmul(o,d,l);0!==i.negative;)d--,i.negative=0,i._ishlnsubmul(o,1,l),i.isZero()||(i.negative^=1);a&&(a.words[l]=d)}return a&&a.strip(),i.strip(),"div"!==e&&0!==r&&i.iushrn(r),{div:a||null,mod:i}},n.prototype.divmod=function(t,e,i){return r(!t.isZero()),this.isZero()?{div:new n(0),mod:new n(0)}:0!==this.negative&&0===t.negative?(a=this.neg().divmod(t,e),"mod"!==e&&(o=a.div.neg()),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.iadd(t)),{div:o,mod:s}):0===this.negative&&0!==t.negative?(a=this.divmod(t.neg(),e),"mod"!==e&&(o=a.div.neg()),{div:o,mod:a.mod}):0!=(this.negative&t.negative)?(a=this.neg().divmod(t.neg(),e),"div"!==e&&(s=a.mod.neg(),i&&0!==s.negative&&s.isub(t)),{div:a.div,mod:s}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,e);var o,s,a},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,i=t.ushrn(1),n=t.andln(1),o=r.cmp(i);return o<0||1===n&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var e=(1<<26)%t,i=0,n=this.length-1;n>=0;n--)i=(e*i+(0|this.words[n]))%t;return i},n.prototype.idivn=function(t){r(t<=67108863);for(var e=0,i=this.length-1;i>=0;i--){var n=(0|this.words[i])+67108864*e;this.words[i]=n/t|0,e=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o=new n(1),s=new n(0),a=new n(0),h=new n(1),u=0;e.isEven()&&i.isEven();)e.iushrn(1),i.iushrn(1),++u;for(var f=i.clone(),l=e.clone();!e.isZero();){for(var d=0,c=1;0==(e.words[0]&c)&&d<26;++d,c<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(o.isOdd()||s.isOdd())&&(o.iadd(f),s.isub(l)),o.iushrn(1),s.iushrn(1);for(var p=0,m=1;0==(i.words[0]&m)&&p<26;++p,m<<=1);if(p>0)for(i.iushrn(p);p-- >0;)(a.isOdd()||h.isOdd())&&(a.iadd(f),h.isub(l)),a.iushrn(1),h.iushrn(1);e.cmp(i)>=0?(e.isub(i),o.isub(a),s.isub(h)):(i.isub(e),a.isub(o),h.isub(s))}return{a:a,b:h,gcd:i.iushln(u)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var e=this,i=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var o,s=new n(1),a=new n(0),h=i.clone();e.cmpn(1)>0&&i.cmpn(1)>0;){for(var u=0,f=1;0==(e.words[0]&f)&&u<26;++u,f<<=1);if(u>0)for(e.iushrn(u);u-- >0;)s.isOdd()&&s.iadd(h),s.iushrn(1);for(var l=0,d=1;0==(i.words[0]&d)&&l<26;++l,d<<=1);if(l>0)for(i.iushrn(l);l-- >0;)a.isOdd()&&a.iadd(h),a.iushrn(1);e.cmp(i)>=0?(e.isub(i),s.isub(a)):(i.isub(e),a.isub(s))}return(o=0===e.cmpn(1)?s:a).cmpn(0)<0&&o.iadd(t),o},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var i=0;e.isEven()&&r.isEven();i++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=e.cmp(r);if(n<0){var o=e;e=r,r=o}else if(0===n||0===r.cmpn(1))break;e.isub(r)}return r.iushln(i)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var e=t%26,i=(t-e)/26,n=1<>>26,a&=67108863,this.words[s]=a}return 0!==o&&(this.words[s]=o,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var e,i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;if(this.strip(),this.length>1)e=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];e=n===t?0:nt.length)return 1;if(this.length=0;r--){var i=0|this.words[r],n=0|t.words[r];if(i!==n){in&&(e=1);break}}return e},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new _(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var g={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new n(e,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function b(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function y(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function M(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function _(t){if("string"==typeof t){var e=n._prime(t);this.m=e.p,this.prime=e}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function A(t){_.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var i=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(b,v),b.prototype.split=function(t,e){for(var r=4194303,i=Math.min(t.length,9),n=0;n>>22,o=s}o>>>=22,t.words[n-10]=o,0===o&&t.length>10?t.length-=10:t.length-=9},b.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=n,e=i}return 0!==e&&(t.words[t.length++]=e),t},n._prime=function(t){if(g[t])return g[t];var e;if("k256"===t)e=new b;else if("p224"===t)e=new y;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new M}return g[t]=e,e},_.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},_.prototype._verify2=function(t,e){r(0==(t.negative|e.negative),"red works only with positives"),r(t.red&&t.red===e.red,"red works only with red numbers")},_.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},_.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},_.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},_.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},_.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},_.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},_.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},_.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},_.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},_.prototype.isqr=function(t){return this.imul(t,t.clone())},_.prototype.sqr=function(t){return this.mul(t,t)},_.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(r(e%2==1),3===e){var i=this.m.add(new n(1)).iushrn(2);return this.pow(t,i)}for(var o=this.m.subn(1),s=0;!o.isZero()&&0===o.andln(1);)s++,o.iushrn(1);r(!o.isZero());var a=new n(1).toRed(this),h=a.redNeg(),u=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new n(2*f*f).toRed(this);0!==this.pow(f,u).cmp(h);)f.redIAdd(h);for(var l=this.pow(f,o),d=this.pow(t,o.addn(1).iushrn(1)),c=this.pow(t,o),p=s;0!==c.cmp(a);){for(var m=c,g=0;0!==m.cmp(a);g++)m=m.redSqr();r(g=0;i--){for(var u=e.words[i],f=h-1;f>=0;f--){var l=u>>f&1;o!==r[0]&&(o=this.sqr(o)),0!==l||0!==s?(s<<=1,s|=l,(4===++a||0===i&&0===f)&&(o=this.mul(o,r[s]),a=0,s=0)):a=0}h=26}return o},_.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},_.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},n.mont=function(t){return new A(t)},i(A,_),A.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},A.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},A.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(i).iushrn(this.shift),o=n;return n.cmp(this.m)>=0?o=n.isub(this.m):n.cmpn(0)<0&&(o=n.iadd(this.m)),o._forceRed(this)},A.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new n(0)._forceRed(this);var r=t.mul(e),i=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),o=r.isub(i).iushrn(this.shift),s=o;return o.cmp(this.m)>=0?s=o.isub(this.m):o.cmpn(0)<0&&(s=o.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this),t.exports}.call({})}function Gk(){return Kk||(Kk=!0,Wk()),Hk}var Yk,Vk,$k,Xk=!1;function Jk(t,e){return $k.from(t.toRed(Vk.mont(e.modulus)).redPow(new Vk(e.publicExponent)).fromRed().toArray())}function Qk(){return Xk||(Xk=!0,Yk={},Vk=Gk(),$k=lr().Buffer,Yk=Jk),Yk}var tB,eB,rB,iB,nB,oB,sB,aB,hB,uB,fB=!1;function lB(t,e,r){var i,n=e.length,o=t.modulus.byteLength();if(n>o-11)throw new Error("message too long");return i=r?uB.alloc(o-n-3,255):function(t){var e,r=uB.allocUnsafe(t),i=0,n=rB(2*t),o=0;for(;ir-s-2)throw new Error("message too long");var a=uB.alloc(r-i-s-2),h=r-o-1,u=rB(o),f=oB(uB.concat([n,a,uB.alloc(1,1),e],h),nB(u,h)),l=oB(u,nB(f,o));return new sB(uB.concat([uB.alloc(1),l,f],r))}(o,e);else if(1===i)n=lB(o,e,r);else{if(3!==i)throw new Error("unknown padding");if((n=new sB(e)).cmp(o.modulus)>=0)throw new Error("data too long for modulus")}return r?hB(n,o):aB(n,o)}}var cB,pB,mB,gB,vB,bB,yB,wB,MB,_B=!1;function AB(t,e){var r=t.modulus.byteLength(),i=yB("sha1").update(MB.alloc(0)).digest(),n=i.length;if(0!==e[0])throw new Error("decryption error");var o=e.slice(1,n+1),s=e.slice(n+1),a=gB(o,mB(s,n)),h=gB(s,mB(a,r-n-1));if(function(t,e){t=MB.from(t),e=MB.from(e);var r=0,i=t.length;t.length!==e.length&&(r++,i=Math.min(t.length,e.length));var n=-1;for(;++ns||new vB(e).cmp(o.modulus)>=0)throw new Error("decryption error");n=r?wB(new vB(e),o):bB(e,o);var a=MB.alloc(s-n.length);if(n=MB.concat([a,n],s),4===i)return AB(o,n);if(1===i)return function(t,e,r){for(var i=e.slice(0,2),n=2,o=0;0!==e[n++];)if(n>=e.length){o++;break}var s=e.slice(2,n-1);if(("0002"!==i.toString("hex")&&!r||"0001"!==i.toString("hex")&&r)&&o++,s.length<8&&o++,o)throw new Error("decryption error");return e.slice(n)}(0,n,r);if(3===i)return n;throw new Error("unknown padding")}}var SB,kB,BB,RB,TB,xB=!1;function IB(){SB={},fB||(fB=!0,dB()),kB=tB,SB.publicEncrypt=kB,_B||(_B=!0,EB()),BB=cB,SB.privateDecrypt=BB,RB=function(t,e){return kB(t,e,!0)},SB.privateEncrypt=RB,TB=function(t,e){return BB(t,e,!0)},SB.publicDecrypt=TB}var CB,PB,DB,LB,OB,jB,UB,NB=!1;function zB(){throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11")}function qB(t,e){if("number"!=typeof t||t!=t)throw new TypeError("offset must be a number");if(t>UB||t<0)throw new TypeError("offset must be a uint32");if(t>OB||t>e)throw new RangeError("offset out of range")}function FB(t,e,r){if("number"!=typeof t||t!=t)throw new TypeError("size must be a number");if(t>UB||t<0)throw new TypeError("size must be a uint32");if(t+e>r||t>OB)throw new RangeError("buffer too small")}function ZB(e,r,i,n){if(!(LB.isBuffer(e)||e instanceof t.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');if("function"==typeof r)n=r,r=0,i=e.length;else if("function"==typeof i)n=i,i=e.length-r;else if("function"!=typeof n)throw new TypeError('"cb" argument must be a function');return qB(r,e.length),FB(i,r,e.length),HB(e,r,i,n)}function HB(t,e,r,i){var n=t.buffer,o=new Uint8Array(n,e,r);return jB.getRandomValues(o),i?void jt().nextTick((function(){i(null,t)})):t}function KB(e,r,i){if(void 0===r&&(r=0),!(LB.isBuffer(e)||e instanceof t.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');return qB(r,e.length),void 0===i&&(i=e.length-r),FB(i,r,e.length),HB(e,r,i)}function WB(){return NB||(NB=!0,DB={},jt(),lr(),wr(),LB=lr().Buffer,OB=lr().kMaxLength,jB=t.crypto||t.msCrypto,UB=Math.pow(2,32)-1,jB&&jB.getRandomValues?(CB=ZB,DB.randomFill=CB,PB=KB,DB.randomFillSync=PB):(CB=zB,DB.randomFill=CB,PB=zB,DB.randomFillSync=PB)),DB}var GB,YB,VB,$B,XB,JB,QB,tR,eR,rR,iR,nR,oR=!1;function sR(){JB={},VB=wr(),YB=JB.prng=VB,GB=JB.pseudoRandomBytes=YB,QB=JB.rng=GB,JB.randomBytes=QB,$B=uu(),tR=JB.Hash=$B,JB.createHash=tR,XB=Du(),eR=JB.Hmac=XB,JB.createHmac=eR,rR=zu(),iR=Object.keys(rR),["sha1","sha224","sha256","sha384","sha512","md5","rmd160"].concat(iR),Lf(),fm(),Bg||(Bg=!0,xg()),Ak(),Ik||(Ik=!0,Dk()),nR=Bk,JB.createECDH=nR,xB||(xB=!0,IB()),WB()}function aR(){return oR||(oR=!0,sR()),JB}var hR,uR,fR,lR,dR,cR,pR,mR,gR,vR,bR,yR,wR,MR,_R,AR,ER,SR,kR,BR,RR,TR,xR,IR,CR,PR,DR,LR,OR,jR,UR,NR,zR,qR,FR,ZR,HR,KR,WR,GR,YR,VR,$R,XR,JR,QR,tT,eT,rT,iT,nT,oT,sT,aT,hT,uT,fT,lT,dT,cT,pT,mT,gT,vT,bT,yT,wT,MT,_T,AT,ET,ST,kT,BT,RT,TT,xT,IT,CT,PT,DT,LT,OT,jT=!1;function UT(t){return lR.locateFile?lR.locateFile(t,wR):wR+t}function NT(t){NT.shown||(NT.shown={}),NT.shown[t]||(NT.shown[t]=1,BR(t))}function zT(t,e){t||tx("Assertion failed: "+e)}function qT(t,e,r){for(var i=e+r,n=e;t[n]&&!(n>=i);)++n;if(n-e>16&&t.subarray&&PR)return PR.decode(t.subarray(e,n));for(var o="";e>10,56320|1023&u)}}else o+=String.fromCharCode((31&s)<<6|a)}else o+=String.fromCharCode(s)}return o}function FT(t,e){return t?qT(jR,t,e):""}function ZT(t,e,r,i){if(!(i>0))return 0;for(var n=r,o=r+i-1,s=0;s=55296&&a<=57343)a=65536+((1023&a)<<10)|1023&t.charCodeAt(++s);if(a<=127){if(r>=o)break;e[r++]=a}else if(a<=2047){if(r+1>=o)break;e[r++]=192|a>>6,e[r++]=128|63&a}else if(a<=65535){if(r+2>=o)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|63&a}else{if(r+3>=o)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|63&a}}return e[r]=0,r-n}function HT(t,e,r){return ZT(t,jR,e,r)}function KT(t){for(var e=0,r=0;r=55296&&i<=57343&&(i=65536+((1023&i)<<10)|1023&t.charCodeAt(++r)),i<=127?++e:e+=i<=2047?2:i<=65535?3:4}return e}function WT(t,e){for(var r=t,i=r>>1,n=i+e/2;!(i>=n)&&NR[i];)++i;if((r=i<<1)-t>32&&DR)return DR.decode(jR.subarray(t,r));for(var o="",s=0;!(s>=e/2);++s){var a=UR[t+2*s>>1];if(0==a)break;o+=String.fromCharCode(a)}return o}function GT(t,e,r){if(void 0===r&&(r=2147483647),r<2)return 0;for(var i=e,n=(r-=2)<2*t.length?r/2:t.length,o=0;o>1]=s,e+=2}return UR[e>>1]=0,e-i}function YT(t){return 2*t.length}function VT(t,e){for(var r=0,i="";!(r>=e/4);){var n=zR[t+4*r>>2];if(0==n)break;if(++r,n>=65536){var o=n-65536;i+=String.fromCharCode(55296|o>>10,56320|1023&o)}else i+=String.fromCharCode(n)}return i}function $T(t,e,r){if(void 0===r&&(r=2147483647),r<4)return 0;for(var i=e,n=i+r-4,o=0;o=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&t.charCodeAt(++o);if(zR[e>>2]=s,(e+=4)+4>n)break}return zR[e>>2]=0,e-i}function XT(t){for(var e=0,r=0;r=55296&&i<=57343&&++r,e+=4}return e}function JT(t){YR++,lR.monitorRunDependencies&&lR.monitorRunDependencies(YR)}function QT(t){if(YR--,lR.monitorRunDependencies&&lR.monitorRunDependencies(YR),0==YR&&(null!==VR&&(clearInterval(VR),VR=null),$R)){var e=$R;$R=null,e()}}function tx(t){throw lR.onAbort&&lR.onAbort(t),BR(t+=""),CR=!0,1,t="abort("+t+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(t)}function ex(t){return t.startsWith(XR)}function rx(t){return t.startsWith("file://")}function ix(t){try{if(t==JR&&xR)return new Uint8Array(xR);if(AR)return AR(t);throw"both async and sync fetching of the wasm failed"}catch(t){tx(t)}}function nx(){var t={a:TT};function e(t,e){var r,i,n=t.exports;lR.asm=n,IR=lR.asm.J,r=IR.buffer,LR=r,lR.HEAP8=OR=new Int8Array(r),lR.HEAP16=UR=new Int16Array(r),lR.HEAP32=zR=new Int32Array(r),lR.HEAPU8=jR=new Uint8Array(r),lR.HEAPU16=NR=new Uint16Array(r),lR.HEAPU32=qR=new Uint32Array(r),lR.HEAPF32=FR=new Float32Array(r),lR.HEAPF64=ZR=new Float64Array(r),HR=lR.asm.N,i=lR.asm.K,WR.unshift(i),QT()}function r(t){e(t.instance)}function i(e){return function(){if(!xR&&(gR||vR)){if("function"==typeof fetch&&!rx(JR))return fetch(JR,{credentials:"same-origin"}).then((function(t){if(!t.ok)throw"failed to load wasm binary file at '"+JR+"'";return t.arrayBuffer()})).catch((function(){return ix(JR)}));if(_R)return new Promise((function(t,e){_R(JR,(function(e){t(new Uint8Array(e))}),e)}))}return Promise.resolve().then((function(){return ix(JR)}))}().then((function(e){return WebAssembly.instantiate(e,t)})).then(e,(function(t){BR("failed to asynchronously prepare wasm: "+t),tx(t)}))}if(JT(),lR.instantiateWasm)try{return lR.instantiateWasm(t,e)}catch(t){return BR("Module.instantiateWasm callback failed with error: "+t),!1}return xR||"function"!=typeof WebAssembly.instantiateStreaming||ex(JR)||rx(JR)||"function"!=typeof fetch?i(r):fetch(JR,{credentials:"same-origin"}).then((function(e){return WebAssembly.instantiateStreaming(e,t).then(r,(function(t){return BR("wasm streaming compile failed: "+t),BR("falling back to ArrayBuffer instantiation"),i(r)}))})),{}}function ox(t){for(;t.length>0;){var e=t.shift();if("function"!=typeof e){var r=e.func;"number"==typeof r?void 0===e.arg?HR.get(r)():HR.get(r)(e.arg):r(void 0===e.arg?null:e.arg)}else e(lR)}}function sx(){var t=new Error;if(!t.stack){try{throw new Error}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function ax(){if("object"==typeof crypto&&"function"==typeof crypto.getRandomValues){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}if(bR)try{return aR(),function(){return aR().randomBytes(1)[0]}}catch(t){}return function(){tx("randomDevice")}}function hx(t){for(var e=function(t,e){return e||(e=RR),Math.ceil(t/e)*e}(t,65536),r=IT(e);t>1]=2,0;default:return-28;case 9:return o=28,zR[PT()>>2]=o,-1}}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),-t.errno}var o}function fx(t,e,r){sT.varargs=r;try{var i=sT.getStr(t),n=r?sT.get():0;return oT.open(i,e,n).fd}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),-t.errno}}function lx(t,e,r,i,n){}function dx(t){switch(t){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+t)}}function cx(){for(var t=new Array(256),e=0;e<256;++e)t[e]=String.fromCharCode(e);aT=t}function px(t){for(var e="",r=t;jR[r];)e+=aT[jR[r++]];return e}function mx(t){if(void 0===t)return"_unknown";var e=(t=t.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return e>=lT&&e<=dT?"_"+t:t}function gx(t,e){return t=mx(t),new Function("body","return function "+t+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(e)}function vx(t,e){var r=gx(e,(function(t){this.name=e,this.message=t;var r=new Error(t).stack;void 0!==r&&(this.stack=this.toString()+"\n"+r.replace(/^Error(:[^\n]*)?\n/,""))}));return r.prototype=Object.create(t.prototype),r.prototype.constructor=r,r.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},r}function bx(t){throw new cT(t)}function yx(t){throw new pT(t)}function wx(t,e,r){function i(e){var i=r(e);i.length!==t.length&&yx("Mismatched type converter count");for(var n=0;n>o])},destructorFunction:null})}function Ax(t){if(!(this instanceof Dx))return!1;if(!(t instanceof Dx))return!1;for(var e=this.$$.ptrType.registeredClass,r=this.$$.ptr,i=t.$$.ptrType.registeredClass,n=t.$$.ptr;e.baseClass;)r=e.upcast(r),e=e.baseClass;for(;i.baseClass;)n=i.upcast(n),i=i.baseClass;return e===i&&r===n}function Ex(t){bx(t.$$.ptrType.registeredClass.name+" instance already deleted")}function Sx(t){}function kx(t){t.count.value-=1,0===t.count.value&&function(t){t.smartPtr?t.smartPtrType.rawDestructor(t.smartPtr):t.ptrType.registeredClass.rawDestructor(t.ptr)}(t)}function Bx(t){return"undefined"==typeof FinalizationGroup?(Bx=function(t){return t},t):(mT=new FinalizationGroup((function(t){for(var e=t.next();!e.done;e=t.next()){var r=e.value;r.ptr?kx(r):console.warn("object already deleted: "+r.ptr)}})),Bx=function(t){return mT.register(t,t.$$,t.$$),t},Sx=function(t){mT.unregister(t.$$)},Bx(t))}function Rx(){if(this.$$.ptr||Ex(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var t,e=Bx(Object.create(Object.getPrototypeOf(this),{$$:{value:(t=this.$$,{count:t.count,deleteScheduled:t.deleteScheduled,preservePointerOnDelete:t.preservePointerOnDelete,ptr:t.ptr,ptrType:t.ptrType,smartPtr:t.smartPtr,smartPtrType:t.smartPtrType})}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e}function Tx(){this.$$.ptr||Ex(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&bx("Object already scheduled for deletion"),Sx(this),kx(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)}function xx(){return!this.$$.ptr}function Ix(){for(;vT.length;){var t=vT.pop();t.$$.deleteScheduled=!1,t.delete()}}function Cx(){return this.$$.ptr||Ex(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&bx("Object already scheduled for deletion"),vT.push(this),1===vT.length&&gT&&gT(Ix),this.$$.deleteScheduled=!0,this}function Px(){Dx.prototype.isAliasOf=Ax,Dx.prototype.clone=Rx,Dx.prototype.delete=Tx,Dx.prototype.isDeleted=xx,Dx.prototype.deleteLater=Cx}function Dx(){}function Lx(t,e,r){if(void 0===t[e].overloadTable){var i=t[e];t[e]=function(){return t[e].overloadTable.hasOwnProperty(arguments.length)||bx("Function '"+r+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+t[e].overloadTable+")!"),t[e].overloadTable[arguments.length].apply(this,arguments)},t[e].overloadTable=[],t[e].overloadTable[i.argCount]=i}}function Ox(t,e,r,i,n,o,s,a){this.name=t,this.constructor=e,this.instancePrototype=r,this.rawDestructor=i,this.baseClass=n,this.getActualType=o,this.upcast=s,this.downcast=a,this.pureVirtualFunctions=[]}function jx(t,e,r){for(;e!==r;)e.upcast||bx("Expected null or instance of "+r.name+", got an instance of "+e.name),t=e.upcast(t),e=e.baseClass;return t}function Ux(t,e){if(null===e)return this.isReference&&bx("null is not a valid "+this.name),0;e.$$||bx('Cannot pass "'+yI(e)+'" as a '+this.name),e.$$.ptr||bx("Cannot pass deleted object as a pointer of type "+this.name);var r=e.$$.ptrType.registeredClass;return jx(e.$$.ptr,r,this.registeredClass)}function Nx(t,e){var r;if(null===e)return this.isReference&&bx("null is not a valid "+this.name),this.isSmartPointer?(r=this.rawConstructor(),null!==t&&t.push(this.rawDestructor,r),r):0;e.$$||bx('Cannot pass "'+yI(e)+'" as a '+this.name),e.$$.ptr||bx("Cannot pass deleted object as a pointer of type "+this.name),!this.isConst&&e.$$.ptrType.isConst&&bx("Cannot convert argument of type "+(e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name)+" to parameter type "+this.name);var i=e.$$.ptrType.registeredClass;if(r=jx(e.$$.ptr,i,this.registeredClass),this.isSmartPointer)switch(void 0===e.$$.smartPtr&&bx("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:e.$$.smartPtrType===this?r=e.$$.smartPtr:bx("Cannot convert argument of type "+(e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name)+" to parameter type "+this.name);break;case 1:r=e.$$.smartPtr;break;case 2:if(e.$$.smartPtrType===this)r=e.$$.smartPtr;else{var n=e.clone();r=this.rawShare(r,vI((function(){n.delete()}))),null!==t&&t.push(this.rawDestructor,r)}break;default:bx("Unsupporting sharing policy")}return r}function zx(t,e){if(null===e)return this.isReference&&bx("null is not a valid "+this.name),0;e.$$||bx('Cannot pass "'+yI(e)+'" as a '+this.name),e.$$.ptr||bx("Cannot pass deleted object as a pointer of type "+this.name),e.$$.ptrType.isConst&&bx("Cannot convert argument of type "+e.$$.ptrType.name+" to parameter type "+this.name);var r=e.$$.ptrType.registeredClass;return jx(e.$$.ptr,r,this.registeredClass)}function qx(t){return this.fromWireType(qR[t>>2])}function Fx(t){return this.rawGetPointee&&(t=this.rawGetPointee(t)),t}function Zx(t){this.rawDestructor&&this.rawDestructor(t)}function Hx(t){null!==t&&t.delete()}function Kx(t,e,r){if(e===r)return t;if(void 0===r.baseClass)return null;var i=Kx(t,e,r.baseClass);return null===i?null:r.downcast(i)}function Wx(){return Object.keys(yT).length}function Gx(){var t=[];for(var e in yT)yT.hasOwnProperty(e)&&t.push(yT[e]);return t}function Yx(t){gT=t,vT.length&&gT&&gT(Ix)}function Vx(){lR.getInheritedInstanceCount=Wx,lR.getLiveInheritedInstances=Gx,lR.flushPendingDeletes=Ix,lR.setDelayFunction=Yx}function $x(t,e){return e=function(t,e){for(void 0===e&&bx("ptr should not be undefined");t.baseClass;)e=t.upcast(e),t=t.baseClass;return e}(t,e),yT[e]}function Xx(t,e){return e.ptrType&&e.ptr||yx("makeClassHandle requires ptr and ptrType"),!!e.smartPtrType!==!!e.smartPtr&&yx("Both smartPtrType and smartPtr must be specified"),e.count={value:1},Bx(Object.create(t,{$$:{value:e}}))}function Jx(t){var e=this.getPointee(t);if(!e)return this.destructor(t),null;var r=$x(this.registeredClass,e);if(void 0!==r){if(0===r.$$.count.value)return r.$$.ptr=e,r.$$.smartPtr=t,r.clone();var i=r.clone();return this.destructor(t),i}function n(){return this.isSmartPointer?Xx(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:e,smartPtrType:this,smartPtr:t}):Xx(this.registeredClass.instancePrototype,{ptrType:this,ptr:t})}var o,s=this.registeredClass.getActualType(e),a=bT[s];if(!a)return n.call(this);o=this.isConst?a.constPointerType:a.pointerType;var h=Kx(e,this.registeredClass,o.registeredClass);return null===h?n.call(this):this.isSmartPointer?Xx(o.registeredClass.instancePrototype,{ptrType:o,ptr:h,smartPtrType:this,smartPtr:t}):Xx(o.registeredClass.instancePrototype,{ptrType:o,ptr:h})}function Qx(){tI.prototype.getPointee=Fx,tI.prototype.destructor=Zx,tI.prototype.argPackAdvance=8,tI.prototype.readValueFromPointer=qx,tI.prototype.deleteObject=Hx,tI.prototype.fromWireType=Jx}function tI(t,e,r,i,n,o,s,a,h,u,f){this.name=t,this.registeredClass=e,this.isReference=r,this.isConst=i,this.isSmartPointer=n,this.pointeeType=o,this.sharingPolicy=s,this.rawGetPointee=a,this.rawConstructor=h,this.rawShare=u,this.rawDestructor=f,n||void 0!==e.baseClass?this.toWireType=Nx:i?(this.toWireType=Ux,this.destructorFunction=null):(this.toWireType=zx,this.destructorFunction=null)}function eI(t,e,r){return t.includes("j")?function(t,e,r){var i=lR["dynCall_"+t];return r&&r.length?i.apply(null,[e].concat(r)):i.call(null,e)}(t,e,r):HR.get(e).apply(null,r)}function rI(t,e){var r,i,n,o=(t=px(t)).includes("j")?(r=t,i=e,n=[],function(){n.length=arguments.length;for(var t=0;t>2)+i]);return r}function aI(t){for(;t.length;){var e=t.pop();t.pop()(e)}}function hI(t,e,r,i,n,o){zT(e>0);var s=sI(e,r);n=rI(i,n);var a=[o],h=[];wx([],[t],(function(t){var r="constructor "+(t=t[0]).name;if(void 0===t.registeredClass.constructor_body&&(t.registeredClass.constructor_body=[]),void 0!==t.registeredClass.constructor_body[e-1])throw new cT("Cannot register multiple constructors with identical number of parameters ("+(e-1)+") for class '"+t.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return t.registeredClass.constructor_body[e-1]=function(){nI("Cannot construct "+t.name+" due to unbound types",s)},wx([],s,(function(i){return t.registeredClass.constructor_body[e-1]=function(){arguments.length!==e-1&&bx(r+" called with "+arguments.length+" arguments, expected "+(e-1)),h.length=0,a.length=e;for(var t=1;t0?", ":"")+l),d+=(u?"var rv = ":"")+"invoker(fn"+(l.length>0?", ":"")+l+");\n",a)d+="runDestructors(destructors);\n";else for(h=s?1:2;h4&&0==--_T[t].refcount&&(_T[t]=void 0,MT.push(t))}function pI(){for(var t=0,e=5;e<_T.length;++e)void 0!==_T[e]&&++t;return t}function mI(){for(var t=5;t<_T.length;++t)if(void 0!==_T[t])return _T[t];return null}function gI(){lR.count_emval_handles=pI,lR.get_first_emval=mI}function vI(t){switch(t){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var e=MT.length?MT.pop():_T.length;return _T[e]={refcount:1,value:t},e}}function bI(t,e){Mx(t,{name:e=px(e),fromWireType:function(t){var e=_T[t].value;return cI(t),e},toWireType:function(t,e){return vI(e)},argPackAdvance:8,readValueFromPointer:qx,destructorFunction:null})}function yI(t){if(null===t)return"null";var e=typeof t;return"object"===e||"array"===e||"function"===e?t.toString():""+t}function wI(t,e){switch(e){case 2:return function(t){return this.fromWireType(FR[t>>2])};case 3:return function(t){return this.fromWireType(ZR[t>>3])};default:throw new TypeError("Unknown float type: "+t)}}function MI(t,e,r){var i=dx(r);Mx(t,{name:e=px(e),fromWireType:function(t){return t},toWireType:function(t,e){if("number"!=typeof e&&"boolean"!=typeof e)throw new TypeError('Cannot convert "'+yI(e)+'" to '+this.name);return e},argPackAdvance:8,readValueFromPointer:wI(e,i),destructorFunction:null})}function _I(t,e,r){switch(e){case 0:return r?function(t){return OR[t]}:function(t){return jR[t]};case 1:return r?function(t){return UR[t>>1]}:function(t){return NR[t>>1]};case 2:return r?function(t){return zR[t>>2]}:function(t){return qR[t>>2]};default:throw new TypeError("Unknown integer type: "+t)}}function AI(t,e,r,i,n){e=px(e),-1===n&&(n=4294967295);var o=dx(r),s=function(t){return t};if(0===i){var a=32-8*r;s=function(t){return t<>>a}}var h=e.includes("unsigned");Mx(t,{name:e,fromWireType:s,toWireType:function(t,r){if("number"!=typeof r&&"boolean"!=typeof r)throw new TypeError('Cannot convert "'+yI(r)+'" to '+this.name);if(rn)throw new TypeError('Passing a number "'+yI(r)+'" from JS side to C/C++ side to an argument of type "'+e+'", which is outside the valid range ['+i+", "+n+"]!");return h?r>>>0:0|r},argPackAdvance:8,readValueFromPointer:_I(e,o,0!==i),destructorFunction:null})}function EI(t,e,r){var i=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][e];function n(t){var e=qR,r=e[t>>=2],n=e[t+1];return new i(LR,n,r)}Mx(t,{name:r=px(r),fromWireType:n,argPackAdvance:8,readValueFromPointer:n},{ignoreDuplicateRegistrations:!0})}function SI(t,e){var r="std::string"===(e=px(e));Mx(t,{name:e,fromWireType:function(t){var e,i=qR[t>>2];if(r)for(var n=t+4,o=0;o<=i;++o){var s=t+4+o;if(o==i||0==jR[s]){var a=FT(n,s-n);void 0===e?e=a:(e+=String.fromCharCode(0),e+=a),n=s+1}}else{var h=new Array(i);for(o=0;o>2]=n,r&&i)HT(e,o+4,n+1);else if(i)for(var s=0;s255&&(xT(o),bx("String has UTF-16 code units that do not fit in 8 bits")),jR[o+4+s]=a}else for(s=0;s>2],s=o(),h=t+4,u=0;u<=n;++u){var f=t+4+u*e;if(u==n||0==s[f>>a]){var l=i(h,f-h);void 0===r?r=l:(r+=String.fromCharCode(0),r+=l),h=f+e}}return xT(t),r},toWireType:function(t,i){"string"!=typeof i&&bx("Cannot pass non-string to C++ string type "+r);var o=s(i),h=IT(4+o+e);return qR[h>>2]=o>>a,n(i,h+4,o+e),null!==t&&t.push(xT,h),h},argPackAdvance:8,readValueFromPointer:qx,destructorFunction:function(t){xT(t)}})}function BI(t,e){Mx(t,{isVoid:!0,name:e=px(e),argPackAdvance:0,fromWireType:function(){},toWireType:function(t,e){}})}function RI(t){return t||bx("Cannot use deleted val. handle = "+t),_T[t].value}function TI(t,e){var r=uT[t];return void 0===r&&bx(e+" has unknown type "+iI(t)),r}function xI(t,e,r){t=RI(t),e=TI(e,"emval::as");var i=[],n=vI(i);return zR[r>>2]=n,e.toWireType(i,t)}function II(t,e,r,i){var n,o;(t=ET[t])(e=RI(e),r=void 0===(o=AT[n=r])?px(n):o,null,i)}function CI(t,e){for(var r=function(t,e){for(var r=new Array(t),i=0;i>2)+i],"parameter "+i);return r}(t,e),i=r[0],n=i.name+"_$"+r.slice(1).map((function(t){return t.name})).join("_")+"$",o=["retType"],s=[i],a="",h=0;h4&&(_T[t].refcount+=1)}function DI(t){aI(_T[t].value),cI(t)}function LI(t,e){return vI((t=TI(t,"_emval_take_value")).readValueFromPointer(e))}function OI(){tx()}function jI(){return void 0===jI.start&&(jI.start=Date.now()),1e3*(Date.now()-jI.start)|0}function UI(t,e){return(t>>>0)+4294967296*e}function NI(t,e){if(t<=0)return t;var r=e<=32?Math.abs(1<=r&&(e<=32||t>r)&&(t=-2*r+t),t}function zI(t,e){return t>=0?t:e<=32?2*Math.abs(1<0?"\n":"")+function(t){var e=sx(),r=e.lastIndexOf("_emscripten_log"),i=e.lastIndexOf("_emscripten_get_callstack"),n=e.indexOf("\n",Math.max(r,i))+1;e=e.slice(n),32&t&&NT("EM_LOG_DEMANGLE is deprecated; ignoring"),8&t&&"undefined"==typeof emscripten_source_map&&(NT('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.'),t^=8,t|=16);var o=null;if(128&t)for(o=qI(arguments);o[1].includes("_emscripten_");)o=qI(o[0]);var s=e.split("\n");e="";var a=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)"),h=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?"),u=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var f in s){var l=s[f],d="",c="",p=0,m=0,g=u.exec(l);if(g&&5==g.length)d=g[1],c=g[2],p=g[3],m=g[4];else{if((g=a.exec(l))||(g=h.exec(l)),!(g&&g.length>=4)){e+=l+"\n";continue}d=g[1],c=g[2],p=g[3],m=0|g[4]}var v=!1;if(8&t){var b=emscripten_source_map.originalPositionFor({line:p,column:m});(v=b&&b.source)&&(64&t&&(b.source=b.source.substring(b.source.replace(/\\/g,"/").lastIndexOf("/")+1)),e+=" at "+d+" ("+b.source+":"+b.line+":"+b.column+")\n")}(16&t||!v)&&(64&t&&(c=c.substring(c.replace(/\\/g,"/").lastIndexOf("/")+1)),e+=(v?" = "+d:" at "+d)+" ("+c+":"+p+":"+m+")\n"),128&t&&o[0]&&(o[1]==d&&o[2].length>0&&(e=e.replace(/\s+$/,""),e+=" with values: "+o[1]+o[2]+"\n"),o=qI(o[0]))}return e.replace(/\s+$/,"")}(t)),1&t?4&t?console.error(e):2&t?console.warn(e):512&t?console.info(e):256&t?console.debug(e):console.log(e):6&t?BR(e):kR(e)}function ZI(t,e,r){var i=function(t,e){var r=t,i=e;function n(t){var e;return i=function(t,e){return"double"!==e&&"i64"!==e||7&t&&(t+=4),t}(i,t),"double"===t?(e=ZR[i>>3],i+=8):"i64"==t?(e=[zR[i>>2],zR[i+4>>2]],i+=8):(t="i32",e=zR[i>>2],i+=4),e}for(var o,s,a,h,u=[];;){var f=r;if(0===(o=OR[r>>0]))break;if(s=OR[r+1>>0],37==o){var l=!1,d=!1,c=!1,p=!1,m=!1;t:for(;;){switch(s){case 43:l=!0;break;case 45:d=!0;break;case 35:c=!0;break;case 48:if(p)break t;p=!0;break;case 32:m=!0;break;default:break t}r++,s=OR[r+1>>0]}var g=0;if(42==s)g=n("i32"),r++,s=OR[r+1>>0];else for(;s>=48&&s<=57;)g=10*g+(s-48),r++,s=OR[r+1>>0];var v,b=!1,y=-1;if(46==s){if(y=0,b=!0,r++,42==(s=OR[r+1>>0]))y=n("i32"),r++;else for(;;){var w=OR[r+1>>0];if(w<48||w>57)break;y=10*y+(w-48),r++}s=OR[r+1>>0]}switch(y<0&&(y=6,b=!1),String.fromCharCode(s)){case"h":104==OR[r+2>>0]?(r++,v=1):v=2;break;case"l":108==OR[r+2>>0]?(r++,v=8):v=4;break;case"L":case"q":case"j":v=8;break;case"z":case"t":case"I":v=4;break;default:v=null}switch(v&&r++,s=OR[r+1>>0],String.fromCharCode(s)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":var M=100==s||105==s;a=n("i"+8*(v=v||4)),8==v&&(a=117==s?(a[0]>>>0)+4294967296*(a[1]>>>0):UI(a[0],a[1])),v<=4&&(a=(M?NI:zI)(a&Math.pow(256,v)-1,8*v));var _=Math.abs(a),A="";if(100==s||105==s)k=NI(a,8*v).toString(10);else if(117==s)k=zI(a,8*v).toString(10),a=Math.abs(a);else if(111==s)k=(c?"0":"")+_.toString(8);else if(120==s||88==s){if(A=c&&0!=a?"0x":"",a<0){a=-a,k=(_-1).toString(16);for(var E=[],S=0;S=0&&(l?A="+"+A:m&&(A=" "+A)),"-"==k.charAt(0)&&(A="-"+A,k=k.substr(1));A.length+k.lengthT&&T>=-4?(s=(103==s?"f":"F").charCodeAt(0),y-=T+1):(s=(103==s?"e":"E").charCodeAt(0),y--),R=Math.min(y,20)}101==s||69==s?(k=a.toExponential(R),/[eE][-+]\d$/.test(k)&&(k=k.slice(0,-1)+"0"+k.slice(-1))):102!=s&&70!=s||(k=a.toFixed(R),0===a&&((h=a)<0||0===h&&1/h==-1/0)&&(k="-"+k));var x=k.split("e");if(B&&!c)for(;x[0].length>1&&x[0].includes(".")&&("0"==x[0].slice(-1)||"."==x[0].slice(-1));)x[0]=x[0].slice(0,-1);else for(c&&-1==k.indexOf(".")&&(x[0]+=".");y>R++;)x[0]+="0";k=x[0]+(x.length>1?"e"+x[1]:""),69==s&&(k=k.toUpperCase()),a>=0&&(l?k="+"+k:m&&(k=" "+k))}else k=(a<0?"-":"")+"inf",p=!1;for(;k.length>0]);else u=u.concat(eC("(null)".substr(0,C),!0));if(d)for(;C0;)u.push(32);d||u.push(n("i8"));break;case"n":var P=n("i32*");zR[P>>2]=u.length;break;case"%":u.push(o);break;default:for(S=f;S>0])}r+=2}else u.push(o),r+=1}return u}(e,r);FI(t,qT(i,0))}function HI(t){jR.length;tx("OOM")}function KI(){if(!KI.strings){var t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:mR||"./this.program"};for(var e in ST)t[e]=ST[e];var r=[];for(var e in t)r.push(e+"="+t[e]);KI.strings=r}return KI.strings}function WI(t,e){try{var r=0;return KI().forEach((function(i,n){var o=e+r;zR[t+4*n>>2]=o,function(t,e,r){for(var i=0;i>0]=t.charCodeAt(i);r||(OR[e>>0]=0)}(i,o),r+=i.length+1})),0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function GI(t,e){try{var r=KI();zR[t>>2]=r.length;var i=0;return r.forEach((function(t){i+=t.length+1})),zR[e>>2]=i,0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function YI(t){try{var e=sT.getStreamFromFD(t);return oT.close(e),0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function VI(t,e){try{var r=sT.getStreamFromFD(t),i=r.tty?2:oT.isDir(r.mode)?3:oT.isLink(r.mode)?7:4;return OR[e>>0]=i,0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function $I(t,e,r,i){try{var n=sT.getStreamFromFD(t),o=sT.doReadv(n,e,r);return zR[i>>2]=o,0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function XI(t,e,r,i,n){try{var o=sT.getStreamFromFD(t),s=4294967296*r+(e>>>0),a=9007199254740992;return s<=-a||s>=a?-61:(oT.llseek(o,s,i),tT=[o.position>>>0,(QR=o.position,+Math.abs(QR)>=1?QR>0?(0|Math.min(+Math.floor(QR/4294967296),4294967295))>>>0:~~+Math.ceil((QR-+(~~QR>>>0))/4294967296)>>>0:0)],zR[n>>2]=tT[0],zR[n+4>>2]=tT[1],o.getdents&&0===s&&0===i&&(o.getdents=null),0)}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function JI(t,e,r,i){try{var n=sT.getStreamFromFD(t),o=sT.doWritev(n,e,r);return zR[i>>2]=o,0}catch(t){return void 0!==oT&&t instanceof oT.ErrnoError||tx(t),t.errno}}function QI(t){var e=Date.now();return zR[t>>2]=e/1e3|0,zR[t+4>>2]=e%1e3*1e3|0,0}function tC(t){TR(t)}function eC(t,e,r){var i=r>0?r:KT(t)+1,n=new Array(i),o=ZT(t,n,0,n.length);return e&&(n.length=o),n}function rC(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}function iC(t){function e(){LT||(LT=!0,lR.calledRun=!0,CR||(!0,lR.noFSInit||oT.init.initialized||oT.init(),iT.init(),ox(WR),lR.onRuntimeInitialized&&lR.onRuntimeInitialized(),function(){if(lR.postRun)for("function"==typeof lR.postRun&&(lR.postRun=[lR.postRun]);lR.postRun.length;)t=lR.postRun.shift(),GR.unshift(t);var t;ox(GR)}()))}t=t||pR,YR>0||(!function(){if(lR.preRun)for("function"==typeof lR.preRun&&(lR.preRun=[lR.preRun]);lR.preRun.length;)t=lR.preRun.shift(),KR.unshift(t);var t;ox(KR)}(),YR>0||(lR.setStatus?(lR.setStatus("Running..."),setTimeout((function(){setTimeout((function(){lR.setStatus("")}),1),e()}),1)):e()))}function nC(){for(cR in{},hR=jt(),uR="/home/lin/server/jessibuca/demo/public",fR=Ye().Buffer,dR={},lR=void 0!==lR?lR:{})lR.hasOwnProperty(cR)&&(dR[cR]=lR[cR]);for(cR in pR=[],mR="./this.program",function(t,e){throw e},gR=!1,vR=!1,bR=!1,yR=!1,gR="object"==typeof window,vR="function"==typeof importScripts,bR="object"==typeof hR&&"object"==typeof hR.versions&&"string"==typeof hR.versions.node,yR=!gR&&!bR&&!vR,wR="",bR?(wR=vR?tr().dirname(wR)+"/":uR+"/",MR=function(t,e){return ER||(ER=ir()),SR||(SR=tr()),t=SR.normalize(t),ER.readFileSync(t,e?null:"utf8")},AR=function(t){var e=MR(t,!0);return e.buffer||(e=new Uint8Array(e)),zT(e.buffer),e},hR.argv.length>1&&(mR=hR.argv[1].replace(/\\/g,"/")),pR=hR.argv.slice(2),lR,hR.on("uncaughtException",(function(t){if(!(t instanceof rC))throw t})),hR.on("unhandledRejection",tx),function(t){hR.exit(t)},lR.inspect=function(){return"[Emscripten Module object]"}):yR?("undefined"!=typeof read&&(MR=function(t){return read(t)}),AR=function(t){var e;return"function"==typeof readbuffer?new Uint8Array(readbuffer(t)):(zT("object"==typeof(e=read(t,"binary"))),e)},"undefined"!=typeof scriptArgs?pR=scriptArgs:void 0!==arguments&&(pR=arguments),"function"==typeof quit&&function(t){quit(t)},"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(gR||vR)&&(vR?wR=self.location.href:"undefined"!=typeof document&&document.currentScript&&(wR=document.currentScript.src),wR=0!==wR.indexOf("blob:")?wR.substr(0,wR.lastIndexOf("/")+1):"",MR=function(t){var e=new XMLHttpRequest;return e.open("GET",t,!1),e.send(null),e.responseText},vR&&(AR=function(t){var e=new XMLHttpRequest;return e.open("GET",t,!1),e.responseType="arraybuffer",e.send(null),new Uint8Array(e.response)}),_R=function(t,e,r){var i=new XMLHttpRequest;i.open("GET",t,!0),i.responseType="arraybuffer",i.onload=function(){200==i.status||0==i.status&&i.response?e(i.response):r()},i.onerror=r,i.send(null)},function(t){document.title=t}),kR=lR.print||console.log.bind(console),BR=lR.printErr||console.warn.bind(console),dR)dR.hasOwnProperty(cR)&&(lR[cR]=dR[cR]);if(dR=null,lR.arguments&&(pR=lR.arguments),lR.thisProgram&&(mR=lR.thisProgram),lR.quit&&lR.quit,RR=16,0,TR=function(t){t},lR.wasmBinary&&(xR=lR.wasmBinary),lR.noExitRuntime||!0,"object"!=typeof WebAssembly&&tx("no native wasm support detected"),CR=!1,PR="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,DR="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,lR.INITIAL_MEMORY||67108864,KR=[],WR=[],GR=[],!1,YR=0,VR=null,$R=null,lR.preloadedImages={},lR.preloadedAudios={},XR="data:application/octet-stream;base64,",ex(JR="ff.wasm")||(JR=UT(JR)),eT={splitPath:function(t){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];"."===n?t.splice(i,1):".."===n?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e="/"===t.charAt(0),r="/"===t.substr(-1);return(t=eT.normalizeArray(t.split("/").filter((function(t){return!!t})),!e).join("/"))||e||(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=eT.splitPath(t),r=e[0],i=e[1];return r||i?(i&&(i=i.substr(0,i.length-1)),r+i):"."},basename:function(t){if("/"===t)return"/";var e=(t=(t=eT.normalize(t)).replace(/\/$/,"")).lastIndexOf("/");return-1===e?t:t.substr(e+1)},extname:function(t){return eT.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return eT.normalize(t.join("/"))},join2:function(t,e){return eT.normalize(t+"/"+e)}},rT={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:oT.cwd();if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";t=i+"/"+t,e="/"===i.charAt(0)}return(e?"/":"")+(t=eT.normalizeArray(t.split("/").filter((function(t){return!!t})),!e).join("/"))||"."},relative:function(t,e){function r(t){for(var e=0;e=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=rT.resolve(t).substr(1),e=rT.resolve(e).substr(1);for(var i=r(t.split("/")),n=r(e.split("/")),o=Math.min(i.length,n.length),s=o,a=0;a0?r.slice(0,i).toString("utf-8"):null}else"undefined"!=typeof window&&"function"==typeof window.prompt?null!==(e=window.prompt("Input: "))&&(e+="\n"):"function"==typeof readline&&null!==(e=readline())&&(e+="\n");if(!e)return null;t.input=eC(e,!0)}return t.input.shift()},put_char:function(t,e){null===e||10===e?(kR(qT(t.output,0)),t.output=[]):0!=e&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(kR(qT(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){null===e||10===e?(BR(qT(t.output,0)),t.output=[]):0!=e&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(BR(qT(t.output,0)),t.output=[])}}},nT={ops_table:null,mount:function(t){return nT.createNode(null,"/",16895,0)},createNode:function(t,e,r,i){if(oT.isBlkdev(r)||oT.isFIFO(r))throw new oT.ErrnoError(63);nT.ops_table||(nT.ops_table={dir:{node:{getattr:nT.node_ops.getattr,setattr:nT.node_ops.setattr,lookup:nT.node_ops.lookup,mknod:nT.node_ops.mknod,rename:nT.node_ops.rename,unlink:nT.node_ops.unlink,rmdir:nT.node_ops.rmdir,readdir:nT.node_ops.readdir,symlink:nT.node_ops.symlink},stream:{llseek:nT.stream_ops.llseek}},file:{node:{getattr:nT.node_ops.getattr,setattr:nT.node_ops.setattr},stream:{llseek:nT.stream_ops.llseek,read:nT.stream_ops.read,write:nT.stream_ops.write,allocate:nT.stream_ops.allocate,mmap:nT.stream_ops.mmap,msync:nT.stream_ops.msync}},link:{node:{getattr:nT.node_ops.getattr,setattr:nT.node_ops.setattr,readlink:nT.node_ops.readlink},stream:{}},chrdev:{node:{getattr:nT.node_ops.getattr,setattr:nT.node_ops.setattr},stream:oT.chrdev_stream_ops}});var n=oT.createNode(t,e,r,i);return oT.isDir(n.mode)?(n.node_ops=nT.ops_table.dir.node,n.stream_ops=nT.ops_table.dir.stream,n.contents={}):oT.isFile(n.mode)?(n.node_ops=nT.ops_table.file.node,n.stream_ops=nT.ops_table.file.stream,n.usedBytes=0,n.contents=null):oT.isLink(n.mode)?(n.node_ops=nT.ops_table.link.node,n.stream_ops=nT.ops_table.link.stream):oT.isChrdev(n.mode)&&(n.node_ops=nT.ops_table.chrdev.node,n.stream_ops=nT.ops_table.chrdev.stream),n.timestamp=Date.now(),t&&(t.contents[e]=n,t.timestamp=n.timestamp),n},getFileDataAsTypedArray:function(t){return t.contents?t.contents.subarray?t.contents.subarray(0,t.usedBytes):new Uint8Array(t.contents):new Uint8Array(0)},expandFileStorage:function(t,e){var r=t.contents?t.contents.length:0;if(!(r>=e)){e=Math.max(e,r*(r<1048576?2:1.125)>>>0),0!=r&&(e=Math.max(e,256));var i=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(i.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(0==e)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=oT.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,oT.isDir(t.mode)?e.size=4096:oT.isFile(t.mode)?e.size=t.usedBytes:oT.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){void 0!==e.mode&&(t.mode=e.mode),void 0!==e.timestamp&&(t.timestamp=e.timestamp),void 0!==e.size&&nT.resizeFileStorage(t,e.size)},lookup:function(t,e){throw oT.genericErrors[44]},mknod:function(t,e,r,i){return nT.createNode(t,e,r,i)},rename:function(t,e,r){if(oT.isDir(t.mode)){var i;try{i=oT.lookupNode(e,r)}catch(t){}if(i)for(var n in i.contents)throw new oT.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=oT.lookupNode(t,e);for(var i in r.contents)throw new oT.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)t.contents.hasOwnProperty(r)&&e.push(r);return e},symlink:function(t,e,r){var i=nT.createNode(t,e,41471,0);return i.link=r,i},readlink:function(t){if(!oT.isLink(t.mode))throw new oT.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,i,n){var o=t.node.contents;if(n>=t.node.usedBytes)return 0;var s=Math.min(t.node.usedBytes-n,i);if(s>8&&o.subarray)e.set(o.subarray(n,n+s),r);else for(var a=0;a0||i+r8)throw new oT.ErrnoError(32);for(var n=eT.normalizeArray(t.split("/").filter((function(t){return!!t})),!1),o=oT.root,s="/",a=0;a40)throw new oT.ErrnoError(32)}}return{path:s,node:o}},getPath:function(t){for(var e;;){if(oT.isRoot(t)){var r=t.mount.mountpoint;return e?"/"!==r[r.length-1]?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:function(t,e){for(var r=0,i=0;i>>0)%oT.nameTable.length},hashAddNode:function(t){var e=oT.hashName(t.parent.id,t.name);t.name_next=oT.nameTable[e],oT.nameTable[e]=t},hashRemoveNode:function(t){var e=oT.hashName(t.parent.id,t.name);if(oT.nameTable[e]===t)oT.nameTable[e]=t.name_next;else for(var r=oT.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:function(t,e){var r=oT.mayLookup(t);if(r)throw new oT.ErrnoError(r,t);for(var i=oT.hashName(t.id,e),n=oT.nameTable[i];n;n=n.name_next){var o=n.name;if(n.parent.id===t.id&&o===e)return n}return oT.lookup(t,e)},createNode:function(t,e,r,i){var n=new oT.FSNode(t,e,r,i);return oT.hashAddNode(n),n},destroyNode:function(t){oT.hashRemoveNode(t)},isRoot:function(t){return t===t.parent},isMountpoint:function(t){return!!t.mounted},isFile:function(t){return 32768==(61440&t)},isDir:function(t){return 16384==(61440&t)},isLink:function(t){return 40960==(61440&t)},isChrdev:function(t){return 8192==(61440&t)},isBlkdev:function(t){return 24576==(61440&t)},isFIFO:function(t){return 4096==(61440&t)},isSocket:function(t){return 49152==(49152&t)},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(t){var e=oT.flagModes[t];if(void 0===e)throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:function(t){var e=["r","w","rw"][3&t];return 512&t&&(e+="w"),e},nodePermissions:function(t,e){return oT.ignorePermissions||(!e.includes("r")||292&t.mode)&&(!e.includes("w")||146&t.mode)&&(!e.includes("x")||73&t.mode)?0:2},mayLookup:function(t){var e=oT.nodePermissions(t,"x");return e||(t.node_ops.lookup?0:2)},mayCreate:function(t,e){try{oT.lookupNode(t,e);return 20}catch(t){}return oT.nodePermissions(t,"wx")},mayDelete:function(t,e,r){var i;try{i=oT.lookupNode(t,e)}catch(t){return t.errno}var n=oT.nodePermissions(t,"wx");if(n)return n;if(r){if(!oT.isDir(i.mode))return 54;if(oT.isRoot(i)||oT.getPath(i)===oT.cwd())return 10}else if(oT.isDir(i.mode))return 31;return 0},mayOpen:function(t,e){return t?oT.isLink(t.mode)?32:oT.isDir(t.mode)&&("r"!==oT.flagsToPermissionString(e)||512&e)?31:oT.nodePermissions(t,oT.flagsToPermissionString(e)):44},MAX_OPEN_FDS:4096,nextfd:function(t,e){t=t||0,e=e||oT.MAX_OPEN_FDS;for(var r=t;r<=e;r++)if(!oT.streams[r])return r;throw new oT.ErrnoError(33)},getStream:function(t){return oT.streams[t]},createStream:function(t,e,r){oT.FSStream||(oT.FSStream=function(){},oT.FSStream.prototype={object:{get:function(){return this.node},set:function(t){this.node=t}},isRead:{get:function(){return 1!=(2097155&this.flags)}},isWrite:{get:function(){return 0!=(2097155&this.flags)}},isAppend:{get:function(){return 1024&this.flags}}});var i=new oT.FSStream;for(var n in t)i[n]=t[n];t=i;var o=oT.nextfd(e,r);return t.fd=o,oT.streams[o]=t,t},closeStream:function(t){oT.streams[t]=null},chrdev_stream_ops:{open:function(t){var e=oT.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:function(){throw new oT.ErrnoError(70)}},major:function(t){return t>>8},minor:function(t){return 255&t},makedev:function(t,e){return t<<8|e},registerDevice:function(t,e){oT.devices[t]={stream_ops:e}},getDevice:function(t){return oT.devices[t]},getMounts:function(t){for(var e=[],r=[t];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(t,e){"function"==typeof t&&(e=t,t=!1),oT.syncFSRequests++,oT.syncFSRequests>1&&BR("warning: "+oT.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=oT.getMounts(oT.root.mount),i=0;function n(t){return oT.syncFSRequests--,e(t)}function o(t){if(t)return o.errored?void 0:(o.errored=!0,n(t));++i>=r.length&&n(null)}r.forEach((function(e){if(!e.type.syncfs)return o(null);e.type.syncfs(e,t,o)}))},mount:function(t,e,r){var i,n="/"===r,o=!r;if(n&&oT.root)throw new oT.ErrnoError(10);if(!n&&!o){var s=oT.lookupPath(r,{follow_mount:!1});if(r=s.path,i=s.node,oT.isMountpoint(i))throw new oT.ErrnoError(10);if(!oT.isDir(i.mode))throw new oT.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},h=t.mount(a);return h.mount=a,a.root=h,n?oT.root=h:i&&(i.mounted=a,i.mount&&i.mount.mounts.push(a)),h},unmount:function(t){var e=oT.lookupPath(t,{follow_mount:!1});if(!oT.isMountpoint(e.node))throw new oT.ErrnoError(28);var r=e.node,i=r.mounted,n=oT.getMounts(i);Object.keys(oT.nameTable).forEach((function(t){for(var e=oT.nameTable[t];e;){var r=e.name_next;n.includes(e.mount)&&oT.destroyNode(e),e=r}})),r.mounted=null;var o=r.mount.mounts.indexOf(i);r.mount.mounts.splice(o,1)},lookup:function(t,e){return t.node_ops.lookup(t,e)},mknod:function(t,e,r){var i=oT.lookupPath(t,{parent:!0}).node,n=eT.basename(t);if(!n||"."===n||".."===n)throw new oT.ErrnoError(28);var o=oT.mayCreate(i,n);if(o)throw new oT.ErrnoError(o);if(!i.node_ops.mknod)throw new oT.ErrnoError(63);return i.node_ops.mknod(i,n,e,r)},create:function(t,e){return e=void 0!==e?e:438,e&=4095,e|=32768,oT.mknod(t,e,0)},mkdir:function(t,e){return e=void 0!==e?e:511,e&=1023,e|=16384,oT.mknod(t,e,0)},mkdirTree:function(t,e){for(var r=t.split("/"),i="",n=0;nthis.length-1||t<0)){var e=t%this.chunkSize,r=t/this.chunkSize|0;return this.getter(r)[e]}},o.prototype.setDataGetter=function(t){this.getter=t},o.prototype.cacheLength=function(){var t=new XMLHttpRequest;if(t.open("HEAD",r,!1),t.send(null),!(t.status>=200&&t.status<300||304===t.status))throw new Error("Couldn't load "+r+". Status: "+t.status);var e,i=Number(t.getResponseHeader("Content-length")),n=(e=t.getResponseHeader("Accept-Ranges"))&&"bytes"===e,o=(e=t.getResponseHeader("Content-Encoding"))&&"gzip"===e,s=1048576;n||(s=i);var a=this;a.setDataGetter((function(t){var e=t*s,n=(t+1)*s-1;if(n=Math.min(n,i-1),void 0===a.chunks[t]&&(a.chunks[t]=function(t,e){if(t>e)throw new Error("invalid range ("+t+", "+e+") or no bytes requested!");if(e>i-1)throw new Error("only "+i+" bytes available! programmer error!");var n=new XMLHttpRequest;if(n.open("GET",r,!1),i!==s&&n.setRequestHeader("Range","bytes="+t+"-"+e),"undefined"!=typeof Uint8Array&&(n.responseType="arraybuffer"),n.overrideMimeType&&n.overrideMimeType("text/plain; charset=x-user-defined"),n.send(null),!(n.status>=200&&n.status<300||304===n.status))throw new Error("Couldn't load "+r+". Status: "+n.status);return void 0!==n.response?new Uint8Array(n.response||[]):eC(n.responseText||"",!0)}(e,n)),void 0===a.chunks[t])throw new Error("doXHR failed!");return a.chunks[t]})),!o&&i||(s=i=1,i=this.getter(0).length,s=i,kR("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=i,this._chunkSize=s,this.lengthKnown=!0},"undefined"!=typeof XMLHttpRequest){if(!vR)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var s=new o;Object.defineProperties(s,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:s}}else a={isDevice:!1,url:r};var h=oT.createFile(t,e,a,i,n);a.contents?h.contents=a.contents:a.url&&(h.contents=null,h.url=a.url),Object.defineProperties(h,{usedBytes:{get:function(){return this.contents.length}}});var u={};return Object.keys(h.stream_ops).forEach((function(t){var e=h.stream_ops[t];u[t]=function(){return oT.forceLoadFile(h),e.apply(null,arguments)}})),u.read=function(t,e,r,i,n){oT.forceLoadFile(h);var o=t.node.contents;if(n>=o.length)return 0;var s=Math.min(o.length-n,i);if(o.slice)for(var a=0;a>2]=i.dev,zR[r+4>>2]=0,zR[r+8>>2]=i.ino,zR[r+12>>2]=i.mode,zR[r+16>>2]=i.nlink,zR[r+20>>2]=i.uid,zR[r+24>>2]=i.gid,zR[r+28>>2]=i.rdev,zR[r+32>>2]=0,tT=[i.size>>>0,(QR=i.size,+Math.abs(QR)>=1?QR>0?(0|Math.min(+Math.floor(QR/4294967296),4294967295))>>>0:~~+Math.ceil((QR-+(~~QR>>>0))/4294967296)>>>0:0)],zR[r+40>>2]=tT[0],zR[r+44>>2]=tT[1],zR[r+48>>2]=4096,zR[r+52>>2]=i.blocks,zR[r+56>>2]=i.atime.getTime()/1e3|0,zR[r+60>>2]=0,zR[r+64>>2]=i.mtime.getTime()/1e3|0,zR[r+68>>2]=0,zR[r+72>>2]=i.ctime.getTime()/1e3|0,zR[r+76>>2]=0,tT=[i.ino>>>0,(QR=i.ino,+Math.abs(QR)>=1?QR>0?(0|Math.min(+Math.floor(QR/4294967296),4294967295))>>>0:~~+Math.ceil((QR-+(~~QR>>>0))/4294967296)>>>0:0)],zR[r+80>>2]=tT[0],zR[r+84>>2]=tT[1],0},doMsync:function(t,e,r,i,n){var o=jR.slice(t,t+r);oT.msync(e,o,n,r,i)},doMkdir:function(t,e){return"/"===(t=eT.normalize(t))[t.length-1]&&(t=t.substr(0,t.length-1)),oT.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(61440&e){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return oT.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var i=oT.readlink(t),n=Math.min(r,KT(i)),o=OR[e+n];return HT(i,e,r+1),OR[e+n]=o,n},doAccess:function(t,e){if(-8&e)return-28;var r;if(!(r=oT.lookupPath(t,{follow:!0}).node))return-44;var i="";return 4&e&&(i+="r"),2&e&&(i+="w"),1&e&&(i+="x"),i&&oT.nodePermissions(r,i)?-2:0},doDup:function(t,e,r){var i=oT.getStream(r);return i&&oT.close(i),oT.open(t,e,0,r,r).fd},doReadv:function(t,e,r,i){for(var n=0,o=0;o>2],a=zR[e+(8*o+4)>>2],h=oT.read(t,OR,s,a,i);if(h<0)return-1;if(n+=h,h>2],a=zR[e+(8*o+4)>>2],h=oT.write(t,OR,s,a,i);if(h<0)return-1;n+=h}return n},varargs:void 0,get:function(){return sT.varargs+=4,zR[sT.varargs-4>>2]},getStr:function(t){return FT(t)},getStreamFromFD:function(t){var e=oT.getStream(t);if(!e)throw new oT.ErrnoError(8);return e},get64:function(t,e){return t}},aT=void 0,hT={},uT={},fT={},lT=48,dT=57,cT=void 0,pT=void 0,mT=!1,gT=void 0,vT=[],bT={},yT={},wT=void 0,MT=[],_T=[{},{value:void 0},{value:null},{value:!0},{value:!1}],AT={},ET=[],ST={},kT=function(t,e,r,i){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=oT.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},BT=365,RT=146,Object.defineProperties(kT.prototype,{read:{get:function(){return(this.mode&BT)===BT},set:function(t){t?this.mode|=BT:this.mode&=~BT}},write:{get:function(){return(this.mode&RT)===RT},set:function(t){t?this.mode|=RT:this.mode&=~RT}},isFolder:{get:function(){return oT.isDir(this.mode)}},isDevice:{get:function(){return oT.isChrdev(this.mode)}}}),oT.FSNode=kT,oT.staticInit(),cx(),cT=lR.BindingError=vx(Error,"BindingError"),pT=lR.InternalError=vx(Error,"InternalError"),Px(),Qx(),Vx(),wT=lR.UnboundTypeError=vx(Error,"UnboundTypeError"),gI(),TT={z:ux,y:fx,t:lx,D:_x,o:oI,j:hI,g:fI,I:dI,C:bI,m:MI,c:AI,b:EI,n:SI,i:kI,E:BI,r:xI,e:II,p:cI,d:CI,H:PI,q:DI,w:LI,a:OI,G:jI,f:ZI,u:HI,v:WI,x:GI,l:YI,A:VI,B:$I,s:XI,k:JI,F:QI,h:tC},nx(),lR.___wasm_call_ctors=function(){return(lR.___wasm_call_ctors=lR.asm.K).apply(null,arguments)},xT=lR._free=function(){return(xT=lR._free=lR.asm.L).apply(null,arguments)},IT=lR._malloc=function(){return(IT=lR._malloc=lR.asm.M).apply(null,arguments)},CT=lR._strlen=function(){return(CT=lR._strlen=lR.asm.O).apply(null,arguments)},PT=lR.___errno_location=function(){return(PT=lR.___errno_location=lR.asm.P).apply(null,arguments)},DT=lR.___getTypeName=function(){return(DT=lR.___getTypeName=lR.asm.Q).apply(null,arguments)},lR.___embind_register_native_and_builtin_types=function(){return(lR.___embind_register_native_and_builtin_types=lR.asm.R).apply(null,arguments)},lR.dynCall_ijiii=function(){return(lR.dynCall_ijiii=lR.asm.S).apply(null,arguments)},lR.dynCall_viiijj=function(){return(lR.dynCall_viiijj=lR.asm.T).apply(null,arguments)},lR.dynCall_jij=function(){return(lR.dynCall_jij=lR.asm.U).apply(null,arguments)},lR.dynCall_jii=function(){return(lR.dynCall_jii=lR.asm.V).apply(null,arguments)},lR.dynCall_jiji=function(){return(lR.dynCall_jiji=lR.asm.W).apply(null,arguments)},lR._ff_h264_cabac_tables=77157,$R=function t(){LT||iC(),LT||($R=t)},lR.run=iC,lR.preInit)for("function"==typeof lR.preInit&&(lR.preInit=[lR.preInit]);lR.preInit.length>0;)lR.preInit.pop()();iC(),OT=e(lR)}var oC=!1;function sC(t){let e=t.next(),r=null;return i=>{var n=new Uint8Array(i);if(r){var o=new Uint8Array(r.length+n.length);o.set(r),o.set(n,r.length),n=o,r=null}for(;n.length>=e.value;){var s=n.slice(e.value);e=t.next(n.slice(0,e.value)),n=s}n.length>0&&(r=n)}}function aC(){({}),jT||(jT=!0,nC()),s(),(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const t=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(t instanceof WebAssembly.Module)return new WebAssembly.Instance(t)instanceof WebAssembly.Instance}}catch(t){}return!1})(),Date.now||(Date.now=function(){return(new Date).getTime()}),OT.print=function(t){postMessage({cmd:"print",text:t})},OT.printErr=function(t){postMessage({cmd:"printErr",text:t})},OT.postRun=function(){var t=[],e={_firstCheckpoint:0,_lastCheckpoint:0,_intervalBytes:0,_lastSecondBytes:0,addBytes:function(t){0===e._firstCheckpoint?(e._firstCheckpoint=Date.now(),e._lastCheckpoint=e._firstCheckpoint,e._intervalBytes+=t):Date.now()-e._lastCheckpoint<1e3?e._intervalBytes+=t:(e._lastSecondBytes=e._intervalBytes,e._intervalBytes=t,e._lastCheckpoint=Date.now())},reset:function(){e._firstCheckpoint=e._lastCheckpoint=0,e._intervalBytes=0,e._lastSecondBytes=0},getCurrentKBps:function(){e.addBytes(0);var t=(Date.now()-e._lastCheckpoint)/1e3;return 0==t&&(t=1),e._intervalBytes/t/1024},getLastSecondKBps:function(){return e.addBytes(0),0!==e._lastSecondBytes?e._lastSecondBytes/1024:Date.now()-e._lastCheckpoint>=500?e.getCurrentKBps():0}},r={opt:{},initAudioPlanar:function(t,e){postMessage({cmd:"initAudioPlanar",samplerate:e,channels:t});var r=[],i=[],n=0;this.playAudioPlanar=function(e,o){for(var s=o,a=[],h=0,u=0;u<2;u++){var f=OT.HEAPU32[(e>>2)+u]>>2;a[u]=OT.HEAPF32.subarray(f,f+s)}if(n){if(!(s>=(o=1024-n)))return n+=s,r[0]=Float32Array.of(...r[0],...a[0]),void(2==t&&(r[1]=Float32Array.of(...r[1],...a[1])));i[0]=Float32Array.of(...r[0],...a[0].subarray(0,o)),2==t&&(i[1]=Float32Array.of(...r[1],...a[1].subarray(0,o))),postMessage({cmd:"playAudio",buffer:i},i.map((t=>t.buffer))),h=o,s-=o}for(n=s;n>=1024;n-=1024)i[0]=a[0].slice(h,h+=1024),2==t&&(i[1]=a[1].slice(h-1024,h)),postMessage({cmd:"playAudio",buffer:i},i.map((t=>t.buffer)));n&&(r[0]=a[0].slice(h),2==t&&(r[1]=a[1].slice(h)))}},inputFlv:function*(){yield 9;for(var e=new ArrayBuffer(4),r=new Uint8Array(e),o=new Uint32Array(e);;){r[3]=0;var s=yield 15,a=s[4];r[0]=s[7],r[1]=s[6],r[2]=s[5];var h=o[0];r[0]=s[10],r[1]=s[9],r[2]=s[8];var u=o[0];16777215===u&&(r[3]=s[11],u=o[0]);var f=yield h;switch(a){case 8:this.opt.hasAudio&&t.push({ts:u,payload:f,decoder:i,type:0});break;case 9:t.push({ts:u,payload:f,decoder:n,type:f[0]>>4})}}},play:function(r){this.opt.debug&&console.log("Jessibuca play",r),this.getDelay=function(t){return t?(this.firstTimestamp=t,this.startTimestamp=Date.now(),this.getDelay=function(t){return this.delay=Date.now()-this.startTimestamp-(t-this.firstTimestamp),this.delay},-1):-1};if(this.stopId=setInterval((()=>{if(t.length)if(this.dropping){for(e=t.shift();1!==e.type&&t.length;)e=t.shift();1===e.type&&(this.dropping=!1,e.decoder.decode(e.payload))}else{var e=t[0];if(-1===this.getDelay(e.ts))t.shift(),this.ts=e.ts,e.decoder.decode(e.payload);else if(this.delay>this.videoBuffer+1e3)this.dropping=!0;else for(;t.length&&(e=t[0],this.getDelay(e.ts)>this.videoBuffer);)t.shift(),this.ts=e.ts,e.decoder.decode(e.payload)}}),10),this.speedSamplerId=setInterval((()=>{postMessage({cmd:"kBps",kBps:e.getLastSecondKBps()})}),1e3),0==r.indexOf("http")){this.flvMode=!0;var o=this,a=new AbortController;fetch(r,{signal:a.signal}).then((function(t){var r=t.body.getReader(),i=o.inputFlv(),n=sC(i),s=function(){r.read().then((({done:t,value:r})=>{t?i.return(null):(e.addBytes(r.byteLength),n(r),s())})).catch((function(t){i.return(null),o.opt.debug&&console.error(t),-1===t.toString().indexOf("The user aborted a request")&&postMessage({cmd:"printErr",text:t.toString()})}))};s()})).catch((t=>{postMessage({cmd:"printErr",text:t.message})})),this._close=function(){a.abort()}}else{if(this.flvMode=-1!=r.indexOf(".flv")||this.opt.isFlv,this.ws=new WebSocket(r),this.ws.binaryType="arraybuffer",this.flvMode){let t=this.inputFlv();var h=sC(t);this.ws.onmessage=t=>{e.addBytes(t.data.byteLength),h(t.data)},this.ws.onerror=e=>{t.return(null),postMessage({cmd:"printErr",text:e.toString()})}}else this.ws.onmessage=r=>{e.addBytes(r.data.byteLength);var o=new DataView(r.data);switch(o.getUint8(0)){case 1:this.opt.hasAudio&&t.push({ts:o.getUint32(1,!1),payload:new Uint8Array(r.data,5),decoder:i,type:0});break;case 2:t.push({ts:o.getUint32(1,!1),payload:new Uint8Array(r.data,5),decoder:n,type:o.getUint8(5)>>4})}},this.ws.onerror=t=>{postMessage({cmd:"printErr",text:t.toString()})};this._close=function(){this.ws&&(this.ws.close&&this.ws.close(),this.ws=null)}}this.setVideoSize=function(t,e){postMessage({cmd:"initSize",w:t,h:e});var r=t*e,i=r>>2;if(this.opt.forceNoOffscreen||"undefined"==typeof OffscreenCanvas)this.draw=function(t,e,n,o){var s=[OT.HEAPU8.subarray(e,e+r),OT.HEAPU8.subarray(n,n+i),OT.HEAPU8.subarray(o,o+i)].map((t=>Uint8Array.from(t)));postMessage({cmd:"render",compositionTime:t,delay:this.delay,ts:this.ts,output:s},s.map((t=>t.buffer)))};else{this.offscreenCanvas=new OffscreenCanvas(t,e),this.offscreenCanvasGL=this.offscreenCanvas.getContext("webgl");var n=s().default(this.offscreenCanvasGL);this.draw=function(o,s,a,h){n(t,e,OT.HEAPU8.subarray(s,s+r),OT.HEAPU8.subarray(a,a+i),OT.HEAPU8.subarray(h,h+i));let u=this.offscreenCanvas.transferToImageBitmap();postMessage({cmd:"render",compositionTime:o,delay:this.delay,ts:this.ts,buffer:u},[u])}}}},close:function(){this._close&&(this.opt.debug&&console.log("worker close"),this._close(),clearInterval(this.stopId),this.stopId=null,clearInterval(this.speedSamplerId),this.speedSamplerId=null,e.reset(),this.ws=null,i.clear(),n.clear(),this.firstTimestamp=0,this.startTimestamp=0,this.delay=0,this.ts=0,this.flvMode=!1,this.offscreenCanvas&&(this.offscreenCanvas=null),this.offscreenCanvasGL&&(this.offscreenCanvasGL=null),t=[],delete this.playAudioPlanar,delete this.draw,delete this.getDelay)}},i=new OT.AudioDecoder(r),n=new OT.VideoDecoder(r);postMessage({cmd:"init"}),self.onmessage=function(t){var e=t.data;switch(e.cmd){case"init":r.opt=JSON.parse(e.opt),i.sample_rate=e.sampleRate;break;case"getProp":postMessage({cmd:"getProp",value:r[e.prop]});break;case"setProp":r[e.prop]=e.value;break;case"play":r.play(e.url);break;case"setVideoBuffer":r.videoBuffer=1e3*e.time|0;break;case"close":r.close()}}}}"undefined"==typeof importScripts?wt||(wt=!0,{},l(),z(),Y(),J(),bt(),w(),O(),yt=class{constructor(t){if(this._opt=Object.assign(w().DEFAULT_OPTIONS,t),this.$container=t.container,"string"==typeof t.container&&(this.$container=document.querySelector(t.container)),!this.$container)throw new Error("Jessibuca need container option");delete this._opt.container,this._opt.debug&&console.log("options",this._opt),bt().default(this),l().default(this),z().default(this),J().default(this),Y().default(this)}set fullscreen(t){t?(O().checkFull()||this.$container.requestFullscreen(),O().$domToggle(this.$doms.minScreenDom,!0),O().$domToggle(this.$doms.fullscreenDom,!1)):(O().checkFull()&&document.exitFullscreen(),O().$domToggle(this.$doms.minScreenDom,!1),O().$domToggle(this.$doms.fullscreenDom,!0)),this._fullscreen!==t&&(this.onFullscreen(t),this._trigger(w().EVEMTS.fullscreen,t)),this._fullscreen=t}get fullscreen(){return this._fullscreen}set playing(t){t?(O().$domToggle(this.$doms.playBigDom,!1),O().$domToggle(this.$doms.playDom,!1),O().$domToggle(this.$doms.pauseDom,!0),O().$domToggle(this.$doms.screenshotsDom,!0),O().$domToggle(this.$doms.recordDom,!0),this._quieting?(O().$domToggle(this.$doms.quietAudioDom,!0),O().$domToggle(this.$doms.playAudioDom,!1)):(O().$domToggle(this.$doms.quietAudioDom,!1),O().$domToggle(this.$doms.playAudioDom,!0))):(this.$doms.speedDom&&(this.$doms.speedDom.innerText=""),this._playUrl&&(O().$domToggle(this.$doms.playDom,!0),O().$domToggle(this.$doms.playBigDom,!0),O().$domToggle(this.$doms.pauseDom,!1)),O().$domToggle(this.$doms.recordDom,!1),O().$domToggle(this.$doms.recordingDom,!1),O().$domToggle(this.$doms.screenshotsDom,!1),O().$domToggle(this.$doms.quietAudioDom,!1),O().$domToggle(this.$doms.playAudioDom,!1)),this._playing!==t&&(t?(this.onPlay(),this._trigger(w().EVEMTS.play)):(this.onPause(),this._trigger(w().EVEMTS.pause))),this._playing=t}get playing(){return this._playing}set quieting(t){t?(O().$domToggle(this.$doms.quietAudioDom,!0),O().$domToggle(this.$doms.playAudioDom,!1)):(O().$domToggle(this.$doms.quietAudioDom,!1),O().$domToggle(this.$doms.playAudioDom,!0)),this._quieting!==t&&(this.onMute(t),this._trigger(w().EVEMTS.mute,t)),this._quieting=t}get quieting(){return this._quieting}set loading(t){t?(O().$hideBtns(this.$doms),O().$domToggle(this.$doms.fullscreenDom,!0),O().$domToggle(this.$doms.pauseDom,!0),O().$domToggle(this.$doms.loadingDom,!0)):O().$initBtns(this.$doms),this._loading=t}get loading(){return this._loading}set recording(t){t?(O().$domToggle(this.$doms.recordDom,!1),O().$domToggle(this.$doms.recordingDom,!0)):(O().$domToggle(this.$doms.recordDom,!0),O().$domToggle(this.$doms.recordingDom,!1)),this._recording!==t&&(this.onRecord(t),this._trigger(w().EVEMTS.record,t),this._recording=t)}get recording(){return this._recording}isPlaying(){return this.playing}isMute(){return this.quieting}setDebug(t){this._opt.isDebug=!!t}setTimeout(t){this._opt.timeout=Number(t)}setVod(t){this._opt.vod=!!t}setNoOffscreen(t){this._opt.forceNoOffscreen=!!t}setScaleMode(t){0===(t=Number(t))?(this._opt.isFullResize=!1,this._opt.isResize=!1):1===t?(this._opt.isFullResize=!1,this._opt.isResize=!0):2===t&&(this._opt.isFullResize=!0),this._resize()}mute(){this._mute()}cancelMute(){this._cancelMute()}audioResume(){this._cancelMute()}pause(){this._pause()}play(t){this._play(t)}close(){this._close()}destroy(){this._close(),this._destroyAudioContext(),this._destroyContextGL(),this._decoderWorker.terminate(),this._removeEventListener(),this._initCheckVariable(),this._off(),this._removeContainerChild()}clearView(){this._clearView()}resize(){this._resize()}setBufferTime(t){t=Number(t),this._decoderWorker.postMessage({cmd:w().POST_MESSAGE.setVideoBuffer,time:t})}setRotate(t){t=parseInt(t,10),this._opt.rotate!==t&&-1!==[0,90,270].indexOf(t)&&(this._opt.rotate=t,this.resize())}setVolume(t){if(this._gainNode){if(t=parseFloat(t),isNaN(t))return;this._gainNode.gain.setValueAtTime(t,this._audioContext.currentTime)}}setKeepScreenOn(){this._opt.keepScreenOn=!0}setFullscreen(t){const e=!!t;this.fullscreen!==e&&(this.fullscreen=e)}hasLoaded(){return this._hasLoaded}screenshot(t,e,r,i){return this._screenshot(t,e,r,i)}on(t,e){this._on(t,e)}},window.Jessibuca=yt):oC||(oC=!0,aC())}(); \ No newline at end of file diff --git a/web_src/static/js/jessibuca/jessibuca.js b/web_src/static/js/jessibuca/jessibuca.js new file mode 100644 index 00000000..bbe05d27 --- /dev/null +++ b/web_src/static/js/jessibuca/jessibuca.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).jessibuca=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var i,o=t((function(e){e.exports=function(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e},e.exports.__esModule=!0,e.exports.default=e.exports})),r=(i=o)&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i;const A=0,n=1,s="flv",a="m7s",d={videoBuffer:1e3,isResize:!0,isFullResize:!1,isFlv:!1,debug:!1,hotKey:!1,loadingTimeout:10,heartTimeout:10,timeout:10,supportDblclickFullscreen:!1,showBandwidth:!1,keepScreenOn:!1,isNotMute:!1,hasAudio:!0,hasVideo:!0,operateBtns:{fullscreen:!1,screenshot:!1,play:!1,audio:!1,record:!1},hasControl:!1,loadingText:"",background:"",decoder:"decoder.js",url:"",rotate:0,forceNoOffscreen:!0,hiddenAutoPause:!1,protocol:n,demuxType:s,useWCS:!1,useMSE:!1,useOffscreen:!1},c="init",l="initVideo",u="render",h="playAudio",p="initAudio",m="audioCode",g="videoCode",f=1,b=2,y=8,v=9,w="init",S="decode",E="audioDecode",B="close",C={fullscreen:"fullscreen$2",webFullscreen:"webFullscreen",decoderWorkerInit:"decoderWorkerInit",play:"play",playing:"playing",pause:"pause",mute:"mute",load:"load",loading:"loading",videoInfo:"videoInfo",timeUpdate:"timeUpdate",audioInfo:"audioInfo",log:"log",error:"error",kBps:"kBps",timeout:"timeout",delayTimeout:"delayTimeout",loadingTimeout:"loadingTimeout",stats:"stats",performance:"performance",record:"record",recording:"recording",recordingTimestamp:"recordingTimestamp",recordStart:"recordStart",recordEnd:"recordEnd",recordCreateError:"recordCreateError",buffer:"buffer",videoFrame:"videoFrame",start:"start",metadata:"metadata",resize:"resize",streamEnd:"streamEnd",streamSuccess:"streamSuccess",streamMessage:"streamMessage",streamError:"streamError",volumechange:"volumechange",destroy:"destroy",mseSourceOpen:"mseSourceOpen",mseSourceClose:"mseSourceClose",mseSourceBufferError:"mseSourceBufferError",mseSourceBufferBusy:"mseSourceBufferBusy",videoWaiting:"videoWaiting",videoTimeUpdate:"videoTimeUpdate",videoSyncAudio:"videoSyncAudio",playToRenderTimes:"playToRenderTimes"},R={load:C.load,timeUpdate:C.timeUpdate,videoInfo:C.videoInfo,audioInfo:C.audioInfo,error:C.error,kBps:C.kBps,log:C.log,start:C.start,timeout:C.timeout,loadingTimeout:C.loadingTimeout,delayTimeout:C.delayTimeout,fullscreen:"fullscreen",play:C.play,pause:C.pause,mute:C.mute,stats:C.stats,performance:C.performance,recordingTimestamp:C.recordingTimestamp,recordStart:C.recordStart,recordEnd:C.recordEnd,playToRenderTimes:C.playToRenderTimes},k={playError:"playIsNotPauseOrUrlIsNull",fetchError:"fetchError",websocketError:"websocketError",webcodecsH265NotSupport:"webcodecsH265NotSupport",mediaSourceH265NotSupport:"mediaSourceH265NotSupport",wasmDecodeError:"wasmDecodeError"},T="notConnect",I="open",x="close",D="error",L={download:"download",base64:"base64",blob:"blob"},j={7:"H264(AVC)",12:"H265(HEVC)"},U=7,F=12,V={10:"AAC",7:"ALAW",8:"MULAW"},O=32,Q=33,M=34,W=0,G=1,J=2,N="mp4",z="webm",P="webcodecs",Y="webgl",H="offscreen",X="key",Z="delta",q='video/mp4; codecs="avc1.64002A"',K="ended",_="open",$="closed",ee=1e3,te=27,ie=38,oe=40;class re{constructor(e){this.log=function(t){if(e._opt.debug){for(var i=arguments.length,o=new Array(i>1?i-1:0),r=1;r1?i-1:0),r=1;r1?i-1:0),r=1;r3&&void 0!==arguments[3]?arguments[3]:{};if(!e)return;if(Array.isArray(t))return t.map((t=>this.proxy(e,t,i,o)));e.addEventListener(t,i,o);const r=()=>e.removeEventListener(t,i,o);return this.destroys.push(r),r}destroy(){this.master.debug.log("Events","destroy"),this.destroys.forEach((e=>e()))}}var ne=t((function(e){!function(){var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},i=e.exports,o=function(){for(var e,i=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],o=0,r=i.length,A={};o0&&void 0!==arguments[0]?arguments[0]:"";const t=e.split(","),i=atob(t[1]),o=t[0].replace("data:","").replace(";base64","");let r=i.length,A=new Uint8Array(r);for(;r--;)A[r]=i.charCodeAt(r);return new File([A],"file",{type:o})}function de(e,t){const i=document.createElement("a");i.download=t,i.href=URL.createObjectURL(e),i.click(),setTimeout((()=>{URL.revokeObjectURL(e)}),ge()?1e3:0)}function ce(){return(new Date).getTime()}function le(e,t,i){return Math.max(Math.min(e,Math.max(t,i)),Math.min(t,i))}function ue(e,t,i){if(e)return"object"==typeof t&&Object.keys(t).forEach((i=>{ue(e,i,t[i])})),e.style[t]=i,e}function he(e,t){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(!e)return 0;const o=getComputedStyle(e,null).getPropertyValue(t);return i?parseFloat(o):o}function pe(){return performance&&"function"==typeof performance.now?performance.now():Date.now()}function me(e){let t=0,i=pe();return o=>{t+=o;const r=pe(),A=r-i;A>=1e3&&(e(t/A*1e3),i=r,t=0)}}function ge(){const e=window.navigator.userAgent.toLowerCase();return e&&/iphone|ipad|ipod|ios/.test(e)}function fe(e){if(null==e||""===e)return"0 KB/S";let t=parseFloat(e);return t=t.toFixed(2),t+"KB/S"}function be(e){return null==e}function ye(e){return!be(e)}ne.isEnabled,(()=>{try{if("object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));if(e instanceof WebAssembly.Module)return new WebAssembly.Instance(e)instanceof WebAssembly.Instance}}catch(e){}})();class ve{on(e,t,i){const o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:i}),this}once(e,t,i){const o=this;function r(){o.off(e,r);for(var A=arguments.length,n=new Array(A),s=0;s1?i-1:0),r=1;r{delete i[e]})),void delete this.e;const o=i[e],r=[];if(o&&t)for(let e=0,i=o.length;e{var t=["attribute vec4 vertexPos;","attribute vec4 texturePos;","varying vec2 textureCoord;","void main()","{","gl_Position = vertexPos;","textureCoord = texturePos.xy;","}"].join("\n"),i=["precision highp float;","varying highp vec2 textureCoord;","uniform sampler2D ySampler;","uniform sampler2D uSampler;","uniform sampler2D vSampler;","const mat4 YUV2RGB = mat4","(","1.1643828125, 0, 1.59602734375, -.87078515625,","1.1643828125, -.39176171875, -.81296875, .52959375,","1.1643828125, 2.017234375, 0, -1.081390625,","0, 0, 0, 1",");","void main(void) {","highp float y = texture2D(ySampler, textureCoord).r;","highp float u = texture2D(uSampler, textureCoord).r;","highp float v = texture2D(vSampler, textureCoord).r;","gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;","}"].join("\n"),o=e.createShader(e.VERTEX_SHADER);e.shaderSource(o,t),e.compileShader(o),e.getShaderParameter(o,e.COMPILE_STATUS)||console.log("Vertex shader failed to compile: "+e.getShaderInfoLog(o));var r=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)||console.log("Fragment shader failed to compile: "+e.getShaderInfoLog(r));var A=e.createProgram();e.attachShader(A,o),e.attachShader(A,r),e.linkProgram(A),e.getProgramParameter(A,e.LINK_STATUS)||console.log("Program failed to compile: "+e.getProgramInfoLog(A)),e.useProgram(A);var n=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,1,-1,1,1,-1,-1,-1]),e.STATIC_DRAW);var s=e.getAttribLocation(A,"vertexPos");e.enableVertexAttribArray(s),e.vertexAttribPointer(s,2,e.FLOAT,!1,0,0);var a=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,a),e.bufferData(e.ARRAY_BUFFER,new Float32Array([1,0,0,0,1,1,0,1]),e.STATIC_DRAW);var d=e.getAttribLocation(A,"texturePos");function c(t,i){var o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),e.uniform1i(e.getUniformLocation(A,t),i),o}e.enableVertexAttribArray(d),e.vertexAttribPointer(d,2,e.FLOAT,!1,0,0);var l=c("ySampler",0),u=c("uSampler",1),h=c("vSampler",2);return{render:function(t,i,o,r,A){e.viewport(0,0,t,i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,l),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t,i,0,e.LUMINANCE,e.UNSIGNED_BYTE,o),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,u),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,h),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,t/2,i/2,0,e.LUMINANCE,e.UNSIGNED_BYTE,A),e.drawArrays(e.TRIANGLE_STRIP,0,4)},destroy:function(){try{e.deleteProgram(A),e.deleteBuffer(n),e.deleteBuffer(a),e.deleteTexture(l),e.deleteTexture(u),e.deleteBuffer(h)}catch(e){}}}})(this.contextGl);this.contextGlRender=e.render,this.contextGlDestroy=e.destroy}_initContext2D(){this.context2D=this.$videoElement.getContext("2d")}_initCanvasRender(){this.player._opt.useWCS&&!this._supportOffscreen()?(this.renderType=P,this._initContext2D()):this._supportOffscreen()?(this.renderType=H,this._bindOffscreen()):(this.renderType=Y,this._initContextGl())}_supportOffscreen(){return"function"==typeof this.$videoElement.transferControlToOffscreen&&this.player._opt.useOffscreen}_bindOffscreen(){this.bitmaprenderer=this.$videoElement.getContext("bitmaprenderer")}initCanvasViewSize(){this.$videoElement.width=this.videoInfo.width,this.$videoElement.height=this.videoInfo.height,this.resize()}render(e){switch(this.player.videoTimestamp=e.ts,this.renderType){case H:this.bitmaprenderer.transferFromImageBitmap(e.buffer);break;case Y:this.contextGlRender(this.$videoElement.width,this.$videoElement.height,e.output[0],e.output[1],e.output[2]);break;case P:this.context2D.drawImage(e.videoFrame,0,0,this.$videoElement.width,this.$videoElement.height)}}screenshot(e,t,i,o){e=e||ce(),o=o||L.download;const r={png:"image/png",jpeg:"image/jpeg",webp:"image/webp"};let A=.92;!r[t]&&L[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(A=Number(i));const n=this.$videoElement.toDataURL(r[t]||r.png,A),s=ae(n);return o===L.base64?n:o===L.blob?s:void(o===L.download&&de(s,e))}clearView(){switch(this.renderType){case H:(function(e,t){const i=document.createElement("canvas");return i.width=e,i.height=t,createImageBitmap(i,0,0,e,t)})(this.$videoElement.width,this.$videoElement.height).then((e=>{this.bitmaprenderer.transferFromImageBitmap(e)}));break;case Y:this.contextGl.clear(this.contextGl.COLOR_BUFFER_BIT);break;case P:this.context2D.clearRect(0,0,this.$videoElement.width,this.$videoElement.height)}}resize(){this.player.debug.log("canvasVideo","resize");const e=this.player._opt,t=this.player.width;let i=this.player.height;e.hasControl&&(i-=38);let o=this.$videoElement.width,r=this.$videoElement.height;const A=e.rotate;let n=(t-o)/2,s=(i-r)/2;270!==A&&90!==A||(o=this.$videoElement.height,r=this.$videoElement.width);const a=t/o,d=i/r;let c=a>d?d:a;e.isResize||a!==d&&(c=a+","+d),e.isFullResize&&(c=a>d?a:d);let l="scale("+c+")";A&&(l+=" rotate("+A+"deg)"),this.$videoElement.style.transform=l,this.$videoElement.style.left=n+"px",this.$videoElement.style.top=s+"px"}}class Ee extends we{constructor(e){super(),this.player=e;const t=document.createElement("video");t.muted=!0,t.style.position="absolute",t.style.top=0,t.style.left=0,e.$container.appendChild(t),this.$videoElement=t,this.videoInfo={width:"",height:"",encType:""},this.resize();const{proxy:i}=this.player.events;i(this.$videoElement,"canplay",(()=>{this.player.debug.log("Video","canplay")})),i(this.$videoElement,"waiting",(()=>{this.player.emit(C.videoWaiting)})),i(this.$videoElement,"timeupdate",(e=>{})),this.player.debug.log("Video","init")}destroy(){this.player.$container.removeChild(this.$videoElement),this.$videoElement=null,this.init=!1,this.off(),this.player.debug.log("Video","destroy")}play(){this.$videoElement.play()}clearView(){}screenshot(e,t,i,o){e=e||ce(),o=o||L.download;let r=.92;!{png:"image/png",jpeg:"image/jpeg",webp:"image/webp"}[t]&&L[t]&&(o=t,t="png",i=void 0),"string"==typeof i&&(o=i,i=void 0),void 0!==i&&(r=Number(i));const A=this.$videoElement;let n=document.createElement("canvas");n.width=A.videoWidth,n.height=A.videoHeight;n.getContext("2d").drawImage(A,0,0,n.width,n.height);const s=n.toDataURL(L[t]||L.png,r),a=ae(s);return o===L.base64?s:o===L.blob?a:void(o===L.download&&de(a,e))}initCanvasViewSize(){this.resize()}resize(){this.$videoElement.width=this.player.width,this.$videoElement.height=this.player._opt.hasControl?this.player.height-38:this.player.height;const e=this.player._opt;let t="contain";const i=e.rotate;e.isResize||(t="fill"),e.isFullResize&&(t="none"),this.$videoElement.style.objectFit=t,this.$videoElement.style.transform="rotate("+i+"deg)"}}class Be{constructor(e){return new(Be.getLoaderFactory(e._opt))(e)}static getLoaderFactory(e){return e.useMSE?Ee:Se}}class Ce extends ve{constructor(e){super(),this.bufferList=[],this.player=e,this.scriptNode=null,this.hasInitScriptNode=!1,this.audioContextChannel=null,this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.audioContext.createGain();const t=this.audioContext.createBufferSource();t.buffer=this.audioContext.createBuffer(1,1,22050),t.connect(this.audioContext.destination),t.noteOn?t.noteOn(0):t.start(0),this.audioBufferSourceNode=t,this.mediaStreamAudioDestinationNode=this.audioContext.createMediaStreamDestination(),this.audioEnabled(!0),this.gainNode.gain.value=0,this.playing=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.init=!1,this.hasAudio=!1,this.on(C.videoSyncAudio,(e=>{this.player.debug.log("AudioContext",`videoSyncAudio , audioTimestamp: ${e.audioTimestamp},videoTimestamp: ${e.videoTimestamp},diff:${e.diff}`),this.audioSyncVideoOption=e})),this.player.debug.log("AudioContext","init")}destroy(){this.closeAudio(),this.audioContext.close(),this.audioContext=null,this.gainNode=null,this.init=!1,this.hasAudio=!1,this.playing=!1,this.scriptNode&&(this.scriptNode.onaudioprocess=se,this.scriptNode=null),this.audioBufferSourceNode=null,this.mediaStreamAudioDestinationNode=null,this.hasInitScriptNode=!1,this.audioSyncVideoOption={diff:null},this.audioInfo={encType:"",channels:"",sampleRate:""},this.off(),this.player.debug.log("AudioContext","destroy")}updateAudioInfo(e){e.encTypeCode&&(this.audioInfo.encType=V[e.encTypeCode]),e.channels&&(this.audioInfo.channels=e.channels),e.sampleRate&&(this.audioInfo.sampleRate=e.sampleRate),this.audioInfo.sampleRate&&this.audioInfo.channels&&this.audioInfo.encType&&!this.init&&(this.player.emit(C.audioInfo,this.audioInfo),this.init=!0)}get isPlaying(){return this.playing}get isMute(){return 0===this.gainNode.gain.value||this.isStateSuspended()}get volume(){return this.gainNode.gain.value}get bufferSize(){return this.bufferList.length}initScriptNode(){if(this.playing=!0,this.hasInitScriptNode)return;const e=this.audioInfo.channels,t=this.audioContext.createScriptProcessor(1024,0,e);t.onaudioprocess=t=>{const i=t.outputBuffer;if(this.bufferList.length&&this.playing){if(!this.player._opt.useWCS&&!this.player._opt.useMSE){if(this.audioSyncVideoOption.diff>ee)return void this.player.debug.warn("AudioContext",`audioSyncVideoOption more than diff :${this.audioSyncVideoOption.diff}, waiting`);if(this.audioSyncVideoOption.diff<-1e3){this.player.debug.warn("AudioContext",`audioSyncVideoOption less than diff :${this.audioSyncVideoOption.diff}, dropping`);let e=this.bufferList.shift();for(;e.ts-this.player.videoTimestamp<-1e3&&this.bufferList.length>0;)e=this.bufferList.shift();if(0===this.bufferList.length)return}}if(0===this.bufferList.length)return;const t=this.bufferList.shift();t&&t.ts&&(this.player.audioTimestamp=t.ts);for(let o=0;o20&&(this.player.debug.warn("AudioContext",`bufferList is large: ${this.bufferList.length}`),this.bufferList.length>50&&this.bufferList.shift()))}pause(){this.audioSyncVideoOption={diff:null},this.playing=!1,this.clear()}resume(){this.playing=!0}}class Re{constructor(e){return new(Re.getLoaderFactory())(e)}static getLoaderFactory(){return Ce}}class ke extends ve{constructor(e){super(),this.player=e,this.playing=!1,this.abortController=new AbortController,this.streamRate=me((t=>{e.emit(C.kBps,(t/1024).toFixed(2))})),e.debug.log("FetchStream","init")}destroy(){this.abort(),this.off(),this.streamRate=null,this.player.debug.log("FetchStream","destroy")}fetchStream(e){const{demux:t}=this.player;this.player._times.streamStart=ce(),fetch(e,{signal:this.abortController.signal}).then((e=>{const i=e.body.getReader();this.emit(C.streamSuccess);const o=()=>{i.read().then((e=>{let{done:i,value:r}=e;i?t.close():(this.streamRate&&this.streamRate(r.byteLength),t.dispatch(r),o())})).catch((e=>{t.close(),this.emit(k.fetchError,e),this.player.emit(C.error,k.fetchError),this.abort()}))};o()})).catch((e=>{this.abort(),this.emit(k.fetchError,e),this.player.emit(C.error,k.fetchError)}))}abort(){this.abortController&&(this.abortController.abort(),this.abortController=null)}}class Te extends ve{constructor(e){super(),this.player=e,this.socket=null,this.socketStatus=T,this.wsUrl=null,this.streamRate=me((t=>{e.emit(C.kBps,(t/1024).toFixed(2))}))}destroy(){this.socket&&(this.socket.close(),this.socket=null),this.socketStatus=T,this.streamRate=null,this.wsUrl=null,this.off(),this.player.debug.log("websocketLoader","destroy")}_createWebSocket(){const e=this.player,{debug:t,events:{proxy:i},demux:o}=e;this.socket=new WebSocket(this.wsUrl),this.socket.binaryType="arraybuffer",i(this.socket,"open",(()=>{this.emit(C.streamSuccess),t.log("websocketLoader","socket open"),this.socketStatus=I})),i(this.socket,"message",(e=>{this.streamRate&&this.streamRate(e.data.byteLength),this._handleMessage(e.data)})),i(this.socket,"close",(()=>{t.log("websocketLoader","socket close"),this.emit(C.streamEnd),this.socketStatus=x})),i(this.socket,"error",(e=>{t.log("websocketLoader","socket error"),this.emit(k.websocketError,e),this.player.emit(C.error,k.websocketError),this.socketStatus=D,o.close(),t.log("websocketLoader","socket error:",e)}))}_handleMessage(e){const{demux:t}=this.player;t?t.dispatch(e):this.player.debug.warn("websocketLoader","websocket handle message demux is null")}fetchStream(e){this.player._times.streamStart=ce(),this.wsUrl=e,this._createWebSocket()}}class Ie{constructor(e){return new(Ie.getLoaderFactory(e._opt.protocol))(e)}static getLoaderFactory(e){return e===n?ke:e===A?Te:void 0}}var xe=t((function(t){function i(e,t){if(!e)throw"First parameter is required.";t=new o(e,t=t||{type:"video"});var A=this;function n(i){i&&(t.initCallback=function(){i(),i=t.initCallback=null});var o=new r(e,t);(h=new o(e,t)).record(),u("recording"),t.disableLogs||console.log("Initialized recorderType:",h.constructor.name,"for output-type:",t.type)}function s(e){if(e=e||function(){},h){if("paused"===A.state)return A.resumeRecording(),void setTimeout((function(){s(e)}),1);"recording"===A.state||t.disableLogs||console.warn('Recording state should be: "recording", however current state is: ',A.state),t.disableLogs||console.log("Stopped recording "+t.type+" stream."),"gif"!==t.type?h.stop(i):(h.stop(),i()),u("stopped")}else m();function i(i){if(h){Object.keys(h).forEach((function(e){"function"!=typeof h[e]&&(A[e]=h[e])}));var o=h.blob;if(!o){if(!i)throw"Recording failed.";h.blob=o=i}if(o&&!t.disableLogs&&console.log(o.type,"->",b(o.size)),e){var r;try{r=l.createObjectURL(o)}catch(e){}"function"==typeof e.call?e.call(A,r):e(r)}t.autoWriteToDisk&&d((function(e){var i={};i[t.type+"Blob"]=e,x.Store(i)}))}else"function"==typeof e.call?e.call(A,""):e("")}}function a(e){postMessage((new FileReaderSync).readAsDataURL(e))}function d(e,i){if(!e)throw"Pass a callback function over getDataURL.";var o=i?i.blob:(h||{}).blob;if(!o)return t.disableLogs||console.warn("Blob encoder did not finish its job yet."),void setTimeout((function(){d(e,i)}),1e3);if("undefined"==typeof Worker||navigator.mozGetUserMedia){var r=new FileReader;r.readAsDataURL(o),r.onload=function(t){e(t.target.result)}}else{var A=function(e){try{var t=l.createObjectURL(new Blob([e.toString(),"this.onmessage = function (eee) {"+e.name+"(eee.data);}"],{type:"application/javascript"})),i=new Worker(t);return l.revokeObjectURL(t),i}catch(e){}}(a);A.onmessage=function(t){e(t.data)},A.postMessage(o)}}function c(e){e=e||0,"paused"!==A.state?"stopped"!==A.state&&(e>=A.recordingDuration?s(A.onRecordingStopped):(e+=1e3,setTimeout((function(){c(e)}),1e3))):setTimeout((function(){c(e)}),1e3)}function u(e){A&&(A.state=e,"function"==typeof A.onStateChanged.call?A.onStateChanged.call(A,e):A.onStateChanged(e))}var h,p='It seems that recorder is destroyed or "startRecording" is not invoked for '+t.type+" recorder.";function m(){!0!==t.disableLogs&&console.warn(p)}var g={startRecording:function(i){return t.disableLogs||console.log("RecordRTC version: ",A.version),i&&(t=new o(e,i)),t.disableLogs||console.log("started recording "+t.type+" stream."),h?(h.clearRecordedData(),h.record(),u("recording"),A.recordingDuration&&c(),A):(n((function(){A.recordingDuration&&c()})),A)},stopRecording:s,pauseRecording:function(){h?"recording"===A.state?(u("paused"),h.pause(),t.disableLogs||console.log("Paused recording.")):t.disableLogs||console.warn("Unable to pause the recording. Recording state: ",A.state):m()},resumeRecording:function(){h?"paused"===A.state?(u("recording"),h.resume(),t.disableLogs||console.log("Resumed recording.")):t.disableLogs||console.warn("Unable to resume the recording. Recording state: ",A.state):m()},initRecorder:n,setRecordingDuration:function(e,t){if(void 0===e)throw"recordingDuration is required.";if("number"!=typeof e)throw"recordingDuration must be a number.";return A.recordingDuration=e,A.onRecordingStopped=t||function(){},{onRecordingStopped:function(e){A.onRecordingStopped=e}}},clearRecordedData:function(){h?(h.clearRecordedData(),t.disableLogs||console.log("Cleared old recorded data.")):m()},getBlob:function(){if(h)return h.blob;m()},getDataURL:d,toURL:function(){if(h)return l.createObjectURL(h.blob);m()},getInternalRecorder:function(){return h},save:function(e){h?y(h.blob,e):m()},getFromDisk:function(e){h?i.getFromDisk(t.type,e):m()},setAdvertisementArray:function(e){t.advertisement=[];for(var i=e.length,o=0;o-1&&"netscape"in window&&/ rv:/.test(navigator.userAgent),m=!h&&!u&&!!navigator.webkitGetUserMedia||v()||-1!==navigator.userAgent.toLowerCase().indexOf("chrome/"),g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);g&&!m&&-1!==navigator.userAgent.indexOf("CriOS")&&(g=!1,m=!0);var f=window.MediaStream;function b(e){if(0===e)return"0 Bytes";var t=parseInt(Math.floor(Math.log(e)/Math.log(1e3)),10);return(e/Math.pow(1e3,t)).toPrecision(3)+" "+["Bytes","KB","MB","GB","TB"][t]}function y(e,t){if(!e)throw"Blob object is required.";if(!e.type)try{e.type="video/webm"}catch(e){}var i=(e.type||"video/webm").split("/")[1];if(-1!==i.indexOf(";")&&(i=i.split(";")[0]),t&&-1!==t.indexOf(".")){var o=t.split(".");t=o[0],i=o[1]}var r=(t||Math.round(9999999999*Math.random())+888888888)+"."+i;if(void 0!==navigator.msSaveOrOpenBlob)return navigator.msSaveOrOpenBlob(e,r);if(void 0!==navigator.msSaveBlob)return navigator.msSaveBlob(e,r);var A=document.createElement("a");A.href=l.createObjectURL(e),A.download=r,A.style="display:none;opacity:0;color:transparent;",(document.body||document.documentElement).appendChild(A),"function"==typeof A.click?A.click():(A.target="_blank",A.dispatchEvent(new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}))),l.revokeObjectURL(A.href)}function v(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}function w(e,t){return e&&e.getTracks?e.getTracks().filter((function(e){return e.kind===(t||"audio")})):[]}function S(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}void 0===f&&"undefined"!=typeof webkitMediaStream&&(f=webkitMediaStream),void 0!==f&&void 0===f.prototype.stop&&(f.prototype.stop=function(){this.getTracks().forEach((function(e){e.stop()}))}),i.invokeSaveAsDialog=y,i.getTracks=w,i.getSeekableBlob=function(e,t){if("undefined"==typeof EBML)throw new Error("Please link: https://www.webrtc-experiment.com/EBML.js");var i=new EBML.Reader,o=new EBML.Decoder,r=EBML.tools,A=new FileReader;A.onload=function(e){o.decode(this.result).forEach((function(e){i.read(e)})),i.stop();var A=r.makeMetadataSeekable(i.metadatas,i.duration,i.cues),n=this.result.slice(i.metadataSize),s=new Blob([A,n],{type:"video/webm"});t(s)},A.readAsArrayBuffer(e)},i.bytesToSize=b,i.isElectron=v;var E={};function B(){if(p||g||u)return!0;var e,t,i=navigator.userAgent,o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10);return(m||h)&&(e=i.indexOf("Chrome"),o=i.substring(e+7)),-1!==(t=o.indexOf(";"))&&(o=o.substring(0,t)),-1!==(t=o.indexOf(" "))&&(o=o.substring(0,t)),r=parseInt(""+o,10),isNaN(r)&&(o=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10)),r>=49}function C(e,t){var i=this;if(void 0===e)throw'First argument "MediaStream" is required.';if("undefined"==typeof MediaRecorder)throw"Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.";if("audio"===(t=t||{mimeType:"video/webm"}).type){var o;if(w(e,"video").length&&w(e,"audio").length)navigator.mozGetUserMedia?(o=new f).addTrack(w(e,"audio")[0]):o=new f(w(e,"audio")),e=o;t.mimeType&&-1!==t.mimeType.toString().toLowerCase().indexOf("audio")||(t.mimeType=m?"audio/webm":"audio/ogg"),t.mimeType&&"audio/ogg"!==t.mimeType.toString().toLowerCase()&&navigator.mozGetUserMedia&&(t.mimeType="audio/ogg")}var r,A=[];function n(){i.timestamps.push((new Date).getTime()),"function"==typeof t.onTimeStamp&&t.onTimeStamp(i.timestamps[i.timestamps.length-1],i.timestamps)}function s(e){return r&&r.mimeType?r.mimeType:e.mimeType||"video/webm"}function a(){A=[],r=null,i.timestamps=[]}this.getArrayOfBlobs=function(){return A},this.record=function(){i.blob=null,i.clearRecordedData(),i.timestamps=[],d=[],A=[];var o=t;t.disableLogs||console.log("Passing following config over MediaRecorder API.",o),r&&(r=null),m&&!B()&&(o="video/vp8"),"function"==typeof MediaRecorder.isTypeSupported&&o.mimeType&&(MediaRecorder.isTypeSupported(o.mimeType)||(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType),o.mimeType="audio"===t.type?"audio/webm":"video/webm"));try{r=new MediaRecorder(e,o),t.mimeType=o.mimeType}catch(t){r=new MediaRecorder(e)}o.mimeType&&!MediaRecorder.isTypeSupported&&"canRecordMimeType"in r&&!1===r.canRecordMimeType(o.mimeType)&&(t.disableLogs||console.warn("MediaRecorder API seems unable to record mimeType:",o.mimeType)),r.ondataavailable=function(e){if(e.data&&d.push("ondataavailable: "+b(e.data.size)),"number"!=typeof t.timeSlice)!e.data||!e.data.size||e.data.size<100||i.blob?i.recordingCallback&&(i.recordingCallback(new Blob([],{type:s(o)})),i.recordingCallback=null):(i.blob=t.getNativeBlob?e.data:new Blob([e.data],{type:s(o)}),i.recordingCallback&&(i.recordingCallback(i.blob),i.recordingCallback=null));else if(e.data&&e.data.size&&(A.push(e.data),n(),"function"==typeof t.ondataavailable)){var r=t.getNativeBlob?e.data:new Blob([e.data],{type:s(o)});t.ondataavailable(r)}},r.onstart=function(){d.push("started")},r.onpause=function(){d.push("paused")},r.onresume=function(){d.push("resumed")},r.onstop=function(){d.push("stopped")},r.onerror=function(e){e&&(e.name||(e.name="UnknownError"),d.push("error: "+e),t.disableLogs||(-1!==e.name.toString().toLowerCase().indexOf("invalidstate")?console.error("The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.",e):-1!==e.name.toString().toLowerCase().indexOf("notsupported")?console.error("MIME type (",o.mimeType,") is not supported.",e):-1!==e.name.toString().toLowerCase().indexOf("security")?console.error("MediaRecorder security error",e):"OutOfMemory"===e.name?console.error("The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"IllegalStreamModification"===e.name?console.error("A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"OtherRecordingError"===e.name?console.error("Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.",e):"GenericError"===e.name?console.error("The UA cannot provide the codec or recording option that has been requested.",e):console.error("MediaRecorder Error",e)),function(e){if(!i.manuallyStopped&&r&&"inactive"===r.state)return delete t.timeslice,void r.start(6e5);setTimeout(void 0,1e3)}(),"inactive"!==r.state&&"stopped"!==r.state&&r.stop())},"number"==typeof t.timeSlice?(n(),r.start(t.timeSlice)):r.start(36e5),t.initCallback&&t.initCallback()},this.timestamps=[],this.stop=function(e){e=e||function(){},i.manuallyStopped=!0,r&&(this.recordingCallback=e,"recording"===r.state&&r.stop(),"number"==typeof t.timeSlice&&setTimeout((function(){i.blob=new Blob(A,{type:s(t)}),i.recordingCallback(i.blob)}),100))},this.pause=function(){r&&"recording"===r.state&&r.pause()},this.resume=function(){r&&"paused"===r.state&&r.resume()},this.clearRecordedData=function(){r&&"recording"===r.state&&i.stop(a),a()},this.getInternalRecorder=function(){return r},this.blob=null,this.getState=function(){return r&&r.state||"inactive"};var d=[];this.getAllStates=function(){return d},void 0===t.checkForInactiveTracks&&(t.checkForInactiveTracks=!1);i=this;!function o(){if(r&&!1!==t.checkForInactiveTracks)return!1===function(){if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}()?(t.disableLogs||console.log("MediaStream seems stopped."),void i.stop()):void setTimeout(o,1e3)}(),this.name="MediaStreamRecorder",this.toString=function(){return this.name}}function R(e,t){if(!w(e,"audio").length)throw"Your stream has no audio tracks.";var o,r=this,A=[],n=[],s=!1,a=0,d=2,c=(t=t||{}).desiredSampRate;function u(){if(!1===t.checkForInactiveTracks)return!0;if("active"in e){if(!e.active)return!1}else if("ended"in e&&e.ended)return!1;return!0}function h(e,t){function i(e,t){var i,o=e.numberOfAudioChannels,r=e.leftBuffers.slice(0),A=e.rightBuffers.slice(0),n=e.sampleRate,s=e.internalInterleavedLength,a=e.desiredSampRate;function d(e,t,i){var o=Math.round(e.length*(t/i)),r=[],A=Number((e.length-1)/(o-1));r[0]=e[0];for(var n=1;n96e3)&&(t.disableLogs||console.log("sample-rate must be under range 22050 and 96000.")),t.disableLogs||t.desiredSampRate&&console.log("Desired sample-rate: "+t.desiredSampRate);var y=!1;function v(){A=[],n=[],a=0,E=!1,s=!1,y=!1,p=null,r.leftchannel=A,r.rightchannel=n,r.numberOfAudioChannels=d,r.desiredSampRate=c,r.sampleRate=b,r.recordingLength=a,B={left:[],right:[],recordingLength:0}}function S(){o&&(o.onaudioprocess=null,o.disconnect(),o=null),m&&(m.disconnect(),m=null),v()}this.pause=function(){y=!0},this.resume=function(){if(!1===u())throw"Please make sure MediaStream is active.";if(!s)return t.disableLogs||console.log("Seems recording has been restarted."),void this.record();y=!1},this.clearRecordedData=function(){t.checkForInactiveTracks=!1,s&&this.stop(S),S()},this.name="StereoAudioRecorder",this.toString=function(){return this.name};var E=!1;o.onaudioprocess=function(e){if(!y)if(!1===u()&&(t.disableLogs||console.log("MediaStream seems stopped."),o.disconnect(),s=!1),s){E||(E=!0,t.onAudioProcessStarted&&t.onAudioProcessStarted(),t.initCallback&&t.initCallback());var i=e.inputBuffer.getChannelData(0),c=new Float32Array(i);if(A.push(c),2===d){var l=e.inputBuffer.getChannelData(1),h=new Float32Array(l);n.push(h)}a+=f,r.recordingLength=a,void 0!==t.timeSlice&&(B.recordingLength+=f,B.left.push(c),2===d&&B.right.push(h))}else m&&(m.disconnect(),m=null)},p.createMediaStreamDestination?o.connect(p.createMediaStreamDestination()):o.connect(p.destination),this.leftchannel=A,this.rightchannel=n,this.numberOfAudioChannels=d,this.desiredSampRate=c,this.sampleRate=b,r.recordingLength=a;var B={left:[],right:[],recordingLength:0};function C(){s&&"function"==typeof t.ondataavailable&&void 0!==t.timeSlice&&(B.left.length?(h({desiredSampRate:c,sampleRate:b,numberOfAudioChannels:d,internalInterleavedLength:B.recordingLength,leftBuffers:B.left,rightBuffers:1===d?[]:B.right},(function(e,i){var o=new Blob([i],{type:"audio/wav"});t.ondataavailable(o),setTimeout(C,t.timeSlice)})),B={left:[],right:[],recordingLength:0}):setTimeout(C,t.timeSlice))}}function k(e,t){if("undefined"==typeof html2canvas)throw"Please link: https://www.webrtc-experiment.com/screenshot.js";(t=t||{}).frameInterval||(t.frameInterval=10);var i=!1;["captureStream","mozCaptureStream","webkitCaptureStream"].forEach((function(e){e in document.createElement("canvas")&&(i=!0)}));var o,r,A,n=!(!window.webkitRTCPeerConnection&&!window.webkitGetUserMedia||!window.chrome),s=50,a=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);if(n&&a&&a[2]&&(s=parseInt(a[2],10)),n&&s<52&&(i=!1),t.useWhammyRecorder&&(i=!1),i)if(t.disableLogs||console.log("Your browser supports both MediRecorder API and canvas.captureStream!"),e instanceof HTMLCanvasElement)o=e;else{if(!(e instanceof CanvasRenderingContext2D))throw"Please pass either HTMLCanvasElement or CanvasRenderingContext2D.";o=e.canvas}else navigator.mozGetUserMedia&&(t.disableLogs||console.error("Canvas recording is NOT supported in Firefox."));this.record=function(){if(A=!0,i&&!t.useWhammyRecorder){var e;"captureStream"in o?e=o.captureStream(25):"mozCaptureStream"in o?e=o.mozCaptureStream(25):"webkitCaptureStream"in o&&(e=o.webkitCaptureStream(25));try{var n=new f;n.addTrack(w(e,"video")[0]),e=n}catch(e){}if(!e)throw"captureStream API are NOT available.";(r=new C(e,{mimeType:t.mimeType||"video/webm"})).record()}else h.frames=[],u=(new Date).getTime(),l();t.initCallback&&t.initCallback()},this.getWebPImages=function(i){if("canvas"===e.nodeName.toLowerCase()){var o=h.frames.length;h.frames.forEach((function(e,i){var r=o-i;t.disableLogs||console.log(r+"/"+o+" frames remaining"),t.onEncodingCallback&&t.onEncodingCallback(r,o);var A=e.image.toDataURL("image/webp",1);h.frames[i].image=A})),t.disableLogs||console.log("Generating WebM"),i()}else i()},this.stop=function(e){A=!1;var o=this;i&&r?r.stop(e):this.getWebPImages((function(){h.compile((function(i){t.disableLogs||console.log("Recording finished!"),o.blob=i,o.blob.forEach&&(o.blob=new Blob([],{type:"video/webm"})),e&&e(o.blob),h.frames=[]}))}))};var d=!1;function c(){h.frames=[],A=!1,d=!1}function l(){if(d)return u=(new Date).getTime(),setTimeout(l,500);if("canvas"===e.nodeName.toLowerCase()){var i=(new Date).getTime()-u;return u=(new Date).getTime(),h.frames.push({image:(o=document.createElement("canvas"),r=o.getContext("2d"),o.width=e.width,o.height=e.height,r.drawImage(e,0,0),o),duration:i}),void(A&&setTimeout(l,t.frameInterval))}var o,r;html2canvas(e,{grabMouse:void 0===t.showMousePointer||t.showMousePointer,onrendered:function(e){var i=(new Date).getTime()-u;if(!i)return setTimeout(l,t.frameInterval);u=(new Date).getTime(),h.frames.push({image:e.toDataURL("image/webp",1),duration:i}),A&&setTimeout(l,t.frameInterval)}})}this.pause=function(){d=!0,r instanceof C&&r.pause()},this.resume=function(){d=!1,r instanceof C?r.resume():A||this.record()},this.clearRecordedData=function(){A&&this.stop(c),c()},this.name="CanvasRecorder",this.toString=function(){return this.name};var u=(new Date).getTime(),h=new I.Video(100)}function T(e,t){function i(e){e=void 0!==e?e:10;var t=(new Date).getTime()-a;return t?A?(a=(new Date).getTime(),setTimeout(i,100)):(a=(new Date).getTime(),s.paused&&s.play(),l.drawImage(s,0,0,c.width,c.height),d.frames.push({duration:t,image:c.toDataURL("image/webp")}),void(r||setTimeout(i,e,e))):setTimeout(i,e,e)}function o(e,t,i,o,r){var A=document.createElement("canvas");A.width=c.width,A.height=c.height;var n,s,a,d=A.getContext("2d"),l=[],u=-1===t,h=t&&t>0&&t<=e.length?t:e.length,p=0,m=0,g=0,f=Math.sqrt(Math.pow(255,2)+Math.pow(255,2)+Math.pow(255,2)),b=i&&i>=0&&i<=1?i:0,y=o&&o>=0&&o<=1?o:0,v=!1;s=-1,a=(n={length:h,functionToLoop:function(t,i){var o,r,A,n=function(){!v&&A-o<=A*y||(u&&(v=!0),l.push(e[i])),t()};if(v)n();else{var s=new Image;s.onload=function(){d.drawImage(s,0,0,c.width,c.height);var e=d.getImageData(0,0,c.width,c.height);o=0,r=e.data.length,A=e.data.length/4;for(var t=0;t127)throw"TrackNumber > 127 not supported";return[128|e.trackNum,e.timecode>>8,255&e.timecode,t].map((function(e){return String.fromCharCode(e)})).join("")+e.frame}({discardable:0,frame:e.data.slice(4),invisible:0,keyframe:1,lacing:0,trackNum:1,timecode:Math.round(t)});return t+=e.duration,{data:i,id:163}})))}function i(e){for(var t=[];e>0;)t.push(255&e),e>>=8;return new Uint8Array(t.reverse())}function o(e){var t=[];e=(e.length%8?new Array(9-e.length%8).join("0"):"")+e;for(var i=0;i1?2*A[0].width:A[0].width;var s=1;3!==e&&4!==e||(s=2),5!==e&&6!==e||(s=3),7!==e&&8!==e||(s=4),9!==e&&10!==e||(s=5),r.height=A[0].height*s}else r.width=n.width||360,r.height=n.height||240;t&&t instanceof HTMLVideoElement&&u(t),A.forEach((function(e,t){u(e,t)})),setTimeout(l,n.frameInterval)}}function u(e,t){if(!o){var i=0,r=0,n=e.width,s=e.height;1===t&&(i=e.width),2===t&&(r=e.height),3===t&&(i=e.width,r=e.height),4===t&&(r=2*e.height),5===t&&(i=e.width,r=2*e.height),6===t&&(r=3*e.height),7===t&&(i=e.width,r=3*e.height),void 0!==e.stream.left&&(i=e.stream.left),void 0!==e.stream.top&&(r=e.stream.top),void 0!==e.stream.width&&(n=e.stream.width),void 0!==e.stream.height&&(s=e.stream.height),A.drawImage(e,i,r,n,s),"function"==typeof e.stream.onRender&&e.stream.onRender(A,i,r,n,s,t)}}function h(e){var i=document.createElement("video");return function(e,t){"srcObject"in t?t.srcObject=e:"mozSrcObject"in t?t.mozSrcObject=e:t.srcObject=e}(e,i),i.className=t,i.muted=!0,i.volume=0,i.width=e.width||n.width||360,i.height=e.height||n.height||240,i.play(),i}function p(t){i=[],(t=t||e).forEach((function(e){if(e.getTracks().filter((function(e){return"video"===e.kind})).length){var t=h(e);t.stream=e,i.push(t)}}))}void 0!==s?c.AudioContext=s:"undefined"!=typeof webkitAudioContext&&(c.AudioContext=webkitAudioContext),this.startDrawingFrames=function(){l()},this.appendStreams=function(t){if(!t)throw"First parameter is required.";t instanceof Array||(t=[t]),t.forEach((function(t){var o=new d;if(t.getTracks().filter((function(e){return"video"===e.kind})).length){var r=h(t);r.stream=t,i.push(r),o.addTrack(t.getTracks().filter((function(e){return"video"===e.kind}))[0])}if(t.getTracks().filter((function(e){return"audio"===e.kind})).length){var A=n.audioContext.createMediaStreamSource(t);n.audioDestination=n.audioContext.createMediaStreamDestination(),A.connect(n.audioDestination),o.addTrack(n.audioDestination.stream.getTracks().filter((function(e){return"audio"===e.kind}))[0])}e.push(o)}))},this.releaseStreams=function(){i=[],o=!0,n.gainNode&&(n.gainNode.disconnect(),n.gainNode=null),n.audioSources.length&&(n.audioSources.forEach((function(e){e.disconnect()})),n.audioSources=[]),n.audioDestination&&(n.audioDestination.disconnect(),n.audioDestination=null),n.audioContext&&n.audioContext.close(),n.audioContext=null,A.clearRect(0,0,r.width,r.height),r.stream&&(r.stream.stop(),r.stream=null)},this.resetVideoStreams=function(e){!e||e instanceof Array||(e=[e]),p(e)},this.name="MultiStreamsMixer",this.toString=function(){return this.name},this.getMixedStream=function(){o=!1;var t=function(){var e;p(),"captureStream"in r?e=r.captureStream():"mozCaptureStream"in r?e=r.mozCaptureStream():n.disableLogs||console.error("Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features");var t=new d;return e.getTracks().filter((function(e){return"video"===e.kind})).forEach((function(e){t.addTrack(e)})),r.stream=t,t}(),i=function(){c.AudioContextConstructor||(c.AudioContextConstructor=new c.AudioContext);n.audioContext=c.AudioContextConstructor,n.audioSources=[],!0===n.useGainNode&&(n.gainNode=n.audioContext.createGain(),n.gainNode.connect(n.audioContext.destination),n.gainNode.gain.value=0);var t=0;if(e.forEach((function(e){if(e.getTracks().filter((function(e){return"audio"===e.kind})).length){t++;var i=n.audioContext.createMediaStreamSource(e);!0===n.useGainNode&&i.connect(n.gainNode),n.audioSources.push(i)}})),!t)return;return n.audioDestination=n.audioContext.createMediaStreamDestination(),n.audioSources.forEach((function(e){e.connect(n.audioDestination)})),n.audioDestination.stream}();return i&&i.getTracks().filter((function(e){return"audio"===e.kind})).forEach((function(e){t.addTrack(e)})),e.forEach((function(e){e.fullcanvas})),t}}function j(e,t){e=e||[];var i,o,r=this;(t=t||{elementClass:"multi-streams-mixer",mimeType:"video/webm",video:{width:360,height:240}}).frameInterval||(t.frameInterval=10),t.video||(t.video={}),t.video.width||(t.video.width=360),t.video.height||(t.video.height=240),this.record=function(){var r;i=new L(e,t.elementClass||"multi-streams-mixer"),(r=[],e.forEach((function(e){w(e,"video").forEach((function(e){r.push(e)}))})),r).length&&(i.frameInterval=t.frameInterval||10,i.width=t.video.width||360,i.height=t.video.height||240,i.startDrawingFrames()),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()),(o=new C(i.getMixedStream(),t)).record()},this.stop=function(e){o&&o.stop((function(t){r.blob=t,e(t),r.clearRecordedData()}))},this.pause=function(){o&&o.pause()},this.resume=function(){o&&o.resume()},this.clearRecordedData=function(){o&&(o.clearRecordedData(),o=null),i&&(i.releaseStreams(),i=null)},this.addStreams=function(r){if(!r)throw"First parameter is required.";r instanceof Array||(r=[r]),e.concat(r),o&&i&&(i.appendStreams(r),t.previewStream&&"function"==typeof t.previewStream&&t.previewStream(i.getMixedStream()))},this.resetVideoStreams=function(e){i&&(!e||e instanceof Array||(e=[e]),i.resetVideoStreams(e))},this.getMixer=function(){return i},this.name="MultiStreamRecorder",this.toString=function(){return this.name}}function U(e,t){var i,o,r;function A(){return new ReadableStream({start:function(o){var r=document.createElement("canvas"),A=document.createElement("video"),n=!0;A.srcObject=e,A.muted=!0,A.height=t.height,A.width=t.width,A.volume=0,A.onplaying=function(){r.width=t.width,r.height=t.height;var e=r.getContext("2d"),s=1e3/t.frameRate,a=setInterval((function(){if(i&&(clearInterval(a),o.close()),n&&(n=!1,t.onVideoProcessStarted&&t.onVideoProcessStarted()),e.drawImage(A,0,0),"closed"!==o._controlledReadableStream.state)try{o.enqueue(e.getImageData(0,0,t.width,t.height))}catch(e){}}),s)},A.play()}})}function n(e,a){if(!t.workerPath&&!a)return i=!1,void fetch("https://unpkg.com/webm-wasm@latest/dist/webm-worker.js").then((function(t){t.arrayBuffer().then((function(t){n(e,t)}))}));if(!t.workerPath&&a instanceof ArrayBuffer){var d=new Blob([a],{type:"text/javascript"});t.workerPath=l.createObjectURL(d)}t.workerPath||console.error("workerPath parameter is missing."),(o=new Worker(t.workerPath)).postMessage(t.webAssemblyPath||"https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm"),o.addEventListener("message",(function(e){"READY"===e.data?(o.postMessage({width:t.width,height:t.height,bitrate:t.bitrate||1200,timebaseDen:t.frameRate||30,realtime:t.realtime}),A().pipeTo(new WritableStream({write:function(e){i?console.error("Got image, but recorder is finished!"):o.postMessage(e.data.buffer,[e.data.buffer])}}))):e.data&&(r||s.push(e.data))}))}"undefined"!=typeof ReadableStream&&"undefined"!=typeof WritableStream||console.error("Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js"),(t=t||{}).width=t.width||640,t.height=t.height||480,t.frameRate=t.frameRate||30,t.bitrate=t.bitrate||1200,t.realtime=t.realtime||!0,this.record=function(){s=[],r=!1,this.blob=null,n(e),"function"==typeof t.initCallback&&t.initCallback()},this.pause=function(){r=!0},this.resume=function(){r=!1};var s=[];this.stop=function(e){i=!0;var t=this;!function(e){o?(o.addEventListener("message",(function(t){null===t.data&&(o.terminate(),o=null,e&&e())})),o.postMessage(null)):e&&e()}((function(){t.blob=new Blob(s,{type:"video/webm"}),e(t.blob)}))},this.name="WebAssemblyRecorder",this.toString=function(){return this.name},this.clearRecordedData=function(){s=[],r=!1,this.blob=null},this.blob=null}i.DiskStorage=x,i.GifRecorder=D,i.MultiStreamRecorder=j,i.RecordRTCPromisesHandler=function(e,t){if(!this)throw'Use "new RecordRTCPromisesHandler()"';if(void 0===e)throw'First argument "MediaStream" is required.';var o=this;o.recordRTC=new i(e,t),this.startRecording=function(){return new Promise((function(e,t){try{o.recordRTC.startRecording(),e()}catch(e){t(e)}}))},this.stopRecording=function(){return new Promise((function(e,t){try{o.recordRTC.stopRecording((function(i){o.blob=o.recordRTC.getBlob(),o.blob&&o.blob.size?e(i):t("Empty blob.",o.blob)}))}catch(e){t(e)}}))},this.pauseRecording=function(){return new Promise((function(e,t){try{o.recordRTC.pauseRecording(),e()}catch(e){t(e)}}))},this.resumeRecording=function(){return new Promise((function(e,t){try{o.recordRTC.resumeRecording(),e()}catch(e){t(e)}}))},this.getDataURL=function(e){return new Promise((function(e,t){try{o.recordRTC.getDataURL((function(t){e(t)}))}catch(e){t(e)}}))},this.getBlob=function(){return new Promise((function(e,t){try{e(o.recordRTC.getBlob())}catch(e){t(e)}}))},this.getInternalRecorder=function(){return new Promise((function(e,t){try{e(o.recordRTC.getInternalRecorder())}catch(e){t(e)}}))},this.reset=function(){return new Promise((function(e,t){try{e(o.recordRTC.reset())}catch(e){t(e)}}))},this.destroy=function(){return new Promise((function(e,t){try{e(o.recordRTC.destroy())}catch(e){t(e)}}))},this.getState=function(){return new Promise((function(e,t){try{e(o.recordRTC.getState())}catch(e){t(e)}}))},this.blob=null,this.version="5.6.2"},i.WebAssemblyRecorder=U}));class De extends ve{constructor(e){super(),this.player=e,this.fileName="",this.fileType=z,this.isRecording=!1,this.recordingTimestamp=0,this.recordingInterval=null,e.debug.log("Recorder","init")}destroy(){this._reset(),this.player.debug.log("Recorder","destroy")}setFileName(e,t){this.fileName=e,N!==t&&z!==t||(this.fileType=t)}get recording(){return this.isRecording}get recordTime(){return this.recordingTimestamp}startRecord(){const e=this.player.debug,t={type:"video",mimeType:"video/webm;codecs=h264",onTimeStamp:t=>{e.log("Recorder","record timestamp :"+t)},disableLogs:!this.player._opt.debug};try{const e=this.player.video.$videoElement.captureStream(25);if(this.player.audio.mediaStreamAudioDestinationNode&&this.player.audio.mediaStreamAudioDestinationNode.stream&&!this.player.audio.isStateSuspended()&&this.player.audio.hasAudio){const t=this.player.audio.mediaStreamAudioDestinationNode.stream;if(t.getAudioTracks().length>0){const i=t.getAudioTracks()[0];i&&i.enabled&&e.addTrack(i)}}this.recorder=xe(e,t)}catch(t){e.error("Recorder",t),this.emit(C.recordCreateError)}this.recorder&&(this.isRecording=!0,this.emit(C.recording,!0),this.recorder.startRecording(),e.log("Recorder","start recording"),this.player.emit(C.recordStart),this.recordingInterval=window.setInterval((()=>{this.recordingTimestamp+=1,this.player.emit(C.recordingTimestamp,this.recordingTimestamp)}),1e3))}stopRecordAndSave(){this.recorder&&this.isRecording&&this.recorder.stopRecording((()=>{this.player.debug.log("Recorder","stop recording"),this.player.emit(C.recordEnd),function(e,t,i){const o=window.URL.createObjectURL(e),r=document.createElement("a");r.href=o,r.download=(t||ce())+"."+(i||FILE_SUFFIX.webm),r.click(),setTimeout((()=>{window.URL.revokeObjectURL(o)}),ge()?1e3:0)}(this.recorder.getBlob(),this.fileName,this.fileType),this._reset(),this.emit(C.recording,!1)}))}_reset(){this.isRecording=!1,this.recordingTimestamp=0,this.recorder&&(this.recorder.destroy(),this.recorder=null),this.fileName=null,this.recordingInterval&&clearInterval(this.recordingInterval),this.recordingInterval=null}}class Le{constructor(e){return new(Le.getLoaderFactory())(e)}static getLoaderFactory(){return De}}class je{constructor(e){this.player=e,this.decoderWorker=new Worker(e._opt.decoder),this._initDecoderWorker(),e.debug.log("decoderWorker","init")}destroy(){this.decoderWorker.postMessage({cmd:B}),this.decoderWorker.terminate(),this.decoderWorker=null,this.player.debug.log("decoderWorker","destroy")}_initDecoderWorker(){const{debug:e,events:{proxy:t}}=this.player;this.decoderWorker.onmessage=t=>{const i=t.data;switch(i.cmd){case c:e.log("decoderWorker","onmessage:",c),this.player.loaded||this.player.emit(C.load),this.player.emit(C.decoderWorkerInit),this._initWork();break;case g:e.log("decoderWorker","onmessage:",g,i.code),this.player._times.decodeStart||(this.player._times.decodeStart=ce()),this.player.video.updateVideoInfo({encTypeCode:i.code});break;case m:e.log("decoderWorker","onmessage:",m,i.code),this.player.audio.updateAudioInfo({encTypeCode:i.code});break;case l:e.log("decoderWorker","onmessage:",l,`width:${i.w},height:${i.h}`),this.player.video.updateVideoInfo({width:i.w,height:i.h}),this.player.video.initCanvasViewSize();break;case p:e.log("decoderWorker","onmessage:",p,`channels:${i.channels},sampleRate:${i.sampleRate}`),this.player.audio.updateAudioInfo(i),this.player.audio.initScriptNode(i);break;case u:this.player.handleRender(),this.player.video.render(i),this.player.emit(C.timeUpdate,i.ts),this.player.updateStats({fps:!0,ts:i.ts,buf:i.delay}),this.player._times.videoStart||(this.player._times.videoStart=ce(),this.player.handlePlayToRenderTimes());break;case h:e.log("decoderWorker","onmessage:",h,`msg ts:${i.ts}`),this.player.playing&&this.player.audio.play(i.buffer,i.ts);break;default:this.player[i.cmd]&&this.player[i.cmd](i)}}}_initWork(){const e={debug:this.player._opt.debug,forceNoOffscreen:this.player._opt.forceNoOffscreen,useWCS:this.player._opt.useWCS,videoBuffer:this.player._opt.videoBuffer};this.decoderWorker.postMessage({cmd:w,opt:JSON.stringify(e),sampleRate:this.player.audio.audioContext.sampleRate})}decodeVideo(e,t,i){const o={type:b,ts:Math.max(t,0),isIFrame:i};this.decoderWorker.postMessage({cmd:S,buffer:e,options:o},[e.buffer])}decodeAudio(e,t){this.player._opt.useWCS&&!this.player._opt.useOffscreen||this.player._opt.useMSE?this._decodeAudioNoDelay(e,t):this._decodeAudio(e,t)}_decodeAudio(e,t){const i={type:f,ts:Math.max(t,0)};this.decoderWorker.postMessage({cmd:S,buffer:e,options:i},[e.buffer])}_decodeAudioNoDelay(e,t){this.decoderWorker.postMessage({cmd:E,buffer:e,ts:Math.max(t,0)},[e.buffer])}}class Ue extends ve{constructor(e){super(),this.player=e,this.stopId=null,this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.initInterval()}destroy(){this.stopId&&(clearInterval(this.stopId),this.stopId=null),this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.bufferList=[],this.dropping=!1,this.off()}getDelay(e){return e?(this.firstTimestamp?e&&(this.delay=Date.now()-this.startTimestamp-(e-this.firstTimestamp)):(this.firstTimestamp=e,this.startTimestamp=Date.now(),this.delay=-1),this.delay):-1}resetDelay(){this.firstTimestamp=null,this.startTimestamp=null,this.delay=-1,this.dropping=!1}initInterval(){const e=this.player._opt.videoBuffer;this.player.debug.log("common dumex","init Interval");let t=()=>{let t;if(this.bufferList.length)if(this.dropping){for(t=this.bufferList.shift(),t.type===f&&0===t.payload[1]&&this._doDecoderDecode(t);!t.isIFrame&&this.bufferList.length;)t=this.bufferList.shift(),t.type===f&&0===t.payload[1]&&this._doDecoderDecode(t);t.isIFrame&&(this.dropping=!1,this._doDecoderDecode(t))}else if(t=this.bufferList[0],-1===this.getDelay(t.ts))this.bufferList.shift(),this._doDecoderDecode(t);else if(this.delay>e+1e3)this.resetDelay(),this.dropping=!0;else for(;this.bufferList.length&&(t=this.bufferList[0],this.getDelay(t.ts)>e);)this.bufferList.shift(),this._doDecoderDecode(t)};t(),this.stopId=setInterval(t,10)}_doDecode(e,t,i,o){const r=this.player,{decoderWorker:A}=r;let n={ts:i,type:t,isIFrame:!1};r._opt.useWCS&&!r._opt.useOffscreen||r._opt.useMSE?(t===b&&(n.isIFrame=o),this.pushBuffer(e,n)):t===b?A.decodeVideo(e,i,o):t===f&&A.decodeAudio(e,i)}_doDecoderDecode(e){const t=this.player,{decoderWorker:i,webcodecsDecoder:o,mseDecoder:r}=t;e.type===f?i.decodeAudio(e.payload,e.ts):e.type===b&&(t._opt.useWCS&&!t._opt.useOffscreen?o.decodeVideo(e.payload,e.ts,e.isIFrame):t._opt.useMSE&&r.decodeVideo(e.payload,e.ts,e.isIFrame))}pushBuffer(e,t){t.type===f?this.bufferList.push({ts:t.ts,payload:e,type:f}):t.type===b&&this.bufferList.push({ts:t.ts,payload:e,type:b,isIFrame:t.isIFrame})}close(){}}class Fe extends Ue{constructor(e){super(e),this.input=this._inputFlv(),this.flvDemux=this.dispatchFlvData(this.input),e.debug.log("FlvDemux","init")}destroy(){super.destroy(),this.input=null,this.flvDemux=null,this.player.debug.log("FlvDemux","destroy")}dispatch(e){this.flvDemux(e)}*_inputFlv(){yield 9;const e=new ArrayBuffer(4),t=new Uint8Array(e),i=new Uint32Array(e),o=this.player;for(;;){t[3]=0;const e=yield 15,r=e[4];t[0]=e[7],t[1]=e[6],t[2]=e[5];const A=i[0];t[0]=e[10],t[1]=e[9],t[2]=e[8];let n=i[0];16777215===n&&(t[3]=e[11],n=i[0]);const s=yield A;switch(r){case y:o._opt.hasAudio&&(o.updateStats({abps:s.byteLength}),s.byteLength>0&&this._doDecode(s,f,n));break;case v:if(o._times.demuxStart||(o._times.demuxStart=ce()),o._opt.hasVideo){o.updateStats({vbps:s.byteLength});const e=s[0]>>4==1;s.byteLength>0&&this._doDecode(s,b,n,e)}}}}dispatchFlvData(e){let t=e.next(),i=null;return o=>{let r=new Uint8Array(o);if(i){let e=new Uint8Array(i.length+r.length);e.set(i),e.set(r,i.length),r=e,i=null}for(;r.length>=t.value;){let i=r.slice(t.value);t=e.next(r.slice(0,t.value)),r=i}r.length>0&&(i=r)}}close(){this.input&&this.input.return(null)}}class Ve extends Ue{constructor(e){super(e),e.debug.log("M7sDemux","init")}destroy(){super.destroy(),this.player.debug.log("M7sDemux","destroy")}dispatch(e){const t=this.player,i=new DataView(e),o=i.getUint8(0),r=i.getUint32(1,!1);switch(o){case f:if(t._opt.hasAudio){const i=new Uint8Array(e,5);t.updateStats({abps:i.byteLength}),i.byteLength>0&&this._doDecode(i,o,r)}break;case b:if(t._opt.hasVideo&&(t._times.demuxStart||(t._times.demuxStart=ce()),i.byteLength>5)){const A=new Uint8Array(e,5),n=i.getUint8(5)>>4==1;t.updateStats({vbps:A.byteLength}),A.byteLength>0&&this._doDecode(A,o,r,n)}}}}class Oe{constructor(e){return new(Oe.getLoaderFactory(e._opt.demuxType))(e)}static getLoaderFactory(e){return e===a?Ve:e===s?Fe:void 0}}class Qe extends ve{constructor(e){super(),this.player=e,this.hasInit=!1,this.isInitInfo=!1,this.decoder=null,this.initDecoder(),e.debug.log("Webcodecs","init")}destroy(){this.decoder&&(this.decoder.close(),this.decoder=null),this.hasInit=!1,this.isInitInfo=!1,this.off(),this.player.debug.log("Webcodecs","destroy")}initDecoder(){const e=this;this.decoder=new VideoDecoder({output(t){e.handleDecode(t)},error(t){e.handleError(t)}})}handleDecode(e){this.isInitInfo||(this.player.video.updateVideoInfo({width:e.codedWidth,height:e.codedHeight}),this.player.video.initCanvasViewSize(),this.isInitInfo=!0),this.player._times.videoStart||(this.player._times.videoStart=ce(),this.player.handlePlayToRenderTimes()),this.player.handleRender(),this.player.video.render({videoFrame:e}),this.player.updateStats({fps:!0,ts:0,buf:this.player.demux.delay}),setTimeout((function(){e.close?e.close():e.destroy()}),100)}handleError(e){this.player.debug.log("Webcodecs","VideoDecoder handleError",e)}decodeVideo(e,t,i){if(this.hasInit){const o=new EncodedVideoChunk({data:e.slice(5),timestamp:t,type:i?X:Z});this.decoder.decode(o)}else if(i&&0===e[1]){const t=15&e[0];if(this.player.video.updateVideoInfo({encTypeCode:t}),t===F)return void this.emit(k.webcodecsH265NotSupport);this.player._times.decodeStart||(this.player._times.decodeStart=ce());const i=function(e){let t=e.subarray(1,4),i="avc1.";for(let e=0;e<3;e++){let o=t[e].toString(16);o.length<2&&(o="0"+o),i+=o}return{codec:i,description:e}}(e.slice(5));this.decoder.configure(i),this.hasInit=!0}}}const Me={play:"播放",pause:"暂停",audio:"",mute:"",screenshot:"截图",loading:"加载",fullscreen:"全屏",fullscreenExit:"退出全屏",record:"录制",recordStop:"停止录制"};var We=Object.keys(Me).reduce(((e,t)=>(e[t]=`\n \n ${Me[t]?`${Me[t]}`:""}\n`,e)),{}),Ge=(e,t)=>{const{events:{proxy:i}}=e,o=document.createElement("object");o.setAttribute("aria-hidden","true"),o.setAttribute("tabindex",-1),o.type="text/html",o.data="about:blank",ue(o,{display:"block",position:"absolute",top:"0",left:"0",height:"100%",width:"100%",overflow:"hidden",pointerEvents:"none",zIndex:"-1"});let r=e.width,A=e.height;i(o,"load",(()=>{i(o.contentDocument.defaultView,"resize",(()=>{e.width===r&&e.height===A||(r=e.width,A=e.height,e.emit(C.resize))}))})),e.$container.appendChild(o),e.on(C.destroy,(()=>{e.$container.removeChild(o)})),e.on(C.volumechange,(()=>{!function(e){if(0===e)ue(t.$volumeOn,"display","none"),ue(t.$volumeOff,"display","flex"),ue(t.$volumeHandle,"top","48px");else if(t.$volumeHandle&&t.$volumePanel){const i=he(t.$volumePanel,"height")||60,o=he(t.$volumeHandle,"height"),r=i-(i-o)*e-o;ue(t.$volumeHandle,"top",`${r}px`),ue(t.$volumeOn,"display","flex"),ue(t.$volumeOff,"display","none")}t.$volumePanelText&&(t.$volumePanelText.innerHTML=parseInt(100*e))}(e.volume)})),e.on(C.loading,(e=>{ue(t.$loading,"display",e?"flex":"none"),ue(t.$poster,"display","none"),e&&ue(t.$playBig,"display","none")}));try{const i=()=>{ue(t.$fullscreenExit,"display",e.fullscreen?"flex":"none"),ue(t.$fullscreen,"display",e.fullscreen?"none":"flex")};ne.on("change",i),e.events.destroys.push((()=>{ne.off("change",i)}))}catch(e){}e.on(C.recording,(()=>{ue(t.$record,"display",e.recording?"none":"flex"),ue(t.$recordStop,"display",e.recording?"flex":"none")})),e.on(C.recordingTimestamp,(e=>{})),e.on(C.playing,(e=>{ue(t.$play,"display",e?"none":"flex"),ue(t.$playBig,"display",e?"none":"block"),ue(t.$pause,"display",e?"flex":"none"),ue(t.$screenshot,"display",e?"flex":"none"),ue(t.$record,"display",e?"flex":"none"),ue(t.$fullscreen,"display",e?"flex":"none"),e||t.$speed&&(t.$speed.innerHTML=fe(""))})),e.on(C.kBps,(e=>{const i=fe(e);t.$speed&&(t.$speed.innerHTML=i)}))};function Je(e,t){void 0===t&&(t={});var i=t.insertAt;if(e&&"undefined"!=typeof document){var o=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===i&&o.firstChild?o.insertBefore(r,o.firstChild):o.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}Je('@keyframes rotation{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}.jessibuca-container .jessibuca-icon{cursor:pointer;width:16px;height:16px}.jessibuca-container .jessibuca-poster{position:absolute;z-index:10;left:0;top:0;right:0;bottom:0;height:100%;width:100%;background-position:50%;background-repeat:no-repeat;background-size:contain;pointer-events:none}.jessibuca-container .jessibuca-play-big{position:absolute;display:none;height:100%;width:100%;background:rgba(0,0,0,.4);background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC");background-repeat:no-repeat;background-position:50%;cursor:pointer;background-size:48px 48px}.jessibuca-container .jessibuca-play-big:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC")}.jessibuca-container .jessibuca-loading{display:none;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:20;left:0;top:0;right:0;bottom:0;width:100%;height:100%;pointer-events:none}.jessibuca-container .jessibuca-loading-text{line-height:20px;font-size:13px;color:#fff;margin-top:10px}.jessibuca-container .jessibuca-controls{background-color:#161616;display:flex;flex-direction:column;justify-content:flex-end;position:absolute;z-index:40;left:0;right:0;bottom:0;height:38px;padding-left:13px;padding-right:13px;font-size:14px;color:#fff;opacity:0;visibility:hidden;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none}.jessibuca-container .jessibuca-controls .jessibuca-controls-item{position:relative;display:flex;justify-content:center;padding:0 8px}.jessibuca-container .jessibuca-controls .jessibuca-controls-item:hover .icon-title-tips{visibility:visible;opacity:1}.jessibuca-container .jessibuca-controls .jessibuca-fullscreen,.jessibuca-container .jessibuca-controls .jessibuca-fullscreen-exit,.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-microphone-close,.jessibuca-container .jessibuca-controls .jessibuca-pause,.jessibuca-container .jessibuca-controls .jessibuca-play,.jessibuca-container .jessibuca-controls .jessibuca-record,.jessibuca-container .jessibuca-controls .jessibuca-record-stop,.jessibuca-container .jessibuca-controls .jessibuca-screenshot{display:none}.jessibuca-container .jessibuca-controls .jessibuca-icon-audio,.jessibuca-container .jessibuca-controls .jessibuca-icon-mute{z-index:1}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom{display:flex;justify-content:space-between;height:100%}.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-left,.jessibuca-container .jessibuca-controls .jessibuca-controls-bottom .jessibuca-controls-right{display:flex;align-items:center}.jessibuca-container.jessibuca-controls-show .jessibuca-controls{opacity:1;visibility:visible}.jessibuca-container.jessibuca-hide-cursor *{cursor:none!important}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100%!important;height:100%!important;background:#000}.jessibuca-container .jessibuca-icon-loading{width:50px;height:50px;background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%;animation:rotation 1s linear infinite}.jessibuca-container .jessibuca-icon-screenshot{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAE5UlEQVRoQ+1YW2sdVRT+1s7JxbsoVkEUrIIX0ouz15zYNA+N1RdtQfCltlUfvLbqL/BCwZ8grbHtizQqPojgBSr0JkiMmT2nxgapqBURtPVCq7HxJCeZJVPmxDlzZubMmXOSEsnAvOy917fXt9e39tp7E5b4R0vcfywTuNgRbBgBx3HuJqLVzPzmYjprjHkcwAlmLqXNm4XAISLaSESPaq2HF4OE67rbRGRYRA7btn1fbgLGmKsA/Azg0gBkGzO/vZAkHMd5hIiqc5wHcCMz/5k0Z2oExsfHV1QqldPAf8lORNu11m8tBAljzFYAYWxRSl1vWdZvuQj4RsYYF4AVBlgIOVVlE55HRIxt23ZuCfmGjuOsJ6LPoiAistW27XfaEYmIbOYhPc9bXywWR1oiEJDYQkR1zrYjEjGyqfqbKd8a7kJVtLgQ+30i8pht2wfyRKIdmJkJBPkQTbILfudJ7CTZNBvVpggEcgpvc/ML38zESbLJsxBNE/A9biX0rdjGyTQXgbxyapdsarb0PMlXtWnGoXbKpm0Essqp3bJpK4E0OXmed3+hUBDP8w5FI91M0rdcyLLILElOCbaZilSWeXMncRx4klTCY1spfG3dhZJWx3GcDUR0EEB3ZMw0ET2gtT6SZWWzjmlrBIJCl0hAKfWgZVmHszqXZVxbCSxpCS2JJA6umIhe8ZKKVLPbaBJ+S9toqVRa53nedgAbAKwIwH4FcAzAa0R0l4i8F7PPz189k6RFRA+LyNcAXojDV0oNW5b1eW4Cxpg9AHZkSaaa6hhzb065uDSCH2LmRB8Sk9gY4293g43Qo/1pV80m8yQMfZSZ781cB1zXHRKRZ2IMpgD8A+DamL4ZItqitX4/jbQx5iEA7wLoihn3V/ACckWMJN/QWj9b1x5tGBsbW6uUOh5pPy0iL3Z2dn6ilJqanp5ep5TaJSLhF4NppdRNaU8gPmapVLrO87yfIoXuWyJ6uVKp+HmFjo6OQSJ6FcBtYT+UUmstyxqvkWuUgDFmP4AnQu2/e563qlgs+u9DNZ8xZhRAX7VRRPbath0XuXk7Y8xeAE+FgL6fnJzsHRwcLIfBR0ZGLunq6poAsDLUvp+Zw7b1r9PGmJMAbg8Z7WDmoThZuK67WkS+DD18fcPMdzSQUBR/EzN/nIC/SUQ+DPXV4dclsTHmHAD/SfHCNzc3t7Kvr++HJKeMMacA3BL0nyuXyzcPDAxMxo0fHR29slAo/Ajg6qD/fE9Pzw29vb1/x42fmJi4vFwu+5G/LOg/y8zXNJLQ2dAES5JANMQ7mfn1jBI6ycx3NiMhItqstf4oAX+ziHwQ6qvDj5NQNIn/ALCKmX+JSeIvABRD7fuY+ekGBPYBeDI05tTMzExvf3+/vz2Hk91/ET8RSeI6/DoCpVJpjed5fmKGvzMAXpqdnT3oed5Ud3d3v4jsAqBr9Ei0Rmv9VRqBBPzvROQVETnq2xJRdRu9tRF+bCVOKWT+Kvl/TSIFk6SW/LAjKfjV5K8rZABi8dOOEv7FI7Z8x6zwEWbemLbyMfJr5qiSiJ96oclymBOR3bZtP9+M89WxxpjdAHY2sN3DzM8ljWl4I3Nd9x7/OE1ENcdpETnmH3e11n41zv0l4J8RkU+J6AAz+xtF4teQQG7PFslwmcAiLfSyhC72Qv9/I/Avns2OT7QJskoAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-screenshot:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAED0lEQVRoQ+2ZycsdRRTFf2ejqHFAMQqiYBTUoElUHLNx3GgCgpuYRF2o0UT9CxwQ/BMkMSbZSKLiQgQHUDCJgjiAxiEiESdEcJbEedgcKaj3UV+/6q7u/jovPPkK3qbr1ql76p5bt6qemPKmKfefeQKHOoLFCNg+H1gi6fFJOmv7VmCvpD1N87Yh8ApwNXCzpB2TIGF7DRDm2inpmt4EbB8LfAMcGUHWSHryYJKwfRMwmuMP4BRJv9TN2RgB2wuB72BWsq+V9MTBIGF7NZBiGzhJ0o+9CIRBtt8FLqgADC6nRDbpVO9Iuqi3hCKB5cDrGZDVkp4aIhIV2aSQyyW9MScCkcQqIOfsnCORkc3I31b5VtyFRmg1IQ7dt0ja3icSQ2C2JhAjUU2ykd+dE7tBNp2i2olAJJFuc+nCt564QTadF6IzgUhiVGiqyinKaQjZpJP2ItBXTkPJZhACXeU0pGwGI9BWTkPLZlACBTldG4o5EA6E1dY66edcyNrs8Q36zg1vVaTazNs7iXPgDVJJzYs7VRvHRzaDEohyugJ4CTi84sg/wHWSdnVxsGQ7aQLXS9pZcqpL/6AEplpCU5HE8YpJ9YrXUKQ6baN1+HPaRm1fBqwFQnKGK2ZoPwCvAo8Ai4FnMpPMHMwapHUj8DFwbw3+Dklv9iZgexOwvktSRduxU2VDlErwmyXV+lCbxLbDdndlCT3TX3vV7JgnKfRuSVflfMkSsL0ZuDMz4E/gL+CETN+/wCpJzzaRtn0D8DRwWMbu1/gCcnSm7zFJd1W/jxGwvQx4r2IYnlbuA14GAomQFw8B6YtBKFSnNj2BxEJ3IvB1pdB9CjwQ8yqYhcg/DJxZ8WOZpA/SbzkC24DbEqOfgPMkBRKzmu23gEuSj1sk5SI3Y2J7C3BHMuZz4FxJf6fgto8APgIWJd+3SUrHjr9O294HnJUMWi8pSGqs2V4CvJ88fH0i6eyChKr4KyS9WIO/Ang+6RvDz0XgABCeFEdtkaQv65yy/QVweuwPY0+T9FuNQ8cAXwHHxf7wdHiypN9r7BfEl8GjYv9+SceXJLQ/mSDYTh2Baog3SHq0pYT2STqno4RWSnqhBn8l8FzSN4bfJol/jkn8bXUS228DFyfft0paVyCwFbg9sQkSDEkctueZZju8iO+tJPEYfo7A0piYKd73wP3xnB+20cvjNnphxdmlkj4sEMjhfwY8COyOY0fb6Bkl/K6FLKxS+M1KpDhJY8mvrG5doRwlf66QZfGbjhLh4pEt35kV3iUp/IvTunU8qtTil/7gaHOY2yjpntaez9b5RmBDYewmSXfX2RRvZLYvbThOh+NuqMa9Ww1+yLnXgO2SwkZR24oEens2oYHzBCa00PMSOtQL/f+NwH+Hg8hAnbrYgQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACgklEQVRoQ+3ZPYsTQRjA8eeZZCFlWttAwCIkZOaZJt8hlvkeHrlccuAFT6wEG0FQOeQQLCIWih6chQgKgkkKIyqKCVYip54IWmiQkTmyYhFvd3Zn3yDb7szu/7cv7GaDkPEFM94PK0DSZ9DzDAyHw7uI2HRDlVJX5/N5r9FoHCYdr/fvCRiNRmpJ6AEidoUQ15NG+AH8BgD2n9AHANAmohdJQfwAfgGA4xF4bjabnW21Whob62ILoKNfAsAGEd2PU2ATcNSNiDf0/cE5/xAHxDpgEf0NADaJ6HLUiKgAbvcjpdSGlPJZVJCoAUfdSqkLxWLxTLlc/mkbEgtgET1TSnWklLdtIuIEuN23crlcp16vv7cBSQKgu38AwBYRXQyLSArg3hsjRDxNRE+CQhIF/BN9qVAobFYqle+mkLQAdLd+8K0T0U0TRJoAbvc9fVkJId75gaQRoLv1C2STiPTb7rFLWgE6+g0RncwyYEJEtawCvjDGmpzzp5kD6NfxfD7frtVqB17xen2a7oG3ALBm+oMoFQBEPD+dTvtBfpImDXjIGFvjnD/3c7ksG5MU4HDxWeZa0HB3XhKAXcdxOn5vUi9gnIDXSqm2lHLPK8pkfVyAbSLqm4T5HRs1YB8RO0KIid8g03FRAT4rpbpSyh3TINPxUQB2GGM9zvkn05gg420CJovLZT9ISNA5tgB9ItoOGhFmnh/AcZ/X9xhj65zzV2Eiwsz1A1j2B8dHAOgS0W6YnduY6wkYj8d3lFKn/j66Ea84jtOrVqtfbQSE3YYnYDAY5Eql0hYAnNDv6kKIx2F3anO+J8DmzqLY1goQxVE12ebqDJgcrSjGrs5AFEfVZJt/AF0m+jHzUTtnAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-play:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACEElEQVRoQ+2ZXStEQRjH/3/yIXwDdz7J+i7kvdisXCk3SiFJW27kglBcSFFKbqwQSa4krykuKB09Naf2Yndn5jgzc06d53Znd36/mWfeniVyHsw5PwqB0DOonYEoijYBlOpAFwCMkHwLDS/9mwhEDUCfAAyTXA4tYSLwC6CtCegegH6S56FETAR+AHRoACcBTJAUWa+RloBAXwAYIrnt0yBNgZi7qtbHgw8RFwLC/QFglOScawlXAjH3gUqrE1cirgVi7mkAYyS/0xbxJSDcdwAGSa6nKeFTIOZeUyL3aYiEEBDuLwDjJGf+KxFKIOY+BdBL8iipSGiBmHtWbbuftiJZERBuOfgGSK7aSGRJIObeUml1ayKSRQHhlgtkiaTcdltGVgUE+ppkV54FaiS78yrwqlLoOI8Cch2XV548W7WRpTVwA6DP9kGUFYEpAOUkT9LQAvtq1M+0udKkQSgBqSlJWWYxKXj8vRACK+o6bbRIdYI+Ba7U7rKjg7L53JdAhWTZBsy0rWuBXZUuNVMg23auBF7UIl2yBbJt70JAoKV6/WwLk6R9mgKSJlJ1kLTxFmkJyCla8UZd15GJQKvyumyJ8gy8DAEvfZoINPqD41EtUjmUgoaJwAaAnjrKebVI34OSq85NBNqlCAWgE0CV5GEWwI3vQlmCbcSinYFCwPEIFDPgeIC1P1/MgHaIHDf4Aydx2TF7wnKeAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABA0lEQVRoQ+1YwQqCUBAcfWXXsLr2AXWTPXno8yVB8AP6Aa3oHI+kCDqYaawJljSe133uzO44bx0M/HEG/v1gAd9mkAyQgY4I/F8LJUlyrQFtD2AtIkcNoFEU+Z7n7QD4DfFHEVlocrVmgAUAIAOl3mILPcDgEFcUhyrUKMGUUcroc3NQRimj9XJBGaWMvvPydKN0o6/9QTdKN6rZANxj6EbpRulGuZnjYqs8BbyR8Ub2Izeys+u6yyAIDpo/ehzHM2NMDsA0xFsRmWhyfTIDWSXxCEBmrd2EYXjSHJqm6bQoii2AOYBL5Z0xgFxEVppcrQvQJO0zhgX0iXbdWWSADHRE4AZQ731AhEUeNwAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-pause:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAA7klEQVRoQ+2YSwrCQBBEX6HiVvxsPYDewfN7By/gD9ciQkvERQwJdBSiYs0mEDo96aruombEjy/9+P/jAj7NoBkwA28i8H8tFBFRA9oeWEo6ZgCNiDGwAYpn3TpKmmVytWbABQBmoNRbbqEHGB7iiuJYhRol2DJqGX1uDsuoZdRmLuNZSzGWUcuoZdRHSp/IylNgK2ErYSthK3FHwLcSvpXIjoLt9Jfa6TMwl3TIMBkRE2AH9BriL5KGmVyvWIltJXEfKN6tJJ0ym0bECFgDU+Ba+WZQFCdpkcnVuoBM0i5jXECXaNftZQbMwJsI3AAPN3dAQflHegAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC+UlEQVRoQ+1ZS2sTURT+zlDJYE3XSq219QHVuEjnJDT+Bff9Abqw2voAEfGxqygUqWhVFHGl/yMLu9BwByxk5SNI66ML6U7axjhHbmhgWiftncxoOiV3FcI53z3f/e65594zhIQPSnj86BBot4IdBToKRFyBnbeFlFIScVEiuYvIWC6Xe2YK8pcC7SYA4CMzH4mDQBXAqilQBDsLQLfPf9FxnF4i8kwwmypARI+Wl5dvmIBEsUmlUkNE9NaHsVCpVAZGR0d/m+A2JSAid3K53E0TkCg2pVKpz7KseR/GfKVSGYxMAMA0M1+JEpyJb6lUOm5ZVnkrAsVisaunp+esiByr1Wp3R0ZGvmifzZK4XQQWHMc52MgBpdQuAOcAXABwuB400ZTjONdaIjA7O5u2bVsnWU1EujzP+5nP5xdMVjvIJkCBD8x8VCm1G8AYgAkAAxt8Z5j5YmgCSqlTAJ4D2OcD/AXgATNfbYVEAIFPIvKKiE4D6GuCea8xX6gtpJT6DmBvECgRFRzHeROWRAABE4iWCbwHEFhkPM/L5vP5dyaz+23+KwHXdR3P854S0YG1ILSCuthNMfNM2OC1/RYENLY+ygcBnPfht6ZAA6BYLNr6dyqVokKhsGpaNQ2TWJstreXaE2aed133sojcj41AKyvdzCdAgSXLsk4MDw9/a/i4rntbRPxFNZoC/5jAV2be759DKTUJ4FZSFFi0bbs/k8noy2R9dAjEuWU2YgXkQOK3kD6BMsysi2Z9JC2Jdcw/ALzwPO+xvmcl7Rj177JVEbkO4BARjSflFDJJuW1dBxJPoCIiL4noDIB1BS0pW6j+oJmbm+uuVqvjRKQfLr0bZHnIzJf0f6HeAybahrUJqAPruhLlcnnPysqKfpXp11n/Gv62zoHAroS+AafT6QkiGrIsazKbzX7eVIHEt1US39gCkOzWYthkjNE+tuZujDGZQ8XRXn8N4KT5lLFZ6uaYPt+nwyDuvC80YdhvB9uOAu1WoaNAR4GIK/AHvdr+QAexB7EAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-record:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACfUlEQVRoQ+2ZSYsUQRCFvycK4nJXXEbHBdwO4kn/gv9CD467ICIutxEFkREdFUU86T/xojcPntyQcT2INw+uISFVkD1Wd2dWlU7nUHlqisiX+fJFZGREi8yHMt8/HYG5VrBToFOg4QnMPxcyM2t4KE2nT0i6EwvylwIjQOCFpE1tEPgGfI0FamC3AFgazP8IrJL0KwZzkAI3gLMxIA1ttgCPA4w3wHpJP2NwBxG4KOlcDEgTGzNbA8wEGP57vA0CU5JONtlczFwz2wY8HUbAzBYCB4CtwCVJb33OIAXmioC70LoyBsxsEXAQOApsLIhelnS6FgEzW+5BBvwA/FS+SPJFa40KBZ5L2mxmS4AJ4IjHxCzwaUnHkgmY2V7gLrAyAPwOXJN0qg6DCgIvgQfAPsDjo2pcKddLciEz+wCs6AO6W9KjVBIVBGIgahN4BvRLMjslPYlZPbT53wR2AbeBtcUmXEFPdh5U06mbd/shBBzbr/Jx4FCAX0+BEsDMFocEYrNmFcE+BD4XsXZL0oyZnQCutkagzkn3m1NBwDe/Q9L74MAuFEqUn5op8I8JvJO0elacTALnc1HAH3Njkvwx+WeYWUegTa/pwaqIgexdyIN4uyRPmqULZRXEvulPwD3gpr+zcrtGQxfzRHYG2AAczuUWiom3kc4D2RN4BdwH9gM9CS0XFyoLGu9UuN974eIFVDiuSzruH5LqgRhtU20q8kBPV8LMlhVVmVdnYwX+SMdAZVeieAF7eeltmElJr4cpkH1bJfvGVvatxdR4bMu+teZuWxtKxWncXn8I7EldtQV7vz79fp9KwZp//9CksB8F206BuVahU6BToOEJ/Ab7+KdABdTt8AAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAGDElEQVRoQ82ZaahVVRTHf//moKKggQawcmg0olGl0awvRoMVBRGFlQ1YQZIZqRVKmJmFgVk59EFQykYjgmajbJ7n2WiAbKKCBq0Vfznndd723Lvvve/5bMH9cvfaa63/2WuvaYteoIjYHDgEOAAYDOwIbA/4f9PvwHfAt8DbwGvAS5L8f49Ine6OCO89CTgFOBrYqU1Z3wBPAUskPdDm3i72jgBExCXAWGBQp4qTfR8CMyXd0a68tgBExEjgBmCfdhW1yP8eMFHS/S3y0xKAiNgQmA2MaUHwB8DnwNfAbwX/FsDOwG7Ani3I8ElcLOnvHG8WQET0Ax4C9msi7BHgbuAFSXaHhhQRewBDgZOBE5qwvuV1SSuayWsKICIcVZ4Atq4R8mdxKnMkfZT7UnXrEeE7dD7gO7VpDc/PwAhJrzaS3xBAROzrUFcJhVUZjhrjJX3cieHpnogYUNytUTXy/gAOlvROna5aABHhGG5f3qZmk33ztt4wvAbIBcCcBicxSNLKdK0RgNeB/RPmVcBxkp5eF8aXMiPiKODRGpd6XZJduhutBSAipgNX1Bg/tJkv9iao4u4tBzZJ5N4oaXz1v24AImIvwLE4peGSnDX7jCLC2f3JGoV7S3q//D8F8DJwULJpgiQnrz6niLgSmJYofkXSwWsBiIgRwGPNmPscARARDqGp7zu0Orz/l4kjYhlweGLk4Ebhq8oXEc6wGwH/tAhyA2C1JGfsphQRTqBvJkzLJB3ZBaBIKGkGXSqpWab013FWvacooXO21K07256WS4QRsRQ4PhHgsPrxmjsQEZOB6xKGIZJebGZVRDwOHNOJ5ZU9j0s6NqPnUJcpCc9kSVNKAA5ZQyoMn0gamDMsIj4rCrQca7P1zyT1zwmIiE+AKt9yScNUFGuuZaoxd7okR4Ccfzq997S0fleSy5acrjQ//QUMNADXH/cmu0dKcoWZE+r2MKs8I+YdSW5Dc7rcizycMI0ygKuA6ysLjiT9JX3RgtC+BLArYJet5q4JBuBG5aKKsV/ZryWt/p8BcJj2R3VjVNJsA1gEnFH5821JzZqXLtaI6LMTsNIafYsM4L6iOyoNe1FSNSI1PIj1AMCh1CG1pPsNYEkxGin/fFVSWg/VglgPAF4BDqwYs8QAFgDnVP78SJIzbJbWAwBXC9VRzgIDcLVXjfm/AP0kuR/NhbY+uwMR4e7QDf6WFaOmGYBHJbcnlh7USvPSlycQEXYdu1CVxhiARxzPJwsXSarrTbux9TEAh3qH/CqtKSU2Az5NZpsPSTqxBRdy49/SfWki60NJ2WFXTUXqwdmAsphbCJxZUeIGfltJvg8NKSIMfPcc0Mx6tpiLiK2AH4qeoxS3UNJZJYC6emicpJkZAOOAGT0EcLmkmzvQM8oz1BLAxsX8vjqBWynJ86FcJDoLGO4OC8jOMgthnrX696Qkn35Oh+dB21aYfgJ2kLSqqzCKiGuAaxNJkyRNzSlYl+sNmq2pkiZZbxWAJ8g/Aj6NksI+3kplui5AFL2271m1AvVJb1fmqXSsMhGYkhjznqSeNi0d4YsIz3/SCNXNK+omcy5ZPVKv0r2STu3Iig431dRolrRCkvuCLqoD4BlM3Th7nqTzOrSnrW0RcSdQp+tASX4gbAzAK8Ub2KwarQ8Cp0vy20CvU5FUFwN1SfRSSbemSpu9D9wCXFZjpacDoyU925sIIuIw4K5k8lCqmCWpzpbmb2QRMRc4t4GhfiOYJunLngCJiF2Aq4ELG8iZL6mRDflHvohwpnXGrSM/VM8DFkt6rh0gxRd3K3s24BBeRzMkpaP+bnzZR77iTvgLuOR29mxEDnmer7rk9dPT98CvBbNreGdSD8s8WT4i81rpjD5G0vzcR2kJQAHCs5ubgKZjwERhednrHvAa2eaPMFaSm6UstQyglBQRDm92qWwJnNXencGnZpdp67W+bQAVIKOLCz6sTUNTdjdTcyW5N2+bOgZQAeLHQLuV5/UeM6ZZPDXKfa1nqs/4QUXSG21bXdnQYwBV5RHhy2rXcmh0E+5GxOTGyCWwp34fSCovd09sX7P3X2uzPXCoLsVMAAAAAElFTkSuQmCC") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-recordStop:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreen:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADd0lEQVRoQ+2Zz2sdVRTHv+fJBDW6anDVXen6wZszYxYBiYgtFGst3VSDunKjpS0GpUlqfjVpsVVs6aaL0or4YxMVFCJZ2ZLdPUP+gq5bQnTxtNAkfTnlhnnlkmQy9yV9780rudt77tzv5/y4v4bQ4Y06XD/2ANodwec/AiJygJnvtdvTWfPnRkBEJAiCN8rl8kMfiPn5+Ve7u7v3rays0Orq6lJfX99/PuN2auMDoAD+BvA2M6/mTWSMOUtE48D6AjHGzN/kjdlNvy+AnWOOmQ/lTSYiEwDOWzsimgrDcCRvzG76GwGw8/zJzO9sN6GInAMwbW1UdSSKoqndCMwb6wNwGsB39Q+p6h/M/C4R2dTa1AoHYBWKyCkA1+pqiWi2Wq0e7e/vf7yRoJAAKcQggMtuJKIoOtoxACnE0/xOi/SXMAxPuhCFjUBdpIjYVWXSEf0TM3/g9BeriDMKdSPEz8z8vrU1xgwT0YXCrEJZy1iSJKOqOub0/8jMA0mSfKKqNwoPkHp7ioiGHIhRIvpHVa93BEBa2JcAfOlALAHo6RgAKzRJkk9V1S6xL7kpV4idOM31taxaIKJHqmpPnMMA9hcOQES2PDJkAT1XAAC+ZebPfWB3auNzmLObVsNRUNUXVHUujuM7OxXnMy4XwOcj29mIyOuq+lapVGrYCelKpkEQ3CyXy4tbzdN0AGPMxr2iYZ+sra3FcRybtgCIiK2BKw2rdgaUSqWoUqlIkQAepFDdAF7cBq5ERI9rtdr1OI7tmE2t6SmUEYFHAEaexYW/1QC2EF+ru5GIvg7D0D2GNJxprQY4o6qv1I/b6SpzOYqiLxpWng5oOQAzXxWRWwA+dkRfYOb1p5hGW6sBJpn5KytSRG4D+KguWFXHoyhy7xdeLC0F2ChSRL4H8OFuINoKYIUbY34gogHH3eeZef1K6tPaDpCm068A3nMEDzHzxY4BUNWSiPxORO6z5aDPPlGICNQ9bYyZIaLjjudzIQoFkKbTbwCO+UI0HcB9J/LdeY0xs0R02IGYYObRrWqiFQCfEZEtSHsfmGZm+4qxbbM/hQD8BeBNa0hEM2EYnmgLgP3lFARBT1dXly4vL//b29tbzQNIU+llAHeJaLFSqRzJes5vegR8xGbZLCwsHKzVav8z8/0sm0ID+MDvAfh4qZk2exFopnd9vv0ELrXBQO7fD10AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-fullscreenExit:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC/ElEQVRoQ+2Zy49NQRCHvx+ReK6IlZ34E7CUiCAR4xEbTLCyQRATYswwb2IQZDYWgojHZpCQECts+ResiQwLj0RClNSkb9Lu3HtPz7mZc8+V6eXt6tP1VVV3VdcVbT7U5vozC9BqD/7/HjCzlZLet9rS9fbP9ICZvQPWSfqRAmFmS4ClMHm+JiR9S1mXVyYFwIBXwEZJv7I2MrPjQH8A6JN0OWtNM/OpAL7HS0mbsjYzswGgN8gNS+rJWtPM/HQAfJ9nkrY22tDMTgMjQaZH0nAzCmatTQE4ClyNPvQU2CbJQ2vKKB2Aa2hmR4DrkbbPgQ5Jv6sJSgkQILqA0dgTkjraBiBAxPHtPz2UtDuGKK0HKkqamd8qg5HS9yXtjebLdYjrHNRqiAeS9gQvnQGGSnML1bvGzOwc0BfN35PUaWYHgRulBwjW9ju+O4JwqM/AWFsABIgLwKkIYgJY1jYAAeJQuGIXVIVcKTKxh8WfBin9J+AVpx/eFWUEqFkyNACKp0rhgWYArkg6kQibSyylmPOklQdibijBX+fSLHFRJkDid+qKmdlaYENOI0zeEcBNSZ9qbVIEQHWuyGOTNZLetgrAz8ClPFpHa1ZL8rf5lFGEB2oBfAxQi4D5DeDmAP7mGJPka0oD4LnDr9imH/xFe8AP4vLIjBclxWXItCOtaIBjwOKo3HaFRyWdnLbmYUHhAJKumdkt4ECk9JCkSitmWixFAwxKOjt5uZvdBvZH2vZLit8XSSBFA/yjpJndAfY1A9FSgOCJu0BnBNErqfIkzfRCywECxCNgR6Rtt6TzmdqHBmyKXG4ZM4sTWc04NzNPWE+AuG3ZlZInSuGBinXMbBzYGVkrE6JUACGcHgPbUyGKAIj7REmZ18y897o5ghiQ5E/bltRChwE/kF7Xj0jyLkbDYWbzgBfA+iA4LmlXqwD8LydvszjAF0lfswBCKC0E3gBeP22p186f8RBKUbaejJmtAr5L+lBPptQAKfCzAClWmkmZWQ/MpHVTvv0X9iFAQGQyevIAAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACrUlEQVRoQ+2ZPYgTURCAZzbBXJnCeL2Cnb87b9MEtPBUrrMQFAtrtT5/ClGs9LBWWz0RtbBUFCF4oJDsbO68wsLA2YqQSmLlvpEHu7IuMdlLcus+yUKKhJfZ+ebnvZl5CJY/aLn+MAP41x7M1QPMfFtr/crzvHfTAs8FoNPp1LTWzwHgqIg0lFLvrQHwfX8BER8DwC6jNCIecF13wwoA3/dvIuKNpLJa60Oe560XGoCZd4rICiKeTCtaeABmPg4AJmRqg6xcaABmvg4At4aFRyEBhoVM4UMoCplHADCfJTEL5YEsIVNID5iQAYCHALCYxeq5b6PMfF5EBAAEESthGK7W6/XPRpFWq7W3VCqtZg2ZcT3g+/6i4zjzIlLSWn/yPO/DIGMNLCWY2Sj/+xGRK0qpZfNDEASnROTFVi0fr8+aA8z8Ld6KEfGt67oLYwMAwEUium8EREn7OgeAjwCwPyo/nrque3YSgAtE9GDaAM1mc65arc4Zuf1+P2w0Gt9jJZl5DQAORt+fENG5wgEw8zUAMB/zbBBRwyqAIAjuiMjlSOlNItpjFUCqWl0josMzgChR/9hGAWBbknjmAdPhDdqa0gfZzAMJKyVP4v8hhJYRcSni+0JEu63ahZj5anyQici6UuqIVQDdbrfS6/UqRulyufyTiH5sF8AlIro37VpoWEHIzGZ2tM+sEZFnSqkzk9RCS0R01wjIsZz+mug53hDRia0AnI4bGgDYISItz/M2jYC8Gpp2u30MEWuO4zha665Sqp0ZYFStX/iWchRAItFGzoHSsrJ2ZFl1mHg6bfVYJeGJv85CC++BpIJZ5kSFC6G0ha0e7mYJqcJ7IOkRay84UhD2XjHFIFZf8iW9YcYoYRi+tO6aNeupOs66iU/icV46zf/MAKZpzXFk/QL+JG1PUPhRiQAAAABJRU5ErkJggg==") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-audio:hover{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACSElEQVRoQ+2Zu4sUQRCHf5+C+gf4yBXMfMYHGvjCzEBQDIzV+HwEohipGKupD0QNDE8UEwUFTe68wEDhTMVUMFJ+0tArzbjs9u3Ojt0wBR0M9MzUV1XdXVWNKhcq1189wP/2YKcesH1d0nPgdVvgnQDY3iTpqaT9kuaAt9UA2D4o6aGkzVHpXcByFQC2r0q60lB2D7BUNIDtjZIeSDoyRNGyAWwfiiET4n6YlAtg+7Kka2PCozyAMSHT5CkLIIbMfUlbMhdmOQCZIVOeB2LI3JN0NNPq6bTZe8D2aUmOY72kN8DnoIXt7eF5FSEzkQdsB+OEsFwr6RPwbpixhqYStoPyqVwAbkaAY5KeTWD5wStZHrD9XdJgK34FhBP9H8kFOAvciQBhn3/RAcBHSTvjfx4DJ6cBOAPcbRvA9gZJYQT5DfwYKGl7UdLu+PwIOFUiwCVJYQRZBuZqA7gh6XxUegXYVhtAmq0uAnt7gLhQm9vorBZx74Hcc6D3QLKH/z2JGyVnlYs4pCfzEe4rsLW2XehicpAtAftqAwiZbhhBfgE/ZwVwDrjddi40KiG0HXpHO+KcJ8CJaXKheeBWBOgqnf6W1BwvgcOrATieFDTrJL0HViJAVwXNgVgPrJH0BfiQDTDKtREiNK7KLSnHASQLLacP1PxcVkWWq8PU3emq2yqJJ0b1Qsv2QKpdZp+orBBqmrfq5m5mSJXtgUZI1XnB0YCo94opCal6L/ka3ghtlIXqrllzT9VJ5k19Ek/y0zbf6QHatOYk3/oDujC8QMWgjf4AAAAASUVORK5CYII=") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-mute:hover{background:url("data:image/png;base64,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") no-repeat 50%;background-size:100% 100%}.jessibuca-container .jessibuca-icon-text{font-size:14px;width:30px}.jessibuca-container .jessibuca-speed{font-size:14px;color:#fff}.jessibuca-container .jessibuca-quality-menu-list{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .jessibuca-quality-menu-list.jessibuca-quality-menu-shown{visibility:visible;opacity:1}.jessibuca-container .icon-title-tips{pointer-events:none;position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%);transition:visibility .3s ease 0s,opacity .3s ease 0s;background-color:rgba(0,0,0,.5);border-radius:4px}.jessibuca-container .icon-title{display:inline-block;padding:5px 10px;font-size:12px;white-space:nowrap;color:#fff}.jessibuca-container .jessibuca-quality-menu{padding:8px 0}.jessibuca-container .jessibuca-quality-menu-item{display:block;height:25px;margin:0;padding:0 10px;cursor:pointer;font-size:14px;text-align:center;width:50px;color:hsla(0,0%,100%,.5);transition:color .3s,background-color .3s}.jessibuca-container .jessibuca-quality-menu-item:hover{background-color:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-quality-menu-item:focus{outline:none}.jessibuca-container .jessibuca-quality-menu-item.jessibuca-quality-menu-item-active{color:#2298fc}.jessibuca-container .jessibuca-volume-panel-wrap{position:absolute;left:50%;bottom:100%;visibility:hidden;opacity:0;transform:translateX(-50%) translateY(22%);transition:visibility .3s,opacity .3s;background-color:rgba(0,0,0,.5);border-radius:4px;height:120px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-wrap.jessibuca-volume-panel-wrap-show{visibility:visible;opacity:1}.jessibuca-container .jessibuca-volume-panel{cursor:pointer;position:absolute;top:21px;height:60px;width:50px;overflow:hidden}.jessibuca-container .jessibuca-volume-panel-text{position:absolute;left:0;top:0;width:50px;height:20px;line-height:20px;text-align:center;color:#fff;font-size:12px}.jessibuca-container .jessibuca-volume-panel-handle{position:absolute;top:48px;left:50%;width:12px;height:12px;border-radius:12px;margin-left:-6px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:before{bottom:-54px;background:#fff}.jessibuca-container .jessibuca-volume-panel-handle:after{bottom:6px;background:hsla(0,0%,100%,.2)}.jessibuca-container .jessibuca-volume-panel-handle:after,.jessibuca-container .jessibuca-volume-panel-handle:before{content:"";position:absolute;display:block;left:50%;width:3px;margin-left:-1px;height:60px}');class Ne{constructor(e){var t;this.player=e,((e,t)=>{e.$container.classList.add("jessibuca-controls-show");const i=e._opt,o=i.operateBtns;e.$container.insertAdjacentHTML("beforeend",`\n ${i.background?`

`:""}\n
\n ${We.loading}\n ${i.loadingText?`
${i.loadingText}
`:""}\n
\n ${i.hasControl&&o.play?'
':""}\n ${i.hasControl?`\n
\n
\n
\n ${i.showBandwidth?'
':""}\n
\n
\n ${o.audio?`\n
\n ${We.audio}\n ${We.mute}\n
\n
\n
\n
\n
\n
\n
\n `:""}\n ${o.play?`
${We.play}
${We.pause}
`:""}\n ${o.screenshot?`
${We.screenshot}
`:""}\n ${o.record?`
${We.record}
${We.recordStop}
`:""}\n ${o.fullscreen?`
${We.fullscreen}
${We.fullscreenExit}
`:""}\n
\n
\n
\n `:""}\n\n `),Object.defineProperty(t,"$poster",{value:e.$container.querySelector(".jessibuca-poster")}),Object.defineProperty(t,"$loading",{value:e.$container.querySelector(".jessibuca-loading")}),Object.defineProperty(t,"$play",{value:e.$container.querySelector(".jessibuca-play")}),Object.defineProperty(t,"$playBig",{value:e.$container.querySelector(".jessibuca-play-big")}),Object.defineProperty(t,"$pause",{value:e.$container.querySelector(".jessibuca-pause")}),Object.defineProperty(t,"$controls",{value:e.$container.querySelector(".jessibuca-controls")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$volume",{value:e.$container.querySelector(".jessibuca-volume")}),Object.defineProperty(t,"$volumePanelWrap",{value:e.$container.querySelector(".jessibuca-volume-panel-wrap")}),Object.defineProperty(t,"$volumePanelText",{value:e.$container.querySelector(".jessibuca-volume-panel-text")}),Object.defineProperty(t,"$volumePanel",{value:e.$container.querySelector(".jessibuca-volume-panel")}),Object.defineProperty(t,"$volumeHandle",{value:e.$container.querySelector(".jessibuca-volume-panel-handle")}),Object.defineProperty(t,"$volumeOn",{value:e.$container.querySelector(".jessibuca-icon-audio")}),Object.defineProperty(t,"$volumeOff",{value:e.$container.querySelector(".jessibuca-icon-mute")}),Object.defineProperty(t,"$fullscreen",{value:e.$container.querySelector(".jessibuca-fullscreen")}),Object.defineProperty(t,"$fullscreenExit",{value:e.$container.querySelector(".jessibuca-fullscreen-exit")}),Object.defineProperty(t,"$record",{value:e.$container.querySelector(".jessibuca-record")}),Object.defineProperty(t,"$recordStop",{value:e.$container.querySelector(".jessibuca-record-stop")}),Object.defineProperty(t,"$screenshot",{value:e.$container.querySelector(".jessibuca-screenshot")}),Object.defineProperty(t,"$speed",{value:e.$container.querySelector(".jessibuca-speed")})})(e,this),Ge(e,this),t=this,Object.defineProperty(t,"controlsRect",{get:()=>t.$controls.getBoundingClientRect()}),((e,t)=>{const{events:{proxy:i},debug:o}=e;function r(e){const{bottom:i,height:o}=t.$volumePanel.getBoundingClientRect(),{height:r}=t.$volumeHandle.getBoundingClientRect();return le(i-e.y-r/2,0,o-r/2)/(o-r)}i(window,["click","contextmenu"],(i=>{i.composedPath().indexOf(e.$container)>-1?t.isFocus=!0:t.isFocus=!1})),i(window,"orientationchange",(()=>{setTimeout((()=>{e.resize()}),300)})),i(t.$controls,"click",(e=>{e.stopPropagation()})),i(t.$pause,"click",(t=>{e.pause()})),i(t.$play,"click",(t=>{e.play()})),i(t.$playBig,"click",(t=>{e.play()})),i(t.$volume,"mouseover",(()=>{t.$volumePanelWrap.classList.add("jessibuca-volume-panel-wrap-show")})),i(t.$volume,"mouseout",(()=>{t.$volumePanelWrap.classList.remove("jessibuca-volume-panel-wrap-show")})),i(t.$volumeOn,"click",(i=>{i.stopPropagation(),ue(t.$volumeOn,"display","none"),ue(t.$volumeOff,"display","block"),e.lastVolume=e.volume,e.volume=0})),i(t.$volumeOff,"click",(i=>{i.stopPropagation(),ue(t.$volumeOn,"display","block"),ue(t.$volumeOff,"display","none"),e.volume=e.lastVolume||.5})),i(t.$screenshot,"click",(t=>{t.stopPropagation(),e.video.screenshot()})),i(t.$volumePanel,"click",(t=>{t.stopPropagation(),e.volume=r(t)})),i(t.$volumeHandle,"mousedown",(()=>{t.isVolumeDroging=!0})),i(t.$volumeHandle,"mousemove",(i=>{t.isVolumeDroging&&(e.volume=r(i))})),i(document,"mouseup",(()=>{t.isVolumeDroging&&(t.isVolumeDroging=!1)})),i(t.$record,"click",(t=>{t.stopPropagation(),e.recording=!0})),i(t.$recordStop,"click",(t=>{t.stopPropagation(),e.recording=!1})),i(t.$fullscreen,"click",(t=>{t.stopPropagation(),e.fullscreen=!0})),i(t.$fullscreenExit,"click",(t=>{t.stopPropagation(),e.fullscreen=!1}))})(e,this),e._opt.hotKey&&((e,t)=>{const{events:{proxy:i}}=e,o={};function r(e,t){o[e]?o[e].push(t):o[e]=[t]}r(te,(()=>{e.fullscreen&&(e.fullscreen=!1)})),r(ie,(()=>{e.volume+=.05})),r(oe,(()=>{e.volume-=.05})),i(window,"keydown",(e=>{if(t.isFocus){const t=document.activeElement.tagName.toUpperCase(),i=document.activeElement.getAttribute("contenteditable");if("INPUT"!==t&&"TEXTAREA"!==t&&""!==i&&"true"!==i){const t=o[e.keyCode];t&&(e.preventDefault(),t.forEach((e=>e())))}}}))})(e,this),this.player.debug.log("Control","init")}destroy(){this.$poster&&this.player.$container.removeChild(this.$poster),this.$loading&&this.player.$container.removeChild(this.$loading),this.$controls&&this.player.$container.removeChild(this.$controls),this.player.debug.log("control","destroy")}autoSize(){const e=this.player;e.$container.style.padding="0 0";const t=e.width,i=e.height,o=t/i,r=e.audio.$videoElement.width/e.audio.$videoElement.height;if(o>r){const o=(t-i*r)/2;e.$container.style.padding=`0 ${o}px`}else{const o=(i-t/r)/2;e.$container.style.padding=`${o}px 0`}}}Je(".jessibuca-container{position:relative;width:100%;height:100%;overflow:hidden}.jessibuca-container.jessibuca-fullscreen-web{position:fixed;z-index:9999;left:0;top:0;right:0;bottom:0;width:100%!important;height:100%!important;background:#000}");class ze{static init(){ze.types={avc1:[],avcC:[],hvc1:[],hvcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]};for(let e in ze.types)ze.types.hasOwnProperty(e)&&(ze.types[e]=[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]);let e=ze.constants={};e.FTYP=new Uint8Array([105,115,111,109,0,0,0,1,105,115,111,109,97,118,99,49]),e.STSD_PREFIX=new Uint8Array([0,0,0,0,0,0,0,1]),e.STTS=new Uint8Array([0,0,0,0,0,0,0,0]),e.STSC=e.STCO=e.STTS,e.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),e.HDLR_VIDEO=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),e.HDLR_AUDIO=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),e.DREF=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),e.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),e.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])}static box(e){let t=8,i=null,o=Array.prototype.slice.call(arguments,1),r=o.length;for(let e=0;e>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);let A=8;for(let e=0;e>>24&255,e>>>16&255,e>>>8&255,255&e,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))}static trak(e){return ze.box(ze.types.trak,ze.tkhd(e),ze.mdia(e))}static tkhd(e){let t=e.id,i=e.duration,o=e.presentWidth,r=e.presentHeight;return ze.box(ze.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,o>>>8&255,255&o,0,0,r>>>8&255,255&r,0,0]))}static mdia(e){return ze.box(ze.types.mdia,ze.mdhd(e),ze.hdlr(e),ze.minf(e))}static mdhd(e){let t=e.timescale,i=e.duration;return ze.box(ze.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,85,196,0,0]))}static hdlr(e){let t=null;return t="audio"===e.type?ze.constants.HDLR_AUDIO:ze.constants.HDLR_VIDEO,ze.box(ze.types.hdlr,t)}static minf(e){let t=null;return t="audio"===e.type?ze.box(ze.types.smhd,ze.constants.SMHD):ze.box(ze.types.vmhd,ze.constants.VMHD),ze.box(ze.types.minf,t,ze.dinf(),ze.stbl(e))}static dinf(){return ze.box(ze.types.dinf,ze.box(ze.types.dref,ze.constants.DREF))}static stbl(e){return ze.box(ze.types.stbl,ze.stsd(e),ze.box(ze.types.stts,ze.constants.STTS),ze.box(ze.types.stsc,ze.constants.STSC),ze.box(ze.types.stsz,ze.constants.STSZ),ze.box(ze.types.stco,ze.constants.STCO))}static stsd(e){return"audio"===e.type?ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.mp4a(e)):"avc"===e.videoType?ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.avc1(e)):ze.box(ze.types.stsd,ze.constants.STSD_PREFIX,ze.hvc1(e))}static mp4a(e){let t=e.channelCount,i=e.audioSampleRate,o=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t,0,16,0,0,0,0,i>>>8&255,255&i,0,0]);return ze.box(ze.types.mp4a,o,ze.esds(e))}static esds(e){let t=e.config||[],i=t.length,o=new Uint8Array([0,0,0,0,3,23+i,0,1,0,4,15+i,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([i]).concat(t).concat([6,1,2]));return ze.box(ze.types.esds,o)}static avc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return ze.box(ze.types.avc1,r,ze.box(ze.types.avcC,t))}static hvc1(e){let t=e.avcc;const i=e.codecWidth,o=e.codecHeight;let r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,i>>>8&255,255&i,o>>>8&255,255&o,0,72,0,0,0,72,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return ze.box(ze.types.hvc1,r,ze.box(ze.types.hvcC,t))}static mvex(e){return ze.box(ze.types.mvex,ze.trex(e))}static trex(e){let t=e.id,i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return ze.box(ze.types.trex,i)}static moof(e,t){return ze.box(ze.types.moof,ze.mfhd(e.sequenceNumber),ze.traf(e,t))}static mfhd(e){let t=new Uint8Array([0,0,0,0,e>>>24&255,e>>>16&255,e>>>8&255,255&e]);return ze.box(ze.types.mfhd,t)}static traf(e,t){let i=e.id,o=ze.box(ze.types.tfhd,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),r=ze.box(ze.types.tfdt,new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t])),A=ze.sdtp(e),n=ze.trun(e,A.byteLength+16+16+8+16+8+8);return ze.box(ze.types.traf,o,r,n,A)}static sdtp(e){let t=new Uint8Array(5),i=e.flags;return t[4]=i.isLeading<<6|i.dependsOn<<4|i.isDependedOn<<2|i.hasRedundancy,ze.box(ze.types.sdtp,t)}static trun(e,t){let i=new Uint8Array(28);t+=36,i.set([0,0,15,1,0,0,0,1,t>>>24&255,t>>>16&255,t>>>8&255,255&t],0);let o=e.duration,r=e.size,A=e.flags,n=e.cts;return i.set([o>>>24&255,o>>>16&255,o>>>8&255,255&o,r>>>24&255,r>>>16&255,r>>>8&255,255&r,A.isLeading<<2|A.dependsOn,A.isDependedOn<<6|A.hasRedundancy<<4|A.isNonSync,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n],12),ze.box(ze.types.trun,i)}static mdat(e){return ze.box(ze.types.mdat,e)}}ze.init();class Pe{constructor(e){this.TAG="ExpGolomb",this._buffer=e,this._buffer_index=0,this._total_bytes=e.byteLength,this._total_bits=8*e.byteLength,this._current_word=0,this._current_word_bits_left=0}destroy(){this._buffer=null}_fillCurrentWord(){let e=this._total_bytes-this._buffer_index,t=Math.min(4,e),i=new Uint8Array(4);i.set(this._buffer.subarray(this._buffer_index,this._buffer_index+t)),this._current_word=new DataView(i.buffer).getUint32(0,!1),this._buffer_index+=t,this._current_word_bits_left=8*t}readBits(e){if(e<=this._current_word_bits_left){let t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}let t=this._current_word_bits_left?this._current_word:0;t>>>=32-this._current_word_bits_left;let i=e-this._current_word_bits_left;this._fillCurrentWord();let o=Math.min(i,this._current_word_bits_left),r=this._current_word>>>32-o;return this._current_word<<=o,this._current_word_bits_left-=o,t=t<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()}readUEG(){let e=this._skipLeadingZero();return this.readBits(e+1)-1}readSEG(){let e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)}}class Ye{static _ebsp2rbsp(e){let t=e,i=t.byteLength,o=new Uint8Array(i),r=0;for(let e=0;e=2&&3===t[e]&&0===t[e-1]&&0===t[e-2]||(o[r]=t[e],r++);return new Uint8Array(o.buffer,0,r)}static parseSPS(e){let t=Ye._ebsp2rbsp(e),i=new Pe(t);i.readByte();let o=i.readByte();i.readByte();let r=i.readByte();i.readUEG();let A=Ye.getProfileString(o),n=Ye.getLevelString(r),s=1,a=420,d=[0,420,422,444],c=8;if((100===o||110===o||122===o||244===o||44===o||83===o||86===o||118===o||128===o||138===o||144===o)&&(s=i.readUEG(),3===s&&i.readBits(1),s<=3&&(a=d[s]),c=i.readUEG()+8,i.readUEG(),i.readBits(1),i.readBool())){let e=3!==s?8:12;for(let t=0;t0&&e<16?(v=t[e-1],w=o[e-1]):255===e&&(v=i.readByte()<<8|i.readByte(),w=i.readByte()<<8|i.readByte())}if(i.readBool()&&i.readBool(),i.readBool()&&(i.readBits(4),i.readBool()&&i.readBits(24)),i.readBool()&&(i.readUEG(),i.readUEG()),i.readBool()){let e=i.readBits(32),t=i.readBits(32);E=i.readBool(),B=t,C=2*e,S=B/C}}let R=1;1===v&&1===w||(R=v/w);let k=0,T=0;if(0===s)k=1,T=2-m;else{k=3===s?1:2,T=(1===s?2:1)*(2-m)}let I=16*(h+1),x=16*(p+1)*(2-m);I-=(g+f)*k,x-=(b+y)*T;let D=Math.ceil(I*R);return i.destroy(),i=null,{profile_string:A,level_string:n,bit_depth:c,ref_frames:u,chroma_format:a,chroma_format_string:Ye.getChromaFormatString(a),frame_rate:{fixed:E,fps:S,fps_den:C,fps_num:B},sar_ratio:{width:v,height:w},codec_size:{width:I,height:x},present_size:{width:D,height:x}}}static _skipScalingList(e,t){let i=8,o=8,r=0;for(let A=0;A{this.mediaSourceOpen=!0,this.player.emit(C.mseSourceOpen)})),i(this.mediaSource,"sourceclose",(()=>{this.player.emit(C.mseSourceClose)})),e.debug.log("MediaSource","init")}destroy(){this.stop(),this.bufferList=[],this.mediaSource=null,this.mediaSourceOpen=!1,this.sourceBuffer=null,this.hasInit=!1,this.isInitInfo=!1,this.sequenceNumber=0,this.cacheTrack=null,this.timeInit=!1,this.off(),this.player.debug.log("MediaSource","destroy")}get state(){return this.mediaSource.readyState}get isStateOpen(){return this.state===_}get isStateClosed(){return this.state===$}get isStateEnded(){return this.state===K}get duration(){return this.mediaSource.duration}set duration(e){this.mediaSource.duration=e}decodeVideo(e,t,i){const o=this.player;if(this.hasInit)this._decodeVideo(e,t,i);else if(i&&0===e[1]){const r=15&e[0];if(o.video.updateVideoInfo({encTypeCode:r}),r===F)return void this.emit(k.mediaSourceH265NotSupport);o._times.decodeStart||(o._times.decodeStart=ce()),this._decodeConfigurationRecord(e,t,i,r),this.hasInit=!0}}_doDecode(){const e=this.bufferList.shift();e&&this._decodeVideo(e.payload,e.ts,e.isIframe)}_decodeConfigurationRecord(e,t,i,o){let r=e.slice(5),A={};o===U?A=function(e){const t={},i=new DataView(e.buffer);let o=i.getUint8(0),r=i.getUint8(1);if(i.getUint8(2),i.getUint8(3),1!==o||0===r)return;const A=1+(3&i.getUint8(4));if(3!==A&&4!==A)return;let n=31&i.getUint8(5);if(0===n)return;let s=6;for(let o=0;o1&&(this.removeBuffer(s.buffered.start(0),s.buffered.end(0)),this.timeInit=!1),s.drop&&n-this.cacheTrack.dts>1e3)s.drop=!1,this.cacheTrack={};else if(this.cacheTrack&&n>this.cacheTrack.dts){let e=8+this.cacheTrack.size,i=new Uint8Array(e);i[0]=e>>>24&255,i[1]=e>>>16&255,i[2]=e>>>8&255,i[3]=255&e,i.set(ze.types.mdat,4),i.set(this.cacheTrack.data,8),this.cacheTrack.duration=n-this.cacheTrack.dts;let r=ze.moof(this.cacheTrack,this.cacheTrack.dts),A=new Uint8Array(r.byteLength+i.byteLength);A.set(r,0),A.set(i,r.byteLength),this.appendBuffer(A.buffer),o.handleRender(),o.updateStats({fps:!0,ts:t,buf:o.demux.delay}),o._times.videoStart||(o._times.videoStart=ce(),o.handlePlayToRenderTimes())}else o.debug.log("MediaSource","timeInit set false , cacheTrack = {}"),this.timeInit=!1,this.cacheTrack={};this.cacheTrack.id=1,this.cacheTrack.sequenceNumber=++this.sequenceNumber,this.cacheTrack.size=A,this.cacheTrack.dts=n,this.cacheTrack.cts=0,this.cacheTrack.isKeyframe=i,this.cacheTrack.data=r,this.cacheTrack.flags={isLeading:0,dependsOn:i?2:1,isDependedOn:i?1:0,hasRedundancy:0,isNonSync:i?0:1},this.timeInit||1!==s.buffered.length||(o.debug.log("MediaSource","timeInit set true"),this.timeInit=!0,s.currentTime=s.buffered.end(0)),!this.isInitInfo&&s.videoWidth>0&&s.videoHeight>0&&(o.debug.log("MediaSource",`updateVideoInfo: ${s.videoWidth},${s.videoHeight}`),o.video.updateVideoInfo({width:s.videoWidth,height:s.videoHeight}),o.video.initCanvasViewSize(),this.isInitInfo=!0)}appendBuffer(e){const{debug:t,events:{proxy:i}}=this.player;null===this.sourceBuffer&&(this.sourceBuffer=this.mediaSource.addSourceBuffer(q),i(this.sourceBuffer,"error",(e=>{this.player.emit(C.mseSourceBufferError,e),this.dropSourceBuffer(!0)}))),!1===this.sourceBuffer.updating&&this.isStateOpen?this.sourceBuffer.appendBuffer(e):this.isStateClosed?this.player.emit(C.mseSourceBufferError,"mediaSource is not attached to video or mediaSource is closed"):this.isStateEnded?this.player.emit(C.mseSourceBufferError,"mediaSource is closed"):!0===this.sourceBuffer.updating&&(this.player.emit(C.mseSourceBufferBusy),this.dropSourceBuffer(!0))}stop(){this.isStateOpen&&this.sourceBuffer&&this.sourceBuffer.abort(),this.endOfStream()}dropSourceBuffer(e){const t=this.player.video.$videoElement;this.dropping=e,t.buffered.length>0&&t.buffered.end(0)-t.currentTime>1&&(t.currentTime=t.buffered.end(0))}removeBuffer(e,t){if(this.isStateOpen&&!1===this.sourceBuffer.updating)try{this.sourceBuffer.remove(e,t)}catch(e){console.error(e)}}endOfStream(){this.isStateOpen&&this.mediaSource.endOfStream()}}const Xe=()=>"undefined"!=typeof navigator&&parseFloat((""+(/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))<10&&!window.MSStream,Ze=()=>"wakeLock"in navigator;class qe{constructor(e){if(this.player=e,this.enabled=!1,Ze()){this._wakeLock=null;const e=()=>{null!==this._wakeLock&&"visible"===document.visibilityState&&this.enable()};document.addEventListener("visibilitychange",e),document.addEventListener("fullscreenchange",e)}else Xe()?this.noSleepTimer=null:(this.noSleepVideo=document.createElement("video"),this.noSleepVideo.setAttribute("title","No Sleep"),this.noSleepVideo.setAttribute("playsinline",""),this._addSourceToVideo(this.noSleepVideo,"webm","data:video/webm;base64,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"),this._addSourceToVideo(this.noSleepVideo,"mp4","data:video/mp4;base64,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"),this.noSleepVideo.addEventListener("loadedmetadata",(()=>{this.noSleepVideo.duration<=1?this.noSleepVideo.setAttribute("loop",""):this.noSleepVideo.addEventListener("timeupdate",(()=>{this.noSleepVideo.currentTime>.5&&(this.noSleepVideo.currentTime=Math.random())}))})))}_addSourceToVideo(e,t,i){var o=document.createElement("source");o.src=i,o.type=`video/${t}`,e.appendChild(o)}get isEnabled(){return this.enabled}enable(){const e=this.player.debug;if(Ze())return navigator.wakeLock.request("screen").then((t=>{this._wakeLock=t,this.enabled=!0,e.log("wakeLock","Wake Lock active."),this._wakeLock.addEventListener("release",(()=>{e.log("wakeLock","Wake Lock released.")}))})).catch((t=>{throw this.enabled=!1,e.error("wakeLock",`${t.name}, ${t.message}`),t}));if(Xe())return this.disable(),this.noSleepTimer=window.setInterval((()=>{document.hidden||(window.location.href=window.location.href.split("#")[0],window.setTimeout(window.stop,0))}),15e3),this.enabled=!0,Promise.resolve();return this.noSleepVideo.play().then((e=>(this.enabled=!0,e))).catch((e=>{throw this.enabled=!1,e}))}disable(){const e=this.player.debug;Ze()?(this._wakeLock&&this._wakeLock.release(),this._wakeLock=null):Xe()?this.noSleepTimer&&(e.warn("wakeLock","NoSleep now disabled for older iOS devices."),window.clearInterval(this.noSleepTimer),this.noSleepTimer=null):this.noSleepVideo.pause(),this.enabled=!1}}class Ke extends ve{constructor(e,t){var i;super(),this.$container=e,this._opt=Object.assign({},d,t),this.debug=new re(this),this._opt.useWCS&&(this._opt.useWCS="VideoEncoder"in window),this._opt.useMSE&&(this._opt.useMSE=window.MediaSource&&window.MediaSource.isTypeSupported(q)),this._opt.useMSE?(this._opt.useWCS&&this.debug.log("Player","useWCS set true->false"),this._opt.forceNoOffscreen||this.debug.log("Player","forceNoOffscreen set false->true"),this._opt.useWCS=!1,this._opt.forceNoOffscreen=!0):this._opt.useWCS,this._opt.forceNoOffscreen||("undefined"==typeof OffscreenCanvas?(this._opt.forceNoOffscreen=!0,this._opt.useOffscreen=!1):this._opt.useOffscreen=!0),this._opt.hasControl=this._hasControl(),this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._checkHeartTimeout=null,this._checkLoadingTimeout=null,this._startBpsTime=null,this._isPlayingBeforePageHidden=!1,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0},this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this._videoTimestamp=0,this._audioTimestamp=0,i=this,Object.defineProperty(i,"rect",{get:()=>{const e=i.$container.getBoundingClientRect();return e.width=Math.max(e.width,i.$container.clientWidth),e.height=Math.max(e.height,i.$container.clientHeight),e}}),["bottom","height","left","right","top","width"].forEach((e=>{Object.defineProperty(i,e,{get:()=>i.rect[e]})})),this.events=new Ae(this),this.video=new Be(this),this.audio=new Re(this),this.recorder=new Le(this),this.decoderWorker=new je(this),this.stream=null,this.demux=null,this._opt.useWCS&&(this.webcodecsDecoder=new Qe(this)),this._opt.useMSE&&(this.mseDecoder=new He(this)),this.control=new Ne(this),this.keepScreenOn=new qe(this),(e=>{try{const t=()=>{e.emit(R.fullscreen,e.fullscreen),e.fullscreen?e._opt.useMSE&&e.resize():e.resize()};ne.on("change",t),e.events.destroys.push((()=>{ne.off("change",t)}))}catch(e){}if(e.on(C.decoderWorkerInit,(()=>{e.debug.log("player","has loaded"),e._hasLoaded=!0})),e.on(C.play,(()=>{e.loading=!1})),e.on(C.fullscreen,(t=>{if(t)try{ne.request(e.$container).then((()=>{})).catch((t=>{e.webFullscreen=!0}))}catch(t){e.webFullscreen=!0}else try{ne.exit().then((()=>{})).catch((()=>{e.webFullscreen=!1}))}catch(t){e.webFullscreen=!1}})),e.on(C.webFullscreen,(t=>{if(t){e.$container.classList.add("webmediaplayer-fullscreen-web");const{clientHeight:t,clientWidth:i}=document.body,{clientHeight:o,clientWidth:r}=e.video.$videoElement;if(i/t{e.video.resize()})),e._opt.debug){const t=[C.timeUpdate];Object.keys(C).forEach((i=>{e.on(C[i],(o=>{t.includes(i)||e.debug.log("player events",C[i],o)}))})),Object.keys(k).forEach((t=>{e.on(k[t],(i=>{e.debug.log("player event error",k[t],i)}))}))}})(this),(e=>{const{_opt:t,debug:i,events:{proxy:o}}=e;t.supportDblclickFullscreen&&o(e.$container,"dblclick",(()=>{e.fullscreen=!e.fullscreen})),o(document,"visibilitychange",(()=>{t.hiddenAutoPause&&(i.log("visibilitychange",document.visibilityState,e._isPlayingBeforePageHidden),"visible"===document.visibilityState?e._isPlayingBeforePageHidden&&e.play():(e._isPlayingBeforePageHidden=e.playing,e.playing&&e.pause()))})),o(window,"fullscreenchange",(()=>{null!==e.keepScreenOn&&"visible"===document.visibilityState&&e.enableWakeLock()}))})(this),this._opt.useWCS&&this.debug.log("Player","use WCS"),this._opt.useMSE&&this.debug.log("Player","use MSE"),this._opt.useOffscreen&&this.debug.log("Player","use offscreen"),this.debug.log("Player options",this._opt)}destroy(){this._loading=!1,this._playing=!1,this._hasLoaded=!1,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.video&&(this.video.destroy(),this.video=null),this.audio&&(this.audio.destroy(),this.audio=null),this.stream&&(this.stream.destroy(),this.stream=null),this.recorder&&(this.recorder.destroy(),this.recorder=null),this.control&&(this.control.destroy(),this.control=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.demux&&(this.demux.destroy(),this.demux=null),this.events&&(this.events.destroy(),this.events=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.releaseWakeLock(),this.keepScreenOn=null,this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this.emit("destroy"),this.off(),this.debug.log("play","destroy end")}set fullscreen(e){this.emit(C.fullscreen,e)}get fullscreen(){return document.isFullScreen||document.mozIsFullScreen||document.webkitIsFullScreen||this.webFullscreen}set webFullscreen(e){this.emit(C.webFullscreen,e)}get webFullscreen(){return this.$container.classList.contains("jessibuca-fullscreen-web")}get loaded(){return this._hasLoaded}set playing(e){e&&(this.loading=!1),this.playing!==e&&(this._playing=e,this.emit(C.playing,e),this.emit(C.volumechange,this.volume),e?this.emit(C.play):this.emit(C.pause))}get playing(){return this._playing}get volume(){return this.audio&&this.audio.volume}set volume(e){this.audio.setVolume(e)}set loading(e){this.loading!==e&&(this._loading=e,this.emit(C.loading,this._loading))}get loading(){return this._loading}set recording(e){this.playing&&(e?this.recorder.startRecord():this.recorder.stopRecordAndSave())}get recording(){return this.recorder&&this.recorder.recording}set audioTimestamp(e){null!==e&&(this._audioTimestamp=e)}get audioTimestamp(){return this._audioTimestamp}set videoTimestamp(e){null!==e&&(this._videoTimestamp=e,this._opt.useWCS||this._opt.useMSE||this.audioTimestamp&&this.videoTimestamp&&this.audio.emit(C.videoSyncAudio,{audioTimestamp:this.audioTimestamp,videoTimestamp:this.videoTimestamp,diff:this.audioTimestamp-this.videoTimestamp}))}get videoTimestamp(){return this._videoTimestamp}updateOption(e){this._opt=Object.assign({},this._opt,e)}init(){return new Promise(((e,t)=>{this.stream||(this.stream=new Ie(this)),this.demux||(this.demux=new Oe(this)),this._opt.useWCS&&(this.webcodecsDecoder||(this.webcodecsDecoder=new Qe(this))),this._opt.useMSE&&(this.mseDecoder||(this.mseDecoder=new He(this))),this.decoderWorker?e():(this.decoderWorker=new je(this),this.once(C.decoderWorkerInit,(()=>{e()})))}))}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return i();this.loading=!0,this.playing=!1,this._times.playInitStart=ce(),e||(e=this._opt.url),this._opt.url=e,this.clearCheckHeartTimeout(),this.init().then((()=>{this._times.playStart=ce(),this._opt.isNotMute&&this.mute(!1),this.webcodecsDecoder&&this.webcodecsDecoder.once(k.webcodecsH265NotSupport,(()=>{this.emit(k.webcodecsH265NotSupport),this.emit(C.error,k.webcodecsH265NotSupport)})),this.mseDecoder&&this.mseDecoder.once(k.mediaSourceH265NotSupport,(()=>{this.emit(k.mediaSourceH265NotSupport),this.emit(C.error,k.mediaSourceH265NotSupport)})),this.enableWakeLock(),this.stream.fetchStream(e),this.checkLoadingTimeout(),this.stream.once(k.fetchError,(e=>{i(e)})),this.stream.once(k.websocketError,(e=>{i(e)})),this.stream.once(C.streamSuccess,(()=>{t(),this._times.streamResponse=ce(),this._opt.useMSE&&this.video.play()}))})).catch((e=>{i(e)}))}))}close(){return new Promise(((e,t)=>{this._close().then((()=>{this.video.clearView(),e()}))}))}_close(){return new Promise(((e,t)=>{this.stream&&(this.stream.destroy(),this.stream=null),this.demux&&(this.demux.destroy(),this.demux=null),this.decoderWorker&&(this.decoderWorker.destroy(),this.decoderWorker=null),this.webcodecsDecoder&&(this.webcodecsDecoder.destroy(),this.webcodecsDecoder=null),this.mseDecoder&&(this.mseDecoder.destroy(),this.mseDecoder=null),this.clearCheckHeartTimeout(),this.clearCheckLoadingTimeout(),this.playing=!1,this.loading=!1,this.recording=!1,this.audio.pause(),this.releaseWakeLock(),this.resetStats(),this._audioTimestamp=0,this._videoTimestamp=0,this._times={playInitStart:"",playStart:"",streamStart:"",streamResponse:"",demuxStart:"",decodeStart:"",videoStart:"",playTimestamp:"",streamTimestamp:"",streamResponseTimestamp:"",demuxTimestamp:"",decodeTimestamp:"",videoTimestamp:"",allTimestamp:""},setTimeout((()=>{e()}),0)}))}pause(e){return e?this.close():this._close()}mute(e){this.audio.mute(e)}resize(){this.video.resize()}startRecord(e,t){this.recording||(this.recorder.setFileName(e,t),this.recording=!0)}stopRecordAndSave(){this.recording&&(this.recording=!1)}_hasControl(){let e=!1,t=!1;return Object.keys(this._opt.operateBtns).forEach((e=>{this._opt.operateBtns[e]&&(t=!0)})),(this._opt.showBandwidth||this._opt.text||t)&&(e=!0),e}checkHeart(){this.clearCheckHeartTimeout(),this.checkHeartTimeout()}checkHeartTimeout(){this._checkHeartTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(C.timeout,C.delayTimeout),this.emit(C.delayTimeout)}))}),1e3*this._opt.heartTimeout)}clearCheckHeartTimeout(){this._checkHeartTimeout&&(clearTimeout(this._checkHeartTimeout),this._checkHeartTimeout=null)}checkLoadingTimeout(){this._checkLoadingTimeout=setTimeout((()=>{this.pause(!1).then((()=>{this.emit(C.timeout,C.loadingTimeout),this.emit(C.loadingTimeout)}))}),1e3*this._opt.loadingTimeout)}clearCheckLoadingTimeout(){this._checkLoadingTimeout&&(clearTimeout(this._checkLoadingTimeout),this._checkLoadingTimeout=null)}handleRender(){this.loading&&(this.emit(C.start),this.loading=!1,this.clearCheckLoadingTimeout()),this.playing||(this.playing=!0),this.checkHeart()}updateStats(e){e=e||{},this._startBpsTime||(this._startBpsTime=ce()),ye(e.ts)&&(this._stats.ts=e.ts),ye(e.buf)&&(this._stats.buf=e.buf),e.fps&&(this._stats.fps+=1),e.abps&&(this._stats.abps+=e.abps),e.vbps&&(this._stats.vbps+=e.vbps);const t=ce();t-this._startBpsTime<1e3||(this.emit(C.stats,this._stats),this.emit(C.performance,function(e){let t=0;return e>=24?t=2:e>=15&&(t=1),t}(this._stats.fps)),this._stats.fps=0,this._stats.abps=0,this._stats.vbps=0,this._startBpsTime=t)}resetStats(){this._startBpsTime=null,this._stats={buf:0,fps:0,abps:0,vbps:0,ts:0}}enableWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.enable()}releaseWakeLock(){this._opt.keepScreenOn&&this.keepScreenOn.disable()}handlePlayToRenderTimes(){const e=this._times;e.playTimestamp=e.playStart-e.playInitStart,e.streamTimestamp=e.streamStart-e.playStart,e.streamResponseTimestamp=e.streamResponse-e.streamStart,e.demuxTimestamp=e.demuxStart-e.streamResponse,e.decodeTimestamp=e.decodeStart-e.demuxStart,e.videoTimestamp=e.videoStart-e.decodeStart,e.allTimestamp=e.videoStart-e.playInitStart,this.emit(C.playToRenderTimes,e)}}class _e extends ve{constructor(e){super();let t=e,i=e.container;if("string"==typeof e.container&&(i=document.querySelector(e.container)),!i)throw new Error("Jessibuca need container option");i.classList.add("jessibuca-container"),delete t.container,ye(t.videoBuffer)&&(t.videoBuffer=1e3*Number(t.videoBuffer)),ye(t.timeout)&&(be(t.loadingTimeout)&&(t.loadingTimeout=t.timeout),be(t.heartTimeout)&&(t.heartTimeout=t.timeout)),this._opt=t,this.$container=i,this.href=null,this.events=new Ae(this),this.player=new Ke(i,t),this._bindEvents()}destroy(){this.player.destroy(),this.player=null,this.off()}_bindEvents(){Object.keys(R).forEach((e=>{this.player.on(R[e],(t=>{this.emit(e,t)}))}))}setDebug(e){this.player.updateOption({isDebug:!!e})}mute(){this.player.mute(!0)}cancelMute(){this.player.mute(!1)}setVolume(e){this.player.volume=e}audioResume(){this.player.audio.audioEnabled(!0)}setTimeout(e){e=Number(e),this.player.updateOption({timeout:e,loadingTimeout:e,heartTimeout:e})}setScaleMode(e){let t={isFullResize:!1,isResize:!1};switch(e=Number(e)){case W:t.isFullResize=!1,t.isResize=!1;break;case G:t.isFullResize=!1,t.isResize=!0;break;case J:t.isFullResize=!0,t.isResize=!0}this.player.updateOption(t),this.resize()}pause(){return this.player.pause()}close(){return this._opt.url="",this.player.close()}clearView(){this.player.video.clearView()}play(e){return new Promise(((t,i)=>{if(!e&&!this._opt.url)return this.emit(C.error,k.playError),void i();if(e){if(!this._opt.url)return this._play(e);e===this._opt.url?this.player.playing?t():(this.clearView(),this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))):this.player.pause().then((()=>(this.clearView(),this._play(e)))).catch((()=>{i()}))}else this.player.play(this._opt.url).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))}))}_play(e){return new Promise(((t,i)=>{this._opt.url=e;const o=0===e.indexOf("http"),r=o?n:A,d=o||-1!==e.indexOf(".flv")||this._opt.isFlv?s:a;this.player.updateOption({protocol:r,demuxType:d}),this.player.once(k.mediaSourceH265NotSupport,(()=>{this.close()})),this.player.once(k.webcodecsH265NotSupport,(()=>{this.close()})),this.hasLoaded()?this.player.play(e).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))})):this.player.once(C.decoderWorkerInit,(()=>{this.player.play(e).then((()=>{t()})).catch((()=>{this.player.pause().then((()=>{i()}))}))}))}))}resize(){this.player.resize()}setBufferTime(e){e=Number(e),this.player.updateOption({videoBuffer:1e3*e})}setRotate(e){e=parseInt(e,10);this._opt.rotate!==e&&-1!==[0,90,270].indexOf(e)&&(this.player.updateOption({rotate:e}),this.resize())}hasLoaded(){return this.player.loaded}setKeepScreenOn(){this.player.updateOption({keepScreenOn:!0})}setFullscreen(e){const t=!!e;this.player.fullscreen!==t&&(this.player.fullscreen=t)}screenshot(e,t,i,o){return this.player.video.screenshot(e,t,i,o)}startRecord(e,t){return new Promise(((i,o)=>{this.player.playing?(this.player.startRecord(e,t),i()):o()}))}stopRecordAndSave(){this.player.recording&&this.player.stopRecordAndSave()}isPlaying(){return this.player.playing}isMute(){return this.player.audio.isMute}isRecording(){return this.player.recorder.recording}}return r(_e,"ERROR",k),r(_e,"TIMEOUT",{loadingTimeout:C.loadingTimeout,delayTimeout:C.delayTimeout}),window.Jessibuca=_e,_e})); diff --git a/web_src/static/js/jessibuca/logo.png b/web_src/static/js/jessibuca/logo.png deleted file mode 100644 index 751de2a48fee7f32092859eb72e73ad1868de36c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10620 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 K0F{dy2K*PK+baVA From 3469694ed16de06c22bae68639c045420a352efc Mon Sep 17 00:00:00 2001 From: wangyimeng <421132955@qq.com> Date: Fri, 6 May 2022 12:05:12 +0800 Subject: [PATCH 9/9] 1 --- bootstrap.sh | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 bootstrap.sh diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 00000000..0f3c4c97 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +###################################################### +# Copyright 2019 Pham Ngoc Hoai +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Repo: https://github.com/tyrion9/spring-boot-startup-script +# +######### PARAM ###################################### + +JAVA_OPT=-Xmx1024m +JARFILE=`ls -1r *.jar 2>/dev/null | head -n 1` +PID_FILE=pid.file +RUNNING=N +PWD=`pwd` + +######### DO NOT MODIFY ######## + +if [ -f $PID_FILE ]; then + PID=`cat $PID_FILE` + if [ ! -z "$PID" ] && kill -0 $PID 2>/dev/null; then + RUNNING=Y + fi +fi + +start() +{ + if [ $RUNNING == "Y" ]; then + echo "Application already started" + else + if [ -z "$JARFILE" ] + then + echo "ERROR: jar file not found" + else + nohup java $JAVA_OPT -Djava.security.egd=file:/dev/./urandom -jar $PWD/$JARFILE > nohup.out 2>&1 & + echo $! > $PID_FILE + echo "Application $JARFILE starting..." + tail -f nohup.out + fi + fi +} + +stop() +{ + if [ $RUNNING == "Y" ]; then + kill -9 $PID + rm -f $PID_FILE + echo "Application stopped" + else + echo "Application not running" + fi +} + +restart() +{ + stop + start +} + +case "$1" in + + 'start') + start + ;; + + 'stop') + stop + ;; + + 'restart') + restart + ;; + + *) + echo "Usage: $0 { start | stop | restart }" + exit 1 + ;; +esac +exit 0 +

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