(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Script/GameManager.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, 'b0432BA295DjIOcuitdGKO1', 'GameManager'); // Script/GameManager.ts "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); // 主游戏控制类 var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property; var GameManager = /** @class */ (function (_super) { __extends(GameManager, _super); function GameManager() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.goal_Prefab = null; _this.middle_Prefab = null; return _this; } GameManager.prototype.onLoad = function () { }; GameManager.prototype.start = function () { var _this = this; this.fit(); this.init(); setTimeout(function () { cc.fx.Notifications.on("moveTube", _this.moveTube, _this); }, 1000); }; //初始化数据 GameManager.prototype.init = function () { this.tube1 = this.node.getChildByName("GameArea").getChildByName("tube1"); this.tube2 = this.node.getChildByName("GameArea").getChildByName("tube2"); this.tube3 = this.node.getChildByName("GameArea").getChildByName("tube3"); this.ball1 = this.node.getChildByName("GameArea").getChildByName("ball1"); this.ball2 = this.node.getChildByName("GameArea").getChildByName("ball2"); this.ball3 = this.node.getChildByName("GameArea").getChildByName("ball3"); this.goal = this.node.getChildByName("Goal"); this.middle = this.node.getChildByName("Middle"); // this.node.getChildByName("GameArea").getChildByName("tube1").zIndex = 1; // this.node.getChildByName("GameArea").getChildByName("tube2").zIndex = 1; // this.node.getChildByName("GameArea").getChildByName("tube3").zIndex = 1; this.initMap(); this.initBall(); }; //初始化 管子和球的关卡数据 GameManager.prototype.initMap = function () { this.tube_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].start, "start"); this.middle_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].middle, "middle"); this.goal_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].goal, "goal"); this.steps = cc.fx.GameConfig.LEVEL_INFO[0].steps; }; /** * 转变地图参数到程序可用 * @param tagArr tagArr为目标数组,可能为二维数组 * @param name 关卡,球和管子的类型,有start,middle,goal,其中middle是二维数组,最多为3个 */ GameManager.prototype.changeMap = function (tagArr, name) { //中间态可能有多组目标 故单独处理 if (name == "middle") { for (var k = 0; k < tagArr.length; k++) { var tempArr = tagArr[k]; for (var i = 0; i < tempArr.length; i++) { if (tempArr[i].length > 0) { for (var j = 0; j < tagArr[i].length; j++) { if (this.conversion_Char(tempArr[i][j])) tempArr[i][j] = this.conversion_Char(tempArr[i][j]); } } } } } else { for (var i = 0; i < tagArr.length; i++) { if (tagArr[i].length > 0) { for (var j = 0; j < tagArr[i].length; j++) { if (this.conversion_Char(tagArr[i][j])) tagArr[i][j] = this.conversion_Char(tagArr[i][j]); } } } } return tagArr; }; //转换符号,"rgb"配置改为123 GameManager.prototype.conversion_Char = function (str) { if (str == "r") return 1; else if (str == "g") return 2; else if (str == "b") return 3; }; //初始化球球 管子状态所有关都一样- GameManager.prototype.initBall = function () { //初始状态,球的初始化 for (var i = 0; i < this.tube_Array.length; i++) { if (this.tube_Array[i].length > 0) { for (var j = 0; j < this.tube_Array[i].length; j++) { var name = "ball" + this.tube_Array[i][j]; this[name].active = true; this[name].setPosition((i - 1) * 210, -100 + j * 100); this[name].getComponent("Ball").init(j == (this.tube_Array[i].length - 1) ? true : false, this.tube_Array[i][j]); } } } //最终状态,球的初始化 for (var i = 0; i < this.goal_Array.length; i++) { if (this.goal_Array[i].length > 0) { for (var j = 0; j < this.goal_Array[i].length; j++) { var name = this.goal_Array[i][j] + 4; this.goal.children[name].active = true; this.goal.children[name].setPosition((i - 1) * 210, -100 + j * 100); this.goal.children[name].getComponent("Ball").init(false, this.goal_Array[i][j]); } } } //中间状态,球的初始化 for (var i = 0; i < this.middle_Array.length; i++) { if (this.middle_Array.length > 0) { if (this.middle_Array.length == 1) { this.createMiddle(0); } else if (this.middle_Array.length == 3) { this.createMiddle(1); this.createMiddle(2); this.createMiddle(3); // this.middle.getChildByName("part").active = false; } } } }; GameManager.prototype.createMiddle = function (num) { var nodeName = "part"; if (num != 0) nodeName = nodeName + num; var mid = this.middle.getChildByName(nodeName); mid.active = true; var mid_Arr = this.middle_Array[num - 1]; for (var i = 0; i < mid_Arr.length; i++) { if (mid_Arr[i].length > 0) { for (var j = 0; j < mid_Arr[i].length; j++) { var name = mid_Arr[i][j] + 4; mid.children[name].active = true; mid.children[name].setPosition((i - 1) * 210, -100 + j * 100); mid.children[name].getComponent("Ball").init(false, mid_Arr[i][j]); } } } }; /** * 当管子内球发生移动时,改变管子数组,并且重置所有球是否可移动状态 * @param data data格式为对象 * id:number 移动球的自己的id * tube:number 移动到目标个管子,0,1,2 start_Pos:cc.v2(), 移动之前的位置 end_Pos:cc.v2() 移动之后的终点位置 */ GameManager.prototype.moveTube = function (data) { this.tube_Array[data.tube].push(data.id); var tube_Arr = this.tube_Array[1]; if (data.start_Pos.x == -210) { tube_Arr = this.tube_Array[0]; } else if (data.start_Pos.x == 210) { tube_Arr = this.tube_Array[2]; } if (tube_Arr.length > 0) tube_Arr.pop(); if (data.start_Pos.y != 50 && tube_Arr.length > 0) { var name = "ball" + tube_Arr[tube_Arr.length - 1]; this[name].getComponent("Ball").set_Touch(true); } if (data.end_Pos.y != 50) { tube_Arr = this.tube_Array[1]; if (data.end_Pos.x == -210) { tube_Arr = this.tube_Array[0]; } else if (data.end_Pos.x == 210) { tube_Arr = this.tube_Array[2]; } if (tube_Arr.length > 1) { var name = "ball" + tube_Arr[tube_Arr.length - 2]; console.log(name); this[name].getComponent("Ball").set_Touch(false); } } this.gameWin(); }; GameManager.prototype.gameWin = function () { var result = false; //如果没有中间状态,或者中间状态都已达到,则达到最终目标则算胜利 if (this.middle_Array.length == 0) { result = this.isArrEqual(this.goal_Array); if (result) { alert("成功"); } } else { for (var i = 0; i < this.middle_Array.length; i++) { if (this.isArrEqual(this.middle_Array[i])) { alert("达到中间态"); this.middle_Array.splice(i, 1); } } } }; //判断数组是否相同,如果join情况下都不相同就不用往下比较 GameManager.prototype.isArrEqual = function (tagArr) { var result = false; if (this.tube_Array.join() == tagArr.join()) { result = true; for (var i = 0; i < this.tube_Array.length; i++) { if (this.tube_Array[i].length != tagArr[i].length) { result = false; } } } return result; }; //根据是否全面屏,做独立适配方面 GameManager.prototype.fit = function () { var jg = this.setFit(); if (!jg) { } }; //判断全面屏 GameManager.prototype.getSetScreenResolutionFlag = function () { var size = cc.winSize; var width = size.width; var height = size.height; if ((height / width) > (16.2 / 9)) return false; return true; }; //判断全面屏适配 GameManager.prototype.setFit = function () { var flag = this.getSetScreenResolutionFlag(); if (flag) { } else { } return flag; }; //返回首页 GameManager.prototype.backScene = function () { cc.director.loadScene("LoadScene"); }; //下一关,或者重新开始,或者返回上一关,根据level决定 GameManager.prototype.reStart = function (type) { }; //获取时间戳 GameManager.prototype.getTime = function () { var timestamp = new Date().getTime(); return timestamp; }; //获胜 GameManager.prototype.passLevel = function () { }; //失败 GameManager.prototype.loseLevel = function (type) { }; //开始游戏 GameManager.prototype.startGame = function () { }; //如果是倒计时 调用此方法 GameManager.prototype.updateCountDownTime = function () { if (this.countTime > 0) { this.countTime -= 1; // this.time.string = cc.fx.GameTool.getTimeMargin(this.countTime); if (this.countTime < 5) { // cc.tween(this.time.node) // .to(0.25,{scale:1.5,color:cc.color(255,0,0)}) // .to(0.25,{scale:1,color:cc.color(255,255,255)}) // .start() var over = this.node.getChildByName("Over"); cc.tween(over) .to(0.2, { opacity: 255 }) .delay(0.1) .to(0.2, { opacity: 0 }) .start(); } if (this.countTime <= 0) { this.unschedule(this.updateCountDownTime); var time = 0; this.gameOver(time); } } }; //上传每次操作数据 GameManager.prototype.setData = function () { cc.fx.GameTool.setGameData(); }; //上传排行榜数据 GameManager.prototype.gameOver = function (time) { cc.fx.GameTool.setRank(time); this.node.getChildByName("GameOver").active = true; this.node.getChildByName("GameOver").opacity = 0; cc.tween(this.node.getChildByName("GameOver")) .to(0.4, { opacity: 255 }) .delay(2) .to(0.4, { opacity: 50 }) .call(function () { cc.director.loadScene("OverScene"); }) .start(); }; GameManager.prototype.onEnable = function () { // setTimeout(() => { // cc.fx.Notifications.on("moveTube", this.moveTube, this); // }, 100); }; GameManager.prototype.onDisable = function () { cc.fx.Notifications.off("moveTube", this.moveTube); }; GameManager.prototype.update = function (dt) { }; __decorate([ property(cc.Prefab) ], GameManager.prototype, "goal_Prefab", void 0); __decorate([ property(cc.Prefab) ], GameManager.prototype, "middle_Prefab", void 0); GameManager = __decorate([ ccclass ], GameManager); return GameManager; }(cc.Component)); exports.default = GameManager; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTO0FBQ0gsSUFBQSxLQUFzQixFQUFFLENBQUMsVUFBVSxFQUFsQyxPQUFPLGFBQUEsRUFBRSxRQUFRLGNBQWlCLENBQUM7QUFFMUM7SUFBeUMsK0JBQVk7SUFBckQ7UUFBQSxxRUFzVUM7UUFwVUcsaUJBQVcsR0FBYyxJQUFJLENBQUM7UUFFOUIsbUJBQWEsR0FBYyxJQUFJLENBQUM7O0lBa1VwQyxDQUFDO0lBbFRHLDRCQUFNLEdBQU4sY0FBVyxDQUFDO0lBQ1osMkJBQUssR0FBTDtRQUFBLGlCQU1DO1FBTEcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osVUFBVSxDQUFDO1lBQ1AsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQzVELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPO0lBQ1AsMEJBQUksR0FBSjtRQUNJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFB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LENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELDRCQUFNLEdBQU4sVUFBUSxFQUFFO0lBQ1YsQ0FBQztJQW5VRDtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO29EQUNVO0lBRTlCO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7c0RBQ1k7SUFKZixXQUFXO1FBRC9CLE9BQU87T0FDYSxXQUFXLENBc1UvQjtJQUFELGtCQUFDO0NBdFVELEFBc1VDLENBdFV3QyxFQUFFLENBQUMsU0FBUyxHQXNVcEQ7a0JBdFVvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8g5Li75ri45oiP5o6n5Yi257G7XHJcbmNvbnN0IHtjY2NsYXNzLCBwcm9wZXJ0eX0gPSBjYy5fZGVjb3JhdG9yO1xyXG5AY2NjbGFzc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lTWFuYWdlciBleHRlbmRzIGNjLkNvbXBvbmVudCB7XHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgZ29hbF9QcmVmYWI6IGNjLlByZWZhYiA9IG51bGw7XHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgbWlkZGxlX1ByZWZhYjogY2MuUHJlZmFiID0gbnVsbDtcclxuXHJcbiAgICBjb3VudFRpbWU6IG51bWJlcjsgIC8v5ri45oiP5oC7ZGFvamlzaGlcclxuICAgIHN0ZXBzOiAgbnVtYmVyOyAgICAgLy/lnLDlm77mnIDlpKfmraXmlbDpmZDliLZcclxuICAgIHR1YmUxOiBjYy5Ob2RlOyAgICAgLy/nrqHlrZAxXHJcbiAgICB0dWJlMjogY2MuTm9kZTsgICAgIC8v566h5a2QMlxyXG4gICAgdHViZTM6IGNjLk5vZGU7ICAgICAvL+euoeWtkDNcclxuICAgIGJhbGwxOiBjYy5Ob2RlOyAgICAgLy/nkIMxXHJcbiAgICBiYWxsMjogY2MuTm9kZTsgICAgIC8v55CDMlxyXG4gICAgYmFsbDM6IGNjLk5vZGU7ICAgICAvL+eQgzNcclxuICAgIGdvYWw6IGNjLk5vZGU7ICAgICAvL+euoeWtkDFcclxuICAgIG1pZGRsZTogY2MuTm9kZTsgICAgIC8v566h5a2QMlxyXG4gICAgdHViZV9BcnJheTogYW55Oy8v566h5a2Q5pWw57uEXHJcbiAgICBnb2FsX0FycmF5OiBhbnk7Ly/nrqHlrZDmlbDnu4RcclxuICAgIG1pZGRsZV9BcnJheTogYW55Oy8v566h5a2Q5pWw57uEXHJcblxyXG4gICAgb25Mb2FkICgpIHt9XHJcbiAgICBzdGFydCAoKSB7XHJcbiAgICAgICAgdGhpcy5maXQoKTtcclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vbihcIm1vdmVUdWJlXCIsIHRoaXMubW92ZVR1YmUsIHRoaXMpO1xyXG4gICAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW5pWw5o2uXHJcbiAgICBpbml0KCl7XHJcbiAgICAgICAgdGhpcy50dWJlMSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTFcIik7XHJcbiAgICAgICAgdGhpcy50dWJlMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTJcIik7XHJcbiAgICAgICAgdGhpcy50dWJlMyA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTNcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDFcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDJcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMyA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDNcIik7XHJcbiAgICAgICAgdGhpcy5nb2FsID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR29hbFwiKTtcclxuICAgICAgICB0aGlzLm1pZGRsZSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIk1pZGRsZVwiKTtcclxuICAgICAgICAvLyB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lQXJlYVwiKS5nZXRDaGlsZEJ5TmFtZShcInR1YmUxXCIpLnpJbmRleCA9IDE7XHJcbiAgICAgICAgLy8gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZUFyZWFcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0dWJlMlwiKS56SW5kZXggPSAxO1xyXG4gICAgICAgIC8vIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTNcIikuekluZGV4ID0gMTtcclxuICAgICAgICB0aGlzLmluaXRNYXAoKVxyXG4gICAgICAgIHRoaXMuaW5pdEJhbGwoKTtcclxuICAgIH1cclxuICAgIC8v5Yid5aeL5YyWIOeuoeWtkOWSjOeQg+eahOWFs+WNoeaVsOaNrlxyXG4gICAgaW5pdE1hcCgpe1xyXG4gICAgICAgIHRoaXMudHViZV9BcnJheSAgPSB0aGlzLmNoYW5nZU1hcChjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk9bMF0uc3RhcnQsXCJzdGFydFwiKTtcclxuICAgICAgICB0aGlzLm1pZGRsZV9BcnJheSA9IHRoaXMuY2hhbmdlTWFwKGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GT1swXS5taWRkbGUsXCJtaWRkbGVcIik7XHJcbiAgICAgICAgdGhpcy5nb2FsX0FycmF5ID0gdGhpcy5jaGFuZ2VNYXAoY2MuZnguR2FtZUNvbmZpZy5MRVZFTF9JTkZPWzBdLmdvYWwsXCJnb2FsXCIpO1xyXG4gICAgICAgIHRoaXMuc3RlcHMgPSBjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk9bMF0uc3RlcHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOi9rOWPmOWcsOWbvuWPguaVsOWIsOeoi+W6j+WPr+eUqFxyXG4gICAgICogQHBhcmFtIHRhZ0FyciB0YWdBcnLkuLrnm67moIfmlbDnu4TvvIzlj6/og73kuLrkuoznu7TmlbDnu4RcclxuICAgICAqIEBwYXJhbSBuYW1lIOWFs+WNoe+8jOeQg+WSjOeuoeWtkOeahOexu+Wei++8jOaciXN0YXJ0LG1pZGRsZSxnb2FsLOWFtuS4rW1pZGRsZeaYr+S6jOe7tOaVsOe7hO+8jOacgOWkmuS4ujPkuKpcclxuICAgICAqL1xyXG4gICAgY2hhbmdlTWFwKHRhZ0FyciwgbmFtZSl7XHJcbiAgICAgICAgLy/kuK3pl7TmgIHlj6/og73mnInlpJrnu4Tnm67moIcgIOaVheWNleeLrOWkhOeQhlxyXG4gICAgICAgIGlmKG5hbWUgPT0gXCJtaWRkbGVcIil7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaz0wOyBrPHRhZ0Fyci5sZW5ndGg7aysrKXtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wQXJyID0gdGFnQXJyW2tdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7IGk8dGVtcEFyci5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0ZW1wQXJyW2ldLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGo9MDsgajx0YWdBcnJbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jb252ZXJzaW9uX0NoYXIodGVtcEFycltpXVtqXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEFycltpXVtqXSA9IHRoaXMuY29udmVyc2lvbl9DaGFyKHRlbXBBcnJbaV1bal0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPHRhZ0Fyci5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgIGlmKHRhZ0FycltpXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGo9MDsgajx0YWdBcnJbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNvbnZlcnNpb25fQ2hhcih0YWdBcnJbaV1bal0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQXJyW2ldW2pdID0gdGhpcy5jb252ZXJzaW9uX0NoYXIodGFnQXJyW2ldW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhZ0FycjtcclxuICAgIH1cclxuICAgIC8v6L2s5o2i56ym5Y+3LFwicmdiXCLphY3nva7mlLnkuLoxMjNcclxuICAgIGNvbnZlcnNpb25fQ2hhcihzdHI6IHN0cmluZyl7XHJcbiAgICAgICAgaWYoc3RyID09IFwiclwiKSByZXR1cm4gMTtcclxuICAgICAgICBlbHNlIGlmKHN0ciA9PSBcImdcIikgcmV0dXJuIDI7XHJcbiAgICAgICAgZWxzZSBpZihzdHIgPT0gXCJiXCIpIHJldHVybiAzO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW55CD55CDIOeuoeWtkOeKtuaAgeaJgOacieWFs+mDveS4gOagty1cclxuICAgIGluaXRCYWxsKCl7XHJcbiAgICAgICAgLy/liJ3lp4vnirbmgIHvvIznkIPnmoTliJ3lp4vljJZcclxuICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnR1YmVfQXJyYXkubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZih0aGlzLnR1YmVfQXJyYXlbaV0ubGVuZ3RoID4gMCApe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBqID0wOyBqPHRoaXMudHViZV9BcnJheVtpXS5sZW5ndGg7IGorKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBcImJhbGxcIiArIHRoaXMudHViZV9BcnJheVtpXVtqXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzW25hbWVdLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5zZXRQb3NpdGlvbigoaS0xKSoyMTAsLTEwMCtqKjEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLmluaXQoaj09KHRoaXMudHViZV9BcnJheVtpXS5sZW5ndGgtMSk/dHJ1ZTpmYWxzZSx0aGlzLnR1YmVfQXJyYXlbaV1bal0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v5pyA57uI54q25oCB77yM55CD55qE5Yid5aeL5YyWXHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8dGhpcy5nb2FsX0FycmF5Lmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYodGhpcy5nb2FsX0FycmF5W2ldLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9MDsgajx0aGlzLmdvYWxfQXJyYXlbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nb2FsX0FycmF5W2ldW2pdICsgNDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdvYWwuY2hpbGRyZW5bbmFtZV0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdvYWwuY2hpbGRyZW5bbmFtZV0uc2V0UG9zaXRpb24oKGktMSkqMjEwLC0xMDAraioxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ29hbC5jaGlsZHJlbltuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLmluaXQoZmFsc2UsdGhpcy5nb2FsX0FycmF5W2ldW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+S4remXtOeKtuaAge+8jOeQg+eahOWIneWni+WMllxyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICBpZih0aGlzLm1pZGRsZV9BcnJheS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aCA9PSAxKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU1pZGRsZSgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYodGhpcy5taWRkbGVfQXJyYXkubGVuZ3RoID09IDMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMubWlkZGxlLmdldENoaWxkQnlOYW1lKFwicGFydFwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVNaWRkbGUobnVtKXtcclxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcInBhcnRcIjtcclxuICAgICAgICBpZihudW0gIT0gMCkgbm9kZU5hbWUgPSBub2RlTmFtZSArIG51bTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgbWlkID0gdGhpcy5taWRkbGUuZ2V0Q2hpbGRCeU5hbWUobm9kZU5hbWUpO1xyXG4gICAgICAgIG1pZC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBtaWRfQXJyID0gdGhpcy5taWRkbGVfQXJyYXlbbnVtLTFdO1xyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPG1pZF9BcnIubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihtaWRfQXJyW2ldLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9MDsgajxtaWRfQXJyW2ldLmxlbmd0aDsgaisrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG1pZF9BcnJbaV1bal0gKyA0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1pZC5jaGlsZHJlbltuYW1lXS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIG1pZC5jaGlsZHJlbltuYW1lXS5zZXRQb3NpdGlvbigoaS0xKSoyMTAsLTEwMCtqKjEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWlkLmNoaWxkcmVuW25hbWVdLmdldENvbXBvbmVudChcIkJhbGxcIikuaW5pdChmYWxzZSxtaWRfQXJyW2ldW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+euoeWtkOWGheeQg+WPkeeUn+enu+WKqOaXtu+8jOaUueWPmOeuoeWtkOaVsOe7hO+8jOW5tuS4lOmHjee9ruaJgOacieeQg+aYr+WQpuWPr+enu+WKqOeKtuaAgVxyXG4gICAgICogQHBhcmFtIGRhdGEgZGF0YeagvOW8j+S4uuWvueixoVxyXG4gICAgICogIGlkOm51bWJlciAgIOenu+WKqOeQg+eahOiHquW3seeahGlkXHJcbiAgICAgKiAgdHViZTpudW1iZXIg56e75Yqo5Yiw55uu5qCH5Liq566h5a2Q77yMMCwxLDJcclxuICAgICAgICBzdGFydF9Qb3M6Y2MudjIoKSwg56e75Yqo5LmL5YmN55qE5L2N572uXHJcbiAgICAgICAgZW5kX1BvczpjYy52MigpICAgIOenu+WKqOS5i+WQjueahOe7iOeCueS9jee9rlxyXG4gICAgICovXHJcbiAgICBtb3ZlVHViZShkYXRhKXtcclxuICAgICAgICB0aGlzLnR1YmVfQXJyYXlbZGF0YS50dWJlXS5wdXNoKGRhdGEuaWQpO1xyXG4gICAgICAgIHZhciB0dWJlX0FyciA9IHRoaXMudHViZV9BcnJheVsxXTtcclxuICAgICAgICBpZihkYXRhLnN0YXJ0X1Bvcy54ID09IC0yMTApe1xyXG4gICAgICAgICAgICB0dWJlX0FyciA9IHRoaXMudHViZV9BcnJheVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihkYXRhLnN0YXJ0X1Bvcy54ID09IDIxMCl7XHJcbiAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0dWJlX0Fyci5sZW5ndGggPiAwKSB0dWJlX0Fyci5wb3AoKTtcclxuICAgICAgICBpZihkYXRhLnN0YXJ0X1Bvcy55ICE9IDUwICYmIHR1YmVfQXJyLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBsZXQgbmFtZSA9IFwiYmFsbFwiICsgdHViZV9BcnJbdHViZV9BcnIubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICB0aGlzW25hbWVdLmdldENvbXBvbmVudChcIkJhbGxcIikuc2V0X1RvdWNoKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihkYXRhLmVuZF9Qb3MueSAhPSA1MCl7XHJcbiAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzFdO1xyXG4gICAgICAgICAgICBpZihkYXRhLmVuZF9Qb3MueCA9PSAtMjEwKXtcclxuICAgICAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YS5lbmRfUG9zLnggPT0gMjEwKXtcclxuICAgICAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzJdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHR1YmVfQXJyLmxlbmd0aCA+IDEpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBcImJhbGxcIiArIHR1YmVfQXJyW3R1YmVfQXJyLmxlbmd0aC0yXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLnNldF9Ub3VjaChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nYW1lV2luKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2FtZVdpbigpe1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAvL+WmguaenOayoeacieS4remXtOeKtuaAge+8jOaIluiAheS4remXtOeKtuaAgemDveW3sui+vuWIsO+8jOWImei+vuWIsOacgOe7iOebruagh+WImeeul+iDnOWIqVxyXG4gICAgICAgIGlmKHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5pc0FyckVxdWFsKHRoaXMuZ29hbF9BcnJheSk7XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIuaIkOWKn1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLm1pZGRsZV9BcnJheS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmlzQXJyRXF1YWwodGhpcy5taWRkbGVfQXJyYXlbaV0pKXtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChcIui+vuWIsOS4remXtOaAgVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pZGRsZV9BcnJheS5zcGxpY2UoaSwxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5Yik5pat5pWw57uE5piv5ZCm55u45ZCM77yM5aaC5p6cam9pbuaDheWGteS4i+mDveS4jeebuOWQjOWwseS4jeeUqOW+gOS4i+avlOi+g1xyXG4gICAgaXNBcnJFcXVhbCh0YWdBcnIpe1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICBpZih0aGlzLnR1YmVfQXJyYXkuam9pbigpID09IHRhZ0Fyci5qb2luKCkpe1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnR1YmVfQXJyYXkubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy50dWJlX0FycmF5W2ldLmxlbmd0aCAhPSB0YWdBcnJbaV0ubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8v5qC55o2u5piv5ZCm5YWo6Z2i5bGP77yM5YGa54us56uL6YCC6YWN5pa56Z2iXHJcbiAgICBmaXQoKXtcclxuICAgICAgICB2YXIgamcgPSB0aGlzLnNldEZpdCgpO1xyXG4gICAgICAgIGlmKCFqZyl7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5Yik5pat5YWo6Z2i5bGPXHJcbiAgICBnZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZyAoKSB7XHJcbiAgICAgICAgbGV0IHNpemUgPSBjYy53aW5TaXplO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHNpemUud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGlmICgoaGVpZ2h0IC8gd2lkdGgpID4gKDE2LjIgLyA5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy/liKTmlq3lhajpnaLlsY/pgILphY1cclxuICAgIHNldEZpdCAoKSB7XHJcbiAgICAgICAgbGV0IGZsYWcgPSB0aGlzLmdldFNldFNjcmVlblJlc29sdXRpb25GbGFnKCk7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuICAgIC8v6L+U5Zue6aaW6aG1XHJcbiAgICBiYWNrU2NlbmUoKXtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJMb2FkU2NlbmVcIik7XHJcbiAgICB9XHJcbiAgICAvL+S4i+S4gOWFs++8jOaIluiAhemHjeaWsOW8gOWni++8jOaIluiAhei/lOWbnuS4iuS4gOWFs++8jOagueaNrmxldmVs5Yaz5a6aXHJcbiAgICByZVN0YXJ0KHR5cGUpe1xyXG5cclxuICAgIH1cclxuICAgIC8v6I635Y+W5pe26Ze05oizXHJcbiAgICBnZXRUaW1lKCl7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDtcclxuICAgIH1cclxuICAgIC8v6I636IOcXHJcbiAgICBwYXNzTGV2ZWwoKXtcclxuXHJcbiAgICB9XHJcbiAgICAvL+Wksei0pVxyXG4gICAgbG9zZUxldmVsKHR5cGUpe1xyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIC8v5byA5aeL5ri45oiPXHJcbiAgICBzdGFydEdhbWUoKXtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v5aaC5p6c5piv5YCS6K6h5pe2IOiwg+eUqOatpOaWueazlVxyXG4gICAgdXBkYXRlQ291bnREb3duVGltZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY291bnRUaW1lID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50VGltZSAtPSAxO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRpbWUuc3RyaW5nID0gIGNjLmZ4LkdhbWVUb29sLmdldFRpbWVNYXJnaW4odGhpcy5jb3VudFRpbWUpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvdW50VGltZSA8IDUpe1xyXG4gICAgICAgICAgICAgICAgLy8gY2MudHdlZW4odGhpcy50aW1lLm5vZGUpXHJcbiAgICAgICAgICAgICAgICAvLyAudG8oMC4yNSx7c2NhbGU6MS41LGNvbG9yOmNjLmNvbG9yKDI1NSwwLDApfSlcclxuICAgICAgICAgICAgICAgIC8vIC50bygwLjI1LHtzY2FsZToxLGNvbG9yOmNjLmNvbG9yKDI1NSwyNTUsMjU1KX0pXHJcbiAgICAgICAgICAgICAgICAvLyAuc3RhcnQoKVxyXG4gICAgICAgICAgICAgICAgbGV0IG92ZXIgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJPdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MudHdlZW4ob3ZlcilcclxuICAgICAgICAgICAgICAgIC50bygwLjIse29wYWNpdHk6MjU1fSlcclxuICAgICAgICAgICAgICAgIC5kZWxheSgwLjEpXHJcbiAgICAgICAgICAgICAgICAudG8oMC4yLHtvcGFjaXR5OjB9KVxyXG4gICAgICAgICAgICAgICAgLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy5jb3VudFRpbWUgPD0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy51cGRhdGVDb3VudERvd25UaW1lKTtcclxuICAgICAgICAgICAgICAgIHZhciB0aW1lID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2FtZU92ZXIodGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+S4iuS8oOavj+asoeaTjeS9nOaVsOaNrlxyXG4gICAgc2V0RGF0YSgpe1xyXG4gICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRHYW1lRGF0YSgpO1xyXG4gICAgfVxyXG4gICAgLy/kuIrkvKDmjpLooYzmppzmlbDmja5cclxuICAgIGdhbWVPdmVyKHRpbWUpe1xyXG4gICAgICAgIGNjLmZ4LkdhbWVUb29sLnNldFJhbmsodGltZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZU92ZXJcIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lT3ZlclwiKS5vcGFjaXR5ID0gMDtcclxuICAgICAgICBjYy50d2Vlbih0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lT3ZlclwiKSlcclxuICAgICAgICAudG8oMC40LHtvcGFjaXR5OjI1NX0pXHJcbiAgICAgICAgLmRlbGF5KDIpXHJcbiAgICAgICAgLnRvKDAuNCx7b3BhY2l0eTo1MH0pXHJcbiAgICAgICAgLmNhbGwoKCkgPT57XHJcbiAgICAgICAgICAgIGNjLmRpcmVjdG9yLmxvYWRTY2VuZShcIk92ZXJTY2VuZVwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdGFydCgpXHJcbiAgICB9XHJcblxyXG4gICAgb25FbmFibGUgKCkge1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9uKFwibW92ZVR1YmVcIiwgdGhpcy5tb3ZlVHViZSwgdGhpcyk7XHJcbiAgICAgICAgLy8gfSwgMTAwKTtcclxuXHJcbiAgICB9XHJcbiAgICBvbkRpc2FibGUgKCkge1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub2ZmKFwibW92ZVR1YmVcIiwgdGhpcy5tb3ZlVHViZSk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGUgKGR0KSB7XHJcbiAgICB9XHJcbn1cclxuIl19