FlyUp/temp/quick-scripts/dst/assets/Script/tool/GameTool.js
2024-11-05 11:56:29 +08:00

375 lines
51 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/Script/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, '35a73aTEIBAZoXKp/xutwzU', 'GameTool');
// Script/tool/GameTool.ts
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GameTool = void 0;
var GameData_1 = require("../GameData");
var HttpUtil_1 = require("../crypto/HttpUtil");
var Storage_1 = require("./Storage");
//最大工具类
var GameTool = {
_startTime: 0,
_endTime: 0,
_totalTime: 0,
getSeedRandom: function (min, max) {
max = max || 1;
min = min || 0;
GameData_1.default._instance.GM_INFO.currSeed = (GameData_1.default._instance.GM_INFO.currSeed * 9301 + 49297) % 233280;
var rnd = GameData_1.default._instance.GM_INFO.currSeed / 233280.0;
var tmp = min + rnd * (max - min);
return Math.floor(tmp);
},
//获取userId
Authentication: function () {
var name = "user_" + GameData_1.default._instance.GM_INFO.gameId;
var data = JSON.parse(localStorage.getItem(name));
if (data == "undifend" || data == null || data == "") {
var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" +
encodeURIComponent(location.href);
window.location.href = url;
}
else {
if (!this.isNumber(data.userId)) {
var url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" +
encodeURIComponent(location.href);
console.log("链接不合法", url);
window.location.href = url;
}
else {
Storage_1.StorageMessage.setStorage(name, data);
GameData_1.default._instance.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;
},
//埋点上传
setGameData: function () {
//GAME_DATA 初始化 每次清零
GameData_1.default._instance.GAME_DATA = [];
GameData_1.default._instance.GAME_DATA.push(GameData_1.default._instance.CLICK_DATA);
//GAME_DATA 赋值后 CLICK_DATA清零
GameData_1.default._instance.CLICK_init();
var matchId = this.getMatchId(GameData_1.default._instance.GAME_DATA[0].round);
var postData = {
"matchId": matchId,
"scode": GameData_1.default._instance.GM_INFO.scode,
"data": GameData_1.default._instance.GAME_DATA
};
console.log("上传数据:", postData);
HttpUtil_1.default.uploadUserLogData(postData, function () { });
},
//本地缓存供利伟获取scode,gameId,当日游戏训练是否完成
setLocalStorage: function () {
var today = new Date().toLocaleDateString();
var name = "success_" + today + "_" + GameData_1.default._instance.GM_INFO.scode + "_" + GameData_1.default._instance.GM_INFO.gameId;
localStorage.setItem(name, JSON.stringify({ success: true }));
},
setRank: function () {
//GAME_DATA 初始化 每次清零
var postData = {
"type": 1,
"round": "1",
"score": GameData_1.default._instance.GM_INFO.score,
"success": GameData_1.default._instance.GM_INFO.success
};
HttpUtil_1.default.rankData(1, function () { }, postData);
},
//获取matchId 用于上传每次点击数据里面记录id方便查询
getMatchId: function (level) {
var matchId = cc.sys.localStorage.getItem("matchId");
if (matchId == "undifend" || matchId == null) {
matchId = this.setMatchId();
}
else {
if (this.containsNanana(matchId) == true) {
matchId = this.setMatchId();
}
else {
var char = parseInt(cc.sys.localStorage.getItem("matchNumber"));
if (level == 1) {
char += 1;
cc.sys.localStorage.setItem("matchNumber", char);
}
matchId = matchId.slice(0, 10) + char + "";
GameData_1.default._instance.GM_INFO.matchId = matchId;
cc.sys.localStorage.setItem("matchId", matchId);
}
}
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);
GameData_1.default._instance.GM_INFO.matchId = data;
return data;
},
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 () {
var flag = GameTool.getSetScreenResolutionFlag();
if (flag) {
// console.log("不是全面屏");
}
else {
// console.log("是全面屏");
}
return flag;
},
getTip: function () {
var index = Math.floor(Math.random() * 4) + 1;
switch (index) {
case 1: {
return "根据小球的位置,合理晃动手机,确保小球不掉出木板。";
}
case 2: {
return "根据小球位置控制晃动幅度,过大或过小都不是个好选择。";
}
case 3: {
return "不要被天上掉落的障碍吓到,有时候它反而会帮你保持平衡。";
}
case 4: {
return "尝试着顶开掉落的障碍,是个很酷的玩法。";
}
}
},
beginTiming: function () {
this._startTime = new Date().getTime();
},
endTiming: function () {
this._endTime = new Date().getTime();
// this._totalTime = endTime - this._startTime;
},
//如果是判断时常的游戏 调用此方法
updateScoreTime: function () {
var endTime = new Date().getTime();
var tempTime = endTime - this._startTime;
if (tempTime < 0 || tempTime > 500) {
tempTime = Math.round(cc.director.getAnimationInterval() * 1000);
}
this._endTime += tempTime / 1000;
this._totalTime = this._endTime.toFixed(2);
GameData_1.default._instance.GM_INFO.currScore = this._totalTime;
this._startTime = endTime;
},
//倒计时调用此方法
countDown: function () {
this._endTime = new Date().getTime();
this._totalTime = Math.floor((this._endTime - this._startTime) / 1000);
GameData_1.default._instance.GM_INFO.remainingTime = GameData_1.default._instance.GM_INFO.totalTime - this._totalTime;
},
getGameInfo: function (node) {
var jg = false;
return jg;
},
//根据服务器数据重置所需要所有数据
reset: function () {
// console.log("本地数据丢失,重新启动游戏");
cc.director.loadScene('LoadScene');
},
setGameInfo: function (pd) {
},
//输入秒,返回需要展示时间格式
getTimeMargin: function (second) {
var total = second;
var hour = Math.floor(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
var min = Math.floor(afterHour / 60); //计算整数分
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
return '剩余:' + hour + ':' + min + ':' + afterMin;
},
getTimeMargin2: function (second) {
var total = second;
var min = null;
var afterMin = null;
var hour = Math.floor(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
min = Math.floor(afterHour / 60); //计算整数分
if (min < 10)
min = "0" + min;
afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
if (afterMin < 10)
afterMin = "0" + afterMin;
return '剩余:' + min + ':' + afterMin;
},
//将时间转换为59:23
getTime: function (time) {
var label = "";
var number_1 = null;
var number_2 = null;
number_1 = Math.floor(time / 60);
number_2 = time - number_1 * 60;
if (number_1 < 10) {
number_1 = "0" + number_1;
}
if (number_2 < 10) {
number_2 = "0" + number_2;
}
label = number_1 + ":" + number_2;
return label;
},
//number 为传进来的数值,type为最多显示几位数
getNumber: function (number, type) {
// console.log(type,"需要转换的数字为:",number);
var count = 1000;
var place = type - 3;
if (number > Math.pow(count, 8) * Math.pow(10, place)) {
if (number / Math.pow(count, 8) < 100)
number = Math.floor(number / Math.pow(count, 8) * 10) / 10 + "S";
else
number = Math.floor(number / Math.pow(count, 8)) + "S";
}
else if (number > Math.pow(count, 7) * Math.pow(10, place)) {
if (number / Math.pow(count, 7) < 100)
number = Math.floor(number / Math.pow(count, 7) * 10) / 10 + "s";
else
number = Math.floor(number / Math.pow(count, 7)) + "s";
}
else if (number > Math.pow(count, 6) * Math.pow(10, place)) {
if (number / Math.pow(count, 6) < 100)
number = Math.floor(number / Math.pow(count, 6) * 10) / 10 + "Q";
else
number = Math.floor(number / Math.pow(count, 6)) + "Q";
}
else if (number > Math.pow(count, 5) * Math.pow(10, place)) {
if (number / Math.pow(count, 5) < 100)
number = Math.floor(number / Math.pow(count, 5) * 10) / 10 + "q";
else
number = Math.floor(number / Math.pow(count, 5)) + "q";
}
else if (number > Math.pow(count, 4) * Math.pow(10, place)) {
if (number / Math.pow(count, 4) < 100)
number = Math.floor(number / Math.pow(count, 4) * 10) / 10 + "t";
else
number = Math.floor(number / Math.pow(count, 4)) + "t";
}
else if (number > Math.pow(count, 3) * Math.pow(10, place)) {
if (number / Math.pow(count, 3) < 100)
number = Math.floor(number / Math.pow(count, 3) * 10) / 10 + "b";
else
number = Math.floor(number / Math.pow(count, 3)) + "b";
}
else if (number > Math.pow(count, 2) * Math.pow(10, place)) {
if (number / Math.pow(count, 2) < 100)
number = Math.floor(number / Math.pow(count, 2) * 10) / 10 + "m";
else
number = Math.floor(number / Math.pow(count, 2)) + "m";
}
else if (number > Math.pow(count, 1) * Math.pow(10, place)) {
if (number / Math.pow(count, 1) < 100) {
number = Math.floor(number / Math.pow(count, 1) * 10) / 10 + "k";
}
else
number = Math.floor(number / Math.pow(count, 1)) + "k";
}
else {
number = Math.floor(number / Math.pow(count, 0)) + "";
}
// console.log("结果为"+type+"位数",number);
return number;
},
begainTiming: function () {
this._startTime = new Date().getTime();
},
endTiming2: function () {
var endTime = new Date().getTime();
this._endTime = endTime;
this._totalTime = endTime - this._startTime;
},
getScoreTime: function () {
var endTime = new Date().getTime();
var tempTime = endTime - this._startTime;
if (tempTime < 0 || tempTime > 500) {
tempTime = Math.round(cc.director.getAnimationInterval() * 1000);
}
GameData_1.default._instance.GM_INFO.currScore += tempTime;
this._startTime = endTime;
},
getFormatTime: function (time) {
var date = new Date();
date.setTime(time);
var ms = date.getMilliseconds();
// let msString = date.getMilliseconds();
var msString = null;
var secondString = null;
var minString = null;
msString = Math.floor(ms / 10) % 100;
secondString = date.getSeconds();
minString = date.getMinutes();
if (msString < 10) {
msString = "0" + msString;
}
if (secondString < 10) {
secondString = "0" + secondString;
}
secondString = secondString + ":";
if (minString < 10) {
minString = "0" + minString;
}
minString = minString + ":";
return minString + secondString + msString;
},
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFx0b29sXFxHYW1lVG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBbUM7QUFDbkMsK0NBQTBDO0FBQzFDLHFDQUEyQztBQUMzQyxPQUFPO0FBQ1AsSUFBSSxRQUFRLEdBQUc7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFFBQVEsRUFBRSxDQUFDO0lBQ1gsVUFBVSxFQUFFLENBQUM7SUFDYixhQUFhLEVBQUUsVUFBVSxHQUFHLEVBQUUsR0FBRztRQUM3QixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNmLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2Ysa0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLGtCQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNwRyxJQUFJLEdBQUcsR0FBRyxrQkFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6RCxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQ0QsVUFBVTtJQUNWLGNBQWM7UUFDVixJQUFJLElBQUksR0FBRyxPQUFPLEdBQUcsa0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFHLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxJQUFFLElBQUksSUFBSSxJQUFJLElBQUksRUFB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QyxHQUFHLEdBQUcsQ0FBQztRQUNyQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFO1lBQ2YsUUFBUSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7U0FDN0I7UUFDRCxJQUFJLFlBQVksR0FBRyxFQUFFLEVBQUU7WUFDbkIsWUFBWSxHQUFHLEdBQUcsR0FBRyxZQUFZLENBQUM7U0FDckM7UUFDRCxZQUFZLEdBQUcsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUVsQyxJQUFJLFNBQVMsR0FBRyxFQUFFLEVBQUU7WUFDaEIsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7U0FDL0I7UUFDRCxTQUFTLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUM1QixPQUFPLFNBQVMsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBRS9DLENBQUM7SUFDRCxVQUFVLEVBQUM7SUFFWCxDQUFDO0lBQ0QsZUFBZSxFQUFDO0lBRWhCLENBQUM7Q0FFSixDQUFDO0FBQ08sNEJBQVEiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR2FtZURhdGEgZnJvbSBcIi4uL0dhbWVEYXRhXCI7XHJcbmltcG9ydCBIdHRwVXRpbCBmcm9tIFwiLi4vY3J5cHRvL0h0dHBVdGlsXCI7XHJcbmltcG9ydCB7IFN0b3JhZ2VNZXNzYWdlIH0gZnJvbSBcIi4vU3RvcmFnZVwiO1xyXG4vL+acgOWkp+W3peWFt+exu1xyXG52YXIgR2FtZVRvb2wgPSB7XHJcbiAgICBfc3RhcnRUaW1lOiAwLFxyXG4gICAgX2VuZFRpbWU6IDAsXHJcbiAgICBfdG90YWxUaW1lOiAwLFxyXG4gICAgZ2V0U2VlZFJhbmRvbTogZnVuY3Rpb24gKG1pbiwgbWF4KSB7Ly/ljIXlkKttaW4g5LiN5YyF5ZCrbWF4XHJcbiAgICAgICAgbWF4ID0gbWF4IHx8IDE7XHJcbiAgICAgICAgbWluID0gbWluIHx8IDA7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uY3VyclNlZWQgPSAoR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uY3VyclNlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xyXG4gICAgICAgIGxldCBybmQgPSBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5jdXJyU2VlZCAvIDIzMzI4MC4wO1xyXG4gICAgICAgIGxldCB0bXAgPSBtaW4gKyBybmQgKiAobWF4IC0gbWluKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0bXApO1xyXG4gICAgfSxcclxuICAgIC8v6I635Y+WdXNlcklkXHJcbiAgICBBdXRoZW50aWNhdGlvbigpe1xyXG4gICAgICAgIGxldCBuYW1lID0gXCJ1c2VyX1wiICsgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uZ2FtZUlkO1xyXG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XHJcbiAgICAgICAgaWYoZGF0YSA9PSBcInVuZGlmZW5kXCIgfHwgZGF0YT09bnVsbCB8fCBkYXRhID09IFwiXCIpe1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gXCJodHRwczovL2FwaS5zcGFya3VzLmNuL2FwaS91c2VyL2F1dGgvbG9naW4/ZG9tYWluPWh1aTMyNTc5V2RZUHNnWXEmY2FsbGJhY2s9XCIrIFxyXG4gICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZik7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBpZighdGhpcy5pc051bWJlcihkYXRhLnVzZXJJZCkpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IFwiaHR0cHM6Ly9hcGkuc3Bhcmt1cy5jbi9hcGkvdXNlci9hdXRoL2xvZ2luP2RvbWFpbj1odWkzMjU3OVdkWVBzZ1lxJmNhbGxiYWNrPVwiK1xyXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLpk77mjqXkuI3lkIjms5VcIix1cmwpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UobmFtZSxkYXRhKTtcclxuICAgICAgICAgICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnVzZXJJZCA9IHBhcnNlSW50KGRhdGEudXNlcklkKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGlzTnVtYmVyKHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIHJlc3VsdCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XHJcbiAgICAgICAgaWYocmVzdWx0KSBpZih2YWx1ZSA8IDIwMDAwMCkgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgLy/ln4vngrnkuIrkvKBcclxuICAgIHNldEdhbWVEYXRhKCl7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg5Yid5aeL5YyWIOavj+asoea4hembtlxyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HQU1FX0RBVEEgPSBbXTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR0FNRV9EQVRBLnB1c2goR2FtZURhdGEuX2luc3RhbmNlLkNMSUNLX0RBVEEpO1xyXG4gICAgICAgIC8vR0FNRV9EQVRBIOi1i+WAvOWQjiBDTElDS19EQVRB5riF6Zu2IFxyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5DTElDS19pbml0KCk7XHJcblxyXG4gICAgICAgIGxldCBtYXRjaElkID0gdGhpcy5nZXRNYXRjaElkKEdhbWVEYXRhLl9pbnN0YW5jZS5HQU1FX0RBVEFbMF0ucm91bmQpO1xyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJtYXRjaElkXCI6bWF0Y2hJZCxcclxuICAgICAgICAgICAgXCJzY29kZVwiOkdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnNjb2RlLFxyXG4gICAgICAgICAgICBcImRhdGFcIjogR2FtZURhdGEuX2luc3RhbmNlLkdBTUVfREFUQVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDmlbDmja46XCIscG9zdERhdGEpO1xyXG4gICAgICAgIEh0dHBVdGlsLnVwbG9hZFVzZXJMb2dEYXRhKHBvc3REYXRhLGZ1bmN0aW9uKCl7fSlcclxuICAgIH0sXHJcbiAgICAvL+acrOWcsOe8k+WtmO+8jOS+m+WIqeS8n+iOt+WPlnNjb2RlLGdhbWVJZCzlvZPml6XmuLjmiI/orq3nu4PmmK/lkKblrozmiJBcclxuICAgIHNldExvY2FsU3RvcmFnZSgpe1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuICAgICAgICB2YXIgbmFtZSA9IGBzdWNjZXNzXyR7dG9kYXl9XyR7R2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uc2NvZGV9XyR7R2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uZ2FtZUlkfWBcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeSh7c3VjY2Vzczp0cnVlfSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRSYW5rKCl7XHJcbiAgICAgICAgLy9HQU1FX0RBVEEg5Yid5aeL5YyWIOavj+asoea4hembtlxyXG4gICAgICAgIGxldCBwb3N0RGF0YSA9IHtcclxuICAgICAgICAgICAgXCJ0eXBlXCI6MSxcclxuICAgICAgICAgICAgXCJyb3VuZFwiOlwiMVwiLFxyXG4gICAgICAgICAgICBcInNjb3JlXCI6IEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnNjb3JlLFxyXG4gICAgICAgICAgICBcInN1Y2Nlc3NcIjogR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uc3VjY2Vzc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgSHR0cFV0aWwucmFua0RhdGEoMSxmdW5jdGlvbigpe30scG9zdERhdGEpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPlm1hdGNoSWQgIOeUqOS6juS4iuS8oOavj+asoeeCueWHu+aVsOaNrumHjOmdouiusOW9lWlk5pa55L6/5p+l6K+iXHJcbiAgICBnZXRNYXRjaElkIChsZXZlbCl7XHJcbiAgICAgICAgbGV0IG1hdGNoSWQgPSBjYy5zeXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJtYXRjaElkXCIpO1xyXG4gICAgICAgIGlmKG1hdGNoSWQgPT0gXCJ1bmRpZmVuZFwiIHx8IG1hdGNoSWQ9PW51bGwpe1xyXG4gICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvbnRhaW5zTmFuYW5hKG1hdGNoSWQpID09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hJZCA9ICB0aGlzLnNldE1hdGNoSWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoYXIgID0gcGFyc2VJbnQoY2Muc3lzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWF0Y2hOdW1iZXJcIikpO1xyXG4gICAgICAgICAgICAgICAgaWYobGV2ZWwgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoTnVtYmVyXCIsY2hhcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBtYXRjaElkICA9IG1hdGNoSWQuc2xpY2UoMCwgMTApICsgY2hhciArIFwiXCI7XHJcbiAgICAgICAgICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5tYXRjaElkID0gbWF0Y2hJZDtcclxuICAgICAgICAgICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoSWRcIixtYXRjaElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWF0Y2hJZDtcclxuICAgIH0sXHJcbiAgICAvL+ajgOa1i21hdGNoSWQg5aaC5p6c5pyJ57yT5a2Y5Lul5YmN55qEbmFuYW5h5pWw5o2u5riF6ZmkXHJcbiAgICBjb250YWluc05hbmFuYShzdHIpIHtcclxuICAgICAgICByZXR1cm4gL25hL2kudGVzdChzdHIpO1xyXG4gICAgfSxcclxuICAgIC8v6YeN5paw6K6+572uTWF0Y2hJZFxyXG4gICAgc2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICAvLyDlrprkuYnljIXlkKvlj6/nlKjlrZfnrKbnmoTlrZfnrKbpm4ZcclxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5JztcclxuICAgICAgICAvLyDliJvlu7rkuIDkuKrmlbDnu4Tku6Xkv53lrZjpmo/mnLrlrZfnrKZcclxuICAgICAgICBjb25zdCB1dWlkQXJyYXkgPSBbXTtcclxuICAgICAgICAvLyDlvqrnjq8xMOasoSDnlJ/miJAxMOS9jeeahFVVSURcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIOeUn+aIkOmaj+acuue0ouW8le+8jOiMg+WbtOaYr+Wtl+espumbhueahOmVv+W6plxyXG4gICAgICAgICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgLy8g5LuO5a2X56ym6ZuG5Lit6I635Y+W6ZqP5py65a2X56ymXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUNoYXIgPSBjaGFyYWN0ZXJzLmNoYXJBdChyYW5kb21JbmRleCk7XHJcbiAgICAgICAgICAgIC8vIOWwhuWtl+espua3u+WKoOWIsOaVsOe7hOS4rVxyXG4gICAgICAgICAgICB1dWlkQXJyYXkucHVzaChyYW5kb21DaGFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGEgPSAgdXVpZEFycmF5LmpvaW4oJycpICsgMSArIFwiXCI7XHJcbiAgICAgICAgY2Muc3lzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibWF0Y2hOdW1iZXJcIiwxKTtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaElkXCIsZGF0YSk7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubWF0Y2hJZCA9IGRhdGE7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgICBnZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzaXplID0gY2Mud2luU2l6ZTtcclxuICAgICAgICBsZXQgd2lkdGggPSBzaXplLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBzaXplLmhlaWdodDtcclxuICAgICAgICBpZiAoKGhlaWdodCAvIHdpZHRoKSA+ICgxNi4yIC8gOSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcbiAgICAvL+WIpOaWreWFqOmdouWxj+mAgumFjVxyXG4gICAgc2V0Rml0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGZsYWcgPSBHYW1lVG9vbC5nZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZygpO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgXHQvLyBjb25zb2xlLmxvZyhcIuS4jeaYr+WFqOmdouWxj1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLmmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRUaXA6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0KSArIDE7XHJcbiAgICAgICAgc3dpdGNoIChpbmRleCkge1xyXG4gICAgICAgICAgICBjYXNlIDE6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIuagueaNruWwj+eQg+eahOS9jee9ru+8jOWQiOeQhuaZg+WKqOaJi+acuu+8jOehruS/neWwj+eQg+S4jeaOieWHuuacqOadv+OAglwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAyOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCLmoLnmja7lsI/nkIPkvY3nva7mjqfliLbmmYPliqjluYXluqbvvIzov4flpKfmiJbov4flsI/pg73kuI3mmK/kuKrlpb3pgInmi6njgIJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMzoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwi5LiN6KaB6KKr5aSp5LiK5o6J6JC955qE6Zqc56KN5ZCT5Yiw77yM5pyJ5pe25YCZ5a6D5Y+N6ICM5Lya5biu5L2g5L+d5oyB5bmz6KGh44CCXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDQ6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIuWwneivleedgOmhtuW8gOaOieiQveeahOmanOeije+8jOaYr+S4quW+iOmFt+eahOeOqeazleOAglwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGJlZ2luVGltaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGVuZFRpbWluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAvLyB0aGlzLl90b3RhbFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xyXG4gICAgfSxcclxuICAgIC8v5aaC5p6c5piv5Yik5pat5pe25bi455qE5ri45oiPIOiwg+eUqOatpOaWueazlVxyXG4gICAgdXBkYXRlU2NvcmVUaW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICBsZXQgdGVtcFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xyXG4gICAgICAgIGlmICh0ZW1wVGltZSA8IDAgfHwgdGVtcFRpbWUgPiA1MDApIHtcclxuICAgICAgICAgICAgdGVtcFRpbWUgPSBNYXRoLnJvdW5kKGNjLmRpcmVjdG9yLmdldEFuaW1hdGlvbkludGVydmFsKCkgKiAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZW5kVGltZSArPSB0ZW1wVGltZSAvIDEwMDA7XHJcbiAgICAgICAgdGhpcy5fdG90YWxUaW1lID0gdGhpcy5fZW5kVGltZS50b0ZpeGVkKDIpO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmN1cnJTY29yZSA9IHRoaXMuX3RvdGFsVGltZTtcclxuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgfSxcclxuICAgIC8v5YCS6K6h5pe26LCD55So5q2k5pa55rOVXHJcbiAgICBjb3VudERvd246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9lbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgdGhpcy5fdG90YWxUaW1lID0gTWF0aC5mbG9vcigodGhpcy5fZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZSkgLyAxMDAwKTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5yZW1haW5pbmdUaW1lID0gR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8udG90YWxUaW1lIC0gdGhpcy5fdG90YWxUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRHYW1lSW5mbzogZnVuY3Rpb24obm9kZSl7XHJcbiAgICAgICAgdmFyIGpnID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGpnO1xyXG4gICAgfSxcclxuICAgIC8v5qC55o2u5pyN5Yqh5Zmo5pWw5o2u6YeN572u5omA6ZyA6KaB5omA5pyJ5pWw5o2uXHJcbiAgICByZXNldDogZnVuY3Rpb24oKXtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuacrOWcsOaVsOaNruS4ouWksSzph43mlrDlkK/liqjmuLjmiI9cIik7XHJcbiAgICAgICAgY2MuZGlyZWN0b3IubG9hZFNjZW5lKCdMb2FkU2NlbmUnKTtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0R2FtZUluZm86IGZ1bmN0aW9uKHBkKXtcclxuICAgXHJcbiAgICB9LFxyXG4gICAgLy/ovpPlhaXnp5Is6L+U5Zue6ZyA6KaB5bGV56S65pe26Ze05qC85byPXHJcbiAgICBnZXRUaW1lTWFyZ2luOihzZWNvbmQpID0+IHtcclxuICAgICAgICBsZXQgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IGhvdXIgPSBNYXRoLmZsb29yKHRvdGFsIC8gKDYwICogNjApKTsvL+iuoeeul+aVtOaVsOWwj+aXtuaVsFxyXG4gICAgICAgIGxldCBhZnRlckhvdXIgPSB0b3RhbCAtIGhvdXIgKiA2MCAqIDYwOy8v5Y+W5b6X566X5Ye65bCP5pe25pWw5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgbGV0IG1pbiA9IE1hdGguZmxvb3IoYWZ0ZXJIb3VyIC8gNjApOy8v6K6h566X5pW05pWw5YiGXHJcbiAgICAgICAgbGV0IGFmdGVyTWluID0gdG90YWwgLSBob3VyICogNjAgKiA2MCAtIG1pbiAqIDYwOy8v5Y+W5b6X566X5Ye65YiG5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgcmV0dXJuICfliankvZk6JyArIGhvdXIgKyAnOicgKyBtaW4gKyAnOicgKyBhZnRlck1pblxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRUaW1lTWFyZ2luMjooc2Vjb25kKSA9PiB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gc2Vjb25kO1xyXG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IGhvdXIgPSBNYXRoLmZsb29yKHRvdGFsIC8gKDYwICogNjApKTsvL+iuoeeul+aVtOaVsOWwj+aXtuaVsFxyXG4gICAgICAgIGxldCBhZnRlckhvdXIgPSB0b3RhbCAtIGhvdXIgKiA2MCAqIDYwOy8v5Y+W5b6X566X5Ye65bCP5pe25pWw5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgbWluID0gTWF0aC5mbG9vcihhZnRlckhvdXIgLyA2MCk7Ly/orqHnrpfmlbTmlbDliIZcclxuICAgICAgICBpZihtaW4gPCAxMCkgbWluID0gXCIwXCIrbWluO1xyXG4gICAgICAgIGFmdGVyTWluID0gdG90YWwgLSBob3VyICogNjAgKiA2MCAtIG1pbiAqIDYwOy8v5Y+W5b6X566X5Ye65YiG5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgaWYoYWZ0ZXJNaW4gPCAxMCkgYWZ0ZXJNaW4gPSBcIjBcIiArIGFmdGVyTWluO1xyXG4gICAgICAgIHJldHVybiAn5Ymp5L2ZOicgICsgbWluICsgJzonICsgYWZ0ZXJNaW5cclxuICAgIH0sXHJcbiAgICAvL+WwhuaXtumXtOi9rOaNouS4ujU5OjIzXHJcbiAgICBnZXRUaW1lOiBmdW5jdGlvbih0aW1lKXtcclxuICAgICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG4gICAgICAgIHZhciBudW1iZXJfMSA9IG51bGw7XHJcbiAgICAgICAgdmFyIG51bWJlcl8yID0gbnVsbDtcclxuICAgICAgICBudW1iZXJfMSA9IE1hdGguZmxvb3IodGltZS82MClcclxuICAgICAgICBudW1iZXJfMiA9IHRpbWUtbnVtYmVyXzEqNjA7XHJcbiAgICAgICAgaWYobnVtYmVyXzEgPCAxMCl7XHJcbiAgICAgICAgICAgIG51bWJlcl8xID0gXCIwXCIrbnVtYmVyXzE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG51bWJlcl8yIDwgMTApe1xyXG4gICAgICAgICAgICBudW1iZXJfMiA9IFwiMFwiK251bWJlcl8yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYWJlbCA9IG51bWJlcl8xICsgXCI6XCIgKyBudW1iZXJfMjtcclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9LFxyXG4gICAgLy9udW1iZXIg5Li65Lyg6L+b5p2l55qE5pWw5YC8LHR5cGXkuLrmnIDlpJrmmL7npLrlh6DkvY3mlbBcclxuICAgIGdldE51bWJlcjogZnVuY3Rpb24obnVtYmVyLHR5cGUpe1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHR5cGUsXCLpnIDopoHovazmjaLnmoTmlbDlrZfkuLo6XCIsbnVtYmVyKTtcclxuICAgICAgICB2YXIgY291bnQgPSAxMDAwO1xyXG4gICAgICAgIHZhciBwbGFjZSA9IHR5cGUgLSAzO1xyXG4gICAgICAgIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDgpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCw4KSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDgpKjEwKS8xMCtcIlNcIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsOCkpK1wiU1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDcpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCw3KSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDcpKjEwKS8xMCtcInNcIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsNykpK1wic1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDYpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCw2KSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDYpKjEwKS8xMCtcIlFcIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsNikpK1wiUVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDUpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCw1KSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDUpKjEwKS8xMCtcInFcIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsNSkpK1wicVwiO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw0KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNCkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCw0KSoxMCkvMTArXCJ0XCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDQpKStcInRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCwzKSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsMykgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCwzKSoxMCkvMTArXCJiXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDMpKStcImJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCwyKSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsMikgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBNYXRoLmZsb29yKG51bWJlci9NYXRoLnBvdyhjb3VudCwyKSoxMCkvMTArXCJtXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDIpKStcIm1cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCwxKSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsMSkgPCAxMDApe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsMSkqMTApLzEwK1wia1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IE1hdGguZmxvb3IobnVtYmVyL01hdGgucG93KGNvdW50LDEpKStcImtcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgbnVtYmVyID0gTWF0aC5mbG9vcihudW1iZXIvTWF0aC5wb3coY291bnQsMCkpK1wiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi57uT5p6c5Li6XCIrdHlwZStcIuS9jeaVsFwiLG51bWJlcik7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlcjtcclxuICAgIH0sXHJcblxyXG4gICAgYmVnYWluVGltaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGVuZFRpbWluZzI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XHJcbiAgICB9LFxyXG4gICAgZ2V0U2NvcmVUaW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICBsZXQgdGVtcFRpbWUgPSBlbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lO1xyXG4gICAgICAgIGlmICh0ZW1wVGltZSA8IDAgfHwgdGVtcFRpbWUgPiA1MDApIHtcclxuICAgICAgICAgICAgdGVtcFRpbWUgPSBNYXRoLnJvdW5kKGNjLmRpcmVjdG9yLmdldEFuaW1hdGlvbkludGVydmFsKCkgKiAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uY3VyclNjb3JlICs9IHRlbXBUaW1lO1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEZvcm1hdFRpbWU6IGZ1bmN0aW9uICh0aW1lKSB7XHJcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGRhdGUuc2V0VGltZSh0aW1lKTtcclxuICAgICAgICBsZXQgbXMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgIC8vIGxldCBtc1N0cmluZyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgbGV0IG1zU3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgc2Vjb25kU3RyaW5nID0gbnVsbDtcclxuICAgICAgICBsZXQgbWluU3RyaW5nID0gbnVsbDtcclxuICAgICAgICBtc1N0cmluZyA9IE1hdGguZmxvb3IobXMgLyAxMCkgJSAxMDA7XHJcbiAgICAgICAgc2Vjb25kU3RyaW5nID0gZGF0ZS5nZXRTZWNvbmRzKCk7XHJcbiAgICAgICAgbWluU3RyaW5nID0gZGF0ZS5nZXRNaW51dGVzKCk7XHJcbiAgICAgICAgaWYgKG1zU3RyaW5nIDwgMTApIHtcclxuICAgICAgICAgICAgbXNTdHJpbmcgPSBcIjBcIiArIG1zU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2Vjb25kU3RyaW5nIDwgMTApIHtcclxuICAgICAgICAgICAgc2Vjb25kU3RyaW5nID0gXCIwXCIgKyBzZWNvbmRTdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlY29uZFN0cmluZyA9IHNlY29uZFN0cmluZyArIFwiOlwiO1xyXG5cclxuICAgICAgICBpZiAobWluU3RyaW5nIDwgMTApIHtcclxuICAgICAgICAgICAgbWluU3RyaW5nID0gXCIwXCIgKyBtaW5TdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pblN0cmluZyA9IG1pblN0cmluZyArIFwiOlwiO1xyXG4gICAgICAgIHJldHVybiBtaW5TdHJpbmcgKyBzZWNvbmRTdHJpbmcgKyBtc1N0cmluZztcclxuXHJcbiAgICB9LFxyXG4gICAgcHVzaExpc3RlcjpmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgXHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVyOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICBcclxuICAgIH0sXHJcblxyXG59O1xyXG5leHBvcnQgeyBHYW1lVG9vbCB9OyJdfQ==