(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/module/Tool/GameTool.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '43bfcJ6/25Fs4fHUE0PeBOX', 'GameTool'); // Script/module/Tool/GameTool.ts "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameTool = void 0; //最大工具类 各种公共方法,以及处理上传,获取后端接口数据 var GameTool = { _startTime: 0, _endTime: 0, _totalTime: 0, //获取userId Authentication: function () { var name = "user_" + cc.fx.GameConfig.GM_INFO.gameId; var data = JSON.parse(localStorage.getItem(name)); if (data == "undifend" || data == null || data == "") { var urlNow = window.location.href; if (!this.containsTrain(urlNow) || !this.isNumber(data.userId)) { var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href; window.location.href = url; } } else { cc.fx.StorageMessage.setStorage(name, data); cc.fx.GameConfig.GM_INFO.userId = parseInt(data.userId); } }, isNumber: function (value) { var result = false; result = typeof value === 'number'; if (result) if (value < 200000) result = false; return result; }, containsTrain: function (str) { return /from=train/i.test(str); }, //埋点上传 setGameData: function () { //GAME_DATA 初始化 每次清零 cc.fx.GameConfig.GAME_DATA = []; cc.fx.GameConfig.GAME_DATA.push(cc.fx.GameConfig.CLICK_DATA); cc.fx.GameConfig.CLICK_init(); var data = cc.fx.GameConfig.GAME_DATA; var matchId = this.getMatchId(); var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "matchId": matchId, "data": data }; console.log("上传数据:", postData); cc.fx.HttpUtil.uploadUserLogData(postData, function () { }); }, //上传排行榜 type为1 setRank: function (data) { //GAME_DATA 初始化 每次清零 var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "type": 1, "totleTimes": data.totleTimes, "accuracy": data.accuracy, "success": cc.fx.GameConfig.GM_INFO.success }; cc.fx.HttpUtil.rankData(1, function () { }, postData); }, //获取排行榜 type为2 getRank: function (data, callback) { var rankLength = data.length; var postData = { "gameId": cc.fx.GameConfig.GM_INFO.gameId, "userId": cc.fx.GameConfig.GM_INFO.userId, "page": 1, "pageSize": rankLength }; //回调进getRankData cc.fx.HttpUtil.rankData(2, function (data) { callback(data); }, postData); }, //获取matchId 用于上传每次点击数据里面记录id方便查询 getMatchId: function () { var matchId = cc.sys.localStorage.getItem("matchId"); var tempId = matchId; if (matchId == "undifend" || matchId == null) { matchId = this.setMatchId(); } else { if (this.containsNanana(matchId) == true) { matchId = this.setMatchId(); } else { var char = parseInt(tempId.substring(10, tempId.length)); if (cc.fx.GameConfig.GM_INFO.level == 1) { char += 1; matchId = tempId.slice(0, 10) + char + ""; if (this.containsNanana(matchId)) matchId = this.setMatchId(); cc.fx.GameConfig.GM_INFO.matchId = matchId; cc.sys.localStorage.setItem("matchId", matchId); } } } if (this.containsNanana(matchId) == true) { matchId = this.setMatchId(); } return matchId; }, //检测matchId 如果有缓存以前的nanana数据清除 containsNanana: function (str) { return /na/i.test(str); }, //重新设置MatchId setMatchId: function () { // 定义包含可用字符的字符集 var characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; // 创建一个数组以保存随机字符 var uuidArray = []; // 循环10次 生成10位的UUID for (var i = 0; i < 10; i++) { // 生成随机索引,范围是字符集的长度 var randomIndex = Math.floor(Math.random() * characters.length); // 从字符集中获取随机字符 var randomChar = characters.charAt(randomIndex); // 将字符添加到数组中 uuidArray.push(randomChar); } var data = uuidArray.join('') + 1 + ""; cc.sys.localStorage.setItem("matchNumber", 1); cc.sys.localStorage.setItem("matchId", data); cc.fx.GameConfig.GM_INFO.matchId = data; return data; }, //截取名字 subName: function (name, length) { if (name.length > length) { name = name.substring(0, length) + "..."; } return name; }, //设置头像 setPic: function (node, pic) { node.active = false; var url = pic; setTimeout(function () { fetch(url) .then(function (response) { return response.headers.get('Content-Length'); }) .then(function (errNo) { if (errNo == "5093") { node.active = true; } }) .catch(function (error) { // console.error('Error fetching X-Info:', error); }); }, 100); cc.assetManager.loadRemote(url, { ext: '.png' }, function (err, texture) { if (texture) { node.active = true; node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture); } else { // console.log(err,texture) } }); }, //第一个参数把目标带进来处理,第二个参数为名字长度,不同场景不同需求 //名字4短,小排行,名字6长,大排行 getRankData: function (data, target, nameLength) { target.listData = data.data.list; target.selfData = data.data.info; var rankData = []; var self = false; cc.fx.GameTool.setPic(target.selfNode.getChildByName("pic").getChildByName("icon"), target.selfData.pic); for (var i = 0; i <= target.listData.length - 1; i++) { rankData.push({ rank: (i + 1), name: target.listData[i].nickName, total: target.listData[i].accuracy, time: target.listData[i].totleTimes, pic: target.listData[i].pic }); if (cc.fx.GameConfig.GM_INFO.userId == target.listData[i].userId) { self = true; target.rankNumber = i; target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = (i + 1) + ""; } if (i == (target.listData.length - 1) && self == false) { target.rankNumber = i; target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = "99+"; } } var name = cc.fx.GameTool.subName(target.selfData.nickName, nameLength); target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = name; target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.accuracy + "%"; var timeTemp = cc.fx.GameTool.getTimeShenNong(target.selfData.totleTimes); target.selfNode.getChildByName("timeLab").getComponent(cc.Label).string = timeTemp + ""; switch (target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string) { case "1": target.selfNode.getChildByName("rank").getChildByName("one").active = true; break; case "2": target.selfNode.getChildByName("rank").getChildByName("two").active = true; break; case "3": target.selfNode.getChildByName("rank").getChildByName("three").active = true; break; } // 大排行 if (nameLength == 6) { target.rankList.setData(rankData); target.selfNode.opacity = 255; if (target.selfData.totalSunCount == 0) target.selfNode.opacity = 0; } }, getSeedRandom: function (min, max) { console.log("随机数:", cc.fx.GameConfig.GM_INFO.currSeed); max = max || 1; min = min || 0; cc.fx.GameConfig.GM_INFO.currSeed = (cc.fx.GameConfig.GM_INFO.currSeed * 9301 + 49297) % 233280; var rnd = cc.fx.GameConfig.GM_INFO.currSeed / 233280.0; var tmp = min + rnd * (max - min); return parseInt(tmp); }, //获取关卡配置的那个关卡数 getCustom: function (type) { var custom = cc.fx.StorageMessage.getStorage(cc.fx.storageType.storageTypeCustom); if (custom == "undifend" || custom == null || custom == "") { this.setCustom(); } else { cc.fx.GameConfig.GM_INFO_SET("custom", custom[0]); if (custom[0] != 0 || type == true) { custom.shift(); if (custom.length == 0) { this.setCustom(); } else cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, custom); } } }, //本地没有存储到配置,或者配置用完,重新创建配置 setCustom: function () { var arrayLength = cc.fx.GameConfig.LEVEL_INFO.length; var arrayList = []; for (var i = 1; i < arrayLength; i++) { arrayList.push(i); } arrayList.sort(function () { return Math.random() - 0.5; }); arrayList.unshift(0); cc.fx.GameConfig.GM_INFO_SET("custom", arrayList[0]); cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, arrayList); }, getFoodName: function (food) { var name = "葡萄"; switch (food) { case "baishao": name = "白芍"; break; case "jingjie": name = "荆芥"; break; case "renshen": name = "人参"; break; case "danshen": name = "丹参"; break; case "danggui": name = "当归"; break; case "gouqi": name = "枸杞"; break; case "mudan": name = "牡丹"; break; case "mulan": name = "木兰"; break; case "pugongying": name = "蒲公英"; break; case "moli": name = "茉莉"; break; case "jinju": name = "金桔"; break; case "dazao": name = "大枣"; break; case "lizi": name = "李子"; break; case "lizhi": name = "荔枝"; break; case "taozi": name = "桃子"; break; case "putao": name = "葡萄"; break; case "muchai": name = "木柴"; break; case "ganjiang": name = "干姜"; break; case "zhuye": name = "竹叶"; break; case "longyan": name = "龙眼"; break; case "chixiaodou": name = "赤小豆"; break; case "gancao": name = "甘草"; break; case "cha": name = "茶"; break; } return name; }, getSetScreenResolutionFlag: function () { var size = cc.winSize; var width = size.width; var height = size.height; if ((height / width) > (16.2 / 9)) return false; return true; }, //判断全面屏适配 setFit: function (canvas) { var flag = cc.fx.GameTool.getSetScreenResolutionFlag(); if (flag) { // console.log("不是全面屏"); } else { // console.log("是全面屏"); } return flag; }, //获取游戏信息 getGameInfo: function (node) { var jg = false; return jg; }, //设置游戏信息 setGameInfo: function (pd) { }, //打字机效果 typingAni: function (label, text, cb, target) { var self = target; var html = ''; var arr = text.split(''); var len = arr.length; var step = 0; self.func = function () { html += arr[step]; label.string = html; if (++step == len) { self.unschedule(self.func); cb && cb(); } }; self.schedule(self.func, 0.1, cc.macro.REPEAT_FOREVER, 0); }, //输入秒,返回需要展示时间格式 getTimeMargin: function (second) { var total = 0; total = second; var hour = 0; hour = parseInt((total / 3600) + ""); //计算整数小时数 var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数 var min = parseInt((afterHour / 60) + ""); //计算整数分 var m = "" + min; if (min < 10) m = "0" + min; var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数 var miao = afterMin + ""; if (afterMin < 10) miao = "0" + afterMin; return m + ':' + miao; }, //输入秒,返回需要展示时间格式 getTimeShenNong: function (second) { second = parseInt(second / 1000 + ""); var total = 0; total = second; var min = 0; if (total > 60) { min = parseInt((total / 60) + ""); //计算整数分 } var m = min + "'"; var afterMin = total - min * 60; //取得算出分后剩余的秒数 var miao = afterMin + "''"; return m + miao; }, //获取时间戳 getTime: function () { var timestamp = new Date().getTime(); return timestamp; }, pushLister: function () { }, removeAllLister: function () { }, }; exports.GameTool = GameTool; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxtb2R1bGVcXFRvb2xcXEdhbWVUb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLCtCQUErQjtBQUMvQixJQUFJLFFBQVEsR0FBRztJQUNYLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVU7SUFDVixjQUFjO1FBQ1YsSUFBSSxJQUFJLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBRyxJQUFJLElBQUksVUFBVSxJQUFJLElBQUksSUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBQztZQUM5QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNsQyxJQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFDO2dCQUMxRCxJQUFJLEdBQUcsR0FBRyw4RUFBOEUsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUN2RyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7YUFDOUI7U0FDSjthQUNHO1lBQ0EsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFD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QzNCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQTtJQUNuQixDQUFDO0lBRUQsT0FBTztJQUNQLE9BQU87UUFDSCxJQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxVQUFVLEVBQUM7SUFFWCxDQUFDO0lBQ0QsZUFBZSxFQUFDO0lBRWhCLENBQUM7Q0FFSixDQUFDO0FBQ08sNEJBQVEiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLy/mnIDlpKflt6XlhbfnsbsgIOWQhOenjeWFrOWFseaWueazle+8jOS7peWPiuWkhOeQhuS4iuS8oO+8jOiOt+WPluWQjuerr+aOpeWPo+aVsOaNrlxyXG52YXIgR2FtZVRvb2wgPSB7XHJcbiAgICBfc3RhcnRUaW1lOiAwLFxyXG4gICAgX2VuZFRpbWU6IDAsXHJcbiAgICBfdG90YWxUaW1lOiAwLFxyXG4gICAgLy/ojrflj5Z1c2VySWRcclxuICAgIEF1dGhlbnRpY2F0aW9uKCl7XHJcbiAgICAgICAgbGV0IG5hbWUgPSBcInVzZXJfXCIgKyBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uZ2FtZUlkO1xyXG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XHJcbiAgICAgICAgaWYoZGF0YSA9PSBcInVuZGlmZW5kXCIgfHwgZGF0YT09bnVsbCB8fCBkYXRhID09IFwiXCIpe1xyXG4gICAgICAgICAgICB2YXIgdXJsTm93ID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmNvbnRhaW5zVHJhaW4odXJsTm93KSB8fCAhdGhpcy5pc051bWJlcihkYXRhLnVzZXJJZCkpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IFwiaHR0cHM6Ly9hcGkuc3Bhcmt1cy5jbi9hcGkvdXNlci9hdXRoL2xvZ2luP2RvbWFpbj1odWkzMjU3OVdkWVBzZ1lxJmNhbGxiYWNrPVwiK2xvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBjYy5meC5TdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKG5hbWUsZGF0YSk7XHJcbiAgICAgICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQgPSBwYXJzZUludChkYXRhLnVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBpc051bWJlcih2YWx1ZSkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICByZXN1bHQgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xyXG4gICAgICAgIGlmKHJlc3VsdCkgaWYodmFsdWUgPCAyMDAwMDApIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGNvbnRhaW5zVHJhaW4oc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIC9mcm9tPXRyYWluL2kudGVzdChzdHIpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy/ln4vngrnkuIrkvKBcclxuICAgIHNldEdhbWVEYXRhKCl7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg5Yid5aeL5YyWIOavj+asoea4hembtlxyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR0FNRV9EQVRBID0gW107XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HQU1FX0RBVEEucHVzaChjYy5meC5HYW1lQ29uZmlnLkNMSUNLX0RBVEEpO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuQ0xJQ0tfaW5pdCgpO1xyXG4gICAgICAgIGxldCBkYXRhID0gY2MuZnguR2FtZUNvbmZpZy5HQU1FX0RBVEE7XHJcbiAgICAgICAgbGV0IG1hdGNoSWQgPSB0aGlzLmdldE1hdGNoSWQoKTtcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcIm1hdGNoSWRcIjptYXRjaElkLFxyXG4gICAgICAgICAgICBcImRhdGFcIjogZGF0YVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5pWw5o2uOlwiLHBvc3REYXRhKTtcclxuICAgICAgICBjYy5meC5IdHRwVXRpbC51cGxvYWRVc2VyTG9nRGF0YShwb3N0RGF0YSxmdW5jdGlvbigpe30pXHJcbiAgICB9LFxyXG4gICAgLy/kuIrkvKDmjpLooYzmppwgIHR5cGXkuLoxXHJcbiAgICBzZXRSYW5rKGRhdGEpe1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOWIneWni+WMliDmr4/mrKHmuIXpm7ZcclxuICAgICAgICBsZXQgcG9zdERhdGEgPSB7XHJcbiAgICAgICAgICAgIFwiZ2FtZUlkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjpjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkLFxyXG4gICAgICAgICAgICBcInR5cGVcIjoxLFxyXG4gICAgICAgICAgICBcInRvdGxlVGltZXNcIjogZGF0YS50b3RsZVRpbWVzLFxyXG4gICAgICAgICAgICBcImFjY3VyYWN5XCI6IGRhdGEuYWNjdXJhY3ksXHJcbiAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8uc3VjY2Vzc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY2MuZnguSHR0cFV0aWwucmFua0RhdGEoMSxmdW5jdGlvbigpe30scG9zdERhdGEpO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+W5o6S6KGM5qacIHR5cGXkuLoyXHJcbiAgICBnZXRSYW5rKGRhdGEsY2FsbGJhY2spe1xyXG4gICAgICAgIGxldCByYW5rTGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgbGV0IHBvc3REYXRhID0ge1xyXG4gICAgICAgICAgICBcImdhbWVJZFwiOmNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5nYW1lSWQsXHJcbiAgICAgICAgICAgIFwidXNlcklkXCI6Y2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCxcclxuICAgICAgICAgICAgXCJwYWdlXCI6MSxcclxuICAgICAgICAgICAgXCJwYWdlU2l6ZVwiOnJhbmtMZW5ndGhcclxuICAgICAgICB9OyBcclxuICAgICAgICAvL+Wbnuiwg+i/m2dldFJhbmtEYXRhXHJcbiAgICAgICAgY2MuZnguSHR0cFV0aWwucmFua0RhdGEoMixkYXRhID0+e2NhbGxiYWNrKGRhdGEpfSxwb3N0RGF0YSk7XHJcbiAgICB9LFxyXG4gICAgLy/ojrflj5ZtYXRjaElkICDnlKjkuo7kuIrkvKDmr4/mrKHngrnlh7vmlbDmja7ph4zpnaLorrDlvZVpZOaWueS+v+afpeivolxyXG4gICAgZ2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICBsZXQgbWF0Y2hJZCA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1hdGNoSWRcIik7XHJcbiAgICAgICAgbGV0IHRlbXBJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgaWYobWF0Y2hJZCA9PSBcInVuZGlmZW5kXCIgfHwgbWF0Y2hJZD09bnVsbCl7XHJcbiAgICAgICAgICAgIG1hdGNoSWQgPSAgdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbnNOYW5hbmEobWF0Y2hJZCkgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hhciA9IHBhcnNlSW50KHRlbXBJZC5zdWJzdHJpbmcoMTAsdGVtcElkLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgaWYoY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmxldmVsID09IDEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYXIgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaElkICA9IHRlbXBJZC5zbGljZSgwLCAxMCkgKyBjaGFyICsgXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKG1hdGNoSWQpKSBtYXRjaElkID0gdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLm1hdGNoSWQgPSBtYXRjaElkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoSWRcIixtYXRjaElkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5jb250YWluc05hbmFuYShtYXRjaElkKSA9PSB0cnVlKXtcclxuICAgICAgICAgICAgbWF0Y2hJZCA9ICB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoSWQ7XHJcbiAgICB9LFxyXG4gICAgLy/mo4DmtYttYXRjaElkIOWmguaenOaciee8k+WtmOS7peWJjeeahG5hbmFuYeaVsOaNrua4hemZpFxyXG4gICAgY29udGFpbnNOYW5hbmEoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIC9uYS9pLnRlc3Qoc3RyKTtcclxuICAgIH0sXHJcbiAgICAvL+mHjeaWsOiuvue9rk1hdGNoSWRcclxuICAgIHNldE1hdGNoSWQgKCl7XHJcbiAgICAgICAgLy8g5a6a5LmJ5YyF5ZCr5Y+v55So5a2X56ym55qE5a2X56ym6ZuGXHJcbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSc7XHJcbiAgICAgICAgLy8g5Yib5bu65LiA5Liq5pWw57uE5Lul5L+d5a2Y6ZqP5py65a2X56ymXHJcbiAgICAgICAgY29uc3QgdXVpZEFycmF5ID0gW107XHJcbiAgICAgICAgLy8g5b6q546vMTDmrKEg55Sf5oiQMTDkvY3nmoRVVUlEXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDnlJ/miJDpmo/mnLrntKLlvJXvvIzojIPlm7TmmK/lrZfnrKbpm4bnmoTplb/luqZcclxuICAgICAgICAgICAgY29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIC8vIOS7juWtl+espumbhuS4reiOt+WPlumaj+acuuWtl+esplxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21DaGFyID0gY2hhcmFjdGVycy5jaGFyQXQocmFuZG9tSW5kZXgpO1xyXG4gICAgICAgICAgICAvLyDlsIblrZfnrKbmt7vliqDliLDmlbDnu4TkuK1cclxuICAgICAgICAgICAgdXVpZEFycmF5LnB1c2gocmFuZG9tQ2hhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBkYXRhID0gIHV1aWRBcnJheS5qb2luKCcnKSArIDEgKyBcIlwiO1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoTnVtYmVyXCIsMSk7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hJZFwiLGRhdGEpO1xyXG4gICAgICAgIGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5tYXRjaElkID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0sXHJcbiAgICAvL+aIquWPluWQjeWtl1xyXG4gICAgc3ViTmFtZShuYW1lLGxlbmd0aCl7XHJcbiAgICAgICAgaWYobmFtZS5sZW5ndGggPiBsZW5ndGgpe1xyXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCxsZW5ndGgpICsgXCIuLi5cIlxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH0sXHJcbiAgICAvL+iuvue9ruWktOWDj1xyXG4gICAgc2V0UGljKG5vZGUscGljKXtcclxuICAgICAgICBub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB1cmwgPSBwaWM7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGZldGNoKHVybClcclxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihlcnJObyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihlcnJObyA9PSBcIjUwOTNcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgWC1JbmZvOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICBjYy5hc3NldE1hbmFnZXIubG9hZFJlbW90ZSh1cmwsIHtleHQ6Jy5wbmcnfSwoZXJyLCB0ZXh0dXJlOmNjLlRleHR1cmUyRCkgPT4ge1xyXG4gICAgICAgICAgICBpZih0ZXh0dXJlKXtcclxuICAgICAgICAgICAgICAgIG5vZGUuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSBuZXcgY2MuU3ByaXRlRnJhbWUodGV4dHVyZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVycix0ZXh0dXJlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0sXHJcbiAgICAvL+esrOS4gOS4quWPguaVsOaKiuebruagh+W4pui/m+adpeWkhOeQhu+8jOesrOS6jOS4quWPguaVsOS4uuWQjeWtl+mVv+W6pu+8jOS4jeWQjOWcuuaZr+S4jeWQjOmcgOaxglxyXG4gICAgLy/lkI3lrZc055+t77yM5bCP5o6S6KGM77yM5ZCN5a2XNumVv++8jOWkp+aOkuihjFxyXG4gICAgZ2V0UmFua0RhdGEoZGF0YSx0YXJnZXQsbmFtZUxlbmd0aCl7XHJcbiAgICAgICAgdGFyZ2V0Lmxpc3REYXRhID0gZGF0YS5kYXRhLmxpc3Q7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZEYXRhID0gZGF0YS5kYXRhLmluZm87XHJcbiAgICAgICAgbGV0IHJhbmtEYXRhID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSBmYWxzZTtcclxuICAgICAgICAgY2MuZnguR2FtZVRvb2wuc2V0UGljKHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInBpY1wiKS5nZXRDaGlsZEJ5TmFtZShcImljb25cIiksdGFyZ2V0LnNlbGZEYXRhLnBpYyk7XHJcbiAgICAgICAgZm9yKGxldCBpPTA7aTw9dGFyZ2V0Lmxpc3REYXRhLmxlbmd0aC0xO2krKyl7XHJcbiAgICAgICAgICAgIHJhbmtEYXRhLnB1c2goe3Jhbms6KGkrMSksIG5hbWU6dGFyZ2V0Lmxpc3REYXRhW2ldLm5pY2tOYW1lLCB0b3RhbDp0YXJnZXQubGlzdERhdGFbaV0uYWNjdXJhY3ksdGltZTp0YXJnZXQubGlzdERhdGFbaV0udG90bGVUaW1lcywgcGljOnRhcmdldC5saXN0RGF0YVtpXS5waWN9KTtcclxuICAgICAgICAgICAgaWYoY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCA9PSB0YXJnZXQubGlzdERhdGFbaV0udXNlcklkKXtcclxuICAgICAgICAgICAgICAgIHNlbGYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhbmtOdW1iZXIgPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9KGkrMSkgKyBcIlwiOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihpID09ICh0YXJnZXQubGlzdERhdGEubGVuZ3RoLTEpICYmIHNlbGYgPT0gZmFsc2Upe1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnJhbmtOdW1iZXIgPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua0xhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IFwiOTkrXCI7IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuYW1lID0gY2MuZnguR2FtZVRvb2wuc3ViTmFtZSh0YXJnZXQuc2VsZkRhdGEubmlja05hbWUsbmFtZUxlbmd0aCk7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwibmFtZUxhYlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IG5hbWU7XHJcbiAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwidG90YWxMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0YXJnZXQuc2VsZkRhdGEuYWNjdXJhY3kgKyBcIiVcIjtcclxuICAgICAgICBsZXQgdGltZVRlbXAgPSBjYy5meC5HYW1lVG9vbC5nZXRUaW1lU2hlbk5vbmcodGFyZ2V0LnNlbGZEYXRhLnRvdGxlVGltZXMpO1xyXG4gICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInRpbWVMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0aW1lVGVtcCArIFwiXCI7XHJcbiAgICAgICAgc3dpdGNoKHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInJhbmtMYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcpe1xyXG4gICAgICAgICAgICBjYXNlIFwiMVwiOlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLmdldENoaWxkQnlOYW1lKFwicmFua1wiKS5nZXRDaGlsZEJ5TmFtZShcIm9uZVwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCIyXCI6XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2VsZk5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJyYW5rXCIpLmdldENoaWxkQnlOYW1lKFwidHdvXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIjNcIjpcclxuICAgICAgICAgICAgICAgIHRhcmdldC5zZWxmTm9kZS5nZXRDaGlsZEJ5TmFtZShcInJhbmtcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0aHJlZVwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIOWkp+aOkuihjFxyXG4gICAgICAgIGlmKG5hbWVMZW5ndGggPT0gNil7XHJcbiAgICAgICAgICAgIHRhcmdldC5yYW5rTGlzdC5zZXREYXRhKHJhbmtEYXRhKTtcclxuICAgICAgICAgICAgdGFyZ2V0LnNlbGZOb2RlLm9wYWNpdHkgPSAyNTU7XHJcbiAgICAgICAgICAgIGlmKHRhcmdldC5zZWxmRGF0YS50b3RhbFN1bkNvdW50ID09IDApIHRhcmdldC5zZWxmTm9kZS5vcGFjaXR5ID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFNlZWRSYW5kb206IGZ1bmN0aW9uIChtaW4sIG1heCkgey8v5YyF5ZCrbWluIOS4jeWMheWQq21heFxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi6ZqP5py65pWwOlwiLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5jdXJyU2VlZCk7XHJcbiAgICAgICAgbWF4ID0gbWF4IHx8IDE7XHJcbiAgICAgICAgbWluID0gbWluIHx8IDA7XHJcbiAgICAgICAgY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmN1cnJTZWVkID0gKGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5jdXJyU2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XHJcbiAgICAgICAgbGV0IHJuZCA9IGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy5jdXJyU2VlZCAgLyAyMzMyODAuMDtcclxuICAgICAgICBsZXQgdG1wID0gbWluICsgcm5kICogKG1heCAtIG1pbik7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRtcCk7XHJcbiAgICB9LFxyXG4gICAgLy/ojrflj5blhbPljaHphY3nva7nmoTpgqPkuKrlhbPljaHmlbBcclxuICAgIGdldEN1c3RvbSh0eXBlKXtcclxuICAgICAgICBsZXQgY3VzdG9tID0gY2MuZnguU3RvcmFnZU1lc3NhZ2UuZ2V0U3RvcmFnZShjYy5meC5zdG9yYWdlVHlwZS5zdG9yYWdlVHlwZUN1c3RvbSk7XHJcbiAgICAgICAgaWYoY3VzdG9tID09IFwidW5kaWZlbmRcIiB8fCBjdXN0b209PW51bGwgfHwgY3VzdG9tID09IFwiXCIpe1xyXG4gICAgICAgICAgICB0aGlzLnNldEN1c3RvbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk9fU0VUKFwiY3VzdG9tXCIsY3VzdG9tWzBdKTtcclxuICAgICAgICAgICAgaWYoY3VzdG9tWzBdICE9IDAgfHwgdHlwZSA9PSAgdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICBjdXN0b20uc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGlmKGN1c3RvbS5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDdXN0b20oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgY2MuZnguU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShjYy5meC5zdG9yYWdlVHlwZS5zdG9yYWdlVHlwZUN1c3RvbSxjdXN0b20pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8v5pys5Zyw5rKh5pyJ5a2Y5YKo5Yiw6YWN572u77yM5oiW6ICF6YWN572u55So5a6M77yM6YeN5paw5Yib5bu66YWN572uXHJcbiAgICBzZXRDdXN0b20oKXtcclxuICAgICAgICBsZXQgYXJyYXlMZW5ndGggPSBjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk8ubGVuZ3RoO1xyXG4gICAgICAgIGxldCBhcnJheUxpc3QgPSBbXTtcclxuICAgICAgICBmb3IobGV0IGk9MTsgaTxhcnJheUxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICBhcnJheUxpc3QucHVzaChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXlMaXN0LnNvcnQoKCkgPT4gTWF0aC5yYW5kb20oKSAtIDAuNSk7XHJcbiAgICAgICAgYXJyYXlMaXN0LnVuc2hpZnQoMClcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk9fU0VUKFwiY3VzdG9tXCIsYXJyYXlMaXN0WzBdKTtcclxuICAgICAgICBjYy5meC5TdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKGNjLmZ4LnN0b3JhZ2VUeXBlLnN0b3JhZ2VUeXBlQ3VzdG9tLGFycmF5TGlzdCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEZvb2ROYW1lKGZvb2Qpe1xyXG4gICAgICAgIHZhciBuYW1lID0gXCLokaHokIRcIjtcclxuICAgICAgICBzd2l0Y2goZm9vZCl7XHJcbiAgICAgICAgICAgIGNhc2UgXCJiYWlzaGFvXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLnmb3oio1cIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiamluZ2ppZVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi6I2G6IqlXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInJlbnNoZW5cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuS6uuWPglwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkYW5zaGVuXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLkuLnlj4JcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGFuZ2d1aVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5b2T5b2SXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImdvdXFpXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLmnrjmnZ5cIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibXVkYW5cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIueJoeS4uVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtdWxhblwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5pyo5YWwXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInB1Z29uZ3lpbmdcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuiSsuWFrOiLsVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJtb2xpXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLojInojolcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiamluanVcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIumHkeahlFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkYXphb1wiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi5aSn5p6jXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImxpemlcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuadjuWtkFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXpoaVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi6I2U5p6dXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInRhb3ppXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLmoYPlrZBcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInB1dGFvXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLokaHokIRcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwibXVjaGFpXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLmnKjmn7RcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ2FuamlhbmdcIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIuW5suWnnFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ6aHV5ZVwiOlxyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwi56u55Y+2XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImxvbmd5YW5cIjpcclxuICAgICAgICAgICAgICAgIG5hbWUgPSBcIum+meecvFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjaGl4aWFvZG91XCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLotaTlsI/osYZcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZ2FuY2FvXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLnlJjojYlcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiY2hhXCI6XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCLojLZcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmFtZTtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2l6ZSA9IGNjLndpblNpemU7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKChoZWlnaHQgLyB3aWR0aCkgPiAoMTYuMiAvIDkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG4gICAgLy/liKTmlq3lhajpnaLlsY/pgILphY1cclxuICAgIHNldEZpdDogZnVuY3Rpb24gKGNhbnZhcykge1xyXG4gICAgICAgIGxldCBmbGFnID0gIGNjLmZ4LkdhbWVUb29sLmdldFNldFNjcmVlblJlc29sdXRpb25GbGFnKCk7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICBcdC8vIGNvbnNvbGUubG9nKFwi5LiN5piv5YWo6Z2i5bGPXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgXHQvLyBjb25zb2xlLmxvZyhcIuaYr+WFqOmdouWxj1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9LFxyXG4gICAgLy/ojrflj5bmuLjmiI/kv6Hmga9cclxuICAgIGdldEdhbWVJbmZvOiBmdW5jdGlvbihub2RlKXtcclxuICAgICAgICB2YXIgamcgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gamc7XHJcbiAgICB9LFxyXG4gICAgLy/orr7nva7muLjmiI/kv6Hmga9cclxuICAgIHNldEdhbWVJbmZvOiBmdW5jdGlvbihwZCl7XHJcbiAgIFxyXG4gICAgfSxcclxuXHJcbiAgICAvL+aJk+Wtl+acuuaViOaenFxyXG4gICAgdHlwaW5nQW5pKGxhYmVsLHRleHQsY2IsdGFyZ2V0KXtcclxuICAgICAgICB2YXIgc2VsZiA9IHRhcmdldDtcclxuICAgICAgICB2YXIgaHRtbCA9ICcnO1xyXG4gICAgICAgIHZhciBhcnIgPSB0ZXh0LnNwbGl0KCcnKTtcclxuICAgICAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcclxuICAgICAgICB2YXIgc3RlcCA9IDA7XHJcbiAgICAgICAgc2VsZi5mdW5jID0gKCk9PntcclxuICAgICAgICAgICAgaHRtbCArPSBhcnJbc3RlcF07XHJcbiAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IGh0bWw7XHJcbiAgICAgICAgICAgIGlmICgrK3N0ZXAgPT0gbGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVuc2NoZWR1bGUoc2VsZi5mdW5jKTtcclxuICAgICAgICAgICAgICAgIGNiICYmIGNiKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zY2hlZHVsZShzZWxmLmZ1bmMsMC4xLCBjYy5tYWNyby5SRVBFQVRfRk9SRVZFUiwgMClcclxuICAgIH0sXHJcblxyXG4gICAgLy/ovpPlhaXnp5Is6L+U5Zue6ZyA6KaB5bGV56S65pe26Ze05qC85byPXHJcbiAgICBnZXRUaW1lTWFyZ2luOihzZWNvbmQpID0+IHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRvdGFsID0gc2Vjb25kO1xyXG4gICAgICAgIGxldCBob3VyID0gMDtcclxuICAgICAgICBob3VyID0gcGFyc2VJbnQoKHRvdGFsIC8gMzYwMCkgKyBcIlwiKTsvL+iuoeeul+aVtOaVsOWwj+aXtuaVsFxyXG4gICAgICAgIGxldCBhZnRlckhvdXIgPSB0b3RhbCAtIGhvdXIgKiA2MCAqIDYwOy8v5Y+W5b6X566X5Ye65bCP5pe25pWw5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KChhZnRlckhvdXIgLyA2MCkrXCJcIik7Ly/orqHnrpfmlbTmlbDliIZcclxuICAgICAgICBsZXQgbSA9IFwiXCIgKyBtaW47ICBcclxuICAgICAgICBpZihtaW4gPCAxMCkgbSA9IFwiMFwiK21pbjtcclxuICAgICAgICBsZXQgYWZ0ZXJNaW4gPSB0b3RhbCAtIGhvdXIgKiA2MCAqIDYwIC0gbWluICogNjA7Ly/lj5blvpfnrpflh7rliIblkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWlhbyA9IGFmdGVyTWluICsgXCJcIjtcclxuICAgICAgICBpZihhZnRlck1pbiA8IDEwKSBtaWFvID0gXCIwXCIgKyBhZnRlck1pbjtcclxuICAgICAgICByZXR1cm4gbSArICc6JyArIG1pYW9cclxuICAgIH0sXHJcblxyXG4gICAgLy/ovpPlhaXnp5Is6L+U5Zue6ZyA6KaB5bGV56S65pe26Ze05qC85byPXHJcbiAgICBnZXRUaW1lU2hlbk5vbmc6KHNlY29uZCkgPT4ge1xyXG4gICAgICAgIHNlY29uZCA9IHBhcnNlSW50KHNlY29uZC8xMDAwK1wiXCIpO1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IG1pbiA9IDA7XHJcbiAgICAgICAgaWYodG90YWwgPiA2MCl7XHJcbiAgICAgICAgICAgIG1pbiA9IHBhcnNlSW50KCh0b3RhbCAvIDYwKStcIlwiKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbSA9ICBtaW4gKyBcIidcIjsgIFxyXG5cclxuICAgICAgICBsZXQgYWZ0ZXJNaW4gPSB0b3RhbCAtIG1pbiAqIDYwOy8v5Y+W5b6X566X5Ye65YiG5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgbGV0IG1pYW8gPSBhZnRlck1pbiArIFwiJydcIjtcclxuICAgICAgICByZXR1cm4gbSArIG1pYW9cclxuICAgIH0sXHJcblxyXG4gICAgLy/ojrflj5bml7bpl7TmiLNcclxuICAgIGdldFRpbWUoKXtcclxuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICByZXR1cm4gdGltZXN0YW1wO1xyXG4gICAgfSxcclxuICAgIHB1c2hMaXN0ZXI6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIFxyXG4gICAgfSxcclxuICAgIHJlbW92ZUFsbExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG5cclxufTtcclxuZXhwb3J0IHsgR2FtZVRvb2wgfTsiXX0=