difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/backpack/view/backpack_batchuse_window.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '7559clcpgVKtJy66gBOyogW', 'backpack_batchuse_window');
// Scripts/mod/backpack/view/backpack_batchuse_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-13 09:32:44
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var BackPackConst = require("backpack_const");
 
var Backpack_batchuseWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("backpack", "batchuse_panel_view");
    this.viewTag = SCENE_TAG.msg; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Mini; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.cur_selected_sum = 0; // 当前选中消耗的数量
 
    this.select_goods = null;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.root_wnd.getChildByName("background");
    this.main_container = this.root_wnd.getChildByName("main_container");
    this.close_btn = this.main_container.getChildByName("close_btn");
    this.item = ItemsPool.getInstance().getItem("backpack_item");
    this.item.initConfig(true, 1, false);
    this.item.setParent(this.main_container);
    this.item.show();
    this.item.setPosition(-200, 140);
    this.use_btn = this.main_container.getChildByName("use_btn");
    this.use_btn_lab = this.use_btn.getChildByName("Label").getComponent(cc.Label);
    this.use_btn_lab.string = Utils.TI18N("使用");
    this.handle_container = this.main_container.getChildByName("handle_container");
    this.handle_container_cy = 0; //  如果不是产出资源类的,这个东西要居中父节点
 
    this.container = this.handle_container.getChildByName("container");
    this.container_y = this.container.y;
    this.sub_btn = this.container.getChildByName("sub_btn"); // 减号
 
    this.add_btn = this.container.getChildByName("add_btn"); // 加号
 
    this.max_btn = this.container.getChildByName("max_btn"); // 最大值
 
    this.slider = this.container.getChildByName("slider").getComponent(cc.Slider); // 滑块
 
    this.progress = this.container.getChildByName("ProgressBar").getComponent(cc.ProgressBar); // this.slider:setBarPercent(20, 80)
 
    this.value = this.container.getChildByName("value").getComponent(cc.Label); // 使用数量提示
 
    this.use_title = this.container.getChildByName("title").getComponent(cc.Label); // 使用数量提示
 
    this.use_title.string = Utils.TI18N("使用数量:");
    this.extend_container = this.handle_container.getChildByName("extend_container");
    this.use_item_title = this.extend_container.getChildByName("use_item_title").getComponent(cc.Label);
    this.use_item_title.string = "";
    this.use_effect = this.extend_container.getChildByName("use_effect").getComponent(cc.Label);
    this.title_label = this.main_container.getChildByName("title_label").getComponent(cc.Label);
    this.title_label.string = Utils.TI18N("批量使用");
    this.item_name = this.main_container.getChildByName("item_name").getComponent(cc.Label);
    this.item_own = this.main_container.getChildByName("item_own").getComponent(cc.Label);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.close_btn, function () {
      this.ctrl.openBatchUseItemView(false);
    }.bind(this), 2);
    Utils.onTouchEnd(this.use_btn, function () {
      if (this.item_vo == null || this.item_vo.config == null) return;
      this.cur_selected_sum = Math.min(this.cur_selected_sum, this.item_vo.quantity);
 
      if (this.cur_selected_sum == 0) {
        message(Utils.TI18N("当前数量不能为0"));
        return;
      }
 
      if (this.type == BackPackConst.ItemConsumeType.use) {
        this.ctrl.sender10515(this.item_vo.id, this.cur_selected_sum, this.select_goods);
      } else {
        // 金币市场的物品出售
        if (this.select_goods && this.select_goods.type && this.select_goods.type == 1) {
          // MarketController:getInstance():sender23502( this.item_vo.id,this.cur_selected_sum)
          this.ctrl.openBatchUseItemView(false);
          return;
        }
 
        this.ctrl.sender10522(BackPackConst.Bag_Code.BACKPACK, [{
          id: this.item_vo.id,
          bid: this.item_vo.base_id,
          num: this.cur_selected_sum
        }]);
      }
    }.bind(this), 1);
    this.slider.node.on("slide", function () {
      this.setCurUseItemInfoByPercent(this.slider.progress);
      this.progress.progress = this.slider.progress;
    }, this);
    Utils.onTouchEnd(this.sub_btn, function () {
      if (this.item_vo == null) return;
      var percent = this.slider.progress;
      if (percent == 0) return; //已经是最小的了
 
      if (this.cur_selected_sum == 0) return;
      this.cur_selected_sum = this.cur_selected_sum - 1;
      this.setCurUseItemInfoByNum(this.cur_selected_sum);
    }.bind(this), 1);
    Utils.onTouchEnd(this.add_btn, function () {
      if (this.item_vo == null) return;
      var percent = this.slider.progress;
      if (percent == 100) return; //已经是最大的了
 
      if (this.cur_selected_sum >= this.item_vo.quantity) return;
      this.cur_selected_sum = this.cur_selected_sum + 1;
      this.setCurUseItemInfoByNum(this.cur_selected_sum);
    }.bind(this), 1);
    Utils.onTouchEnd(this.max_btn, function () {
      if (this.item_vo == null) return;
      var percent = this.slider.progress;
      if (percent == 100) return; //已经是最大的了
 
      if (this.cur_selected_sum >= this.item_vo.quantity) return;
      this.cur_selected_sum = this.item_vo.quantity;
      this.setCurUseItemInfoByNum(this.cur_selected_sum);
    }.bind(this), 1);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    var item = params[0];
    var type = params[1];
    var select_vo = params[2];
    this.type = type || BackPackConst.ItemConsumeType.use;
    this.item_vo = item;
    this.select_goods = select_vo;
 
    if (this.item_vo == null || this.item_vo.config == null) {
      this.ctrl.openBatchUseItemView(false);
      return;
    }
 
    if (this.type == BackPackConst.ItemConsumeType.use) {
      this.title_label.string = Utils.TI18N("批量使用");
      this.use_title.string = Utils.TI18N("使用数量:");
      this.use_btn_lab.string = Utils.TI18N("使用");
      this.updateItem();
    } else if (this.type == BackPackConst.ItemConsumeType.resolve) {
      this.title_label.string = Utils.TI18N("批量分解");
      this.use_title.string = Utils.TI18N("分解数量:");
      this.use_btn_lab.string = Utils.TI18N("分解");
      this.updateCellItem();
    } else {
      this.title_label.string = Utils.TI18N("物品出售");
      this.use_title.string = Utils.TI18N("出售数量:");
      this.use_btn_lab.string = Utils.TI18N("出售");
      this.updateCellItem();
    }
 
    this.setUseInfo(100);
  },
  // --==============================--
  // --desc:针对出售类物品的处理
  // --@return 
  // --==============================--
  updateCellItem: function updateCellItem() {
    if (this.item_vo == null || this.item_vo.config == null) return;
    this.item.setData(this.item_vo.config);
    this.item_name.string = this.item_vo.config.name;
    this.item_own.string = cc.js.formatStr(Utils.TI18N("拥有 %s 个"), this.item_vo.quantity);
    this.cur_selected_sum = this.item_vo.quantity; //  打开面板的时候,都是默认选中最大数量
 
    this.value.string = this.item_vo.quantity; //  设置最大
 
    this.slider.progress = 1;
    this.progress.progress = this.slider.progress;
    var value = this.item_vo.config.value;
 
    if (value != null && Utils.next(value) != null) {
      this.value_config = value[0];
      if (this.value_config == null || this.value_config[0] == null || typeof this.value_config[0] != "number") return;
      var base_id = this.value_config[0];
      var own = 0;
      var item_config = Utils.getItemConfig(base_id);
      if (item_config == null) return;
 
      if (this.value_config[0] == gdata("item_data", "data_assets_label2id", "coin")) {
        own = this.role_vo.coin;
      } else if (this.value_config[0] == gdata("item_data", "data_assets_label2id", "hero_soul")) {
        own = this.role_vo.hero_soul;
      }
 
      this.setCurUseItemInfoByPercent(1);
    }
 
    if (this.select_goods && this.select_goods.type && this.select_goods.type == 1) {
      this.value_config = this.select_goods.value_list || {};
      this.setCurUseItemInfoByPercent(1);
    }
  },
  updateItem: function updateItem() {
    if (this.item_vo == null || this.item_vo.config == null) return;
    this.item.setData(this.item_vo.config);
    this.item_name.string = this.item_vo.config.name;
    this.item_own.string = cc.js.formatStr(Utils.TI18N("拥有 %s 个"), this.item_vo.quantity);
    this.cur_selected_sum = this.item_vo.quantity; //  打开面板的时候,都是默认选中最大数量
 
    this.value.string = this.item_vo.quantity; //  设置最大
 
    this.slider.progress = 1;
    this.progress.progress = this.slider.progress; // 如果是产出资产类的
 
    if (this.isAssetsItem(this.item_vo.config) == true) {
      this.container.y = this.container_y;
      this.extend_container.active = true; //  直接取第一个效果吧
 
      if (this.item_vo.config.effect && Utils.next(this.item_vo.config.effect) != null) {
        var effect = this.item_vo.config.effect[0];
 
        if (effect != null && this.role_vo != null) {
          var own = 0;
 
          if (effect.effect_type == BackPackConst.item_effect_type.GOLD) {
            own = this.role_vo.coin;
          } else if (effect.effect_type == BackPackConst.item_effect_type.COIN) {
            own = this.role_vo.coin;
          } else if (effect.effect_type == BackPackConst.item_effect_type.PARTNER_EXP) {
            own = this.role_vo.partner_exp_all;
          }
        }
      }
 
      this.setCurUseItemInfoByPercent(1);
    } else {
      this.container.y = this.handle_container_cy;
      this.extend_container.active = false;
    }
  },
  // --==============================--
  // --desc:设置当前进度的相关数据
  // --@percent:
  // --@return 
  // --==============================--
  setCurUseItemInfoByPercent: function setCurUseItemInfoByPercent(percent) {
    if (this.item_vo == null) return;
    this.cur_selected_sum = Math.max(1, Math.floor(percent * this.item_vo.quantity));
    this.setUseInfo(this.cur_selected_sum);
  },
  setCurUseItemInfoByNum: function setCurUseItemInfoByNum(num) {
    if (this.item_vo == null) return;
    this.cur_selected_sum = Math.max(1, num);
    var all_num = Math.max(1, this.item_vo.quantity - 1);
    var percent = (this.cur_selected_sum - 1) / all_num;
    this.slider.progress = percent;
    this.progress.progress = this.slider.progress;
    this.setUseInfo(this.cur_selected_sum);
  },
  setUseInfo: function setUseInfo(sum) {
    sum = Math.min(this.item_vo.quantity, sum);
    this.value.string = sum;
 
    if (this.type == BackPackConst.ItemConsumeType.sell && this.value_config != null) {
      var base_value = this.value_config[1] || 0;
      var base_id = this.value_config[0];
      if (base_id == null) return;
      var item_config = Utils.getItemConfig(base_id);
      if (item_config == null) return;
      this.use_item_title.string = cc.js.formatStr(Utils.TI18N("出售后可获得%s:"), item_config.name);
      this.use_effect.string = base_value * sum;
      this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
    } else if (this.type == BackPackConst.ItemConsumeType.resolve && this.value_config != null) {
      var base_value = this.value_config[1] || 0;
      var base_id = this.value_config[0];
      if (base_id == null) return;
      var item_config = Utils.getItemConfig(base_id);
      if (item_config == null) return;
      this.use_item_title.string = cc.js.formatStr(Utils.TI18N("分解后可获得%s:"), item_config.name);
      this.use_effect.string = base_value * sum;
      this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
    } else {
      if (this.item_vo == null || this.item_vo.config == null || this.item_vo.config.effect == null || Utils.next(this.item_vo.config.effect) == null) return;
      if (this.isAssetsItem(this.item_vo.config) == false) return;
      var effect = this.item_vo.config.effect[0];
 
      if (effect != null) {
        this.use_item_title.string = cc.js.formatStr(Utils.TI18N("使用后可获得%s:"), Config.item_data.data_item_effect_type[effect.effect_type]);
        this.use_effect.string = effect.val * sum;
        this.use_effect.node.x = this.use_item_title.node.getContentSize().width + this.use_item_title.node.x;
      }
    }
  },
  // --==============================--
  // --desc:是否是财产类的物品
  // --@return 
  // --==============================--
  isAssetsItem: function isAssetsItem(config) {
    if (config == null) {
      return false;
    }
 
    if (config.effect == null || Utils.next(config.effect) == null) {
      return false;
    }
 
    var is_assets = false;
 
    for (var i in config.effect) {
      var v = config.effect[i];
 
      if (v.effect_type == BackPackConst.item_effect_type.GOLD || v.effect_type == BackPackConst.item_effect_type.COIN || v.effect_type == BackPackConst.item_effect_type.PARTNER_EXP) {
        is_assets = true;
        break;
      }
    }
 
    return is_assets;
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.item) {
      this.item.deleteMe();
    }
 
    this.item = null;
    this.ctrl.openBatchUseItemView(false);
  }
});
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcdmlld1xcYmFja3BhY2tfYmF0Y2h1c2Vfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiQmFja1BhY2tDb25zdCIsIkJhY2twYWNrX2JhdGNodXNlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsIm1zZyIsIndpbl90eXBlIiwiV2luVHlwZSIsIk1pbmkiLCJjdHJsIiwiYXJndW1lbnRzIiwibW9kZWwiLCJnZXRNb2RlbCIsImluaXRDb25maWciLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdXJfc2VsZWN0ZWRfc3VtIiwic2VsZWN0X2dvb2RzIiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJtYWluX2NvbnRhaW5lciIsImNsb3NlX2J0biIsIml0ZW0iLCJJdGVtc1Bvb2wiLCJnZXRJdGVtIiwic2V0UGFyZW50Iiwic2hvdyIsInNldFBvc2l0aW9uIiwidXNlX2J0biIsInVzZV9idG5fbGFiIiwiZ2V0Q29tcG9uZW50IiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiaGFuZGxlX2NvbnRhaW5lciIsImhhbmRsZV9jb250YWluZXJfY3kiLCJjb250YWluZXIiLCJjb250YWluZXJfeSIsInkiLCJzdWJfYnRuIiwiYWRkX2J0biIsIm1heF9idG4iLCJzbGlkZXIiLCJTbGlkZXIiLCJwcm9ncmVzcyIsIlByb2dyZXNzQmFyIiwidmFsdWUiLCJ1c2VfdGl0bGUiLCJleHRlbmRfY29udGFpbmVyIiwidXNlX2l0ZW1fdGl0bGUiLCJ1c2VfZWZmZWN0IiwidGl0bGVfbGFiZWwiLCJpdGVtX25hbWUiLCJpdGVtX293biIsInJlZ2lzdGVyRXZlbnQiLCJvblRvdWNoRW5kIiwib3BlbkJhdGNoVXNlSXRlbVZpZXciLCJiaW5kIiwiaXRlbV92byIsImNvbmZpZyIsIk1hdGgiLCJtaW4iLCJxdWFudGl0eSIsIm1lc3NhZ2UiLCJ0eXBlIiwiSXRlbUNvbnN1bWVUeXBlIiwidXNlIiwic2VuZGVyMTA1MTUiLCJpZCIsInNlbmRlcjEwNTIyIiwiQmFnX0NvZGUiLCJCQUNLUEFDSyIsImJpZCIsImJhc2VfaWQiLCJudW0iLCJub2RlIiwib24iLCJzZXRDdXJVc2VJdGVtSW5mb0J5UGVyY2VudCIsInBlcmNlbnQiLCJzZXRDdXJVc2VJdGVtSW5mb0J5TnVtIiwib3BlblJvb3RXbmQiLCJwYXJhbXMiLCJzZWxlY3Rfdm8iLCJ1cGRhdGVJdGVtIiwicmVzb2x2ZSIsInVwZGF0ZUNlbGxJdGVtIiwic2V0VXNlSW5mbyIsInNldERhdGEiLCJuYW1lIiwianMiLCJmb3JtYXRTdHIiLCJuZXh0IiwidmFsdWVfY29uZmlnIiwib3duIiwiaXRlbV9jb25maWciLCJnZXRJdGVtQ29uZmlnIiwiZ2RhdGEiLCJjb2luIiwiaGVyb19zb3VsIiwidmFsdWVfbGlzdCIsImlzQXNzZXRzSXRlbSIsImFjdGl2ZSIsImVmZmVjdCIsImVmZmVjdF90eXBlIiwiaXRlbV9lZmZlY3RfdHlwZSIsIkdPTEQiLCJDT0lOIiwiUEFSVE5FUl9FWFAiLCJwYXJ0bmVyX2V4cF9hbGwiLCJtYXgiLCJmbG9vciIsImFsbF9udW0iLCJzdW0iLCJzZWxsIiwiYmFzZV92YWx1ZSIsIngiLCJnZXRDb250ZW50U2l6ZSIsIndpZHRoIiwiQ29uZmlnIiwiaXRlbV9kYXRhIiwiZGF0YV9pdGVtX2VmZmVjdF90eXBlIiwidmFsIiwiaXNfYXNzZXRzIiwiaSIsInYiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFD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QUssQ0FBQzJELElBQU4sQ0FBV2hDLE1BQU0sQ0FBQzJDLE1BQWxCLEtBQTZCLElBQXpELEVBQThEO0FBQzFELGFBQU8sS0FBUDtBQUNIOztBQUNELFFBQUlvQixTQUFTLEdBQUcsS0FBaEI7O0FBQ0EsU0FBSSxJQUFJQyxDQUFSLElBQWFoRSxNQUFNLENBQUMyQyxNQUFwQixFQUEyQjtBQUN2QixVQUFJc0IsQ0FBQyxHQUFHakUsTUFBTSxDQUFDMkMsTUFBUCxDQUFjcUIsQ0FBZCxDQUFSOztBQUNBLFVBQUdDLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkMsSUFBaEQsSUFDSG1CLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkUsSUFEN0MsSUFFSGtCLENBQUMsQ0FBQ3JCLFdBQUYsSUFBaUJoSCxhQUFhLENBQUNpSCxnQkFBZCxDQUErQkcsV0FGaEQsRUFFNEQ7QUFDeERlLFFBQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0E7QUFDSDtBQUNKOztBQUNELFdBQU9BLFNBQVA7QUFDSCxHQW5Ua0M7QUFxVG5DO0FBQ0FHLEVBQUFBLGFBQWEsRUFBQyx5QkFBVTtBQUNwQixRQUFHLEtBQUt4RyxJQUFSLEVBQWE7QUFDVCxXQUFLQSxJQUFMLENBQVV5RyxRQUFWO0FBQ0g7O0FBQ0QsU0FBS3pHLElBQUwsR0FBWSxJQUFaO0FBQ0EsU0FBS2hCLElBQUwsQ0FBVW1ELG9CQUFWLENBQStCLEtBQS9CO0FBQ0g7QUE1VGtDLENBQVQsQ0FBOUIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA0LTEzIDA5OjMyOjQ0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpO1xuXG52YXIgQmFja3BhY2tfYmF0Y2h1c2VXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiYmFja3BhY2tcIiwgXCJiYXRjaHVzZV9wYW5lbF92aWV3XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcubXNnOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuTWluaTsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3pgInkuK3mtojogJfnmoTmlbDph49cbiAgICAgICAgdGhpcy5zZWxlY3RfZ29vZHMgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgIFxuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmNsb3NlX2J0biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJjbG9zZV9idG5cIik7XG4gICAgXG4gICAgICAgIHRoaXMuaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICB0aGlzLml0ZW0uaW5pdENvbmZpZyh0cnVlLCAxLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaXRlbS5zZXRQYXJlbnQodGhpcy5tYWluX2NvbnRhaW5lcilcbiAgICAgICAgdGhpcy5pdGVtLnNob3coKTtcbiAgICAgICAgdGhpcy5pdGVtLnNldFBvc2l0aW9uKC0yMDAsIDE0MCk7XG4gICAgXG4gICAgICAgIHRoaXMudXNlX2J0biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ1c2VfYnRuXCIpO1xuICAgICAgICB0aGlzLnVzZV9idG5fbGFiID0gdGhpcy51c2VfYnRuLmdldENoaWxkQnlOYW1lKFwiTGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy51c2VfYnRuX2xhYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqFwiKTtcbiAgICBcbiAgICAgICAgdGhpcy5oYW5kbGVfY29udGFpbmVyID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImhhbmRsZV9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuaGFuZGxlX2NvbnRhaW5lcl9jeSA9IDA7XG4gICAgXG4gICAgICAgIC8vICDlpoLmnpzkuI3mmK/kuqflh7rotYTmupDnsbvnmoQs6L+Z5Liq5Lic6KW/6KaB5bGF5Lit54i26IqC54K5XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5oYW5kbGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lcl95ID0gdGhpcy5jb250YWluZXIueTtcbiAgICBcbiAgICAgICAgdGhpcy5zdWJfYnRuID0gdGhpcy5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJzdWJfYnRuXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWHj+WPt1xuICAgICAgICB0aGlzLmFkZF9idG4gPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImFkZF9idG5cIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Yqg5Y+3XG4gICAgICAgIHRoaXMubWF4X2J0biA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibWF4X2J0blwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnIDlpKflgLxcbiAgICAgICAgdGhpcy5zbGlkZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInNsaWRlclwiKS5nZXRDb21wb25lbnQoY2MuU2xpZGVyKTsvLyDmu5HlnZdcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiUHJvZ3Jlc3NCYXJcIikuZ2V0Q29tcG9uZW50KGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgLy8gdGhpcy5zbGlkZXI6c2V0QmFyUGVyY2VudCgyMCwgODApXG4gICAgXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInZhbHVlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAgICAvLyDkvb/nlKjmlbDph4/mj5DnpLpcbiAgICBcbiAgICAgICAgdGhpcy51c2VfdGl0bGUgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAvLyDkvb/nlKjmlbDph4/mj5DnpLpcbiAgICAgICAgdGhpcy51c2VfdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkvb/nlKjmlbDph4/vvJpcIik7XG4gICAgXG4gICAgICAgIHRoaXMuZXh0ZW5kX2NvbnRhaW5lciA9IHRoaXMuaGFuZGxlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImV4dGVuZF9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMudXNlX2l0ZW1fdGl0bGUgPSB0aGlzLmV4dGVuZF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ1c2VfaXRlbV90aXRsZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IFwiXCI7XG4gICAgXG4gICAgICAgIHRoaXMudXNlX2VmZmVjdCA9IHRoaXMuZXh0ZW5kX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInVzZV9lZmZlY3RcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICBcbiAgICAgICAgdGhpcy50aXRsZV9sYWJlbCA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnRpdGxlX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5om56YeP5L2/55SoXCIpO1xuICAgICAgICB0aGlzLml0ZW1fbmFtZSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX25hbWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5pdGVtX293biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtX293blwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2xvc2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDIpO1xuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy51c2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gTWF0aC5taW4odGhpcy5jdXJfc2VsZWN0ZWRfc3VtLHRoaXMuaXRlbV92by5xdWFudGl0eSk7XG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuW9k+WJjeaVsOmHj+S4jeiDveS4ujBcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMudHlwZSA9PSBCYWNrUGFja0NvbnN0Lkl0ZW1Db25zdW1lVHlwZS51c2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMDUxNSh0aGlzLml0ZW1fdm8uaWQsIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSx0aGlzLnNlbGVjdF9nb29kcyk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAvLyDph5HluIHluILlnLrnmoTnianlk4Hlh7rllK5cbiAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdF9nb29kcyAmJiB0aGlzLnNlbGVjdF9nb29kcy50eXBlICYmIHRoaXMuc2VsZWN0X2dvb2RzLnR5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmtldENvbnRyb2xsZXI6Z2V0SW5zdGFuY2UoKTpzZW5kZXIyMzUwMiggdGhpcy5pdGVtX3ZvLmlkLHRoaXMuY3VyX3NlbGVjdGVkX3N1bSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXRjaFVzZUl0ZW1WaWV3KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMDUyMihCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLLCBbe2lkOnRoaXMuaXRlbV92by5pZCwgYmlkOnRoaXMuaXRlbV92by5iYXNlX2lkLG51bTp0aGlzLmN1cl9zZWxlY3RlZF9zdW19XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgdGhpcy5zbGlkZXIubm9kZS5vbihcInNsaWRlXCIsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQodGhpcy5zbGlkZXIucHJvZ3Jlc3MpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICB9LHRoaXMpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnN1Yl9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDApcmV0dXJuOy8v5bey57uP5piv5pyA5bCP55qE5LqGXG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gLSAxO1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJVc2VJdGVtSW5mb0J5TnVtKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmFkZF9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEwMClyZXR1cm47Ly/lt7Lnu4/mmK/mnIDlpKfnmoTkuoZcbiAgICAgICAgICAgIGlmKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA+PSB0aGlzLml0ZW1fdm8ucXVhbnRpdHkpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gdGhpcy5jdXJfc2VsZWN0ZWRfc3VtICsgMTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeU51bSh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5tYXhfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICAgICAgaWYocGVyY2VudCA9PSAxMDApcmV0dXJuOy8v5bey57uP5piv5pyA5aSn55qE5LqGXG4gICAgICAgICAgICBpZih0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPj0gdGhpcy5pdGVtX3ZvLnF1YW50aXR5KXJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IHRoaXMuaXRlbV92by5xdWFudGl0eTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeU51bSh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICB2YXIgaXRlbSA9IHBhcmFtc1swXTtcbiAgICAgICAgdmFyIHR5cGUgPSBwYXJhbXNbMV07XG4gICAgICAgIHZhciBzZWxlY3Rfdm8gPSBwYXJhbXNbMl07XG5cbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBCYWNrUGFja0NvbnN0Lkl0ZW1Db25zdW1lVHlwZS51c2U7XG4gICAgICAgIHRoaXMuaXRlbV92byA9IGl0ZW07XG4gICAgICAgIHRoaXMuc2VsZWN0X2dvb2RzID0gc2VsZWN0X3ZvO1xuICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXRjaFVzZUl0ZW1WaWV3KGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUudXNlKXtcbiAgICAgICAgICAgIHRoaXMudGl0bGVfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmibnph4/kvb/nlKhcIik7XG4gICAgICAgICAgICB0aGlzLnVzZV90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqOaVsOmHj++8mlwiKTtcbiAgICAgICAgICAgIHRoaXMudXNlX2J0bl9sYWIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkvb/nlKhcIik7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW0oKTtcbiAgICAgICAgfWVsc2UgaWYodGhpcy50eXBlID09IEJhY2tQYWNrQ29uc3QuSXRlbUNvbnN1bWVUeXBlLnJlc29sdmUpe1xuICAgICAgICAgICAgdGhpcy50aXRsZV9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaJuemHj+WIhuino1wiKTtcbiAgICAgICAgICAgIHRoaXMudXNlX3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5YiG6Kej5pWw6YeP77yaXCIpO1xuICAgICAgICAgICAgdGhpcy51c2VfYnRuX2xhYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIhuino1wiKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbEl0ZW0oKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnRpdGxlX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi54mp5ZOB5Ye65ZSuXCIpO1xuICAgICAgICAgICAgdGhpcy51c2VfdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlh7rllK7mlbDph4/vvJpcIik7XG4gICAgICAgICAgICB0aGlzLnVzZV9idG5fbGFiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Ye65ZSuXCIpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsSXRlbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRVc2VJbmZvKDEwMClcbiAgICB9LFxuXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIC0tZGVzYzrpkojlr7nlh7rllK7nsbvnianlk4HnmoTlpITnkIZcbiAgICAvLyAtLUByZXR1cm4gXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHVwZGF0ZUNlbGxJdGVtOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsIHx8IHRoaXMuaXRlbV92by5jb25maWcgPT1udWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5pdGVtLnNldERhdGEodGhpcy5pdGVtX3ZvLmNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXRlbV9uYW1lLnN0cmluZyA9IHRoaXMuaXRlbV92by5jb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5pdGVtX293bi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmi6XmnIkgJXMg5LiqXCIpLCB0aGlzLml0ZW1fdm8ucXVhbnRpdHkpO1xuICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSB0aGlzLml0ZW1fdm8ucXVhbnRpdHk7XG4gICAgICAgIC8vICDmiZPlvIDpnaLmnb/nmoTml7blgJks6YO95piv6buY6K6k6YCJ5Lit5pyA5aSn5pWw6YePXG4gICAgICAgIHRoaXMudmFsdWUuc3RyaW5nID0gdGhpcy5pdGVtX3ZvLnF1YW50aXR5O1xuICAgICAgICAvLyAg6K6+572u5pyA5aSnXG4gICAgICAgIHRoaXMuc2xpZGVyLnByb2dyZXNzID0gMTtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHRoaXMuc2xpZGVyLnByb2dyZXNzO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLml0ZW1fdm8uY29uZmlnLnZhbHVlO1xuICAgICAgICBpZih2YWx1ZSAhPSBudWxsICYmIFV0aWxzLm5leHQodmFsdWUpICE9bnVsbCl7XG4gICAgICAgICAgICB0aGlzLnZhbHVlX2NvbmZpZyA9IHZhbHVlWzBdO1xuICAgICAgICAgICAgaWYodGhpcy52YWx1ZV9jb25maWcgPT0gbnVsbCB8fCB0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBudWxsIHx8IHR5cGVvZih0aGlzLnZhbHVlX2NvbmZpZ1swXSkgIT0gXCJudW1iZXJcIilyZXR1cm47XG4gICAgICAgICAgICB2YXIgYmFzZV9pZCA9IHRoaXMudmFsdWVfY29uZmlnWzBdO1xuICAgICAgICAgICAgdmFyIG93biA9IDA7XG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWc9PW51bGwpcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiY29pblwiKSl7XG4gICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLmNvaW47XG4gICAgICAgICAgICB9ZWxzZSBpZih0aGlzLnZhbHVlX2NvbmZpZ1swXSA9PSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiaGVyb19zb3VsXCIpKXtcbiAgICAgICAgICAgICAgICBvd24gPSB0aGlzLnJvbGVfdm8uaGVyb19zb3VsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNldEN1clVzZUl0ZW1JbmZvQnlQZXJjZW50KDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuc2VsZWN0X2dvb2RzICYmIHRoaXMuc2VsZWN0X2dvb2RzLnR5cGUgJiYgdGhpcy5zZWxlY3RfZ29vZHMudHlwZSA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMudmFsdWVfY29uZmlnID0gdGhpcy5zZWxlY3RfZ29vZHMudmFsdWVfbGlzdCB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQoMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlSXRlbTpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLml0ZW1fdm8gPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICB0aGlzLml0ZW0uc2V0RGF0YSh0aGlzLml0ZW1fdm8uY29uZmlnKTtcbiAgICAgICAgdGhpcy5pdGVtX25hbWUuc3RyaW5nID0gdGhpcy5pdGVtX3ZvLmNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLml0ZW1fb3duLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaLpeaciSAlcyDkuKpcIiksIHRoaXMuaXRlbV92by5xdWFudGl0eSk7XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdGVkX3N1bSA9IHRoaXMuaXRlbV92by5xdWFudGl0eTtcbiAgICAgICAgLy8gIOaJk+W8gOmdouadv+eahOaXtuWAmSzpg73mmK/pu5jorqTpgInkuK3mnIDlpKfmlbDph49cbiAgICAgICAgdGhpcy52YWx1ZS5zdHJpbmcgPSB0aGlzLml0ZW1fdm8ucXVhbnRpdHk7XG4gICAgICAgIC8vICDorr7nva7mnIDlpKdcbiAgICAgICAgdGhpcy5zbGlkZXIucHJvZ3Jlc3MgPSAxO1xuICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgIC8vIOWmguaenOaYr+S6p+WHuui1hOS6p+exu+eahFxuICAgICAgICBpZih0aGlzLmlzQXNzZXRzSXRlbSh0aGlzLml0ZW1fdm8uY29uZmlnKSA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnkgPSB0aGlzLmNvbnRhaW5lcl95O1xuICAgICAgICAgICAgdGhpcy5leHRlbmRfY29udGFpbmVyLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyAg55u05o6l5Y+W56ys5LiA5Liq5pWI5p6c5ZCnXG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fdm8uY29uZmlnLmVmZmVjdCAmJiBVdGlscy5uZXh0KHRoaXMuaXRlbV92by5jb25maWcuZWZmZWN0KSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gdGhpcy5pdGVtX3ZvLmNvbmZpZy5lZmZlY3RbMF07XG4gICAgICAgICAgICAgICAgaWYoZWZmZWN0ICE9IG51bGwgJiYgdGhpcy5yb2xlX3ZvICE9IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3duID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYoZWZmZWN0LmVmZmVjdF90eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV9lZmZlY3RfdHlwZS5HT0xEKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG93biA9IHRoaXMucm9sZV92by5jb2luO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihlZmZlY3QuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkNPSU4pe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLmNvaW47XG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVmZmVjdC5lZmZlY3RfdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fZWZmZWN0X3R5cGUuUEFSVE5FUl9FWFApe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3duID0gdGhpcy5yb2xlX3ZvLnBhcnRuZXJfZXhwX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyVXNlSXRlbUluZm9CeVBlcmNlbnQoMSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIueSA9IHRoaXMuaGFuZGxlX2NvbnRhaW5lcl9jeTtcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kX2NvbnRhaW5lci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gLS1kZXNjOuiuvue9ruW9k+WJjei/m+W6pueahOebuOWFs+aVsOaNrlxuICAgIC8vIC0tQHBlcmNlbnQ6XG4gICAgLy8gLS1AcmV0dXJuIFxuICAgIC8vIC0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBzZXRDdXJVc2VJdGVtSW5mb0J5UGVyY2VudDpmdW5jdGlvbihwZXJjZW50KXtcbiAgICAgICAgaWYodGhpcy5pdGVtX3ZvID09IG51bGwpcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cl9zZWxlY3RlZF9zdW0gPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKCBwZXJjZW50ICogdGhpcy5pdGVtX3ZvLnF1YW50aXR5KSk7XG4gICAgICAgIHRoaXMuc2V0VXNlSW5mbyh0aGlzLmN1cl9zZWxlY3RlZF9zdW0pO1xuICAgIH0sXG5cbiAgICBzZXRDdXJVc2VJdGVtSW5mb0J5TnVtOmZ1bmN0aW9uKG51bSl7XG4gICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfc3VtID0gTWF0aC5tYXgoMSwgbnVtKTtcbiAgICAgICAgdmFyIGFsbF9udW0gPU1hdGgubWF4KDEsdGhpcy5pdGVtX3ZvLnF1YW50aXR5LTEpO1xuICAgICAgICB2YXIgcGVyY2VudCA9ICh0aGlzLmN1cl9zZWxlY3RlZF9zdW0tMSkgLyBhbGxfbnVtO1xuICAgICAgICB0aGlzLnNsaWRlci5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgdGhpcy5zZXRVc2VJbmZvKHRoaXMuY3VyX3NlbGVjdGVkX3N1bSk7XG4gICAgfSxcblxuICAgIHNldFVzZUluZm86ZnVuY3Rpb24oc3VtKXtcbiAgICAgICAgc3VtID0gTWF0aC5taW4odGhpcy5pdGVtX3ZvLnF1YW50aXR5LHN1bSk7XG4gICAgICAgIHRoaXMudmFsdWUuc3RyaW5nID0gc3VtO1xuICAgICAgICBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUuc2VsbCAmJiB0aGlzLnZhbHVlX2NvbmZpZyAhPW51bGwpe1xuICAgICAgICAgICAgdmFyIGJhc2VfdmFsdWUgPSB0aGlzLnZhbHVlX2NvbmZpZ1sxXSB8fCAwO1xuICAgICAgICAgICAgdmFyIGJhc2VfaWQgPSB0aGlzLnZhbHVlX2NvbmZpZ1swXTtcbiAgICAgICAgICAgIGlmKGJhc2VfaWQ9PSBudWxsKXJldHVybjsgXG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWc9PW51bGwpcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy51c2VfaXRlbV90aXRsZS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlh7rllK7lkI7lj6/ojrflvpclc++8mlwiKSwgaXRlbV9jb25maWcubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Quc3RyaW5nID0gYmFzZV92YWx1ZSAqIHN1bTtcbiAgICAgICAgICAgIHRoaXMudXNlX2VmZmVjdC5ub2RlLnggPSB0aGlzLnVzZV9pdGVtX3RpdGxlLm5vZGUuZ2V0Q29udGVudFNpemUoKS53aWR0aCArIHRoaXMudXNlX2l0ZW1fdGl0bGUubm9kZS54O1xuICAgICAgICB9ZWxzZSBpZih0aGlzLnR5cGUgPT0gQmFja1BhY2tDb25zdC5JdGVtQ29uc3VtZVR5cGUucmVzb2x2ZSAmJiB0aGlzLnZhbHVlX2NvbmZpZyAhPSBudWxsKXtcbiAgICAgICAgICAgIHZhciBiYXNlX3ZhbHVlID0gdGhpcy52YWx1ZV9jb25maWdbMV0gfHwgMDtcbiAgICAgICAgICAgIHZhciBiYXNlX2lkID0gdGhpcy52YWx1ZV9jb25maWdbMF07XG4gICAgICAgICAgICBpZihiYXNlX2lkID09bnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJhc2VfaWQpO1xuICAgICAgICAgICAgaWYoaXRlbV9jb25maWcgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuWIhuino+WQjuWPr+iOt+W+lyVz77yaXCIpLCBpdGVtX2NvbmZpZy5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudXNlX2VmZmVjdC5zdHJpbmcgPSBiYXNlX3ZhbHVlICogc3VtO1xuICAgICAgICAgICAgdGhpcy51c2VfZWZmZWN0Lm5vZGUueCA9IHRoaXMudXNlX2l0ZW1fdGl0bGUubm9kZS5nZXRDb250ZW50U2l6ZSgpLndpZHRoICsgdGhpcy51c2VfaXRlbV90aXRsZS5ub2RlLng7IFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV92byA9PSBudWxsIHx8IHRoaXMuaXRlbV92by5jb25maWcgPT0gbnVsbCB8fCB0aGlzLml0ZW1fdm8uY29uZmlnLmVmZmVjdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5pdGVtX3ZvLmNvbmZpZy5lZmZlY3QpID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy5pc0Fzc2V0c0l0ZW0odGhpcy5pdGVtX3ZvLmNvbmZpZykgPT0gZmFsc2UpcmV0dXJuO1xuICAgICAgICAgICAgdmFyIGVmZmVjdCA9IHRoaXMuaXRlbV92by5jb25maWcuZWZmZWN0WzBdO1xuICAgICAgICAgICAgaWYoZWZmZWN0IT1udWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9pdGVtX3RpdGxlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuS9v+eUqOWQjuWPr+iOt+W+lyVz77yaXCIpLCBDb25maWcuaXRlbV9kYXRhLmRhdGFfaXRlbV9lZmZlY3RfdHlwZVtlZmZlY3QuZWZmZWN0X3R5cGVdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Quc3RyaW5nID0gZWZmZWN0LnZhbCAqIHN1bTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZV9lZmZlY3Qubm9kZS54ID0gdGhpcy51c2VfaXRlbV90aXRsZS5ub2RlLmdldENvbnRlbnRTaXplKCkud2lkdGggKyB0aGlzLnVzZV9pdGVtX3RpdGxlLm5vZGUueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gLS1kZXNjOuaYr+WQpuaYr+i0ouS6p+exu+eahOeJqeWTgVxuICAgIC8vIC0tQHJldHVybiBcbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgaXNBc3NldHNJdGVtOmZ1bmN0aW9uKGNvbmZpZyl7XG4gICAgICAgIGlmKGNvbmZpZyA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihjb25maWcuZWZmZWN0ID09IG51bGwgfHwgVXRpbHMubmV4dChjb25maWcuZWZmZWN0KSA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNfYXNzZXRzID0gZmFsc2U7XG4gICAgICAgIGZvcih2YXIgaSBpbiBjb25maWcuZWZmZWN0KXtcbiAgICAgICAgICAgIHZhciB2ID0gY29uZmlnLmVmZmVjdFtpXTtcbiAgICAgICAgICAgIGlmKHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkdPTEQgfHxcbiAgICAgICAgICAgIHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLkNPSU4gfHxcbiAgICAgICAgICAgIHYuZWZmZWN0X3R5cGUgPT0gQmFja1BhY2tDb25zdC5pdGVtX2VmZmVjdF90eXBlLlBBUlRORVJfRVhQKXtcbiAgICAgICAgICAgICAgICBpc19hc3NldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19hc3NldHM7XG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuaXRlbSl7XG4gICAgICAgICAgICB0aGlzLml0ZW0uZGVsZXRlTWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmN0cmwub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==