|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/action/view/action_treasure_window.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, 'e57f89y561MuquqyUlVjaes', 'action_treasure_window');
|
// Scripts/mod/action/view/action_treasure_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 幸运探宝
|
// <br/>Create: 2019-04-23 15:45:43
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var BackpackController = require("backpack_controller");
|
|
var RoleController = require("role_controller");
|
|
var MainuiController = require("mainui_controller");
|
|
var ActionEvent = require("action_event");
|
|
var ROUND_COUNT = 8;
|
var slow_start = 3; //开始减少灯的个数
|
|
var reward_pos = [[0, 204], [148, 133], [221, -19], [143, -165], [0, -239], [-142, -170], [-225, -19], [-144, 136]]; // 数字的转换 从0开始
|
|
var change_pos = [0, 1, 2, 3, 4, 5, 6, 7, 0]; //越界处理
|
|
var Action_treasureWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("action", "action_treasure_window");
|
this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
|
var MallController = require("mall_controller");
|
|
if (MallController.getInstance().getMallView()) {
|
MallController.getInstance().getMallView().setVisible(false);
|
}
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.touchEnable = false; //防止乱点,必须等到本地抽奖完成之后才能进行下一次
|
|
this.touchRefresh = false;
|
this.tab_list = [];
|
this.cur_index = null;
|
this.desc_item_name = [];
|
this.desc_item_Lv = []; // 拥有的劵数
|
|
this.hasTreasure_num = []; // 点击的探宝类型 -- 1 2
|
|
this.touchTreasure_type = 1; // 查看更多里面的个数
|
|
this.checkMoreCount = 1; //标签页红点
|
// this.tabRedPoint = {false,false}
|
// 点击刷新控制特效
|
|
this.touchEffect = [true, true]; // 探宝记录
|
|
this.getRewardList = []; // 幸运值达到领取奖励数字
|
|
this.arriveLuckly_label = [];
|
this.item_list = [];
|
this.luckly_item = [];
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.bigbg = this.root_wnd.getChildByName("bg");
|
this.bigbg.scale = FIT_SCALE * 2;
|
this.bg = this.root_wnd.getChildByName("bg").getComponent(cc.Sprite);
|
var path = PathTool.getUIIconPath("bigbg/action", "action_treasure", "jpg");
|
this.loadRes(path, function (res) {
|
this.bg.spriteFrame = res;
|
}.bind(this));
|
this.background = this.root_wnd.getChildByName("background");
|
var main_container = this.root_wnd.getChildByName("main_container");
|
this.main_container = main_container;
|
this.text_scroll = main_container.getChildByName("text_scroll");
|
this.content = this.text_scroll.getChildByName("content");
|
this.probablity = main_container.getChildByName("probablity");
|
this.probablity.active = false;
|
this.item_panel = main_container.getChildByName("item_panel");
|
this.round_certer_node = this.item_panel.getChildByName("round");
|
this.round_certer_node.scale = 2;
|
this.round_certer = this.round_certer_node.getComponent(cc.Sprite);
|
this.btnLockOther = this.item_panel.getChildByName("btnLockOther");
|
var text_6 = main_container.getChildByName("Text_6").getComponent(cc.Label);
|
text_6.string = Utils.TI18N("下次免费刷新: ");
|
this.refresh_time = main_container.getChildByName("refresh_time").getComponent(cc.Label);
|
this.refresh_time.string = "00:00:00";
|
this.run_light = Utils.createImage(this.item_panel, null, 0, 0, cc.v2(0.5, 0.5), null, 10);
|
this.run_light.active = false;
|
var res = PathTool.getUIIconPath("welfare", "welfare_37");
|
this.loadRes(res, function (sf_obj) {
|
this.run_light.spriteFrame = sf_obj;
|
}.bind(this));
|
this.status_count = 0;
|
this.model.setLucklyRewardData();
|
this.model.setBuyRewardData();
|
var text_2 = main_container.getChildByName("Text_2").getComponent(cc.Label);
|
text_2.string = Utils.TI18N("探宝记录");
|
var treasure_bg = this.main_container.getChildByName("treasure_bg");
|
this.treasure_total = Utils.createRichLabel(22, new cc.Color(0xff, 0xff, 0xf8, 0xff), cc.v2(0, 0.5), cc.v2(-treasure_bg.width / 2, 0), 45, 150);
|
this.treasure_total.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
treasure_bg.addChild(this.treasure_total.node);
|
this.luckyBar = main_container.getChildByName("luckyBar");
|
var tab_container = main_container.getChildByName("tab_container");
|
var text_title = [Utils.TI18N("幸运探宝"), Utils.TI18N("高级探宝")];
|
|
for (var i = 1; i <= 2; i++) {
|
var tab_btn = tab_container.getChildByName(cc.js.formatStr("tab_btn_%s", i));
|
tab_btn.label = tab_btn.getChildByName("title").getComponent(cc.Label);
|
tab_btn.label.string = text_title[i - 1];
|
tab_btn.normal = tab_btn.getChildByName("normal");
|
tab_btn.select = tab_btn.getChildByName("select");
|
tab_btn.select.active = false;
|
tab_btn.redpoint = tab_btn.getChildByName("redpoint");
|
tab_btn.redpoint.active = false;
|
tab_btn.label.node.color = new cc.Color(0xff, 0xc3, 0x8d, 0xff);
|
tab_btn.index = i;
|
this.tab_list[i] = tab_btn;
|
}
|
|
for (var i = 1; i <= 2; i++) {
|
var buy_reward_data = this.model.getBuyRewardData(i);
|
var lottery_id = buy_reward_data[0].expend_item[0][0];
|
this.hasTreasure_num[i] = BackpackController.getInstance().getModel().getBackPackItemNumByBid(lottery_id);
|
}
|
|
this.btnTreasure = [];
|
|
for (var i = 1; i <= 3; i++) {
|
var tab = {};
|
tab.btn = main_container.getChildByName("btn_treasure_" + i);
|
tab.price = Utils.createRichLabel(24, new cc.Color(0xff, 0xff, 0xff, 0xff), cc.v2(0.5, 0.5), cc.v2(0, 0), 31);
|
tab.btn.addChild(tab.price.node);
|
this.btnTreasure[i] = tab;
|
}
|
|
this.text_lucky_num = main_container.getChildByName("text_lucky_num").getComponent(cc.Label);
|
this.text_lucky_num.string = "";
|
this.btnRule = main_container.getChildByName("btnRule");
|
this.btn_shop = main_container.getChildByName("btn_shop");
|
var text_1 = this.btn_shop.getChildByName("Text_1").getComponent(cc.Label);
|
text_1.string = Utils.TI18N("探宝商店");
|
this.btn_return = main_container.getChildByName("btn_return");
|
var text_3 = this.btn_return.getChildByName("Text_3").getComponent(cc.Label);
|
text_3.string = Utils.TI18N("返回");
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.addGlobalEvent(ActionEvent.UPDATE_LUCKYROUND_GET, function (data) {
|
if (!data) {
|
this.ctrl.openLuckyTreasureWin(false);
|
return;
|
}
|
|
this.changeTabView(this.cur_index || this.jump_index);
|
}.bind(this));
|
this.addGlobalEvent(ActionEvent.TREASURE_SUCCESS_DATA, function (data) {
|
if (!data) return;
|
|
if (data.code == 0) {
|
this.touchEnable = false;
|
message(data.msg);
|
return;
|
}
|
|
this.showRewardList = data;
|
this.pos = 0;
|
this.runProcess = 0;
|
this.process = this.status_count; //开始的位置
|
|
this.speed = 1;
|
this.addSpeed = 0;
|
this.targetPos = data.awards3[0].pos - 1; //停灯的位置(从0开始)
|
|
this.step = 0;
|
this.round = 5; //圈数
|
|
if (this.targetPos <= 3) {
|
this.round = 4;
|
}
|
|
this.runLightUniformSpeedHide();
|
|
if (this.lottery_ticket == null) {
|
this.lottery_ticket = gcore.Timer.set(function () {
|
this.runHandler();
|
}.bind(this), 30, -1);
|
}
|
}.bind(this));
|
this.addGlobalEvent(ActionEvent.UPDATA_TREASURE_LOG_DATA, function (data) {
|
if (!data) {
|
return;
|
}
|
|
this.model.updataTreasureLogData(data.type, data.log_list);
|
var initData = this.model.getTreasureInitData(data.type);
|
this.showTreasureLog(initData);
|
}.bind(this)); // 弹窗
|
|
this.addGlobalEvent(ActionEvent.UPDATA_TREASURE_POPUPS_SEND, function (data) {
|
this.showRewardList = data;
|
this.runLightReward();
|
}.bind(this));
|
this.addGlobalEvent(ActionEvent.UPDATE_LUCKLY_DATA, function (data) {
|
if (!data) return;
|
var buy_reward_data = this.model.getBuyRewardData(data.type);
|
var lottery_id = buy_reward_data[0].expend_item[0][0];
|
this.hasTreasure_num[data.type] = BackpackController.getInstance().getModel().getBackPackItemNumByBid(lottery_id);
|
|
if (this.hasTreasure_num[data.type] <= 0) {
|
this.hasTreasure_num[data.type] = 0;
|
}
|
|
var item_config = Utils.getItemConfig(lottery_id);
|
|
if (item_config) {
|
var res = PathTool.getItemRes(item_config.icon);
|
var str = cc.js.formatStr(Utils.TI18N("<img src='%s'/> %d"), item_config.icon, this.hasTreasure_num[data.type]);
|
this.treasure_total.string = str;
|
this.loadRes(res, function (resObject) {
|
this.treasure_total.addSpriteFrame(resObject);
|
}.bind(this));
|
}
|
|
this.model.updataTreasureInitData(data.type, data);
|
var luckly_list = this.model.getLucklyRewardData(data.type);
|
var initData = this.model.getTreasureInitData(data.type);
|
this.commonShowData(initData, luckly_list);
|
}.bind(this));
|
this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, temp_list) {
|
this.changeTreasureNumber(temp_list);
|
}.bind(this));
|
this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, temp_list) {
|
this.changeTreasureNumber(temp_list);
|
}.bind(this));
|
this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, temp_list) {
|
this.changeTreasureNumber(temp_list);
|
}.bind(this));
|
|
for (var i in this.tab_list) {
|
Utils.onTouchEnd(this.tab_list[i], function (tab_btn) {
|
if (this.touchEnable == true) return;
|
this.probablity.active = false;
|
var role_ve = RoleController.getInstance().getRoleVo();
|
var data = this.model.getBuyRewardData(tab_btn.index);
|
|
if (data && data[0].limit_open) {
|
if (role_ve.lev >= data[0].limit_open[0][1]) {
|
this.changeTabvarData(tab_btn.index);
|
this.changeTabView(tab_btn.index);
|
} else {
|
var str = cc.js.formatStr(Utils.TI18N("人物等级%d级开启"), data[0].limit_open[0][1]);
|
message(str);
|
}
|
}
|
}.bind(this, this.tab_list[i]), 1);
|
}
|
|
Utils.onTouchEnd(this.btn_return, function () {
|
this.ctrl.openLuckyTreasureWin(false);
|
}.bind(this), 2);
|
this.btnRule.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(1);
|
var config = Config.dial_data.data_const.game_rule1;
|
|
if (this.cur_index == 2) {
|
config = Config.dial_data.data_const.game_rule2;
|
}
|
|
var pos = event.touch.getLocation();
|
|
require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
|
}, this);
|
Utils.onTouchEnd(this.btnLockOther, function () {
|
this.probablity.active = true;
|
this.rewardProbility(this.cur_index);
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.probablity, function () {
|
this.probablity.active = false;
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.background, function () {
|
this.probablity.active = false;
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.btn_shop, function () {
|
var MallController = require("mall_controller");
|
|
if (MallController.getInstance().getMallView()) {
|
this.setVisible(false);
|
}
|
|
var StrongerController = require("stronger_controller");
|
|
StrongerController.getInstance().clickCallBack(406);
|
}.bind(this), 1);
|
|
for (var i in this.btnTreasure) {
|
Utils.onTouchEnd(this.btnTreasure[i].btn, function (i) {
|
if (this.touchEnable == true) {
|
message(Utils.TI18N("探宝进行中"));
|
return;
|
}
|
|
this.cur_index = this.cur_index || 1;
|
|
if (i == 3) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
if (role_vo.gold < Config.dial_data.data_const.refreash.val[0][1] && this.touchEffect[this.cur_index] == false) {
|
message(Utils.TI18N("钻石不足"));
|
return;
|
}
|
|
if (this.touchRefresh == true) {
|
message(Utils.TI18N("刷新中..."));
|
return;
|
}
|
|
this.touchRefresh = true;
|
this.runLightUniformSpeedHide();
|
this.startRefreshAction();
|
} else {
|
var data = this.model.getBuyRewardData(this.cur_index);
|
this.touchEnable = true;
|
|
var _bool = MainuiController.getInstance().checkIsOpenByActivate(data[i - 1].limit_open);
|
|
if (_bool == true) {
|
this.touchTreasure_type = i;
|
} else {
|
this.touchEnable = false;
|
}
|
|
this.ctrl.send16638(this.cur_index, i);
|
}
|
}.bind(this, i), 1);
|
}
|
},
|
// 倍率
|
rewardProbility: function rewardProbility(index) {
|
index = index || 1;
|
var config_data = [];
|
var lev_index = 1;
|
var role_ve = RoleController.getInstance().getRoleVo();
|
config_data = Config.dial_data.data_magnificat_list[index];
|
|
if (config_data == null) {
|
this.probablity.active = false;
|
return;
|
}
|
|
for (var i in config_data) {
|
if (role_ve.lev >= config_data[i].min && role_ve.lev <= config_data[i].max) {
|
lev_index = i;
|
break;
|
}
|
}
|
|
var config = config_data[parseInt(lev_index)];
|
|
for (var i = 1; i <= this.checkMoreCount; i++) {
|
if (this.desc_item_name[i]) {
|
this.desc_item_name[i].node.active = false;
|
}
|
|
if (this.desc_item_Lv[i]) {
|
this.desc_item_Lv[i].node.active = false;
|
}
|
}
|
|
this.checkMoreCount = config.award.length;
|
var num = Math.floor(this.checkMoreCount / 2);
|
this.probablity.setContentSize(cc.size(this.probablity.getContentSize().width, 45 * num));
|
var pos_y = -35;
|
this.probablity.stopAllActions();
|
|
for (var i = 1; i <= this.checkMoreCount; i++) {
|
Utils.delayRun(this.probablity, i * 2 / cc.game.getFrameRate(), function (i, num) {
|
if (i <= num) {
|
var item_config = Utils.getItemConfig(config.award[i - 1][0]);
|
|
if (!this.desc_item_name[i]) {
|
this.desc_item_name[i] = Utils.createLabel(26, new cc.Color(0x4c, 0xd8, 0x49, 0xff), null, 0, 0, "", this.probablity, null, cc.v2(0, 0.5));
|
}
|
|
if (this.desc_item_name[i]) {
|
this.desc_item_name[i].node.active = true;
|
this.desc_item_name[i].node.setContentSize(cc.size(150, 30));
|
this.desc_item_name[i].string = Utils.TI18N(item_config.name);
|
this.desc_item_name[i].node.setPosition(-320, pos_y - 36 * (i - 1));
|
}
|
|
if (!this.desc_item_Lv[i]) {
|
this.desc_item_Lv[i] = Utils.createLabel(26, new cc.Color(0xff, 0xa7, 0x2a, 0xff), null, 0, 0, "", this.probablity, null, cc.v2(0, 0.5));
|
}
|
|
if (this.desc_item_Lv[i]) {
|
this.desc_item_Lv[i].node.active = true;
|
this.desc_item_Lv[i].string = config.award[i - 1][1] + "%";
|
this.desc_item_Lv[i].node.setPosition(-95, pos_y - 36 * (i - 1));
|
}
|
} else {
|
var item_config = Utils.getItemConfig(config.award[i - 1][0]);
|
|
if (!this.desc_item_name[i]) {
|
this.desc_item_name[i] = Utils.createLabel(26, new cc.Color(0x4c, 0xd8, 0x49, 0xff), null, 0, 0, "", this.probablity, null, cc.v2(0, 0.5));
|
}
|
|
if (this.desc_item_name[i]) {
|
this.desc_item_name[i].node.active = true;
|
this.desc_item_name[i].node.setContentSize(cc.size(150, 30));
|
this.desc_item_name[i].string = Utils.TI18N(item_config.name);
|
this.desc_item_name[i].node.setPosition(-10, pos_y - 36 * (i - (num + 1)));
|
}
|
|
if (!this.desc_item_Lv[i]) {
|
this.desc_item_Lv[i] = Utils.createLabel(26, new cc.Color(0xff, 0xa7, 0x2a, 0xff), null, 0, 0, "", this.probablity, null, cc.v2(0, 0.5));
|
}
|
|
if (this.desc_item_Lv[i]) {
|
this.desc_item_Lv[i].node.active = true;
|
this.desc_item_Lv[i].string = config.award[i - 1][1] + "%";
|
this.desc_item_Lv[i].node.setPosition(215, pos_y - 36 * (i - (num + 1)));
|
}
|
}
|
}.bind(this, i, num));
|
}
|
},
|
itemRewardPos: function itemRewardPos(list) {
|
if (!list || Utils.next(list) == null) return; // 以12点钟方向为起点,顺时针
|
|
for (var i = 1; i <= list.length; i++) {
|
Utils.delayRun(this.item_panel, i * 2 / cc.game.getFrameRate(), function (i) {
|
if (!this.item_list[i]) {
|
var item = ItemsPool.getInstance().getItem("backpack_item");
|
item.initConfig(true, 0.8, false, true);
|
item.setParent(this.item_panel);
|
item.show();
|
this.item_list[i] = item;
|
}
|
|
if (this.item_list[i]) {
|
this.item_list[i].setPosition(reward_pos[i - 1][0], reward_pos[i - 1][1]);
|
this.item_list[i].setData({
|
bid: Config.dial_data.data_get_rand_list[list[i - 1].id][0].item_id,
|
num: Config.dial_data.data_get_rand_list[list[i - 1].id][0].item_num
|
});
|
|
if (list[i - 1]) {
|
if (list[i - 1].status == 1) {
|
this.item_list[i].setItemIconUnEnabled(true);
|
} else if (list[i - 1].status == 0) {
|
this.item_list[i].setItemIconUnEnabled(false);
|
}
|
}
|
|
if (this.item_list[i].root_wnd) {
|
this.item_list[i].root_wnd.active = true;
|
}
|
}
|
}.bind(this, i));
|
}
|
|
this.runLightUniformSpeed();
|
},
|
// 不需要服务端返回就可以显示的东西,避免UI出来时候有空挡
|
changeTabvarData: function changeTabvarData(index) {
|
if (this.cur_index == index) return;
|
index = index || 1;
|
var path = PathTool.getUIIconPath("bigbg/action", "action_treasure_round_" + index);
|
this.loadRes(path, function (res) {
|
this.round_certer.spriteFrame = res;
|
}.bind(this));
|
var buy_reward_data = this.model.getBuyRewardData(index);
|
var lottery_id = buy_reward_data[0].expend_item[0][0];
|
var item_config = Utils.getItemConfig(lottery_id);
|
var str = cc.js.formatStr(Utils.TI18N("<img src='%s'/> %d"), item_config.icon, this.hasTreasure_num[index]);
|
this.treasure_total.string = str;
|
var res = PathTool.getItemRes(item_config.icon);
|
this.loadRes(res, function (resObject) {
|
this.treasure_total.addSpriteFrame(resObject);
|
}.bind(this));
|
|
for (var i = 1; i <= 3; i++) {
|
if (i == 3) {
|
var str = cc.js.formatStr(Utils.TI18N("<outline=2,color=#651D00>免费刷新</outline>"));
|
this.btnTreasure[i].price.string = str;
|
this.btnTreasure[i].price.node.setPosition(0, 0);
|
} else {
|
var str = cc.js.formatStr(Utils.TI18N("<outline=2,color=#651D00>探宝%d次</outline>\n<img src='%s'/><color=#fffb94 fontsize=20><outline=2,color=#651D00> %d</outline></color>"), Config.dial_data.data_const.treasure_num.val[index - 1][i - 1], item_config.icon, buy_reward_data[i - 1].expend_item[0][1]);
|
this.btnTreasure[i].price.string = str;
|
this.loadRes(res, function (item, resObject) {
|
item.addSpriteFrame(resObject);
|
}.bind(this, this.btnTreasure[i].price));
|
}
|
} // Utils.delayRun(this.luckyBar, 10/30, function(index){
|
// this.initRoundItem(index);
|
// }.bind(this,index))
|
|
|
this.initRoundItem(index);
|
},
|
initRoundItem: function initRoundItem(index) {
|
var barBG = this.main_container.getChildByName("Image_2_0");
|
var luckly_num_data = this.model.getLucklyRewardData(index);
|
var bar_interval = barBG.getContentSize().width / 5;
|
|
for (var i = 1; i <= 5; i++) {
|
if (!this.luckly_item[i]) {
|
var RoundItem = require("round_item_panel");
|
|
this.luckly_item[i] = new RoundItem(true, 0.55, 0.7);
|
this.luckly_item[i].setParent(this.luckyBar);
|
this.luckly_item[i].show();
|
this.luckly_item[i].setPosition(bar_interval * i, 0);
|
}
|
|
if (!this.arriveLuckly_label[i] && this.luckly_item[i]) {
|
this.arriveLuckly_label[i] = Utils.createLabel(28, new cc.Color(0xff, 0xff, 0xff, 0xff), null, bar_interval * i, -40, "", this.luckyBar, null, cc.v2(0.5, 0.5));
|
this.arriveLuckly_label[i].node.scale = 0.55;
|
}
|
|
if (this.arriveLuckly_label[i]) {
|
this.arriveLuckly_label[i].string = luckly_num_data[i - 1].lucky_val;
|
}
|
|
if (this.luckly_item[i]) {
|
this.luckly_item[i].setBaseData({
|
bid: luckly_num_data[i - 1].award[0][0],
|
num: luckly_num_data[i - 1].award[0][1]
|
});
|
this.luckly_item[i].setVisibleRedPoint(false);
|
this.luckly_item[i].setVisibleRoundBG(false);
|
|
var func = function (i) {
|
this.ctrl.send16640(index, luckly_num_data[i - 1].id);
|
}.bind(this, i);
|
|
this.luckly_item[i].addCallBack(func);
|
}
|
}
|
},
|
// 分段计算进度条
|
sectionCalculation: function sectionCalculation(num, luckly_list) {
|
num = num || 10;
|
var segmeent = 20;
|
var percent = 0;
|
|
if (luckly_list[0] && luckly_list[1] && luckly_list[2] && luckly_list[3] && luckly_list[4]) {
|
if (num <= luckly_list[0].lucky_val) {
|
return num / luckly_list[0].lucky_val * segmeent / 100;
|
} else if (num > luckly_list[0].lucky_val && num <= luckly_list[1].lucky_val) {
|
percent = 1;
|
} else if (num > luckly_list[1].lucky_val && num <= luckly_list[2].lucky_val) {
|
percent = 2;
|
} else if (num > luckly_list[2].lucky_val && num <= luckly_list[3].lucky_val) {
|
percent = 3;
|
} else if (num > luckly_list[3].lucky_val && num <= luckly_list[4].lucky_val) {
|
percent = 4;
|
} else {
|
return 1;
|
}
|
|
var adv = luckly_list[percent].lucky_val - luckly_list[percent - 1].lucky_val;
|
var count = num - luckly_list[percent - 1].lucky_val;
|
var percent_num = segmeent * percent + count / adv * segmeent;
|
return percent_num / 100;
|
} else {
|
return 0;
|
}
|
},
|
// data:寻宝数据(服务端返回的)
|
commonShowData: function commonShowData(data, luckly_list) {
|
if (!Utils.next(data) || !Utils.next(luckly_list)) return;
|
var lucky_num = 0;
|
|
if (luckly_list[4]) {
|
lucky_num = luckly_list[4].lucky_val;
|
}
|
|
this.text_lucky_num.string = data.lucky + "/" + lucky_num;
|
var mul = this.sectionCalculation(data.lucky, luckly_list);
|
this.luckyBar.getComponent(cc.ProgressBar).progress = mul;
|
var refresh = data.end_time - gcore.SmartSocket.getTime();
|
|
if (refresh > 0) {
|
this.model.setCountDownTime(this.refresh_time, refresh);
|
var item_config = Utils.getItemConfig(Config.dial_data.data_const.refreash.val[0][0]);
|
var res = PathTool.getItemRes(item_config.icon);
|
var str = cc.js.formatStr(Utils.TI18N("<img src='%s'/><outline=2,color=#651D00> %d刷新</outline>"), item_config.icon, Config.dial_data.data_const.refreash.val[0][1]);
|
this.btnTreasure[3].price.string = str;
|
this.touchEffect[data.type] = false;
|
this.loadRes(res, function (resObject) {
|
this.btnTreasure[3].price.addSpriteFrame(resObject);
|
}.bind(this));
|
} else {
|
var str = cc.js.formatStr(Utils.TI18N("<outline=2,color=#651D00>免费刷新</outline>"));
|
this.btnTreasure[3].price.string = str;
|
this.refresh_time.node.stopAllActions();
|
this.refresh_time.string = "00:00:00";
|
this.touchEffect[data.type] = true;
|
}
|
|
var status = false;
|
|
for (var i in luckly_list) {
|
var _bool = true;
|
|
for (var k in data.lucky_award) {
|
if (luckly_list[i].id == data.lucky_award[k].lucky) {
|
_bool = false;
|
break;
|
}
|
}
|
|
if (data.lucky < luckly_list[i].lucky_val) {
|
_bool = false;
|
}
|
|
if (this.luckly_item[parseInt(i) + 1]) {
|
this.luckly_item[parseInt(i) + 1].setItemUnEnabled(false);
|
this.luckly_item[parseInt(i) + 1].setDefaultTip(!_bool);
|
status = status || _bool;
|
this.luckly_item[parseInt(i) + 1].setVisibleRedPoint(_bool);
|
|
if (_bool == false && data.lucky >= luckly_list[i].lucky_val) {
|
this.luckly_item[parseInt(i) + 1].setItemUnEnabled(true);
|
}
|
}
|
}
|
|
this.model.setLucklyTabRedPoint(data.type, status);
|
this.showRedpoint();
|
},
|
showRedpoint: function showRedpoint() {
|
var totle_status = false;
|
|
for (var i = 1; i <= 2; i++) {
|
var status = this.model.getLucklyTabRedPoint(i);
|
this.tab_list[i].redpoint.active = status;
|
totle_status = totle_status || status;
|
}
|
|
var MainuiConst = require("mainui_const");
|
|
MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.lucky_treasure, totle_status);
|
},
|
showTreasureLog: function showTreasureLog(data) {
|
if (!data || Utils.next(data) == null) return;
|
var str = "";
|
var num = data.log_list.length;
|
|
if (num >= 10) {
|
num = 10;
|
}
|
|
for (var i in this.getRewardList) {
|
if (this.getRewardList[i]) {
|
this.getRewardList[i].node.active = false;
|
}
|
}
|
|
this.content.setContentSize(cc.size(this.text_scroll.getContentSize().width, 26 * num));
|
|
for (var i = 0; i < num; i++) {
|
if (data.log_list[i]) {
|
this.getRewardList[i] = Utils.createRichLabel(22, new cc.Color(0xff, 0xff, 0xf8, 0xff), cc.v2(0.5, 1), cc.v2(this.content.getContentSize().width / 2, 0), null, 600);
|
this.content.addChild(this.getRewardList[i].node);
|
}
|
|
if (this.getRewardList[i]) {
|
this.getRewardList[i].node.active = true;
|
this.getRewardList[i].node.y = -26 * i;
|
var item_config = Utils.getItemConfig(data.log_list[i].bid);
|
str = cc.js.formatStr(Utils.TI18N(" <color=#4cd849>%s</color> 获得 <color=#ffa72a>%s</color>"), data.log_list[i].role_name, item_config.name);
|
this.getRewardList[i].string = str;
|
}
|
}
|
},
|
changeTabView: function changeTabView(index) {
|
index = index || 1;
|
if (this.cur_index == index) return;
|
|
if (this.cur_tab != null) {
|
this.cur_tab.label.node.color = new cc.Color(0xff, 0xc3, 0x8d, 0xff);
|
this.cur_tab.normal.active = true;
|
this.cur_tab.select.active = false;
|
}
|
|
this.cur_index = index;
|
this.cur_tab = this.tab_list[this.cur_index];
|
|
if (this.cur_tab != null) {
|
this.cur_tab.label.node.color = new cc.Color(0xfe, 0xff, 0xcd, 0xff);
|
this.cur_tab.normal.active = false;
|
this.cur_tab.select.active = true;
|
}
|
|
this.touchEnable = false;
|
var luckly_list = this.model.getLucklyRewardData(index);
|
var initData = this.model.getTreasureInitData(index);
|
this.commonShowData(initData, luckly_list);
|
this.itemRewardPos(initData.rand_lists);
|
Utils.delayRun(this.content, 20 / cc.game.getFrameRate(), function (initData) {
|
this.showTreasureLog(initData);
|
}.bind(this, initData));
|
},
|
// 更改探宝劵
|
changeTreasureNumber: function changeTreasureNumber(list) {
|
for (var i in list) {
|
if (list[i].base_id == 37001) {
|
this.hasTreasure_num[1] = BackpackController.getInstance().getModel().getBackPackItemNumByBid(37001);
|
|
if (this.cur_index == 1) {
|
var item_config = Utils.getItemConfig(37001);
|
var res = PathTool.getItemRes(item_config.icon);
|
var str = cc.js.formatStr(Utils.TI18N("<img src='%s'/> %d"), item_config.icon, this.hasTreasure_num[1]);
|
this.treasure_total.string = str;
|
this.loadRes(res, function (resObject) {
|
this.treasure_total.addSpriteFrame(resObject);
|
}.bind(this));
|
}
|
} else if (list[i].base_id == 37002) {
|
this.hasTreasure_num[2] = BackpackController.getInstance().getModel().getBackPackItemNumByBid(37002);
|
|
if (this.cur_index == 2) {
|
var item_config = Utils.getItemConfig(37002);
|
var res = PathTool.getItemRes(item_config.icon);
|
var str = cc.js.formatStr(Utils.TI18N("<img src='%s'/> %d"), item_config.icon, this.hasTreasure_num[2]);
|
this.treasure_total.string = str;
|
this.loadRes(res, function (resObject) {
|
this.treasure_total.addSpriteFrame(resObject);
|
}.bind(this));
|
}
|
}
|
}
|
},
|
runHandler: function runHandler() {
|
if (this.step == 0) {
|
this.process = this.process + 0.33;
|
|
if (this.process >= 3) {
|
this.step = 1;
|
this.speed = 0.6;
|
}
|
} else if (this.step == 1) {
|
this.process = this.process + this.speed;
|
|
if (this.process > ROUND_COUNT * this.round && this.targetPos > -1) {
|
if (this.targetPos > 3) {
|
if (this.process % ROUND_COUNT > slow_start) {
|
this.speed = 0.04;
|
this.step = 2;
|
}
|
} else {
|
if (this.targetPos <= slow_start) {
|
if (this.process % (ROUND_COUNT * this.round) >= this.targetPos - slow_start + ROUND_COUNT) {
|
this.speed = 0.04;
|
this.step = 2;
|
}
|
}
|
}
|
}
|
} else if (this.step == 2) {
|
this.process = this.process + this.speed;
|
|
if (this.process % ROUND_COUNT >= this.targetPos && Math.floor(this.process / ROUND_COUNT) >= 5) {
|
if (this.lottery_ticket != null) {
|
gcore.Timer.del(this.lottery_ticket);
|
this.lottery_ticket = null;
|
this.stopRunHandler();
|
}
|
}
|
}
|
|
var p = Math.floor(this.process);
|
this.setPos(p);
|
},
|
setPos: function setPos(pos) {
|
if (pos <= 0) {
|
pos = pos + ROUND_COUNT;
|
} else if (pos >= ROUND_COUNT) {
|
pos = pos % ROUND_COUNT;
|
}
|
|
this.run_light.node.active = true;
|
this.run_light.node.setPosition(reward_pos[change_pos[pos]][0], reward_pos[change_pos[pos]][1]);
|
},
|
// 跑灯结束
|
stopRunHandler: function stopRunHandler() {
|
this.touchEnable = false;
|
|
if (this.run_light_show_reward == null) {
|
this.run_light_show_reward = gcore.Timer.set(function () {
|
if (this.run_light) {
|
this.runLightReward();
|
this.showRewardList = null;
|
this.runLightUniformSpeed();
|
}
|
}.bind(this), 1000, -1);
|
}
|
},
|
// 抽奖奖励
|
runLightReward: function runLightReward() {
|
if (this.showRewardList) {
|
var award = [];
|
|
for (var i in this.showRewardList.awards1) {
|
if (this.showRewardList.awards1[i]) {
|
award.push(this.showRewardList.awards1[i]);
|
}
|
}
|
|
for (var i in this.showRewardList.awards2) {
|
if (this.showRewardList.awards2[i]) {
|
award.push(this.showRewardList.awards2[i]);
|
}
|
} // 类型, 次数类型
|
|
|
this.ctrl.openTreasureGetItemWindow(true, award, this.cur_index, this.touchTreasure_type);
|
}
|
|
var initData = this.model.getTreasureInitData(this.cur_index);
|
|
if (initData) {
|
this.itemRewardPos(initData.rand_lists);
|
}
|
},
|
runLightUniformSpeedHide: function runLightUniformSpeedHide() {
|
this.run_light.node.active = false;
|
|
if (this.open_view_ticket != null) {
|
gcore.Timer.del(this.open_view_ticket);
|
this.open_view_ticket = null;
|
}
|
|
if (this.run_light_show_reward != null) {
|
gcore.Timer.del(this.run_light_show_reward);
|
this.run_light_show_reward = null;
|
}
|
},
|
// 没有跑灯的时候匀速跑
|
runLightUniformSpeed: function runLightUniformSpeed() {
|
if (this.open_view_ticket == null) {
|
this.open_view_ticket = gcore.Timer.set(function () {
|
if (this.run_light) {
|
this.run_light.node.active = true;
|
this.status_count = this.status_count % ROUND_COUNT;
|
this.run_light.node.setPosition(reward_pos[change_pos[this.status_count]][0], reward_pos[change_pos[this.status_count]][1]);
|
this.status_count = this.status_count + 1;
|
}
|
}.bind(this), 500, -1);
|
}
|
},
|
getActionFunc: function getActionFunc(node) {
|
if (!node) return;
|
var fadeout = cc.fadeOut(0.07);
|
node.runAction(fadeout);
|
},
|
startRefreshAction: function startRefreshAction() {
|
for (var i = 1; i <= 8; i++) {
|
if (this.item_list[i] && this.item_list[i].root_wnd) {
|
this.item_list[i].root_wnd.active = false;
|
}
|
}
|
|
var actionNode = new cc.Node();
|
this.item_panel.addChild(actionNode);
|
|
var func = function () {
|
this.ctrl.send16642(this.cur_index);
|
this.handleEffect();
|
}.bind(this);
|
|
actionNode.runAction(cc.sequence(cc.callFunc(func), cc.removeSelf(true)));
|
},
|
// 特效
|
handleEffect: function handleEffect() {
|
var func = function () {
|
this.touchRefresh = false;
|
var initData = this.model.getTreasureInitData(this.cur_index);
|
this.itemRewardPos(initData.rand_lists);
|
}.bind(this);
|
|
Utils.playEffectOnce(PathTool.getEffectRes(614), 0, 0, this.item_panel, func, PlayerAction.action_1, 1);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(index) {
|
this.jump_index = index || 1;
|
this.changeTabvarData(this.jump_index);
|
this.ctrl.requestLucky();
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
this.refresh_time.node.stopAllActions();
|
|
if (this.lottery_ticket != null) {
|
gcore.Timer.del(this.lottery_ticket);
|
this.lottery_ticket = null;
|
}
|
|
if (this.item_list && Utils.next(this.item_list || {}) != null) {
|
for (var i in this.item_list) {
|
if (this.item_list[i] && this.item_list[i].deleteMe) {
|
this.item_list[i].deleteMe();
|
}
|
}
|
}
|
|
if (this.luckly_item && Utils.next(this.luckly_item || {}) != null) {
|
for (var i in this.luckly_item) {
|
if (this.luckly_item[i] && this.luckly_item[i].deleteMe) {
|
this.luckly_item[i].deleteMe();
|
}
|
}
|
}
|
|
this.runLightReward();
|
this.probablity.stopAllActions();
|
this.runLightUniformSpeedHide();
|
|
var MallController = require("mall_controller");
|
|
if (MallController.getInstance().getMallView()) {
|
MallController.getInstance().getMallView().setVisible(true);
|
}
|
|
this.ctrl.openLuckyTreasureWin(false);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhY3Rpb25cXHZpZXdcXGFjdGlvbl90cmVhc3VyZV93aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiQmFja3BhY2tDb250cm9sbGVyIiwiUm9sZUNvbnRyb2xsZXIiLCJNYWludWlDb250cm9sbGVyIiwiQWN0aW9uRXZlbnQiLCJST1VORF9DT1VOVCIsInNsb3dfc3RhcnQiLCJyZXdhcmRfcG9zIiwiY2hhbmdlX3BvcyIsIkFjdGlvbl90cmVhc3VyZVdpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJ1aSIsIndpbl90eXBlIiwiV2luVHlwZSIsIkZ1bGwiLCJjdHJsIiwiYXJndW1lbnRzIiwibW9kZWwiLCJnZXRNb2RlbCIsIk1hbGxDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJnZXRNYWxsVmlldyIsInNldFZpc2libGUiLCJpbml0Q29uZmlnIiwidG91Y2hFbmFibGUiLCJ0b3VjaFJlZnJlc2giLCJ0YWJfbGlzdCIsImN1cl9pbmRleCIsImRlc2NfaXRlbV9uYW1lIiwiZGVzY19pdGVtX0x2IiwiaGFzVHJlYXN1cmVfbnVtIiwidG91Y2hUcmVhc3VyZV90eXBlIiwiY2hlY2tNb3JlQ291bnQiLCJ0b3VjaEVmZmVjdCIsImdldFJld2FyZExpc3QiLCJhcnJpdmVMdWNrbHlfbGFiZWwiLCJpdGVtX2xpc3QiLCJsdWNrbHlfaXRlbSIsIm9wZW5DYWxsQmFjayIsImJpZ2JnIiwicm9vdF93bmQiLCJnZXRDaGlsZEJ5TmFtZSIsInNjYWxlIiwiRklUX1NDQUxFIiwiYmciLCJnZXRDb21wb25lbnQiLCJTcHJpdGUiLCJwYXRoIiwiZ2V0VUlJY29uUGF0aCIsImxvYWRSZXMiLCJyZXMiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJiYWNrZ3JvdW5kIiwibWFpbl9jb250YWluZXIiLCJ0ZXh0X3Njcm9sbCIsImNvbnRlbnQiLCJwcm9iYWJsaXR5IiwiYWN0aXZlIiwiaXRlbV9wYW5lbCIsInJvdW5kX2NlcnRlcl9ub2RlIiwicm91bmRfY2VydGVyIiwiYnRuTG9ja090aGVyIiwidGV4dF82IiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwicmVmcmVzaF90aW1lIiwicnVuX2xpZ2h0IiwiY3JlYXRlSW1hZ2UiLCJ2MiIsInNmX29iaiIsInN0YXR1c19jb3VudCIsInNldEx1Y2tseVJld2FyZERhdGEiLCJzZXRCdXlSZXdhcmREYXRhIiwidGV4dF8yIiwidHJlYXN1cmVfYmciLCJ0cmVhc3VyZV90b3RhbCIsImNyZWF0ZVJpY2hMYWJlbCIsIkNvbG9yIiwid2lkdGgiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJMRUZUIiwiYWRkQ2hpbGQiLCJub2RlIiwibHVja3lCYXIiLCJ0YWJfY29udGFpbmVyIiwidGV4dF90aXRsZSIsImkiLCJ0YWJfYnRuIiwianMiLCJmb3JtYXRTdHIiLCJsYWJlbCIsIm5vcm1hbCIsInNlbGVjdCIsInJlZHBvaW50IiwiY29sb3IiLCJpbmRleCIsImJ1eV9yZXdhcmRfZGF0YSIsImdldEJ1eVJld2FyZERhdGEiLCJsb3R0ZXJ5X2lkIiwiZXhwZW5kX2l0ZW0iLCJnZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCIsImJ0blRyZWFzdXJlIiwidGFiIiwiYnRuIiwicHJpY2UiLCJ0ZXh0X2x1Y2t5X251bSIsImJ0blJ1bGUiLCJidG5fc2hvcCIsInRleHRfMSIsImJ0bl9yZXR1cm4iLCJ0ZXh0XzMiLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJVUERBVEVfTFVDS1lST1VORF9HRVQiLCJkYXRhIiwib3Blbkx1Y2t5VHJlYXN1cmVXaW4iLCJjaGFuZ2VUYWJWaWV3IiwianVtcF9pbmRleCIsIlRSRUFTVVJFX1NVQ0NFU1NfREFUQSIsImNvZGUiLCJtZXNzYWdlIiwibXNnIiwic2hvd1Jld2FyZExpc3QiLCJwb3MiLCJydW5Qcm9jZXNzIiwicHJvY2VzcyIsInNwZWVkIiwiYWRkU3BlZWQiLCJ0YXJnZXRQb3MiLCJhd2FyZHMzIiwic3RlcCIsInJvdW5kIiwicnVuTGlnaHRVbmlmb3JtU3BlZWRIaWRlIiwibG90dGVyeV90aWNrZXQiLCJnY29yZSIsIlRpbWVyIiwic2V0IiwicnVuSGFuZGxlciIsIlVQREFUQV9UUkVBU1VSRV9MT0dfREFUQSIsInVwZGF0YVRyZWFzdXJlTG9nRGF0YSIsInR5cGUiLCJsb2dfbGlzdCIsImluaXREYXRhIiwiZ2V0VHJlYXN1cmVJbml0RGF0YSIsInNob3dUcmVhc3VyZUxvZyIsIlVQREFUQV9UUkVBU1VSRV9QT1BVUFNfU0VORCIsInJ1bkxpZ2h0UmV3YXJkIiwiVVBEQVRFX0xVQ0tMWV9EQVRBIiwiaXRlbV9jb25maWciLCJnZXRJdGVtQ29uZmlnIiwiZ2V0SXRlbVJlcyIsImljb24iLCJzdHIiLCJyZXNPYmplY3QiLCJhZGRTcHJpdGVGcmFtZSIsInVwZGF0YVRyZWFzdXJlSW5pdERhdGEiLCJsdWNrbHlfbGlzdCIsImdldEx1Y2tseVJld2FyZERhdGEiLCJjb21tb25TaG93RGF0YSIsIkV2ZW50SWQiLCJBRERfR09PRFMiLCJiYWdfY29kZSIsInRlbXBfbGlzdCIsImNoYW5nZVRyZWFzdXJlTnVtYmVyIiwiREVMRVRFX0dPT0RTIiwiTU9ESUZZX0dPT0RTX05VTSIsIm9uVG91Y2hFbmQiLCJyb2xlX3ZlIiwiZ2V0Um9sZVZvIiwibGltaXRfb3BlbiIsImxldiIsImNoYW5nZVRhYnZhckRhdGEiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJldmVudCIsInBsYXlCdXR0b25Tb3VuZCIsImNvbmZpZyIsIkNvbmZpZyIsImRpYWxfZGF0YSIsImRhdGFfY29uc3QiLCJnYW1lX3J1bGUxIiwiZ2FtZV9ydWxlMiIsInRvdWNoIiwiZ2V0TG9jYXRpb24iLCJzaG93Q29tbW9uVGlwcyIsImRlc2MiLCJyZXdhcmRQcm9iaWxpdHkiLCJTdHJvbmdlckNvbnRyb2xsZXIiLCJjbGlja0NhbGxCYWNrIiwicm9sZV92byIsImdvbGQiLCJyZWZyZWFzaCIsInZhbCIsInN0YXJ0UmVmcmVzaEFjdGlvbiIsIl9ib29sIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwic2VuZDE2NjM4IiwiY29uZmlnX2RhdGEiLCJsZXZfaW5kZXgiLCJkYXRhX21hZ25pZmljYXRfbGlzdCIsIm1pbiIsIm1heCIsInBhcnNlSW50IiwiYXdhcmQiLCJsZW5ndGgiLCJudW0iLCJNYXRoIiwiZmxvb3IiLCJzZXRDb250ZW50U2l6ZSIsInNpemUiLCJnZXRDb250ZW50U2l6ZSIsInBvc195Iiwic3RvcEFsbEFjdGlvbnMiLCJkZWxheVJ1biIsImdhbWUiLCJnZXRGcmFtZVJhdGUiLCJjcmVhdGVMYWJlbCIsIm5hbWUiLCJzZXRQb3NpdGlvbiIsIml0ZW1SZXdhcmRQb3MiLCJsaXN0IiwibmV4dCIsIml0ZW0iLCJJdGVtc1Bvb2wiLCJnZXRJdGVtIiwic2V0UGFyZW50Iiwic2hvdyIsInNldERhdGEiLCJiaWQiLCJkYXRhX2dldF9yYW5kX2xpc3QiLCJpZCIsIml0ZW1faWQiLCJpdGVtX251bSIsInN0YXR1cyIsInNldEl0ZW1JY29uVW5FbmFibGVkIiwicnVuTGlnaHRVbmlmb3JtU3BlZWQiLCJ0cmVhc3VyZV9udW0iLCJpbml0Um91bmRJdGVtIiwiYmFyQkciLCJsdWNrbHlfbnVtX2RhdGEiLCJiYXJfaW50ZXJ2YWwiLCJSb3VuZEl0ZW0iLCJsdWNreV92YWwiLCJzZXRCYXNlRGF0YSIsInNldFZpc2libGVSZWRQb2ludCIsInNldFZpc2libGVSb3VuZEJHIiwiZnVuYyIsInNlbmQxNjY0MCIsImFkZENhbGxCYWNrIiwic2VjdGlvbkNhbGN1bGF0aW9uIiwic2VnbWVlbnQiLCJwZXJjZW50IiwiYWR2IiwiY291bnQiLCJwZXJjZW50X251bSIsImx1Y2t5X251bSIsImx1Y2t5IiwibXVsIiwiUHJvZ3Jlc3NCYXIiLCJwcm9ncmVzcyIsInJlZnJlc2giLCJlbmRfdGltZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsInNldENvdW50RG93blRpbWUiLCJrIiwibHVja3lfYXdhcmQiLCJzZXRJdGVtVW5FbmFibGVkIiwic2V0RGVmYXVsdFRpcCIsInNldEx1Y2tseVRhYlJlZFBvaW50Iiwic2hvd1JlZHBvaW50IiwidG90bGVfc3RhdHVzIiwiZ2V0THVja2x5VGFiUmVkUG9pbnQiLCJNYWludWlDb25zdCIsInNldEZ1bmN0aW9uVGlwc1N0YXR1cyIsImx1Y2t5X3RyZWFzdXJlIiwieSIsInJvbGVfbmFtZSIsImN1cl90YWIiLCJyYW5kX2xpc3RzIiwiYmFzZV9pZCIsImRlbCIsInN0b3BSdW5IYW5kbGVyIiwicCIsInNldFBvcyIsInJ1bl9saWdodF9zaG93X3Jld2FyZCIsImF3YXJkczEiLCJwdXNoIiwiYXdhcmRzMiIsIm9wZW5UcmVhc3VyZUdldEl0ZW1XaW5kb3ciLCJvcGVuX3ZpZXdfdGlja2V0IiwiZ2V0QWN0aW9uRnVuYyIsImZhZGVvdXQiLCJmYWRlT3V0IiwicnVuQWN0aW9uIiwiYWN0aW9uTm9kZSIsInNlbmQxNjY0MiIsImhhbmRsZUVmZmVjdCIsInNlcXVlbmNlIiwiY2FsbEZ1bmMiLCJyZW1vdmVTZWxmIiwicGxheUVmZmVjdE9uY2UiLCJnZXRFZmZlY3RSZXMiLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb25fMSIsIm9wZW5Sb290V25kIiwicmVxdWVzdEx1Y2t5IiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsa0JBQWtCLEdBQUdELE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJRSxjQUFjLEdBQUdGLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLFdBQVcsR0FBR0osT0FB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QUFHMEIsY0FBYyxDQUFDQyxXQUFmLEdBQTZCQyxXQUE3QixFQUFILEVBQThDO0FBQzFDRixNQUFBQSxjQUFjLENBQUNDLFdBQWYsR0FBNkJDLFdBQTdCLEdBQTJDQyxVQUEzQyxDQUFzRCxJQUF0RDtBQUNIOztBQUNELFNBQUtQLElBQUwsQ0FBVXlHLG9CQUFWLENBQStCLEtBQS9CO0FBRUg7QUFqM0JnQyxDQUFULENBQTVCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg5bm46L+Q5o6i5a6dXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wNC0yMyAxNTo0NTo0M1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIEFjdGlvbkV2ZW50ID0gcmVxdWlyZShcImFjdGlvbl9ldmVudFwiKTtcbnZhciBST1VORF9DT1VOVCA9IDg7XG52YXIgc2xvd19zdGFydCA9IDM7Ly/lvIDlp4vlh4/lsJHnga/nmoTkuKrmlbBcbnZhciByZXdhcmRfcG9zID0gW1swLDIwNF0sWzE0OCwxMzNdLFsyMjEsLTE5XSxbMTQzLC0xNjVdLFswLC0yMzldLFstMTQyLC0xNzBdLFstMjI1LC0xOV0sWy0xNDQsMTM2XV07XG4vLyDmlbDlrZfnmoTovazmjaIgIOS7jjDlvIDlp4tcbnZhciBjaGFuZ2VfcG9zID0gWzAsMSwyLDMsNCw1LDYsNywwXS8v6LaK55WM5aSE55CGXG5cblxuXG52YXIgQWN0aW9uX3RyZWFzdXJlV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImFjdGlvblwiLCBcImFjdGlvbl90cmVhc3VyZV93aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy51aTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB2YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpXG4gICAgICAgIGlmKE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TWFsbFZpZXcoKSl7XG4gICAgICAgICAgICBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1hbGxWaWV3KCkuc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnRvdWNoRW5hYmxlID0gZmFsc2U7IC8v6Ziy5q2i5Lmx54K577yM5b+F6aG7562J5Yiw5pys5Zyw5oq95aWW5a6M5oiQ5LmL5ZCO5omN6IO96L+b6KGM5LiL5LiA5qyhXG4gICAgICAgIHRoaXMudG91Y2hSZWZyZXNoID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFiX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBudWxsO1xuICAgIFxuICAgICAgICB0aGlzLmRlc2NfaXRlbV9uYW1lID0gW107XG4gICAgICAgIHRoaXMuZGVzY19pdGVtX0x2ID0gW107XG4gICAgXG4gICAgICAgIC8vIOaLpeacieeahOWKteaVsFxuICAgICAgICB0aGlzLmhhc1RyZWFzdXJlX251bSA9IFtdO1xuICAgICAgICAvLyDngrnlh7vnmoTmjqLlrp3nsbvlnosgIC0tIDEgIDJcbiAgICAgICAgdGhpcy50b3VjaFRyZWFzdXJlX3R5cGUgPSAxO1xuICAgICAgICAvLyDmn6XnnIvmm7TlpJrph4zpnaLnmoTkuKrmlbBcbiAgICAgICAgdGhpcy5jaGVja01vcmVDb3VudCA9IDE7XG4gICAgICAgIC8v5qCH562+6aG157qi54K5XG4gICAgICAgIC8vICB0aGlzLnRhYlJlZFBvaW50ID0ge2ZhbHNlLGZhbHNlfVxuICAgICAgICAvLyDngrnlh7vliLfmlrDmjqfliLbnibnmlYhcbiAgICAgICAgdGhpcy50b3VjaEVmZmVjdCA9IFt0cnVlLHRydWVdO1xuICAgICAgICAvLyDmjqLlrp3orrDlvZVcbiAgICAgICAgdGhpcy5nZXRSZXdhcmRMaXN0ID0gW107XG4gICAgICAgIC8vIOW5uOi/kOWAvOi+vuWIsOmihuWPluWlluWKseaVsOWtl1xuICAgICAgICB0aGlzLmFycml2ZUx1Y2tseV9sYWJlbCA9IFtdO1xuICAgIFxuICAgICAgICB0aGlzLml0ZW1fbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmx1Y2tseV9pdGVtID0gW107XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5iaWdiZyA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiZ1wiKTtcbiAgICAgICAgdGhpcy5iaWdiZy5zY2FsZSA9IEZJVF9TQ0FMRSoyO1xuXG4gICAgICAgIHRoaXMuYmcgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwiYmdcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIGxldCBwYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImJpZ2JnL2FjdGlvblwiLFwiYWN0aW9uX3RyZWFzdXJlXCIsXCJqcGdcIik7XG4gICAgICAgIHRoaXMubG9hZFJlcyhwYXRoLGZ1bmN0aW9uKHJlcyl7XG4gICAgICAgICAgICB0aGlzLmJnLnNwcml0ZUZyYW1lID0gcmVzXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIik7XG5cbiAgICAgICAgdmFyIG1haW5fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gbWFpbl9jb250YWluZXI7XG4gICAgICAgIFxuXG4gICAgICAgIHRoaXMudGV4dF9zY3JvbGwgPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRleHRfc2Nyb2xsXCIpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLnRleHRfc2Nyb2xsLmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcbiAgICAgICAgdGhpcy5wcm9iYWJsaXR5ID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJwcm9iYWJsaXR5XCIpO1xuICAgICAgICB0aGlzLnByb2JhYmxpdHkuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5pdGVtX3BhbmVsID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLnJvdW5kX2NlcnRlcl9ub2RlID0gdGhpcy5pdGVtX3BhbmVsLmdldENoaWxkQnlOYW1lKFwicm91bmRcIik7XG4gICAgICAgIHRoaXMucm91bmRfY2VydGVyX25vZGUuc2NhbGUgPSAyO1xuICAgICAgICB0aGlzLnJvdW5kX2NlcnRlciA9IHRoaXMucm91bmRfY2VydGVyX25vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuYnRuTG9ja090aGVyID0gdGhpcy5pdGVtX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYnRuTG9ja090aGVyXCIpO1xuICAgICAgICB2YXIgdGV4dF82ID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJUZXh0XzZcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGV4dF82LnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5LiL5qyh5YWN6LS55Yi35pawOiBcIik7XG4gICAgICAgIHRoaXMucmVmcmVzaF90aW1lID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJyZWZyZXNoX3RpbWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX3RpbWUuc3RyaW5nID0gXCIwMDowMDowMFwiO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5ydW5fbGlnaHQgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLml0ZW1fcGFuZWwsbnVsbCwwLCAwLGNjLnYyKDAuNSwgMC41KSxudWxsLDEwKTtcbiAgICAgICAgdGhpcy5ydW5fbGlnaHQuYWN0aXZlID1mYWxzZTtcbiAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJ3ZWxmYXJlXCIsXCJ3ZWxmYXJlXzM3XCIpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bl9saWdodC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuc3RhdHVzX2NvdW50ID0gMDtcbiAgICBcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRMdWNrbHlSZXdhcmREYXRhKCk7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0QnV5UmV3YXJkRGF0YSgpO1xuXG4gICAgICAgIHZhciB0ZXh0XzIgPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcIlRleHRfMlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0ZXh0XzIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmjqLlrp3orrDlvZVcIik7XG4gICAgICAgIFxuICAgICAgICB2YXIgdHJlYXN1cmVfYmcgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidHJlYXN1cmVfYmdcIik7XG4gICAgICAgIHRoaXMudHJlYXN1cmVfdG90YWwgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjIsIG5ldyBjYy5Db2xvcigweGZmLDB4ZmYsMHhmOCwweGZmKSwgY2MudjIoMCwgMC41KSwgY2MudjIoLXRyZWFzdXJlX2JnLndpZHRoLzIsMCksNDUsMTUwKTtcbiAgICAgICAgdGhpcy50cmVhc3VyZV90b3RhbC5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XG4gICAgICAgIHRyZWFzdXJlX2JnLmFkZENoaWxkKHRoaXMudHJlYXN1cmVfdG90YWwubm9kZSk7XG5cbiAgICAgICAgdGhpcy5sdWNreUJhciA9IG1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibHVja3lCYXJcIik7XG5cbiAgICAgICAgdmFyIHRhYl9jb250YWluZXIgPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRhYl9jb250YWluZXJcIik7XG4gICAgICAgIHZhciB0ZXh0X3RpdGxlID0gW1V0aWxzLlRJMThOKFwi5bm46L+Q5o6i5a6dXCIpLFV0aWxzLlRJMThOKFwi6auY57qn5o6i5a6dXCIpXTtcbiAgICAgICAgZm9yKHZhciBpPTE7aTw9MjtpKyspe1xuICAgICAgICAgICAgdmFyIHRhYl9idG4gPSB0YWJfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKGNjLmpzLmZvcm1hdFN0cihcInRhYl9idG5fJXNcIixpKSk7XG4gICAgICAgICAgICB0YWJfYnRuLmxhYmVsID0gdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgICAgICB0YWJfYnRuLmxhYmVsLnN0cmluZyA9IHRleHRfdGl0bGVbaS0xXTtcbiAgICAgICAgICAgIHRhYl9idG4ubm9ybWFsID0gdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcIm5vcm1hbFwiKTtcbiAgICAgICAgICAgIHRhYl9idG4uc2VsZWN0ID0gdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdFwiKTtcbiAgICAgICAgICAgIHRhYl9idG4uc2VsZWN0LmFjdGl2ZSA9ZmFsc2U7XG4gICAgICAgICAgICB0YWJfYnRuLnJlZHBvaW50ID0gdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInJlZHBvaW50XCIpO1xuICAgICAgICAgICAgdGFiX2J0bi5yZWRwb2ludC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRhYl9idG4ubGFiZWwubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGZmLDB4YzMsMHg4ZCwgMHhmZik7XG4gICAgICAgICAgICB0YWJfYnRuLmluZGV4ID0gaTtcbiAgICAgICAgICAgIHRoaXMudGFiX2xpc3RbaV0gPSB0YWJfYnRuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKHZhciBpPTE7aTw9MjtpKyspe1xuICAgICAgICAgICAgdmFyIGJ1eV9yZXdhcmRfZGF0YSA9IHRoaXMubW9kZWwuZ2V0QnV5UmV3YXJkRGF0YShpKTtcbiAgICAgICAgICAgIHZhciBsb3R0ZXJ5X2lkID0gYnV5X3Jld2FyZF9kYXRhWzBdLmV4cGVuZF9pdGVtWzBdWzBdO1xuICAgICAgICAgICAgdGhpcy5oYXNUcmVhc3VyZV9udW1baV0gPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEJhY2tQYWNrSXRlbU51bUJ5QmlkKGxvdHRlcnlfaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idG5UcmVhc3VyZSA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD0zO2krKyl7XG4gICAgICAgICAgICB2YXIgdGFiID0ge307XG4gICAgICAgICAgICB0YWIuYnRuID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidG5fdHJlYXN1cmVfXCIraSk7XG4gICAgICAgICAgICB0YWIucHJpY2UgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjQsIG5ldyBjYy5Db2xvcigweGZmLDB4ZmYsMHhmZiwweGZmKSwgY2MudjIoMC41LCAwLjUpLCBjYy52MigwLDApLDMxKTtcbiAgICAgICAgICAgIHRhYi5idG4uYWRkQ2hpbGQodGFiLnByaWNlLm5vZGUpO1xuICAgICAgICAgICAgdGhpcy5idG5UcmVhc3VyZVtpXSA9IHRhYjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dF9sdWNreV9udW0gPSBtYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRleHRfbHVja3lfbnVtXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMudGV4dF9sdWNreV9udW0uc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5idG5SdWxlID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidG5SdWxlXCIpOyBcbiAgICAgICAgdGhpcy5idG5fc2hvcCA9IG1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYnRuX3Nob3BcIik7XG4gICAgICAgIHZhciB0ZXh0XzEgPSB0aGlzLmJ0bl9zaG9wLmdldENoaWxkQnlOYW1lKFwiVGV4dF8xXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRleHRfMS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaOouWuneWVhuW6l1wiKTtcbiAgICAgICAgdGhpcy5idG5fcmV0dXJuID0gbWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidG5fcmV0dXJuXCIpO1xuICAgICAgICB2YXIgdGV4dF8zID0gdGhpcy5idG5fcmV0dXJuLmdldENoaWxkQnlOYW1lKFwiVGV4dF8zXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRleHRfMy5zdHJpbmcgPSBVdGlscy5USTE4TihcIui/lOWbnlwiKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChBY3Rpb25FdmVudC5VUERBVEVfTFVDS1lST1VORF9HRVQsZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgICAgICBpZighZGF0YSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MdWNreVRyZWFzdXJlV2luKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVRhYlZpZXcodGhpcy5jdXJfaW5kZXggfHwgdGhpcy5qdW1wX2luZGV4KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEFjdGlvbkV2ZW50LlRSRUFTVVJFX1NVQ0NFU1NfREFUQSxmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgIGlmKCFkYXRhKXJldHVybjtcbiAgICAgICAgICAgIGlmKGRhdGEuY29kZSA9PSAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoRW5hYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaG93UmV3YXJkTGlzdCA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgICAgICB0aGlzLnJ1blByb2Nlc3M9IDA7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSB0aGlzLnN0YXR1c19jb3VudDsgLy/lvIDlp4vnmoTkvY3nva5cbiAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAxO1xuICAgICAgICAgICAgdGhpcy5hZGRTcGVlZCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRhcmdldFBvcyA9IGRhdGEuYXdhcmRzM1swXS5wb3MgLSAxOyAvL+WBnOeBr+eahOS9jee9rijku44w5byA5aeLKVxuICAgICAgICAgICAgdGhpcy5zdGVwID0gMDtcbiAgICAgICAgICAgIHRoaXMucm91bmQgPSA1OyAvL+WciOaVsFxuICAgICAgICAgICAgaWYodGhpcy50YXJnZXRQb3MgPD0gMyl7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3VuZCA9IDQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucnVuTGlnaHRVbmlmb3JtU3BlZWRIaWRlKCk7XG4gICAgICAgICAgICBpZih0aGlzLmxvdHRlcnlfdGlja2V0ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMubG90dGVyeV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSwgMzAsLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoQWN0aW9uRXZlbnQuVVBEQVRBX1RSRUFTVVJFX0xPR19EQVRBLGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICAgICAgaWYoIWRhdGEpe1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRhVHJlYXN1cmVMb2dEYXRhKGRhdGEudHlwZSwgZGF0YS5sb2dfbGlzdCk7XG4gICAgICAgICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLm1vZGVsLmdldFRyZWFzdXJlSW5pdERhdGEoZGF0YS50eXBlKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1RyZWFzdXJlTG9nKGluaXREYXRhKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyDlvLnnqpdcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChBY3Rpb25FdmVudC5VUERBVEFfVFJFQVNVUkVfUE9QVVBTX1NFTkQsZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnNob3dSZXdhcmRMaXN0ID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMucnVuTGlnaHRSZXdhcmQoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEFjdGlvbkV2ZW50LlVQREFURV9MVUNLTFlfREFUQSxmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgIGlmKCFkYXRhKXJldHVybjtcbiAgICAgICAgICAgIHZhciBidXlfcmV3YXJkX2RhdGEgPSB0aGlzLm1vZGVsLmdldEJ1eVJld2FyZERhdGEoZGF0YS50eXBlKTtcbiAgICAgICAgICAgIHZhciBsb3R0ZXJ5X2lkID0gYnV5X3Jld2FyZF9kYXRhWzBdLmV4cGVuZF9pdGVtWzBdWzBdO1xuICAgICAgICAgICAgdGhpcy5oYXNUcmVhc3VyZV9udW1bZGF0YS50eXBlXSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQobG90dGVyeV9pZCk7XG4gICAgICAgICAgICBpZih0aGlzLmhhc1RyZWFzdXJlX251bVtkYXRhLnR5cGVdIDw9IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzVHJlYXN1cmVfbnVtW2RhdGEudHlwZV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhsb3R0ZXJ5X2lkKTtcbiAgICAgICAgICAgIGlmKGl0ZW1fY29uZmlnKXtcbiAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGltZyBzcmM9JyVzJy8+ICAlZFwiKSxpdGVtX2NvbmZpZy5pY29uLHRoaXMuaGFzVHJlYXN1cmVfbnVtW2RhdGEudHlwZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfdG90YWwuc3RyaW5nID1zdHI7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uIChyZXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVhc3VyZV90b3RhbC5hZGRTcHJpdGVGcmFtZShyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGFUcmVhc3VyZUluaXREYXRhKGRhdGEudHlwZSwgZGF0YSk7XG5cbiAgICAgICAgICAgIHZhciBsdWNrbHlfbGlzdCA9IHRoaXMubW9kZWwuZ2V0THVja2x5UmV3YXJkRGF0YShkYXRhLnR5cGUpO1xuICAgICAgICAgICAgdmFyIGluaXREYXRhID0gdGhpcy5tb2RlbC5nZXRUcmVhc3VyZUluaXREYXRhKGRhdGEudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vblNob3dEYXRhKGluaXREYXRhLCBsdWNrbHlfbGlzdCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUyxmdW5jdGlvbihiYWdfY29kZSx0ZW1wX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUcmVhc3VyZU51bWJlcih0ZW1wX2xpc3QpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5ERUxFVEVfR09PRFMsZnVuY3Rpb24oYmFnX2NvZGUsdGVtcF9saXN0KXtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVHJlYXN1cmVOdW1iZXIodGVtcF9saXN0KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEV2ZW50SWQuTU9ESUZZX0dPT0RTX05VTSxmdW5jdGlvbihiYWdfY29kZSx0ZW1wX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUcmVhc3VyZU51bWJlcih0ZW1wX2xpc3QpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLnRhYl9saXN0KXtcbiAgICAgICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy50YWJfbGlzdFtpXSwgZnVuY3Rpb24gKHRhYl9idG4pIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnRvdWNoRW5hYmxlID09IHRydWUpcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvYmFibGl0eS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgcm9sZV92ZSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLm1vZGVsLmdldEJ1eVJld2FyZERhdGEodGFiX2J0bi5pbmRleCk7XG4gICAgICAgICAgICAgICAgaWYoZGF0YSAmJiBkYXRhWzBdLmxpbWl0X29wZW4pe1xuICAgICAgICAgICAgICAgICAgICBpZihyb2xlX3ZlLmxldiA+PSBkYXRhWzBdLmxpbWl0X29wZW5bMF1bMV0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWJ2YXJEYXRhKHRhYl9idG4uaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWJWaWV3KHRhYl9idG4uaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLkurrniannrYnnuqclZOe6p+W8gOWQr1wiKSxkYXRhWzBdLmxpbWl0X29wZW5bMF1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShzdHIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMsdGhpcy50YWJfbGlzdFtpXSksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0bl9yZXR1cm4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuTHVja3lUcmVhc3VyZVdpbihmYWxzZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMik7XG5cbiAgICAgICAgdGhpcy5idG5SdWxlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSk7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2NvbnN0LmdhbWVfcnVsZTE7XG4gICAgICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSAyKXtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBDb25maWcuZGlhbF9kYXRhLmRhdGFfY29uc3QuZ2FtZV9ydWxlMlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoY29uZmlnLmRlc2MsIHBvcyxudWxsLG51bGwsNTAwKTtcbiAgICAgICAgfSx0aGlzKTtcblxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5Mb2NrT3RoZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvYmFibGl0eS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZXdhcmRQcm9iaWxpdHkodGhpcy5jdXJfaW5kZXgpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5wcm9iYWJsaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2JhYmxpdHkuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJhY2tncm91bmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvYmFibGl0eS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKTtcblxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuYnRuX3Nob3AsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBNYWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWxsX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgIGlmKE1hbGxDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TWFsbFZpZXcoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIFN0cm9uZ2VyQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdHJvbmdlcl9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICBTdHJvbmdlckNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jbGlja0NhbGxCYWNrKDQwNik7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgZm9yKHZhciBpIGluIHRoaXMuYnRuVHJlYXN1cmUpe1xuICAgICAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0blRyZWFzdXJlW2ldLmJ0biwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnRvdWNoRW5hYmxlID09IHRydWUpe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5o6i5a6d6L+b6KGM5LitXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmN1cl9pbmRleCA9IHRoaXMuY3VyX2luZGV4IHx8IDE7XG5cbiAgICAgICAgICAgICAgICBpZihpID09IDMpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJvbGVfdm8uZ29sZCA8IENvbmZpZy5kaWFsX2RhdGEuZGF0YV9jb25zdC5yZWZyZWFzaC52YWxbMF1bMV0gJiYgdGhpcy50b3VjaEVmZmVjdFt0aGlzLmN1cl9pbmRleF0gPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIumSu+efs+S4jei2s1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy50b3VjaFJlZnJlc2ggPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5Yi35paw5LitLi4uXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoUmVmcmVzaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuTGlnaHRVbmlmb3JtU3BlZWRIaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRSZWZyZXNoQWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5tb2RlbC5nZXRCdXlSZXdhcmREYXRhKHRoaXMuY3VyX2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3VjaEVuYWJsZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9ib29sID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoZWNrSXNPcGVuQnlBY3RpdmF0ZShkYXRhW2ktMV0ubGltaXRfb3Blbik7XG4gICAgICAgICAgICAgICAgICAgIGlmKF9ib29sID09IHRydWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3VjaFRyZWFzdXJlX3R5cGUgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG91Y2hFbmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZDE2NjM4KHRoaXMuY3VyX2luZGV4LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcyxpKSwgMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YCN546HXG4gICAgcmV3YXJkUHJvYmlsaXR5OmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaW5kZXggPSBpbmRleCB8fCAxO1xuICAgICAgICB2YXIgY29uZmlnX2RhdGEgPSBbXTtcbiAgICAgICAgdmFyIGxldl9pbmRleCA9IDE7XG4gICAgICAgIHZhciByb2xlX3ZlID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgY29uZmlnX2RhdGEgPSBDb25maWcuZGlhbF9kYXRhLmRhdGFfbWFnbmlmaWNhdF9saXN0W2luZGV4XTtcbiAgICAgICAgaWYoY29uZmlnX2RhdGEgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnByb2JhYmxpdHkuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGkgaW4gY29uZmlnX2RhdGEpe1xuICAgICAgICAgICAgaWYocm9sZV92ZS5sZXYgPj0gY29uZmlnX2RhdGFbaV0ubWluICYmIHJvbGVfdmUubGV2IDw9IGNvbmZpZ19kYXRhW2ldLm1heCl7XG4gICAgICAgICAgICAgICAgbGV2X2luZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb25maWcgPSBjb25maWdfZGF0YVtwYXJzZUludChsZXZfaW5kZXgpXTtcblxuICAgICAgICBmb3IodmFyIGk9MTtpPD10aGlzLmNoZWNrTW9yZUNvdW50O2krKyl7XG4gICAgICAgICAgICBpZih0aGlzLmRlc2NfaXRlbV9uYW1lW2ldKXtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NfaXRlbV9uYW1lW2ldLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmRlc2NfaXRlbV9MdltpXSl7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fTHZbaV0ubm9kZS5hY3RpdmUgPWZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja01vcmVDb3VudCA9IGNvbmZpZy5hd2FyZC5sZW5ndGg7XG4gICAgICAgIHZhciBudW0gPSBNYXRoLmZsb29yKHRoaXMuY2hlY2tNb3JlQ291bnQvMik7XG4gICAgICAgIHRoaXMucHJvYmFibGl0eS5zZXRDb250ZW50U2l6ZShjYy5zaXplKHRoaXMucHJvYmFibGl0eS5nZXRDb250ZW50U2l6ZSgpLndpZHRoLCA0NSpudW0pKTtcbiAgICAgICAgdmFyIHBvc195ID0gLSAzNTtcbiAgICAgICAgdGhpcy5wcm9iYWJsaXR5LnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PXRoaXMuY2hlY2tNb3JlQ291bnQ7aSsrKXtcbiAgICAgICAgICAgIFV0aWxzLmRlbGF5UnVuKHRoaXMucHJvYmFibGl0eSwgaSoyL2NjLmdhbWUuZ2V0RnJhbWVSYXRlKCksZnVuY3Rpb24oaSxudW0pe1xuICAgICAgICAgICAgICAgIGlmKGkgPD0gbnVtKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhjb25maWcuYXdhcmRbaS0xXVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmRlc2NfaXRlbV9uYW1lW2ldKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX25hbWVbaV0gPSBVdGlscy5jcmVhdGVMYWJlbCgyNixuZXcgY2MuQ29sb3IoMHg0YywweGQ4LDB4NDksMHhmZiksbnVsbCwwLDAsXCJcIix0aGlzLnByb2JhYmxpdHksbnVsbCwgY2MudjIoMCwwLjUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmRlc2NfaXRlbV9uYW1lW2ldKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX25hbWVbaV0ubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fbmFtZVtpXS5ub2RlLnNldENvbnRlbnRTaXplKGNjLnNpemUoMTUwLDMwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NfaXRlbV9uYW1lW2ldLnN0cmluZyA9IFV0aWxzLlRJMThOKGl0ZW1fY29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fbmFtZVtpXS5ub2RlLnNldFBvc2l0aW9uKC0zMjAscG9zX3ktMzYqKGktMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5kZXNjX2l0ZW1fTHZbaV0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fTHZbaV0gPSBVdGlscy5jcmVhdGVMYWJlbCgyNixuZXcgY2MuQ29sb3IoMHhmZiwweGE3LDB4MmEsMHhmZiksbnVsbCwwLDAsXCJcIix0aGlzLnByb2JhYmxpdHksbnVsbCwgY2MudjIoMCwwLjUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGVzY19pdGVtX0x2W2ldKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX0x2W2ldLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX0x2W2ldLnN0cmluZyA9IGNvbmZpZy5hd2FyZFtpLTFdWzFdK1wiJVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fTHZbaV0ubm9kZS5zZXRQb3NpdGlvbigtOTUscG9zX3ktMzYqKGktMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoY29uZmlnLmF3YXJkW2ktMV1bMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5kZXNjX2l0ZW1fbmFtZVtpXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NfaXRlbV9uYW1lW2ldID0gVXRpbHMuY3JlYXRlTGFiZWwoMjYsbmV3IGNjLkNvbG9yKDB4NGMsMHhkOCwweDQ5LDB4ZmYpLG51bGwsMCwwLFwiXCIsdGhpcy5wcm9iYWJsaXR5LG51bGwsIGNjLnYyKDAsMC41KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kZXNjX2l0ZW1fbmFtZVtpXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NfaXRlbV9uYW1lW2ldLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX25hbWVbaV0ubm9kZS5zZXRDb250ZW50U2l6ZShjYy5zaXplKDE1MCwzMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fbmFtZVtpXS5zdHJpbmcgPSBVdGlscy5USTE4TihpdGVtX2NvbmZpZy5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX25hbWVbaV0ubm9kZS5zZXRQb3NpdGlvbigtMTAscG9zX3ktMzYqKGktKG51bSsxKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmRlc2NfaXRlbV9MdltpXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NfaXRlbV9MdltpXSA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI2LG5ldyBjYy5Db2xvcigweGZmLDB4YTcsMHgyYSwweGZmKSxudWxsLDAsMCxcIlwiLHRoaXMucHJvYmFibGl0eSxudWxsLCBjYy52MigwLDAuNSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGVzY19pdGVtX0x2W2ldKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX0x2W2ldLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY19pdGVtX0x2W2ldLnN0cmluZyA9IGNvbmZpZy5hd2FyZFtpLTFdWzFdK1wiJVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNjX2l0ZW1fTHZbaV0ubm9kZS5zZXRQb3NpdGlvbigyMTUscG9zX3ktMzYqKGktKG51bSsxKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMsaSxudW0pKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9LFxuICAgIFxuICAgIGl0ZW1SZXdhcmRQb3M6ZnVuY3Rpb24obGlzdCl7XG4gICAgICAgIGlmKCFsaXN0IHx8IFV0aWxzLm5leHQobGlzdCkgPT0gbnVsbClyZXR1cm47XG4gICAgICAgIC8vIOS7pTEy54K56ZKf5pa55ZCR5Li66LW354K577yM6aG65pe26ZKIXG4gICAgICAgIGZvcih2YXIgaT0xO2k8PWxpc3QubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICBVdGlscy5kZWxheVJ1bih0aGlzLml0ZW1fcGFuZWwsIGkqMi9jYy5nYW1lLmdldEZyYW1lUmF0ZSgpLCBmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5pdGVtX2xpc3RbaV0pe1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmluaXRDb25maWcodHJ1ZSwgMC44LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0UGFyZW50KHRoaXMuaXRlbV9wYW5lbClcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0W2ldID0gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodGhpcy5pdGVtX2xpc3RbaV0pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtpXS5zZXRQb3NpdGlvbihyZXdhcmRfcG9zW2ktMV1bMF0sIHJld2FyZF9wb3NbaS0xXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0W2ldLnNldERhdGEoe2JpZDpDb25maWcuZGlhbF9kYXRhLmRhdGFfZ2V0X3JhbmRfbGlzdFtsaXN0W2ktMV0uaWRdWzBdLml0ZW1faWQsIG51bTpDb25maWcuZGlhbF9kYXRhLmRhdGFfZ2V0X3JhbmRfbGlzdFtsaXN0W2ktMV0uaWRdWzBdLml0ZW1fbnVtfSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmKGxpc3RbaS0xXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsaXN0W2ktMV0uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0W2ldLnNldEl0ZW1JY29uVW5FbmFibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobGlzdFtpLTFdLnN0YXR1cyA9PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtpXS5zZXRJdGVtSWNvblVuRW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5pdGVtX2xpc3RbaV0ucm9vdF93bmQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RbaV0ucm9vdF93bmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzLGkpKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVuTGlnaHRVbmlmb3JtU3BlZWQoKTtcbiAgICB9LFxuXG4gICAgLy8g5LiN6ZyA6KaB5pyN5Yqh56uv6L+U5Zue5bCx5Y+v5Lul5pi+56S655qE5Lic6KW/77yM6YG/5YWNVUnlh7rmnaXml7blgJnmnInnqbrmjKFcbiAgICBjaGFuZ2VUYWJ2YXJEYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gaW5kZXgpcmV0dXJuO1xuICAgICAgICBpbmRleCA9IGluZGV4IHx8IDE7XG5cbiAgICAgICAgbGV0IHBhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiYmlnYmcvYWN0aW9uXCIsXCJhY3Rpb25fdHJlYXN1cmVfcm91bmRfXCIraW5kZXgpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocGF0aCxmdW5jdGlvbihyZXMpe1xuICAgICAgICAgICAgdGhpcy5yb3VuZF9jZXJ0ZXIuc3ByaXRlRnJhbWUgPSByZXNcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB2YXIgYnV5X3Jld2FyZF9kYXRhID0gdGhpcy5tb2RlbC5nZXRCdXlSZXdhcmREYXRhKGluZGV4KTtcblxuICAgICAgICB2YXIgbG90dGVyeV9pZCA9IGJ1eV9yZXdhcmRfZGF0YVswXS5leHBlbmRfaXRlbVswXVswXTtcbiAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhsb3R0ZXJ5X2lkKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCI8aW1nIHNyYz0nJXMnLz4gICVkXCIpLGl0ZW1fY29uZmlnLmljb24sdGhpcy5oYXNUcmVhc3VyZV9udW1baW5kZXhdKTtcbiAgICAgICAgdGhpcy50cmVhc3VyZV90b3RhbC5zdHJpbmcgPSBzdHI7XG5cbiAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbik7XG4gICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIChmdW5jdGlvbiAocmVzT2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnRyZWFzdXJlX3RvdGFsLmFkZFNwcml0ZUZyYW1lKHJlc09iamVjdCk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTM7aSsrKXtcbiAgICAgICAgICAgIGlmKGk9PTMpe1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCI8b3V0bGluZT0yLGNvbG9yPSM2NTFEMDA+5YWN6LS55Yi35pawPC9vdXRsaW5lPlwiKSlcbiAgICAgICAgICAgICAgICB0aGlzLmJ0blRyZWFzdXJlW2ldLnByaWNlLnN0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICB0aGlzLmJ0blRyZWFzdXJlW2ldLnByaWNlLm5vZGUuc2V0UG9zaXRpb24oMCwwKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCI8b3V0bGluZT0yLGNvbG9yPSM2NTFEMDA+5o6i5a6dJWTmrKE8L291dGxpbmU+XFxuPGltZyBzcmM9JyVzJy8+PGNvbG9yPSNmZmZiOTQgZm9udHNpemU9MjA+PG91dGxpbmU9Mixjb2xvcj0jNjUxRDAwPiAlZDwvb3V0bGluZT48L2NvbG9yPlwiKSwgQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2NvbnN0LnRyZWFzdXJlX251bS52YWxbaW5kZXgtMV1baS0xXSwgaXRlbV9jb25maWcuaWNvbiwgYnV5X3Jld2FyZF9kYXRhW2ktMV0uZXhwZW5kX2l0ZW1bMF1bMV0pXG4gICAgICAgICAgICAgICAgdGhpcy5idG5UcmVhc3VyZVtpXS5wcmljZS5zdHJpbmcgPSBzdHI7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uIChpdGVtLHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZFNwcml0ZUZyYW1lKHJlc09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzLHRoaXMuYnRuVHJlYXN1cmVbaV0ucHJpY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVdGlscy5kZWxheVJ1bih0aGlzLmx1Y2t5QmFyLCAxMC8zMCwgZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAvLyAgICAgdGhpcy5pbml0Um91bmRJdGVtKGluZGV4KTtcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMsaW5kZXgpKVxuICAgICAgICBcbiAgICAgICAgdGhpcy5pbml0Um91bmRJdGVtKGluZGV4KTtcbiAgICB9LFxuXG4gICAgaW5pdFJvdW5kSXRlbTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIHZhciBiYXJCRyA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8yXzBcIik7XG4gICAgICAgIHZhciBsdWNrbHlfbnVtX2RhdGEgPSB0aGlzLm1vZGVsLmdldEx1Y2tseVJld2FyZERhdGEoaW5kZXgpO1xuICAgICAgICB2YXIgYmFyX2ludGVydmFsID0gYmFyQkcuZ2V0Q29udGVudFNpemUoKS53aWR0aCAvIDU7XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTU7aSsrKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmx1Y2tseV9pdGVtW2ldKXtcbiAgICAgICAgICAgICAgICB2YXIgUm91bmRJdGVtID0gcmVxdWlyZShcInJvdW5kX2l0ZW1fcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtpXSA9IG5ldyBSb3VuZEl0ZW0odHJ1ZSwwLjU1LDAuNyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtpXS5zZXRQYXJlbnQodGhpcy5sdWNreUJhcilcbiAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW2ldLnNob3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW2ldLnNldFBvc2l0aW9uKGJhcl9pbnRlcnZhbCppLDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighdGhpcy5hcnJpdmVMdWNrbHlfbGFiZWxbaV0gJiYgdGhpcy5sdWNrbHlfaXRlbVtpXSl7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnJpdmVMdWNrbHlfbGFiZWxbaV0gPSBVdGlscy5jcmVhdGVMYWJlbCgyOCxuZXcgY2MuQ29sb3IoMHhmZiwweGZmLDB4ZmYsMHhmZiksbnVsbCxiYXJfaW50ZXJ2YWwqaSwtNDAsXCJcIix0aGlzLmx1Y2t5QmFyLG51bGwsIGNjLnYyKDAuNSwwLjUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFycml2ZUx1Y2tseV9sYWJlbFtpXS5ub2RlLnNjYWxlID0gMC41NTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodGhpcy5hcnJpdmVMdWNrbHlfbGFiZWxbaV0pe1xuICAgICAgICAgICAgICAgIHRoaXMuYXJyaXZlTHVja2x5X2xhYmVsW2ldLnN0cmluZyA9IGx1Y2tseV9udW1fZGF0YVtpLTFdLmx1Y2t5X3ZhbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodGhpcy5sdWNrbHlfaXRlbVtpXSl7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtpXS5zZXRCYXNlRGF0YSh7YmlkOmx1Y2tseV9udW1fZGF0YVtpLTFdLmF3YXJkWzBdWzBdLCBudW06bHVja2x5X251bV9kYXRhW2ktMV0uYXdhcmRbMF1bMV19KTtcbiAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW2ldLnNldFZpc2libGVSZWRQb2ludChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtpXS5zZXRWaXNpYmxlUm91bmRCRyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihpKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQxNjY0MChpbmRleCwgbHVja2x5X251bV9kYXRhW2ktMV0uaWQpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLGkpO1xuICAgICAgICAgICAgICAgIHRoaXMubHVja2x5X2l0ZW1baV0uYWRkQ2FsbEJhY2soZnVuYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIC8vIOWIhuauteiuoeeul+i/m+W6puadoVxuICAgIHNlY3Rpb25DYWxjdWxhdGlvbjpmdW5jdGlvbihudW0sbHVja2x5X2xpc3Qpe1xuICAgICAgICBudW0gPSBudW0gfHwgMTA7XG4gICAgICAgIHZhciBzZWdtZWVudCA9IDIwO1xuICAgICAgICB2YXIgcGVyY2VudCA9IDA7XG5cbiAgICAgICAgaWYobHVja2x5X2xpc3RbMF0gJiYgbHVja2x5X2xpc3RbMV0gJiYgbHVja2x5X2xpc3RbMl0gJiYgbHVja2x5X2xpc3RbM10gJiYgbHVja2x5X2xpc3RbNF0pe1xuICAgICAgICAgICAgaWYobnVtIDw9IGx1Y2tseV9saXN0WzBdLmx1Y2t5X3ZhbCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSAvIGx1Y2tseV9saXN0WzBdLmx1Y2t5X3ZhbCAqIHNlZ21lZW50LzEwMDtcbiAgICAgICAgICAgIH1lbHNlIGlmKG51bSA+IGx1Y2tseV9saXN0WzBdLmx1Y2t5X3ZhbCAmJiBudW0gPD0gbHVja2x5X2xpc3RbMV0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICBwZXJjZW50ID0gMTtcbiAgICAgICAgICAgIH1lbHNlIGlmKG51bSA+IGx1Y2tseV9saXN0WzFdLmx1Y2t5X3ZhbCAmJiBudW0gPD0gbHVja2x5X2xpc3RbMl0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICBwZXJjZW50ID0gMjtcbiAgICAgICAgICAgIH1lbHNlIGlmKG51bSA+IGx1Y2tseV9saXN0WzJdLmx1Y2t5X3ZhbCAmJiBudW0gPD0gbHVja2x5X2xpc3RbM10ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICBwZXJjZW50ID0gMztcbiAgICAgICAgICAgIH1lbHNlIGlmKG51bSA+IGx1Y2tseV9saXN0WzNdLmx1Y2t5X3ZhbCAmJiBudW0gPD0gbHVja2x5X2xpc3RbNF0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICBwZXJjZW50ID0gNDtcbiAgICAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkdiA9IGx1Y2tseV9saXN0W3BlcmNlbnRdLmx1Y2t5X3ZhbCAtIGx1Y2tseV9saXN0W3BlcmNlbnQtMV0ubHVja3lfdmFsO1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gbnVtIC0gbHVja2x5X2xpc3RbcGVyY2VudC0xXS5sdWNreV92YWw7XG4gICAgICAgICAgICB2YXIgcGVyY2VudF9udW0gPSBzZWdtZWVudCpwZXJjZW50ICsgKCBjb3VudCAvIGFkdiApICogc2VnbWVlbnQ7XG4gICAgICAgICAgICByZXR1cm4gcGVyY2VudF9udW0vMTAwO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGRhdGE65a+75a6d5pWw5o2uKOacjeWKoeerr+i/lOWbnueahClcbiAgICBjb21tb25TaG93RGF0YTpmdW5jdGlvbihkYXRhLCBsdWNrbHlfbGlzdCl7XG4gICAgICAgIGlmKCFVdGlscy5uZXh0KGRhdGEpIHx8ICFVdGlscy5uZXh0KGx1Y2tseV9saXN0KSlyZXR1cm47XG4gICAgICAgIHZhciBsdWNreV9udW0gPSAwO1xuICAgICAgICBpZihsdWNrbHlfbGlzdFs0XSl7XG4gICAgICAgICAgICBsdWNreV9udW0gPSBsdWNrbHlfbGlzdFs0XS5sdWNreV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0X2x1Y2t5X251bS5zdHJpbmcgPSBkYXRhLmx1Y2t5K1wiL1wiK2x1Y2t5X251bTtcbiAgICAgICAgdmFyIG11bCA9IHRoaXMuc2VjdGlvbkNhbGN1bGF0aW9uKGRhdGEubHVja3ksIGx1Y2tseV9saXN0KTtcbiAgICAgICAgdGhpcy5sdWNreUJhci5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpLnByb2dyZXNzID0gbXVsO1xuXG4gICAgICAgIHZhciByZWZyZXNoID0gZGF0YS5lbmRfdGltZSAtIGdjb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKTtcbiAgICAgICAgaWYocmVmcmVzaCA+IDApe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRDb3VudERvd25UaW1lKHRoaXMucmVmcmVzaF90aW1lLHJlZnJlc2gpO1xuICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhDb25maWcuZGlhbF9kYXRhLmRhdGFfY29uc3QucmVmcmVhc2gudmFsWzBdWzBdKTtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKGl0ZW1fY29uZmlnLmljb24pO1xuICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxpbWcgc3JjPSclcycvPjxvdXRsaW5lPTIsY29sb3I9IzY1MUQwMD4gJWTliLfmlrA8L291dGxpbmU+XCIpLGl0ZW1fY29uZmlnLmljb24sQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2NvbnN0LnJlZnJlYXNoLnZhbFswXVsxXSlcbiAgICAgICAgICAgIHRoaXMuYnRuVHJlYXN1cmVbM10ucHJpY2Uuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgdGhpcy50b3VjaEVmZmVjdFtkYXRhLnR5cGVdID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24gKHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnRuVHJlYXN1cmVbM10ucHJpY2UuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCI8b3V0bGluZT0yLGNvbG9yPSM2NTFEMDA+5YWN6LS55Yi35pawPC9vdXRsaW5lPlwiKSk7XG4gICAgICAgICAgICB0aGlzLmJ0blRyZWFzdXJlWzNdLnByaWNlLnN0cmluZyA9IHN0cjtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF90aW1lLm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF90aW1lLnN0cmluZyA9IFwiMDA6MDA6MDBcIjtcbiAgICAgICAgICAgIHRoaXMudG91Y2hFZmZlY3RbZGF0YS50eXBlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXR1cyA9IGZhbHNlO1xuICAgICAgICBmb3IodmFyIGkgaW4gbHVja2x5X2xpc3Qpe1xuICAgICAgICAgICAgdmFyIF9ib29sID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvcih2YXIgayBpbiBkYXRhLmx1Y2t5X2F3YXJkKXtcbiAgICAgICAgICAgICAgICBpZihsdWNrbHlfbGlzdFtpXS5pZCA9PSBkYXRhLmx1Y2t5X2F3YXJkW2tdLmx1Y2t5KXtcbiAgICAgICAgICAgICAgICAgICAgX2Jvb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoZGF0YS5sdWNreSA8IGx1Y2tseV9saXN0W2ldLmx1Y2t5X3ZhbCl7XG4gICAgICAgICAgICAgICAgX2Jvb2wgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodGhpcy5sdWNrbHlfaXRlbVtwYXJzZUludChpKSsxXSl7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtwYXJzZUludChpKSsxXS5zZXRJdGVtVW5FbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW3BhcnNlSW50KGkpKzFdLnNldERlZmF1bHRUaXAoIV9ib29sKTtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMgfHwgX2Jvb2w7XG4gICAgICAgICAgICAgICAgdGhpcy5sdWNrbHlfaXRlbVtwYXJzZUludChpKSsxXS5zZXRWaXNpYmxlUmVkUG9pbnQoX2Jvb2wpO1xuXG4gICAgICAgICAgICAgICAgaWYoX2Jvb2wgPT0gZmFsc2UgJiYgZGF0YS5sdWNreSA+PSBsdWNrbHlfbGlzdFtpXS5sdWNreV92YWwpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW3BhcnNlSW50KGkpKzFdLnNldEl0ZW1VbkVuYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRMdWNrbHlUYWJSZWRQb2ludChkYXRhLnR5cGUsc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zaG93UmVkcG9pbnQoKTtcbiAgICB9LFxuICAgIFxuICAgIHNob3dSZWRwb2ludDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgdG90bGVfc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTI7aSsrKXtcbiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLm1vZGVsLmdldEx1Y2tseVRhYlJlZFBvaW50KGkpO1xuICAgICAgICAgICAgdGhpcy50YWJfbGlzdFtpXS5yZWRwb2ludC5hY3RpdmUgPSBzdGF0dXM7XG4gICAgICAgICAgICB0b3RsZV9zdGF0dXMgPSB0b3RsZV9zdGF0dXMgfHwgc3RhdHVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5sdWNreV90cmVhc3VyZSx0b3RsZV9zdGF0dXMpXG4gICAgfSxcblxuICAgIHNob3dUcmVhc3VyZUxvZzpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgaWYoIWRhdGEgfHwgVXRpbHMubmV4dChkYXRhKSA9PW51bGwpcmV0dXJuO1xuICAgICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgICAgdmFyIG51bSA9IGRhdGEubG9nX2xpc3QubGVuZ3RoO1xuICAgICAgICBpZihudW0gPj0gMTApe1xuICAgICAgICAgICAgbnVtID0gMTA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5nZXRSZXdhcmRMaXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuZ2V0UmV3YXJkTGlzdFtpXSl7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXdhcmRMaXN0W2ldLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZW50LnNldENvbnRlbnRTaXplKGNjLnNpemUodGhpcy50ZXh0X3Njcm9sbC5nZXRDb250ZW50U2l6ZSgpLndpZHRoLCAyNipudW0pKTtcbiAgICAgICAgZm9yKHZhciBpPTA7aTxudW07aSsrKXtcbiAgICAgICAgICAgIGlmKGRhdGEubG9nX2xpc3RbaV0pe1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmV3YXJkTGlzdFtpXSA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMiwgbmV3IGNjLkNvbG9yKDB4ZmYsMHhmZiwweGY4LDB4ZmYpLCBjYy52MigwLjUsIDEpLCBjYy52Mih0aGlzLmNvbnRlbnQuZ2V0Q29udGVudFNpemUoKS53aWR0aC8yLDApLG51bGwsNjAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuYWRkQ2hpbGQodGhpcy5nZXRSZXdhcmRMaXN0W2ldLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5nZXRSZXdhcmRMaXN0W2ldKXtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJld2FyZExpc3RbaV0ubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmV3YXJkTGlzdFtpXS5ub2RlLnkgPSAtIDI2Kmk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhkYXRhLmxvZ19saXN0W2ldLmJpZCk7XG4gICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiIDxjb2xvcj0jNGNkODQ5PiVzPC9jb2xvcj4g6I635b6XIDxjb2xvcj0jZmZhNzJhPiVzPC9jb2xvcj5cIiksZGF0YS5sb2dfbGlzdFtpXS5yb2xlX25hbWUsIGl0ZW1fY29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmV3YXJkTGlzdFtpXS5zdHJpbmcgPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hhbmdlVGFiVmlldzpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIGluZGV4ID0gaW5kZXggfHwgMTtcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gaW5kZXgpcmV0dXJuO1xuICAgICAgICBpZih0aGlzLmN1cl90YWIhPW51bGwpe1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLmxhYmVsLm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhmZiwweGMzLDB4OGQsIDB4ZmYpO1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLm5vcm1hbC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLnNlbGVjdC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cl9pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmN1cl90YWIgPSB0aGlzLnRhYl9saXN0W3RoaXMuY3VyX2luZGV4XTtcblxuICAgICAgICBpZih0aGlzLmN1cl90YWIhPW51bGwpe1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLmxhYmVsLm5vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhmZSwweGZmLDB4Y2QsIDB4ZmYpO1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLm5vcm1hbC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VyX3RhYi5zZWxlY3QuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG91Y2hFbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGx1Y2tseV9saXN0ID0gdGhpcy5tb2RlbC5nZXRMdWNrbHlSZXdhcmREYXRhKGluZGV4KTtcbiAgICAgICAgdmFyIGluaXREYXRhID0gdGhpcy5tb2RlbC5nZXRUcmVhc3VyZUluaXREYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5jb21tb25TaG93RGF0YShpbml0RGF0YSwgbHVja2x5X2xpc3QpO1xuXG4gICAgICAgIHRoaXMuaXRlbVJld2FyZFBvcyhpbml0RGF0YS5yYW5kX2xpc3RzKTtcbiAgICAgICAgVXRpbHMuZGVsYXlSdW4odGhpcy5jb250ZW50LCAyMC9jYy5nYW1lLmdldEZyYW1lUmF0ZSgpLCBmdW5jdGlvbihpbml0RGF0YSl7XG4gICAgICAgICAgICB0aGlzLnNob3dUcmVhc3VyZUxvZyhpbml0RGF0YSk7XG4gICAgICAgIH0uYmluZCh0aGlzLGluaXREYXRhKSlcbiAgICAgICAgXG4gICAgfSxcblxuICAgIC8vIOabtOaUueaOouWuneWKtVxuICAgIGNoYW5nZVRyZWFzdXJlTnVtYmVyOmZ1bmN0aW9uKGxpc3Qpe1xuICAgICAgICBmb3IodmFyIGkgaW4gbGlzdCl7XG4gICAgICAgICAgICBpZihsaXN0W2ldLmJhc2VfaWQgPT0gMzcwMDEpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzVHJlYXN1cmVfbnVtWzFdID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCgzNzAwMSk7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoMzcwMDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxpbWcgc3JjPSclcycvPiAgJWRcIiksaXRlbV9jb25maWcuaWNvbix0aGlzLmhhc1RyZWFzdXJlX251bVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfdG90YWwuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24gKHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVhc3VyZV90b3RhbC5hZGRTcHJpdGVGcmFtZShyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihsaXN0W2ldLmJhc2VfaWQgPT0gMzcwMDIpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzVHJlYXN1cmVfbnVtWzJdID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCgzNzAwMik7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMil7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoMzcwMDIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxpbWcgc3JjPSclcycvPiAgJWRcIiksaXRlbV9jb25maWcuaWNvbix0aGlzLmhhc1RyZWFzdXJlX251bVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlYXN1cmVfdG90YWwuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24gKHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVhc3VyZV90b3RhbC5hZGRTcHJpdGVGcmFtZShyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcnVuSGFuZGxlcjpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLnN0ZXAgPT0gMCl7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSB0aGlzLnByb2Nlc3MgKyAwLjMzO1xuICAgICAgICAgICAgaWYodGhpcy5wcm9jZXNzID49IDMpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IDAuNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYodGhpcy5zdGVwID09IDEpe1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzID0gdGhpcy5wcm9jZXNzK3RoaXMuc3BlZWQ7XG4gICAgICAgICAgICBpZih0aGlzLnByb2Nlc3MgPiBST1VORF9DT1VOVCp0aGlzLnJvdW5kICYmIHRoaXMudGFyZ2V0UG9zID4gLTEpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMudGFyZ2V0UG9zID4gMyl7XG4gICAgICAgICAgICAgICAgICAgIGlmKCh0aGlzLnByb2Nlc3MgJSBST1VORF9DT1VOVCkgPiBzbG93X3N0YXJ0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAwLjA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwID0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnRhcmdldFBvcyA8PSBzbG93X3N0YXJ0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0aGlzLnByb2Nlc3MgJSAoUk9VTkRfQ09VTlQqdGhpcy5yb3VuZCkpID49ICh0aGlzLnRhcmdldFBvcy1zbG93X3N0YXJ0K1JPVU5EX0NPVU5UKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCA9IDAuMDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYodGhpcy5zdGVwID09IDIpe1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzID0gdGhpcy5wcm9jZXNzK3RoaXMuc3BlZWQ7XG4gICAgICAgICAgICBpZigodGhpcy5wcm9jZXNzICUgUk9VTkRfQ09VTlQgPj0gdGhpcy50YXJnZXRQb3MpICYmIE1hdGguZmxvb3IodGhpcy5wcm9jZXNzIC8gUk9VTkRfQ09VTlQpID49IDUpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMubG90dGVyeV90aWNrZXQhPW51bGwpe1xuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5sb3R0ZXJ5X3RpY2tldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG90dGVyeV90aWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BSdW5IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwID0gTWF0aC5mbG9vcih0aGlzLnByb2Nlc3MpO1xuICAgICAgICB0aGlzLnNldFBvcyhwKTtcbiAgICB9LFxuXG4gICAgc2V0UG9zOmZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIGlmKHBvcyA8PSAwKXtcbiAgICAgICAgICAgIHBvcyAgPSBwb3MgKyBST1VORF9DT1VOVDtcbiAgICAgICAgfWVsc2UgaWYocG9zID49IFJPVU5EX0NPVU5UKXtcbiAgICAgICAgICAgIHBvcyA9IHBvcyAlIFJPVU5EX0NPVU5UO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVuX2xpZ2h0Lm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ydW5fbGlnaHQubm9kZS5zZXRQb3NpdGlvbihyZXdhcmRfcG9zW2NoYW5nZV9wb3NbcG9zXV1bMF0scmV3YXJkX3Bvc1tjaGFuZ2VfcG9zW3Bvc11dWzFdKTtcbiAgICB9LFxuXG4gICAgLy8g6LeR54Gv57uT5p2fXG4gICAgc3RvcFJ1bkhhbmRsZXI6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy50b3VjaEVuYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZih0aGlzLnJ1bl9saWdodF9zaG93X3Jld2FyZCA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMucnVuX2xpZ2h0X3Nob3dfcmV3YXJkID0gZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5ydW5fbGlnaHQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bkxpZ2h0UmV3YXJkKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Jld2FyZExpc3QgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bkxpZ2h0VW5pZm9ybVNwZWVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSwgMTAwMCwtMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5oq95aWW5aWW5YqxXG4gICAgcnVuTGlnaHRSZXdhcmQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5zaG93UmV3YXJkTGlzdCl7XG4gICAgICAgICAgICB2YXIgYXdhcmQgPSBbXTtcbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLnNob3dSZXdhcmRMaXN0LmF3YXJkczEpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd1Jld2FyZExpc3QuYXdhcmRzMVtpXSl7XG4gICAgICAgICAgICAgICAgICAgIGF3YXJkLnB1c2godGhpcy5zaG93UmV3YXJkTGlzdC5hd2FyZHMxW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLnNob3dSZXdhcmRMaXN0LmF3YXJkczIpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd1Jld2FyZExpc3QuYXdhcmRzMltpXSl7XG4gICAgICAgICAgICAgICAgICAgIGF3YXJkLnB1c2godGhpcy5zaG93UmV3YXJkTGlzdC5hd2FyZHMyW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDnsbvlnovvvIwg5qyh5pWw57G75Z6LXG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlblRyZWFzdXJlR2V0SXRlbVdpbmRvdyh0cnVlLCBhd2FyZCwgdGhpcy5jdXJfaW5kZXgsIHRoaXMudG91Y2hUcmVhc3VyZV90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLm1vZGVsLmdldFRyZWFzdXJlSW5pdERhdGEodGhpcy5jdXJfaW5kZXgpO1xuICAgICAgICBpZihpbml0RGF0YSl7XG4gICAgICAgICAgICB0aGlzLml0ZW1SZXdhcmRQb3MoaW5pdERhdGEucmFuZF9saXN0cyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcnVuTGlnaHRVbmlmb3JtU3BlZWRIaWRlOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucnVuX2xpZ2h0Lm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMub3Blbl92aWV3X3RpY2tldCAhPSBudWxsKXtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLm9wZW5fdmlld190aWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5vcGVuX3ZpZXdfdGlja2V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnJ1bl9saWdodF9zaG93X3Jld2FyZCAhPW51bGwpe1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMucnVuX2xpZ2h0X3Nob3dfcmV3YXJkKTtcbiAgICAgICAgICAgIHRoaXMucnVuX2xpZ2h0X3Nob3dfcmV3YXJkID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmsqHmnInot5Hnga/nmoTml7blgJnljIDpgJ/ot5FcbiAgICBydW5MaWdodFVuaWZvcm1TcGVlZDpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLm9wZW5fdmlld190aWNrZXQgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLm9wZW5fdmlld190aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnJ1bl9saWdodCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuX2xpZ2h0Lm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNfY291bnQgPSB0aGlzLnN0YXR1c19jb3VudCAlIFJPVU5EX0NPVU5UO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bl9saWdodC5ub2RlLnNldFBvc2l0aW9uKHJld2FyZF9wb3NbY2hhbmdlX3Bvc1t0aGlzLnN0YXR1c19jb3VudF1dWzBdLHJld2FyZF9wb3NbY2hhbmdlX3Bvc1t0aGlzLnN0YXR1c19jb3VudF1dWzFdKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c19jb3VudCA9IHRoaXMuc3RhdHVzX2NvdW50ICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpLCA1MDAsLTEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEFjdGlvbkZ1bmM6ZnVuY3Rpb24obm9kZSl7XG4gICAgICAgIGlmKCFub2RlKXJldHVybjtcbiAgICAgICAgdmFyIGZhZGVvdXQgPSBjYy5mYWRlT3V0KDAuMDcpO1xuICAgICAgICBub2RlLnJ1bkFjdGlvbihmYWRlb3V0KTtcbiAgICB9LFxuXG4gICAgc3RhcnRSZWZyZXNoQWN0aW9uOmZ1bmN0aW9uKCl7XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTg7aSsrKXtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV9saXN0W2ldICYmIHRoaXMuaXRlbV9saXN0W2ldLnJvb3Rfd25kKXtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtpXS5yb290X3duZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aW9uTm9kZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgIHRoaXMuaXRlbV9wYW5lbC5hZGRDaGlsZChhY3Rpb25Ob2RlKTtcbiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kMTY2NDIodGhpcy5jdXJfaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFZmZlY3QoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICBhY3Rpb25Ob2RlLnJ1bkFjdGlvbihjYy5zZXF1ZW5jZShjYy5jYWxsRnVuYyhmdW5jKSxjYy5yZW1vdmVTZWxmKHRydWUpKSk7XG4gICAgfSxcblxuICAgIC8vIOeJueaViFxuICAgIGhhbmRsZUVmZmVjdDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgZnVuYyA9ICBmdW5jdGlvbiAoKXtcbiAgICAgICAgICAgIHRoaXMudG91Y2hSZWZyZXNoID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLm1vZGVsLmdldFRyZWFzdXJlSW5pdERhdGEodGhpcy5jdXJfaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5pdGVtUmV3YXJkUG9zKGluaXREYXRhLnJhbmRfbGlzdHMpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIFxuICAgICAgICBVdGlscy5wbGF5RWZmZWN0T25jZShQYXRoVG9vbC5nZXRFZmZlY3RSZXMoNjE0KSwwLDAsdGhpcy5pdGVtX3BhbmVsLGZ1bmMsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgMSk7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgdGhpcy5qdW1wX2luZGV4ID0gaW5kZXggfHwgMTtcbiAgICAgICAgdGhpcy5jaGFuZ2VUYWJ2YXJEYXRhKHRoaXMuanVtcF9pbmRleCk7XG4gICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0THVja3koKTtcbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5yZWZyZXNoX3RpbWUubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICBpZih0aGlzLmxvdHRlcnlfdGlja2V0IT1udWxsKXtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmxvdHRlcnlfdGlja2V0KTtcbiAgICAgICAgICAgIHRoaXMubG90dGVyeV90aWNrZXQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pdGVtX2xpc3QgJiYgVXRpbHMubmV4dCh0aGlzLml0ZW1fbGlzdCB8fCB7fSkgIT0gbnVsbCl7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5pdGVtX2xpc3Qpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuaXRlbV9saXN0W2ldICYmIHRoaXMuaXRlbV9saXN0W2ldLmRlbGV0ZU1lKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RbaV0uZGVsZXRlTWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmx1Y2tseV9pdGVtICYmIFV0aWxzLm5leHQodGhpcy5sdWNrbHlfaXRlbSB8fCB7fSkgIT1udWxsKXtcbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmx1Y2tseV9pdGVtKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmx1Y2tseV9pdGVtW2ldICYmIHRoaXMubHVja2x5X2l0ZW1baV0uZGVsZXRlTWUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmx1Y2tseV9pdGVtW2ldLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ydW5MaWdodFJld2FyZCgpO1xuICAgICAgICB0aGlzLnByb2JhYmxpdHkuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5ydW5MaWdodFVuaWZvcm1TcGVlZEhpZGUoKTtcbiAgICAgICAgdmFyIE1hbGxDb250cm9sbGVyID0gcmVxdWlyZShcIm1hbGxfY29udHJvbGxlclwiKVxuICAgICAgICBpZihNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1hbGxWaWV3KCkpe1xuICAgICAgICAgICAgTWFsbENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNYWxsVmlldygpLnNldFZpc2libGUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwub3Blbkx1Y2t5VHJlYXN1cmVXaW4oZmFsc2UpO1xuXG4gICAgfSxcbn0pIl19
|