| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535 |
- (function() {
- var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
- var __module = nodeEnv ? module : {exports:{}};
- var __filename = 'preview-scripts/assets/script/game/component/TableView.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, '9a31drXM+9NCKYkF9D78zlF', 'TableView');
- // script/game/component/TableView.ts
- "use strict";
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
- /** 动态加载的滚动列表
- * - 滑动列表动态加载
- * - 支持多种类型预制体混合滚动
- * - item脚本需要有函数 setItemData 用于接收数据
- * - 多个prefab混合时,要为每条item指定 pfbType
- * - item、content锚点y需要为1其他为0.5
- * @author 薛鸿潇
- */
- var TableView = /** @class */ (function (_super) {
- __extends(TableView, _super);
- function TableView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.pre_item = [];
- /** 间距 */
- _this.itemInterval = 0;
- /** 数据 */
- _this.itemData = null;
- /** 滚动列表组件 */
- _this.scrollView = null;
- /** item预制体组 */
- _this.item = null;
- /** 滑动列表的内容节点 */
- _this.content = null;
- /** 列表高 */
- _this.layerHeight = null;
- /** ? */
- _this.firstItemIndex = 0;
- _this.lastItemIndex = 0;
- _this.firstItemData = {};
- _this.lastItemData = {};
- _this.itemArr = [];
- _this.itemNode = [];
- _this.itemPosMap = new Map();
- _this.initItemData = true;
- _this.count = 0;
- _this.itemCanMoveDown = null;
- _this.itemCanMoveUp = null;
- _this.lastResetItemInfoHeight = null;
- _this.lastResetItemIndex = null;
- return _this;
- }
- TableView.prototype.onLoad = function () {
- this.initPro();
- // 测试
- // let itemData = [];
- // for (let i = 0; i < 20; i++) {
- // let test_data = {
- // pfbType: 0,
- // }
- // itemData.push(test_data);
- // }
- // this.init(itemData);
- };
- TableView.prototype.initPro = function () {
- this.scrollView = this.node.getComponent(cc.ScrollView);
- this.content = this.scrollView.content;
- this.item = this.pre_item;
- this.layerHeight = this.node.height;
- for (var i = 0; i < this.item.length; i++) {
- this.itemNode[i] = cc.instantiate(this.item[i]);
- }
- this.node.on('srollview-init', this.init, this);
- };
- /**
- * @param itemData 列表数据
- * @param isSkipInit 跳过初始化
- * @returns
- */
- TableView.prototype.init = function (itemData, isSkipInit) {
- if (isSkipInit === void 0) { isSkipInit = false; }
- if (!itemData[0]) {
- return false;
- }
- this.itemData = itemData; //item数据
- this.firstItemIndex = 0;
- this.lastItemIndex = 0;
- this.firstItemData = {};
- this.lastItemData = {};
- this.itemArr = [];
- this.itemPosMap = new Map();
- this.initItemData = true;
- this.count = 0;
- if (isSkipInit)
- return;
- // this.itemNode = [];
- // for (let i = 0; i < this.item.length; i++) {
- // this.itemNode[i] = cc.instantiate(this.item[i]);
- // }
- // cc.log(this.testTime(0));// 消耗计时
- this.initItem();
- this.getItemPos(0);
- this.scrollView.node.on('scrolling', this.callback, this);
- // cc.log('tableView结束:' + this.testTime());
- };
- /**
- * 刷新列表
- * 仅更新data数据
- */
- TableView.prototype.updateList = function () {
- };
- TableView.prototype.getItemPos = function (index) {
- var item_data_count = this.itemData.length;
- for (var i = index; i < item_data_count; i++) {
- var obj = {};
- var y = void 0;
- if (i === 0) {
- obj.startPos = 0;
- }
- else {
- obj.startPos = this.itemPosMap.get(i - 1).endPos;
- }
- var j = this.itemData[i].pfbType || 0;
- obj.endPos = obj.startPos + this.itemNode[j].height + this.itemInterval;
- this.itemPosMap.set(i, obj);
- }
- if (item_data_count > 0) {
- this.updateContentHeigh(this.itemPosMap.get(item_data_count - 1).endPos);
- }
- };
- /**
- * 实例化所有用到的item,控制实例化item的数目,暂定超出两个
- */
- TableView.prototype.initItem = function () {
- var j = 0;
- for (var i = 0; i < this.itemData.length; i++) {
- if (this.content.height > this.layerHeight) {
- j++;
- if (j > 2) {
- break;
- }
- }
- var y = 0;
- if (i > 0) {
- y = this.itemArr[i - 1].y - this.itemArr[i - 1].height - this.itemInterval; // 下一条目纵坐标
- }
- this.addItemNode(i, y);
- this.updateContentHeigh(this.itemArr[i].height - y);
- }
- };
- /**
- * 添加条目节点
- * @param i 编号
- * @param y 坐标y
- */
- TableView.prototype.addItemNode = function (i, y) {
- var pfbType = this.itemData[i].pfbType || 0;
- var item = cc.instantiate(this.itemNode[pfbType]);
- item.parent = this.content;
- item.pfbType = pfbType;
- item.index = i;
- if (i === 0) {
- item.y = 0;
- }
- else {
- item.y = y;
- }
- item.x = 0;
- //对item赋值
- var comp_script = item.getComponent(item.name);
- comp_script && comp_script.setItemData(this.itemData[i], this);
- this.itemArr.push(item);
- // cc.log('生成itemNode' + i);
- };
- /**
- * 更新centent高
- * @param num
- */
- TableView.prototype.updateContentHeigh = function (num) {
- this.content.height = num > this.layerHeight ? num : this.layerHeight;
- // cc.log('滚动条高度:', this.content.height);
- };
- /**
- * 触摸滚动条的函数回调
- * @param event
- * @param eventType
- * @returns
- */
- TableView.prototype.callback = function (event, eventType) {
- // cc.log(event && event.type || eventType)
- if (this.content.height > this.layerHeight) {
- var firstItemPos = this.scrollView.getScrollOffset().y;
- var lastItemPos = firstItemPos + this.layerHeight;
- if (firstItemPos < 0)
- return;
- if (this.initItemData) {
- // cc.log('111:%o', this.itemPosMap)
- this.initItemData = false;
- this.updateFirstItemIndex();
- this.itemCanMoveDown = true;
- this.updateLastItemIndex();
- this.itemCanMoveDown = false;
- }
- //超出边界直接返回.
- //滚动条向上滑动可能会触发的函数
- if (firstItemPos > this.firstItemData.endPos) {
- if (this.lastItemIndex + 1 < this.itemData.length) {
- this.updateFirstItemIndex();
- }
- this.count++;
- }
- if (lastItemPos > this.lastItemData.endPos) {
- if (this.lastItemIndex + 1 < this.itemData.length) {
- this.itemCanMoveDown = true;
- this.updateLastItemIndex();
- this.itemCanMoveDown = false;
- }
- }
- //滚动条向下滑动可能会触发的函数
- if (lastItemPos < this.lastItemData.startPos) {
- this.updateLastItemIndex();
- this.count--;
- }
- if (firstItemPos < this.firstItemData.startPos) {
- this.itemCanMoveUp = true;
- this.updateFirstItemIndex();
- this.itemCanMoveUp = false;
- }
- }
- };
- TableView.prototype.updateFirstItemIndex = function () {
- var num = this.firstItemIndex;
- if (this.itemCanMoveUp && num > this.getItemIndex()[0] && num > 0) {
- this.itemMoveUp(this.firstItemIndex - 1);
- }
- this.updateItemIndex();
- };
- TableView.prototype.updateLastItemIndex = function () {
- var num = this.lastItemIndex;
- if (this.itemCanMoveDown && num < this.getItemIndex()[1] && num + 1 < this.itemData.length) {
- this.itemMoveDown(this.lastItemIndex + 1);
- }
- this.updateItemIndex();
- };
- TableView.prototype.updateItemIndex = function () {
- //cc.log(this.firstItemIndex, this.lastItemIndex, this.itemArr, this.itemData)
- };
- /**
- * 得到滚动条此时状态下应有的itemNode元素,包括滚动条上方一个,滚动条下方一个
- * @returns
- */
- TableView.prototype.getItemIndex = function () {
- var _this = this;
- var firstItemPos = this.scrollView.getScrollOffset().y;
- var lastItemPos = firstItemPos + this.layerHeight;
- var arr = [];
- this.itemPosMap.forEach(function (value, key) {
- var status1 = value.startPos <= firstItemPos && value.endPos > firstItemPos;
- var status2 = value.startPos >= firstItemPos && value.endPos < lastItemPos;
- var status3 = value.startPos <= lastItemPos && value.endPos > lastItemPos;
- if (status1) {
- _this.firstItemData.startPos = value.startPos;
- _this.firstItemData.endPos = value.endPos;
- _this.firstItemIndex = key;
- arr.push(key);
- }
- if (status3) {
- _this.lastItemData.startPos = value.startPos;
- _this.lastItemData.endPos = value.endPos;
- _this.lastItemIndex = key;
- arr.push(key);
- }
- });
- return arr;
- };
- /**
- * 滚动到顶部【滚动条顺序是从上到下开始遍历】
- * @param num
- * @returns
- */
- TableView.prototype.itemMoveUp = function (num) {
- if (num < 0 || this.lastItemIndex + 1 < num || num + 1 > this.itemData.length) {
- return;
- }
- if (!this.hasItem(num)) {
- this.itemMove(num, -this.itemPosMap.get(num).startPos);
- }
- num++;
- return this.itemMoveUp(num);
- };
- /** 滚动到底部 */
- TableView.prototype.itemMoveDown = function (num) {
- if (num < 0 || this.firstItemIndex - 1 > num || num + 1 > this.itemData.length) {
- return;
- }
- if (!this.hasItem(num)) {
- this.itemMove(num, -this.itemPosMap.get(num).startPos);
- }
- num--;
- return this.itemMoveDown(num);
- };
- /**
- * 判断指定index位置是否存在itemNode
- * @param index 节点下标
- * @returns
- */
- TableView.prototype.hasItem = function (index) {
- for (var i = 0; i < this.itemArr.length; i++) {
- if (this.itemArr[i].index === index) {
- return true;
- }
- }
- return false;
- };
- /**
- * 移动条目
- * 逻辑判断,第一种情况,修改itemArr数组的某个对象,第二种情况实例化一个新itemNode
- * @param index 条目节点标记
- * @param y
- * @returns
- */
- TableView.prototype.itemMove = function (index, y) {
- for (var i = 0; i < this.itemArr.length; i++) {
- //index存在-1的情况,类似于在缓存池里的item.
- var status1 = this.itemArr[i].index < this.firstItemIndex - 1 ? true : false;
- var status2 = this.itemArr[i].index > this.lastItemIndex + 1 ? true : false;
- var status3 = this.itemArr[i].pfbType === this.itemData[index].pfbType;
- //cc.log('item的索引', this.firstItemIndex, this.lastItemIndex)
- if (status1 && status3 || status2 && status3) {
- //cc.log(i, index, this.itemArr, this.content.height);
- //给item赋值还有设置位置
- this.itemArr[i].index = index;
- this.itemArr[i].y = y;
- var comp_script = this.itemArr[i].getComponent(this.itemArr[i].name);
- comp_script && comp_script.setItemData(this.itemData[index], this);
- return;
- }
- }
- this.addItemNode(index, y);
- };
- /**
- * 得到相关位置的排序index
- * 方法待验证,可能有问题
- * @param pos 坐标
- * @returns
- */
- TableView.prototype.getPosIndex = function (pos) {
- for (var _i = 0, _a = this.itemPosMap.entries(); _i < _a.length; _i++) {
- var _b = _a[_i], key = _b[0], value = _b[1];
- if (value.endPos > pos && value.startPos <= pos) {
- return key;
- }
- }
- };
- /**
- * 添加条目
- * @param obj 数据对象
- * @returns
- */
- TableView.prototype.addItem = function (obj) {
- this.itemData.push(obj);
- this.getItemPos(this.itemData.length - 1);
- var endPos = this.itemPosMap.get(this.itemData.length - 1).endPos;
- if (endPos - this.layerHeight > 0) {
- var startPos = endPos - this.layerHeight;
- //得到当前的firstItemIndex;
- for (var i = this.itemData.length - 1; i >= 0; i--) {
- if (this.itemPosMap.get(i).endPos > startPos && this.itemPosMap.get(i).startPos <= startPos) {
- this.firstItemIndex = i;
- }
- }
- this.scrollView.scrollToBottom();
- this.lastItemIndex = this.itemData.length - 1;
- var num = this.firstItemIndex - 1 > 0 ? (this.firstItemIndex - 1) : 0;
- this.itemMoveUp(num);
- return true;
- }
- else {
- this.firstItemIndex = 0;
- this.lastItemIndex = this.itemData.length - 1;
- this.itemMoveUp(this.firstItemIndex);
- return false;
- }
- };
- /**
- * 清理条目
- */
- TableView.prototype.clearItem = function () {
- this.itemData = [];
- this.itemPosMap.clear();
- this.scrollView.scrollToTop();
- this.content.height = 0;
- for (var i in this.itemArr) {
- // this.itemArr[i].index = -1;
- // this.itemArr[i].y = 3000;
- this.itemArr[i].destroy();
- }
- };
- /**
- * 删除指定条目
- * @param i 节点.index
- * @returns
- */
- TableView.prototype.deleteItem = function (i) {
- this.itemData.splice(i, 1);
- var item_data_count = this.itemData.length;
- if (item_data_count <= 0)
- return;
- this.getItemPos(item_data_count - 1);
- //改变this.itemArr的内容
- for (var j = 0; j < this.itemArr.length; j++) {
- if (this.itemArr[j].index === i) {
- this.itemArr[j].index = -1;
- this.itemArr[j].y = 3000;
- }
- if (this.itemArr[j].index > i) {
- var num = this.itemArr[j].index;
- this.itemArr[j].y = -this.itemPosMap.get(num - 1).startPos;
- this.itemArr[j].index = num - 1;
- }
- }
- this.updateContentHeigh(this.itemPosMap.get(this.itemData.length - 1).endPos);
- if (!this.lastItemIndex)
- this.getItemIndex(); // 初始化时没有初始化此值,会导致为0.不能创建新的item,此处校验
- this.itemMoveUp(this.firstItemIndex); //
- };
- /**
- * 重置指定item
- * @param index 节点下标
- * @param item_data 新的数据
- */
- TableView.prototype.resetItemData = function (index, item_data) {
- for (var i = 0; i < this.itemArr.length; i++) {
- if (this.itemArr[i].index === index) {
- if (item_data)
- this.itemData[i] = item_data;
- var comp_script = this.itemArr[i].getComponent(this.itemArr[i].name);
- comp_script && comp_script.setItemData(this.itemData[index], this);
- break;
- }
- }
- };
- /**
- * 重置条目大小
- * @param index 节点下标
- * @param infoHeight 新的高度
- */
- TableView.prototype.resetItemSize = function (index, infoHeight) {
- var func = (function (index, infoHeight) {
- for (var i = 0; i < this.itemArr.length; i++) {
- if (this.itemArr[i].index > index) {
- this.itemArr[i].y -= infoHeight;
- }
- }
- for (var _i = 0, _a = this.itemPosMap.entries(); _i < _a.length; _i++) {
- var _b = _a[_i], key = _b[0], value = _b[1];
- if (key === index) {
- value.endPos += infoHeight;
- }
- if (key > index) {
- value.endPos += infoHeight;
- value.startPos += infoHeight;
- }
- }
- this.lastResetItemInfoHeight = infoHeight;
- this.lastResetItemIndex = index;
- }).bind(this);
- if (this.lastResetItemIndex !== null && this.lastResetItemInfoHeight) {
- if (this.lastResetItemIndex === index) {
- func(this.lastResetItemIndex, -this.lastResetItemInfoHeight);
- this.lastResetItemIndex = null;
- this.lastResetItemInfoHeight = 0;
- }
- else {
- func(this.lastResetItemIndex, -this.lastResetItemInfoHeight);
- func(index, infoHeight);
- }
- }
- else {
- func(index, infoHeight);
- }
- this.itemMoveUp(this.firstItemIndex);
- this.updateContentHeigh(this.itemPosMap.get(this.itemData.length - 1).endPos);
- };
- __decorate([
- property({ type: [cc.Prefab] })
- ], TableView.prototype, "pre_item", void 0);
- __decorate([
- property({ displayName: '间距' })
- ], TableView.prototype, "itemInterval", void 0);
- TableView = __decorate([
- ccclass
- ], TableView);
- return TableView;
- }(cc.Component));
- exports.default = TableView;
- 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxnYW1lXFxjb21wb25lbnRcXFRhYmxlVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDTSxJQUFBLEtBQXdCLEVBQUUsQ0FBQyxVQUFVLEVBQW5DLE9BQU8sYUFBQSxFQUFFLFFBQVEsY0FBa0IsQ0FBQztBQUU1Qzs7Ozs7OztFQU9FO0FBRUY7SUFBdUMsNkJBQVk7SUFBbkQ7UUFBQSxxRUFvZUM7UUFqZVcsY0FBUSxHQUFnQixFQUFFLENBQUM7UUFDbkMsU0FBUztRQUVELGtCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRWpDLFNBQVM7UUFDRCxjQUFRLEdBQVEsSUFBSSxDQUFDO1FBQzdCLGFBQWE7UUFDTCxnQkFBVSxHQUFrQixJQUFJLENBQUM7UUFDekMsZUFBZTtRQUNQLFVBQUksR0FBZSxJQUFJLENBQUM7UUFDaEMsZ0JBQWdCO1FBQ1IsYUFBTyxHQUFRLElBQUksQ0FBQztRQUM1QixVQUFVO1FBQ0YsaUJBQVcsR0FBUSxJQUFJLENBQUM7UUFDaEMsUUFBUTtRQUNBLG9CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG1CQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLG1CQUFhLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLGtCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGFBQU8sR0FBZSxFQUFFLENBQUM7UUFDekIsY0FBUSxHQUFlLEVBQUUsQ0FBQztRQUMxQixnQkFBVSxHQUFRLElBQUksR0FBRyxFQUFFLENBQUM7UUFDNUIsa0JBQVksR0FBWSxJQUFJLENBQUM7UUFDN0IsV0FBSyxHQUFXLENBQUMsQ0FBQztRQUNsQixxQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxtQkFBYSxHQUFZLElBQUksQ0FBQztRQXlaOUIsNkJBQXVCLEdBQVEsSUFBSSxDQUFDO1FBQ3BDLHdCQUFrQixHQUFRLElBQUksQ0FBQzs7SUE2QzNDLENBQUM7SUFyY0csMEJBQU0sR0FB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LENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBOWREO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7K0NBQ0c7SUFHbkM7UUFEQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7bURBQ0M7SUFOaEIsU0FBUztRQUQ3QixPQUFPO09BQ2EsU0FBUyxDQW9lN0I7SUFBRCxnQkFBQztDQXBlRCxBQW9lQyxDQXBlc0MsRUFBRSxDQUFDLFNBQVMsR0FvZWxEO2tCQXBlb0IsU0FBUyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xyXG5cclxuLyoqIOWKqOaAgeWKoOi9veeahOa7muWKqOWIl+ihqFxyXG4gKiAtIOa7keWKqOWIl+ihqOWKqOaAgeWKoOi9vVxyXG4gKiAtIOaUr+aMgeWkmuenjeexu+Wei+mihOWItuS9k+a3t+WQiOa7muWKqCBcclxuICogLSBpdGVt6ISa5pys6ZyA6KaB5pyJ5Ye95pWwIHNldEl0ZW1EYXRhIOeUqOS6juaOpeaUtuaVsOaNrlxyXG4gKiAtIOWkmuS4qnByZWZhYua3t+WQiOaXtu+8jOimgeS4uuavj+adoWl0ZW3mjIflrpogcGZiVHlwZVxyXG4gKiAtIGl0ZW3jgIFjb250ZW506ZSa54K5eemcgOimgeS4ujHlhbbku5bkuLowLjVcclxuICogQGF1dGhvciDolpvpuL/mvYdcclxuKi9cclxuQGNjY2xhc3NcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVWaWV3IGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBbY2MuUHJlZmFiXSB9KVxyXG4gICAgcHJpdmF0ZSBwcmVfaXRlbTogY2MuUHJlZmFiW10gPSBbXTtcclxuICAgIC8qKiDpl7Tot50gKi9cclxuICAgIEBwcm9wZXJ0eSh7IGRpc3BsYXlOYW1lOiAn6Ze06LedJyB9KVxyXG4gICAgcHJpdmF0ZSBpdGVtSW50ZXJ2YWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIOaVsOaNriAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtRGF0YTogYW55ID0gbnVsbDtcclxuICAgIC8qKiDmu5rliqjliJfooajnu4Tku7YgKi9cclxuICAgIHByaXZhdGUgc2Nyb2xsVmlldzogY2MuU2Nyb2xsVmlldyA9IG51bGw7XHJcbiAgICAvKiogaXRlbemihOWItuS9k+e7hCAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIC8qKiDmu5HliqjliJfooajnmoTlhoXlrrnoioLngrkgKi9cclxuICAgIHByaXZhdGUgY29udGVudDogYW55ID0gbnVsbDtcclxuICAgIC8qKiDliJfooajpq5ggKi9cclxuICAgIHByaXZhdGUgbGF5ZXJIZWlnaHQ6IGFueSA9IG51bGw7XHJcbiAgICAvKiog77yfICovXHJcbiAgICBwcml2YXRlIGZpcnN0SXRlbUluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBsYXN0SXRlbUluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBmaXJzdEl0ZW1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgbGFzdEl0ZW1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgaXRlbUFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpdGVtTm9kZTogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpdGVtUG9zTWFwOiBhbnkgPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIGluaXRJdGVtRGF0YTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBpdGVtQ2FuTW92ZURvd246IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBpdGVtQ2FuTW92ZVVwOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICBvbkxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0UHJvKCk7XHJcbiAgICAgICAgLy8g5rWL6K+VXHJcbiAgICAgICAgLy8gbGV0IGl0ZW1EYXRhID0gW107XHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGxldCB0ZXN0X2RhdGEgPSB7XHJcbiAgICAgICAgLy8gICAgICAgICBwZmJUeXBlOiAwLFxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGl0ZW1EYXRhLnB1c2godGVzdF9kYXRhKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5pbml0KGl0ZW1EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcm8oKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3ID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChjYy5TY3JvbGxWaWV3KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLnNjcm9sbFZpZXcuY29udGVudDtcclxuICAgICAgICB0aGlzLml0ZW0gPSB0aGlzLnByZV9pdGVtO1xyXG4gICAgICAgIHRoaXMubGF5ZXJIZWlnaHQgPSB0aGlzLm5vZGUuaGVpZ2h0O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU5vZGVbaV0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1baV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGUub24oJ3Nyb2xsdmlldy1pbml0JywgdGhpcy5pbml0LCB0aGlzKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gaXRlbURhdGEg5YiX6KGo5pWw5o2uXHJcbiAgICAgKiBAcGFyYW0gaXNTa2lwSW5pdCDot7Pov4fliJ3lp4vljJZcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdChpdGVtRGF0YTogQXJyYXk8YW55PiwgaXNTa2lwSW5pdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtRGF0YVswXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1EYXRhID0gaXRlbURhdGE7IC8vaXRlbeaVsOaNrlxyXG4gICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5maXJzdEl0ZW1EYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0SXRlbURhdGEgPSB7fTtcclxuICAgICAgICB0aGlzLml0ZW1BcnIgPSBbXTtcclxuICAgICAgICB0aGlzLml0ZW1Qb3NNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5pbml0SXRlbURhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgICAgIGlmIChpc1NraXBJbml0KSByZXR1cm47XHJcbiAgICAgICAgLy8gdGhpcy5pdGVtTm9kZSA9IFtdO1xyXG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaXRlbU5vZGVbaV0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1baV0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBjYy5sb2codGhpcy50ZXN0VGltZSgwKSk7Ly8g5raI6ICX6K6h5pe2XHJcbiAgICAgICAgdGhpcy5pbml0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcygwKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbignc2Nyb2xsaW5nJywgdGhpcy5jYWxsYmFjaywgdGhpcyk7XHJcbiAgICAgICAgLy8gY2MubG9nKCd0YWJsZVZpZXfnu5PmnZ86JyArIHRoaXMudGVzdFRpbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog5Yi35paw5YiX6KGoIFxyXG4gICAgICog5LuF5pu05pawZGF0YeaVsOaNrlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlTGlzdCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJdGVtUG9zKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgaXRlbV9kYXRhX2NvdW50ID0gdGhpcy5pdGVtRGF0YS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgaXRlbV9kYXRhX2NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cclxuICAgICAgICAgICAgbGV0IHk7XHJcbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvYmouc3RhcnRQb3MgPSAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqLnN0YXJ0UG9zID0gdGhpcy5pdGVtUG9zTWFwLmdldChpIC0gMSkuZW5kUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBqID0gdGhpcy5pdGVtRGF0YVtpXS5wZmJUeXBlIHx8IDA7XHJcbiAgICAgICAgICAgIG9iai5lbmRQb3MgPSBvYmouc3RhcnRQb3MgKyB0aGlzLml0ZW1Ob2RlW2pdLmhlaWdodCArIHRoaXMuaXRlbUludGVydmFsO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1Qb3NNYXAuc2V0KGksIG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtX2RhdGFfY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQoaXRlbV9kYXRhX2NvdW50IC0gMSkuZW5kUG9zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrp7kvovljJbmiYDmnInnlKjliLDnmoRpdGVt77yM5o6n5Yi25a6e5L6L5YyWaXRlbeeahOaVsOebru+8jOaaguWumui2heWHuuS4pOS4qlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRJdGVtKCkge1xyXG4gICAgICAgIGxldCBqID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC5oZWlnaHQgPiB0aGlzLmxheWVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBqKytcclxuICAgICAgICAgICAgICAgIGlmIChqID4gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5ID0gdGhpcy5pdGVtQXJyW2kgLSAxXS55IC0gdGhpcy5pdGVtQXJyW2kgLSAxXS5oZWlnaHQgLSB0aGlzLml0ZW1JbnRlcnZhbDsvLyDkuIvkuIDmnaHnm67nurXlnZDmoIdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ob2RlKGksIHkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRIZWlnaCh0aGlzLml0ZW1BcnJbaV0uaGVpZ2h0IC0geSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5p2h55uu6IqC54K5XHJcbiAgICAgKiBAcGFyYW0gaSDnvJblj7dcclxuICAgICAqIEBwYXJhbSB5IOWdkOagh3lcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRJdGVtTm9kZShpOiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwZmJUeXBlID0gdGhpcy5pdGVtRGF0YVtpXS5wZmJUeXBlIHx8IDA7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1Ob2RlW3BmYlR5cGVdKTtcclxuICAgICAgICBpdGVtLnBhcmVudCA9IHRoaXMuY29udGVudDtcclxuICAgICAgICBpdGVtLnBmYlR5cGUgPSBwZmJUeXBlO1xyXG4gICAgICAgIGl0ZW0uaW5kZXggPSBpO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ueSA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbS55ID0geTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXRlbS54ID0gMDtcclxuICAgICAgICAvL+WvuWl0ZW3otYvlgLxcclxuICAgICAgICBsZXQgY29tcF9zY3JpcHQgPSBpdGVtLmdldENvbXBvbmVudChpdGVtLm5hbWUpO1xyXG4gICAgICAgIGNvbXBfc2NyaXB0ICYmIGNvbXBfc2NyaXB0LnNldEl0ZW1EYXRhKHRoaXMuaXRlbURhdGFbaV0sIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbUFyci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIC8vIGNjLmxvZygn55Sf5oiQaXRlbU5vZGUnICsgaSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5pu05pawY2VudGVudOmrmFxyXG4gICAgICogQHBhcmFtIG51bSAgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQ29udGVudEhlaWdoKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmhlaWdodCA9IG51bSA+IHRoaXMubGF5ZXJIZWlnaHQgPyBudW0gOiB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgIC8vIGNjLmxvZygn5rua5Yqo5p2h6auY5bqmOicsIHRoaXMuY29udGVudC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5pG45rua5Yqo5p2h55qE5Ye95pWw5Zue6LCDXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsbGJhY2soZXZlbnQsIGV2ZW50VHlwZSkge1xyXG4gICAgICAgIC8vIGNjLmxvZyhldmVudCAmJiBldmVudC50eXBlIHx8IGV2ZW50VHlwZSlcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50LmhlaWdodCA+IHRoaXMubGF5ZXJIZWlnaHQpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0SXRlbVBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55O1xyXG4gICAgICAgICAgICBsZXQgbGFzdEl0ZW1Qb3MgPSBmaXJzdEl0ZW1Qb3MgKyB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RJdGVtUG9zIDwgMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbml0SXRlbURhdGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNjLmxvZygnMTExOiVvJywgdGhpcy5pdGVtUG9zTWFwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0SXRlbURhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUNhbk1vdmVEb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGFzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQ2FuTW92ZURvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/otoXlh7rovrnnlYznm7TmjqXov5Tlm54uXHJcbiAgICAgICAgICAgIC8v5rua5Yqo5p2h5ZCR5LiK5ruR5Yqo5Y+v6IO95Lya6Kem5Y+R55qE5Ye95pWwXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Qb3MgPiB0aGlzLmZpcnN0SXRlbURhdGEuZW5kUG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0SXRlbUluZGV4ICsgMSA8IHRoaXMuaXRlbURhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsYXN0SXRlbVBvcyA+IHRoaXMubGFzdEl0ZW1EYXRhLmVuZFBvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdEl0ZW1JbmRleCArIDEgPCB0aGlzLml0ZW1EYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbUNhbk1vdmVEb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1DYW5Nb3ZlRG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8v5rua5Yqo5p2h5ZCR5LiL5ruR5Yqo5Y+v6IO95Lya6Kem5Y+R55qE5Ye95pWwXHJcbiAgICAgICAgICAgIGlmIChsYXN0SXRlbVBvcyA8IHRoaXMubGFzdEl0ZW1EYXRhLnN0YXJ0UG9zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmlyc3RJdGVtUG9zIDwgdGhpcy5maXJzdEl0ZW1EYXRhLnN0YXJ0UG9zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DYW5Nb3ZlVXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQ2FuTW92ZVVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUZpcnN0SXRlbUluZGV4KCkge1xyXG4gICAgICAgIGxldCBudW0gPSB0aGlzLmZpcnN0SXRlbUluZGV4O1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1DYW5Nb3ZlVXAgJiYgbnVtID4gdGhpcy5nZXRJdGVtSW5kZXgoKVswXSAmJiBudW0gPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4IC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbUluZGV4KCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHVwZGF0ZUxhc3RJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgbGV0IG51bSA9IHRoaXMubGFzdEl0ZW1JbmRleDtcclxuICAgICAgICBpZiAodGhpcy5pdGVtQ2FuTW92ZURvd24gJiYgbnVtIDwgdGhpcy5nZXRJdGVtSW5kZXgoKVsxXSAmJiBudW0gKyAxIDwgdGhpcy5pdGVtRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtTW92ZURvd24odGhpcy5sYXN0SXRlbUluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbUluZGV4KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgLy9jYy5sb2codGhpcy5maXJzdEl0ZW1JbmRleCwgdGhpcy5sYXN0SXRlbUluZGV4LCB0aGlzLml0ZW1BcnIsIHRoaXMuaXRlbURhdGEpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvpfliLDmu5rliqjmnaHmraTml7bnirbmgIHkuIvlupTmnInnmoRpdGVtTm9kZeWFg+e0oCzljIXmi6zmu5rliqjmnaHkuIrmlrnkuIDkuKos5rua5Yqo5p2h5LiL5pa55LiA5LiqXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgbGV0IGZpcnN0SXRlbVBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55O1xyXG4gICAgICAgIGxldCBsYXN0SXRlbVBvcyA9IGZpcnN0SXRlbVBvcyArIHRoaXMubGF5ZXJIZWlnaHQ7XHJcbiAgICAgICAgbGV0IGFyciA9IFtdO1xyXG4gICAgICAgIHRoaXMuaXRlbVBvc01hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMxID0gdmFsdWUuc3RhcnRQb3MgPD0gZmlyc3RJdGVtUG9zICYmIHZhbHVlLmVuZFBvcyA+IGZpcnN0SXRlbVBvcztcclxuICAgICAgICAgICAgbGV0IHN0YXR1czIgPSB2YWx1ZS5zdGFydFBvcyA+PSBmaXJzdEl0ZW1Qb3MgJiYgdmFsdWUuZW5kUG9zIDwgbGFzdEl0ZW1Qb3M7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMzID0gdmFsdWUuc3RhcnRQb3MgPD0gbGFzdEl0ZW1Qb3MgJiYgdmFsdWUuZW5kUG9zID4gbGFzdEl0ZW1Qb3M7XHJcbiAgICAgICAgICAgIGlmIChzdGF0dXMxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0SXRlbURhdGEuc3RhcnRQb3MgPSB2YWx1ZS5zdGFydFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtRGF0YS5lbmRQb3MgPSB2YWx1ZS5lbmRQb3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0SXRlbUluZGV4ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3RhdHVzMykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0SXRlbURhdGEuc3RhcnRQb3MgPSB2YWx1ZS5zdGFydFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEl0ZW1EYXRhLmVuZFBvcyA9IHZhbHVlLmVuZFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmu5rliqjliLDpobbpg6jjgJDmu5rliqjmnaHpobrluo/mmK/ku47kuIrliLDkuIvlvIDlp4vpgY3ljobjgJFcclxuICAgICAqIEBwYXJhbSBudW0gXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtTW92ZVVwKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG51bSA8IDAgfHwgdGhpcy5sYXN0SXRlbUluZGV4ICsgMSA8IG51bSB8fCBudW0gKyAxID4gdGhpcy5pdGVtRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGFzSXRlbShudW0pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmUobnVtLCAtdGhpcy5pdGVtUG9zTWFwLmdldChudW0pLnN0YXJ0UG9zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbnVtKys7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbU1vdmVVcChudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiDmu5rliqjliLDlupXpg6ggKi9cclxuICAgIHByaXZhdGUgaXRlbU1vdmVEb3duKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG51bSA8IDAgfHwgdGhpcy5maXJzdEl0ZW1JbmRleCAtIDEgPiBudW0gfHwgbnVtICsgMSA+IHRoaXMuaXRlbURhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0l0ZW0obnVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1Nb3ZlKG51bSwgLXRoaXMuaXRlbVBvc01hcC5nZXQobnVtKS5zdGFydFBvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG51bS0tO1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1Nb3ZlRG93bihudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5oyH5a6aaW5kZXjkvY3nva7mmK/lkKblrZjlnKhpdGVtTm9kZVxyXG4gICAgICogQHBhcmFtIGluZGV4IOiKgueCueS4i+agh1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFzSXRlbShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1BcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+WKqOadoeebrlxyXG4gICAgICog6YC76L6R5Yik5patLOesrOS4gOenjeaDheWGtSzkv67mlLlpdGVtQXJy5pWw57uE55qE5p+Q5Liq5a+56LGhLOesrOS6jOenjeaDheWGteWunuS+i+WMluS4gOS4quaWsGl0ZW1Ob2RlXHJcbiAgICAgKiBAcGFyYW0gaW5kZXgg5p2h55uu6IqC54K55qCH6K6wXHJcbiAgICAgKiBAcGFyYW0geSBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGl0ZW1Nb3ZlKGluZGV4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vaW5kZXjlrZjlnKgtMeeahOaDheWGtSznsbvkvLzkuo7lnKjnvJPlrZjmsaDph4znmoRpdGVtLlxyXG4gICAgICAgICAgICBsZXQgc3RhdHVzMSA9IHRoaXMuaXRlbUFycltpXS5pbmRleCA8IHRoaXMuZmlyc3RJdGVtSW5kZXggLSAxID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgc3RhdHVzMiA9IHRoaXMuaXRlbUFycltpXS5pbmRleCA+IHRoaXMubGFzdEl0ZW1JbmRleCArIDEgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMzID0gdGhpcy5pdGVtQXJyW2ldLnBmYlR5cGUgPT09IHRoaXMuaXRlbURhdGFbaW5kZXhdLnBmYlR5cGU7XHJcbiAgICAgICAgICAgIC8vY2MubG9nKCdpdGVt55qE57Si5byVJywgdGhpcy5maXJzdEl0ZW1JbmRleCwgdGhpcy5sYXN0SXRlbUluZGV4KVxyXG4gICAgICAgICAgICBpZiAoc3RhdHVzMSAmJiBzdGF0dXMzIHx8IHN0YXR1czIgJiYgc3RhdHVzMykge1xyXG4gICAgICAgICAgICAgICAgLy9jYy5sb2coaSwgaW5kZXgsIHRoaXMuaXRlbUFyciwgdGhpcy5jb250ZW50LmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAvL+e7mWl0ZW3otYvlgLzov5jmnInorr7nva7kvY3nva5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltpXS5pbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLnkgPSB5O1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbXBfc2NyaXB0ID0gdGhpcy5pdGVtQXJyW2ldLmdldENvbXBvbmVudCh0aGlzLml0ZW1BcnJbaV0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb21wX3NjcmlwdCAmJiBjb21wX3NjcmlwdC5zZXRJdGVtRGF0YSh0aGlzLml0ZW1EYXRhW2luZGV4XSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtTm9kZShpbmRleCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvpfliLDnm7jlhbPkvY3nva7nmoTmjpLluo9pbmRleFxyXG4gICAgICog5pa55rOV5b6F6aqM6K+B77yM5Y+v6IO95pyJ6Zeu6aKYXHJcbiAgICAgKiBAcGFyYW0gcG9zIOWdkOagh1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NJbmRleChwb3M6IGNjLlZlYzIpIHtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5pdGVtUG9zTWFwLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kUG9zID4gcG9zICYmIHZhbHVlLnN0YXJ0UG9zIDw9IHBvcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOadoeebrlxyXG4gICAgICogQHBhcmFtIG9iaiDmlbDmja7lr7nosaFcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkSXRlbShvYmo6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXRlbURhdGEucHVzaChvYmopO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcyh0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIGxldCBlbmRQb3MgPSB0aGlzLml0ZW1Qb3NNYXAuZ2V0KHRoaXMuaXRlbURhdGEubGVuZ3RoIC0gMSkuZW5kUG9zO1xyXG4gICAgICAgIGlmIChlbmRQb3MgLSB0aGlzLmxheWVySGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBlbmRQb3MgLSB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgICAgICAvL+W+l+WIsOW9k+WJjeeahGZpcnN0SXRlbUluZGV4O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbVBvc01hcC5nZXQoaSkuZW5kUG9zID4gc3RhcnRQb3MgJiYgdGhpcy5pdGVtUG9zTWFwLmdldChpKS5zdGFydFBvcyA8PSBzdGFydFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RJdGVtSW5kZXggPSB0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGxldCBudW0gPSB0aGlzLmZpcnN0SXRlbUluZGV4IC0gMSA+IDAgPyAodGhpcy5maXJzdEl0ZW1JbmRleCAtIDEpIDogMDtcclxuICAgICAgICAgICAgdGhpcy5pdGVtTW92ZVVwKG51bSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RJdGVtSW5kZXggPSB0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmnaHnm65cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFySXRlbSgpIHtcclxuICAgICAgICB0aGlzLml0ZW1EYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5pdGVtUG9zTWFwLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvVG9wKCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmhlaWdodCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLml0ZW1BcnIpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5pdGVtQXJyW2ldLmluZGV4ID0gLTE7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuaXRlbUFycltpXS55ID0gMzAwMDtcclxuICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliKDpmaTmjIflrprmnaHnm65cclxuICAgICAqIEBwYXJhbSBpIOiKgueCuS5pbmRleFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVJdGVtKGk6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuaXRlbURhdGEuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1fZGF0YV9jb3VudCA9IHRoaXMuaXRlbURhdGEubGVuZ3RoO1xyXG4gICAgICAgIGlmIChpdGVtX2RhdGFfY291bnQgPD0gMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcyhpdGVtX2RhdGFfY291bnQgLSAxKTtcclxuXHJcbiAgICAgICAgLy/mlLnlj5h0aGlzLml0ZW1BcnLnmoTlhoXlrrlcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbUFyci5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtQXJyW2pdLmluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1BcnJbal0uaW5kZXggPSAtMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltqXS55ID0gMzAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtQXJyW2pdLmluZGV4ID4gaSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHRoaXMuaXRlbUFycltqXS5pbmRleDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltqXS55ID0gLXRoaXMuaXRlbVBvc01hcC5nZXQobnVtIC0gMSkuc3RhcnRQb3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1BcnJbal0uaW5kZXggPSBudW0gLSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQodGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxKS5lbmRQb3MpO1xyXG4gICAgICAgIGlmICghdGhpcy5sYXN0SXRlbUluZGV4KSB0aGlzLmdldEl0ZW1JbmRleCgpOy8vIOWIneWni+WMluaXtuayoeacieWIneWni+WMluatpOWAvO+8jOS8muWvvOiHtOS4ujAu5LiN6IO95Yib5bu65paw55qEaXRlbe+8jOatpOWkhOagoemqjFxyXG4gICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4KTsvL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5oyH5a6aaXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IOiKgueCueS4i+agh1xyXG4gICAgICogQHBhcmFtIGl0ZW1fZGF0YSDmlrDnmoTmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0SXRlbURhdGEoaW5kZXg6IG51bWJlciwgaXRlbV9kYXRhPzogYW55KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1BcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtX2RhdGEpIHRoaXMuaXRlbURhdGFbaV0gPSBpdGVtX2RhdGE7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcF9zY3JpcHQgPSB0aGlzLml0ZW1BcnJbaV0uZ2V0Q29tcG9uZW50KHRoaXMuaXRlbUFycltpXS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbXBfc2NyaXB0ICYmIGNvbXBfc2NyaXB0LnNldEl0ZW1EYXRhKHRoaXMuaXRlbURhdGFbaW5kZXhdLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGFzdFJlc2V0SXRlbUluZm9IZWlnaHQ6IGFueSA9IG51bGw7XHJcbiAgICBwcml2YXRlIGxhc3RSZXNldEl0ZW1JbmRleDogYW55ID0gbnVsbDtcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5p2h55uu5aSn5bCPXHJcbiAgICAgKiBAcGFyYW0gaW5kZXgg6IqC54K55LiL5qCHXHJcbiAgICAgKiBAcGFyYW0gaW5mb0hlaWdodCDmlrDnmoTpq5jluqZcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0SXRlbVNpemUoaW5kZXg6IG51bWJlciwgaW5mb0hlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGZ1bmMgPSAoZnVuY3Rpb24gKGluZGV4LCBpbmZvSGVpZ2h0KSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA+IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLnkgLT0gaW5mb0hlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuaXRlbVBvc01hcC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZW5kUG9zICs9IGluZm9IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID4gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lbmRQb3MgKz0gaW5mb0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdGFydFBvcyArPSBpbmZvSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQgPSBpbmZvSGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RSZXNldEl0ZW1JbmRleCA9IGluZGV4O1xyXG4gICAgICAgIH0pLmJpbmQodGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4ICE9PSBudWxsICYmIHRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4ID09PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgZnVuYyh0aGlzLmxhc3RSZXNldEl0ZW1JbmRleCwgLXRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UmVzZXRJdGVtSW5kZXggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UmVzZXRJdGVtSW5mb0hlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4LCAtdGhpcy5sYXN0UmVzZXRJdGVtSW5mb0hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuYyhpbmRleCwgaW5mb0hlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jKGluZGV4LCBpbmZvSGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtTW92ZVVwKHRoaXMuZmlyc3RJdGVtSW5kZXgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQodGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxKS5lbmRQb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iXX0=
|