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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/mall/view/mall_action_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, 'd238dS87aRG/IiJ48OB85Gm', 'mall_action_window');
// Scripts/mod/mall/view/mall_action_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-19 16:53:47
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var MallController = require("mall_controller");
 
var MallEvent = require("mall_event");
 
var CommonScrollView = require("common_scrollview");
 
var RoleController = require("role_controller");
 
var TimeTool = require("timetool");
 
var MallItem = require("mall_item");
 
var MallConst = require("mall_const");
 
var RoleEvent = require("role_event");
 
var MallActionWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("mall", "mall_action_window"); // this.viewTag = SCENE_TAG.ui;                //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = MallController.getInstance();
    this.role_vo = RoleController.getInstance().getRoleVo();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.tab_list = {};
    this.cur_tab = null;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    var self = this;
    self.background = self.root_wnd.getChildByName("background");
 
    if (self.background != null) {
      this.loadRes(PathTool.getUIIconPath("bigbg", "bigbg_2", "jpg"), function (res) {
        self.background.getComponent(cc.Sprite).spriteFrame = res;
      }.bind(this));
    }
 
    self.background.scale = FIT_SCALE;
    self.mainContainer = self.root_wnd.getChildByName("main_container");
    self.main_panel = self.mainContainer.getChildByName("main_panel");
    self.tableContainer = self.main_panel.getChildByName("tab_container");
 
    for (var i = 1; i < 5; ++i) {
      var tab_btn = self.tableContainer.getChildByName("tab_btn_" + i);
      tab_btn.getChildByName("tab_tips").active = false;
      tab_btn.getChildByName("red_num").active = false;
      tab_btn.getChildByName("select_bg").active = false;
      ;
      tab_btn.active = false;
      self.tab_list[i] = tab_btn;
    }
 
    self.container = self.main_panel.getChildByName("container");
    self.btn = self.container.getChildByName("btn");
    self.btn_label = self.btn.getChildByName("txt");
    self.btn.active = false;
    self.coin_bg = self.container.getChildByName("Image_50");
    self.coin = self.container.getChildByName("coin");
    self.count = self.container.getChildByName("count");
    self.add_btn = self.container.getChildByName("add_btn");
    self.add_btn.active = false;
    self.refresh_count = self.container.getChildByName("refresh_count");
    self.refresh_count.getComponent(cc.Label).string = "";
    self.tips_btn = self.container.getChildByName('tips_btn');
    self.tips_btn.active = false;
    self.time = self.container.getChildByName("time").getComponent(cc.Label);
    self.time.node.active = false;
    self.good_cons = self.container.getChildByName("good_cons");
    self.winTitle = self.main_panel.getChildByName("win_title");
    self.winTitle.getComponent(cc.Label).string = "活动商城";
    self.close_btn = self.main_panel.getChildByName("close_btn");
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    var _this = this;
 
    this.addGlobalEvent(MallEvent.Update_Action_event, function (data) {
      this.updateData(data);
    }.bind(this)); // --获取所有活动数据
 
    this.addGlobalEvent(MallEvent.Buy_Action_Shop_Success_event, function (data) {
      if (!this.action_data_list) return;
 
      if (this.cur_index && this.action_data_list[this.cur_index]) {
        if (this.action_data_list[this.cur_index].bid == data.bid) {
          var exchange_list = this.action_data_list[this.cur_index].exchange_list;
          var list = this.common_scrollview.data_list;
 
          for (var i = 0; i < list.length; ++i) {
            var cell = list[i];
 
            if (cell.index && exchange_list[cell.index].aim == data.aim) {
              exchange_list[cell.index].buy_count = data.buy_count;
 
              if (this.common_scrollview) {
                this.common_scrollview.updateItemData(cell.index, this.convertItemInfo(exchange_list[cell.index]));
              }
            }
          }
        }
      }
    }.bind(this));
 
    if (this.role_assets_event == null) {
      this.role_assets_event = this.role_vo.bind(RoleEvent.UPDATE_ROLE_ACTION_ASSETS, function (key, value) {
        if (!this.action_data_list) return;
 
        if (this.cur_index && this.action_data_list[this.cur_index]) {
          if (key == this.action_data_list[this.cur_index].need_id) {
            this.count.getComponent(cc.Label).string = value;
          }
        }
      }.bind(this));
    }
 
    var _loop = function _loop(i) {
      var tab_btn = _this.tab_list[i];
      tab_btn.on('click', function () {
        this.changeTabView(i, true);
      }, _this);
    };
 
    for (var i in this.tab_list) {
      _loop(i);
    }
 
    this.close_btn.on('click', function () {
      Utils.playButtonSound(2);
      this.onCloseBtn();
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.first_bid = params;
    this.ctrl.send16660();
  },
  updateData: function updateData(data) {
    var self = this;
    if (!data) return;
    if (data.holiday_exchanges && Utils.next(data.holiday_exchanges) == null) return; // --记录道具信息
 
    self.dic_item_config = {}; // --商城数据
 
    self.action_data_list = {};
    self.cur_index = 1;
    data.holiday_exchanges.sort(function (a, b) {
      return a.bid - b.bid;
    });
 
    for (var i = 0; i < data.holiday_exchanges.length; ++i) {
      var v = data.holiday_exchanges[i];
      var index = i + 1;
 
      if (self.tab_list[index]) {
        self.tab_list[index].getChildByName("title").getComponent(cc.Label).string = v.exchange_name;
        self.tab_list[index].active = this;
 
        if (self.first_bid && self.first_bid == v.bid) {
          self.cur_index = index;
        }
      }
 
      v.exchange_list.sort(function (a, b) {
        return a.aim - b.aim;
      });
      self.action_data_list[index] = v;
    }
 
    self.changeTabView(self.cur_index);
  },
  changeTabView: function changeTabView(index, is_check) {
    index = Number(index);
    var self = this;
    if (is_check && self.cur_index == index) return;
 
    if (self.cur_tab != null) {
      if (self.cur_tab) {
        self.cur_tab.getChildByName("title").color.fromHEX(Config.color_data.data_color16[2]);
      }
 
      self.cur_tab.getChildByName("select_bg").active = false;
    }
 
    self.cur_index = index;
    self.cur_tab = self.tab_list[index];
 
    if (self.cur_tab != null) {
      var label = self.cur_tab.getChildByName("title");
      label.color.fromHEX(Config.color_data.data_color16[2]);
      self.cur_tab.getChildByName("select_bg").active = true;
    }
 
    self.tips_btn.active = false;
    self.updateScrollviewList();
    self.updateInfo();
  },
  updateScrollviewList: function updateScrollviewList() {
    var self = this;
 
    if (self.common_scrollview == null) {
      var scroll_view_size = self.good_cons.getContentSize();
      var setting = {
        item_class: MallItem,
        start_x: 4,
        //-- 第一个单元的X起点
        space_x: 0,
        //-- x方向的间隔
        start_y: 5,
        //-- 第一个单元的Y起点
        space_y: 0,
        //-- y方向的间隔
        item_width: 306,
        //-- 单元的尺寸width
        item_height: 147,
        //-- 单元的尺寸height
        row: 1,
        //-- 行数,作用于水平滚动类型
        col: 2,
        //-- 列数,作用于垂直滚动类型
        delay: 4,
        //-- 创建延迟时间
        once_num: 1 //-- 每次创建的数量
 
      };
      self.common_scrollview = new CommonScrollView();
      self.common_scrollview.createScroll(self.good_cons, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0, 0));
    }
 
    var itemInfo = [];
 
    for (var i = 0; i < self.action_data_list[self.cur_index].exchange_list.length; ++i) {
      var item = self.action_data_list[self.cur_index].exchange_list[i];
      itemInfo.push(this.convertItemInfo(item));
    }
 
    self.common_scrollview.setData(itemInfo, function (cell) {
      this.ctrl.openMallBuyWindow(true, cell);
    }.bind(this));
  },
  convertItemInfo: function convertItemInfo(data) {
    return {
      item_id: data.item_list[0].bid,
      item_num: data.item_list[0].num,
      price: data.expend_num,
      pay_type: data.expend_id,
      shop_type: MallConst.MallType.ActionShop,
      aim: data.aim,
      is_show_limit_label: false,
      limit_count: data.limit_buy,
      name: data.aim_str,
      has_buy: data.buy_count,
      bid: this.action_data_list[this.cur_index].bid,
      //--子活动编号
      lable: data.lable
    };
  },
  // --更新主界面信息
  updateInfo: function updateInfo() {
    var self = this;
    var need_id = self.action_data_list[self.cur_index].need_id;
    var config = Utils.getItemConfig(need_id);
 
    if (config && need_id != 0) {
      var res = PathTool.getItemRes(config.icon);
 
      if (self.record_cost_res == null || self.record_cost_res != res) {
        this.loadRes(res, function (SpriteFrame) {
          this.coin.getComponent(cc.Sprite).spriteFrame = SpriteFrame;
        }.bind(this));
      }
 
      self.coin_bg.active = true;
      self.coin.active = true;
      self.count.active = true;
    } else {
      self.coin_bg.active = false;
      self.coin.active = false;
      self.count.active = false;
    }
 
    var count = self.role_vo.getActionAssetsNumByBid(need_id);
    self.count.getComponent(cc.Label).string = count;
    self.time.node.active = true;
    var time = self.action_data_list[self.cur_index].end_time - gcore.SmartSocket.getTime();
 
    if (time < 0) {
      time = 0;
    }
 
    self.setLessTime(time);
  },
  setLessTime: function setLessTime(less_time) {
    if (!this.time) return;
 
    if (less_time > 0) {
      this.setTimeFormatString(less_time);
 
      if (this.time_tichet == null) {
        this.time_tichet = gcore.Timer.set(function () {
          less_time--;
          this.setTimeFormatString(less_time);
 
          if (less_time < 0) {
            gcore.Timer.del(this.time_tichet);
            this.time_tichet = null;
            this.setTimeFormatString(less_time);
          }
        }.bind(this), 1000, -1);
      }
    } else {
      this.setTimeFormatString(less_time);
    }
  },
  setTimeFormatString: function setTimeFormatString(time) {
    this.rest_time = time;
 
    if (time > 0) {
      this.time.string = "剩余时间:" + TimeTool.getTimeFormatDayIIIIII(time);
    } else {
      this.time.string = "剩余时间: 0";
    }
  },
  onCloseBtn: function onCloseBtn() {
    this.ctrl.openMallActionWindow(false); //--关闭
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.time_tichet) {
      gcore.Timer.del(this.time_tichet);
      this.time_tichet = null;
    }
 
    if (this.common_scrollview) {
      this.common_scrollview.deleteMe();
      this.common_scrollview = null;
    }
 
    if (this.role_assets_event) {
      this.role_vo.unbind(this.role_assets_event);
      this.role_assets_event = null;
    }
 
    this.ctrl.openMallActionWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWxsXFx2aWV3XFxtYWxsX2FjdGlvbl93aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiTWFsbENvbnRyb2xsZXIiLCJNYWxsRXZlbnQiLCJDb21tb25TY3JvbGxWaWV3IiwiUm9sZUNvbnRyb2xsZXIiLCJUaW1lVG9vbCIsIk1hbGxJdGVtIiwiTWFsbENvbnN0IiwiUm9sZUV2ZW50IiwiTWFsbEFjdGlvbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsIndpbl90eXBlIiwiV2luVHlwZSIsIkZ1bGwiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwiaW5pdENvbmZpZyIsInRhYl9saXN0IiwiY3VyX3RhYiIsIm9wZW5DYWxsQmFjayIsInNlbGYiLCJiYWNrZ3JvdW5kIiwicm9vdF93bmQiLCJnZXRDaGlsZEJ5TmFtZSIsImxvYWRSZXMiLCJnZXRVSUljb25QYXRoIiwicmVzIiwiZ2V0Q29tcG9uZW50IiwiU3ByaXRlIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJtYWluQ29udGFpbmVyIiwibWFpbl9wYW5lbCIsInRhYmxlQ29udGFpbmVyIiwiaSIsInRhYl9idG4iLCJhY3RpdmUiLCJjb250YWluZXIiLCJidG4iLCJidG5fbGFiZWwiLCJjb2luX2JnIiwiY29pbiIsImNvdW50IiwiYWRkX2J0biIsInJlZnJlc2hfY291bnQiLCJMYWJlbCIsInN0cmluZyIsInRpcHNfYnRuIiwidGltZSIsIm5vZGUiLCJnb29kX2NvbnMiLCJ3aW5UaXRsZSIsImNsb3NlX2J0biIsInJlZ2lzdGVyRXZlbnQiLCJhZGRHbG9iYWxFdmVudCIsIlVwZGF0ZV9BY3Rpb25fZXZlbnQiLCJkYXRhIiwidXBkYXRlRGF0YSIsIkJ1eV9BY3Rpb25fU2hvcF9TdWNjZXNzX2V2ZW50IiwiYWN0aW9uX2RhdGFfbGlzdCIsImN1cl9pbmRleCIsImJpZCIsImV4Y2hhbmdlX2xpc3QiLCJsaXN0IiwiY29tbW9uX3Njcm9sbHZpZXciLCJkYXRhX2xpc3QiLCJsZW5ndGgiLCJjZWxsIiwiaW5kZXgiLCJhaW0iLCJidXlfY291bnQiLCJ1cGRhdGVJdGVtRGF0YSIsImNvbnZlcnRJdGVtSW5mbyIsInJvbGVfYXNzZXRzX2V2ZW50IiwiVVBEQVRFX1JPTEVfQUNUSU9OX0FTU0VUUyIsImtleSIsInZhbHVlIiwibmVlZF9pZCIsIm9uIiwiY2hhbmdlVGFiVmlldyIsIlV0aWxzIiwicGxheUJ1dHRvblNvdW5kIiwib25DbG9zZUJ0biIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiZmlyc3RfYmlkIiwic2VuZDE2NjYwIiwiaG9saWRheV9leGNoYW5nZXMiLCJuZXh0IiwiZGljX2l0ZW1fY29uZmlnIiwic29ydCIsImEiLCJiIiwidiIsImV4Y2hhbmdlX25hbWUiLCJpc19jaGVjayIsIk51bWJlciIsImNvbG9yIiwiZnJvbUhFWCIsIkNvbmZpZyIsImNvbG9yX2RhdGEiLCJkYXRhX2NvbG9yMTYiLCJsYWJlbCIsInVwZGF0ZVNjcm9sbHZpZXdMaXN0IiwidXBkYXRlSW5mbyIsInNjcm9sbF92aWV3X3NpemUiLCJnZXRDb250ZW50U2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsImRlbGF5Iiwib25jZV9udW0iLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsIml0ZW1JbmZvIiwiaXRlbSIsInB1c2giLCJzZXREYXRhIiwib3Blbk1hbGxCdXlXaW5kb3ciLCJpdGVtX2lkIiwiaXRlbV9saXN0IiwiaXRlbV9udW0iLCJudW0iLCJwcmljZSIsImV4cGVuZF9udW0iLCJwYXlfdHlwZSIsImV4cGVuZF9pZCIsInNob3BfdHlwZSIsIk1hbGxUeXBlIiwiQWN0aW9uU2hvcCIsImlzX3Nob3dfbGltaXRfbGFiZWwiLCJsaW1pdF9jb3VudCIsImxpbWl0X2J1eSIsIm5hbWUiLCJhaW1fc3RyIiwiaGFzX2J1eSIsImxhYmxlIiwiY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImdldEl0ZW1SZXMiLCJpY29uIiwicmVjb3JkX2Nvc3RfcmVzIiwiU3ByaXRlRnJhbWUiLCJnZXRBY3Rpb25Bc3NldHNOdW1CeUJpZCIsImVuZF90aW1lIiwiZ2NvcmUiLCJTbWFydFNvY2tldCIsImdldFRpbWUiLCJzZXRMZXNzVGltZSIsImxlc3NfdGltZSIsInNldFRpbWVGb3JtYXRTdHJpbmciLCJ0aW1lX3RpY2hldCIsIlRpbWVyIiwic2V0IiwiZGVsIiwicmVzdF90aW1lIiwiZ2V0VGltZUZvcm1hdERheUlJSUlJSSIsIm9wZW5NYWxsQWN0aW9uV2luZG93IiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIiwidW5iaW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsU0FBUyxHQUFHRixPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLGNBQWMsR0FBR0osT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlLLFFBQVEsR0FBR0wsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSU0sUUFBUSxHQUFHTixPQUFPLENBQUMsV0FBRCxDQUF0Qjs7QUFDQSxJQUFJTyxTQUFTLEdBQUdQLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlRLFNBQVMsR0FBR1IsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSVMsZ0JBQWdCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzVCLGFBQVNDLFFBRG1CO0FBRTVCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCZixRQUFRLENBQUNnQixhQUFULENBQXVCLE1BQXZCLEVBQStCLG9CQUEvQixDQUFsQixDQURjLENBRWQ7O0FBQ0EsU0FBS0MsUUFBTCxHQUFnQkMsT0FBTyxDQUFDQyxJQUF4QixDQUhjLENBRzhCOztBQUM1QyxTQUFLQyxJQUFMLEdBQVlsQixjQUFjLENBQUNtQixXQUFmLEVBQVo7QUFDQSxTQUFLQyxPQUFMLEdBQWVqQixjQUFjLENBQUNnQixXQUFmLEdBQTZCRSxTQUE3QixFQUFmO0FBQ0gsR0FSMkI7QUFVNUI7QUFDQUMsRUFBQUEsVUFBVSxFQUFDLHNCQUFVO0FBQ2pCLFNBQUtDLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsSUFBZjtBQUNILEdBZDJCO0FBZ0I1QjtBQUNBQyxFQUFBQSxZQUFZLEVBQUMsd0JBQVU7QUFDbkIsUUFBSUMsSUFBSSxHQUFHLElBQVg7QUFDQUEsSUFBQUEsSUFBSSxDQUFDQyxVQUFMLEdBQWtCRCxJQUFJLENBQUNFLFFBQUwsQ0FBY0MsY0FBZCxDQUE2QixZQUE3QixDQUFsQjs7QUFDQSxRQUFJSCxJQUFJLENBQUNDLFVBQUwsSUFBbUIsSUFBdkIsRUFBNEI7QUFDeEIsV0FBS0csT0FBTCxDQUFhaEMsUUFBUSxDQUFDaUMsYUFBVCxDQUF1QixPQUF2QixFQUErQixTQUEvQixFQUF5QyxLQUF6QyxDQUFiLEVBQTZELFVBQVNDLEdBQVQsRUFBYTtBQUN0RU4sUUFBQUEsSUFBSSxDQUFDQyxVQUFMLENBQWdCTSxZQUFoQixDQUE2QnhCLEVBQUUsQ0FBQ3lCLE1BQWhDLEVBQXdDQyxXQUF4QyxHQUFzREgsR0FBdEQ7QUFDSCxPQUY0RCxDQUUzREksSUFGMkQsQ0FFdEQsSUFGc0QsQ0FBN0Q7QUFHSDs7QUFDRFYsSUFBQUEsSUFBSSxDQUFDQyxVQUFMLENBQWdCVSxLQUFoQixHQUF3QkMsU0FBeEI7QUFDQVosSUFBQUEsSUFBSSxDQUFDYSxhQUFMLEdBQXFCYixJQUFJLENBQUNFLFFBQUwsQ0FBY0MsY0FBZCxDQUE2QixnQkFBN0IsQ0FBckI7QUFFQUgsSUFBQUEsSUFBSSxDQUFDYyxVQUFMLEdBQWtCZCxJQUFJLENBQUNhLGFBQUwsQ0FBbUJWLGNBQW5CLENBQWtDLFlBQWxDLENBQWxCO0FBRUFILElBQUFBLElBQUksQ0FBQ2UsY0FBTCxHQUFzQmYsSUFBSSxDQUFDYyxVQUFMLENBQWdCWCxjQUFoQixDQUErQixlQUEvQixDQUF0Qjs7QUFFQSxTQUFJLElBQUlhLENBQUMsR0FBQyxDQUFWLEVBQVlBLENBQUMsR0FBQyxDQUFkLEVBQWdCLEVBQUVBLENBQWxCLEVBQW9CO0FBQ2hCLFVBQUlDLE9BQU8sR0FBR2pCLElBQUksQ0FBQ2UsY0FBTCxDQUFvQlosY0FBcEIsQ0FBbUMsYUFBV2EsQ0FBOUMsQ0FBZDtBQUNBQyxNQUFBQSxPQUFPLENBQUNkLGNBQVIsQ0FBdUIsVUFBdkIsRUFBbUNlLE1BQW5DLEdBQTRDLEtBQTVDO0FBQ0FELE1BQUFBLE9BQU8sQ0FBQ2QsY0FBUixDQUF1QixTQUF2QixFQUFrQ2UsTUFBbEMsR0FBMkMsS0FBM0M7QUFDQUQsTUFBQUEsT0FBTyxDQUFDZCxjQUFSLENBQXVCLFdBQXZCLEVBQW9DZSxNQUFwQyxHQUE2QyxLQUE3QztBQUFtRDtBQUNuREQsTUFBQUEsT0FBTyxDQUFDQyxNQUFSLEdBQWlCLEtBQWpCO0FBQ0FsQixNQUFBQSxJQUFJLENBQUNILFFBQUwsQ0FBY21CLENBQWQsSUFBbUJDLE9BQW5CO0FBQ0g7O0FBRURqQixJQUFBQSxJQUFJLENBQUNtQixTQUFMLEdBQWlCbkIsSUFBSSxDQUFDYyxVQUFMLENBQWdCWCxjQUFoQixDQUErQixXQUEvQixDQUFqQjtBQUNBSCxJQUFBQSxJQUFJLENBQUNvQixHQUFMLEdBQVdwQixJQUFJLENBQUNtQixTQUFMLENBQWVoQixjQUFmLENBQThCLEtBQTlCLENBQVg7QUFDQUgsSUFBQUEsSUFBSSxDQUFDcUIsU0FBTCxHQUFpQnJCLElBQUksQ0FBQ29CLEdBQUwsQ0FBU2pCLGNBQVQsQ0FBd0IsS0FBeEIsQ0FBakI7QUFDQUgsSUFBQUEsSUFBSSxDQUFDb0IsR0FBTCxDQUFTRixNQUFULEdBQWtCLEtBQWxCO0FBQ0FsQixJQUFBQSxJQUFJLENBQUNzQixPQUFMLEdBQWV0QixJQUFJLENBQUNtQixTQUFMLENBQWVoQixjQUFmLENBQThCLFVBQTlCLENBQWY7QUFDQUgsSUFBQUEsSUFBSSxDQUFDdUIsSUFBTCxHQUFZdkIsSUFBSSxDQUFDbUIsU0FBTCxDQUFlaEIsY0FBZixDQUE4QixNQUE5QixDQUFaO0FBQ0FILElBQUFBLElBQUksQ0FBQ3dCLEtBQUwsR0FBYXhCLElBQUksQ0FBQ21CLFNBQUwsQ0FBZWhCLGNBQWYsQ0FBOEIsT0FBOUIsQ0FBYjtBQUNBSCxJQUFBQSxJQUFJLENBQUN5QixPQUFMLEdBQWV6QixJQUFJLENBQUNtQixTQUFMLENBQWVoQixjQUFmLENBQThCLFNBQTlCLENBQWY7QUFDQUgsSUFBQUEsSUFBSSxDQUFDeUIsT0FBTCxDQUFhUCxNQUFiLEdBQXNCLEtBQXRCO0FBQ0FsQixJQUFBQSxJQUFJLENBQUMwQixhQUFMLEdBQXFCMUIsSUFBSSxDQUFDbUIsU0FBTCxDQUFlaEIsY0FBZixDQUE4QixlQUE5QixDQUFyQjtBQUNBSCxJQUFBQSxJQUFJLENBQUMwQixhQUFMLENBQW1CbkIsWUFBbkIsQ0FBZ0N4QixFQUFFLENBQUM0QyxLQUFuQyxFQUEwQ0MsTUFBMUMsR0FBbUQsRUFBbkQ7QUFDQTVCLElBQUFBLElBQUksQ0FBQzZCLFFBQUwsR0FBZ0I3QixJQUFJLENBQUNtQixTQUFMLENBQWVoQixjQUFmLENBQThCLFVBQTlCLENBQWhCO0FBQ0FILElBQUFBLElBQUksQ0FBQzZCLFFBQUwsQ0FBY1gsTUFBZCxHQUF1QixLQUF2QjtBQUNBbEIsSUFBQUEsSUFBSSxDQUFDOEIsSUFBTCxHQUFZOUIsSUFBSSxDQUFDbUIsU0FBTCxDQUFlaEIsY0FBZixDQUE4QixNQUE5QixFQUFzQ0ksWUFBdEMsQ0FBbUR4QixFQUFFLENBQUM0QyxLQUF0RCxDQUFaO0FBQ0EzQixJQUFBQSxJQUFJLENBQUM4QixJQUFMLENBQVVDLElBQVYsQ0FBZWIsTUFBZixHQUF3QixLQUF4QjtBQUVBbEIsSUFBQUEsSUFBSSxDQUFDZ0MsU0FBTCxHQUFpQmhDLElBQUksQ0FBQ21CLFNBQUwsQ0FBZWhCLGNBQWYsQ0FBOEIsV0FBOUIsQ0FBakI7QUFFQUgsSUFBQUEsSUFBSSxDQUFDaUMsUUFBTCxHQUFnQmpDLElBQUksQ0FBQ2MsVUFBTCxDQUFnQlgsY0FBaEIsQ0FBK0IsV0FBL0IsQ0FBaEI7QUFDQUgsSUFBQUEsSUFBSSxDQUFDaUMsUUFBTCxDQUFjMUIsWUFBZCxDQUEyQnhCLEVBQUUsQ0FBQzRDLEtBQTlCLEVBQXFDQyxNQUFyQyxHQUE4QyxNQUE5QztBQUVBNUIsSUFBQUEsSUFBSSxDQUFDa0MsU0FBTCxHQUFpQmxDLElBQUksQ0FBQ2MsVUFBTCxDQUFnQlgsY0FBaEIsQ0FBK0IsV0FBL0IsQ0FBakI7QUFDSCxHQS9EMkI7QUFpRTVCO0FBQ0FnQyxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFBQTs7QUFDcEIsU0FBS0MsY0FBTCxDQUFvQjdELFNBQVMsQ0FBQzhELG1CQUE5QixFQUFrRCxVQUFTQyxJQUFULEVBQWM7QUFDNUQsV0FBS0MsVUFBTCxDQUFnQkQsSUFBaEI7QUFDSCxLQUZpRCxDQUVoRDVCLElBRmdELENBRTNDLElBRjJDLENBQWxELEVBRG9CLENBSXBCOztBQUNBLFNBQUswQixjQUFMLENBQW9CN0QsU0FBUyxDQUFDaUUsNkJBQTlCLEVBQTZELFVBQVNGLElBQVQsRUFBYztBQUN2RSxVQUFJLENBQUMsS0FBS0csZ0JBQVYsRUFBNEI7O0FBQzVCLFVBQUksS0FBS0MsU0FBTCxJQUFrQixLQUFLRCxnQkFBTCxDQUFzQixLQUFLQyxTQUEzQixDQUF0QixFQUE0RDtBQUN4RCxZQUFJLEtBQUtELGdCQUFMLENBQXNCLEtBQUtDLFNBQTNCLEVBQXNDQyxHQUF0QyxJQUE2Q0wsSUFBSSxDQUFDSyxHQUF0RCxFQUEwRDtBQUN0RCxjQUFJQyxhQUFhLEdBQUcsS0FBS0gsZ0JBQUwsQ0FBc0IsS0FBS0MsU0FBM0IsRUFBc0NFLGFBQTFEO0FBQ0EsY0FBSUMsSUFBSSxHQUFHLEtBQUtDLGlCQUFMLENBQXVCQyxTQUFsQzs7QUFDQSxlQUFJLElBQUkvQixDQUFDLEdBQUMsQ0FBVixFQUFZQSxDQUFDLEdBQUM2QixJQUFJLENBQUNHLE1BQW5CLEVBQTBCLEVBQUVoQyxDQUE1QixFQUE4QjtBQUMxQixnQkFBSWlDLElBQUksR0FBR0osSUFBSSxDQUFDN0IsQ0FBRCxDQUFmOztBQUNBLGdCQUFJaUMsSUFBSSxDQUFDQyxLQUFMLElBQWNOLGFBQWEsQ0FBQ0ssSUFBSSxDQUFDQyxLQUFOLENBQWIsQ0FBMEJDLEdBQTFCLElBQWlDYixJQUFJLENBQUNhLEdBQXhELEVBQTREO0FBQ3hEUCxjQUFBQSxhQUFhLENBQUNLLElBQUksQ0FBQ0MsS0FBTixDQUFiLENBQTBCRSxTQUExQixHQUFzQ2QsSUFBSSxDQUFDYyxTQUEzQzs7QUFDQSxrQkFBRyxLQUFLTixpQkFBUixFQUEwQjtBQUN0QixxQkFBS0EsaUJBQUwsQ0FBdUJPLGNBQXZCLENBQXNDSixJQUFJLENBQUNDLEtBQTNDLEVBQWlELEtBQUtJLGVBQUwsQ0FBcUJWLGFBQWEsQ0FBQ0ssSUFBSSxDQUFDQyxLQUFOLENBQWxDLENBQWpEO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDSjtBQUNKLEtBakI0RCxDQWlCM0R4QyxJQWpCMkQsQ0FpQnRELElBakJzRCxDQUE3RDs7QUFrQkEsUUFBRyxLQUFLNkMsaUJBQUwsSUFBMEIsSUFBN0IsRUFBa0M7QUFDOUIsV0FBS0EsaUJBQUwsR0FBeUIsS0FBSzdELE9BQUwsQ0FBYWdCLElBQWIsQ0FBa0I3QixTQUFTLENBQUMyRSx5QkFBNUIsRUFBdUQsVUFBU0MsR0FBVCxFQUFjQyxLQUFkLEVBQW9CO0FBQ2hHLFlBQUksQ0FBQyxLQUFLakIsZ0JBQVYsRUFBNEI7O0FBQzVCLFlBQUksS0FBS0MsU0FBTCxJQUFrQixLQUFLRCxnQkFBTCxDQUFzQixLQUFLQyxTQUEzQixDQUF0QixFQUE0RDtBQUN4RCxjQUFJZSxHQUFHLElBQUksS0FBS2hCLGdCQUFMLENBQXNCLEtBQUtDLFNBQTNCLEVBQXNDaUIsT0FBakQsRUFBeUQ7QUFDckQsaUJBQUtuQyxLQUFMLENBQVdqQixZQUFYLENBQXdCeEIsRUFBRSxDQUFDNEMsS0FBM0IsRUFBa0NDLE1BQWxDLEdBQTJDOEIsS0FBM0M7QUFDSDtBQUNKO0FBQ0osT0FQK0UsQ0FPOUVoRCxJQVA4RSxDQU96RSxJQVB5RSxDQUF2RCxDQUF6QjtBQVFIOztBQWhDbUIsK0JBaUNaTSxDQWpDWTtBQWtDaEIsVUFBSUMsT0FBTyxHQUFHLEtBQUksQ0FBQ3BCLFFBQUwsQ0FBY21CLENBQWQsQ0FBZDtBQUNBQyxNQUFBQSxPQUFPLENBQUMyQyxFQUFSLENBQVcsT0FBWCxFQUFtQixZQUFVO0FBQ3pCLGFBQUtDLGFBQUwsQ0FBbUI3QyxDQUFuQixFQUFxQixJQUFyQjtBQUNILE9BRkQsRUFFRSxLQUZGO0FBbkNnQjs7QUFpQ3BCLFNBQUksSUFBSUEsQ0FBUixJQUFhLEtBQUtuQixRQUFsQixFQUEyQjtBQUFBLFlBQW5CbUIsQ0FBbUI7QUFLMUI7O0FBQ0QsU0FBS2tCLFNBQUwsQ0FBZTBCLEVBQWYsQ0FBa0IsT0FBbEIsRUFBMEIsWUFBVTtBQUNoQ0UsTUFBQUEsS0FBSyxDQUFDQyxlQUFOLENBQXNCLENBQXRCO0FBQ0EsV0FBS0MsVUFBTDtBQUNILEtBSEQsRUFHRSxJQUhGO0FBSUgsR0E3RzJCO0FBK0c1QjtBQUNBQyxFQUFBQSxXQUFXLEVBQUMscUJBQVNDLE1BQVQsRUFBZ0I7QUFDeEIsU0FBS0MsU0FBTCxHQUFpQkQsTUFBakI7QUFDQSxTQUFLMUUsSUFBTCxDQUFVNEUsU0FBVjtBQUNILEdBbkgyQjtBQW9INUI3QixFQUFBQSxVQXBINEIsc0JBb0hqQkQsSUFwSGlCLEVBb0haO0FBQ1osUUFBSXRDLElBQUksR0FBRyxJQUFYO0FBQ0EsUUFBRyxDQUFDc0MsSUFBSixFQUFTO0FBQ1QsUUFBSUEsSUFBSSxDQUFDK0IsaUJBQUwsSUFBMEJQLEtBQUssQ0FBQ1EsSUFBTixDQUFXaEMsSUFBSSxDQUFDK0IsaUJBQWhCLEtBQXNDLElBQXBFLEVBQTJFLE9BSC9ELENBSVo7O0FBQ0FyRSxJQUFBQSxJQUFJLENBQUN1RSxlQUFMLEdBQXVCLEVBQXZCLENBTFksQ0FNWjs7QUFDQXZFLElBQUFBLElBQUksQ0FBQ3lDLGdCQUFMLEdBQXdCLEVBQXhCO0FBQ0F6QyxJQUFBQSxJQUFJLENBQUMwQyxTQUFMLEdBQWlCLENBQWpCO0FBQ0FKLElBQUFBLElBQUksQ0FBQytCLGlCQUFMLENBQXVCRyxJQUF2QixDQUE0QixVQUFTQyxDQUFULEVBQVdDLENBQVgsRUFBYTtBQUNyQyxhQUFPRCxDQUFDLENBQUM5QixHQUFGLEdBQVMrQixDQUFDLENBQUMvQixHQUFsQjtBQUNILEtBRkQ7O0FBR0EsU0FBSSxJQUFJM0IsQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFDc0IsSUFBSSxDQUFDK0IsaUJBQUwsQ0FBdUJyQixNQUFyQyxFQUE0QyxFQUFFaEMsQ0FBOUMsRUFBZ0Q7QUFDNUMsVUFBSTJELENBQUMsR0FBR3JDLElBQUksQ0FBQytCLGlCQUFMLENBQXVCckQsQ0FBdkIsQ0FBUjtBQUNBLFVBQUlrQyxLQUFLLEdBQUdsQyxDQUFDLEdBQUcsQ0FBaEI7O0FBQ0EsVUFBSWhCLElBQUksQ0FBQ0gsUUFBTCxDQUFjcUQsS0FBZCxDQUFKLEVBQXlCO0FBQ3JCbEQsUUFBQUEsSUFBSSxDQUFDSCxRQUFMLENBQWNxRCxLQUFkLEVBQXFCL0MsY0FBckIsQ0FBb0MsT0FBcEMsRUFBNkNJLFlBQTdDLENBQTBEeEIsRUFBRSxDQUFDNEMsS0FBN0QsRUFBb0VDLE1BQXBFLEdBQTZFK0MsQ0FBQyxDQUFDQyxhQUEvRTtBQUNBNUUsUUFBQUEsSUFBSSxDQUFDSCxRQUFMLENBQWNxRCxLQUFkLEVBQXFCaEMsTUFBckIsR0FBOEIsSUFBOUI7O0FBQ0EsWUFBSWxCLElBQUksQ0FBQ21FLFNBQUwsSUFBa0JuRSxJQUFJLENBQUNtRSxTQUFMLElBQWtCUSxDQUFDLENBQUNoQyxHQUExQyxFQUE4QztBQUMxQzNDLFVBQUFBLElBQUksQ0FBQzBDLFNBQUwsR0FBaUJRLEtBQWpCO0FBQ0g7QUFDSjs7QUFDRHlCLE1BQUFBLENBQUMsQ0FBQy9CLGFBQUYsQ0FBZ0I0QixJQUFoQixDQUFxQixVQUFTQyxDQUFULEVBQVdDLENBQVgsRUFBYTtBQUM5QixlQUFPRCxDQUFDLENBQUN0QixHQUFGLEdBQVF1QixDQUFDLENBQUN2QixHQUFqQjtBQUNILE9BRkQ7QUFHQW5ELE1BQUFBLElBQUksQ0FBQ3lDLGdCQUFMLENBQXNCUyxLQUF0QixJQUErQnlCLENBQS9CO0FBQ0g7O0FBRUQzRSxJQUFBQSxJQUFJLENBQUM2RCxhQUFMLENBQW1CN0QsSUFBSSxDQUFDMEMsU0FBeEI7QUFDSCxHQWpKMkI7QUFrSjVCbUIsRUFBQUEsYUFsSjRCLHlCQWtKYlgsS0FsSmEsRUFrSkwyQixRQWxKSyxFQWtKSTtBQUM1QjNCLElBQUFBLEtBQUssR0FBRzRCLE1BQU0sQ0FBQzVCLEtBQUQsQ0FBZDtBQUNBLFFBQUlsRCxJQUFJLEdBQUcsSUFBWDtBQUNBLFFBQUk2RSxRQUFRLElBQUk3RSxJQUFJLENBQUMwQyxTQUFMLElBQWtCUSxLQUFsQyxFQUF5Qzs7QUFDekMsUUFBSWxELElBQUksQ0FBQ0YsT0FBTCxJQUFnQixJQUFwQixFQUF5QjtBQUNyQixVQUFJRSxJQUFJLENBQUNGLE9BQVQsRUFBaUI7QUFDYkUsUUFBQUEsSUFBSSxDQUFDRixPQUFMLENBQWFLLGNBQWIsQ0FBNEIsT0FBNUIsRUFBcUM0RSxLQUFyQyxDQUEyQ0MsT0FBM0MsQ0FBbURDLE1BQU0sQ0FBQ0MsVUFBUCxDQUFrQkMsWUFBbEIsQ0FBK0IsQ0FBL0IsQ0FBbkQ7QUFDSDs7QUFDRG5GLE1BQUFBLElBQUksQ0FBQ0YsT0FBTCxDQUFhSyxjQUFiLENBQTRCLFdBQTVCLEVBQXlDZSxNQUF6QyxHQUFrRCxLQUFsRDtBQUNIOztBQUNEbEIsSUFBQUEsSUFBSSxDQUFDMEMsU0FBTCxHQUFpQlEsS0FBakI7QUFDQWxELElBQUFBLElBQUksQ0FBQ0YsT0FBTCxHQUFlRSxJQUFJLENBQUNILFFBQUwsQ0FBY3FELEtBQWQsQ0FBZjs7QUFFQSxRQUFJbEQsSUFBSSxDQUFDRixPQUFMLElBQWdCLElBQXBCLEVBQXlCO0FBQ3JCLFVBQUlzRixLQUFLLEdBQUdwRixJQUFJLENBQUNGLE9BQUwsQ0FBYUssY0FBYixDQUE0QixPQUE1QixDQUFaO0FBQ0FpRixNQUFBQSxLQUFLLENBQUNMLEtBQU4sQ0FBWUMsT0FBWixDQUFvQkMsTUFBTSxDQUFDQyxVQUFQLENBQWtCQyxZQUFsQixDQUErQixDQUEvQixDQUFwQjtBQUNBbkYsTUFBQUEsSUFBSSxDQUFDRixPQUFMLENBQWFLLGNBQWIsQ0FBNEIsV0FBNUIsRUFBeUNlLE1BQXpDLEdBQWtELElBQWxEO0FBQ0g7O0FBRURsQixJQUFBQSxJQUFJLENBQUM2QixRQUFMLENBQWNYLE1BQWQsR0FBdUIsS0FBdkI7QUFFQWxCLElBQUFBLElBQUksQ0FBQ3FGLG9CQUFMO0FBRUFyRixJQUFBQSxJQUFJLENBQUNzRixVQUFMO0FBQ0gsR0ExSzJCO0FBMks1QkQsRUFBQUEsb0JBM0s0QixrQ0EyS047QUFDbEIsUUFBSXJGLElBQUksR0FBRyxJQUFYOztBQUNBLFFBQUlBLElBQUksQ0FBQzhDLGlCQUFMLElBQTBCLElBQTlCLEVBQW1DO0FBQy9CLFVBQUl5QyxnQkFBZ0IsR0FBR3ZGLElBQUksQ0FBQ2dDLFNBQUwsQ0FBZXdELGNBQWYsRUFBdkI7QUFDQSxVQUFJQyxPQUFPLEdBQUc7QUFDVkMsUUFBQUEsVUFBVSxFQUFHL0csUUFESDtBQUVWZ0gsUUFBQUEsT0FBTyxFQUFHLENBRkE7QUFFdUI7QUFDakNDLFFBQUFBLE9BQU8sRUFBRyxDQUhBO0FBR3VCO0FBQ2pDQyxRQUFBQSxPQUFPLEVBQUcsQ0FKQTtBQUl1QjtBQUNqQ0MsUUFBQUEsT0FBTyxFQUFHLENBTEE7QUFLdUI7QUFDakNDLFFBQUFBLFVBQVUsRUFBRyxHQU5IO0FBTXVCO0FBQ2pDQyxRQUFBQSxXQUFXLEVBQUcsR0FQSjtBQU91QjtBQUNqQ0MsUUFBQUEsR0FBRyxFQUFHLENBUkk7QUFRdUI7QUFDakNDLFFBQUFBLEdBQUcsRUFBRyxDQVRJO0FBU3VCO0FBQ2pDQyxRQUFBQSxLQUFLLEVBQUcsQ0FWRTtBQVV1QjtBQUNqQ0MsUUFBQUEsUUFBUSxFQUFHLENBWEQsQ0FXdUI7O0FBWHZCLE9BQWQ7QUFhQXBHLE1BQUFBLElBQUksQ0FBQzhDLGlCQUFMLEdBQXlCLElBQUl0RSxnQkFBSixFQUF6QjtBQUNBd0IsTUFBQUEsSUFBSSxDQUFDOEMsaUJBQUwsQ0FBdUJ1RCxZQUF2QixDQUFvQ3JHLElBQUksQ0FBQ2dDLFNBQXpDLEVBQW9EakQsRUFBRSxDQUFDdUgsRUFBSCxDQUFNLENBQU4sRUFBUSxDQUFSLENBQXBELEVBQWlFQyxhQUFhLENBQUNDLFFBQS9FLEVBQXlGQyxrQkFBa0IsQ0FBQ0MsR0FBNUcsRUFBaUhuQixnQkFBakgsRUFBbUlFLE9BQW5JLEVBQTRJMUcsRUFBRSxDQUFDdUgsRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQTVJO0FBRUg7O0FBQ0QsUUFBSUssUUFBUSxHQUFHLEVBQWY7O0FBQ0EsU0FBSSxJQUFJM0YsQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFDaEIsSUFBSSxDQUFDeUMsZ0JBQUwsQ0FBc0J6QyxJQUFJLENBQUMwQyxTQUEzQixFQUFzQ0UsYUFBdEMsQ0FBb0RJLE1BQWxFLEVBQXlFLEVBQUVoQyxDQUEzRSxFQUE2RTtBQUN6RSxVQUFJNEYsSUFBSSxHQUFHNUcsSUFBSSxDQUFDeUMsZ0JBQUwsQ0FBc0J6QyxJQUFJLENBQUMwQyxTQUEzQixFQUFzQ0UsYUFBdEMsQ0FBb0Q1QixDQUFwRCxDQUFYO0FBQ0EyRixNQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYyxLQUFLdkQsZUFBTCxDQUFxQnNELElBQXJCLENBQWQ7QUFDSDs7QUFDRDVHLElBQUFBLElBQUksQ0FBQzhDLGlCQUFMLENBQXVCZ0UsT0FBdkIsQ0FBK0JILFFBQS9CLEVBQXlDLFVBQVUxRCxJQUFWLEVBQWdCO0FBQ3JELFdBQUt6RCxJQUFMLENBQVV1SCxpQkFBVixDQUE0QixJQUE1QixFQUFpQzlELElBQWpDO0FBQ0gsS0FGd0MsQ0FFdkN2QyxJQUZ1QyxDQUVsQyxJQUZrQyxDQUF6QztBQUdILEdBeE0yQjtBQXlNNUI0QyxFQUFBQSxlQXpNNEIsMkJBeU1aaEIsSUF6TVksRUF5TVA7QUFDakIsV0FBTztBQUNIMEUsTUFBQUEsT0FBTyxFQUFDMUUsSUFBSSxDQUFDMkUsU0FBTCxDQUFlLENBQWYsRUFBa0J0RSxHQUR2QjtBQUVIdUUsTUFBQUEsUUFBUSxFQUFDNUUsSUFBSSxDQUFDMkUsU0FBTCxDQUFlLENBQWYsRUFBa0JFLEdBRnhCO0FBR0hDLE1BQUFBLEtBQUssRUFBQzlFLElBQUksQ0FBQytFLFVBSFI7QUFJSEMsTUFBQUEsUUFBUSxFQUFDaEYsSUFBSSxDQUFDaUYsU0FKWDtBQUtIQyxNQUFBQSxTQUFTLEVBQUM1SSxTQUFTLENBQUM2SSxRQUFWLENBQW1CQyxVQUwxQjtBQU1IdkUsTUFBQUEsR0FBRyxFQUFHYixJQUFJLENBQUNhLEdBTlI7QUFPSHdFLE1BQUFBLG1CQUFtQixFQUFDLEtBUGpCO0FBUUhDLE1BQUFBLFdBQVcsRUFBQ3RGLElBQUksQ0FBQ3VGLFNBUmQ7QUFTSEMsTUFBQUEsSUFBSSxFQUFDeEYsSUFBSSxDQUFDeUYsT0FUUDtBQVVIQyxNQUFBQSxPQUFPLEVBQUMxRixJQUFJLENBQUNjLFNBVlY7QUFXSFQsTUFBQUEsR0FBRyxFQUFHLEtBQUtGLGdCQUFMLENBQXNCLEtBQUtDLFNBQTNCLEVBQXNDQyxHQVh6QztBQVc4QztBQUNqRHNGLE1BQUFBLEtBQUssRUFBRzNGLElBQUksQ0FBQzJGO0FBWlYsS0FBUDtBQWNILEdBeE4yQjtBQXlONUI7QUFDQTNDLEVBQUFBLFVBMU40Qix3QkEwTmhCO0FBQ1IsUUFBSXRGLElBQUksR0FBRyxJQUFYO0FBQ0EsUUFBSTJELE9BQU8sR0FBRzNELElBQUksQ0FBQ3lDLGdCQUFMLENBQXNCekMsSUFBSSxDQUFDMEMsU0FBM0IsRUFBc0NpQixPQUFwRDtBQUNBLFFBQUl1RSxNQUFNLEdBQUdwRSxLQUFLLENBQUNxRSxhQUFOLENBQW9CeEUsT0FBcEIsQ0FBYjs7QUFDQSxRQUFJdUUsTUFBTSxJQUFJdkUsT0FBTyxJQUFJLENBQXpCLEVBQTJCO0FBQ3ZCLFVBQUlyRCxHQUFHLEdBQUdsQyxRQUFRLENBQUNnSyxVQUFULENBQW9CRixNQUFNLENBQUNHLElBQTNCLENBQVY7O0FBQ0EsVUFBSXJJLElBQUksQ0FBQ3NJLGVBQUwsSUFBd0IsSUFBeEIsSUFBZ0N0SSxJQUFJLENBQUNzSSxlQUFMLElBQXdCaEksR0FBNUQsRUFBZ0U7QUFDNUQsYUFBS0YsT0FBTCxDQUFhRSxHQUFiLEVBQWlCLFVBQVNpSSxXQUFULEVBQXFCO0FBQ2xDLGVBQUtoSCxJQUFMLENBQVVoQixZQUFWLENBQXVCeEIsRUFBRSxDQUFDeUIsTUFBMUIsRUFBa0NDLFdBQWxDLEdBQWdEOEgsV0FBaEQ7QUFDSCxTQUZnQixDQUVmN0gsSUFGZSxDQUVWLElBRlUsQ0FBakI7QUFHSDs7QUFDRFYsTUFBQUEsSUFBSSxDQUFDc0IsT0FBTCxDQUFhSixNQUFiLEdBQXNCLElBQXRCO0FBQ0FsQixNQUFBQSxJQUFJLENBQUN1QixJQUFMLENBQVVMLE1BQVYsR0FBbUIsSUFBbkI7QUFDQWxCLE1BQUFBLElBQUksQ0FBQ3dCLEtBQUwsQ0FBV04sTUFBWCxHQUFvQixJQUFwQjtBQUNILEtBVkQsTUFVSztBQUNEbEIsTUFBQUEsSUFBSSxDQUFDc0IsT0FBTCxDQUFhSixNQUFiLEdBQXNCLEtBQXRCO0FBQ0FsQixNQUFBQSxJQUFJLENBQUN1QixJQUFMLENBQVVMLE1BQVYsR0FBbUIsS0FBbkI7QUFDQWxCLE1BQUFBLElBQUksQ0FBQ3dCLEtBQUwsQ0FBV04sTUFBWCxHQUFvQixLQUFwQjtBQUNIOztBQUNELFFBQUlNLEtBQUssR0FBR3hCLElBQUksQ0FBQ04sT0FBTCxDQUFhOEksdUJBQWIsQ0FBcUM3RSxPQUFyQyxDQUFaO0FBQ0EzRCxJQUFBQSxJQUFJLENBQUN3QixLQUFMLENBQVdqQixZQUFYLENBQXdCeEIsRUFBRSxDQUFDNEMsS0FBM0IsRUFBa0NDLE1BQWxDLEdBQTJDSixLQUEzQztBQUVBeEIsSUFBQUEsSUFBSSxDQUFDOEIsSUFBTCxDQUFVQyxJQUFWLENBQWViLE1BQWYsR0FBd0IsSUFBeEI7QUFDQSxRQUFJWSxJQUFJLEdBQUc5QixJQUFJLENBQUN5QyxnQkFBTCxDQUFzQnpDLElBQUksQ0FBQzBDLFNBQTNCLEVBQXNDK0YsUUFBdEMsR0FBaURDLEtBQUssQ0FBQ0MsV0FBTixDQUFrQkMsT0FBbEIsRUFBNUQ7O0FBQ0EsUUFBSTlHLElBQUksR0FBRyxDQUFYLEVBQWE7QUFDVEEsTUFBQUEsSUFBSSxHQUFHLENBQVA7QUFDSDs7QUFDRDlCLElBQUFBLElBQUksQ0FBQzZJLFdBQUwsQ0FBaUIvRyxJQUFqQjtBQUNILEdBdFAyQjtBQXVQNUIrRyxFQUFBQSxXQXZQNEIsdUJBdVBoQkMsU0F2UGdCLEVBdVBOO0FBQ2xCLFFBQUcsQ0FBQyxLQUFLaEgsSUFBVCxFQUFjOztBQUNkLFFBQUlnSCxTQUFTLEdBQUcsQ0FBaEIsRUFBa0I7QUFDZCxXQUFLQyxtQkFBTCxDQUF5QkQsU0FBekI7O0FBQ0EsVUFBRyxLQUFLRSxXQUFMLElBQW9CLElBQXZCLEVBQTRCO0FBQ3hCLGFBQUtBLFdBQUwsR0FBbUJOLEtBQUssQ0FBQ08sS0FBTixDQUFZQyxHQUFaLENBQWdCLFlBQVU7QUFDekNKLFVBQUFBLFNBQVM7QUFDVCxlQUFLQyxtQkFBTCxDQUF5QkQsU0FBekI7O0FBQ0EsY0FBR0EsU0FBUyxHQUFFLENBQWQsRUFBaUI7QUFDYkosWUFBQUEsS0FBSyxDQUFDTyxLQUFOLENBQVlFLEdBQVosQ0FBZ0IsS0FBS0gsV0FBckI7QUFDQSxpQkFBS0EsV0FBTCxHQUFtQixJQUFuQjtBQUNBLGlCQUFLRCxtQkFBTCxDQUF5QkQsU0FBekI7QUFDSDtBQUNKLFNBUmtDLENBUWpDcEksSUFSaUMsQ0FRNUIsSUFSNEIsQ0FBaEIsRUFRTixJQVJNLEVBUUQsQ0FBQyxDQVJBLENBQW5CO0FBU0g7QUFDSixLQWJELE1BYUs7QUFDRCxXQUFLcUksbUJBQUwsQ0FBeUJELFNBQXpCO0FBQ0g7QUFFSixHQTFRMkI7QUEyUTVCQyxFQUFBQSxtQkEzUTRCLCtCQTJRUmpILElBM1FRLEVBMlFIO0FBQ3JCLFNBQUtzSCxTQUFMLEdBQWlCdEgsSUFBakI7O0FBQ0EsUUFBSUEsSUFBSSxHQUFHLENBQVgsRUFBYTtBQUNULFdBQUtBLElBQUwsQ0FBVUYsTUFBVixHQUFtQixVQUFRbEQsUUFBUSxDQUFDMkssc0JBQVQsQ0FBZ0N2SCxJQUFoQyxDQUEzQjtBQUNILEtBRkQsTUFFSztBQUNELFdBQUtBLElBQUwsQ0FBVUYsTUFBVixHQUFtQixTQUFuQjtBQUNIO0FBQ0osR0FsUjJCO0FBbVI1Qm9DLEVBQUFBLFVBblI0Qix3QkFtUmhCO0FBQ1IsU0FBS3hFLElBQUwsQ0FBVThKLG9CQUFWLENBQStCLEtBQS9CLEVBRFEsQ0FDOEI7QUFDekMsR0FyUjJCO0FBc1I1QjtBQUNBQyxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFDcEIsUUFBRyxLQUFLUCxXQUFSLEVBQW9CO0FBQ2hCTixNQUFBQSxLQUFLLENBQUNPLEtBQU4sQ0FBWUUsR0FBWixDQUFnQixLQUFLSCxXQUFyQjtBQUNBLFdBQUtBLFdBQUwsR0FBbUIsSUFBbkI7QUFDSDs7QUFDRCxRQUFJLEtBQUtsRyxpQkFBVCxFQUEyQjtBQUN2QixXQUFLQSxpQkFBTCxDQUF1QjBHLFFBQXZCO0FBQ0EsV0FBSzFHLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLUyxpQkFBUixFQUEwQjtBQUN0QixXQUFLN0QsT0FBTCxDQUFhK0osTUFBYixDQUFvQixLQUFLbEcsaUJBQXpCO0FBQ0EsV0FBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFDRCxTQUFLL0QsSUFBTCxDQUFVOEosb0JBQVYsQ0FBK0IsS0FBL0IsRUFib0IsQ0Fha0I7QUFDekM7QUFyUzJCLENBQVQsQ0FBdkIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA0LTE5IDE2OjUzOjQ3XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIE1hbGxDb250cm9sbGVyID0gcmVxdWlyZShcIm1hbGxfY29udHJvbGxlclwiKVxudmFyIE1hbGxFdmVudCA9IHJlcXVpcmUoXCJtYWxsX2V2ZW50XCIpXG52YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbnZhciBUaW1lVG9vbCA9IHJlcXVpcmUoXCJ0aW1ldG9vbFwiKVxudmFyIE1hbGxJdGVtID0gcmVxdWlyZShcIm1hbGxfaXRlbVwiKTtcbnZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKVxudmFyIFJvbGVFdmVudCA9IHJlcXVpcmUoXCJyb2xlX2V2ZW50XCIpXG52YXIgTWFsbEFjdGlvbldpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJtYWxsXCIsIFwibWFsbF9hY3Rpb25fd2luZG93XCIpO1xuICAgICAgICAvLyB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLmN0cmwgPSBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKClcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6YWN572u5pWw5o2uLOWPr+S7peeUqOS6juWjsOaYjuS4gOS6m+WPmOmHj+S5i+exu+eahFxuICAgIGluaXRDb25maWc6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy50YWJfbGlzdCA9IHt9XG4gICAgICAgIHRoaXMuY3VyX3RhYiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgIHNlbGYuYmFja2dyb3VuZCA9IHNlbGYucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpXG4gICAgICAgIGlmIChzZWxmLmJhY2tncm91bmQgIT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImJpZ2JnXCIsXCJiaWdiZ18yXCIsXCJqcGdcIiksZnVuY3Rpb24ocmVzKXtcbiAgICAgICAgICAgICAgICBzZWxmLmJhY2tncm91bmQuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSByZXNcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEVcbiAgICAgICAgc2VsZi5tYWluQ29udGFpbmVyID0gc2VsZi5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fY29udGFpbmVyXCIpXG5cbiAgICAgICAgc2VsZi5tYWluX3BhbmVsID0gc2VsZi5tYWluQ29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwibWFpbl9wYW5lbFwiKVxuXG4gICAgICAgIHNlbGYudGFibGVDb250YWluZXIgPSBzZWxmLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0YWJfY29udGFpbmVyXCIpXG4gICAgICAgIFxuICAgICAgICBmb3IobGV0IGk9MTtpPDU7KytpKXtcbiAgICAgICAgICAgIGxldCB0YWJfYnRuID0gc2VsZi50YWJsZUNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRhYl9idG5fXCIraSlcbiAgICAgICAgICAgIHRhYl9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJ0YWJfdGlwc1wiKS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRhYl9idG4uZ2V0Q2hpbGRCeU5hbWUoXCJyZWRfbnVtXCIpLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGFiX2J0bi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdF9iZ1wiKS5hY3RpdmUgPSBmYWxzZTs7XG4gICAgICAgICAgICB0YWJfYnRuLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2VsZi50YWJfbGlzdFtpXSA9IHRhYl9idG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuY29udGFpbmVyID0gc2VsZi5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiY29udGFpbmVyXCIpXG4gICAgICAgIHNlbGYuYnRuID0gc2VsZi5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidG5cIilcbiAgICAgICAgc2VsZi5idG5fbGFiZWwgPSBzZWxmLmJ0bi5nZXRDaGlsZEJ5TmFtZShcInR4dFwiKVxuICAgICAgICBzZWxmLmJ0bi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5jb2luX2JnID0gc2VsZi5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV81MFwiKVxuICAgICAgICBzZWxmLmNvaW4gPSBzZWxmLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNvaW5cIilcbiAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY291bnRcIilcbiAgICAgICAgc2VsZi5hZGRfYnRuID0gc2VsZi5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJhZGRfYnRuXCIpXG4gICAgICAgIHNlbGYuYWRkX2J0bi5hY3RpdmUgPSBmYWxzZVxuICAgICAgICBzZWxmLnJlZnJlc2hfY291bnQgPSBzZWxmLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInJlZnJlc2hfY291bnRcIilcbiAgICAgICAgc2VsZi5yZWZyZXNoX2NvdW50LmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgc2VsZi50aXBzX2J0biA9IHNlbGYuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKCd0aXBzX2J0bicpXG4gICAgICAgIHNlbGYudGlwc19idG4uYWN0aXZlID0gZmFsc2VcbiAgICAgICAgc2VsZi50aW1lID0gc2VsZi5jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0aW1lXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHNlbGYudGltZS5ub2RlLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICAgICAgc2VsZi5nb29kX2NvbnMgPSBzZWxmLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImdvb2RfY29uc1wiKVxuXG4gICAgICAgIHNlbGYud2luVGl0bGUgPSBzZWxmLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ3aW5fdGl0bGVcIilcbiAgICAgICAgc2VsZi53aW5UaXRsZS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IFwi5rS75Yqo5ZWG5Z+OXCI7XG5cbiAgICAgICAgc2VsZi5jbG9zZV9idG4gPSBzZWxmLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJjbG9zZV9idG5cIilcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChNYWxsRXZlbnQuVXBkYXRlX0FjdGlvbl9ldmVudCxmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIC8vIC0t6I635Y+W5omA5pyJ5rS75Yqo5pWw5o2uXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTWFsbEV2ZW50LkJ1eV9BY3Rpb25fU2hvcF9TdWNjZXNzX2V2ZW50LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgIGlmICghdGhpcy5hY3Rpb25fZGF0YV9saXN0KSByZXR1cm4gXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggJiYgdGhpcy5hY3Rpb25fZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XSl7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uX2RhdGFfbGlzdFt0aGlzLmN1cl9pbmRleF0uYmlkID09IGRhdGEuYmlkKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4Y2hhbmdlX2xpc3QgPSB0aGlzLmFjdGlvbl9kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdLmV4Y2hhbmdlX2xpc3RcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSB0aGlzLmNvbW1vbl9zY3JvbGx2aWV3LmRhdGFfbGlzdFxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGxpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9IGxpc3RbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLmluZGV4ICYmIGV4Y2hhbmdlX2xpc3RbY2VsbC5pbmRleF0uYWltID09IGRhdGEuYWltKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNoYW5nZV9saXN0W2NlbGwuaW5kZXhdLmJ1eV9jb3VudCA9IGRhdGEuYnV5X2NvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jb21tb25fc2Nyb2xsdmlldyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uX3Njcm9sbHZpZXcudXBkYXRlSXRlbURhdGEoY2VsbC5pbmRleCx0aGlzLmNvbnZlcnRJdGVtSW5mbyhleGNoYW5nZV9saXN0W2NlbGwuaW5kZXhdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgaWYodGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChSb2xlRXZlbnQuVVBEQVRFX1JPTEVfQUNUSU9OX0FTU0VUUywgZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGlvbl9kYXRhX2xpc3QpIHJldHVyblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9pbmRleCAmJiB0aGlzLmFjdGlvbl9kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSB0aGlzLmFjdGlvbl9kYXRhX2xpc3RbdGhpcy5jdXJfaW5kZXhdLm5lZWRfaWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG4gICAgICAgIGZvcihsZXQgaSBpbiB0aGlzLnRhYl9saXN0KXtcbiAgICAgICAgICAgIGxldCB0YWJfYnRuID0gdGhpcy50YWJfbGlzdFtpXVxuICAgICAgICAgICAgdGFiX2J0bi5vbignY2xpY2snLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWJWaWV3KGksdHJ1ZSlcbiAgICAgICAgICAgIH0sdGhpcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlX2J0bi5vbignY2xpY2snLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMilcbiAgICAgICAgICAgIHRoaXMub25DbG9zZUJ0bigpXG4gICAgICAgIH0sdGhpcylcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCOLOa3u+WKoOWIsOWvueW6lOS4u+iKgueCueS5i+WQjueahOWbnuiwgyzkuZ/lsLHmmK/kuIDkuKrnqpfkvZPnmoTmraPlvI/lhaXlj6Ms5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXG4gICAgb3BlblJvb3RXbmQ6ZnVuY3Rpb24ocGFyYW1zKXtcbiAgICAgICAgdGhpcy5maXJzdF9iaWQgPSBwYXJhbXMgXG4gICAgICAgIHRoaXMuY3RybC5zZW5kMTY2NjAoKVxuICAgIH0sXG4gICAgdXBkYXRlRGF0YShkYXRhKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZighZGF0YSlyZXR1cm47XG4gICAgICAgIGlmIChkYXRhLmhvbGlkYXlfZXhjaGFuZ2VzICYmIFV0aWxzLm5leHQoZGF0YS5ob2xpZGF5X2V4Y2hhbmdlcykgPT0gbnVsbCkgIHJldHVybiBcbiAgICAgICAgLy8gLS3orrDlvZXpgZPlhbfkv6Hmga9cbiAgICAgICAgc2VsZi5kaWNfaXRlbV9jb25maWcgPSB7fVxuICAgICAgICAvLyAtLeWVhuWfjuaVsOaNrlxuICAgICAgICBzZWxmLmFjdGlvbl9kYXRhX2xpc3QgPSB7fVxuICAgICAgICBzZWxmLmN1cl9pbmRleCA9IDFcbiAgICAgICAgZGF0YS5ob2xpZGF5X2V4Y2hhbmdlcy5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICByZXR1cm4gYS5iaWQgIC0gYi5iaWQgXG4gICAgICAgIH0pXG4gICAgICAgIGZvcihsZXQgaT0wO2k8ZGF0YS5ob2xpZGF5X2V4Y2hhbmdlcy5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgIGxldCB2ID0gZGF0YS5ob2xpZGF5X2V4Y2hhbmdlc1tpXVxuICAgICAgICAgICAgbGV0IGluZGV4ID0gaSArIDFcbiAgICAgICAgICAgIGlmIChzZWxmLnRhYl9saXN0W2luZGV4XSl7XG4gICAgICAgICAgICAgICAgc2VsZi50YWJfbGlzdFtpbmRleF0uZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IHYuZXhjaGFuZ2VfbmFtZTtcbiAgICAgICAgICAgICAgICBzZWxmLnRhYl9saXN0W2luZGV4XS5hY3RpdmUgPSB0aGlzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZmlyc3RfYmlkICYmIHNlbGYuZmlyc3RfYmlkID09IHYuYmlkKXtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJfaW5kZXggPSBpbmRleFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHYuZXhjaGFuZ2VfbGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuYWltIC0gYi5haW1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzZWxmLmFjdGlvbl9kYXRhX2xpc3RbaW5kZXhdID0gdlxuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5jaGFuZ2VUYWJWaWV3KHNlbGYuY3VyX2luZGV4KVxuICAgIH0sXG4gICAgY2hhbmdlVGFiVmlldyggaW5kZXggLCBpc19jaGVjayl7XG4gICAgICAgIGluZGV4ID0gTnVtYmVyKGluZGV4KVxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChpc19jaGVjayAmJiBzZWxmLmN1cl9pbmRleCA9PSBpbmRleCkgcmV0dXJuXG4gICAgICAgIGlmIChzZWxmLmN1cl90YWIgIT0gbnVsbCl7XG4gICAgICAgICAgICBpZiAoc2VsZi5jdXJfdGFiKXtcbiAgICAgICAgICAgICAgICBzZWxmLmN1cl90YWIuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZVwiKS5jb2xvci5mcm9tSEVYKENvbmZpZy5jb2xvcl9kYXRhLmRhdGFfY29sb3IxNlsyXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuY3VyX3RhYi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdF9iZ1wiKS5hY3RpdmUgPSBmYWxzZTsgXG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jdXJfaW5kZXggPSBpbmRleFxuICAgICAgICBzZWxmLmN1cl90YWIgPSBzZWxmLnRhYl9saXN0W2luZGV4XVxuICAgICAgICBcbiAgICAgICAgaWYgKHNlbGYuY3VyX3RhYiAhPSBudWxsKXtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IHNlbGYuY3VyX3RhYi5nZXRDaGlsZEJ5TmFtZShcInRpdGxlXCIpXG4gICAgICAgICAgICBsYWJlbC5jb2xvci5mcm9tSEVYKENvbmZpZy5jb2xvcl9kYXRhLmRhdGFfY29sb3IxNlsyXSlcbiAgICAgICAgICAgIHNlbGYuY3VyX3RhYi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdF9iZ1wiKS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi50aXBzX2J0bi5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICBzZWxmLnVwZGF0ZVNjcm9sbHZpZXdMaXN0KCk7XG5cbiAgICAgICAgc2VsZi51cGRhdGVJbmZvKCk7XG4gICAgfSxcbiAgICB1cGRhdGVTY3JvbGx2aWV3TGlzdCgpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYgKHNlbGYuY29tbW9uX3Njcm9sbHZpZXcgPT0gbnVsbCl7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsX3ZpZXdfc2l6ZSA9IHNlbGYuZ29vZF9jb25zLmdldENvbnRlbnRTaXplKClcbiAgICAgICAgICAgIGxldCBzZXR0aW5nID0ge1xuICAgICAgICAgICAgICAgIGl0ZW1fY2xhc3MgOiBNYWxsSXRlbSxcbiAgICAgICAgICAgICAgICBzdGFydF94IDogNCwgICAgICAgICAgICAgICAgICAgICAvLy0tIOesrOS4gOS4quWNleWFg+eahFjotbfngrlcbiAgICAgICAgICAgICAgICBzcGFjZV94IDogMCwgICAgICAgICAgICAgICAgICAgICAvLy0tIHjmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgICAgICBzdGFydF95IDogNSwgICAgICAgICAgICAgICAgICAgICAvLy0tIOesrOS4gOS4quWNleWFg+eahFnotbfngrlcbiAgICAgICAgICAgICAgICBzcGFjZV95IDogMCwgICAgICAgICAgICAgICAgICAgICAvLy0tIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgICAgICBpdGVtX3dpZHRoIDogMzA2LCAgICAgICAgICAgICAgICAvLy0tIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICAgICAgaXRlbV9oZWlnaHQgOiAxNDcsICAgICAgICAgICAgICAgLy8tLSDljZXlhYPnmoTlsLrlr7hoZWlnaHRcbiAgICAgICAgICAgICAgICByb3cgOiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xuICAgICAgICAgICAgICAgIGNvbCA6IDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICAgICAgZGVsYXkgOiA0LCAgICAgICAgICAgICAgICAgICAgICAgLy8tLSDliJvlu7rlu7bov5/ml7bpl7RcbiAgICAgICAgICAgICAgICBvbmNlX251bSA6IDEsICAgICAgICAgICAgICAgICAgICAvLy0tIOavj+asoeWIm+W7uueahOaVsOmHj1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5jb21tb25fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KCkgXG4gICAgICAgICAgICBzZWxmLmNvbW1vbl9zY3JvbGx2aWV3LmNyZWF0ZVNjcm9sbChzZWxmLmdvb2RfY29ucywgY2MudjIoMCwwKSAsIFNjcm9sbFZpZXdEaXIudmVydGljYWwsIFNjcm9sbFZpZXdTdGFydFBvcy50b3AsIHNjcm9sbF92aWV3X3NpemUsIHNldHRpbmcsIGNjLnYyKDAsIDApKVxuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGl0ZW1JbmZvID0gW11cbiAgICAgICAgZm9yKGxldCBpPTA7aTxzZWxmLmFjdGlvbl9kYXRhX2xpc3Rbc2VsZi5jdXJfaW5kZXhdLmV4Y2hhbmdlX2xpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHNlbGYuYWN0aW9uX2RhdGFfbGlzdFtzZWxmLmN1cl9pbmRleF0uZXhjaGFuZ2VfbGlzdFtpXVxuICAgICAgICAgICAgaXRlbUluZm8ucHVzaCh0aGlzLmNvbnZlcnRJdGVtSW5mbyhpdGVtKSkgXG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jb21tb25fc2Nyb2xsdmlldy5zZXREYXRhKGl0ZW1JbmZvLCBmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWxsQnV5V2luZG93KHRydWUsY2VsbClcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgIH0sXG4gICAgY29udmVydEl0ZW1JbmZvKGRhdGEpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbV9pZDpkYXRhLml0ZW1fbGlzdFswXS5iaWQsXG4gICAgICAgICAgICBpdGVtX251bTpkYXRhLml0ZW1fbGlzdFswXS5udW0sXG4gICAgICAgICAgICBwcmljZTpkYXRhLmV4cGVuZF9udW0sXG4gICAgICAgICAgICBwYXlfdHlwZTpkYXRhLmV4cGVuZF9pZCxcbiAgICAgICAgICAgIHNob3BfdHlwZTpNYWxsQ29uc3QuTWFsbFR5cGUuQWN0aW9uU2hvcCxcbiAgICAgICAgICAgIGFpbSA6IGRhdGEuYWltLFxuICAgICAgICAgICAgaXNfc2hvd19saW1pdF9sYWJlbDpmYWxzZSxcbiAgICAgICAgICAgIGxpbWl0X2NvdW50OmRhdGEubGltaXRfYnV5LFxuICAgICAgICAgICAgbmFtZTpkYXRhLmFpbV9zdHIsXG4gICAgICAgICAgICBoYXNfYnV5OmRhdGEuYnV5X2NvdW50LFxuICAgICAgICAgICAgYmlkIDogdGhpcy5hY3Rpb25fZGF0YV9saXN0W3RoaXMuY3VyX2luZGV4XS5iaWQsIC8vLS3lrZDmtLvliqjnvJblj7dcbiAgICAgICAgICAgIGxhYmxlIDogZGF0YS5sYWJsZSxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8vIC0t5pu05paw5Li755WM6Z2i5L+h5oGvXG4gICAgdXBkYXRlSW5mbygpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgbGV0IG5lZWRfaWQgPSBzZWxmLmFjdGlvbl9kYXRhX2xpc3Rbc2VsZi5jdXJfaW5kZXhdLm5lZWRfaWRcbiAgICAgICAgbGV0IGNvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcobmVlZF9pZClcbiAgICAgICAgaWYgKGNvbmZpZyAmJiBuZWVkX2lkICE9IDApe1xuICAgICAgICAgICAgbGV0IHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoY29uZmlnLmljb24pXG4gICAgICAgICAgICBpZiAoc2VsZi5yZWNvcmRfY29zdF9yZXMgPT0gbnVsbCB8fCBzZWxmLnJlY29yZF9jb3N0X3JlcyAhPSByZXMpe1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsZnVuY3Rpb24oU3ByaXRlRnJhbWUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvaW4uZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSBTcHJpdGVGcmFtZTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmNvaW5fYmcuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYuY29pbi5hY3RpdmUgPSB0cnVlOyBcbiAgICAgICAgICAgIHNlbGYuY291bnQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBzZWxmLmNvaW5fYmcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxmLmNvaW4uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxmLmNvdW50LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb3VudCA9IHNlbGYucm9sZV92by5nZXRBY3Rpb25Bc3NldHNOdW1CeUJpZChuZWVkX2lkKTtcbiAgICAgICAgc2VsZi5jb3VudC5nZXRDb21wb25lbnQoY2MuTGFiZWwpLnN0cmluZyA9IGNvdW50O1xuXG4gICAgICAgIHNlbGYudGltZS5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIGxldCB0aW1lID0gc2VsZi5hY3Rpb25fZGF0YV9saXN0W3NlbGYuY3VyX2luZGV4XS5lbmRfdGltZSAtIGdjb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKVxuICAgICAgICBpZiAodGltZSA8IDApe1xuICAgICAgICAgICAgdGltZSA9IDBcbiAgICAgICAgfVxuICAgICAgICBzZWxmLnNldExlc3NUaW1lKHRpbWUpXG4gICAgfSxcbiAgICBzZXRMZXNzVGltZShsZXNzX3RpbWUpe1xuICAgICAgICBpZighdGhpcy50aW1lKXJldHVyblxuICAgICAgICBpZiAobGVzc190aW1lID4gMCl7XG4gICAgICAgICAgICB0aGlzLnNldFRpbWVGb3JtYXRTdHJpbmcobGVzc190aW1lKVxuICAgICAgICAgICAgaWYodGhpcy50aW1lX3RpY2hldCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfdGljaGV0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIGxlc3NfdGltZS0tIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVGb3JtYXRTdHJpbmcobGVzc190aW1lKVxuICAgICAgICAgICAgICAgICAgICBpZihsZXNzX3RpbWUgPDAgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVfdGljaGV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aWNoZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKGxlc3NfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwxMDAwLC0xKVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZUZvcm1hdFN0cmluZyhsZXNzX3RpbWUpXG4gICAgICAgIH1cblxuICAgIH0sXG4gICAgc2V0VGltZUZvcm1hdFN0cmluZyh0aW1lKXtcbiAgICAgICAgdGhpcy5yZXN0X3RpbWUgPSB0aW1lXG4gICAgICAgIGlmICh0aW1lID4gMCl7XG4gICAgICAgICAgICB0aGlzLnRpbWUuc3RyaW5nID0gXCLliankvZnml7bpl7Q6XCIrVGltZVRvb2wuZ2V0VGltZUZvcm1hdERheUlJSUlJSSh0aW1lKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMudGltZS5zdHJpbmcgPSBcIuWJqeS9meaXtumXtDogMFwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBvbkNsb3NlQnRuKCl7XG4gICAgICAgIHRoaXMuY3RybC5vcGVuTWFsbEFjdGlvbldpbmRvdyhmYWxzZSkgLy8tLeWFs+mXrVxuICAgIH0sXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy50aW1lX3RpY2hldCl7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy50aW1lX3RpY2hldCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVfdGljaGV0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21tb25fc2Nyb2xsdmlldyl7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbl9zY3JvbGx2aWV3LmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbl9zY3JvbGx2aWV3ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnJvbGVfYXNzZXRzX2V2ZW50KXtcbiAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudClcbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWxsQWN0aW9uV2luZG93KGZhbHNlKSAvLy0t5YWz6ZetXG4gICAgfSxcbn0pIl19