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
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hallows/hallows_controller.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, 'ce806DRwFFKc4wfxpJUe+aC', 'hallows_controller');
// Scripts/mod/hallows/hallows_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-02-18 14:15:05
// --------------------------------------------------------------------
var MainuiConst = require("mainui_const");
 
var MainuiController = require("mainui_controller");
 
var BackpackEvent = require("backpack_event");
 
var Battle_dramaEvent = require("battle_drama_event");
 
var HallowsEvent = require("hallows_event");
 
var BackPackConst = require("backpack_const");
 
var HallowsController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var HallowsModel = require("hallows_model");
 
    this.model = new HallowsModel();
    this.model.initConfig();
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    // if(this.backpack_init_event == null){
    //     this.backpack_init_event = gcore.GlobalEvent.bing(BackpackEvent.GET_ALL_DATA,(function(){
    //         // -- if bag_code ~= BackPackConst.Bag_Code.BACKPACK then return end
    //         // -- self.role_vo = RoleController:getInstance():getRoleVo() 
    //         // -- if self.role_vo  == nil then
    //         // --     if self.init_role_event == nil then
    //         // --         self.init_role_event = GlobalEvent:getInstance():Bind(EventId.ROLE_CREATE_SUCCESS, function()
    //         // --             GlobalEvent:getInstance():UnBind(self.init_role_event)
    //         // --             self.role_vo = RoleController:getInstance():getRoleVo() 
    //         // --             if self.role_vo then
    //         // --                 self:requestInitProtocals()
    //         // --             end
    //         // --         end)
    //         // --     end
    //         // -- else
    //         // --     self:requestInitProtocals()
    //         // -- end
    //     }).bind(this))
    // }
    if (this.battle_drama_event == null) {
      this.battle_drama_event = gcore.GlobalEvent.bind(Battle_dramaEvent.BattleDrama_Update_Max_Id, function (max_id) {
        this.requestInitProtocals(max_id);
      }.bind(this));
    }
 
    if (this.goods_add_event == null) {
      this.goods_add_event = gcore.GlobalEvent.bind(BackpackEvent.ADD_GOODS, function (bag_code, item_list) {
        if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
        this.checkNeedUpdateRedStatus(item_list);
      }.bind(this));
    }
 
    if (this.goods_update_event == null) {
      this.goods_update_event = gcore.GlobalEvent.bind(BackpackEvent.MODIFY_GOODS_NUM, function (bag_code, item_list) {
        if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
        this.checkNeedUpdateRedStatus(item_list);
      }.bind(this));
    }
 
    if (this.goods_del_event == null) {
      this.goods_del_event = gcore.GlobalEvent.bind(BackpackEvent.DELETE_GOODS, function (bag_code, item_list) {
        if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
        this.checkNeedUpdateRedStatus(item_list);
      }.bind(this));
    }
 
    if (this.re_link_game_event = null) {
      this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {
        var GuideController = require("guide_controller");
 
        if (!GuideController.getInstance().isInGuide()) {
          this.resonate_data = null;
          this.openHallowsMainWindow(false);
        }
      }.bind(this));
    }
  },
  //物品变化的时候做处理,如果是自己操作引起的不需要这里判断的,因为那属于自身更新
  checkNeedUpdateRedStatus: function checkNeedUpdateRedStatus(item_list) {
    if (this.is_self_handle) {
      this.is_self_handle = false;
      return;
    }
 
    if (this.item_list == null || Utils.next(item_list) == null) return;
 
    for (var i in item_list) {
      var cfg = item_list[i].config;
 
      if (cfg) {
        if (cfg.id == 72001 || cfg.id == 72002 || cfg.id == 72003) {
          this.model.checkHallowsRedStatus();
        }
      }
    }
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(24100, this.handle24100); // 圣器基础属性
 
    this.RegisterProtocal(24101, this.handle24101); // 圣器进阶
 
    this.RegisterProtocal(24102, this.handle24102); // 圣灵穿戴
 
    this.RegisterProtocal(24103, this.handle24103); // 圣技升级
 
    this.RegisterProtocal(24104, this.handle24104); // 使用圣印
 
    this.RegisterProtocal(24105, this.handle24105); // 共鸣变化
 
    this.RegisterProtocal(24107, this.handle24107); // 更新圣器
 
    this.RegisterProtocal(24108, this.handle24108); // 新增圣器,这个时候播放激活特效
 
    this.RegisterProtocal(24120, this.handle24120); // 圣器任务列表
 
    this.RegisterProtocal(24121, this.handle24121); // 圣器任务列表
 
    this.RegisterProtocal(24122, this.handle24122); // 圣器任务列表
 
    this.RegisterProtocal(24123, this.handle24123); // 神器重铸
 
    this.RegisterProtocal(24124, this.handle24124); // 是否打开过神器界面
  },
  //监测圣器系统是否解锁
  checkIsOpen: function checkIsOpen(show_desc) {
    var open_config = Config.function_data.data_base[MainuiConst.btn_index.hallows + 1];
    if (open_config == null) return false;
    var is_open = MainuiController.getInstance().checkIsOpenByActivate(open_config.activate);
 
    if (show_desc && !is_open) {
      message(open_config.desc);
    }
 
    return is_open;
  },
  //初始登记请求的一些数据
  requestInitProtocals: function requestInitProtocals() {
    var can_request = this.checkIsOpen();
 
    if (can_request) {
      if (this.battle_drama_event) {
        gcore.GlobalEvent.unbind(this.battle_drama_event);
        this.battle_drama_event = null;
      }
 
      this.requestHallowsInfo();
    }
  },
  //引导需要
  getHallowsRoot: function getHallowsRoot(finish_cb) {
    if (!finish_cb) {
      if (this.hallows_window) {
        return this.hallows_window.root_wnd;
      }
    } else {
      if (this.hallows_window) {
        this.hallows_window.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    }
  },
  //引导需要
  getHallowsActivityRoot: function getHallowsActivityRoot(finish_cb) {
    if (!finish_cb) {
      if (this.activity_window) {
        return this.activity_window.root_wnd;
      }
    } else {
      if (this.activity_window) {
        this.activity_window.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    }
  },
  // 引导需要
  getHallowsPreviewRoot: function getHallowsPreviewRoot(finish_cb) {
    if (!finish_cb) {
      if (this.hallows_preview) {
        return this.hallows_preview.root_wnd;
      }
    } else {
      if (this.hallows_preview) {
        this.hallows_preview.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    }
  },
  //打开圣器主界面
  openHallowsMainWindow: function openHallowsMainWindow(status, hallows_id, index) {
    if (!status) {
      if (this.hallows_window) {
        this.hallows_window.close();
        this.hallows_window = null;
      }
    } else {
      //判断开启
      if (!this.checkIsOpen(true)) return; // //是否打开过神器界面,第一次打开时要打开失落神器界面(引导需要)
      // var open_flag = this.model.getHallowsOpenFlag();
      // if(open_flag == 0){
      //     this.requestSignOpenHallows()
      //     this.openHallowsPreviewWindow(true)
      //     return
      // }
 
      if (this.hallows_window == null) {
        //如果已经全部激活,则打开神器主界面(包含升级和技能);否则打开神器任务界面
        if (this.model.checkIsHaveAllHallows()) {
          this.hallows_window = Utils.createClass("hallows_main_window", this);
        } else {
          this.hallows_window = Utils.createClass("hallows_task_window", this);
        }
      }
 
      if (this.hallows_window && this.hallows_window.isOpen() == false) {
        this.hallows_window.open(hallows_id, index);
      }
    }
  },
  // 打开所有神器预览界面
  openHallowsPreviewWindow: function openHallowsPreviewWindow(status) {
    if (status) {
      if (this.hallows_preview == null) {
        this.hallows_preview = Utils.createClass("hallows_preview_window", this);
      }
 
      if (this.hallows_preview && this.hallows_preview.isOpen() == false) {
        this.hallows_preview.open();
      }
    } else {
      if (this.hallows_preview) {
        this.hallows_preview.close();
        this.hallows_preview = null;
      }
    }
  },
  //打开圣器的圣印界面
  openHallowsTraceWindow: function openHallowsTraceWindow(status, data) {
    if (!status) {
      if (this.trace_window) {
        this.trace_window.close();
        this.trace_window = null;
      }
    } else {
      if (data == null) return;
 
      if (this.trace_window == null) {
        this.trace_window = Utils.createClass("hallows_trace_window", this);
      }
 
      if (this.trace_window && this.trace_window.isOpen() == false) {
        this.trace_window.open(data);
      }
    }
  },
  //圣器装备的tips
  openHallowsTips: function openHallowsTips(status, data) {
    if (!status) {
      if (this.hallows_tips) {
        this.hallows_tips.close();
        this.hallows_tips = null;
      }
    } else {
      if (data == null) return;
 
      if (this.hallows_tips == null) {
        this.hallows_tips = Utils.createClass("hallows_tips_window", this);
      }
 
      if (this.hallows_tips && this.hallows_tips.isOpen() == false) {
        this.hallows_tips.open(data);
      }
    }
  },
  //圣器激活界面
  openHallowsActivityWindow: function openHallowsActivityWindow(status, data) {
    if (!status) {
      if (this.activity_window) {
        this.activity_window.close();
        this.activity_window = null;
      }
    } else {
      if (data == null) return;
 
      if (this.activity_window == null) {
        this.activity_window = Utils.createClass("hallows_activity_window", this);
      }
 
      if (this.activity_window && this.activity_window.isOpen() == false) {
        this.activity_window.open(data);
      }
    }
  },
  //进阶界面
  openHallowsStepUpWindow: function openHallowsStepUpWindow(status, data) {
    if (!status) {
      if (this.step_up_window) {
        this.step_up_window.close();
        this.step_up_window = null;
      } //关闭升阶面板之后,弹出共鸣面板
 
 
      if (this.resonate_data) {
        this.openHallowsResonateUpWindow(true, this.resonate_data);
        this.resonate_data = null;
      }
    } else {
      if (data == null) return;
 
      if (this.step_up_window == null) {
        this.step_up_window = Utils.createClass("hallows_step_up_window", this);
      }
 
      if (this.step_up_window && this.step_up_window.isOpen() == false) {
        this.step_up_window.open(data);
      }
    }
  },
  //共鸣
  // --[[function HallowsController:openHallowsResonateUpWindow(status, data)
  //     if not status then
  //         if self.resonate_up_window then
  //             self.resonate_up_window:close()
  //             self.resonate_up_window = nil
  //         end
  //     else
  //         if self.resonate_up_window == nil then
  //             self.resonate_up_window = HallowsResonateUpWindow.New()
  //         end
  //         self.resonate_up_window:open(data)
  //     end
  // end --]]
  requestHallowsInfo: function requestHallowsInfo() {
    this.SendProtocal(24100, {});
    this.SendProtocal(24120, {});
  },
  handle24100: function handle24100(data) {
    this.model.updateHallowsInfo(data);
  },
  //更新圣器
  handle24107: function handle24107(data) {
    this.model.updateHallowsData(data);
    gcore.GlobalEvent.fire(HallowsEvent.HallowsUpdateEvent, data.id);
  },
  //激活圣器
  handle24108: function handle24108(data) {
    this.model.updateHallowsData(data); // 如果是激活了最后一个神器,且神器任务界面正在显示,则切换为神器升级界面
 
    if (this.model.checkIsHaveAllHallows() && this.hallows_window) {
      this.openHallowsMainWindow(false);
      this.openHallowsMainWindow(true);
    } // /通知面板更新数据
 
 
    gcore.GlobalEvent.fire(HallowsEvent.HallowsActivityEvent, data.id); //播放激活特效
 
    this.openHallowsActivityWindow(true, data);
  },
  //圣器进阶
  requestHallowsAdvance: function requestHallowsAdvance(id, is_auto) {
    this.is_self_handle = true;
    var auto_type = 0;
 
    if (is_auto) {
      auto_type = 1;
    }
 
    var protocal = {};
    protocal.id = id;
    protocal.is_auto = auto_type;
    this.SendProtocal(24101, protocal);
  },
  handle24101: function handle24101(data) {
    message(data.msg); //升阶了
 
    if (data.result == 1) {
      this.openHallowsStepUpWindow(true, data.id);
    } else {
      this.is_self_handle = false;
    }
 
    gcore.GlobalEvent.fire(HallowsEvent.HallowsAdvanceEvent, data.id, data.result);
  },
  //升级圣器技能
  requestHallowsSkillUpgrade: function requestHallowsSkillUpgrade(hallows_id) {
    this.is_self_handle = true;
    var protocal = {};
    protocal.hallows_id = hallows_id;
    this.SendProtocal(24103, protocal);
  },
  handle24103: function handle24103(data) {
    message(data.msg);
 
    if (data.result == 1) {// gcore.GlobalEvent.fire(HallowsEvent.HallowsSkillUpgradeEvent, data.hallows_id, data.id);
    } else {
      this.is_self_handle = false;
    }
  },
  //穿戴一件装备
  requestHallowsEquip: function requestHallowsEquip(hallows_id, item_id, pos) {
    this.is_self_handle = true;
    hallows_id = hallows_id || 0;
    item_id = item_id || 1;
    pos = pos || 1;
    var protocal = {};
    protocal.hallows_id = hallows_id;
    protocal.id = item_id;
    protocal.pos = pos;
    this.SendProtocal(24102, protocal);
  },
  handle24102: function handle24102(data) {
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(HallowsEvent.HallowsEqupUpEvent, data.id, data.pos);
    } else {
      this.is_self_handle = false;
    }
  },
  //使用圣印物品
  requestUseTraceItem: function requestUseTraceItem(hallows_id, num) {
    this.is_self_handle = true;
    hallows_id = hallows_id || 0;
    num = num || 1;
    var protocal = {};
    protocal.hallows_id = hallows_id;
    protocal.num = num;
    this.SendProtocal(24104, protocal);
  },
  handle24104: function handle24104(data) {
    message(data.msg);
 
    if (data.result == 1) {
      this.openHallowsTraceWindow(false);
    } else {
      this.is_self_handle = false;
    }
  },
  // 初始化圣器任务列表
  handle24120: function handle24120(data) {
    this.model.updateHallowsTask(data.list);
  },
  // 圣器任务更新信息
  handle24121: function handle24121(data) {
    this.model.updateHallowsTask(data.list);
  },
  requestSubmitHallowsTask: function requestSubmitHallowsTask(id) {
    var protocal = {};
    protocal.id = id;
    this.SendProtocal(24122, protocal);
  },
  handle24122: function handle24122(data) {
    message(data.msg);
  },
  //共鸣变化
  handle24105: function handle24105(data) {
    this.resonate_data = data; // this.openHallowsResonateUpWindow(true, data);
  },
  // 请求神器重铸
  requestHallowsReset: function requestHallowsReset(id) {
    var protocal = {};
    protocal.id = id;
    this.SendProtocal(24123, protocal);
  },
  handle24123: function handle24123(data) {
    message(data.msg);
  },
  // 请求标记打开神器界面
  requestSignOpenHallows: function requestSignOpenHallows() {
    this.SendProtocal(24124, {});
  },
  handle24124: function handle24124(data) {
    if (data.is_first) {
      this.model.setOpenHallowsFlag(data.is_first);
    }
  },
  __delete: function __delete() {
    if (this.model != null) {
      this.model.DeleteMe();
      this.model = null;
    }
  }
});
module.exports = HallowsController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFxoYWxsb3dzX2NvbnRyb2xsZXIuanMiXSwibmFtZXMiOlsiTWFpbnVpQ29uc3QiLCJyZXF1aXJlIiwiTWFpbnVpQ29udHJvbGxlciIsIkJhY2twYWNrRXZlbnQiLCJCYXR0bGVfZHJhbWFFdmVudCIsIkhhbGxvd3NFdmVudCIsIkJhY2tQYWNrQ29uc3QiLCJIYWxsb3dzQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiSGFsbG93c01vZGVsIiwibW9kZWwiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwiYmF0dGxlX2RyYW1hX2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJCYXR0bGVEcmFtYV9VcGRhdGVfTWF4X0lkIiwibWF4X2lkIiwicmVxdWVzdEluaXRQcm90b2NhbHMiLCJnb29kc19hZGRfZXZlbnQiLCJBRERfR09PRFMiLCJiYWdfY29kZSIsIml0ZW1fbGlzdCIsIkJhZ19Db2RlIiwiQkFDS1BBQ0siLCJjaGVja05lZWRVcGRhdGVSZWRTdGF0dXMiLCJnb29kc191cGRhdGVfZXZlbnQiLCJNT0RJRllfR09PRFNfTlVNIiwiZ29vZHNfZGVsX2V2ZW50IiwiREVMRVRFX0dPT0RTIiwicmVfbGlua19nYW1lX2V2ZW50IiwiRXZlbnRJZCIsIkVWVF9SRV9MSU5LX0dBTUUiLCJHdWlkZUNvbnRyb2xsZXIiLCJnZXRJbnN0YW5jZSIsImlzSW5HdWlkZSIsInJlc29uYXRlX2RhdGEiLCJvcGVuSGFsbG93c01haW5XaW5kb3ciLCJpc19zZWxmX2hhbmRsZSIsIlV0aWxzIiwibmV4dCIsImkiLCJjZmciLCJjb25maWciLCJpZCIsImNoZWNrSGFsbG93c1JlZFN0YXR1cyIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsImhhbmRsZTI0MTAwIiwiaGFuZGxlMjQxMDEiLCJoYW5kbGUyNDEwMiIsImhhbmRsZTI0MTAzIiwiaGFuZGxlMjQxMDQiLCJoYW5kbGUyNDEwNSIsImhhbmRsZTI0MTA3IiwiaGFuZGxlMjQxMDgiLCJoYW5kbGUyNDEyMCIsImhhbmRsZTI0MTIxIiwiaGFuZGxlMjQxMjIiLCJoYW5kbGUyNDEyMyIsImhhbmRsZTI0MTI0IiwiY2hlY2tJc09wZW4iLCJzaG93X2Rlc2MiLCJvcGVuX2NvbmZpZyIsIkNvbmZpZyIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJidG5faW5kZXgiLCJoYWxsb3dzIiwiaXNfb3BlbiIsImNoZWNrSXNPcGVuQnlBY3RpdmF0ZSIsImFjdGl2YXRlIiwibWVzc2FnZSIsImRlc2MiLCJjYW5fcmVxdWVzdCIsInVuYmluZCIsInJlcXVlc3RIYWxsb3dzSW5mbyIsImdldEhhbGxvd3NSb290IiwiZmluaXNoX2NiIiwiaGFsbG93c193aW5kb3ciLCJyb290X3duZCIsImdldFJvb3RXbmQiLCJnZXRIYWxsb3dzQWN0aXZpdHlSb290IiwiYWN0aXZpdHlfd2luZG93IiwiZ2V0SGFsbG93c1ByZXZpZXdSb290IiwiaGFsbG93c19wcmV2aWV3Iiwic3RhdHVzIiwiaGFsbG93c19pZCIsImluZGV4IiwiY2xvc2UiLCJjaGVja0lzSGF2ZUFsbEhhbGxvd3MiLCJjcmVhdGVDbGFzcyIsImlzT3BlbiIsIm9wZW4iLCJvcGVuSGFsbG93c1ByZXZpZXdXaW5kb3ciLCJvcGVuSGFsbG93c1RyYWNlV2luZG93IiwiZGF0YSIsInRyYWNlX3dpbmRvdyIsIm9wZW5IYWxsb3dzVGlwcyIsImhhbGxvd3NfdGlwcyIsIm9wZW5IYWxsb3dzQWN0aXZpdHlXaW5kb3ciLCJvcGVuSGFsbG93c1N0ZXBVcFdpbmRvdyIsInN0ZXBfdXBfd2luZG93Iiwib3BlbkhhbGxvd3NSZXNvbmF0ZVVwV2luZG93IiwiU2VuZFByb3RvY2FsIiwidXBkYXRlSGFsbG93c0luZm8iLCJ1cGRhdGVIYWxsb3dzRGF0YSIsImZpcmUiLCJIYWxsb3dzVXBkYXRlRXZlbnQiLCJIYWxsb3dzQWN0aXZpdHlFdmVudCIsInJlcXVlc3RIYWxsb3dzQWR2YW5jZSIsImlzX2F1dG8iLCJhdXRvX3R5cGUiLCJwcm90b2NhbCIsIm1zZyIsInJlc3VsdCIsIkhhbGxvd3NBZHZhbmNlRXZlbnQiLCJyZXF1ZXN0SGFsbG93c1NraWxsVXBncmFkZSIsInJlcXVlc3RIYWxsb3dzRXF1aXAiLCJpdGVtX2lkIiwicG9zIiwiSGFsbG93c0VxdXBVcEV2ZW50IiwicmVxdWVzdFVzZVRyYWNlSXRlbSIsIm51bSIsInVwZGF0ZUhhbGxvd3NUYXNrIiwibGlzdCIsInJlcXVlc3RTdWJtaXRIYWxsb3dzVGFzayIsInJlcXVlc3RIYWxsb3dzUmVzZXQiLCJyZXF1ZXN0U2lnbk9wZW5IYWxsb3dzIiwiaXNfZmlyc3QiLCJzZXRPcGVuSGFsbG93c0ZsYWciLCJfX2RlbGV0ZSIsIkRlbGV0ZU1lIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxXQUFXLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlDLGdCQUFnQixHQUFHRCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUUsYUFBYSxHQUFHRixPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUcsaUJBQWlCLEdBQUdILE9BQU8sQ0FBQyxvQkFBRCxDQUEvQjs7QUFDQSxJQUFJSSxZQUFZLEdBQUdKLE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUNBLElBQUlLLGFBQWEsR0FBR0wsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUVBLElBQUlNLGlCQUFpQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM3QixhQUFTQyxjQURvQjtBQUU3QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSDRCO0FBSzdCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixRQUFJQyxZQUFZLEdBQUdaLE9BQU8sQ0FBQyxlQUFELENB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O0FBOGM3QjtBQUNBN0QsRUFBQUEsV0FBVyxFQUFDLHFCQUFTMkMsSUFBVCxFQUFjO0FBQ3RCLFNBQUs1RCxhQUFMLEdBQXFCNEQsSUFBckIsQ0FEc0IsQ0FFdEI7QUFDSCxHQWxkNEI7QUFvZDdCO0FBQ0ErQixFQUFBQSxtQkFBbUIsRUFBQyw2QkFBVW5GLEVBQVYsRUFBYztBQUM5QixRQUFJcUUsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDckUsRUFBVCxHQUFjQSxFQUFkO0FBQ0EsU0FBSzRELFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJTLFFBQXpCO0FBQ0gsR0F6ZDRCO0FBMmQ3QnRELEVBQUFBLFdBQVcsRUFBQyxxQkFBVXFDLElBQVYsRUFBZ0I7QUFDeEJ4QixJQUFBQSxPQUFPLENBQUN3QixJQUFJLENBQUNrQixHQUFOLENBQVA7QUFDSCxHQTdkNEI7QUErZDdCO0FBQ0FjLEVBQUFBLHNCQUFzQixFQUFDLGtDQUFZO0FBQy9CLFNBQUt4QixZQUFMLENBQWtCLEtBQWxCLEVBQXlCLEVBQXpCO0FBQ0gsR0FsZTRCO0FBb2U3QjVDLEVBQUFBLFdBQVcsRUFBQyxxQkFBVW9DLElBQVYsRUFBZ0I7QUFDeEIsUUFBR0EsSUFBSSxDQUFDaUMsUUFBUixFQUFpQjtBQUNiLFdBQUt4SCxLQUFMLENBQVd5SCxrQkFBWCxDQUE4QmxDLElBQUksQ0FBQ2lDLFFBQW5DO0FBQ0g7QUFDSixHQXhlNEI7QUEwZTdCRSxFQUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDbEIsUUFBSSxLQUFLMUgsS0FBTCxJQUFjLElBQWxCLEVBQXdCO0FBQ3BCLFdBQUtBLEtBQUwsQ0FBVzJILFFBQVg7QUFDQSxXQUFLM0gsS0FBTCxHQUFhLElBQWI7QUFDSDtBQUNKO0FBL2U0QixDQUFULENBQXhCO0FBb2ZBNEgsTUFBTSxDQUFDQyxPQUFQLEdBQWlCcEksaUJBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAyLTE4IDE0OjE1OjA1XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIEJhY2twYWNrRXZlbnQgPSByZXF1aXJlKFwiYmFja3BhY2tfZXZlbnRcIik7XG52YXIgQmF0dGxlX2RyYW1hRXZlbnQgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2V2ZW50XCIpO1xudmFyIEhhbGxvd3NFdmVudCA9IHJlcXVpcmUoXCJoYWxsb3dzX2V2ZW50XCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIilcblxudmFyIEhhbGxvd3NDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgSGFsbG93c01vZGVsID0gcmVxdWlyZShcImhhbGxvd3NfbW9kZWxcIik7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBIYWxsb3dzTW9kZWwoKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tlxuICAgIHJlZ2lzdGVyRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGlmKHRoaXMuYmFja3BhY2tfaW5pdF9ldmVudCA9PSBudWxsKXtcbiAgICAgICAgLy8gICAgIHRoaXMuYmFja3BhY2tfaW5pdF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmcoQmFja3BhY2tFdmVudC5HRVRfQUxMX0RBVEEsKGZ1bmN0aW9uKCl7XG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gaWYgYmFnX2NvZGUgfj0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSyB0aGVuIHJldHVybiBlbmRcbiAgICAgICAgLy8gICAgICAgICAvLyAtLSBzZWxmLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlcjpnZXRJbnN0YW5jZSgpOmdldFJvbGVWbygpIFxuICAgICAgICAvLyAgICAgICAgIC8vIC0tIGlmIHNlbGYucm9sZV92byAgPT0gbmlsIHRoZW5cbiAgICAgICAgLy8gICAgICAgICAvLyAtLSAgICAgaWYgc2VsZi5pbml0X3JvbGVfZXZlbnQgPT0gbmlsIHRoZW5cbiAgICAgICAgLy8gICAgICAgICAvLyAtLSAgICAgICAgIHNlbGYuaW5pdF9yb2xlX2V2ZW50ID0gR2xvYmFsRXZlbnQ6Z2V0SW5zdGFuY2UoKTpCaW5kKEV2ZW50SWQuUk9MRV9DUkVBVEVfU1VDQ0VTUywgZnVuY3Rpb24oKVxuICAgICAgICAvLyAgICAgICAgIC8vIC0tICAgICAgICAgICAgIEdsb2JhbEV2ZW50OmdldEluc3RhbmNlKCk6VW5CaW5kKHNlbGYuaW5pdF9yb2xlX2V2ZW50KVxuICAgICAgICAvLyAgICAgICAgIC8vIC0tICAgICAgICAgICAgIHNlbGYucm9sZV92byA9IFJvbGVDb250cm9sbGVyOmdldEluc3RhbmNlKCk6Z2V0Um9sZVZvKCkgXG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gICAgICAgICAgICAgaWYgc2VsZi5yb2xlX3ZvIHRoZW5cbiAgICAgICAgLy8gICAgICAgICAvLyAtLSAgICAgICAgICAgICAgICAgc2VsZjpyZXF1ZXN0SW5pdFByb3RvY2FscygpXG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gICAgICAgICAgICAgZW5kXG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gICAgICAgICBlbmQpXG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gICAgIGVuZFxuICAgICAgICAvLyAgICAgICAgIC8vIC0tIGVsc2VcbiAgICAgICAgLy8gICAgICAgICAvLyAtLSAgICAgc2VsZjpyZXF1ZXN0SW5pdFByb3RvY2FscygpXG4gICAgICAgIC8vICAgICAgICAgLy8gLS0gZW5kXG4gICAgICAgIC8vICAgICB9KS5iaW5kKHRoaXMpKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYodGhpcy5iYXR0bGVfZHJhbWFfZXZlbnQgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9kcmFtYV9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoQmF0dGxlX2RyYW1hRXZlbnQuQmF0dGxlRHJhbWFfVXBkYXRlX01heF9JZCwoZnVuY3Rpb24obWF4X2lkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJbml0UHJvdG9jYWxzKG1heF9pZCk7XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5nb29kc19hZGRfZXZlbnQgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmdvb2RzX2FkZF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoQmFja3BhY2tFdmVudC5BRERfR09PRFMsKGZ1bmN0aW9uKGJhZ19jb2RlLCBpdGVtX2xpc3Qpe1xuICAgICAgICAgICAgICAgIGlmKGJhZ19jb2RlIT1CYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKXJldHVybjtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTmVlZFVwZGF0ZVJlZFN0YXR1cyhpdGVtX2xpc3QpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuZ29vZHNfdXBkYXRlX2V2ZW50ID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5nb29kc191cGRhdGVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEJhY2twYWNrRXZlbnQuTU9ESUZZX0dPT0RTX05VTSwoZnVuY3Rpb24oYmFnX2NvZGUsIGl0ZW1fbGlzdCl7XG4gICAgICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSylyZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVSZWRTdGF0dXMoaXRlbV9saXN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmdvb2RzX2RlbF9ldmVudCA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuZ29vZHNfZGVsX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChCYWNrcGFja0V2ZW50LkRFTEVURV9HT09EUywoZnVuY3Rpb24oYmFnX2NvZGUsIGl0ZW1fbGlzdCl7XG4gICAgICAgICAgICAgICAgaWYoYmFnX2NvZGUgIT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSylyZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVSZWRTdGF0dXMoaXRlbV9saXN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLnJlX2xpbmtfZ2FtZV9ldmVudCA9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JFX0xJTktfR0FNRSwoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB2YXIgR3VpZGVDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWRlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFHdWlkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luR3VpZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29uYXRlX2RhdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5IYWxsb3dzTWFpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+eJqeWTgeWPmOWMlueahOaXtuWAmeWBmuWkhOeQhizlpoLmnpzmmK/oh6rlt7Hmk43kvZzlvJXotbfnmoTkuI3pnIDopoHov5nph4zliKTmlq3nmoQs5Zug5Li66YKj5bGe5LqO6Ieq6Lqr5pu05pawXG4gICAgY2hlY2tOZWVkVXBkYXRlUmVkU3RhdHVzOmZ1bmN0aW9uKGl0ZW1fbGlzdCl7XG4gICAgICAgIGlmKHRoaXMuaXNfc2VsZl9oYW5kbGUpe1xuICAgICAgICAgICAgdGhpcy5pc19zZWxmX2hhbmRsZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pdGVtX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KGl0ZW1fbGlzdCkgPT0gbnVsbClyZXR1cm47XG5cbiAgICAgICAgZm9yKHZhciBpIGluIGl0ZW1fbGlzdCl7XG4gICAgICAgICAgICB2YXIgY2ZnID0gaXRlbV9saXN0W2ldLmNvbmZpZztcbiAgICAgICAgICAgIGlmKGNmZyl7XG4gICAgICAgICAgICAgICAgaWYoY2ZnLmlkID09IDcyMDAxIHx8IGNmZy5pZCA9PSA3MjAwMiB8fCBjZmcuaWQgPT0gNzIwMDMpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrSGFsbG93c1JlZFN0YXR1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDAsIHRoaXMuaGFuZGxlMjQxMDApIC8vIOWco+WZqOWfuuehgOWxnuaAp1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDEsIHRoaXMuaGFuZGxlMjQxMDEpIC8vIOWco+WZqOi/m+mYtlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDIsIHRoaXMuaGFuZGxlMjQxMDIpIC8vIOWco+eBteepv+aItFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDMsIHRoaXMuaGFuZGxlMjQxMDMpIC8vIOWco+aKgOWNh+e6p1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDQsIHRoaXMuaGFuZGxlMjQxMDQpIC8vIOS9v+eUqOWco+WNsFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDUsIHRoaXMuaGFuZGxlMjQxMDUpIC8vIOWFsem4o+WPmOWMllxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDcsIHRoaXMuaGFuZGxlMjQxMDcpIC8vIOabtOaWsOWco+WZqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMDgsIHRoaXMuaGFuZGxlMjQxMDgpIC8vIOaWsOWinuWco+WZqCzov5nkuKrml7blgJnmkq3mlL7mv4DmtLvnibnmlYhcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMjAsIHRoaXMuaGFuZGxlMjQxMjApIC8vIOWco+WZqOS7u+WKoeWIl+ihqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMjEsIHRoaXMuaGFuZGxlMjQxMjEpIC8vIOWco+WZqOS7u+WKoeWIl+ihqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMjIsIHRoaXMuaGFuZGxlMjQxMjIpIC8vIOWco+WZqOS7u+WKoeWIl+ihqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMjMsIHRoaXMuaGFuZGxlMjQxMjMpIC8vIOelnuWZqOmHjemTuFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQxMjQsIHRoaXMuaGFuZGxlMjQxMjQpIC8vIOaYr+WQpuaJk+W8gOi/h+elnuWZqOeVjOmdolxuICAgIH0sXG5cbiAgICAvL+ebkea1i+Wco+WZqOezu+e7n+aYr+WQpuino+mUgVxuICAgIGNoZWNrSXNPcGVuOmZ1bmN0aW9uKHNob3dfZGVzYyl7XG4gICAgICAgIHZhciBvcGVuX2NvbmZpZyA9IENvbmZpZy5mdW5jdGlvbl9kYXRhLmRhdGFfYmFzZVtNYWludWlDb25zdC5idG5faW5kZXguaGFsbG93cysxXTtcbiAgICAgICAgaWYob3Blbl9jb25maWcgPT0gbnVsbClyZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBpc19vcGVuID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoZWNrSXNPcGVuQnlBY3RpdmF0ZShvcGVuX2NvbmZpZy5hY3RpdmF0ZSk7XG4gICAgICAgIGlmKHNob3dfZGVzYyAmJiAhaXNfb3Blbil7XG4gICAgICAgICAgICBtZXNzYWdlKG9wZW5fY29uZmlnLmRlc2MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc19vcGVuO1xuICAgIH0sXG5cbiAgICAvL+WIneWni+eZu+iusOivt+axgueahOS4gOS6m+aVsOaNrlxuICAgIHJlcXVlc3RJbml0UHJvdG9jYWxzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBjYW5fcmVxdWVzdCA9IHRoaXMuY2hlY2tJc09wZW4oKTtcbiAgICAgICAgaWYoY2FuX3JlcXVlc3Qpe1xuICAgICAgICAgICAgaWYodGhpcy5iYXR0bGVfZHJhbWFfZXZlbnQpe1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmJhdHRsZV9kcmFtYV9ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfZHJhbWFfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGFsbG93c0luZm8oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+W8leWvvOmcgOimgVxuICAgIGdldEhhbGxvd3NSb290OmZ1bmN0aW9uKGZpbmlzaF9jYil7XG4gICAgICAgIGlmICghZmluaXNoX2NiKSB7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3Nfd2luZG93KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxsb3dzX3dpbmRvdy5yb290X3duZDtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbGxvd3Nfd2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3Nfd2luZG93LmdldFJvb3RXbmQoZmluaXNoX2NiKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hfY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8v5byV5a+86ZyA6KaBXG4gICAgZ2V0SGFsbG93c0FjdGl2aXR5Um9vdDpmdW5jdGlvbihmaW5pc2hfY2Ipe1xuICAgICAgICBpZiAoIWZpbmlzaF9jYikge1xuICAgICAgICAgICAgaWYodGhpcy5hY3Rpdml0eV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2aXR5X3dpbmRvdy5yb290X3duZDtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2aXR5X3dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0eV93aW5kb3cuZ2V0Um9vdFduZChmaW5pc2hfY2IpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaF9jYihudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlvJXlr7zpnIDopoFcbiAgICBnZXRIYWxsb3dzUHJldmlld1Jvb3Q6ZnVuY3Rpb24oZmluaXNoX2NiKXtcbiAgICAgICAgaWYgKCFmaW5pc2hfY2IpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19wcmV2aWV3KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxsb3dzX3ByZXZpZXcucm9vdF93bmQ7XG4gICAgICAgICAgICB9ICAgICAgICAgICAgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYWxsb3dzX3ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfcHJldmlldy5nZXRSb290V25kKGZpbmlzaF9jYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaF9jYihudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWco+WZqOS4u+eVjOmdolxuICAgIG9wZW5IYWxsb3dzTWFpbldpbmRvdzpmdW5jdGlvbihzdGF0dXMsIGhhbGxvd3NfaWQsIGluZGV4KXtcbiAgICAgICAgaWYoIXN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3Nfd2luZG93KXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3Nfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgLy/liKTmlq3lvIDlkK9cbiAgICAgICAgICAgIGlmKCF0aGlzLmNoZWNrSXNPcGVuKHRydWUpKXJldHVybjtcbiAgICAgICAgICAgIC8vIC8v5piv5ZCm5omT5byA6L+H56We5Zmo55WM6Z2i77yM56ys5LiA5qyh5omT5byA5pe26KaB5omT5byA5aSx6JC956We5Zmo55WM6Z2i77yI5byV5a+86ZyA6KaB77yJXG4gICAgICAgICAgICAvLyB2YXIgb3Blbl9mbGFnID0gdGhpcy5tb2RlbC5nZXRIYWxsb3dzT3BlbkZsYWcoKTtcbiAgICAgICAgICAgIC8vIGlmKG9wZW5fZmxhZyA9PSAwKXtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnJlcXVlc3RTaWduT3BlbkhhbGxvd3MoKVxuICAgICAgICAgICAgLy8gICAgIHRoaXMub3BlbkhhbGxvd3NQcmV2aWV3V2luZG93KHRydWUpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3Nfd2luZG93ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIC8v5aaC5p6c5bey57uP5YWo6YOo5r+A5rS777yM5YiZ5omT5byA56We5Zmo5Li755WM6Z2i77yI5YyF5ZCr5Y2H57qn5ZKM5oqA6IO977yJO+WQpuWImeaJk+W8gOelnuWZqOS7u+WKoeeVjOmdolxuICAgICAgICAgICAgICAgIGlmKHRoaXMubW9kZWwuY2hlY2tJc0hhdmVBbGxIYWxsb3dzKCkpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3Nfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJoYWxsb3dzX21haW5fd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c193aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcImhhbGxvd3NfdGFza193aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3Nfd2luZG93ICYmIHRoaXMuaGFsbG93c193aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c193aW5kb3cub3BlbihoYWxsb3dzX2lkLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDmiYDmnInnpZ7lmajpooTop4jnlYzpnaJcbiAgICBvcGVuSGFsbG93c1ByZXZpZXdXaW5kb3c6ZnVuY3Rpb24oIHN0YXR1cyApe1xuICAgICAgICBpZihzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy5oYWxsb3dzX3ByZXZpZXcgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3ByZXZpZXcgPSBVdGlscy5jcmVhdGVDbGFzcyhcImhhbGxvd3NfcHJldmlld193aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19wcmV2aWV3ICYmIHRoaXMuaGFsbG93c19wcmV2aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfcHJldmlldy5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfcHJldmlldyl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3ByZXZpZXcuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfcHJldmlldyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miZPlvIDlnKPlmajnmoTlnKPljbDnlYzpnaJcbiAgICBvcGVuSGFsbG93c1RyYWNlV2luZG93OmZ1bmN0aW9uKHN0YXR1cywgZGF0YSl7XG4gICAgICAgIGlmKCFzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy50cmFjZV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2Vfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZV93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLnRyYWNlX3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiaGFsbG93c190cmFjZV93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMudHJhY2Vfd2luZG93ICYmIHRoaXMudHJhY2Vfd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlX3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lnKPlmajoo4XlpIfnmoR0aXBzXG4gICAgb3BlbkhhbGxvd3NUaXBzOmZ1bmN0aW9uKHN0YXR1cywgZGF0YSl7XG4gICAgICAgIGlmKCFzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy5oYWxsb3dzX3RpcHMpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c190aXBzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX3RpcHMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfdGlwcyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfdGlwcyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiaGFsbG93c190aXBzX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5oYWxsb3dzX3RpcHMgJiYgdGhpcy5oYWxsb3dzX3RpcHMuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c190aXBzLm9wZW4oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lnKPlmajmv4DmtLvnlYzpnaJcbiAgICBvcGVuSGFsbG93c0FjdGl2aXR5V2luZG93OmZ1bmN0aW9uKHN0YXR1cywgZGF0YSl7XG4gICAgICAgIGlmKCFzdGF0dXMpe1xuICAgICAgICAgICAgaWYodGhpcy5hY3Rpdml0eV93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZpdHlfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpdml0eV93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLmFjdGl2aXR5X3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2aXR5X3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiaGFsbG93c19hY3Rpdml0eV93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMuYWN0aXZpdHlfd2luZG93ICYmIHRoaXMuYWN0aXZpdHlfd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2aXR5X3dpbmRvdy5vcGVuKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ov5vpmLbnlYzpnaJcbiAgICBvcGVuSGFsbG93c1N0ZXBVcFdpbmRvdzpmdW5jdGlvbihzdGF0dXMsIGRhdGEpe1xuICAgICAgICBpZighc3RhdHVzKXtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RlcF91cF93aW5kb3cpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcF91cF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBfdXBfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5YWz6Zet5Y2H6Zi26Z2i5p2/5LmL5ZCOLOW8ueWHuuWFsem4o+mdouadv1xuICAgICAgICAgICAgaWYodGhpcy5yZXNvbmF0ZV9kYXRhKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5IYWxsb3dzUmVzb25hdGVVcFdpbmRvdyh0cnVlLCB0aGlzLnJlc29uYXRlX2RhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb25hdGVfZGF0YSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYoZGF0YSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RlcF91cF93aW5kb3cgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwX3VwX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiaGFsbG93c19zdGVwX3VwX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5zdGVwX3VwX3dpbmRvdyAmJiB0aGlzLnN0ZXBfdXBfd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXBfdXBfd2luZG93Lm9wZW4oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WFsem4o1xuICAgIC8vIC0tW1tmdW5jdGlvbiBIYWxsb3dzQ29udHJvbGxlcjpvcGVuSGFsbG93c1Jlc29uYXRlVXBXaW5kb3coc3RhdHVzLCBkYXRhKVxuICAgIC8vICAgICBpZiBub3Qgc3RhdHVzIHRoZW5cbiAgICAvLyAgICAgICAgIGlmIHNlbGYucmVzb25hdGVfdXBfd2luZG93IHRoZW5cbiAgICAvLyAgICAgICAgICAgICBzZWxmLnJlc29uYXRlX3VwX3dpbmRvdzpjbG9zZSgpXG4gICAgLy8gICAgICAgICAgICAgc2VsZi5yZXNvbmF0ZV91cF93aW5kb3cgPSBuaWxcbiAgICAvLyAgICAgICAgIGVuZFxuICAgIC8vICAgICBlbHNlXG4gICAgLy8gICAgICAgICBpZiBzZWxmLnJlc29uYXRlX3VwX3dpbmRvdyA9PSBuaWwgdGhlblxuICAgIC8vICAgICAgICAgICAgIHNlbGYucmVzb25hdGVfdXBfd2luZG93ID0gSGFsbG93c1Jlc29uYXRlVXBXaW5kb3cuTmV3KClcbiAgICAvLyAgICAgICAgIGVuZFxuICAgIC8vICAgICAgICAgc2VsZi5yZXNvbmF0ZV91cF93aW5kb3c6b3BlbihkYXRhKVxuICAgIC8vICAgICBlbmRcbiAgICAvLyBlbmQgLS1dXVxuXG4gICAgcmVxdWVzdEhhbGxvd3NJbmZvOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTAwLCB7fSk7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTIwLCB7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0MTAwOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUhhbGxvd3NJbmZvKGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+abtOaWsOWco+WZqFxuICAgIGhhbmRsZTI0MTA3OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUhhbGxvd3NEYXRhKGRhdGEpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhhbGxvd3NFdmVudC5IYWxsb3dzVXBkYXRlRXZlbnQsIGRhdGEuaWQpO1xuICAgIH0sXG5cbiAgICAvL+a/gOa0u+Wco+WZqFxuICAgIGhhbmRsZTI0MTA4OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUhhbGxvd3NEYXRhKGRhdGEpO1xuICAgICAgICAvLyDlpoLmnpzmmK/mv4DmtLvkuobmnIDlkI7kuIDkuKrnpZ7lmajvvIzkuJTnpZ7lmajku7vliqHnlYzpnaLmraPlnKjmmL7npLrvvIzliJnliIfmjaLkuLrnpZ7lmajljYfnuqfnlYzpnaJcbiAgICAgICAgaWYodGhpcy5tb2RlbC5jaGVja0lzSGF2ZUFsbEhhbGxvd3MoKSAmJiB0aGlzLmhhbGxvd3Nfd2luZG93KXtcbiAgICAgICAgICAgIHRoaXMub3BlbkhhbGxvd3NNYWluV2luZG93KGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5vcGVuSGFsbG93c01haW5XaW5kb3codHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICAvLyAv6YCa55+l6Z2i5p2/5pu05paw5pWw5o2uXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGFsbG93c0V2ZW50LkhhbGxvd3NBY3Rpdml0eUV2ZW50LCBkYXRhLmlkKTtcbiAgICAgICAgLy/mkq3mlL7mv4DmtLvnibnmlYhcbiAgICAgICAgdGhpcy5vcGVuSGFsbG93c0FjdGl2aXR5V2luZG93KHRydWUsZGF0YSk7XG4gICAgfSxcblxuICAgIC8v5Zyj5Zmo6L+b6Zi2XG4gICAgcmVxdWVzdEhhbGxvd3NBZHZhbmNlOmZ1bmN0aW9uKGlkLCBpc19hdXRvKXtcbiAgICAgICAgdGhpcy5pc19zZWxmX2hhbmRsZSAgPSB0cnVlO1xuICAgICAgICB2YXIgYXV0b190eXBlID0gMDtcbiAgICAgICAgaWYoaXNfYXV0byl7XG4gICAgICAgICAgICBhdXRvX3R5cGUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHByb3RvY2FsLmlzX2F1dG8gPSBhdXRvX3R5cGVcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQxMDEsIHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUyNDEwMTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIC8v5Y2H6Zi25LqGXG4gICAgICAgIGlmKGRhdGEucmVzdWx0ID09IDEpe1xuICAgICAgICAgICAgdGhpcy5vcGVuSGFsbG93c1N0ZXBVcFdpbmRvdyh0cnVlLCBkYXRhLmlkKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmlzX3NlbGZfaGFuZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIYWxsb3dzRXZlbnQuSGFsbG93c0FkdmFuY2VFdmVudCwgZGF0YS5pZCwgZGF0YS5yZXN1bHQpO1xuICAgIH0sXG5cbiAgICAvL+WNh+e6p+Wco+WZqOaKgOiDvVxuICAgIHJlcXVlc3RIYWxsb3dzU2tpbGxVcGdyYWRlOmZ1bmN0aW9uKGhhbGxvd3NfaWQpe1xuICAgICAgICB0aGlzLmlzX3NlbGZfaGFuZGxlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmhhbGxvd3NfaWQgPSBoYWxsb3dzX2lkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTAzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0MTAzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5yZXN1bHQgPT0gMSl7XG4gICAgICAgICAgICAvLyBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhhbGxvd3NFdmVudC5IYWxsb3dzU2tpbGxVcGdyYWRlRXZlbnQsIGRhdGEuaGFsbG93c19pZCwgZGF0YS5pZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5pc19zZWxmX2hhbmRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v56m/5oi05LiA5Lu26KOF5aSHXG4gICAgcmVxdWVzdEhhbGxvd3NFcXVpcDpmdW5jdGlvbihoYWxsb3dzX2lkLCBpdGVtX2lkLCBwb3Mpe1xuICAgICAgICB0aGlzLmlzX3NlbGZfaGFuZGxlID0gdHJ1ZTtcbiAgICAgICAgaGFsbG93c19pZCA9IGhhbGxvd3NfaWQgfHwgMDtcbiAgICAgICAgaXRlbV9pZCA9IGl0ZW1faWQgfHwgMTtcbiAgICAgICAgcG9zID0gcG9zIHx8IDE7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5oYWxsb3dzX2lkID0gaGFsbG93c19pZDtcbiAgICAgICAgcHJvdG9jYWwuaWQgPSBpdGVtX2lkO1xuICAgICAgICBwcm90b2NhbC5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTAyLCBwcm90b2NhbClcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQxMDI6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZihkYXRhLnJlc3VsdCA9PSAxKXtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGFsbG93c0V2ZW50LkhhbGxvd3NFcXVwVXBFdmVudCAsIGRhdGEuaWQsIGRhdGEucG9zKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmlzX3NlbGZfaGFuZGxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/kvb/nlKjlnKPljbDnianlk4FcbiAgICByZXF1ZXN0VXNlVHJhY2VJdGVtOmZ1bmN0aW9uKGhhbGxvd3NfaWQsIG51bSl7XG4gICAgICAgIHRoaXMuaXNfc2VsZl9oYW5kbGUgPSB0cnVlO1xuICAgICAgICBoYWxsb3dzX2lkID0gaGFsbG93c19pZCB8fCAwO1xuICAgICAgICBudW0gPSBudW0gfHwgMTtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmhhbGxvd3NfaWQgPSBoYWxsb3dzX2lkO1xuICAgICAgICBwcm90b2NhbC5udW0gPSBudW07XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTA0LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0MTA0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5yZXN1bHQgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLm9wZW5IYWxsb3dzVHJhY2VXaW5kb3coZmFsc2UpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuaXNfc2VsZl9oYW5kbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJblnKPlmajku7vliqHliJfooahcbiAgICBoYW5kbGUyNDEyMDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIYWxsb3dzVGFzayhkYXRhLmxpc3QpO1xuICAgIH0sXG5cblxuICAgIC8vIOWco+WZqOS7u+WKoeabtOaWsOS/oeaBr1xuICAgIGhhbmRsZTI0MTIxOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUhhbGxvd3NUYXNrKGRhdGEubGlzdCk7XG4gICAgfSxcblxuICAgIHJlcXVlc3RTdWJtaXRIYWxsb3dzVGFzazpmdW5jdGlvbihpZCl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTIyLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0MTIyOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgIH0sXG5cbiAgICAvL+WFsem4o+WPmOWMllxuICAgIGhhbmRsZTI0MTA1OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICB0aGlzLnJlc29uYXRlX2RhdGEgPSBkYXRhO1xuICAgICAgICAvLyB0aGlzLm9wZW5IYWxsb3dzUmVzb25hdGVVcFdpbmRvdyh0cnVlLCBkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g6K+35rGC56We5Zmo6YeN6ZO4XG4gICAgcmVxdWVzdEhhbGxvd3NSZXNldDpmdW5jdGlvbiggaWQgKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0MTIzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0MTIzOmZ1bmN0aW9uKCBkYXRhICl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvLyDor7fmsYLmoIforrDmiZPlvIDnpZ7lmajnlYzpnaJcbiAgICByZXF1ZXN0U2lnbk9wZW5IYWxsb3dzOmZ1bmN0aW9uKCAgKXtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQxMjQsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQxMjQ6ZnVuY3Rpb24oIGRhdGEgKXtcbiAgICAgICAgaWYoZGF0YS5pc19maXJzdCl7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldE9wZW5IYWxsb3dzRmxhZyhkYXRhLmlzX2ZpcnN0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfX2RlbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLkRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFsbG93c0NvbnRyb2xsZXI7Il19