Sun_moves/temp/quick-scripts/dst/assets/Script/tool/GameTool.js
2024-05-28 11:38:16 +08:00

551 lines
78 KiB
JavaScript

(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, 'a1dd7qMiCpOLL3FDXJd9DGy', 'GameTool');
// Script/tool/GameTool.js
"use strict";
var _window$GameTool;
var StorageMessage = require("Storage").StorageMessage;
window.GameTool = (_window$GameTool = {
_startTime: 0,
_endTime: 0,
_totalTime: 0,
getSeedRandom: function getSeedRandom(min, max) {
//包含min 不包含max
max = max || 1;
min = min || 0;
GM_INFO.currSeed = (GM_INFO.currSeed * 9301 + 49297) % 233280;
var rnd = GM_INFO.currSeed / 233280.0;
var tmp = min + rnd * (max - min);
return parseInt(tmp);
},
getSetScreenResolutionFlag: function getSetScreenResolutionFlag() {
var size = cc.winSize;
var width = size.width;
var height = size.height;
if (height / width > 16.2 / 9) return false;
return true;
},
//判断全面屏适配
setFit: function setFit(canvas) {
var flag = GameTool.getSetScreenResolutionFlag();
if (flag) {// console.log("不是全面屏");
// canvas.fitWidth = false;
// canvas.fitHeight = true;
} else {// console.log("是全面屏");
// canvas.fitWidth = true;
// canvas.fitHeight = false;
}
return flag;
},
// submitScoreButtonFunc: function(score1,fen1){
// console.log("上传分数:",score1,fen1)
// // var score = score1;
// // var fen = fen1;
// // if (CC_WECHATGAME) {
// // window.wx.postMessage({
// // messageType: 3,
// // MAIN_MENU_NUM: "guan",
// // score: score,
// // MAIN_MENU_FEN: "score",
// // fen: fen,
// // });
// // } else {
// // cc.log("提交得分: x1 : " + score)
// // }
// // return true;
// },
submitScoreButtonFunc: function submitScoreButtonFunc(fen2, number) {
console.log("number=", number);
if (number == 0) {
console.log("上传分数:", fen2);
var fen = fen2;
if (CC_WECHATGAME) {
window.wx.postMessage({
messageType: 3,
MAIN_MENU_FEN: "score",
MAIN_MENU_NUM: "fen",
score: fen,
fen: 0
});
} else {
cc.log("提交得分: x1 : " + fen);
}
} else {
console.log("上传特殊分数:", fen2);
var fen = fen2;
if (CC_WECHATGAME) {
window.wx.postMessage({
messageType: 7,
MAIN_MENU_FEN: "score",
MAIN_MENU_NUM: "fen",
score: 0,
fen: fen
});
} else {
cc.log("提交得分: x1 : " + fen);
}
}
return true;
},
getTip: function getTip() {
var index = Math.floor(Math.random() * 4) + 1;
switch (index) {
case 1:
{
return "根据小球的位置,合理晃动手机,确保小球不掉出木板。";
}
case 2:
{
return "根据小球位置控制晃动幅度,过大或过小都不是个好选择。";
}
case 3:
{
return "不要被天上掉落的障碍吓到,有时候它反而会帮你保持平衡。";
}
case 4:
{
return "尝试着顶开掉落的障碍,是个很酷的玩法。";
}
}
},
beginTiming: function beginTiming() {
this._startTime = new Date().getTime();
},
endTiming: function endTiming() {
this._endTime = new Date().getTime(); // this._totalTime = endTime - this._startTime;
},
//如果是判断时常的游戏 调用此方法
updateScoreTime: function updateScoreTime() {
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);
GM_INFO.currScore = this._totalTime;
this._startTime = endTime;
},
//倒计时调用此方法
countDown: function countDown() {
this._endTime = new Date().getTime();
this._totalTime = parseInt((this._endTime - this._startTime) / 1000);
GM_INFO.remainingTime = GM_INFO.totalTime - this._totalTime;
},
httpRequest: function httpRequest(url, data, _success, _fail) {
console.log("进入网络请求:");
wx.getNetworkType({
success: function success(res) {
var networkType = res.networkType; // console.log(networkType);
//有网络状态下
if (networkType == "wifi" || networkType == "4g" || networkType == "3g" || networkType == "unknown") {
wx.request({
url: window.globalData.requestAPI + url,
data: data,
header: {
'content-type': 'application/json',
// 默认值
'Authorization': window.globalData.BASE64_JWT_TOKEN ? 'Bearer ' + window.globalData.BASE64_JWT_TOKEN : ''
},
method: 'POST',
success: function success(res) {
console.log('httpRequest:::::success', res);
_success(res);
},
fail: function fail(res) {
console.log('httpRequest:::::fail', res, "失败url为", url);
_fail(res);
}
});
} else {
_fail(res);
}
},
fail: function fail(res) {
_fail(res);
}
}); // console.log('httpRequest:::::', url, data, success, fail)
},
httpRequest_Notoken: function httpRequest_Notoken(url, data, _success2, _fail2) {
// console.log('httpRequest:::::', url, data, success, fail)
wx.getNetworkType({
success: function success(res) {
var networkType = res.networkType; // console.log(networkType);
//有网络状态下
if (networkType == "wifi" || networkType == "4g" || networkType == "3g" || networkType == "unknown") {
wx.request({
url: window.globalData.requestAPI + url,
data: data,
header: {
'content-type': 'application/json' // 默认值
},
method: 'POST',
success: function success(res) {
console.log('httpRequest:::::success', res);
_success2(res);
},
fail: function fail(res) {
console.log('httpRequest:::::fail', res, "失败url为", url);
_fail2(res);
}
});
} else {
_fail2(res);
}
},
fail: function fail(res) {
_fail2(res);
}
});
},
getGameInfo: function getGameInfo(node) {
var jg = false;
var nodes = node;
var data = {
'appid': window.globalData.appid
};
window.GameTool.httpRequest(window.globalData.getUserInfoUrl, data, function (res) {
window.globalData.gameUserInfo = res.data.king_user; //user_id在这里
console.log("拿到服务器的信息", res.data);
if (window.globalData.gameUserInfo) {
console.log("获得服务器游戏信息成功:", window.globalData.gameUserInfo);
if (window.globalData.gameUserInfo.unlock_1) window.GM_INFO.unlock_1 = window.globalData.gameUserInfo.unlock_1;
if (window.globalData.gameUserInfo.unlock_2) window.GM_INFO.unlock_2 = window.globalData.gameUserInfo.unlock_2; //如果服务器有金币信息
if (window.globalData.gameUserInfo.coin) {
//本地也有金币信息, 以本地为主,把本地金币信息同步到服务器
if (StorageMessage.getStorage("Coin")) {
if (window.globalData.gameUserInfo.coin != StorageMessage.getStorage("Coin")) {
window.GM_INFO.coin = StorageMessage.getStorage("Coin");
StorageMessage.setStorage("Coin", window.GM_INFO.coin);
}
} //如果本地没有金币信息 , 以服务器金币信息为主
else {
window.GM_INFO.coin = window.globalData.gameUserInfo.coin;
StorageMessage.setStorage("Coin", window.GM_INFO.coin);
}
} else {
//本地也有金币信息, 以本地为主,把本地金币信息同步到服务器
if (StorageMessage.getStorage("Coin")) {
window.GM_INFO.coin = StorageMessage.getStorage("Coin");
StorageMessage.setStorage("Coin", window.GM_INFO.coin);
} //如果本地没有金币信息 , 以服务器金币信息为主
else {
window.GM_INFO.coin = 200;
StorageMessage.setStorage("Coin", window.GM_INFO.coin);
}
}
cc.director.loadScene('GameBegin'); // console.log("即将进入这里");
// if(StorageMessage.getStorage("level")){
// // console.log("本地有等级信息;");
// // console.log("服务器信息等级为:",window.globalData.gameUserInfo.level);
// window.GM_INFO.level = StorageMessage.getStorage("level");
// var temp = window.GameTool.submitScoreButtonFunc(window.GM_INFO.level,window.GM_INFO.coin);
// // console.log("本地等级信息为:",window.GM_INFO.level);
// //本地存储等级 小于服务器等级, 等于本地数据丢失,这时以服务器数据为主重新构建游戏
// if(window.GM_INFO.level < window.globalData.gameUserInfo.level){
// // nodes.active = true;
// window.GM_INFO.level = window.globalData.gameUserInfo.level;
// var temp = window.GameTool.submitScoreButtonFunc(window.GM_INFO.level,window.GM_INFO.coin);
// window.GameTool.reset();
// }
// //正常进入游戏,以本地数据为主,服务器数据为辅
// else{
// console.log("本地数据大以本地主数据为主");
// // window.GameTool.setGameInfo(true);
// }
// }
// else{
// console.log("笨地没等级数据");
// // nodes.active = true;
// window.GM_INFO.level = window.globalData.gameUserInfo.level;
// var temp = window.GameTool.submitScoreButtonFunc(window.GM_INFO.level,window.GM_INFO.coin);
// window.GameTool.reset();
// }
if (CC_WECHATGAME) {
wx.onShow(function (res) {
if (res) {
if (res.query) {
console.log("分享中带的信息", res.query);
if (res.query.key1) {
window.GameTool.setFrindHelp(res.query.key1);
}
if (res.query.key2) {
window.GameTool.setFrindBlock(res.query.key2);
}
if (res.query.key3) {
window.GameTool.setFrindBlockMax(res.query.key3);
}
}
}
});
wx.onHide(function (res) {
console.log("检测退出游戏"); // window.arm = [];
// for(var i=0; i<12; i++){
// window.arm[i] = null;
// window.arm[i] = {error:"error"};
// }
// window.arm = StorageMessage.setStorage("arm",window.arm);
var temp = window.GameTool.submitScoreButtonFunc(window.GM_INFO.level, window.GM_INFO.coin);
window.GameTool.setGameInfo();
});
}
jg = true;
} else {
console.log("拿到服务器信息失败");
cc.director.loadScene("LoadScene");
}
}, function () {
jg = false;
console.log("get用户信息失败", res);
});
return jg;
},
//根据服务器数据重置所需要所有数据
reset: function reset() {
// if(window.globalData.gameUserInfo.arm)
// StorageMessage.setStorage("arm",window.globalData.gameUserInfo.arm);
// if(window.globalData.gameUserInfo.richest_coin)
// StorageMessage.setStorage("coin",parseInt(window.globalData.gameUserInfo.richest_coin));
// if(window.globalData.gameUserInfo.dimond)
// StorageMessage.setStorage("dimond",window.globalData.gameUserInfo.dimond);
// if(window.globalData.gameUserInfo.buy_time)
// StorageMessage.setStorage("buy_Time",window.globalData.gameUserInfo.buy_time);
// if(window.globalData.gameUserInfo.dimond_time)
// StorageMessage.setStorage("dimond_Time",window.globalData.gameUserInfo.dimond_time);
// if(window.globalData.gameUserInfo.level)
// StorageMessage.setStorage("level",window.globalData.gameUserInfo.level);
// if(window.globalData.gameUserInfo.total_Speed)
// StorageMessage.setStorage("total_Speed",parseInt(window.globalData.gameUserInfo.total_Speed));
// if(window.globalData.gameUserInfo.leave_time)
// StorageMessage.setStorage("leave_time",window.globalData.gameUserInfo.leave_time);
// if(window.globalData.gameUserInfo.reward1)
// StorageMessage.setStorage("share_Array",window.globalData.gameUserInfo.reward1);
// if(window.globalData.gameUserInfo.reward2)
// StorageMessage.setStorage("share_100",window.globalData.gameUserInfo.reward2);
// StorageMessage.setStorage("GM_INFO",window.GM_INFO);
console.log("本地数据丢失,重新启动游戏");
cc.director.loadScene('LoadScene');
},
setGameInfo: function setGameInfo(pd) {
var data = {// "richest_coin":window.coin+"",
// "arm":window.arm,
// "buy_time":window.buy_Time,
// "dimond":parseInt(window.dimond),
// "dimond_time":window.dimond_Time,
// "level":window.GM_INFO.level,
// "total_speed":window.total_Speed+"",
// "reward_1":window.GM_INFO.share_Array, //用于存储6个红包的领取信息
// "reward_2":window.share_100 //用于存储100个红包的领取信息
}; // console.log("存储之前检测:",window.arm,arms);
window.GameTool.httpRequest(window.globalData.richest, data, function (res) {
console.log('存储userInfo成功', res);
if (!pd) {
window.GM_INFO.leave_time = res.data.leave_time;
StorageMessage.setStorage("leave_time", window.GM_INFO.leave_time);
}
}, function (res) {
console.log('存储userInfo失败', res);
if (!pd) {
window.GM_INFO.leave_time = parseInt(new Date().valueOf() / 1000);
StorageMessage.setStorage("leave_time", data);
}
});
},
//输入秒,返回需要展示时间格式
getTimeMargin: function getTimeMargin(second) {
var total = second;
var hour = parseInt(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
var min = parseInt(afterHour / 60); //计算整数分
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
return '剩余:' + hour + ':' + min + ':' + afterMin;
},
getTimeMargin2: function getTimeMargin2(second) {
var total = second;
var hour = parseInt(total / (60 * 60)); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
var min = parseInt(afterHour / 60); //计算整数分
if (min < 10) min = "0" + min;
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
if (afterMin < 10) afterMin = "0" + afterMin;
return '剩余:' + min + ':' + afterMin;
},
setFrindBlock: function setFrindBlock(userid) {
// console.log("添加时候的userid");
var data = {
user_id: userid
}; // if(userid != window.globalData.gameUserInfo.user_id){
// console.log("进分享的不是自己");
// {
window.GameTool.httpRequest(window.globalData.entryBlock, data, function (res) {
console.log('添加红包助力信息成功', res);
}, function (res) {
console.log('添加红包助力信息失败', res);
}); // }
// }
// else{
// console.log("进入分享的是自己");
// }
}
}, _window$GameTool["getSeedRandom"] = function getSeedRandom(min, max) {
//包含min 不包含max
max = max || 1;
min = min || 0;
GM_INFO.currSeed = (GM_INFO.currSeed * 9301 + 49297) % 233280;
var rnd = GM_INFO.currSeed / 233280.0;
var tmp = min + rnd * (max - min);
return parseInt(tmp);
}, _window$GameTool.getTime = function getTime(time) {
var label = "";
var number_1 = parseInt(time / 60);
var 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;
}, _window$GameTool.getNumber = function getNumber(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 = parseInt(number / Math.pow(count, 8) * 10) / 10 + "S";else number = parseInt(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 = parseInt(number / Math.pow(count, 7) * 10) / 10 + "s";else number = parseInt(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 = parseInt(number / Math.pow(count, 6) * 10) / 10 + "Q";else number = parseInt(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 = parseInt(number / Math.pow(count, 5) * 10) / 10 + "q";else number = parseInt(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 = parseInt(number / Math.pow(count, 4) * 10) / 10 + "t";else number = parseInt(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 = parseInt(number / Math.pow(count, 3) * 10) / 10 + "b";else number = parseInt(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 = parseInt(number / Math.pow(count, 2) * 10) / 10 + "m";else number = parseInt(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 = parseInt(number / Math.pow(count, 1) * 10) / 10 + "k";
} else number = parseInt(number / Math.pow(count, 1)) + "k";
} else {
number = parseInt(number / Math.pow(count, 0)) + "";
} // console.log("结果为"+type+"位数",number);
return number;
}, _window$GameTool.begainTiming = function begainTiming() {
this._startTime = new Date().getTime();
}, _window$GameTool["endTiming"] = function endTiming() {
var endTime = new Date().getTime();
this._endTime = endTime;
this._totalTime = endTime - this._startTime;
}, _window$GameTool.getScoreTime = function getScoreTime() {
var endTime = new Date().getTime();
var tempTime = endTime - this._startTime;
if (tempTime < 0 || tempTime > 500) {
tempTime = Math.round(cc.director.getAnimationInterval() * 1000);
}
GM_INFO.currScore += tempTime;
this._startTime = endTime;
}, _window$GameTool.getFormatTime = function getFormatTime(time) {
var date = new Date();
date.setTime(time);
var ms = date.getMilliseconds(); // let msString = date.getMilliseconds();
var msString = parseInt(ms / 10) % 100;
var secondString = date.getSeconds();
var 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;
}, _window$GameTool.pushLister = function pushLister() {}, _window$GameTool.removeAllLister = function removeAllLister() {}, _window$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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFx0b29sXFxHYW1lVG9vbC5qcyJdLCJuYW1lcyI6WyJTdG9yYWdlTWVzc2FnZSIsInJlcXVpcmUiLCJ3aW5kb3ciLCJHYW1lVG9vbCIsIl9zdGFydFRpbWUiLCJfZW5kVGltZSIsIl90b3RhbFRpbWUiLCJnZXRTZWVkUmFuZG9tIiwibWluIiwibWF4IiwiR01fSU5GTyIsImN1cnJTZWVkIiwicm5kIiwidG1wIiwicGFyc2VJbnQiLCJnZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZyIsInNpemUiLCJjYyIsIndpblNpemUiLCJ3aWR0aCIsImhlaWdodCIsInNldEZpdCIsImNhbnZhcyIsImZsYWciLCJzdWJtaXRTY29yZUJ1dHRvbkZ1bmMiLCJmZW4yIiwibnVtYmVyIiwiY29uc29sZSIsImxvZyIsImZlbiIsIkNDX1dFQ0hBVEdBTUUiLCJ3eCIsInBvc3RNZXNzYWdlIiwibWVzc2FnZVR5cGUiLCJNQUlOX01FTlVfRkVOIiwiTUFJTl9NRU5VX05VTSIsInNjb3JlIiwiZ2V0VGlwIiwiaW5kZXgiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJiZWdpblRpbWluZyIsIkRhdGUiLCJnZXRUaW1lIiwiZW5kVGltaW5nIiwidXBkYXRlU2NvcmVUaW1lIiwiZW5kVGltZSIsInRlbXBUaW1lIiwicm91bmQiLCJkaXJlY3RvciIsImdldEFuaW1hdGlvbkludGVydmFsIiwidG9GaXhlZCIsImN1cnJTY29yZSIsImNvdW50RG93biIsInJlbWFpbmluZ1RpbWUiLCJ0b3RhbFRpbWUiLCJodHRwUmVxdWVzdCIsInVybCIsImRhdGEiLCJzdWNjZXNzIiwiZmFpbCIsImdldE5ldHdvcmtUeXBlIiwicmVzIiwibmV0d29ya1R5cGUiLCJyZXF1ZXN0IiwiZ2xvYmFsRGF0YSIsInJlcXVlc3RBUEkiLCJoZWFkZXIiLCJCQVNFNjRfSldUX1RPS0VOIiwibWV0aG9kIiwiaHR0cFJlcXVlc3RfTm90b2tlbiIsImdldEdhbWVJbmZvIiwibm9kZSIsImpnIiwibm9kZXMiLCJhcHBpZCIsImdldFVzZXJJbmZvVXJsIiwiZ2FtZVVzZXJJbmZvIiwia2luZ191c2VyIiwidW5sb2NrXzEiLCJ1bmxvY2tfMiIsImNvaW4iLCJnZXRTdG9yYWdlIiwic2V0U3RvcmFnZSIsImxvYWRTY2VuZSIsIm9uU2hvdyIsInF1ZXJ5Iiwia2V5MSIsInNldEZyaW5kSGVscCIsImtleTIiLCJzZXRGcmluZEJsb2NrIiwia2V5MyIsInNldEZyaW5kQmxvY2tNYXgiLCJvbkhpZGUiLCJ0ZW1wIiwibGV2ZWwiLCJzZXRHYW1lSW5mbyIsInJlc2V0IiwicGQiLCJyaWNoZXN0IiwibGVhdmVfdGltZSIsInZhbHVlT2YiLCJnZXRUaW1lTWFyZ2luIiwic2Vjb25kIiwidG90YWwiLCJob3VyIiwiYWZ0ZXJIb3VyIiwiYWZ0ZXJNaW4iLCJnZXRUaW1lTWFyZ2luMiIsInVzZXJpZCIsInVzZXJfaWQiLCJlbnRyeUJsb2NrIiwidGltZSIsImxhYmVsIiwibnVtYmVyXzEiLCJudW1iZXJfMiIsImdldE51bWJlciIsInR5cGUiLCJjb3VudCIsInBsYWNlIiwicG93IiwiYmVnYWluVGltaW5nIiwiZ2V0U2NvcmVUaW1lIiwiZ2V0Rm9ybWF0VGltZSIsImRhdGUiLCJzZXRUaW1lIiwibXMiLCJnZXRNaWxsaXNlY29uZHMiLCJtc1N0cmluZyIsInNlY29uZFN0cmluZyIsImdldFNlY29uZHMiLCJtaW5TdHJpbmciLCJnZXRNaW51dGVzIiwicHVzaExpc3RlciIsInJlbW92ZUFsbExpc3RlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUlBLGNBQWMsR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBUCxDQUFtQkQsY0FBeEM7O0FBQ0FFLE1BQU0sQ0FBQ0MsUUFBUDtBQUNJQyxFQUFBQSxVQUFVLEVBQUUsQ0FEaEI7QUFFSUMsRUFBQUEsUUFBUSxFQUFFLENBRmQ7QUFHSUMsRUFBQUEsVUFBVSxFQUFFLENBSGhCO0FBSUlDLEVBQUFBLGFBQWEsRUFBRSx1QkFBVUMsR0FBVixFQUFl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O0FBQ0FrRixFQUFBQSxJQUFJLENBQUNDLE9BQUwsQ0FBYWIsSUFBYjtBQUVBLE1BQUljLEVBQUUsR0FBR0YsSUFBSSxDQUFDRyxlQUFMLEVBQVQsQ0FMMkIsQ0FNM0I7O0FBQ0EsTUFBSUMsUUFBUSxHQUFHbkgsUUFBUSxDQUFDaUgsRUFBRSxHQUFHLEVBQU4sQ0FBUixHQUFvQixHQUFuQztBQUVBLE1BQUlHLFlBQVksR0FBR0wsSUFBSSxDQUFDTSxVQUFMLEVBQW5CO0FBRUEsTUFBSUMsU0FBUyxHQUFHUCxJQUFJLENBQUNRLFVBQUwsRUFBaEI7O0FBRUEsTUFBSUosUUFBUSxHQUFHLEVBQWYsRUFBbUI7QUFDZkEsSUFBQUEsUUFBUSxHQUFHLE1BQU1BLFFBQWpCO0FBQ0g7O0FBQ0QsTUFBSUMsWUFBWSxHQUFHLEVBQW5CLEVBQXVCO0FBQ25CQSxJQUFBQSxZQUFZLEdBQUcsTUFBTUEsWUFBckI7QUFDSDs7QUFDREEsRUFBQUEsWUFBWSxHQUFHQSxZQUFZLEdBQUcsR0FBOUI7O0FBRUEsTUFBSUUsU0FBUyxHQUFHLEVBQWhCLEVBQW9CO0FBQ2hCQSxJQUFBQSxTQUFTLEdBQUcsTUFBTUEsU0FBbEI7QUFDSDs7QUFDREEsRUFBQUEsU0FBUyxHQUFHQSxTQUFTLEdBQUcsR0FBeEI7QUFFQSxTQUFPQSxTQUFTLEdBQUdGLFlBQVosR0FBMkJELFFBQWxDO0FBRUgsQ0Fsa0JMLG1CQW1rQklLLFVBbmtCSixHQW1rQmUsc0JBQVksQ0FFdEIsQ0Fya0JMLG1CQXNrQklDLGVBdGtCSixHQXNrQm9CLDJCQUFZLENBRTNCLENBeGtCTCIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0b3JhZ2VNZXNzYWdlID0gcmVxdWlyZShcIlN0b3JhZ2VcIikuU3RvcmFnZU1lc3NhZ2U7XHJcbndpbmRvdy5HYW1lVG9vbCA9IHtcclxuICAgIF9zdGFydFRpbWU6IDAsXHJcbiAgICBfZW5kVGltZTogMCxcclxuICAgIF90b3RhbFRpbWU6IDAsXHJcbiAgICBnZXRTZWVkUmFuZG9tOiBmdW5jdGlvbiAobWluLCBtYXgpIHsvL+WMheWQq21pbiDkuI3ljIXlkKttYXhcclxuICAgICAgICBtYXggPSBtYXggfHwgMTtcclxuICAgICAgICBtaW4gPSBtaW4gfHwgMDtcclxuICAgICAgICBHTV9JTkZPLmN1cnJTZWVkID0gKEdNX0lORk8uY3VyclNlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xyXG4gICAgICAgIGxldCBybmQgPSBHTV9JTkZPLmN1cnJTZWVkIC8gMjMzMjgwLjA7XHJcbiAgICAgICAgbGV0IHRtcCA9IG1pbiArIHJuZCAqIChtYXggLSBtaW4pO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh0bXApO1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2l6ZSA9IGNjLndpblNpemU7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKChoZWlnaHQgLyB3aWR0aCkgPiAoMTYuMiAvIDkpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG4gICAgLy/liKTmlq3lhajpnaLlsY/pgILphY1cclxuICAgIHNldEZpdDogZnVuY3Rpb24gKGNhbnZhcykge1xyXG4gICAgICAgIGxldCBmbGFnID0gR2FtZVRvb2wuZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWcoKTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLkuI3mmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy5maXRXaWR0aCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBjYW52YXMuZml0SGVpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFx0Ly8gY29uc29sZS5sb2coXCLmmK/lhajpnaLlsY9cIik7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy5maXRXaWR0aCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIGNhbnZhcy5maXRIZWlnaHQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIHN1Ym1pdFNjb3JlQnV0dG9uRnVuYzogZnVuY3Rpb24oc2NvcmUxLGZlbjEpe1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwi5LiK5Lyg5YiG5pWwOlwiLHNjb3JlMSxmZW4xKVxyXG4gICAgLy8gICAgIC8vIHZhciBzY29yZSA9IHNjb3JlMTtcclxuICAgIC8vICAgICAvLyB2YXIgZmVuID0gZmVuMTtcclxuICAgIC8vICAgICAvLyBpZiAoQ0NfV0VDSEFUR0FNRSkge1xyXG4gICAgLy8gICAgIC8vICAgICB3aW5kb3cud3gucG9zdE1lc3NhZ2Uoe1xyXG4gICAgLy8gICAgIC8vICAgICAgICAgbWVzc2FnZVR5cGU6IDMsXHJcbiAgICAvLyAgICAgLy8gICAgICAgICBNQUlOX01FTlVfTlVNOiBcImd1YW5cIixcclxuICAgIC8vICAgICAvLyAgICAgICAgIHNjb3JlOiBzY29yZSxcclxuICAgIC8vICAgICAvLyAgICAgICAgIE1BSU5fTUVOVV9GRU46IFwic2NvcmVcIixcclxuICAgIC8vICAgICAvLyAgICAgICAgIGZlbjogZmVuLFxyXG4gICAgLy8gICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICAgIC8vICAgICBjYy5sb2coXCLmj5DkuqTlvpfliIY6IHgxIDogXCIgKyBzY29yZSlcclxuICAgIC8vICAgICAvLyB9XHJcbiAgICAvLyAgICAgLy8gcmV0dXJuIHRydWU7XHJcbiAgICAvLyB9LFxyXG5cclxuXHJcbiAgICBzdWJtaXRTY29yZUJ1dHRvbkZ1bmM6IGZ1bmN0aW9uKGZlbjIsbnVtYmVyKXtcclxuICAgIFx0Y29uc29sZS5sb2coXCJudW1iZXI9XCIsbnVtYmVyKVxyXG4gICAgICAgIGlmKG51bWJlciA9PSAwKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDliIbmlbA6XCIsZmVuMilcclxuICAgICAgICAgICAgdmFyIGZlbiA9IGZlbjI7XHJcbiAgICAgICAgICAgIGlmIChDQ19XRUNIQVRHQU1FKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cud3gucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOiAzLFxyXG4gICAgICAgICAgICAgICAgICAgIE1BSU5fTUVOVV9GRU46IFwic2NvcmVcIixcclxuICAgICAgICAgICAgICAgICAgICBNQUlOX01FTlVfTlVNOiBcImZlblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlOiBmZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgZmVuOiAwLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLmj5DkuqTlvpfliIY6IHgxIDogXCIgKyBmZW4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDnibnmrorliIbmlbA6XCIsZmVuMilcclxuICAgICAgICAgICAgdmFyIGZlbiA9IGZlbjI7XHJcbiAgICAgICAgICAgIGlmIChDQ19XRUNIQVRHQU1FKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cud3gucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlOiA3LFxyXG4gICAgICAgICAgICAgICAgICAgIE1BSU5fTUVOVV9GRU46IFwic2NvcmVcIixcclxuICAgICAgICAgICAgICAgICAgICBNQUlOX01FTlVfTlVNOiBcImZlblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGZlbjogZmVuLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLmj5DkuqTlvpfliIY6IHgxIDogXCIgKyBmZW4pXHJcbiAgICAgICAgICAgIH0gICBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFRpcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICsgMTtcclxuICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XHJcbiAgICAgICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwi5qC55o2u5bCP55CD55qE5L2N572u77yM5ZCI55CG5pmD5Yqo5omL5py677yM56Gu5L+d5bCP55CD5LiN5o6J5Ye65pyo5p2/44CCXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDI6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIuagueaNruWwj+eQg+S9jee9ruaOp+WItuaZg+WKqOW5heW6pu+8jOi/h+Wkp+aIlui/h+Wwj+mDveS4jeaYr+S4quWlvemAieaLqeOAglwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAzOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCLkuI3opoHooqvlpKnkuIrmjonokL3nmoTpmpznoo3lkJPliLDvvIzmnInml7blgJnlroPlj43ogIzkvJrluK7kvaDkv53mjIHlubPooaHjgIJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgNDoge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwi5bCd6K+V552A6aG25byA5o6J6JC955qE6Zqc56KN77yM5piv5Liq5b6I6YW355qE546p5rOV44CCXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgYmVnaW5UaW1pbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgZW5kVGltaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuX3RvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XHJcbiAgICB9LFxyXG4gICAgLy/lpoLmnpzmmK/liKTmlq3ml7bluLjnmoTmuLjmiI8g6LCD55So5q2k5pa55rOVXHJcbiAgICB1cGRhdGVTY29yZVRpbWU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGxldCB0ZW1wVGltZSA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XHJcbiAgICAgICAgaWYgKHRlbXBUaW1lIDwgMCB8fCB0ZW1wVGltZSA+IDUwMCkge1xyXG4gICAgICAgICAgICB0ZW1wVGltZSA9IE1hdGgucm91bmQoY2MuZGlyZWN0b3IuZ2V0QW5pbWF0aW9uSW50ZXJ2YWwoKSAqIDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9lbmRUaW1lICs9IHRlbXBUaW1lIC8gMTAwMDtcclxuICAgICAgICB0aGlzLl90b3RhbFRpbWUgPSB0aGlzLl9lbmRUaW1lLnRvRml4ZWQoMik7XHJcbiAgICAgICAgR01fSU5GTy5jdXJyU2NvcmUgPSB0aGlzLl90b3RhbFRpbWU7XHJcbiAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gZW5kVGltZTtcclxuICAgIH0sXHJcbiAgICAvL+WAkuiuoeaXtuiwg+eUqOatpOaWueazlVxyXG4gICAgY291bnREb3duOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IHBhcnNlSW50KCh0aGlzLl9lbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lKSAvIDEwMDApO1xyXG4gICAgICAgIEdNX0lORk8ucmVtYWluaW5nVGltZSA9IEdNX0lORk8udG90YWxUaW1lIC0gdGhpcy5fdG90YWxUaW1lO1xyXG4gICAgfSxcclxuXHJcbiAgICBodHRwUmVxdWVzdCh1cmwsIGRhdGEsIHN1Y2Nlc3MsIGZhaWwpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIui/m+WFpee9kee7nOivt+axgjpcIik7XHJcbiAgICAgICAgd3guZ2V0TmV0d29ya1R5cGUoe1xyXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgIHZhciBuZXR3b3JrVHlwZSA9IHJlcy5uZXR3b3JrVHlwZTtcclxuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhuZXR3b3JrVHlwZSk7XHJcbiAgICAgICAgICAgICAgLy/mnInnvZHnu5znirbmgIHkuItcclxuICAgICAgICAgICAgICBpZihuZXR3b3JrVHlwZSA9PSBcIndpZmlcIiB8fG5ldHdvcmtUeXBlID09IFwiNGdcIiB8fCBuZXR3b3JrVHlwZSA9PSBcIjNnXCIgfHwgbmV0d29ya1R5cGUgPT1cInVua25vd25cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogd2luZG93Lmdsb2JhbERhdGEucmVxdWVzdEFQSSArIHVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzp3aW5kb3cuZ2xvYmFsRGF0YS5CQVNFNjRfSldUX1RPS0VOPydCZWFyZXIgJyt3aW5kb3cuZ2xvYmFsRGF0YS5CQVNFNjRfSldUX1RPS0VOOicnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2h0dHBSZXF1ZXN0Ojo6OjpzdWNjZXNzJyxyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2h0dHBSZXF1ZXN0Ojo6OjpmYWlsJywgcmVzLFwi5aSx6LSldXJs5Li6XCIsdXJsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwocmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGZhaWwocmVzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmYWlsKHJlcyl7XHJcbiAgICAgICAgICAgICAgICBmYWlsKHJlcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnaHR0cFJlcXVlc3Q6Ojo6OicsIHVybCwgZGF0YSwgc3VjY2VzcywgZmFpbClcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIGh0dHBSZXF1ZXN0X05vdG9rZW4odXJsLCBkYXRhLCBzdWNjZXNzLCBmYWlsKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2h0dHBSZXF1ZXN0Ojo6OjonLCB1cmwsIGRhdGEsIHN1Y2Nlc3MsIGZhaWwpXHJcbiAgICAgICAgd3guZ2V0TmV0d29ya1R5cGUoe1xyXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgIHZhciBuZXR3b3JrVHlwZSA9IHJlcy5uZXR3b3JrVHlwZTtcclxuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyhuZXR3b3JrVHlwZSk7XHJcbiAgICAgICAgICAgICAgLy/mnInnvZHnu5znirbmgIHkuItcclxuICAgICAgICAgICAgICBpZihuZXR3b3JrVHlwZSA9PSBcIndpZmlcIiB8fG5ldHdvcmtUeXBlID09IFwiNGdcIiB8fCBuZXR3b3JrVHlwZSA9PSBcIjNnXCIgfHwgbmV0d29ya1R5cGUgPT1cInVua25vd25cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogd2luZG93Lmdsb2JhbERhdGEucmVxdWVzdEFQSSArIHVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaHR0cFJlcXVlc3Q6Ojo6OnN1Y2Nlc3MnLHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaHR0cFJlcXVlc3Q6Ojo6OmZhaWwnLCByZXMsXCLlpLHotKV1cmzkuLpcIix1cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChyZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBmYWlsKHJlcylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbChyZXMpe1xyXG4gICAgICAgICAgICAgICAgZmFpbChyZXMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRHYW1lSW5mbzogZnVuY3Rpb24obm9kZSl7XHJcbiAgICAgICAgdmFyIGpnID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIG5vZGVzID0gbm9kZTtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgJ2FwcGlkJzogd2luZG93Lmdsb2JhbERhdGEuYXBwaWRcclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkdhbWVUb29sLmh0dHBSZXF1ZXN0KHdpbmRvdy5nbG9iYWxEYXRhLmdldFVzZXJJbmZvVXJsLCBkYXRhLCBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mbyA9IHJlcy5kYXRhLmtpbmdfdXNlcjsgIC8vdXNlcl9pZOWcqOi/memHjFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaLv+WIsOacjeWKoeWZqOeahOS/oeaBr1wiLHJlcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mbyl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+W+l+acjeWKoeWZqOa4uOaIj+S/oeaBr+aIkOWKnzpcIix3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8pO1xyXG4gICAgICAgICAgICAgICAgaWYod2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnVubG9ja18xKVxyXG4gICAgICAgICAgICAgICAgd2luZG93LkdNX0lORk8udW5sb2NrXzEgPSB3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8udW5sb2NrXzE7XHJcbiAgICAgICAgICAgIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby51bmxvY2tfMilcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5HTV9JTkZPLnVubG9ja18yID0gd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnVubG9ja18yO1xyXG4gICAgICAgICAgICAvL+WmguaenOacjeWKoeWZqOaciemHkeW4geS/oeaBr1xyXG4gICAgICAgICAgICBpZih3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8uY29pbil7XHJcbiAgICAgICAgICAgICAgICAvL+acrOWcsOS5n+aciemHkeW4geS/oeaBrywg5Lul5pys5Zyw5Li65Li7LOaKiuacrOWcsOmHkeW4geS/oeaBr+WQjOatpeWIsOacjeWKoeWZqFxyXG4gICAgICAgICAgICAgICAgaWYoU3RvcmFnZU1lc3NhZ2UuZ2V0U3RvcmFnZShcIkNvaW5cIikpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5jb2luICE9IFN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UoXCJDb2luXCIpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LkdNX0lORk8uY29pbiA9IFN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UoXCJDb2luXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwiQ29pblwiLHdpbmRvdy5HTV9JTkZPLmNvaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gICAvL+WmguaenOacrOWcsOayoeaciemHkeW4geS/oeaBryAsIOS7peacjeWKoeWZqOmHkeW4geS/oeaBr+S4uuS4u1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuR01fSU5GTy5jb2luID0gd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmNvaW47XHJcbiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShcIkNvaW5cIix3aW5kb3cuR01fSU5GTy5jb2luKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgLy/mnKzlnLDkuZ/mnInph5HluIHkv6Hmga8sIOS7peacrOWcsOS4uuS4uyzmiormnKzlnLDph5HluIHkv6Hmga/lkIzmraXliLDmnI3liqHlmahcclxuICAgICAgICAgICAgICAgIGlmKFN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UoXCJDb2luXCIpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LkdNX0lORk8uY29pbiA9IFN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UoXCJDb2luXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwiQ29pblwiLHdpbmRvdy5HTV9JTkZPLmNvaW4pO1xyXG4gICAgICAgICAgICAgICAgfSAgIC8v5aaC5p6c5pys5Zyw5rKh5pyJ6YeR5biB5L+h5oGvICwg5Lul5pyN5Yqh5Zmo6YeR5biB5L+h5oGv5Li65Li7XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5HTV9JTkZPLmNvaW4gPSAyMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShcIkNvaW5cIix3aW5kb3cuR01fSU5GTy5jb2luKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2MuZGlyZWN0b3IubG9hZFNjZW5lKCdHYW1lQmVnaW4nKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLljbPlsIbov5vlhaXov5nph4xcIik7XHJcbiAgICAgICAgICAgIC8vIGlmKFN0b3JhZ2VNZXNzYWdlLmdldFN0b3JhZ2UoXCJsZXZlbFwiKSl7XHJcbiAgICAgICAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZyhcIuacrOWcsOacieetiee6p+S/oeaBrztcIik7XHJcbiAgICAgICAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZyhcIuacjeWKoeWZqOS/oeaBr+etiee6p+S4ujpcIix3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8ubGV2ZWwpO1xyXG4gICAgICAgICAgICAvLyAgICAgd2luZG93LkdNX0lORk8ubGV2ZWwgPSBTdG9yYWdlTWVzc2FnZS5nZXRTdG9yYWdlKFwibGV2ZWxcIik7XHJcbiAgICAgICAgICAgIC8vICAgICB2YXIgdGVtcCA9IHdpbmRvdy5HYW1lVG9vbC5zdWJtaXRTY29yZUJ1dHRvbkZ1bmMod2luZG93LkdNX0lORk8ubGV2ZWwsd2luZG93LkdNX0lORk8uY29pbik7XHJcbiAgICAgICAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZyhcIuacrOWcsOetiee6p+S/oeaBr+S4ujpcIix3aW5kb3cuR01fSU5GTy5sZXZlbCk7XHJcbiAgICAgICAgICAgIC8vICAgICAvL+acrOWcsOWtmOWCqOetiee6pyDlsI/kuo7mnI3liqHlmajnrYnnuqcsIOetieS6juacrOWcsOaVsOaNruS4ouWksSzov5nml7bku6XmnI3liqHlmajmlbDmja7kuLrkuLvph43mlrDmnoTlu7rmuLjmiI9cclxuICAgICAgICAgICAgLy8gICAgIGlmKHdpbmRvdy5HTV9JTkZPLmxldmVsIDwgd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmxldmVsKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBub2Rlcy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHdpbmRvdy5HTV9JTkZPLmxldmVsID0gd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmxldmVsO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIHZhciB0ZW1wID0gd2luZG93LkdhbWVUb29sLnN1Ym1pdFNjb3JlQnV0dG9uRnVuYyh3aW5kb3cuR01fSU5GTy5sZXZlbCx3aW5kb3cuR01fSU5GTy5jb2luKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICB3aW5kb3cuR2FtZVRvb2wucmVzZXQoKTtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIC8v5q2j5bi46L+b5YWl5ri45oiPLOS7peacrOWcsOaVsOaNruS4uuS4uyzmnI3liqHlmajmlbDmja7kuLrovoVcclxuICAgICAgICAgICAgLy8gICAgIGVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCLmnKzlnLDmlbDmja7lpKfku6XmnKzlnLDkuLvmlbDmja7kuLrkuLtcIik7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gd2luZG93LkdhbWVUb29sLnNldEdhbWVJbmZvKHRydWUpO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcIuesqOWcsOayoeetiee6p+aVsOaNrlwiKTtcclxuICAgICAgICAgICAgLy8gICAgIC8vIG5vZGVzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cuR01fSU5GTy5sZXZlbCA9IHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5sZXZlbDtcclxuICAgICAgICAgICAgLy8gICAgIHZhciB0ZW1wID0gd2luZG93LkdhbWVUb29sLnN1Ym1pdFNjb3JlQnV0dG9uRnVuYyh3aW5kb3cuR01fSU5GTy5sZXZlbCx3aW5kb3cuR01fSU5GTy5jb2luKTtcclxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5HYW1lVG9vbC5yZXNldCgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIGlmIChDQ19XRUNIQVRHQU1FKSB7XHJcbiAgICAgICAgICAgICAgICB3eC5vblNob3coZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMucXVlcnkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvkuK3luKbnmoTkv6Hmga9cIixyZXMucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnF1ZXJ5LmtleTEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5HYW1lVG9vbC5zZXRGcmluZEhlbHAocmVzLnF1ZXJ5LmtleTEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnF1ZXJ5LmtleTIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5HYW1lVG9vbC5zZXRGcmluZEJsb2NrKHJlcy5xdWVyeS5rZXkyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5xdWVyeS5rZXkzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuR2FtZVRvb2wuc2V0RnJpbmRCbG9ja01heChyZXMucXVlcnkua2V5Myk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHd4Lm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5qOA5rWL6YCA5Ye65ri45oiPXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5hcm0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IodmFyIGk9MDsgaTwxMjsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgd2luZG93LmFybVtpXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5hcm1baV0gPSB7ZXJyb3I6XCJlcnJvclwifTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LmFybSA9IFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJhcm1cIix3aW5kb3cuYXJtKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IHdpbmRvdy5HYW1lVG9vbC5zdWJtaXRTY29yZUJ1dHRvbkZ1bmMod2luZG93LkdNX0lORk8ubGV2ZWwsd2luZG93LkdNX0lORk8uY29pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LkdhbWVUb29sLnNldEdhbWVJbmZvKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBqZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ou/5Yiw5pyN5Yqh5Zmo5L+h5oGv5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MuZGlyZWN0b3IubG9hZFNjZW5lKFwiTG9hZFNjZW5lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH0sZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgamcgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJnZXTnlKjmiLfkv6Hmga/lpLHotKVcIixyZXMpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIGpnO1xyXG4gICAgfSxcclxuICAgIC8v5qC55o2u5pyN5Yqh5Zmo5pWw5o2u6YeN572u5omA6ZyA6KaB5omA5pyJ5pWw5o2uXHJcbiAgICByZXNldDogZnVuY3Rpb24oKXtcclxuICAgICAgICAvLyBpZih3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8uYXJtKVxyXG4gICAgICAgIC8vICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwiYXJtXCIsd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmFybSk7XHJcbiAgICAgICAgLy8gaWYod2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnJpY2hlc3RfY29pbikgXHJcbiAgICAgICAgLy8gICAgIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJjb2luXCIscGFyc2VJbnQod2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnJpY2hlc3RfY29pbikpO1xyXG4gICAgICAgIC8vIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5kaW1vbmQpXHJcbiAgICAgICAgLy8gICAgIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJkaW1vbmRcIix3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8uZGltb25kKTtcclxuICAgICAgICAvLyBpZih3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8uYnV5X3RpbWUpXHJcbiAgICAgICAgLy8gICAgIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJidXlfVGltZVwiLHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5idXlfdGltZSk7XHJcbiAgICAgICAgLy8gaWYod2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmRpbW9uZF90aW1lKVxyXG4gICAgICAgIC8vICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwiZGltb25kX1RpbWVcIix3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8uZGltb25kX3RpbWUpO1xyXG4gICAgICAgIC8vIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5sZXZlbClcclxuICAgICAgICAvLyAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShcImxldmVsXCIsd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLmxldmVsKTtcclxuICAgICAgICAvLyBpZih3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8udG90YWxfU3BlZWQpXHJcbiAgICAgICAgLy8gICAgIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJ0b3RhbF9TcGVlZFwiLHBhcnNlSW50KHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby50b3RhbF9TcGVlZCkpO1xyXG4gICAgICAgIC8vIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5sZWF2ZV90aW1lKVxyXG4gICAgICAgIC8vICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwibGVhdmVfdGltZVwiLHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5sZWF2ZV90aW1lKTtcclxuICAgICAgICAvLyBpZih3aW5kb3cuZ2xvYmFsRGF0YS5nYW1lVXNlckluZm8ucmV3YXJkMSlcclxuICAgICAgICAvLyAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShcInNoYXJlX0FycmF5XCIsd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnJld2FyZDEpO1xyXG4gICAgICAgIC8vIGlmKHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby5yZXdhcmQyKVxyXG4gICAgICAgIC8vICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwic2hhcmVfMTAwXCIsd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnJld2FyZDIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFN0b3JhZ2VNZXNzYWdlLnNldFN0b3JhZ2UoXCJHTV9JTkZPXCIsd2luZG93LkdNX0lORk8pO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5pys5Zyw5pWw5o2u5Lii5aSxLOmHjeaWsOWQr+WKqOa4uOaIj1wiKTtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoJ0xvYWRTY2VuZScpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRHYW1lSW5mbzogZnVuY3Rpb24ocGQpe1xyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAvLyBcInJpY2hlc3RfY29pblwiOndpbmRvdy5jb2luK1wiXCIsXHJcbiAgICAgICAgICAgIC8vIFwiYXJtXCI6d2luZG93LmFybSxcclxuICAgICAgICAgICAgLy8gXCJidXlfdGltZVwiOndpbmRvdy5idXlfVGltZSxcclxuICAgICAgICAgICAgLy8gXCJkaW1vbmRcIjpwYXJzZUludCh3aW5kb3cuZGltb25kKSxcclxuICAgICAgICAgICAgLy8gXCJkaW1vbmRfdGltZVwiOndpbmRvdy5kaW1vbmRfVGltZSxcclxuICAgICAgICAgICAgLy8gXCJsZXZlbFwiOndpbmRvdy5HTV9JTkZPLmxldmVsLFxyXG4gICAgICAgICAgICAvLyBcInRvdGFsX3NwZWVkXCI6d2luZG93LnRvdGFsX1NwZWVkK1wiXCIsXHJcbiAgICAgICAgICAgIC8vIFwicmV3YXJkXzFcIjp3aW5kb3cuR01fSU5GTy5zaGFyZV9BcnJheSwgICAgICAvL+eUqOS6juWtmOWCqDbkuKrnuqLljIXnmoTpooblj5bkv6Hmga9cclxuICAgICAgICAgICAgLy8gXCJyZXdhcmRfMlwiOndpbmRvdy5zaGFyZV8xMDAgICAgICAgICAgICAgICAgIC8v55So5LqO5a2Y5YKoMTAw5Liq57qi5YyF55qE6aKG5Y+W5L+h5oGvXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5a2Y5YKo5LmL5YmN5qOA5rWLOlwiLHdpbmRvdy5hcm0sYXJtcyk7XHJcbiAgICAgICAgd2luZG93LkdhbWVUb29sLmh0dHBSZXF1ZXN0KHdpbmRvdy5nbG9iYWxEYXRhLnJpY2hlc3QsIGRhdGEsIGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ+WtmOWCqHVzZXJJbmZv5oiQ5YqfJywgcmVzKTtcclxuICAgICAgICAgICAgaWYoIXBkKXtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5HTV9JTkZPLmxlYXZlX3RpbWUgPSByZXMuZGF0YS5sZWF2ZV90aW1lO1xyXG4gICAgICAgICAgICAgICAgU3RvcmFnZU1lc3NhZ2Uuc2V0U3RvcmFnZShcImxlYXZlX3RpbWVcIix3aW5kb3cuR01fSU5GTy5sZWF2ZV90aW1lKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LGZ1bmN0aW9uKHJlcyl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCflrZjlgqh1c2VySW5mb+Wksei0pScsIHJlcyk7XHJcbiAgICAgICAgICAgIGlmKCFwZCl7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuR01fSU5GTy5sZWF2ZV90aW1lID0gcGFyc2VJbnQobmV3IERhdGUoKS52YWx1ZU9mKCkvMTAwMCk7XHJcbiAgICAgICAgICAgICAgICBTdG9yYWdlTWVzc2FnZS5zZXRTdG9yYWdlKFwibGVhdmVfdGltZVwiLGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8v6L6T5YWl56eSLOi/lOWbnumcgOimgeWxleekuuaXtumXtOagvOW8j1xyXG4gICAgZ2V0VGltZU1hcmdpbjooc2Vjb25kKSA9PiB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gc2Vjb25kO1xyXG4gICAgICAgIGxldCBob3VyID0gcGFyc2VJbnQodG90YWwgLyAoNjAgKiA2MCkpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoYWZ0ZXJIb3VyIC8gNjApOy8v6K6h566X5pW05pWw5YiGXHJcbiAgICAgICAgbGV0IGFmdGVyTWluID0gdG90YWwgLSBob3VyICogNjAgKiA2MCAtIG1pbiAqIDYwOy8v5Y+W5b6X566X5Ye65YiG5ZCO5Ymp5L2Z55qE56eS5pWwXHJcbiAgICAgICAgcmV0dXJuICfliankvZk6JyArIGhvdXIgKyAnOicgKyBtaW4gKyAnOicgKyBhZnRlck1pblxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRUaW1lTWFyZ2luMjooc2Vjb25kKSA9PiB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gc2Vjb25kO1xyXG4gICAgICAgIGxldCBob3VyID0gcGFyc2VJbnQodG90YWwgLyAoNjAgKiA2MCkpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoYWZ0ZXJIb3VyIC8gNjApOy8v6K6h566X5pW05pWw5YiGXHJcbiAgICAgICAgaWYobWluIDwgMTApIG1pbiA9IFwiMFwiK21pbjtcclxuICAgICAgICBsZXQgYWZ0ZXJNaW4gPSB0b3RhbCAtIGhvdXIgKiA2MCAqIDYwIC0gbWluICogNjA7Ly/lj5blvpfnrpflh7rliIblkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBpZihhZnRlck1pbiA8IDEwKSBhZnRlck1pbiA9IFwiMFwiICsgYWZ0ZXJNaW47XHJcbiAgICAgICAgcmV0dXJuICfliankvZk6JyAgKyBtaW4gKyAnOicgKyBhZnRlck1pblxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRGcmluZEJsb2NrOiBmdW5jdGlvbih1c2VyaWQpe1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5re75Yqg5pe25YCZ55qEdXNlcmlkXCIpO1xyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB1c2VyX2lkOnVzZXJpZFxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZih1c2VyaWQgIT0gd2luZG93Lmdsb2JhbERhdGEuZ2FtZVVzZXJJbmZvLnVzZXJfaWQpe1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIui/m+WIhuS6q+eahOS4jeaYr+iHquW3sVwiKTtcclxuICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LkdhbWVUb29sLmh0dHBSZXF1ZXN0KHdpbmRvdy5nbG9iYWxEYXRhLmVudHJ5QmxvY2ssIGRhdGEsIGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5re75Yqg57qi5YyF5Yqp5Yqb5L+h5oGv5oiQ5YqfJywgcmVzKVxyXG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmt7vliqDnuqLljIXliqnlipvkv6Hmga/lpLHotKUnLCByZXMpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwi6L+b5YWl5YiG5Lqr55qE5piv6Ieq5bexXCIpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gc2V0RnJpbmRCbG9ja01heDogZnVuY3Rpb24odXNlcmlkKXtcclxuICAgIC8vICAgICAvLyBjb25zb2xlLmxvZyhcIua3u+WKoOaXtuWAmeeahHVzZXJpZFwiKTtcclxuICAgIC8vICAgICBsZXQgZGF0YSA9IHtcclxuICAgIC8vICAgICAgICAgdXNlcl9pZDp1c2VyaWRcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgLy8gaWYodXNlcmlkICE9IHdpbmRvdy5nbG9iYWxEYXRhLmdhbWVVc2VySW5mby51c2VyX2lkKXtcclxuICAgIC8vICAgICAgICAgLy8gY29uc29sZS5sb2coXCLov5vliIbkuqvnmoTkuI3mmK/oh6rlt7FcIik7XHJcbiAgICAvLyAgICAgICAgIC8vIHtcclxuICAgIC8vICAgICAgICAgICAgIHdpbmRvdy5HYW1lVG9vbC5odHRwUmVxdWVzdCh3aW5kb3cuZ2xvYmFsRGF0YS5lbnRyeUJsb2NrTWF4LCBkYXRhLCBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+a3u+WKoOacgOWQjueahOWlveWPi+S/oeaBr+aIkOWKnycsIHJlcylcclxuICAgIC8vICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXMpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5re75Yqg5pyA5ZCO55qE5aW95Y+L5L+h5oGv5L+h5oGv5aSx6LSlJywgcmVzKVxyXG4gICAgLy8gICAgICAgICAgICAgfSlcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgIC8vIH1cclxuICAgIC8vICAgICAvLyBlbHNle1xyXG4gICAgLy8gICAgIC8vICAgICBjb25zb2xlLmxvZyhcIui/m+WFpeWIhuS6q+eahOaYr+iHquW3sVwiKTtcclxuICAgIC8vICAgICAvLyB9XHJcbiAgICAvLyB9LFxyXG5cclxuXHJcbiAgICBnZXRTZWVkUmFuZG9tOiBmdW5jdGlvbiAobWluLCBtYXgpIHsvL+WMheWQq21pbiDkuI3ljIXlkKttYXhcclxuICAgICAgICBtYXggPSBtYXggfHwgMTtcclxuICAgICAgICBtaW4gPSBtaW4gfHwgMDtcclxuICAgICAgICBHTV9JTkZPLmN1cnJTZWVkID0gKEdNX0lORk8uY3VyclNlZWQgKiA5MzAxICsgNDkyOTcpICUgMjMzMjgwO1xyXG4gICAgICAgIGxldCBybmQgPSBHTV9JTkZPLmN1cnJTZWVkIC8gMjMzMjgwLjA7XHJcbiAgICAgICAgbGV0IHRtcCA9IG1pbiArIHJuZCAqIChtYXggLSBtaW4pO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludCh0bXApO1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+WwhuaXtumXtOi9rOaNouS4ujU5OjIzXHJcbiAgICBnZXRUaW1lOiBmdW5jdGlvbih0aW1lKXtcclxuICAgICAgICB2YXIgbGFiZWwgPSBcIlwiO1xyXG4gICAgICAgIHZhciBudW1iZXJfMSA9IHBhcnNlSW50KHRpbWUvNjApO1xyXG4gICAgICAgIHZhciBudW1iZXJfMiA9IHRpbWUtbnVtYmVyXzEqNjA7XHJcbiAgICAgICAgaWYobnVtYmVyXzEgPCAxMCl7XHJcbiAgICAgICAgICAgIG51bWJlcl8xID0gXCIwXCIrbnVtYmVyXzE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKG51bWJlcl8yIDwgMTApe1xyXG4gICAgICAgICAgICBudW1iZXJfMiA9IFwiMFwiK251bWJlcl8yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsYWJlbCA9IG51bWJlcl8xICsgXCI6XCIgKyBudW1iZXJfMjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfSxcclxuICAgIC8vbnVtYmVyIOS4uuS8oOi/m+adpeeahOaVsOWAvCx0eXBl5Li65pyA5aSa5pi+56S65Yeg5L2N5pWwXHJcbiAgICBnZXROdW1iZXI6IGZ1bmN0aW9uKG51bWJlcix0eXBlKXtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0eXBlLFwi6ZyA6KaB6L2s5o2i55qE5pWw5a2X5Li6OlwiLG51bWJlcik7XHJcbiAgICAgICAgdmFyIGNvdW50ID0gMTAwMDtcclxuICAgICAgICB2YXIgcGxhY2UgPSB0eXBlIC0gMztcclxuICAgICAgICBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw4KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsOCkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsOCkqMTApLzEwK1wiU1wiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsOCkpK1wiU1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDcpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCw3KSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlci9NYXRoLnBvdyhjb3VudCw3KSoxMCkvMTArXCJzXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlci9NYXRoLnBvdyhjb3VudCw3KSkrXCJzXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsNikqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDYpIDwgMTAwKVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyL01hdGgucG93KGNvdW50LDYpKjEwKS8xMCtcIlFcIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyL01hdGgucG93KGNvdW50LDYpKStcIlFcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw1KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNSkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsNSkqMTApLzEwK1wicVwiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsNSkpK1wicVwiO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCw0KSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsNCkgPCAxMDApXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsNCkqMTApLzEwK1widFwiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsNCkpK1widFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG51bWJlciA+IE1hdGgucG93KGNvdW50LDMpKk1hdGgucG93KDEwLHBsYWNlKSl7XHJcbiAgICAgICAgICAgIGlmKG51bWJlci9NYXRoLnBvdyhjb3VudCwzKSA8IDEwMClcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlci9NYXRoLnBvdyhjb3VudCwzKSoxMCkvMTArXCJiXCI7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlci9NYXRoLnBvdyhjb3VudCwzKSkrXCJiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobnVtYmVyID4gTWF0aC5wb3coY291bnQsMikqTWF0aC5wb3coMTAscGxhY2UpKXtcclxuICAgICAgICAgICAgaWYobnVtYmVyL01hdGgucG93KGNvdW50LDIpIDwgMTAwKVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyL01hdGgucG93KGNvdW50LDIpKjEwKS8xMCtcIm1cIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyL01hdGgucG93KGNvdW50LDIpKStcIm1cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihudW1iZXIgPiBNYXRoLnBvdyhjb3VudCwxKSpNYXRoLnBvdygxMCxwbGFjZSkpe1xyXG4gICAgICAgICAgICBpZihudW1iZXIvTWF0aC5wb3coY291bnQsMSkgPCAxMDApe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyL01hdGgucG93KGNvdW50LDEpKjEwKS8xMCtcImtcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsMSkpK1wia1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIvTWF0aC5wb3coY291bnQsMCkpK1wiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi57uT5p6c5Li6XCIrdHlwZStcIuS9jeaVsFwiLG51bWJlcik7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlcjtcclxuICAgIH0sXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIGJlZ2FpblRpbWluZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICBlbmRUaW1pbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldFNjb3JlVGltZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBlbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgbGV0IHRlbXBUaW1lID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcclxuICAgICAgICBpZiAodGVtcFRpbWUgPCAwIHx8IHRlbXBUaW1lID4gNTAwKSB7XHJcbiAgICAgICAgICAgIHRlbXBUaW1lID0gTWF0aC5yb3VuZChjYy5kaXJlY3Rvci5nZXRBbmltYXRpb25JbnRlcnZhbCgpICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEdNX0lORk8uY3VyclNjb3JlICs9IHRlbXBUaW1lO1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEZvcm1hdFRpbWU6IGZ1bmN0aW9uICh0aW1lKSB7XHJcblxyXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldFRpbWUodGltZSk7XHJcblxyXG4gICAgICAgIGxldCBtcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgLy8gbGV0IG1zU3RyaW5nID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuICAgICAgICBsZXQgbXNTdHJpbmcgPSBwYXJzZUludChtcyAvIDEwKSAlIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHNlY29uZFN0cmluZyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xyXG5cclxuICAgICAgICBsZXQgbWluU3RyaW5nID0gZGF0ZS5nZXRNaW51dGVzKCk7XHJcblxyXG4gICAgICAgIGlmIChtc1N0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIG1zU3RyaW5nID0gXCIwXCIgKyBtc1N0cmluZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlY29uZFN0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIHNlY29uZFN0cmluZyA9IFwiMFwiICsgc2Vjb25kU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWNvbmRTdHJpbmcgPSBzZWNvbmRTdHJpbmcgKyBcIjpcIjtcclxuXHJcbiAgICAgICAgaWYgKG1pblN0cmluZyA8IDEwKSB7XHJcbiAgICAgICAgICAgIG1pblN0cmluZyA9IFwiMFwiICsgbWluU3RyaW5nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtaW5TdHJpbmcgPSBtaW5TdHJpbmcgKyBcIjpcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1pblN0cmluZyArIHNlY29uZFN0cmluZyArIG1zU3RyaW5nO1xyXG5cclxuICAgIH0sXHJcbiAgICBwdXNoTGlzdGVyOmZ1bmN0aW9uICgpIHtcclxuICAgICAgICBcclxuICAgIH0sXHJcbiAgICByZW1vdmVBbGxMaXN0ZXI6ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIFxyXG4gICAgfSxcclxuXHJcbn07Il19