FlyUp/temp/quick-scripts/dst/assets/Script/GameManager.js
2024-06-11 16:02:27 +08:00

554 lines
74 KiB
JavaScript

(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, 'b26a49RCSFPT4C+F7xAd62t', 'GameManager');
// Script/GameManager.ts
"use strict";
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
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 GameData_1 = require("./GameData");
var GameTool_1 = require("./tool/GameTool");
var Notification_1 = require("./tool/Notification");
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.Camera = null;
_this.topUI = null;
_this.Player = null;
_this.Ground = null;
_this.Xin = null;
_this.time = null;
_this.GameOver = null;
_this.Tip = null;
_this.blockPrefab = [];
return _this;
}
GameManager_1 = GameManager;
// LIFE-CYCLE CALLBACKS:
GameManager.prototype.onLoad = function () {
// cc.game.setFrameRate(59.9);
// 示例使用
var manager = cc.director.getCollisionManager();
manager.enabled = true;
// manager.enabledDebugDraw = true;
GameManager_1._instance = this;
GameData_1.default._instance.GM_INFO.probation = false;
};
GameManager.prototype.onEnable = function () {
Notification_1.Notification.on("createBlock", this.createBlock, this);
Notification_1.Notification.on("addScore", this.addScore, this);
Notification_1.Notification.on("createCrackBlock", this.createCrackBlock, this);
Notification_1.Notification.on("showGround", this.showGround, this);
Notification_1.Notification.on("death", this.getDeath, this);
Notification_1.Notification.on("jump", this.jump, this);
Notification_1.Notification.on("setData", this.setData, this);
};
GameManager.prototype.onDestroy = function () {
Notification_1.Notification.off("createBlock", this.createBlock);
Notification_1.Notification.off("addScore", this.addScore);
Notification_1.Notification.off("createBlock", this.createCrackBlock);
Notification_1.Notification.off("death", this.getDeath);
Notification_1.Notification.off("jump", this.jump);
Notification_1.Notification.off("showGround", this.showGround);
Notification_1.Notification.off("setData", this.setData);
};
GameManager.prototype.init = function () {
this.drop = this.topUI.y - this.Camera.node.y;
this.score = 0;
this.oldSpeed = 10;
this.begin = true;
this.over = false;
this.interfere = false;
this.round = 0;
this.level = 0;
GameData_1.default._instance.GM_INFO.levelMax = 1;
GameData_1.default._instance.GM_INFO.difficultyMax = 1;
GameData_1.default._instance.GM_INFO.life = 3;
this.blockArray = [];
this.cameraMove = false;
this.countTime = 120;
this.topUI.getChildByName("xin1").active = true;
this.topUI.getChildByName("xin2").active = true;
this.topUI.getChildByName("xin3").active = true;
this.topUI.getChildByName("star1").active = false;
this.topUI.getChildByName("star2").active = false;
this.topUI.getChildByName("star3").active = false;
GameData_1.default._instance.LEVEL_init();
this.schedule(this.updateCountDownTime, 1);
};
GameManager.prototype.start = function () {
// this.node.on(cc.Node.EventType.TOUCH_START, this.jump, this);
this.fit();
this.init();
if (GameData_1.default._instance.GM_INFO.probation)
this.startGuide();
else
this.startGame();
};
//根据是否全面屏,做独立适配方面
GameManager.prototype.fit = function () {
this.node.getChildByName("bg2").y = -2167.675;
var jg = this.setFit();
if (!jg) {
this.node.getChildByName("bg2").y = -2100;
this.topUI.y = 660;
}
};
//判断全面屏
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.startGuide = function () {
//打开卷
var left = this.Tip.getChildByName("left");
var right = this.Tip.getChildByName("right");
var tip = this.Tip.getChildByName("tip");
left.width = 0;
right.width = 0;
tip.opacity = 0;
// cc.tween(left)
// .to(0.25,{width:348})
// .start();
// cc.tween(right)
// .to(0.25,{width:348})
// .start();
// cc.tween(tip)
// .delay(0.15)
// .to(0.15,{opacity:255})
// .start();
};
GameManager.prototype.showGround = function (tempY) {
var _this = this;
setTimeout(function () {
_this.Ground.active = true;
_this.Ground.y = tempY;
}, 500);
};
GameManager.prototype.jump = function () {
this.Player.getComponent("Player").jump();
};
GameManager.prototype.startGame = function () {
this.createBlock();
};
GameManager.prototype.addScore = function (score) {
var _this = this;
GameData_1.default._instance.CLICK_DATA.getScore = parseInt(score);
GameManager_1._instance.score += parseInt(score);
GameData_1.default._instance.CLICK_DATA.totalScore = GameManager_1._instance.score;
this.topUI.getChildByName("nandu").getComponent(cc.Label).string = GameManager_1._instance.score + "";
var scale = GameManager_1._instance.score / GameData_1.default._instance.LEVEL_INFO.scoreMax;
cc.tween(this.topUI.getChildByName("progress").getComponent(cc.Sprite))
.to(0.5, { fillRange: scale })
.call(function () {
if (scale >= GameData_1.default._instance.LEVEL_INFO.star1 && !_this.topUI.getChildByName("star1").active) {
_this.topUI.getChildByName("star1").active = true;
}
if (scale >= GameData_1.default._instance.LEVEL_INFO.star2 && !_this.topUI.getChildByName("star2").active) {
_this.topUI.getChildByName("star2").active = true;
}
if (scale >= GameData_1.default._instance.LEVEL_INFO.star3 && !_this.topUI.getChildByName("star3").active) {
_this.topUI.getChildByName("star3").active = true;
// GameData._instance.scoreMax = 150000;
}
})
.start();
};
GameManager.prototype.createBlock = function () {
if (this.over == false && this.begin == true) {
this.Ground.active = false;
var num = Math.floor(Math.random() * 12);
if (this.round <= 10 && num == 5) {
num = Math.floor(Math.random() * 6 + 6);
}
var block = cc.instantiate(this.blockPrefab[num]);
var height = this.Player.getComponent("Player").basicHeight + GameData_1.default._instance.GM_INFO.blockMin;
if (num > GameData_1.default._instance.GM_INFO.blockScale) {
height += block.height + GameData_1.default._instance.GM_INFO.blockMax;
GameData_1.default._instance.CLICK_DATA.height = true;
}
if (height >= 0 && this.cameraMove == false) {
this.countHeight = this.Player.getComponent("Player").basicHeight - this.Camera.node.y;
this.cameraMove = true;
}
block.setPosition(cc.v2(this.round % 2 == 0 ? 480 : -480, height));
block.parent = this.node.getChildByName("Block");
block.zIndex = 10;
this.round += 1;
this.level += 1;
if (this.round > GameData_1.default._instance.GM_INFO.levelMax)
GameData_1.default._instance.GM_INFO.levelMax = this.round;
GameData_1.default._instance.CLICK_DATA.level = this.round;
GameData_1.default._instance.CLICK_DATA.round = this.level;
GameData_1.default._instance.LEVEL_INFO.layer += GameData_1.default._instance.LEVEL_INFO.layerAdd;
GameData_1.default._instance.LEVEL_INFO.speed += GameData_1.default._instance.LEVEL_INFO.addSpeed;
if (GameData_1.default._instance.LEVEL_INFO.reduceSpeed <= 100)
GameData_1.default._instance.LEVEL_INFO.reduceSpeed += GameData_1.default._instance.LEVEL_INFO.jiansu;
if (this.round == GameData_1.default._instance.LEVEL_INFO.round1)
GameData_1.default._instance.LEVEL_INFO.jiansu = 2;
else if (this.round == GameData_1.default._instance.LEVEL_INFO.round2)
GameData_1.default._instance.LEVEL_INFO.jiansu = 1;
else if (this.round == GameData_1.default._instance.LEVEL_INFO.round3)
GameData_1.default._instance.LEVEL_INFO.jiansu = 0.5;
}
};
//虚假碎裂块
GameManager.prototype.createCrackBlock = function () {
this.interfere = true;
GameData_1.default._instance.CLICK_DATA.fake = this.interfere;
if (this.round > 1)
this.destroyBlock();
if (this.over == false && this.begin == true) {
var block = cc.instantiate(this.blockPrefab[12]);
var height = this.Player.getComponent("Player").basicHeight;
if (GameData_1.default._instance.CLICK_DATA.height == true) {
height += block.height / 2;
}
block.setPosition(cc.v2(this.round % 2 == 0 ? 480 : -480, height));
block.parent = this.node.getChildByName("CrackBlock");
block.zIndex = 1;
}
};
GameManager.prototype.destroyBlock = function () {
if (this.node) {
if (this.node.getChildByName("CrackBlock")) {
if (this.node.getChildByName("CrackBlock").children) {
var block2 = this.node.getChildByName("CrackBlock").children;
for (var i = 0; i < block2.length; i++) {
if (block2[i]) {
block2[i].getComponent("Block").hide();
}
}
}
}
}
};
GameManager.prototype.xinAction = function () {
var xin = this.topUI.getChildByName("xin1");
if (GameData_1.default._instance.GM_INFO.life == 2)
xin = this.topUI.getChildByName("xin3");
else if (GameData_1.default._instance.GM_INFO.life == 1)
xin = this.topUI.getChildByName("xin2");
cc.tween(xin)
.to(0.6, { scale: 1.6, opacity: 0 })
.call(function () {
xin.active = false;
})
.start();
};
//死亡
GameManager.prototype.getDeath = function () {
if (GameData_1.default._instance.GM_INFO.life > 0) {
GameData_1.default._instance.GM_INFO.life -= 1;
this.getDevive(1);
}
else {
GameData_1.default._instance.GM_INFO.life = -1;
this.getDevive(3);
}
};
//复活
GameManager.prototype.getDevive = function (time) {
var _this = this;
this.round = 0;
GameData_1.default._instance.LEVEL_init();
if (this.topUI.getChildByName("star3").active == true) {
// GameData._instance.LEVEL_INFO.scoreMax = 150000;
}
this.interfere = false;
GameData_1.default._instance.CLICK_DATA.fake = this.interfere;
var block = this.node.getChildByName("Block").children;
for (var i = 0; i < block.length; i++) {
if (block[i]) {
block[i].active = false;
}
}
var block2 = this.node.getChildByName("CrackBlock").children;
for (var i = 0; i < block2.length; i++) {
if (block2[i]) {
block2[i].active = false;
}
}
// this.blockArray = [];
var actionTime = 1;
if (this.Player.y > 500) {
actionTime = (this.Player.y + 500) / 1000 * actionTime;
}
cc.tween(this.Player)
.to(actionTime, { y: -500 }, { easing: 'cubicIn' })
.call(function () {
_this.Player.getComponent("Player").xinAction();
})
.delay(0.5)
.call(function () {
_this.xinAction();
_this.Player.getComponent("Player").init();
if (time > 1) {
_this.Xin.parent.active = true;
_this.Xin.getComponent(cc.Sprite).fillRange = 0;
cc.tween(_this.Xin.getComponent(cc.Sprite))
.to(time, { fillRange: 1 })
.delay(0.3)
.call(function () {
_this.Xin.parent.active = false;
})
.delay(0)
.call(function () {
_this.createBlock();
})
.start();
}
else {
setTimeout(function () {
_this.createBlock();
}, (time + 0.5) * 1000);
}
})
.start();
};
GameManager.prototype.setData = function () {
GameData_1.default._instance.CLICK_DATA.timer = this.countTime;
GameData_1.default._instance.CLICK_DATA.level = this.round;
GameData_1.default._instance.CLICK_DATA.round = this.level;
//CLICK_DATA 数据处理完毕后调用上传接口 上传接口内CLICK_DATA不做改变
GameTool_1.GameTool.setGameData();
};
//获取matchId 用于上传每次点击数据里面记录id方便查询
GameManager.prototype.getMatchId = function () {
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(matchId[10]);
if (this.level == 1) {
char += 1;
}
matchId = matchId.slice(0, 10) + char + "";
GameData_1.default._instance.GM_INFO.matchId = matchId;
cc.sys.localStorage.setItem("matchId", matchId);
}
}
return matchId;
};
//检测matchId 如果有缓存以前的nanana数据清除
GameManager.prototype.containsNanana = function (str) {
return /na/i.test(str);
};
//重新设置MatchId
GameManager.prototype.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;
};
GameManager.prototype.updateCountDownTime = function () {
var _this = this;
if (this.countTime > 0) {
this.countTime -= 1;
this.time.string = this.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();
}
if (this.countTime <= 0) {
this.unschedule(this.updateCountDownTime);
this.begin = false;
this.over = true;
this.overStop();
this.setRank();
setTimeout(function () {
_this.overOpen();
}, 2000);
}
}
};
//停止所有动画
GameManager.prototype.overStop = function () {
if (this.Player.getComponent("Player").jumpAction)
this.Player.getComponent("Player").jumpAction.stop();
var block = this.node.getChildByName("Block").children;
for (var i = 0; i < block.length; i++) {
if (block[i]) {
if (block[i].getComponent("Block").tween)
block[i].getComponent("Block").tween.stop();
}
}
var block2 = this.node.getChildByName("CrackBlock").children;
for (var i = 0; i < block2.length; i++) {
if (block2[i]) {
if (block2[i].getComponent("Block").tween)
block2[i].getComponent("Block").tween.stop();
}
}
};
GameManager.prototype.setRank = function () {
GameData_1.default._instance.GM_INFO.score = this.score;
GameTool_1.GameTool.setRank();
};
GameManager.prototype.overOpen = function () {
this.Player.active = false;
var block = this.node.getChildByName("Block").children;
for (var i = 0; i < block.length; i++) {
if (block[i]) {
block[i].active = false;
}
}
this.destroyBlock();
this.GameOver.active = true;
this.GameOver.getChildByName("score").getComponent(cc.Label).string = this.score + "";
this.GameOver.getChildByName("level").getComponent(cc.Label).string =
GameData_1.default._instance.GM_INFO.levelMax + "";
this.GameOver.getChildByName("difficulty").getComponent(cc.Label).string =
GameData_1.default._instance.GM_INFO.difficultyMax + "";
};
GameManager.prototype.backLoad = function () {
cc.director.loadScene("LoadScene");
};
GameManager.prototype.again = function () {
cc.director.loadScene("GameScene");
};
GameManager.prototype.openRank = function () {
cc.director.loadScene("RankScene");
};
//时间格式转换
GameManager.prototype.getTimeMargin = function (second) {
var total = 0;
total = second;
var hour = 0;
hour = parseInt((total / 3600) + ""); //计算整数小时数
var afterHour = total - hour * 60 * 60; //取得算出小时数后剩余的秒数
var min = parseInt((afterHour / 60) + ""); //计算整数分
var m = "" + min;
if (min < 10)
m = "0" + min;
var afterMin = total - hour * 60 * 60 - min * 60; //取得算出分后剩余的秒数
var miao = afterMin + "";
if (afterMin < 10)
miao = "0" + afterMin;
return m + ':' + miao;
};
GameManager.prototype.update = function (dt) {
if (this.cameraMove == true && this.over == false) {
this.Camera.node.y = this.Player.y - this.countHeight;
if (this.Camera.node.y <= 0)
this.Camera.node.y = 0;
this.topUI.y = this.Camera.node.y + this.drop;
}
};
var GameManager_1;
__decorate([
property(cc.Camera)
], GameManager.prototype, "Camera", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "topUI", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "Player", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "Ground", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "Xin", void 0);
__decorate([
property(cc.Label)
], GameManager.prototype, "time", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "GameOver", void 0);
__decorate([
property(cc.Node)
], GameManager.prototype, "Tip", void 0);
__decorate([
property([cc.Prefab])
], GameManager.prototype, "blockPrefab", void 0);
GameManager = GameManager_1 = __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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0JBQW9CO0FBQ3BCLHdFQUF3RTtBQUN4RSxtQkFBbUI7QUFDbkIsa0ZBQWtGO0FBQ2xGLDhCQUE4QjtBQUM5QixrRkFBa0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRix1Q0FBa0M7QUFFbEMsNENBQTJDO0FBQzNDLG9EQUFtRDtBQUU3QyxJQUFBLEtBQXNCLEVBQUUsQ0FBQyxVQUFVLEVBQWxDLE9BQU8sYUFBQSxFQUFFLFFBQVEsY0FBaUIsQ0FBQztBQUcxQztJQUF5QywrQkFBWTtJQUFyRDtRQUFBLHFFQXdmQztRQXJmRyxZQUFNLEdBQWMsSUFBSSxDQUFDO1FBR3pCLFdBQUssR0FBWSxJQUFJLENBQUM7UUFHdEIsWUFBTSxHQUFZLElBQUksQ0FBQztRQUd2QixZQUFNLEdBQVksSUFBSSxDQUFDO1FBR3ZCLFNBQUcsR0FBWSxJQUFJLENBQUM7UUFHcEIsVUFBSSxHQUFhLElBQUksQ0FBQztRQUd0QixjQUFRLEdBQVksSUFBSSxDQUFDO1FBR3pCLFNBQUcsR0FBWSxJQUFJLENBQUM7UUFHcEIsaUJBQVcsR0FBc0IsRUFBRSxDQUFDOztJQTZkeEMsQ0FBQztvQkF4Zm9CLFdBQVc7SUE2QzVCLHdCQUF3QjtJQUl4Qiw0QkFBTSxHQUFOO1FBQ0ksOEJBQThCO1FBQzlCLE9BQU87UUFDUCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDdkIsbUNBQW1DO1FBQ25DLGFBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzdCLGtCQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFFUyw4QkFBUSxHQUFsQjtRQUNJLDJCQUFZLENBQUMsRUFB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QUFXO1FBRC9CLE9BQU87T0FDYSxXQUFXLENBd2YvQjtJQUFELGtCQUFDO0NBeGZELEFBd2ZDLENBeGZ3QyxFQUFFLENBQUMsU0FBUyxHQXdmcEQ7a0JBeGZvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGVhcm4gVHlwZVNjcmlwdDpcclxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvdHlwZXNjcmlwdC5odG1sXHJcbi8vIExlYXJuIEF0dHJpYnV0ZTpcclxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvcmVmZXJlbmNlL2F0dHJpYnV0ZXMuaHRtbFxyXG4vLyBMZWFybiBsaWZlLWN5Y2xlIGNhbGxiYWNrczpcclxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvbGlmZS1jeWNsZS1jYWxsYmFja3MuaHRtbFxyXG5cclxuaW1wb3J0IEdhbWVEYXRhIGZyb20gJy4vR2FtZURhdGEnO1xyXG5pbXBvcnQgSHR0cFV0aWwgZnJvbSAnLi9jcnlwdG8vSHR0cFV0aWwnO1xyXG5pbXBvcnQgeyBHYW1lVG9vbCB9IGZyb20gJy4vdG9vbC9HYW1lVG9vbCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vdG9vbC9Ob3RpZmljYXRpb24nO1xyXG5cclxuY29uc3Qge2NjY2xhc3MsIHByb3BlcnR5fSA9IGNjLl9kZWNvcmF0b3I7XHJcblxyXG5AY2NjbGFzc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lTWFuYWdlciBleHRlbmRzIGNjLkNvbXBvbmVudCB7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLkNhbWVyYSlcclxuICAgIENhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuTm9kZSlcclxuICAgIHRvcFVJOiBjYy5Ob2RlID0gbnVsbDtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuTm9kZSlcclxuICAgIFBsYXllcjogY2MuTm9kZSA9IG51bGw7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBHcm91bmQ6IGNjLk5vZGUgPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxyXG4gICAgWGluOiBjYy5Ob2RlID0gbnVsbDtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuTGFiZWwpXHJcbiAgICB0aW1lOiBjYy5MYWJlbCA9IG51bGw7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBHYW1lT3ZlcjogY2MuTm9kZSA9IG51bGw7XHJcblxyXG4gICAgQHByb3BlcnR5KGNjLk5vZGUpXHJcbiAgICBUaXA6IGNjLk5vZGUgPSBudWxsO1xyXG5cclxuICAgIEBwcm9wZXJ0eShbY2MuUHJlZmFiXSlcclxuICAgIGJsb2NrUHJlZmFiIDogQXJyYXk8Y2MuUHJlZmFiPiA9IFtdO1xyXG5cclxuICAgIFxyXG5cclxuICAgIHJvdW5kOiBudW1iZXI7ICAgICAgLy/lm57lkIhcclxuICAgIGxldmVsOiBudW1iZXI7ICAgICAgLy/lm57lkIhcclxuICAgIHN0YXRpYyBfaW5zdGFuY2U6IGFueTtcclxuICAgIGJsb2NrQXJyYXk6IGFueTtcclxuICAgIGNhbWVyYU1vdmU6Ym9vbGVhblxyXG4gICAgY291bnRIZWlnaHQ6bnVtYmVyO1xyXG4gICAgY291bnRUaW1lOiBudW1iZXI7XHJcbiAgICBvdmVyOiBib29sZWFuO1xyXG4gICAgYmVnaW46IGJvb2xlYW47XHJcbiAgICBpbnRlcmZlcmU6IGJvb2xlYW47XHJcbiAgICBvbGRTcGVlZDogbnVtYmVyOyAgICAgIC8v5LiK5LiA5Zue5ZCI6YCf5bqmXHJcbiAgICBzY29yZTogbnVtYmVyOyAgICAgIC8v5oC75b6X5YiGXHJcbiAgICBkaWZmaWN1bHR5TWF4Om51bWJlcjsgLy/mnIDpq5jpmr7luqbns7vmlbBcclxuICAgIGRyb3A6IG51bWJlcjsgICAgICAvL+aRhOWDj+acuuiQveW3rlxyXG4gICAgLy8gTElGRS1DWUNMRSBDQUxMQkFDS1M6XHJcblxyXG5cclxuXHJcbiAgICBvbkxvYWQgKCkge1xyXG4gICAgICAgIC8vIGNjLmdhbWUuc2V0RnJhbWVSYXRlKDU5LjkpO1xyXG4gICAgICAgIC8vIOekuuS+i+S9v+eUqFxyXG4gICAgICAgIHZhciBtYW5hZ2VyID0gY2MuZGlyZWN0b3IuZ2V0Q29sbGlzaW9uTWFuYWdlcigpO1xyXG4gICAgICAgIG1hbmFnZXIuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gbWFuYWdlci5lbmFibGVkRGVidWdEcmF3ID0gdHJ1ZTtcclxuICAgICAgICBHYW1lTWFuYWdlci5faW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLnByb2JhdGlvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkVuYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBOb3RpZmljYXRpb24ub24oXCJjcmVhdGVCbG9ja1wiLHRoaXMuY3JlYXRlQmxvY2ssdGhpcyk7XHJcbiAgICAgICAgTm90aWZpY2F0aW9uLm9uKFwiYWRkU2NvcmVcIix0aGlzLmFkZFNjb3JlLHRoaXMpO1xyXG4gICAgICAgIE5vdGlmaWNhdGlvbi5vbihcImNyZWF0ZUNyYWNrQmxvY2tcIix0aGlzLmNyZWF0ZUNyYWNrQmxvY2ssdGhpcyk7XHJcbiAgICAgICAgTm90aWZpY2F0aW9uLm9uKFwic2hvd0dyb3VuZFwiLHRoaXMuc2hvd0dyb3VuZCx0aGlzKTtcclxuICAgICAgICBOb3RpZmljYXRpb24ub24oXCJkZWF0aFwiLHRoaXMuZ2V0RGVhdGgsdGhpcyk7XHJcbiAgICAgICAgTm90aWZpY2F0aW9uLm9uKFwianVtcFwiLHRoaXMuanVtcCx0aGlzKTtcclxuICAgICAgICBOb3RpZmljYXRpb24ub24oXCJzZXREYXRhXCIsdGhpcy5zZXREYXRhLHRoaXMpO1xyXG4gICAgICAgIFxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIE5vdGlmaWNhdGlvbi5vZmYoXCJjcmVhdGVCbG9ja1wiLHRoaXMuY3JlYXRlQmxvY2spO1xyXG4gICAgICAgIE5vdGlmaWNhdGlvbi5vZmYoXCJhZGRTY29yZVwiLHRoaXMuYWRkU2NvcmUpO1xyXG4gICAgICAgIE5vdGlmaWNhdGlvbi5vZmYoXCJjcmVhdGVCbG9ja1wiLHRoaXMuY3JlYXRlQ3JhY2tCbG9jayk7XHJcbiAgICAgICAgTm90aWZpY2F0aW9uLm9mZihcImRlYXRoXCIsdGhpcy5nZXREZWF0aCk7XHJcbiAgICAgICAgTm90aWZpY2F0aW9uLm9mZihcImp1bXBcIix0aGlzLmp1bXApO1xyXG4gICAgICAgIE5vdGlmaWNhdGlvbi5vZmYoXCJzaG93R3JvdW5kXCIsdGhpcy5zaG93R3JvdW5kKTtcclxuICAgICAgICBOb3RpZmljYXRpb24ub2ZmKFwic2V0RGF0YVwiLHRoaXMuc2V0RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpe1xyXG4gICAgICAgIHRoaXMuZHJvcCA9IHRoaXMudG9wVUkueSAtIHRoaXMuQ2FtZXJhLm5vZGUueTtcclxuICAgICAgICB0aGlzLnNjb3JlID0gMDtcclxuICAgICAgICB0aGlzLm9sZFNwZWVkID0gMTA7XHJcbiAgICAgICAgdGhpcy5iZWdpbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vdmVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbnRlcmZlcmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJvdW5kID0gMDtcclxuICAgICAgICB0aGlzLmxldmVsID0gMDtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5sZXZlbE1heCA9IDE7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uZGlmZmljdWx0eU1heCA9IDE7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubGlmZSA9IDM7XHJcbiAgICAgICAgdGhpcy5ibG9ja0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5jYW1lcmFNb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jb3VudFRpbWUgPSAxMjA7XHJcbiAgICAgICAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInhpbjFcIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRvcFVJLmdldENoaWxkQnlOYW1lKFwieGluMlwiKS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJ4aW4zXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInN0YXIxXCIpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyMlwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvcFVJLmdldENoaWxkQnlOYW1lKFwic3RhcjNcIikuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX2luaXQoKTtcclxuICAgICAgICB0aGlzLnNjaGVkdWxlKHRoaXMudXBkYXRlQ291bnREb3duVGltZSwxKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCAoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5ub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCB0aGlzLmp1bXAsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZml0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgaWYoR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ucHJvYmF0aW9uKSB0aGlzLnN0YXJ0R3VpZGUoKTtcclxuICAgICAgICBlbHNlIHRoaXMuc3RhcnRHYW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/moLnmja7mmK/lkKblhajpnaLlsY/vvIzlgZrni6znq4vpgILphY3mlrnpnaJcclxuICAgIGZpdCgpe1xyXG4gICAgICAgIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcImJnMlwiKS55ID0gLTIxNjcuNjc1O1xyXG4gICAgICAgIHZhciBqZyA9IHRoaXMuc2V0Rml0KCk7XHJcbiAgICAgICAgaWYoIWpnKXtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiYmcyXCIpLnkgPSAtMjEwMDtcclxuICAgICAgICAgICAgdGhpcy50b3BVSS55ID0gNjYwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICAvL+WIpOaWreWFqOmdouWxj1xyXG4gICAgZ2V0U2V0U2NyZWVuUmVzb2x1dGlvbkZsYWcgKCkge1xyXG4gICAgICAgIGxldCBzaXplID0gY2Mud2luU2l6ZTtcclxuICAgICAgICBsZXQgd2lkdGggPSBzaXplLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBzaXplLmhlaWdodDtcclxuICAgICAgICBpZiAoKGhlaWdodCAvIHdpZHRoKSA+ICgxNi4yIC8gOSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8v5Yik5pat5YWo6Z2i5bGP6YCC6YWNXHJcbiAgICBzZXRGaXQgKCkge1xyXG4gICAgICAgIGxldCBmbGFnID0gdGhpcy5nZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZygpO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRHdWlkZSgpe1xyXG4gICAgICAgIC8v5omT5byA5Y23XHJcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLlRpcC5nZXRDaGlsZEJ5TmFtZShcImxlZnRcIik7XHJcbiAgICAgICAgbGV0IHJpZ2h0ID0gdGhpcy5UaXAuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodFwiKTtcclxuICAgICAgICBsZXQgdGlwID0gdGhpcy5UaXAuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBcIik7XHJcbiAgICAgICAgbGVmdC53aWR0aCA9IDA7IHJpZ2h0LndpZHRoID0gMDt0aXAub3BhY2l0eSA9IDA7XHJcbiAgICAgICAgLy8gY2MudHdlZW4obGVmdClcclxuICAgICAgICAvLyAudG8oMC4yNSx7d2lkdGg6MzQ4fSlcclxuICAgICAgICAvLyAuc3RhcnQoKTtcclxuICAgICAgICAvLyBjYy50d2VlbihyaWdodClcclxuICAgICAgICAvLyAudG8oMC4yNSx7d2lkdGg6MzQ4fSlcclxuICAgICAgICAvLyAuc3RhcnQoKTtcclxuICAgICAgICAvLyBjYy50d2Vlbih0aXApXHJcbiAgICAgICAgLy8gLmRlbGF5KDAuMTUpXHJcbiAgICAgICAgLy8gLnRvKDAuMTUse29wYWNpdHk6MjU1fSlcclxuICAgICAgICAvLyAuc3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93R3JvdW5kKHRlbXBZKXtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5Hcm91bmQuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5Hcm91bmQueSA9IHRlbXBZO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAganVtcCgpe1xyXG4gICAgICAgIHRoaXMuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXllclwiKS5qdW1wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRHYW1lKCl7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlQmxvY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRTY29yZShzY29yZSl7XHJcbiAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkNMSUNLX0RBVEEuZ2V0U2NvcmUgPSBwYXJzZUludChzY29yZSk7XHJcbiAgICAgICAgR2FtZU1hbmFnZXIuX2luc3RhbmNlLnNjb3JlICs9IHBhcnNlSW50KHNjb3JlKTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQS50b3RhbFNjb3JlID0gR2FtZU1hbmFnZXIuX2luc3RhbmNlLnNjb3JlO1xyXG4gICAgICAgIHRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJuYW5kdVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyAgPSBHYW1lTWFuYWdlci5faW5zdGFuY2Uuc2NvcmUgKyBcIlwiO1xyXG4gICAgICAgIHZhciBzY2FsZSA9IEdhbWVNYW5hZ2VyLl9pbnN0YW5jZS5zY29yZS9HYW1lRGF0YS5faW5zdGFuY2UuTEVWRUxfSU5GTy5zY29yZU1heDtcclxuICAgICAgICBjYy50d2Vlbih0aGlzLnRvcFVJLmdldENoaWxkQnlOYW1lKFwicHJvZ3Jlc3NcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkpXHJcbiAgICAgICAgLnRvKDAuNSx7ZmlsbFJhbmdlOnNjYWxlfSlcclxuICAgICAgICAuY2FsbCgoKSA9PntcclxuICAgICAgICAgICAgaWYoc2NhbGUgPj0gR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uc3RhcjEgJiYgIXRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyMVwiKS5hY3RpdmUpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInN0YXIxXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoc2NhbGUgPj0gR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uc3RhcjIgJiYgIXRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyMlwiKS5hY3RpdmUpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInN0YXIyXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoc2NhbGUgPj0gR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uc3RhcjMgJiYgIXRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyM1wiKS5hY3RpdmUpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInN0YXIzXCIpLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyBHYW1lRGF0YS5faW5zdGFuY2Uuc2NvcmVNYXggPSAxNTAwMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUJsb2NrKCl7XHJcbiAgICAgICAgaWYodGhpcy5vdmVyID09IGZhbHNlICYmIHRoaXMuYmVnaW4gPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIHRoaXMuR3JvdW5kLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjEyKTtcclxuICAgICAgICAgICAgaWYodGhpcy5yb3VuZCA8PSAxMCAmJiBudW0gPT0gNSl7XHJcbiAgICAgICAgICAgICAgICBudW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqNiArIDYpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBjYy5pbnN0YW50aWF0ZSh0aGlzLmJsb2NrUHJlZmFiW251bV0pO1xyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5QbGF5ZXIuZ2V0Q29tcG9uZW50KFwiUGxheWVyXCIpLmJhc2ljSGVpZ2h0ICsgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8uYmxvY2tNaW47XHJcbiAgICAgICAgICAgIGlmKG51bSA+IEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmJsb2NrU2NhbGUpe1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IGJsb2NrLmhlaWdodCArIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmJsb2NrTWF4O1xyXG4gICAgICAgICAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkNMSUNLX0RBVEEuaGVpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIGlmKGhlaWdodCA+PSAwICYmIHRoaXMuY2FtZXJhTW92ZSA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50SGVpZ2h0ID0gdGhpcy5QbGF5ZXIuZ2V0Q29tcG9uZW50KFwiUGxheWVyXCIpLmJhc2ljSGVpZ2h0IC0gdGhpcy5DYW1lcmEubm9kZS55O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW1lcmFNb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBibG9jay5zZXRQb3NpdGlvbihjYy52Mih0aGlzLnJvdW5kJTI9PTA/NDgwOi00ODAsaGVpZ2h0KSk7XHJcbiAgICAgICAgICAgIGJsb2NrLnBhcmVudCA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkJsb2NrXCIpO1xyXG4gICAgICAgICAgICBibG9jay56SW5kZXggPSAxMDtcclxuICAgICAgICAgICAgdGhpcy5yb3VuZCArPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmxldmVsICs9IDE7XHJcbiAgICAgICAgICAgIGlmKHRoaXMucm91bmQgPiBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5sZXZlbE1heCkgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubGV2ZWxNYXggPSB0aGlzLnJvdW5kO1xyXG4gICAgICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQS5sZXZlbCA9IHRoaXMucm91bmQ7XHJcbiAgICAgICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5DTElDS19EQVRBLnJvdW5kID0gdGhpcy5sZXZlbDtcclxuICAgICAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8ubGF5ZXIgKz0gR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8ubGF5ZXJBZGQ7XHJcbiAgICAgICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLnNwZWVkICs9IEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLmFkZFNwZWVkO1xyXG5cclxuICAgICAgICAgICAgaWYoR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8ucmVkdWNlU3BlZWQgPD0gMTAwKVxyXG4gICAgICAgICAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8ucmVkdWNlU3BlZWQgKz0gR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uamlhbnN1O1xyXG4gICAgICAgICAgICBpZih0aGlzLnJvdW5kID09IEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLnJvdW5kMSkgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uamlhbnN1ID0gMjtcclxuICAgICAgICAgICAgZWxzZSBpZih0aGlzLnJvdW5kID09IEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLnJvdW5kMikgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uamlhbnN1ID0gMTtcclxuICAgICAgICAgICAgZWxzZSBpZih0aGlzLnJvdW5kID09IEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLnJvdW5kMykgR2FtZURhdGEuX2luc3RhbmNlLkxFVkVMX0lORk8uamlhbnN1ID0gMC41O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+iZmuWBh+eijuijguWdl1xyXG4gICAgY3JlYXRlQ3JhY2tCbG9jaygpe1xyXG4gICAgICAgIHRoaXMuaW50ZXJmZXJlID0gdHJ1ZTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQS5mYWtlID0gdGhpcy5pbnRlcmZlcmU7XHJcbiAgICAgICAgaWYodGhpcy5yb3VuZCA+IDEpIHRoaXMuZGVzdHJveUJsb2NrKCk7XHJcbiAgICAgICAgaWYodGhpcy5vdmVyID09IGZhbHNlICYmIHRoaXMuYmVnaW4gPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIHZhciBibG9jayA9IGNjLmluc3RhbnRpYXRlKHRoaXMuYmxvY2tQcmVmYWJbMTJdKTtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXllclwiKS5iYXNpY0hlaWdodDtcclxuICAgICAgICAgICAgaWYoR2FtZURhdGEuX2luc3RhbmNlLkNMSUNLX0RBVEEuaGVpZ2h0ID09IHRydWUpe1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IGJsb2NrLmhlaWdodC8yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJsb2NrLnNldFBvc2l0aW9uKGNjLnYyKHRoaXMucm91bmQlMj09MD80ODA6LTQ4MCxoZWlnaHQpKTtcclxuICAgICAgICAgICAgYmxvY2sucGFyZW50ID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiQ3JhY2tCbG9ja1wiKTtcclxuICAgICAgICAgICAgYmxvY2suekluZGV4ID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGRlc3Ryb3lCbG9jaygpe1xyXG4gICAgICAgIGlmKHRoaXMubm9kZSl7XHJcbiAgICAgICAgICAgIGlmKHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkNyYWNrQmxvY2tcIikpe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiQ3JhY2tCbG9ja1wiKS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2NrMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkNyYWNrQmxvY2tcIikuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7IGk8YmxvY2syLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmxvY2syW2ldKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMltpXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgeGluQWN0aW9uKCl7XHJcbiAgICAgICAgbGV0IHhpbiAgPSAgdGhpcy50b3BVSS5nZXRDaGlsZEJ5TmFtZShcInhpbjFcIik7XHJcbiAgICAgICAgaWYoR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubGlmZSA9PSAyKSB4aW4gPSB0aGlzLnRvcFVJLmdldENoaWxkQnlOYW1lKFwieGluM1wiKTtcclxuICAgICAgICBlbHNlIGlmKEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmxpZmUgPT0gMSkgIHhpbiA9IHRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJ4aW4yXCIpO1xyXG4gICAgICAgIGNjLnR3ZWVuKHhpbilcclxuICAgICAgICAudG8oMC42LHtzY2FsZToxLjYsb3BhY2l0eTowfSlcclxuICAgICAgICAuY2FsbCgoKSA9PntcclxuICAgICAgICAgICAgeGluLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnN0YXJ0KCk7XHJcbiAgICB9XHJcbiAgICAvL+atu+S6oVxyXG4gICAgZ2V0RGVhdGgoKXtcclxuICAgICAgICBpZihHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5saWZlID4gMCl7XHJcbiAgICAgICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmxpZmUgLT0gMTtcclxuICAgICAgICAgICAgdGhpcy5nZXREZXZpdmUoMSk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5HTV9JTkZPLmxpZmUgPSAtMTtcclxuICAgICAgICAgICAgdGhpcy5nZXREZXZpdmUoMyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy/lpI3mtLtcclxuICAgIGdldERldml2ZSh0aW1lKXtcclxuICAgICAgICB0aGlzLnJvdW5kID0gMDtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuTEVWRUxfaW5pdCgpO1xyXG4gICAgICAgIGlmKHRoaXMudG9wVUkuZ2V0Q2hpbGRCeU5hbWUoXCJzdGFyM1wiKS5hY3RpdmUgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIC8vIEdhbWVEYXRhLl9pbnN0YW5jZS5MRVZFTF9JTkZPLnNjb3JlTWF4ID0gMTUwMDAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVyZmVyZSA9IGZhbHNlO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5DTElDS19EQVRBLmZha2UgPSB0aGlzLmludGVyZmVyZTtcclxuICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJCbG9ja1wiKS5jaGlsZHJlbjtcclxuICAgICAgICBmb3IobGV0IGk9MDsgaTxibG9jay5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKGJsb2NrW2ldKXtcclxuICAgICAgICAgICAgICAgIGJsb2NrW2ldLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBibG9jazIgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJDcmFja0Jsb2NrXCIpLmNoaWxkcmVuO1xyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPGJsb2NrMi5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKGJsb2NrMltpXSl7XHJcbiAgICAgICAgICAgICAgICBibG9jazJbaV0uYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5ibG9ja0FycmF5ID0gW107XHJcbiAgICAgICAgbGV0IGFjdGlvblRpbWUgPSAxO1xyXG4gICAgICAgIGlmKHRoaXMuUGxheWVyLnkgPiA1MDApe1xyXG4gICAgICAgICAgICBhY3Rpb25UaW1lID0gKHRoaXMuUGxheWVyLnkgKyA1MDApLzEwMDAqYWN0aW9uVGltZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2MudHdlZW4odGhpcy5QbGF5ZXIpXHJcbiAgICAgICAgLnRvKGFjdGlvblRpbWUse3k6LTUwMH0se2Vhc2luZzonY3ViaWNJbid9KVxyXG4gICAgICAgIC5jYWxsKCgpPT57XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXllclwiKS54aW5BY3Rpb24oKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5kZWxheSgwLjUpXHJcbiAgICAgICAgLmNhbGwoKCkgPT57XHJcbiAgICAgICAgICAgIHRoaXMueGluQWN0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXllclwiKS5pbml0KCk7XHJcbiAgICAgICAgICAgIGlmKHRpbWUgPiAxKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuWGluLnBhcmVudC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5YaW4uZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuZmlsbFJhbmdlID0gMDtcclxuICAgICAgICAgICAgICAgIGNjLnR3ZWVuKHRoaXMuWGluLmdldENvbXBvbmVudChjYy5TcHJpdGUpKVxyXG4gICAgICAgICAgICAgICAgLnRvKHRpbWUse2ZpbGxSYW5nZToxfSlcclxuICAgICAgICAgICAgICAgIC5kZWxheSgwLjMpXHJcbiAgICAgICAgICAgICAgICAuY2FsbCgoKSA9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlhpbi5wYXJlbnQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmRlbGF5KDApXHJcbiAgICAgICAgICAgICAgICAuY2FsbCgoKSA9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQmxvY2soKTtcclxuICAgICAgICAgICAgICAgIH0sICh0aW1lKzAuNSkqMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGEoKXtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQS50aW1lciA9IHRoaXMuY291bnRUaW1lO1xyXG4gICAgICAgIEdhbWVEYXRhLl9pbnN0YW5jZS5DTElDS19EQVRBLmxldmVsID0gdGhpcy5yb3VuZDtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuQ0xJQ0tfREFUQS5yb3VuZCA9IHRoaXMubGV2ZWw7XHJcbiAgICAgICAgLy9DTElDS19EQVRBIOaVsOaNruWkhOeQhuWujOavleWQjuiwg+eUqOS4iuS8oOaOpeWPoyAg5LiK5Lyg5o6l5Y+j5YaFQ0xJQ0tfREFUQeS4jeWBmuaUueWPmFxyXG4gICAgICAgIEdhbWVUb29sLnNldEdhbWVEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ojrflj5ZtYXRjaElkICDnlKjkuo7kuIrkvKDmr4/mrKHngrnlh7vmlbDmja7ph4zpnaLorrDlvZVpZOaWueS+v+afpeivolxyXG4gICAgZ2V0TWF0Y2hJZCAoKXtcclxuICAgICAgICBsZXQgbWF0Y2hJZCA9IGNjLnN5cy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIm1hdGNoSWRcIik7XHJcbiAgICAgICAgaWYobWF0Y2hJZCA9PSBcInVuZGlmZW5kXCIgfHwgbWF0Y2hJZD09bnVsbCl7XHJcbiAgICAgICAgICAgIG1hdGNoSWQgPSAgdGhpcy5zZXRNYXRjaElkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY29udGFpbnNOYW5hbmEobWF0Y2hJZCkgPT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICBtYXRjaElkID0gIHRoaXMuc2V0TWF0Y2hJZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hhciA9IHBhcnNlSW50KG1hdGNoSWRbMTBdKTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMubGV2ZWwgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhciArPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbWF0Y2hJZCAgPSBtYXRjaElkLnNsaWNlKDAsIDEwKSArIGNoYXIgKyBcIlwiO1xyXG4gICAgICAgICAgICAgICAgR2FtZURhdGEuX2luc3RhbmNlLkdNX0lORk8ubWF0Y2hJZCA9IG1hdGNoSWQ7XHJcbiAgICAgICAgICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaElkXCIsbWF0Y2hJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoSWQ7XHJcbiAgICB9XHJcbiAgICAvL+ajgOa1i21hdGNoSWQg5aaC5p6c5pyJ57yT5a2Y5Lul5YmN55qEbmFuYW5h5pWw5o2u5riF6ZmkXHJcbiAgICBjb250YWluc05hbmFuYShzdHIpIHtcclxuICAgICAgICByZXR1cm4gL25hL2kudGVzdChzdHIpO1xyXG4gICAgfVxyXG4gICAgLy/ph43mlrDorr7nva5NYXRjaElkXHJcbiAgICBzZXRNYXRjaElkICgpe1xyXG4gICAgICAgIC8vIOWumuS5ieWMheWQq+WPr+eUqOWtl+espueahOWtl+espumbhlxyXG4gICAgICAgIGNvbnN0IGNoYXJhY3RlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknO1xyXG4gICAgICAgIC8vIOWIm+W7uuS4gOS4quaVsOe7hOS7peS/neWtmOmaj+acuuWtl+esplxyXG4gICAgICAgIGNvbnN0IHV1aWRBcnJheSA9IFtdO1xyXG4gICAgICAgIC8vIOW+queOrzEw5qyhIOeUn+aIkDEw5L2N55qEVVVJRFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8g55Sf5oiQ6ZqP5py657Si5byV77yM6IyD5Zu05piv5a2X56ym6ZuG55qE6ZW/5bqmXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAvLyDku47lrZfnrKbpm4bkuK3ojrflj5bpmo/mnLrlrZfnrKZcclxuICAgICAgICAgICAgY29uc3QgcmFuZG9tQ2hhciA9IGNoYXJhY3RlcnMuY2hhckF0KHJhbmRvbUluZGV4KTtcclxuICAgICAgICAgICAgLy8g5bCG5a2X56ym5re75Yqg5Yiw5pWw57uE5LitXHJcbiAgICAgICAgICAgIHV1aWRBcnJheS5wdXNoKHJhbmRvbUNoYXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGF0YSA9ICB1dWlkQXJyYXkuam9pbignJykgKyAxICsgXCJcIjtcclxuICAgICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJtYXRjaE51bWJlclwiLDEpO1xyXG4gICAgICAgIGNjLnN5cy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIm1hdGNoSWRcIixkYXRhKTtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5tYXRjaElkID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDb3VudERvd25UaW1lICgpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3VudFRpbWUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnRUaW1lIC09IDE7XHJcbiAgICAgICAgICAgIHRoaXMudGltZS5zdHJpbmcgPSB0aGlzLmdldFRpbWVNYXJnaW4odGhpcy5jb3VudFRpbWUpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvdW50VGltZSA8IDUpe1xyXG4gICAgICAgICAgICAgICAgY2MudHdlZW4odGhpcy50aW1lLm5vZGUpXHJcbiAgICAgICAgICAgICAgICAudG8oMC4yNSx7c2NhbGU6MS41LGNvbG9yOmNjLmNvbG9yKDI1NSwwLDApfSlcclxuICAgICAgICAgICAgICAgIC50bygwLjI1LHtzY2FsZToxLGNvbG9yOmNjLmNvbG9yKDI1NSwyNTUsMjU1KX0pXHJcbiAgICAgICAgICAgICAgICAuc3RhcnQoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY291bnRUaW1lIDw9IDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bnNjaGVkdWxlKHRoaXMudXBkYXRlQ291bnREb3duVGltZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVyU3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5rKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJPcGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5YGc5q2i5omA5pyJ5Yqo55S7XHJcbiAgICBvdmVyU3RvcCgpe1xyXG4gICAgICAgIGlmKHRoaXMuUGxheWVyLmdldENvbXBvbmVudChcIlBsYXllclwiKS5qdW1wQWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLlBsYXllci5nZXRDb21wb25lbnQoXCJQbGF5ZXJcIikuanVtcEFjdGlvbi5zdG9wKCk7XHJcbiAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiQmxvY2tcIikuY2hpbGRyZW47XHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8YmxvY2subGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihibG9ja1tpXSl7XHJcbiAgICAgICAgICAgICAgICBpZihibG9ja1tpXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKS50d2VlbilcclxuICAgICAgICAgICAgICAgICAgICBibG9ja1tpXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKS50d2Vlbi5zdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGJsb2NrMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkNyYWNrQmxvY2tcIikuY2hpbGRyZW47XHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8YmxvY2syLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYoYmxvY2syW2ldKXtcclxuICAgICAgICAgICAgICAgIGlmKGJsb2NrMltpXS5nZXRDb21wb25lbnQoXCJCbG9ja1wiKS50d2VlbilcclxuICAgICAgICAgICAgICAgICAgICBibG9jazJbaV0uZ2V0Q29tcG9uZW50KFwiQmxvY2tcIikudHdlZW4uc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFJhbmsoKXtcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5zY29yZSA9IHRoaXMuc2NvcmU7XHJcbiAgICAgICAgR2FtZVRvb2wuc2V0UmFuaygpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJPcGVuKCl7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXIuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiQmxvY2tcIikuY2hpbGRyZW47XHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8YmxvY2subGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihibG9ja1tpXSl7XHJcbiAgICAgICAgICAgICAgICBibG9ja1tpXS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRlc3Ryb3lCbG9jaygpO1xyXG4gICAgICAgIHRoaXMuR2FtZU92ZXIuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkdhbWVPdmVyLmdldENoaWxkQnlOYW1lKFwic2NvcmVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSB0aGlzLnNjb3JlICsgXCJcIjtcclxuICAgICAgICB0aGlzLkdhbWVPdmVyLmdldENoaWxkQnlOYW1lKFwibGV2ZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5sZXZlbE1heCArIFwiXCI7XHJcbiAgICAgICAgdGhpcy5HYW1lT3Zlci5nZXRDaGlsZEJ5TmFtZShcImRpZmZpY3VsdHlcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBcclxuICAgICAgICBHYW1lRGF0YS5faW5zdGFuY2UuR01fSU5GTy5kaWZmaWN1bHR5TWF4ICsgXCJcIjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYmFja0xvYWQoKXtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJMb2FkU2NlbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYWdhaW4oKXtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJHYW1lU2NlbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlblJhbmsoKXtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJSYW5rU2NlbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ml7bpl7TmoLzlvI/ovazmjaJcclxuICAgIGdldFRpbWVNYXJnaW4oc2Vjb25kOm51bWJlcikge1xyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgdG90YWwgPSBzZWNvbmQ7XHJcbiAgICAgICAgbGV0IGhvdXIgPSAwO1xyXG4gICAgICAgIGhvdXIgPSBwYXJzZUludCgodG90YWwgLyAzNjAwKSArIFwiXCIpOy8v6K6h566X5pW05pWw5bCP5pe25pWwXHJcbiAgICAgICAgbGV0IGFmdGVySG91ciA9IHRvdGFsIC0gaG91ciAqIDYwICogNjA7Ly/lj5blvpfnrpflh7rlsI/ml7bmlbDlkI7liankvZnnmoTnp5LmlbBcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQoKGFmdGVySG91ciAvIDYwKStcIlwiKTsvL+iuoeeul+aVtOaVsOWIhlxyXG4gICAgICAgIGxldCBtID0gXCJcIiArIG1pbjsgIFxyXG4gICAgICAgIGlmKG1pbiA8IDEwKSBtID0gXCIwXCIrbWluO1xyXG4gICAgICAgIGxldCBhZnRlck1pbiA9IHRvdGFsIC0gaG91ciAqIDYwICogNjAgLSBtaW4gKiA2MDsvL+WPluW+l+eul+WHuuWIhuWQjuWJqeS9meeahOenkuaVsFxyXG4gICAgICAgIGxldCBtaWFvID0gYWZ0ZXJNaW4gKyBcIlwiO1xyXG4gICAgICAgIGlmKGFmdGVyTWluIDwgMTApIG1pYW8gPSBcIjBcIiArIGFmdGVyTWluO1xyXG4gICAgICAgIHJldHVybiBtICsgJzonICsgbWlhb1xyXG4gICAgfVxyXG4gICAgdXBkYXRlIChkdCkge1xyXG4gICAgICAgIGlmKHRoaXMuY2FtZXJhTW92ZSA9PSB0cnVlICYmIHRoaXMub3ZlciA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgIHRoaXMuQ2FtZXJhLm5vZGUueSA9IHRoaXMuUGxheWVyLnkgLSB0aGlzLmNvdW50SGVpZ2h0O1xyXG4gICAgICAgICAgICBpZih0aGlzLkNhbWVyYS5ub2RlLnkgPD0gMCkgdGhpcy5DYW1lcmEubm9kZS55ID0gMDtcclxuICAgICAgICAgICAgdGhpcy50b3BVSS55ID0gdGhpcy5DYW1lcmEubm9kZS55ICsgdGhpcy5kcm9wO1xyXG4gICAgICAgIH1cclxuIFxyXG4gICAgfVxyXG59XHJcbiJdfQ==