(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/action/action_model.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, '3f27dqUQapJ4LUEFzPeFEif', 'action_model'); // Scripts/mod/action/action_model.js "use strict"; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2019-03-02 16:49:03 // -------------------------------------------------------------------- var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); var ActionEvent = require("action_event"); var ActionConst = require("action_const"); var ActionModel = cc.Class({ "extends": BaseClass, ctor: function ctor() {}, properties: {}, initConfig: function initConfig() { // -- 基金红点数据 this.fund_red_list = {}; }, //------------------@ 基金活动相关 // -- 开启中的基金活动id setOpenFundIds: function setOpenFundIds(id_list) { this.fund_id_list = id_list || []; this.checkFundRedStatus(); }, getOpenFundIds: function getOpenFundIds() { return this.fund_id_list || []; }, // -- 设置基金的数据 setFundSrvData: function setFundSrvData(data) { this.fund_datas = this.fund_datas || {}; if (data && data.id) { this.fund_datas[data.id] = data; this.updateFundStatus(data.id, data.status); } }, // -- 获取基金数据 getFundSrvDataById: function getFundSrvDataById(id) { this.fund_datas = this.fund_datas || {}; return this.fund_datas[id] || {}; }, updateFundStatus: function updateFundStatus(id, status) { this.fund_id_list = this.fund_id_list || []; for (var k = 0; k < this.fund_id_list.length; ++k) { var v = this.fund_id_list[k]; if (v.id == id) { v.status = status; break; } } this.checkFundRedStatus(); }, //检查超值基金红点 checkFundRedStatus: function checkFundRedStatus() { this.fund_id_list = this.fund_id_list || []; for (var k = 0; k < this.fund_id_list.length; ++k) { var v = this.fund_id_list[k]; if (v.id == ActionConst.FundType.type_one) { this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_one, v.status == 1); this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_one, v.status == 0); } else if (v.id == ActionConst.FundType.type_two) { this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_two, v.status == 1); this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_two, v.status == 0); } } }, // -- 更新基金红点数据 updateFundRedStatus: function updateFundRedStatus(bid, status) { var _status = this.fund_red_list[bid]; if (_status == status) return; // -- 购买的红点只有登陆时才显示,点击之后消失,之后不再显示 if ((bid == ActionConst.FundRedIndex.fund_buy_one || bid == ActionConst.FundRedIndex.fund_buy_two) && _status == false) { return; } this.fund_red_list[bid] = status; var red_status = false; for (var k in this.fund_red_list) { var v = this.fund_red_list[k]; if (v == true) { red_status = true; break; } } MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.fund, red_status); gcore.GlobalEvent.fire(ActionEvent.UPDATA_FUND_RED_STATUS_EVENT); }, updateSevenLoginData: function updateSevenLoginData(data) { this.seven_login_data = data; }, getSevenLoginData: function getSevenLoginData() { return this.seven_login_data; }, // --desc:获取当前可领取7天登录的最大天数 getMaxSevenDay: function getMaxSevenDay() { if (this.seven_login_data == null || this.seven_login_data.status_list == null) return; var status_list = this.seven_login_data.status_list; status_list.sort(function (a, b) { return a.day - b.day; }); var day = null; for (var i in status_list) { if (status_list[i].status == 2) { day = status_list[i]; break; } } if (day == null) { day = status_list[status_list.length]; } return day; }, setFirstBtnStatus: function setFirstBtnStatus(data) { this.firstBtnStatus = {}; for (var i = 0; i < data.length; ++i) { var v = data[i]; this.firstBtnStatus[v.id] = v.status; } }, getFirstBtnStatus: function getFirstBtnStatus(index) { if (!this.firstBtnStatus) return; return this.firstBtnStatus[index] || 0; }, // 获取七日目标的周期数 setSevenGoldPeriod: function setSevenGoldPeriod(period) { this.sevenPeriod = period; }, getSevenGoldPeriod: function getSevenGoldPeriod() { return this.sevenPeriod; }, // 七天目标检查红点 --当前天数以下的 checkRedPoint: function checkRedPoint(day) { if (day < 1 || day > 7) return; day = day || 1; // 福利 this.welfareRetPoint = []; for (var i = 1; i <= day; i++) { var welfare = this.getSevenGoalWelfareList(i); this.welfareRetPoint[i] = false; for (var k in welfare) { if (welfare[k].status == 1) { this.welfareRetPoint[i] = true; break; } } } // 每日目标 this.growRetPoint = []; for (var i = 1; i <= day; i++) { var grow = this.getServerGrowListData(i - 1); this.growRetPoint[i] = false; for (var k in grow) { if (grow[k].status == 1) { this.growRetPoint[i] = true; break; } } } // 超值礼包 this.giftRetPoint = []; for (var i = 1; i <= day; i++) { var grow = this.getServerGiftListData(i - 1); this.giftRetPoint[i] = false; for (var k in grow) { if (grow[k].status == 1) { this.giftRetPoint[i] = true; break; } } } this.halfRedPoint = []; // 0、还有领取 1、已领取 for (var i = 1; i <= day; i++) { var half = this.getHalfGiftList(i); this.halfRedPoint[i] = false; for (var k in half) { if (k == 0 && half[k].status == 0) { this.halfRedPoint[i] = true; break; } } } // 宝箱 this.boxRedPoint = []; var box = this.getSevenGoalBoxList(); for (var i in box) { this.boxRedPoint[i] = false; if (box[i].status == 1) { this.boxRedPoint[i] = true; } } var redStatus = false; var redStatus1 = false; var redStatus2 = false; var redStatus3 = false; var redStatus4 = false; var redStatus5 = false; for (var i in this.welfareRetPoint) { if (this.welfareRetPoint[i] == true) { redStatus1 = true; break; } } for (var i in this.growRetPoint) { if (this.growRetPoint[i] == true) { redStatus2 = true; break; } } for (var i in this.giftRetPoint) { if (this.giftRetPoint[i] == true) { redStatus3 = true; break; } } for (var i in this.halfRedPoint) { if (this.halfRedPoint[i] == true) { redStatus5 = true; break; } } for (var i in this.boxRedPoint) { if (this.boxRedPoint[i] == true) { redStatus4 = true; break; } } redStatus = redStatus1 || redStatus2 || redStatus3 || redStatus4 || redStatus5; var icon_id = MainuiConst.icon.seven_goal; if (this.getSevenGoldPeriod() == 1) { icon_id = MainuiConst.icon.seven_goal; } else if (this.getSevenGoldPeriod() == 2) { icon_id = MainuiConst.icon.seven_goal1; } else if (this.getSevenGoldPeriod() == 3) { icon_id = MainuiConst.icon.seven_goal2; } else { icon_id = MainuiConst.icon.seven_goal3; } MainuiController.getInstance().setFunctionTipsStatus(icon_id, redStatus); }, // 红点状态 getRedPointWelfareStatus: function getRedPointWelfareStatus(day) { if (!this.welfareRetPoint) return; var status = false; status = this.welfareRetPoint[day]; return status; }, // 更新 updataRedPointWelfareStatus: function updataRedPointWelfareStatus(day, status) { if (!this.welfareRetPoint) return; this.welfareRetPoint[day] = status; }, getRedPointGrowStatus: function getRedPointGrowStatus(day) { if (!this.growRetPoint) return; var status = false; status = this.growRetPoint[day]; return status; }, // 更新 updataRedPointGrowStatus: function updataRedPointGrowStatus(day, status) { if (!this.growRetPoint) return; this.growRetPoint[day] = status; }, getRedPointGiftStatus: function getRedPointGiftStatus(day) { if (!this.giftRetPoint) return; var status = false; status = this.giftRetPoint[day]; return status; }, // 更新 updataRedPointGiftStatus: function updataRedPointGiftStatus(day, status) { if (!this.giftRetPoint) return; this.giftRetPoint[day] = status; }, // 福利礼包 getRedPointHalfStatus: function getRedPointHalfStatus(day) { if (!this.halfRedPoint) return; var status = false; status = this.halfRedPoint[day]; return status; }, // 更新 updataRedPointHalfStatus: function updataRedPointHalfStatus(day, status) { if (!this.halfRedPoint) return; this.halfRedPoint[day] = status; }, getRedPointBoxStatus: function getRedPointBoxStatus(index) { if (!this.boxRedPoint) return; var status = false; status = this.boxRedPoint[index]; return status; }, // 更新 updataRedPointBoxStatus: function updataRedPointBoxStatus(index, status) { if (!this.boxRedPoint) return; this.boxRedPoint[index] = status; }, // 七天目标*********** start ***** initSevenWalfare: function initSevenWalfare(index) { this.setWalfareData(index); this.setWalfareGrowUpData(index); this.setHalfGiftData(index); this.setBoxRewardData(index); }, // 宝箱 setBoxRewardData: function setBoxRewardData(index) { var data = Config.day_goals_data.data_all_target[index]; this.boxRewardData = []; for (var i in data) { this.boxRewardData.push(data[i][0]); } this.boxRewardData.sort(function (a, b) { return a.id - b.id; }); }, getBoxRewardData: function getBoxRewardData() { return this.boxRewardData || []; }, // 福利 setWalfareData: function setWalfareData(index) { var data = Config.day_goals_data.data_welfarecollection[index]; this.welfareData = Utils.deepCopy(data); }, // 成长目标 setWalfareGrowUpData: function setWalfareGrowUpData(index) { var data = Config.day_goals_data.data_growthtarget[index]; this.welfareGrowData = []; this.welfareGiftData = []; for (var i in data) { var tab = []; var tab1 = []; for (var k in data[i]) { if (data[i][k].target_type == 1) { tab.push(data[i][k]); } else if (data[i][k].target_type == 2) { tab1.push(data[i][k]); } } this.welfareGrowData.push(tab); this.welfareGiftData.push(tab1); } }, // 福利礼包 setHalfGiftData: function setHalfGiftData(index) { var data = Config.day_goals_data.data_halfdiscount[index]; this.walfareHalfData = []; for (var i = 1; i <= 7; i++) { this.walfareHalfData[i] = []; } for (var i in data) { this.walfareHalfData[data[i][0].day].push(data[i][0]); } for (var i = 1; i <= 7; i++) { this.walfareHalfData[i].sort(function (a, b) { return a.id - b.id; }); } }, getWalfareData: function getWalfareData(day) { if (!this.welfareData) return; return this.welfareData[day] || []; }, getWalfareGrowUpData: function getWalfareGrowUpData(day) { if (!this.welfareGrowData) return; return this.welfareGrowData[day] || []; }, getWelfareGiftData: function getWelfareGiftData(day) { if (!this.welfareGiftData) return; return this.welfareGiftData[day] || []; }, getWelfareHalfData: function getWelfareHalfData(day) { if (this.walfareHalfData && this.walfareHalfData[day]) { return this.walfareHalfData[day] || []; } }, // *********** 协议相关********* // 七天目标的福利领取 setSevenGoalWelfareList: function setSevenGoalWelfareList(data) { this.welfareList = []; for (var i = 1; i <= 7; i++) { this.welfareList[i] = []; } for (var i in data) { this.welfareList[data[i].day].push(data[i]); } }, getSevenGoalWelfareList: function getSevenGoalWelfareList(day) { if (!this.welfareList) return; return this.welfareList[day] || []; }, // 更新数据 updataGoalWelfareList: function updataGoalWelfareList(day, index, status) { this.welfareList[day][index].status = status; }, // 七天目标的成长目标 setSevenGoalGrowList: function setSevenGoalGrowList(data) { var grow_list = []; for (var i = 1; i <= 7; i++) { grow_list[i] = []; } for (var i in data) { grow_list[data[i].day].push(data[i]); } this.serverGrowListData = []; this.serverGiftListData = []; for (var i in grow_list) { var tab = []; var tab1 = []; for (var k in grow_list[i]) { if (grow_list[i][k].target_type == 1) { tab.push(grow_list[i][k]); } else if (grow_list[i][k].target_type == 2) { tab1.push(grow_list[i][k]); } } this.serverGrowListData.push(tab); this.serverGiftListData.push(tab1); } }, getServerGrowListData: function getServerGrowListData(day) { if (this.serverGrowListData && this.serverGrowListData[day]) { return this.serverGrowListData[day] || []; } return []; }, // 更新数据 updataGrowListData: function updataGrowListData(day, index, status) { this.serverGrowListData[day][index].status = status; }, getServerGiftListData: function getServerGiftListData(day) { if (!this.serverGiftListData) return; return this.serverGiftListData[day] || []; }, // 更新数据 updataGiftListData: function updataGiftListData(day, index, status) { this.serverGiftListData[day][index].status = status; }, // 福利礼包礼包购买 setHalfGiftList: function setHalfGiftList(data) { this.halfGiftList = []; for (var i = 1; i <= 7; i++) { this.halfGiftList[i] = []; } for (var i = 1; i <= 7; i++) { var half_list = this.getWelfareHalfData(i); for (var k in half_list) { for (var b in data) { if (half_list[k].id == data[b].day) { this.halfGiftList[i].push(data[b]); } } } } }, getHalfGiftList: function getHalfGiftList(day) { if (this.halfGiftList && this.halfGiftList[day]) { return this.halfGiftList[day] || []; } }, // 更新数据 updataHalfListData: function updataHalfListData(day, index, status) { this.halfGiftList[day][index].status = status; }, // 活跃宝箱 setSevenGoalBoxList: function setSevenGoalBoxList(data) { this.boxList = data; }, getSevenGoalBoxList: function getSevenGoalBoxList() { if (!this.boxList) return; this.boxList.sort(Utils.tableLowerSorter(["goal_id"])); return this.boxList || []; }, // 更新数据 updataBoxListData: function updataBoxListData(index, status) { this.boxList[index].status = status; }, sortItemList: function sortItemList(list) { var _tempsort; var tempsort = (_tempsort = {}, _defineProperty(_tempsort, 0, 2), _defineProperty(_tempsort, 1, 1), _defineProperty(_tempsort, 2, 3), _tempsort); var sortFunc = function sortFunc(objA, objB) { if (objA.status != objB.status) { if (tempsort[objA.status] && tempsort[objB.status]) { return tempsort[objA.status] - tempsort[objB.status]; } else { return -1; } } else { return objA.aim - objB.aim; } }; list.sort(sortFunc); }, //设置倒计时 setCountDownTime: function setCountDownTime(text, less_time) { var node = text.node; if (!node) return; node.stopAllActions(); if (less_time > 0) { this.setTimeFormatString(text, less_time); var callfun = cc.callFunc(function () { less_time = less_time - 1; if (less_time < 0) { node.stopAllActions(); text.string = "00:00:00"; } else { this.setTimeFormatString(text, less_time); } }.bind(this)); node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), callfun))); } else { this.setTimeFormatString(text, less_time); } }, setTimeFormatString: function setTimeFormatString(text, time) { var TimeTool = require("timetool"); if (time > 0) { text.string = TimeTool.getTimeForFunction(time); } else { text.node.stopAllActions(); text.string = "00:00:00"; } }, // *********** end ********************************************* // 幸运值 setLucklyRewardData: function setLucklyRewardData() { var data = Config.dial_data.data_get_lucky_award; var list = this.sortLucklyData(data); this.lucky_num1 = list[0]; this.lucky_num2 = list[1]; }, getLucklyRewardData: function getLucklyRewardData(index) { if (!this.lucky_num1 || !this.lucky_num2) return []; if (index == 1) { return this.lucky_num1 || []; } else if (index == 2) { return this.lucky_num2 || []; } }, // 抽奖两个按钮 setBuyRewardData: function setBuyRewardData() { var data = Config.dial_data.data_get_limit_open; var list = this.sortLucklyData(data, true); this.buy_num_list1 = list[0]; this.buy_num_list2 = list[1]; }, getBuyRewardData: function getBuyRewardData(index) { if (!this.buy_num_list1 || !this.buy_num_list2) return []; if (index == 1) { return this.buy_num_list1 || []; } else if (index == 2) { return this.buy_num_list2 || []; } }, sortLucklyData: function sortLucklyData(data, _type) { var list1 = []; var list2 = []; for (var i in data) { var v = data[i]; if (v.type == 1) { list1.push(v); } else if (v.type == 2) { list2.push(v); } } if (_type) { list1.sort(function (a, b) { return a.type2 - b.type2; }); list2.sort(function (a, b) { return a.type2 - b.type2; }); } else { list1.sort(function (a, b) { return a.id - b.id; }); list2.sort(function (a, b) { return a.id - b.id; }); } return [list1, list2]; }, // ------- 探宝服务器返回---------- // 寻宝数据 setTreasureInitData: function setTreasureInitData(data) { this.treasureInitData = []; for (var i in data) { this.treasureInitData[data[i].type] = data[i]; } }, getTreasureInitData: function getTreasureInitData(index) { if (!this.treasureInitData) return []; return this.treasureInitData[index] || []; }, // 更新 updataTreasureInitData: function updataTreasureInitData(index, data) { if (!this.treasureInitData) return; this.treasureInitData[index].count = data.count; this.treasureInitData[index].end_time = data.end_time; this.treasureInitData[index].lucky = data.lucky; this.treasureInitData[index].lucky_award = data.lucky_award; this.treasureInitData[index].rand_lists = data.rand_lists; }, // 更新日记 updataTreasureLogData: function updataTreasureLogData(index, data) { if (!this.treasureInitData) return; this.treasureInitData[index].log_list = data; }, // *********探宝红点********* lucklyRedPoint: function lucklyRedPoint() { this.setLucklyRewardData(); this.tab_redpoint = [false, false]; for (var val = 1; val <= 2; val++) { var data = this.getLucklyRewardData(val); var serve_data = this.getTreasureInitData(val); var status = false; for (var j in data) { var _bool = true; for (var k in serve_data.lucky_award) { if (data[j].id == serve_data.lucky_award[k].lucky) { _bool = false; break; } } if (serve_data.lucky < data[j].lucky_val) { _bool = false; } if (_bool == true) { status = true; break; } } this.setLucklyTabRedPoint(val, status); } MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.lucky_treasure, this.tab_redpoint[1] || this.tab_redpoint[2]); }, // 获取幸运探宝页签红点 setLucklyTabRedPoint: function setLucklyTabRedPoint(index, status) { this.tab_redpoint[index] = status; }, getLucklyTabRedPoint: function getLucklyTabRedPoint(index) { if (this.tab_redpoint && this.tab_redpoint[index]) { return this.tab_redpoint[index]; } return false; }, getFundRedStatusByBid: function getFundRedStatusByBid(bid) { return this.fund_red_list[bid]; }, //杂货铺数据 setStoneShopData: function setStoneShopData(data) { this.stone_shop_data = {}; for (var i in data) { var v = data[i]; this.stone_shop_data[v.id] = v; } }, getStoneShopData: function getStoneShopData(id) { if (this.stone_shop_data && this.stone_shop_data[id] != null) { return this.stone_shop_data[id]; } return null; }, // -----------每日红点仅显示一次----------- updateGiftRedPointStatus: function updateGiftRedPointStatus(data) { var bid = data.bid; this.gift_id_list = this.gift_id_list || []; this.gift_id_list[bid] = data; }, getGiftRedStatusByBid: function getGiftRedStatusByBid(bid) { if (!this.gift_id_list) return; var list = this.gift_id_list[bid]; if (list) { return list.status; } }, setGiftRedStatus: function setGiftRedStatus(data) { if (!this.gift_id_list) return; var bid = data.bid; var status = data.status; var list = this.gift_id_list[bid]; if (list && list.status != status) { list.status = status; } gcore.GlobalEvent.fire(ActionEvent.SHOW_ACTIVITY_RED_POINT, bid, status); }, updataFestvalRedStatus: function updataFestvalRedStatus(bid, data) { var red_status = this.getRedPointStatus(data); var festval_bid = MainuiConst.icon.festval; if (bid == ActionConst.ActionRankCommonType.festval_day) { festval_bid = MainuiConst.icon.festval_spring; } else if (bid == ActionConst.ActionRankCommonType.lover_day) { festval_bid = MainuiConst.icon.festval_lover; } MainuiController.getInstance().setFunctionTipsStatus(festval_bid, red_status); }, getRedPointStatus: function getRedPointStatus(data) { if (!data) return false; var red_status = false; for (var k = 0; k < data.length; ++k) { var v = data[k]; if (v.status == 1) { red_status = true; break; } } return red_status; }, updataCombineLoginRedStatus: function updataCombineLoginRedStatus(data) { if (!data) return; var red_status = false; for (var k = 0; k < data.length; ++k) { var v = data[k]; if (v.status == 1) { red_status = true; break; } } MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.combine_login, red_status); }, updataPreferentialRedStatus: function updataPreferentialRedStatus(status, id) { if (true) return; //暂时屏蔽掉 不需要 // id = id or MainuiConst.icon.preferential // if status then // if self.prefer_fisrt_flag == nil then // self.prefer_fisrt_flag = {} // end // if not self.prefer_fisrt_flag[id] then // self.prefer_fisrt_flag[id] = true // else // status = false // end // end // MainuiController:getInstance():setFunctionTipsStatus(id, status) }, clearFundSrvData: function clearFundSrvData() { this.fund_datas = {}; } }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhY3Rpb25cXGFjdGlvbl9tb2RlbC5qcyJdLCJuYW1lcyI6WyJNYWludWlDb250cm9sbGVyIiwicmVxdWlyZSIsIk1haW51aUNvbnN0IiwiQWN0aW9uRXZlbnQiLCJBY3Rpb25Db25zdCIsIkFjdGlvbk1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsImZ1bmRfcmVkX2xpc3QiLCJzZXRPcGVuRnVuZElkcyIsImlkX2xpc3QiLCJmdW5kX2lkX2xpc3QiLCJjaGVja0Z1bmRSZWRTdGF0dXMiLCJnZXRPcGVuRnVuZElkcyIsInNldEZ1bmRTcnZEYXRhIiwiZGF0YSIsImZ1bmRfZGF0YXMiLCJpZCIsInVwZGF0ZUZ1bmRTdGF0dXMiLCJzdGF0dXMiLCJnZXRGdW5kU3J2RGF0YUJ5SWQiLCJrIiwibGVuZ3RoIiwidiIsIkZ1bmRUeXBlIiwidHlwZV9vbmUiLCJ1cGRhdGVGdW5kUmVkU3RhdHVzIiwiRnVuZFJlZEluZGV4IiwiZnVuZF9nZXRfb25lIiwiZnVuZF9idXlfb25lIiwidHlwZV90d28iLCJmdW5kX2dldF90d28iLCJmdW5kX2J1eV90d28iLCJiaWQiLCJfc3RhdHVzIiwicmVkX3N0YXR1cyIsImdldEluc3RhbmNlIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiaWNvbiIsImZ1bmQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQiLCJ1cGRhdGVTZXZlbkxvZ2luRGF0YSIsInNldmVuX2xvZ2luX2RhdGEiLCJnZXRTZXZlbkxvZ2luRGF0YSIsImdldE1heFNldmVuRGF5Iiwic3RhdHVzX2xpc3QiLCJzb3J0IiwiYSIsImIiLCJkYXkiLCJpIiwic2V0Rmlyc3RCdG5TdGF0dXMiLCJmaXJzdEJ0blN0YXR1cyIsImdldEZpcnN0QnRuU3RhdHVzIiwiaW5kZXgiLCJzZXRTZXZlbkdvbGRQZXJpb2QiLCJwZXJpb2QiLCJzZXZlblBlcmlvZCIsImdldFNldmVuR29sZFBlcmlvZCIsImNoZWNrUmVkUG9pbnQiLCJ3ZWxmYXJlUmV0UG9pbnQiLCJ3ZWxmYXJlIiwiZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3QiLCJncm93UmV0UG9pbnQiLCJncm93IiwiZ2V0U2VydmVyR3Jvd0xpc3REYXRhIiwiZ2lmdFJldFBvaW50IiwiZ2V0U2VydmVyR2lmdExpc3REYXRhIiwiaGFsZlJlZFBvaW50IiwiaGFsZiIsImdldEhhbGZHaWZ0TGlzdCIsImJveFJlZFBvaW50IiwiYm94IiwiZ2V0U2V2ZW5Hb2FsQm94TGlzdCIsInJlZFN0YXR1cyIsInJlZFN0YXR1czEiLCJyZWRTdGF0dXMyIiwicmVkU3RhdHVzMyIsInJlZFN0YXR1czQiLCJyZWRTdGF0dXM1IiwiaWNvbl9pZCIsInNldmVuX2dvYWwiLCJzZXZlbl9nb2FsMSIsInNldmVuX2dvYWwyIiwic2V2ZW5fZ29hbDMiLCJnZXRSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJnZXRSZWRQb2ludEdyb3dTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdyb3dTdGF0dXMiLCJnZXRSZWRQb2ludEdpZnRTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdpZnRTdGF0dXMiLCJnZXRSZWRQb2ludEhhbGZTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEhhbGZTdGF0dXMiLCJnZXRSZWRQb2ludEJveFN0YXR1cyIsInVwZGF0YVJlZFBvaW50Qm94U3RhdHVzIiwiaW5pdFNldmVuV2FsZmFyZSIsInNldFdhbGZhcmVEYXRhIiwic2V0V2FsZmFyZUdyb3dVcERhdGEiLCJzZXRIYWxmR2lmdERhdGEiLCJzZXRCb3hSZXdhcmREYXRhIiwiQ29uZmlnIiwiZGF5X2dvYWxzX2RhdGEiLCJkYXRhX2FsbF90YXJnZXQiLCJib3hSZXdhcmREYXRhIiwicHVzaCIsImdldEJveFJld2FyZERhdGEiLCJkYXRhX3dlbGZhcmVjb2xsZWN0aW9uIiwid2VsZmFyZURhdGEiLCJVdGlscyIsImRlZXBDb3B5IiwiZGF0YV9ncm93dGh0YXJnZXQiLCJ3ZWxmYXJlR3Jvd0RhdGEiLCJ3ZWxmYXJlR2lmdERhdGEiLCJ0YWIiLCJ0YWIxIiwidGFyZ2V0X3R5cGUiLCJkYXRhX2hhbGZkaXNjb3VudCIsIndhbGZhcmVIYWxmRGF0YSIsImdldFdhbGZhcmVEYXRhIiwiZ2V0V2FsZmFyZUdyb3dVcERhdGEiLCJnZXRXZWxmYXJlR2lmdERhdGEiLCJnZXRXZWxmYXJlSGFsZkRhdGEiLCJzZXRTZXZlbkdvYWxXZWxmYXJlTGlzdCIsIndlbGZhcmVMaXN0IiwidXBkYXRhR29hbFdlbGZhcmVMaXN0Iiwic2V0U2V2ZW5Hb2FsR3Jvd0xpc3QiLCJncm93X2xpc3QiLCJzZXJ2ZXJHcm93TGlzdERhdGEiLCJzZXJ2ZXJHaWZ0TGlzdERhdGEiLCJ1cGRhdGFHcm93TGlzdERhdGEiLCJ1cGRhdGFHaWZ0TGlzdERhdGEiLCJzZXRIYWxmR2lmdExpc3QiLCJoYWxmR2lmdExpc3QiLCJoYWxmX2xpc3QiLCJ1cGRhdGFIYWxmTGlzdERhdGEiLCJzZXRTZXZlbkdvYWxCb3hMaXN0IiwiYm94TGlzdCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJ1cGRhdGFCb3hMaXN0RGF0YSIsInNvcnRJdGVtTGlzdCIsImxpc3QiLCJ0ZW1wc29ydCIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJhaW0iLCJzZXRDb3VudERvd25UaW1lIiwidGV4dCIsImxlc3NfdGltZSIsIm5vZGUiLCJzdG9wQWxsQWN0aW9ucyIsInNldFRpbWVGb3JtYXRTdHJpbmciLCJjYWxsZnVuIiwiY2FsbEZ1bmMiLCJzdHJpbmciLCJiaW5kIiwicnVuQWN0aW9uIiwicmVwZWF0Rm9yZXZlciIsInNlcXVlbmNlIiwiZGVsYXlUaW1lIiwidGltZSIsIlRpbWVUb29sIiwiZ2V0VGltZUZvckZ1bmN0aW9uIiwic2V0THVja2x5UmV3YXJkRGF0YSIsImRpYWxfZGF0YSIsImRhdGFfZ2V0X2x1Y2t5X2F3YXJkIiwic29ydEx1Y2tseURhdGEiLCJsdWNreV9udW0xIiwibHVja3lfbnVtMiIsImdldEx1Y2tseVJld2FyZERhdGEiLCJzZXRCdXlSZXdhcmREYXRhIiwiZGF0YV9nZXRfbGltaXRfb3BlbiIsImJ1eV9udW1fbGlzdDEiLCJidXlfbnVtX2xpc3QyIiwiZ2V0QnV5UmV3YXJkRGF0YSIsIl90eXBlIiwibGlzdDEiLCJsaXN0MiIsInR5cGUiLCJ0eXBlMiIsInNldFRyZWFzdXJlSW5pdERhdGEiLCJ0cmVhc3VyZUluaXREYXRhIiwiZ2V0VHJlYXN1cmVJbml0RGF0YSIsInVwZGF0YVRyZWFzdXJlSW5pdERhdGEiLCJjb3VudCIsImVuZF90aW1lIiwibHVja3kiLCJsdWNreV9hd2FyZCIsInJhbmRfbGlzdHMiLCJ1cGRhdGFUcmVhc3VyZUxvZ0RhdGEiLCJsb2dfbGlzdCIsImx1Y2tseVJlZFBvaW50IiwidGFiX3JlZHBvaW50IiwidmFsIiwic2VydmVfZGF0YSIsImoiLCJfYm9vbCIsImx1Y2t5X3ZhbCIsInNldEx1Y2tseVRhYlJlZFBvaW50IiwibHVja3lfdHJlYXN1cmUiLCJnZXRMdWNrbHlUYWJSZWRQb2ludCIsImdldEZ1bmRSZWRTdGF0dXNCeUJpZCIsInNldFN0b25lU2hvcERhdGEiLCJzdG9uZV9zaG9wX2RhdGEiLCJnZXRTdG9uZVNob3BEYXRhIiwidXBkYXRlR2lmdFJlZFBvaW50U3RhdHVzIiwiZ2lmdF9pZF9saXN0IiwiZ2V0R2lmdFJlZFN0YXR1c0J5QmlkIiwic2V0R2lmdFJlZFN0YXR1cyIsIlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5UIiwidXBkYXRhRmVzdHZhbFJlZFN0YXR1cyIsImdldFJlZFBvaW50U3RhdHVzIiwiZmVzdHZhbF9iaWQiLCJmZXN0dmFsIiwiQWN0aW9uUmFua0NvbW1vblR5cGUiLCJmZXN0dmFsX2RheSIsImZlc3R2YWxfc3ByaW5nIiwibG92ZXJfZGF5IiwiZmVzdHZhbF9sb3ZlciIsInVwZGF0YUNvbWJpbmVMb2dpblJlZFN0YXR1cyIsImNvbWJpbmVfbG9naW4iLCJ1cGRhdGFQcmVmZXJlbnRpYWxS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LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTAyIDE2OjQ5OjAzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIE1haW51aUNvbnRyb2xsZXIgICAgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xudmFyIEFjdGlvbkV2ZW50ID0gcmVxdWlyZShcImFjdGlvbl9ldmVudFwiKVxudmFyIEFjdGlvbkNvbnN0ID0gcmVxdWlyZShcImFjdGlvbl9jb25zdFwiKVxudmFyIEFjdGlvbk1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAtLSDln7rph5HnuqLngrnmlbDmja5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0ID0ge31cbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1AIOWfuumHkea0u+WKqOebuOWFs1xuICAgIC8vIC0tIOW8gOWQr+S4reeahOWfuumHkea0u+WKqGlkXG4gICAgc2V0T3BlbkZ1bmRJZHMoaWRfbGlzdCkge1xuICAgICAgICB0aGlzLmZ1bmRfaWRfbGlzdCA9IGlkX2xpc3QgfHwgW11cbiAgICAgICAgdGhpcy5jaGVja0Z1bmRSZWRTdGF0dXMoKVxuICAgIH0sXG4gICAgZ2V0T3BlbkZ1bmRJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgIH0sXG4gICAgLy8gLS0g6K6+572u5Z+66YeR55qE5pWw5o2uXG4gICAgc2V0RnVuZFNydkRhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLmZ1bmRfZGF0YXMgPSB0aGlzLmZ1bmRfZGF0YXMgfHwge31cbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5pZCkge1xuICAgICAgICAgICAgdGhpcy5mdW5kX2RhdGFzW2RhdGEuaWRdID0gZGF0YVxuICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kU3RhdHVzKGRhdGEuaWQsIGRhdGEuc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDojrflj5bln7rph5HmlbDmja5cbiAgICBnZXRGdW5kU3J2RGF0YUJ5SWQoaWQpIHtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0gdGhpcy5mdW5kX2RhdGFzIHx8IHt9XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfZGF0YXNbaWRdIHx8IHt9XG4gICAgfSxcbiAgICB1cGRhdGVGdW5kU3RhdHVzKGlkLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHRoaXMuZnVuZF9pZF9saXN0W2tdXG4gICAgICAgICAgICBpZiAodi5pZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHYuc3RhdHVzID0gc3RhdHVzXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrRnVuZFJlZFN0YXR1cygpXG4gICAgfSxcbiAgICAvL+ajgOafpei2heWAvOWfuumHkee6oueCuVxuICAgIGNoZWNrRnVuZFJlZFN0YXR1cygpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IobGV0IGs9MDtrPHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsrK2spe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfaWRfbGlzdFtrXVxuICAgICAgICAgICAgaWYodi5pZCA9PSBBY3Rpb25Db25zdC5GdW5kVHlwZS50eXBlX29uZSl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2dldF9vbmUsIHYuc3RhdHVzID09IDEpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2J1eV9vbmUsIHYuc3RhdHVzID09IDApXG4gICAgICAgICAgICB9ZWxzZSBpZih2LmlkID09IEFjdGlvbkNvbnN0LkZ1bmRUeXBlLnR5cGVfdHdvKXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfZ2V0X3R3bywgdi5zdGF0dXMgPT0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfYnV5X3R3bywgdi5zdGF0dXMgPT0gMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0g5pu05paw5Z+66YeR57qi54K55pWw5o2uXG4gICAgdXBkYXRlRnVuZFJlZFN0YXR1cyggYmlkLCBzdGF0dXMgKXtcbiAgICAgICAgbGV0IF9zdGF0dXMgPSB0aGlzLmZ1bmRfcmVkX2xpc3RbYmlkXVxuICAgICAgICBpZihfc3RhdHVzID09IHN0YXR1cykgcmV0dXJuO1xuICAgICAgICAvLyAtLSDotK3kubDnmoTnuqLngrnlj6rmnInnmbvpmYbml7bmiY3mmL7npLrvvIzngrnlh7vkuYvlkI7mtojlpLHvvIzkuYvlkI7kuI3lho3mmL7npLpcbiAgICAgICAgaWYoKGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfb25lIHx8IGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfdHdvKSAmJiBfc3RhdHVzID09IGZhbHNlKXtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0W2JpZF0gPSBzdGF0dXNcblxuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlXG4gICAgICAgIGZvcihsZXQgayBpbiB0aGlzLmZ1bmRfcmVkX2xpc3Qpe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfcmVkX2xpc3Rba11cbiAgICAgICAgICAgIGlmKHYgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5mdW5kLCByZWRfc3RhdHVzKVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQpXG4gICAgfSxcbiAgICB1cGRhdGVTZXZlbkxvZ2luRGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXZlbl9sb2dpbl9kYXRhID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Mb2dpbkRhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V2ZW5fbG9naW5fZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gLS1kZXNjOuiOt+WPluW9k+WJjeWPr+mihuWPljflpKnnmbvlvZXnmoTmnIDlpKflpKnmlbBcbiAgICBnZXRNYXhTZXZlbkRheTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zZXZlbl9sb2dpbl9kYXRhID09IG51bGwgfHwgdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN0YXR1c19saXN0ID0gdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0O1xuICAgICAgICBzdGF0dXNfbGlzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5kYXkgLSBiLmRheTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGRheSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgaW4gc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXNfbGlzdFtpXS5zdGF0dXMgPT0gMikge1xuICAgICAgICAgICAgICAgIGRheSA9IHN0YXR1c19saXN0W2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5ID0gc3RhdHVzX2xpc3Rbc3RhdHVzX2xpc3QubGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH0sXG4gICAgc2V0Rmlyc3RCdG5TdGF0dXM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXMgPSB7fVxuICAgICAgICBmb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFbaV1cbiAgICAgICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXNbdi5pZF0gPSB2LnN0YXR1c1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpcnN0QnRuU3RhdHVzOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0QnRuU3RhdHVzKSByZXR1cm5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RCdG5TdGF0dXNbaW5kZXhdIHx8IDBcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5LiD5pel55uu5qCH55qE5ZGo5pyf5pWwXG4gICAgc2V0U2V2ZW5Hb2xkUGVyaW9kOmZ1bmN0aW9uKHBlcmlvZCl7XG4gICAgICAgIHRoaXMuc2V2ZW5QZXJpb2QgPSBwZXJpb2Q7XG4gICAgfSxcblxuICAgIGdldFNldmVuR29sZFBlcmlvZDpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5zZXZlblBlcmlvZDtcbiAgICB9LFxuXG4gICAgLy8g5LiD5aSp55uu5qCH5qOA5p+l57qi54K5ICAgLS3lvZPliY3lpKnmlbDku6XkuIvnmoRcbiAgICBjaGVja1JlZFBvaW50OmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKGRheSA8IDEgfHwgZGF5ID4gNylyZXR1cm47XG4gICAgICAgIGRheSA9IGRheSB8fCAxO1xuICAgICAgICAvLyDnpo/liKlcbiAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnQgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIHdlbGZhcmUgPSB0aGlzLmdldFNldmVuR29hbFdlbGZhcmVMaXN0KGkpO1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGZvcih2YXIgayBpbiB3ZWxmYXJlKXtcbiAgICAgICAgICAgICAgICBpZih3ZWxmYXJlW2tdLnN0YXR1cyA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5q+P5pel55uu5qCHXG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xOyBpPD1kYXk7aSsrKXtcbiAgICAgICAgICAgIHZhciBncm93ID0gdGhpcy5nZXRTZXJ2ZXJHcm93TGlzdERhdGEoaS0xKTtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvdyl7XG4gICAgICAgICAgICAgICAgaWYoZ3Jvd1trXS5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOi2heWAvOekvOWMhVxuICAgICAgICB0aGlzLmdpZnRSZXRQb2ludCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTsgaTw9ZGF5O2krKyl7XG4gICAgICAgICAgICB2YXIgZ3JvdyA9IHRoaXMuZ2V0U2VydmVyR2lmdExpc3REYXRhKGktMSk7XG4gICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGdyb3cpe1xuICAgICAgICAgICAgICAgIGlmKGdyb3dba10uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50ID0gW107XG4gICAgICAgIC8vIDDjgIHov5jmnInpooblj5YgIDHjgIHlt7Lpooblj5ZcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGYgPSB0aGlzLmdldEhhbGZHaWZ0TGlzdChpKTtcbiAgICAgICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gaGFsZil7XG4gICAgICAgICAgICAgICAgaWYoayA9PSAwICYmIGhhbGZba10uc3RhdHVzID09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbGZSZWRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWuneeusVxuICAgICAgICB0aGlzLmJveFJlZFBvaW50ID0gW107XG4gICAgICAgIHZhciBib3ggPSB0aGlzLmdldFNldmVuR29hbEJveExpc3QoKTtcbiAgICAgICAgZm9yKHZhciBpIGluIGJveCl7XG4gICAgICAgICAgICB0aGlzLmJveFJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBpZihib3hbaV0uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZFN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMSA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMiA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNCA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNSA9IGZhbHNlO1xuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLndlbGZhcmVSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLndlbGZhcmVSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdyb3dSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdyb3dSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdpZnRSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdpZnRSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmhhbGZSZWRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGZSZWRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXM1ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmJveFJlZFBvaW50KXtcbiAgICAgICAgICAgIGlmKHRoaXMuYm94UmVkUG9pbnRbaV0gPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkU3RhdHVzNCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWRTdGF0dXMgPSByZWRTdGF0dXMxIHx8IHJlZFN0YXR1czIgfHwgcmVkU3RhdHVzMyB8fCByZWRTdGF0dXM0IHx8IHJlZFN0YXR1czU7XG4gICAgICAgIHZhciBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsO1xuICAgICAgICBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDEpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbFxuICAgICAgICB9ZWxzZSBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDIpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbDE7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuZ2V0U2V2ZW5Hb2xkUGVyaW9kKCkgPT0gMyl7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsMjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsM1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKGljb25faWQsIHJlZFN0YXR1cyk7XG4gICAgfSxcblxuICAgIC8vIOe6oueCueeKtuaAgVxuICAgIGdldFJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlUmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMud2VsZmFyZVJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMud2VsZmFyZVJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5ncm93UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ3Jvd1JldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdyb3dSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5naWZ0UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ2lmdFJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ2lmdFJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOemj+WIqeekvOWMhVxuICAgIGdldFJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5oYWxmUmVkUG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuaGFsZlJlZFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmhhbGZSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2RheV0gPSBzdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0UmVkUG9pbnRCb3hTdGF0dXM6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgc3RhdHVzID0gdGhpcy5ib3hSZWRQb2ludFtpbmRleF07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50Qm94U3RhdHVzOmZ1bmN0aW9uKGluZGV4LCBzdGF0dXMpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIcqKioqKioqKioqKiBzdGFydCAqKioqKlxuICAgIGluaXRTZXZlbldhbGZhcmU6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB0aGlzLnNldFdhbGZhcmVEYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRXYWxmYXJlR3Jvd1VwRGF0YShpbmRleCk7XG4gICAgICAgIHRoaXMuc2V0SGFsZkdpZnREYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRCb3hSZXdhcmREYXRhKGluZGV4KTtcbiAgICB9LFxuXG4gICAgLy8g5a6d566xXG4gICAgc2V0Qm94UmV3YXJkRGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRheV9nb2Fsc19kYXRhLmRhdGFfYWxsX3RhcmdldFtpbmRleF1cbiAgICAgICAgdGhpcy5ib3hSZXdhcmREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5wdXNoKGRhdGFbaV1bMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7XG4gICAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldEJveFJld2FyZERhdGE6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm94UmV3YXJkRGF0YSB8fCBbXTtcbiAgICB9LFxuXG4gICAgLy8g56aP5YipXG4gICAgc2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX3dlbGZhcmVjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgdGhpcy53ZWxmYXJlRGF0YSA9IFV0aWxzLmRlZXBDb3B5KGRhdGEpO1xuICAgIH0sXG4gICAgXG4gICAgLy8g5oiQ6ZW/55uu5qCHXG4gICAgc2V0V2FsZmFyZUdyb3dVcERhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX2dyb3d0aHRhcmdldFtpbmRleF07XG4gICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhID0gW107XG4gICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZGF0YVtpXSl7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiLnB1c2goZGF0YVtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiMS5wdXNoKGRhdGFbaV1ba10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhLnB1c2godGFiKTtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhLnB1c2godGFiMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56aP5Yip56S85YyFXG4gICAgc2V0SGFsZkdpZnREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgdmFyIGRhdGEgPSBDb25maWcuZGF5X2dvYWxzX2RhdGEuZGF0YV9oYWxmZGlzY291bnRbaW5kZXhdO1xuICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKHZhciBpIGluIGRhdGEpe1xuICAgICAgICAgICAgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF0YVtpXVswXS5kYXldLnB1c2goZGF0YVtpXVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZURhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlRGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXYWxmYXJlR3Jvd1VwRGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlR3Jvd0RhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlR3Jvd0RhdGFbZGF5XSB8fCBbXTtcbiAgICB9LFxuXG4gICAgZ2V0V2VsZmFyZUdpZnREYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVHaWZ0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLndlbGZhcmVHaWZ0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXZWxmYXJlSGFsZkRhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy53YWxmYXJlSGFsZkRhdGEgJiYgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vICoqKioqKioqKioqIOWNj+iuruebuOWFsyoqKioqKioqKlxuLy8g5LiD5aSp55uu5qCH55qE56aP5Yip6aKG5Y+WXG4gICAgc2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMud2VsZmFyZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUxpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZUxpc3QpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlTGlzdFtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtkYXldW2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7ICAgIFxuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIfnmoTmiJDplb/nm67moIdcbiAgICBzZXRTZXZlbkdvYWxHcm93TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGdyb3dfbGlzdCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICBncm93X2xpc3RbaV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICBncm93X2xpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZ3Jvd19saXN0KXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvd19saXN0W2ldKXtcbiAgICAgICAgICAgICAgICBpZihncm93X2xpc3RbaV1ba10udGFyZ2V0X3R5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRhYi5wdXNoKGdyb3dfbGlzdFtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZ3Jvd19saXN0W2ldW2tdLnRhcmdldF90eXBlID09IDIpe1xuICAgICAgICAgICAgICAgICAgICB0YWIxLnB1c2goZ3Jvd19saXN0W2ldW2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YS5wdXNoKHRhYik7XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YS5wdXNoKHRhYjEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFNlcnZlckdyb3dMaXN0RGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZih0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSAmJiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhR3Jvd0xpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuc2VydmVyR3Jvd0xpc3REYXRhW2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0U2VydmVyR2lmdExpc3REYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHaWZ0TGlzdERhdGE6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5zZXJ2ZXJHaWZ0TGlzdERhdGFbZGF5XVtpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDnpo/liKnnpLzljIXnpLzljIXotK3kubBcbiAgICBzZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTc7aSsrKXtcbiAgICAgICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2ldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGZfbGlzdCA9IHRoaXMuZ2V0V2VsZmFyZUhhbGZEYXRhKGkpO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGhhbGZfbGlzdCl7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBiIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICBpZihoYWxmX2xpc3Rba10uaWQgPT0gZGF0YVtiXS5kYXkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYWxmR2lmdExpc3RbaV0ucHVzaChkYXRhW2JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy5oYWxmR2lmdExpc3QgJiYgdGhpcy5oYWxmR2lmdExpc3RbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxmR2lmdExpc3RbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhSGFsZkxpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgLy8g5rS76LeD5a6d566xXG4gICAgc2V0U2V2ZW5Hb2FsQm94TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0ID0gZGF0YTtcbiAgICB9LFxuICAgIFxuICAgIGdldFNldmVuR29hbEJveExpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMuYm94TGlzdClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94TGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiZ29hbF9pZFwiXSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5ib3hMaXN0IHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFCb3hMaXN0RGF0YTpmdW5jdGlvbihpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0W2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfSxcbiAgICBzb3J0SXRlbUxpc3QobGlzdCl7XG4gICAgICAgIGxldCB0ZW1wc29ydCA9IHtcbiAgICAgICAgICAgIFswXSA6IDIsICAvLy0tIDAg5pyq6aKG5Y+W5pS+5Lit6Ze0XG4gICAgICAgICAgICBbMV0gOiAxLCAgLy8tLSAxIOWPr+mihuWPluaUvuWJjemdolxuICAgICAgICAgICAgWzJdIDogMywgIC8vLS0gMiDlt7Lpooblj5bmlL7mnIDlkI5cbiAgICAgICAgfVxuICAgICAgICBsZXQgc29ydEZ1bmMgPSBmdW5jdGlvbiAob2JqQSxvYmpCKXtcbiAgICAgICAgICAgIGlmIChvYmpBLnN0YXR1cyAhPSBvYmpCLnN0YXR1cyl7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBzb3J0W29iakEuc3RhdHVzXSAmJiB0ZW1wc29ydFtvYmpCLnN0YXR1c10pe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcHNvcnRbb2JqQS5zdGF0dXNdIC0gdGVtcHNvcnRbb2JqQi5zdGF0dXNdXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLmFpbSAtIG9iakIuYWltXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5zb3J0KHNvcnRGdW5jKVxuICAgIH0sXG4gICAgLy/orr7nva7lgJLorqHml7ZcbiAgICBzZXRDb3VudERvd25UaW1lKHRleHQsbGVzc190aW1lKXtcbiAgICAgICAgbGV0IG5vZGUgPSB0ZXh0Lm5vZGVcbiAgICAgICAgaWYoIW5vZGUpcmV0dXJuXG4gICAgICAgIG5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgaWYgKGxlc3NfdGltZSA+IDApe1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgbGV0IGNhbGxmdW4gPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGVzc190aW1lID0gbGVzc190aW1lIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAobGVzc190aW1lIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIG5vZGUucnVuQWN0aW9uKGNjLnJlcGVhdEZvcmV2ZXIoY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDEpLCBjYWxsZnVuKSkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsdGltZSl7XG4gICAgICAgIHZhciBUaW1lVG9vbCA9IHJlcXVpcmUoXCJ0aW1ldG9vbFwiKVxuICAgICAgICBpZih0aW1lID4gMCl7XG4gICAgICAgICAgICB0ZXh0LnN0cmluZyA9IFRpbWVUb29sLmdldFRpbWVGb3JGdW5jdGlvbih0aW1lKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0ZXh0Lm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vICoqKioqKioqKioqIGVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAvLyDlubjov5DlgLxcbiAgICBzZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2dldF9sdWNreV9hd2FyZDtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMubHVja3lfbnVtMSB8fCAhdGhpcy5sdWNreV9udW0yKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sdWNreV9udW0xIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmx1Y2t5X251bTIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5oq95aWW5Lik5Liq5oyJ6ZKuXG4gICAgc2V0QnV5UmV3YXJkRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kaWFsX2RhdGEuZGF0YV9nZXRfbGltaXRfb3BlbjtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRCdXlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMuYnV5X251bV9saXN0MSB8fCAhdGhpcy5idXlfbnVtX2xpc3QyKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idXlfbnVtX2xpc3QxIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1eV9udW1fbGlzdDIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIHNvcnRMdWNrbHlEYXRhOmZ1bmN0aW9uKGRhdGEsIF90eXBlKXtcbiAgICAgICAgdmFyIGxpc3QxID0gW107XG4gICAgICAgIHZhciBsaXN0MiA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZih2LnR5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgbGlzdDEucHVzaCh2KTtcbiAgICAgICAgICAgIH1lbHNlIGlmKHYudHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICBsaXN0Mi5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKF90eXBlKXtcbiAgICAgICAgICAgIGxpc3QxLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEudHlwZTItYi50eXBlMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsaXN0Mi5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnR5cGUyLWIudHlwZTI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsaXN0MS5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmlkLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxpc3QyLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsaXN0MSxsaXN0Ml07XG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0g5o6i5a6d5pyN5Yqh5Zmo6L+U5ZueLS0tLS0tLS0tLVxuICAgIC8vIOWvu+WuneaVsOaNrlxuICAgIHNldFRyZWFzdXJlSW5pdERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbZGF0YVtpXS50eXBlXSA9IGRhdGFbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VHJlYXN1cmVJbml0RGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuW107XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrBcbiAgICB1cGRhdGFUcmVhc3VyZUluaXREYXRhOmZ1bmN0aW9uKGluZGV4LCBkYXRhKXtcbiAgICAgICAgaWYoIXRoaXMudHJlYXN1cmVJbml0RGF0YSlyZXR1cm47XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0uY291bnQgPSBkYXRhLmNvdW50O1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmVuZF90aW1lID0gZGF0YS5lbmRfdGltZTtcbiAgICAgICAgdGhpcy50cmVhc3VyZUluaXREYXRhW2luZGV4XS5sdWNreSA9IGRhdGEubHVja3k7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0ubHVja3lfYXdhcmQgPSBkYXRhLmx1Y2t5X2F3YXJkO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLnJhbmRfbGlzdHMgPSBkYXRhLnJhbmRfbGlzdHM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOaXpeiusFxuICAgIHVwZGF0YVRyZWFzdXJlTG9nRGF0YTpmdW5jdGlvbihpbmRleCwgZGF0YSl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmxvZ19saXN0ID0gZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gKioqKioqKioq5o6i5a6d57qi54K5KioqKioqKioqXG4gICAgbHVja2x5UmVkUG9pbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zZXRMdWNrbHlSZXdhcmREYXRhKCk7XG4gICAgICAgIHRoaXMudGFiX3JlZHBvaW50ID0gW2ZhbHNlLGZhbHNlXTtcbiAgICAgICAgZm9yKHZhciB2YWw9MTt2YWw8PTI7dmFsKyspe1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEx1Y2tseVJld2FyZERhdGEodmFsKTtcbiAgICAgICAgICAgIHZhciBzZXJ2ZV9kYXRhID0gdGhpcy5nZXRUcmVhc3VyZUluaXREYXRhKHZhbCk7XG4gICAgICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGogaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgdmFyIF9ib29sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGsgaW4gc2VydmVfZGF0YS5sdWNreV9hd2FyZCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbal0uaWQgPT0gc2VydmVfZGF0YS5sdWNreV9hd2FyZFtrXS5sdWNreSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoc2VydmVfZGF0YS5sdWNreSA8IGRhdGFbal0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICAgICAgX2Jvb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihfYm9vbCA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRMdWNrbHlUYWJSZWRQb2ludCh2YWwsc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24ubHVja3lfdHJlYXN1cmUsIHRoaXMudGFiX3JlZHBvaW50WzFdIHx8IHRoaXMudGFiX3JlZHBvaW50WzJdKTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5bm46L+Q5o6i5a6d6aG1562+57qi54K5XG4gICAgc2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgsc3RhdHVzKXtcbiAgICAgICAgdGhpcy50YWJfcmVkcG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG4gICAgXG4gICAgZ2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZih0aGlzLnRhYl9yZWRwb2ludCAmJiB0aGlzLnRhYl9yZWRwb2ludFtpbmRleF0pe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFiX3JlZHBvaW50W2luZGV4XTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBnZXRGdW5kUmVkU3RhdHVzQnlCaWQoIGJpZCApe1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5kX3JlZF9saXN0W2JpZF1cbiAgICB9LFxuXG5cbiAgICAvL+adgui0p+mTuuaVsOaNrlxuICAgIHNldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhID0ge307XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB2ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhW3YuaWRdPSB2O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oaWQpe1xuICAgICAgICBpZih0aGlzLnN0b25lX3Nob3BfZGF0YSAmJiB0aGlzLnN0b25lX3Nob3BfZGF0YVtpZF0gIT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9uZV9zaG9wX2RhdGFbaWRdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS3mr4/ml6XnuqLngrnku4XmmL7npLrkuIDmrKEtLS0tLS0tLS0tLVxuICAgIHVwZGF0ZUdpZnRSZWRQb2ludFN0YXR1czpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGJpZCA9IGRhdGEuYmlkO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdCA9IHRoaXMuZ2lmdF9pZF9saXN0IHx8IFtdO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0R2lmdFJlZFN0YXR1c0J5QmlkOmZ1bmN0aW9uKGJpZCl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRfaWRfbGlzdClyZXR1cm47XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5naWZ0X2lkX2xpc3RbYmlkXTtcbiAgICAgICAgaWYobGlzdCl7XG4gICAgICAgICAgICByZXR1cm4gbGlzdC5zdGF0dXNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRHaWZ0UmVkU3RhdHVzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZighdGhpcy5naWZ0X2lkX2xpc3QpcmV0dXJuO1xuICAgICAgICB2YXIgYmlkID0gZGF0YS5iaWQ7XG4gICAgICAgIHZhciBzdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdO1xuICAgICAgICBpZihsaXN0ICYmIGxpc3Quc3RhdHVzICE9IHN0YXR1cyl7XG4gICAgICAgICAgICBsaXN0LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5ULCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIHVwZGF0YUZlc3R2YWxSZWRTdGF0dXMoYmlkLGRhdGEpe1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IHRoaXMuZ2V0UmVkUG9pbnRTdGF0dXMoZGF0YSlcbiAgICAgICAgbGV0IGZlc3R2YWxfYmlkID0gTWFpbnVpQ29uc3QuaWNvbi5mZXN0dmFsXG4gICAgICAgIGlmKGJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5mZXN0dmFsX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9zcHJpbmdcbiAgICAgICAgfWVsc2UgaWYoYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLmxvdmVyX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9sb3ZlclxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoZmVzdHZhbF9iaWQsIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICBnZXRSZWRQb2ludFN0YXR1cyhkYXRhKXtcbiAgICAgICAgaWYoIWRhdGEpICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByZWRfc3RhdHVzID0gZmFsc2UgXG4gICAgICAgIGZvcihsZXQgaz0wO2s8ZGF0YS5sZW5ndGg7KytrKXtcbiAgICAgICAgICAgIGxldCB2ID0gZGF0YVtrXVxuICAgICAgICAgICAgaWYodi5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWUgXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkX3N0YXR1c1xuICAgIH0sXG4gICAgdXBkYXRhQ29tYmluZUxvZ2luUmVkU3RhdHVzKGRhdGEpe1xuICAgICAgICBpZighZGF0YSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlIFxuICAgICAgICBmb3IobGV0IGs9MDtrPGRhdGEubGVuZ3RoOysrayl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFba11cbiAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlIFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLmNvbWJpbmVfbG9naW4sIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICB1cGRhdGFQcmVmZXJlbnRpYWxSZWRTdGF0dXMoIHN0YXR1cywgaWQgKXtcbiAgICAgICAgaWYodHJ1ZSkgIHJldHVybjsgIC8v5pqC5pe25bGP6JS95o6JIOS4jemcgOimgVxuXG4gICAgICAgIC8vIGlkID0gaWQgb3IgTWFpbnVpQ29uc3QuaWNvbi5wcmVmZXJlbnRpYWxcbiAgICAgICAgLy8gaWYgc3RhdHVzIHRoZW5cbiAgICAgICAgLy8gICAgIGlmIHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWcgPT0gbmlsIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnID0ge31cbiAgICAgICAgLy8gICAgIGVuZFxuICAgICAgICAvLyAgICAgaWYgbm90IHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWdbaWRdIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnW2lkXSA9IHRydWVcbiAgICAgICAgLy8gICAgIGVsc2VcbiAgICAgICAgLy8gICAgICAgICBzdGF0dXMgPSBmYWxzZVxuICAgICAgICAvLyAgICAgZW5kXG4gICAgICAgIC8vIGVuZFxuICAgICAgICAvLyBNYWludWlDb250cm9sbGVyOmdldEluc3RhbmNlKCk6c2V0RnVuY3Rpb25UaXBzU3RhdHVzKGlkLCBzdGF0dXMpXG4gICAgfSxcbiAgICBjbGVhckZ1bmRTcnZEYXRhKCAgKXtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0ge31cbiAgICB9XG59KTsiXX0=