|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildskill/guildskill_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, '8fcedmpqCNCGZm7xYbxB3ZO', 'guildskill_model');
|
// Scripts/mod/guildskill/guildskill_model.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-01-19 17:37:33
|
// --------------------------------------------------------------------
|
var GuildskillConst = require("guildskill_const");
|
|
var GuildskillEvent = require("guildskill_event");
|
|
var RoleController = require("role_controller");
|
|
var BackpackController = require("backpack_controller");
|
|
var GuildConst = require("guild_const");
|
|
var MainuiConst = require("mainui_const");
|
|
var MainuiController = require("mainui_controller");
|
|
var GuildEvent = require("guild_event");
|
|
var GuildskillModel = cc.Class({
|
"extends": BaseClass,
|
ctor: function ctor() {
|
this.ctrl = require("guildskill_controller").getInstance();
|
this.initConfig();
|
},
|
properties: {},
|
initConfig: function initConfig() {
|
this.career_skill_list = {};
|
this.skill_wait_upgrade_list = {};
|
this.skill_upgrade_cost_list = {};
|
this.skill_red_status_list = {};
|
this.had_send_mainui = false;
|
this.had_close_mainui = false;
|
},
|
clearGuildCareerSkill: function clearGuildCareerSkill() {
|
this.career_skill_list = {};
|
this.skill_wait_upgrade_list = {};
|
this.skill_upgrade_cost_list = {};
|
this.skill_red_status_list = {};
|
},
|
initGuildCareerSkill: function initGuildCareerSkill(data) {
|
if (data == null || data.group_id == null) return;
|
var config = Config.guild_skill_data.data_info_group[data.group_id];
|
if (config == null) cc.log("公会技能配置数据有问题,技能组id为:", data.group_id);else {
|
var object = {};
|
object.career = data.career; // 当前职业
|
|
object.group_id = data.group_id; // 当前激活的技能组
|
|
object.group_ids = data.group_ids; // 已经激活的技能组
|
|
object.skill_ids = []; // 当前技能组的技能状态
|
|
for (var i in config) {
|
var v = config[i];
|
object.skill_ids.push({
|
id: v.id,
|
index: v.seq,
|
status: GuildskillConst.status.un_activity
|
});
|
}
|
|
for (var i in data.skill_ids) {
|
var v = data.skill_ids[i];
|
|
for (var n in object.skill_ids) {
|
var item = object.skill_ids[n];
|
|
if (v.skill_id == item.id) {
|
item.status = GuildskillConst.status.activity;
|
break;
|
}
|
}
|
} //对技能顺序做一个排序吧,主要是担心策划配置不是按照正常顺序来
|
|
|
if (Utils.next(object.skill_ids)) {
|
object.skill_ids.sort(function (a, b) {
|
return a.index < b.index;
|
});
|
}
|
|
this.career_skill_list[data.career] = object;
|
gcore.GlobalEvent.fire(GuildskillEvent.UpdateGuildSkillEvent, data.career);
|
}
|
},
|
//获取指定职业的技能信息
|
getCareerSkillInfo: function getCareerSkillInfo(career) {
|
return this.career_skill_list[career];
|
},
|
//激活指定职业的技能信息
|
updateGuildCareerSkill: function updateGuildCareerSkill(career, skill_id) {
|
if (career == null || skill_id == null) return;
|
var object = this.career_skill_list[career];
|
|
if (object && object.skill_ids) {
|
for (var i in object.skill_ids) {
|
var item = object.skill_ids[i];
|
|
if (item.id == skill_id) {
|
item.status = GuildskillConst.status.activity;
|
break;
|
}
|
} //升级之后,这边做一次保存当前待升级的技能id
|
|
|
var red_skill_id = 0;
|
|
for (var k in object.skill_ids) {
|
var v = object.skill_ids[k];
|
|
if (v.status == GuildskillConst.status.un_activity) {
|
red_skill_id = v.id;
|
break;
|
}
|
}
|
|
this.updateGuildSkillStatus(career, red_skill_id);
|
gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkillStatusEvent, career, skill_id);
|
}
|
},
|
//升级指定职业的技能组,这个时候默认该技能组技能都未激活
|
upgradeGuildCareerSkill: function upgradeGuildCareerSkill(career, group_id) {
|
if (career == null || group_id == null) return;
|
var object = this.career_skill_list[career];
|
|
if (object == null) {
|
object = {};
|
object.group_ids = [];
|
this.career_skill_list[career] = object;
|
}
|
|
if (object.group_ids) {
|
object.group_ids.push({
|
group_id: object.group_id
|
});
|
}
|
|
object.career = career;
|
|
if (object.group_id != group_id) {
|
object.group_id = group_id;
|
object.skill_ids = [];
|
var config = Config.guild_skill_data.data_info_group[group_id];
|
|
if (config == null) {
|
cc.log("更新技能组出错,配置数据有问题,技能组id为:", group_id);
|
return;
|
}
|
|
for (var i in config) {
|
var v = config[i];
|
object.skill_ids.push({
|
id: v.id,
|
index: v.seq,
|
status: GuildskillConst.status.un_activity
|
});
|
}
|
|
if (Utils.next(object.skill_ids)) {
|
object.skill_ids.sort(function (a, b) {
|
return a.index < b.index;
|
});
|
}
|
} //升级之后,这边做一次保存当前待升级的技能id
|
|
|
var skill_id = 0;
|
|
for (var k in object.skill_ids) {
|
var v = object.skill_ids[k];
|
|
if (v.status == GuildskillConst.status.un_activity) {
|
skill_id = v.id;
|
break;
|
}
|
}
|
|
this.updateGuildSkillStatus(career, skill_id);
|
gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkilUpgradeEvent, career, group_id);
|
},
|
//获取当前技能组上线
|
getCareerGroupMax: function getCareerGroupMax(career) {
|
career = career || GuildskillConst.index.physics;
|
if (this.career_group_max == null) this.career_group_max = {};
|
|
if (this.career_group_max[career] == null) {
|
var config = gdata("guild_skill_data", "data_career_list", [career]);
|
|
if (config) {
|
this.career_group_max[career] = config.length;
|
} else {
|
this.career_group_max[career] = 0;
|
}
|
}
|
|
return this.career_group_max[career];
|
},
|
//公会技能的初始化红点状态
|
initGuildSkillStatus: function initGuildSkillStatus(data) {
|
if (data && data.outline) {
|
this.skill_wait_upgrade_list = {};
|
|
for (var i in data.outline) {
|
var v = data.outline[i];
|
this.skill_wait_upgrade_list[v.career] = v.skill_id;
|
}
|
}
|
|
this.checkGuildSkillRedStatus();
|
},
|
//更新当前技能
|
updateGuildSkillStatus: function updateGuildSkillStatus(career, skill_id) {
|
if (this.skill_wait_upgrade_list == null) this.skill_wait_upgrade_list = {};
|
this.skill_wait_upgrade_list[career] = skill_id;
|
this.checkGuildSkillRedStatus();
|
},
|
//公会技能红点的算法更新
|
checkGuildSkillRedStatus: function checkGuildSkillRedStatus() {
|
if (this.skill_wait_upgrade_list == null || Utils.next(this.skill_wait_upgrade_list) == null) return;
|
RedMgr.getInstance().addCalHandler(function () {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
var backpack_model = BackpackController.getInstance().getModel();
|
var red_list = {};
|
|
for (var k in this.skill_wait_upgrade_list) {
|
var skill_id = this.skill_wait_upgrade_list[k];
|
var config = gdata("guild_skill_data", "data_info", [skill_id]);
|
|
if (config) {
|
red_list[k] = true;
|
|
if (config.guild_lev > role_vo.guild_lev) {
|
red_list[k] = false;
|
} else {
|
for (var i in config.loss || {}) {
|
var v = config.loss[i];
|
|
if (v[0] != null && v[1] != null) {
|
var bid = v[0];
|
var num = v[1];
|
var assert = Config.item_data.data_assets_id2label[bid];
|
|
if (assert) {
|
if (num > role_vo[assert]) {
|
red_list[k] = false;
|
break;
|
}
|
} else {
|
var sum = backpack_model.getBackPackItemNumByBid(bid);
|
|
if (num > sum) {
|
red_list[k] = false;
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
for (var k in red_list) {
|
var id = this.getCareerKey(k);
|
this.updateGuildRedStatus(id, red_list[k]);
|
}
|
}.bind(this), RedIds.GuildSkill);
|
},
|
//设置一个唯一id吧, 跟 guildconst.skill_2 ,3 ,4 ,5对应
|
getCareerKey: function getCareerKey(career) {
|
career = career || GuildskillConst.index.physics;
|
if (career == GuildskillConst.index.magic) return GuildConst.red_index.skill_2;else if (career == GuildskillConst.index.physics) return GuildConst.red_index.skill_3;else if (career == GuildskillConst.index.defence) return GuildConst.red_index.skill_4;else if (career == GuildskillConst.index.assist) return GuildConst.red_index.skill_5;else return GuildConst.red_index.skill_3;
|
},
|
//清楚主界面上面的红点
|
clearGuildSkillIconRed: function clearGuildSkillIconRed() {
|
if (this.had_close_mainui == true) return;
|
this.had_close_mainui = true;
|
var is_red = false;
|
|
for (var k in this.skill_red_status_list) {
|
var v = this.skill_red_status_list[k];
|
|
if (v == true) {
|
is_red = true;
|
break;
|
}
|
}
|
|
if (is_red == true) {
|
var data = [{
|
bid: GuildConst.red_index.skill_2,
|
status: false
|
}, {
|
bid: GuildConst.red_index.skill_3,
|
status: false
|
}, {
|
bid: GuildConst.red_index.skill_4,
|
status: false
|
}, {
|
bid: GuildConst.red_index.skill_5,
|
status: false
|
}];
|
MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, data);
|
}
|
},
|
//更新公会技能红点
|
updateGuildRedStatus: function updateGuildRedStatus(bid, status) {
|
var base_data = Config.function_data.data_base;
|
var bool = MainuiController.getInstance().checkIsOpenByActivate(base_data[6].activate);
|
if (bool == false) return;
|
var _status = this.skill_red_status_list[bid];
|
if (_status == status) return;
|
this.skill_red_status_list[bid] = status; //更新场景红点状态,只在登录的时候提示一次
|
|
if (this.had_send_mainui == false) {
|
this.had_send_mainui = true;
|
MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
|
bid: bid,
|
status: status
|
});
|
} //事件用于同步更新公会主ui的红点
|
|
|
gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, bid, status);
|
},
|
getRedStatus: function getRedStatus(career) {
|
var id = this.getCareerKey(career);
|
return this.skill_red_status_list[id];
|
},
|
getRedTotalStatus: function getRedTotalStatus() {
|
for (var k in this.skill_red_status_list) {
|
var _status = this.skill_red_status_list[k];
|
if (_status == true) return true;
|
}
|
|
return false;
|
},
|
// --获取各职业的公会技能等级
|
getCareerSkillLevel: function getCareerSkillLevel(career) {
|
if (this.career_skill_list[career]) {
|
var skill_ids = this.career_skill_list[career].skill_ids;
|
var count = this.career_skill_list[career].group_ids.length * 6;
|
|
for (var i = 0; i < skill_ids.length; ++i) {
|
var v = skill_ids[i];
|
|
if (v.status == GuildskillConst.status.activity) {
|
count = count + 1;
|
}
|
}
|
|
return count;
|
}
|
|
return -1;
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHNraWxsXFxndWlsZHNraWxsX21vZGVsLmpzIl0sIm5hbWVzIjpbIkd1aWxkc2tpbGxDb25zdCIsInJlcXVpcmUiLCJHdWlsZHNraWxsRXZlbnQiLCJSb2xlQ29udHJvbGxlciIsIkJhY2twYWNrQ29udHJvbGxlciIsIkd1aWxkQ29uc3QiLCJNYWludWlDb25zdCIsIk1haW51aUNvbnRyb2xsZXIiLCJHdWlsZEV2ZW50IiwiR3VpbGRza2lsbE1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJpbml0Q29uZmlnIiwicHJvcGVydGllcyIsImNhcmVlcl9za2lsbF9saXN0Iiwic2tpbGxfd2FpdF91cGdyYWRlX2xpc3QiLCJza2lsbF91cGdyYWRlX2Nvc3RfbGlzdCIsInNraWxsX3JlZF9zdGF0dXNfbGlzdCIsImhhZF9zZW5kX21haW51aSIsImhhZF9jbG9zZV9tYWludWkiLCJjbGVhckd1aWxkQ2FyZWVyU2tpbGwiLCJpbml0R3VpbGRDYXJlZXJTa2lsbCIsImRhdGEiLCJncm91cF9pZCIsImNvbmZpZyIsIkNvbmZpZyIsImd1aWxkX3NraWxsX2RhdGEiLCJkYXRhX2luZm9fZ3JvdXAiLCJsb2ciLCJvYmplY3QiLCJjYXJlZXIiLCJncm91cF9pZHMiLCJza2lsbF9pZHMiLCJpIiwidiIsInB1c2giLCJpZCIsImluZGV4Iiwic2VxIiwic3RhdHVzIiwidW5fYWN0aXZpdHkiLCJuIiwiaXRlbSIsInNraWxsX2lkIiwiYWN0aXZpdHkiLCJVdGlscyIsIm5leHQiLCJzb3J0IiwiYSIsImIiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZUd1aWxkU2tpbGxFdmVudCIsImdldENhcmVlclNraWxsSW5mbyIsInVwZGF0ZUd1aWxkQ2FyZWVyU2tpbGwiLCJyZWRfc2tpbGxfaWQiLCJrIiwidXBkYXRlR3VpbGRTa2lsbFN0YXR1cyIsIlVwZGF0ZVNraWxsU3RhdHVzRXZlbnQiLCJ1cGdyYWRlR3VpbGRDYXJlZXJTa2lsbCIsIlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQiLCJnZXRDYXJlZXJHcm91cE1heCIsInBoeXNpY3MiLCJjYXJlZXJfZ3JvdXBfbWF4IiwiZ2RhdGEiLCJsZW5ndGgiLCJpbml0R3VpbGRTa2lsbFN0YXR1cyIsIm91dGxpbmUiLCJjaGVja0d1aWxkU2tpbGxSZWRTdGF0dXMiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsImJhY2twYWNrX21vZGVsIiwiZ2V0TW9kZWwiLCJyZWRfbGlzdCIsImd1aWxkX2xldiIsImxvc3MiLCJiaWQiLCJudW0iLCJhc3NlcnQiLCJpdGVtX2RhdGEiLCJkYXRhX2Fzc2V0c19pZDJsYWJlbCIsInN1bSIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwiZ2V0Q2FyZWVyS2V5IiwidXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaW5kIiwiUmVkSWRzIiwiR3VpbGRTa2lsbCIsIm1hZ2ljIiwicmVkX2luZGV4Iiwic2tpbGxfMiIsInNraWxsXzMiLCJkZWZlbmNlIiwic2tpbGxfNCIsImFzc2lzdCIsInNraWxsXzUiLCJjbGVhckd1aWxkU2tpbGxJY29uUmVkIiwiaXNfcmVkIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJndWlsZCIsImJhc2VfZGF0YSIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJib29sIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwiYWN0aXZhdGUiLCJfc3RhdHVzIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJnZXRSZWRTdGF0dXMiLCJnZXRSZWRUb3RhbFN0YXR1cyIsImdldENhcmVlclNraWxsTGV2ZWwiLCJjb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJ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LEVBQW1DO0FBQy9CLFlBQUlDLENBQUMsR0FBR0YsU0FBUyxDQUFDQyxDQUFELENBQWpCOztBQUNBLFlBQUdDLENBQUMsQ0FBQ0ssTUFBRixJQUFZM0MsZUFBZSxDQUFDMkMsTUFBaEIsQ0FBdUJLLFFBQXRDLEVBQStDO0FBQzNDdUUsVUFBQUEsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBaEI7QUFDSDtBQUNKOztBQUNELGFBQU9BLEtBQVA7QUFDSDs7QUFDRCxXQUFPLENBQUMsQ0FBUjtBQUNIO0FBalUwQixDQUFULENBQXRCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAxLTE5IDE3OjM3OjMzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEd1aWxkc2tpbGxDb25zdCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2NvbnN0XCIpO1xudmFyIEd1aWxkc2tpbGxFdmVudCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2V2ZW50XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZENvbnN0ID0gcmVxdWlyZShcImd1aWxkX2NvbnN0XCIpO1xudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWxkRXZlbnQgPSByZXF1aXJlKFwiZ3VpbGRfZXZlbnRcIik7XG5cbnZhciBHdWlsZHNraWxsTW9kZWwgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jdHJsID0gcmVxdWlyZShcImd1aWxkc2tpbGxfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3VwZ3JhZGVfY29zdF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0ID0ge307XG5cbiAgICAgICAgdGhpcy5oYWRfc2VuZF9tYWludWkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYWRfY2xvc2VfbWFpbnVpID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNsZWFyR3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhcmVlcl9za2lsbF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF91cGdyYWRlX2Nvc3RfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdCA9IHt9O1xuICAgIH0sXG5cbiAgICBpbml0R3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmdyb3VwX2lkID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtkYXRhLmdyb3VwX2lkXTtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKVxuICAgICAgICAgICAgY2MubG9nKFwi5YWs5Lya5oqA6IO96YWN572u5pWw5o2u5pyJ6Zeu6aKY77yM5oqA6IO957uEaWTkuLrvvJpcIiwgZGF0YS5ncm91cF9pZCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0LmNhcmVlciA9IGRhdGEuY2FyZWVyICAgICAgICAgICAgICAgICAvLyDlvZPliY3ogYzkuJpcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZCA9IGRhdGEuZ3JvdXBfaWQgICAgICAgICAgICAgLy8g5b2T5YmN5r+A5rS755qE5oqA6IO957uEXG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWRzID0gZGF0YS5ncm91cF9pZHMgICAgICAgICAgIC8vIOW3sue7j+a/gOa0u+eahOaKgOiDvee7hFxuICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3mioDog73nu4TnmoTmioDog73nirbmgIFcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnB1c2goeyBpZDogdi5pZCwgaW5kZXg6IHYuc2VxLCBzdGF0dXM6IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGRhdGEuc2tpbGxfaWRzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG9iamVjdC5za2lsbF9pZHNbbl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LnNraWxsX2lkID09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID0gR3VpbGRza2lsbENvbnN0LnN0YXR1cy5hY3Rpdml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+WvueaKgOiDvemhuuW6j+WBmuS4gOS4quaOkuW6j+WQp++8jOS4u+imgeaYr+aLheW/g+etluWIkumFjee9ruS4jeaYr+aMieeFp+ato+W4uOmhuuW6j+adpVxuICAgICAgICAgICAgaWYgKFV0aWxzLm5leHQob2JqZWN0LnNraWxsX2lkcykpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggPCBiLmluZGV4XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbZGF0YS5jYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHNraWxsRXZlbnQuVXBkYXRlR3VpbGRTa2lsbEV2ZW50LCBkYXRhLmNhcmVlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ojrflj5bmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICBnZXRDYXJlZXJTa2lsbEluZm86IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXTtcbiAgICB9LFxuXG4gICAgLy/mv4DmtLvmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICB1cGRhdGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBza2lsbF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgc2tpbGxfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gb2JqZWN0LnNraWxsX2lkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSBza2lsbF9pZCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0YXR1cyA9IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICAgICAgdmFyIHJlZF9za2lsbF9pZCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IG9iamVjdC5za2lsbF9pZHNba107XG4gICAgICAgICAgICAgICAgaWYgKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVkX3NraWxsX2lkID0gdi5pZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCByZWRfc2tpbGxfaWQpO1xuXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkc2tpbGxFdmVudC5VcGRhdGVTa2lsbFN0YXR1c0V2ZW50LCBjYXJlZXIsIHNraWxsX2lkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WNh+e6p+aMh+WumuiBjOS4mueahOaKgOiDvee7hO+8jOi/meS4quaXtuWAmem7mOiupOivpeaKgOiDvee7hOaKgOiDvemDveacqua/gOa0u1xuICAgIHVwZ3JhZGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBncm91cF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgZ3JvdXBfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0Lmdyb3VwX2lkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iamVjdC5ncm91cF9pZHMpIHtcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZHMucHVzaCh7IGdyb3VwX2lkOiBvYmplY3QuZ3JvdXBfaWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3QuY2FyZWVyID0gY2FyZWVyO1xuICAgICAgICBpZiAob2JqZWN0Lmdyb3VwX2lkICE9IGdyb3VwX2lkKSB7XG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWQgPSBncm91cF9pZDtcbiAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMgPSBbXTtcblxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtncm91cF9pZF07XG4gICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLmm7TmlrDmioDog73nu4Tlh7rplJnvvIzphY3nva7mlbDmja7mnInpl67popjvvIzmioDog73nu4RpZOS4uu+8mlwiLCBncm91cF9pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcy5wdXNoKHsgaWQ6IHYuaWQsIGluZGV4OiB2LnNlcSwgc3RhdHVzOiBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoVXRpbHMubmV4dChvYmplY3Quc2tpbGxfaWRzKSkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCA8IGIuaW5kZXhcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICB2YXIgc2tpbGxfaWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIHZhciB2ID0gb2JqZWN0LnNraWxsX2lkc1trXTtcbiAgICAgICAgICAgIGlmICh2LnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5KSB7XG4gICAgICAgICAgICAgICAgc2tpbGxfaWQgPSB2LmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCBza2lsbF9pZCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRza2lsbEV2ZW50LlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQsIGNhcmVlciwgZ3JvdXBfaWQpO1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluW9k+WJjeaKgOiDvee7hOS4iue6v1xuICAgIGdldENhcmVlckdyb3VwTWF4OiBmdW5jdGlvbiAoY2FyZWVyKSB7XG4gICAgICAgIGNhcmVlciA9IGNhcmVlciB8fCBHdWlsZHNraWxsQ29uc3QuaW5kZXgucGh5c2ljcztcbiAgICAgICAgaWYgKHRoaXMuY2FyZWVyX2dyb3VwX21heCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4ID0ge307XG4gICAgICAgIGlmICh0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZ2RhdGEoXCJndWlsZF9za2lsbF9kYXRhXCIsIFwiZGF0YV9jYXJlZXJfbGlzdFwiLCBbY2FyZWVyXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4W2NhcmVlcl0gPSBjb25maWcubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX2dyb3VwX21heFtjYXJlZXJdO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDveeahOWIneWni+WMlue6oueCueeKtuaAgVxuICAgIGluaXRHdWlsZFNraWxsU3RhdHVzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm91dGxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5vdXRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhLm91dGxpbmVbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdFt2LmNhcmVlcl0gPSB2LnNraWxsX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tHdWlsZFNraWxsUmVkU3RhdHVzKCk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5b2T5YmN5oqA6IO9XG4gICAgdXBkYXRlR3VpbGRTa2lsbFN0YXR1cyhjYXJlZXIsIHNraWxsX2lkKSB7XG4gICAgICAgIGlmICh0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3RbY2FyZWVyXSA9IHNraWxsX2lkO1xuICAgICAgICB0aGlzLmNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1cygpO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDvee6oueCueeahOeul+azleabtOaWsFxuICAgIGNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIHZhciBiYWNrcGFja19tb2RlbCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgICAgICB2YXIgcmVkX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9pZCA9IHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3Rba107XG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfc2tpbGxfZGF0YVwiLCBcImRhdGFfaW5mb1wiLCBbc2tpbGxfaWRdKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5ndWlsZF9sZXYgPiByb2xlX3ZvLmd1aWxkX2xldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX2xpc3Rba10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnLmxvc3MgfHwge30pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZy5sb3NzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2WzBdICE9IG51bGwgJiYgdlsxXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSB2WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydCA9IENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfaWQybGFiZWxbYmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHJvbGVfdm9bYXNzZXJ0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdW0gPSBiYWNrcGFja19tb2RlbC5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHN1bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcmVkX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShrKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKGlkLCByZWRfbGlzdFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgUmVkSWRzLkd1aWxkU2tpbGwpXG4gICAgfSxcblxuICAgIC8v6K6+572u5LiA5Liq5ZSv5LiAaWTlkKcsIOi3nyBndWlsZGNvbnN0LnNraWxsXzIgLDMgLDQgLDXlr7nlupRcbiAgICBnZXRDYXJlZXJLZXk6IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgY2FyZWVyID0gY2FyZWVyIHx8IEd1aWxkc2tpbGxDb25zdC5pbmRleC5waHlzaWNzO1xuICAgICAgICBpZiAoY2FyZWVyID09IEd1aWxkc2tpbGxDb25zdC5pbmRleC5tYWdpYylcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yO1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LnBoeXNpY3MpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfM1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmRlZmVuY2UpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfNFxuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmFzc2lzdClcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF81XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zXG5cbiAgICB9LFxuXG4gICAgLy/muIXmpZrkuLvnlYzpnaLkuIrpnaLnmoTnuqLngrlcbiAgICBjbGVhckd1aWxkU2tpbGxJY29uUmVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhZF9jbG9zZV9tYWludWkgPT0gdHJ1ZSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aGlzLmhhZF9jbG9zZV9tYWludWkgPSB0cnVlO1xuICAgICAgICB2YXIgaXNfcmVkID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3Rba107XG4gICAgICAgICAgICBpZiAodiA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNfcmVkID09IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yLCBzdGF0dXM6IGZhbHNlIH0sIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzQsIHN0YXR1czogZmFsc2UgfSwgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzUsIHN0YXR1czogZmFsc2UgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5YWs5Lya5oqA6IO957qi54K5XG4gICAgdXBkYXRlR3VpbGRSZWRTdGF0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xuICAgICAgICB2YXIgYmFzZV9kYXRhID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9iYXNlO1xuICAgICAgICB2YXIgYm9vbCA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzT3BlbkJ5QWN0aXZhdGUoYmFzZV9kYXRhWzZdLmFjdGl2YXRlKTtcbiAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdFtiaWRdO1xuICAgICAgICBpZiAoX3N0YXR1cyA9PSBzdGF0dXMpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbYmlkXSA9IHN0YXR1cztcblxuICAgICAgICAvL+abtOaWsOWcuuaZr+e6oueCueeKtuaAgSzlj6rlnKjnmbvlvZXnmoTml7blgJnmj5DnpLrkuIDmrKFcbiAgICAgICAgaWYgKHRoaXMuaGFkX3NlbmRfbWFpbnVpID09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhZF9zZW5kX21haW51aSA9IHRydWU7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkLCB7IGJpZDogYmlkLCBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5LqL5Lu255So5LqO5ZCM5q2l5pu05paw5YWs5Lya5Li7dWnnmoTnuqLngrlcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIGdldFJlZFN0YXR1czogZnVuY3Rpb24gKGNhcmVlcikge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShjYXJlZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbaWRdO1xuICAgIH0sXG5cbiAgICBnZXRSZWRUb3RhbFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0KSB7XG4gICAgICAgICAgICB2YXIgX3N0YXR1cyA9IHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0W2tdO1xuICAgICAgICAgICAgaWYgKF9zdGF0dXMgPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgLy8gLS3ojrflj5blkITogYzkuJrnmoTlhazkvJrmioDog73nrYnnuqdcbiAgICBnZXRDYXJlZXJTa2lsbExldmVsKGNhcmVlcil7XG4gICAgICAgIGlmKHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXSl7XG4gICAgICAgICAgICBsZXQgc2tpbGxfaWRzID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLnNraWxsX2lkc1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLmdyb3VwX2lkcy5sZW5ndGggKiA2XG4gICAgICAgICAgICBmb3IobGV0IGk9MDtpPHNraWxsX2lkcy5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IHNraWxsX2lkc1tpXVxuICAgICAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHkpe1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb3VudFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMVxuICAgIH1cbn0pOyJdfQ==
|