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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/gamestart.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, '6ac98UJ8W1KqKWD6zsw9E9A', 'gamestart');
// Scripts/gamestart.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      主场景的入口
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
require("baseclass");
 
require("basecontroller");
 
require("baseview");
 
require("basepanel");
 
require("global");
 
require("viewmanager");
 
require("globalmessagemgr");
 
require("config");
 
window.Config = {};
window.gcore = require("game-core-js-min");
window.Log = gcore.Log;
window.gdata = gcore.CoreUtils.getDataKeyVal;
 
var LoaderManager = require("loadermanager");
 
var LoginController = require("login_controller");
 
var ZipLoader = require("ZipLoader");
 
var DownloadManager = require("downloadmanager");
 
cc.Class({
  "extends": cc.Component,
  properties: {
    game_canvas: {
      "default": null,
      type: cc.Canvas
    }
  },
  ctor: function ctor() {
    this.finish_loading = false;
    this.preload_loading = false;
    window.game = this;
  },
  onLoad: function onLoad() {
    this.adjustFrame(); //游戏加载开始上报
 
    if (cli_log && cli_log.log_loading_start) {
      cli_log.log_loading_start();
    }
 
    ; // cc.game.setFrameRate(60);
    // 调整适配策略        
 
    var screen_scale = SCREEN_WIDTH / SCREEN_HEIGHT;
    var view_size = cc.view.getFrameSize();
    var cur_scale = view_size.width / view_size.height;
    window.isMobile = true;
    if (cc.sys.os == cc.sys.OS_OSX || cc.sys.os == cc.sys.OS_WINDOWS || cc.sys.os == cc.sys.OS_LINUX) window.isMobile = false;
 
    if (!OUT_NET) {
      window.isMobile = true;
 
      if (window.WEN_DING_FU) {
        if (cc.sys.os == cc.sys.OS_OSX || cc.sys.os == cc.sys.OS_WINDOWS || cc.sys.os == cc.sys.OS_LINUX) window.isMobile = false;
      }
    }
 
    if (isMobile) {
      if (cur_scale > screen_scale) {
        // 适应高,调整宽
        window.FIT_HEIDGHT = true;
        this.game_canvas.fitHeight = true;
        this.game_canvas.fitWidth = false;
        window.FIT_SCALE = Math.ceil(cur_scale / screen_scale * 100) / 100;
      } else {
        // 适应宽,调整高
        window.FIT_WIDTH = true;
        this.game_canvas.fitHeight = false;
        this.game_canvas.fitWidth = true;
        window.FIT_SCALE = Math.ceil(screen_scale / cur_scale * 100) / 100;
      }
    } else {
      this.game_canvas.fitHeight = true;
      this.game_canvas.fitWidth = true;
      window.FIT_SCALE = 1;
    }
 
    var graphics_cp = this.node.addComponent(cc.Graphics);
    graphics_cp.clear();
    graphics_cp.fillColor = cc.color(111, 111, 111, 128);
    graphics_cp.rect(-0.5 * this.node.width, -0.5 * this.node.height, this.node.width, this.node.height);
    graphics_cp.fill();
    this.scheduleOnce(function () {
      LoaderManager.getInstance().loadPrefab("prefab/login/game_views", function (view_data) {
        if (view_data) {
          var views = view_data;
          this.node.addChild(views); // this.views_js = views.getComponent("game_views");
 
          this.views_js = views.addComponent("game_views");
          this.views_js.initWaitingView();
          this.initViewTags(this.views_js);
 
          if (window.FIT_SCALE == 1 && !window.isMobile) {
            this.views_js.showFrame();
          }
        }
      }.bind(this)); // var url = URL_CONFIG + "?platform=" + PLATFORM + "&chanleId=" + CHANNEL + "&time=" + Date.now();        
      // cc.loader.load(url, (function(err, data){
      //     data = JSON.parse(data);
      //     cc.log("DDDDDDDDDDDDDDDDDDD");
      //     cc.log(data);
      //     for(var k in data){
      //         Log.debug(k, data[k]);
      //         window[k] = data[k];
      //     }
      //     this.url_init = true;
      // if (this.view_init)
      // LoginController.getInstance().openLoginWindow({status:true, index:1});
      // }).bind(this)); 
 
      this.initPreloadRes();
    }.bind(this), 0.1);
 
    if (window.ImportConfigs) {
      console.log(window.ImportConfigs);
    }
  },
  initViewTags: function initViewTags(views) {
    // 储存各个层级节点
    ViewManager.getInstance().addSceneNode(SCENE_TAG.scene, views.scene_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.battle, views.battle_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.effect, views.effect_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.ui, views.ui_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.win, views.win_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.top, views.top_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.dialogue, views.dialogue_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.msg, views.msg_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.reconnect, views.reconnect_tag);
    ViewManager.getInstance().addSceneNode(SCENE_TAG.loading, views.loading_tag);
    this.view_init = true; // if (this.url_init)
 
    LoginController.getInstance().openLoginWindow({
      status: true,
      index: 1
    });
  },
  initConfigs: function initConfigs(finish_cb) {
    // 加载配置表
    // var config_zip_url = DATA_URL + "data.zip" + "?" + DATA_VER;
    LoaderManager.getInstance().initConfigs(function (progress) {
      if (progress > 1) progress = 1;
 
      if (typeof progress == "number") {
        LoginController.getInstance().updateLoading(progress * 0.5);
        LoginController.getInstance().updateSeconLoading(progress);
      } else {
        var RoleController = require("role_controller");
 
        RoleController.getInstance(); // LoaderManager.getInstance().initConfigScript();
 
        var ModuleInfo = require("modulelist");
 
        for (var k in ModuleInfo.module_list) {
          var c = require(ModuleInfo.module_list[k]);
 
          if (c.getInstance) {
            c.getInstance();
          }
        }
 
        if (finish_cb) finish_cb();
      }
    }.bind(this));
  },
  // 协议请求更新
  updateProtoProgress: function updateProtoProgress(proggress) {
    var cur_progress = 0.5 + proggress * 0.4;
    LoginController.getInstance().updateLoading(cur_progress);
    LoginController.getInstance().updateSeconLoading(proggress);
  },
  update: function update(dt) {
    gcore.SmartSocket.handleMsg();
 
    var BattleController = require("battle_controller");
 
    BattleController.getInstance().update(dt);
  },
  initMsgView: function initMsgView() {
    this.views_js.initMsgView();
  },
  addGuideRes: function addGuideRes() {
    this._pre_load_res.push("prefab/drama/guide_main_view.prefab");
 
    this._pre_load_res.push("prefab/drama/dramatalk_view.prefab");
  },
  addChapterRes: function addChapterRes(chapter_id) {
    if (!chapter_id) chapter_id = 1;
    var drama_config = Config.dungeon_data.data_drama_world_info["1"][chapter_id];
    var battle_res_id = drama_config.map_id;
    var drama_paths = PathTool.getBattleDrameBg(battle_res_id);
 
    this._pre_load_res.push(drama_paths.s);
 
    this._pre_load_res.push(drama_paths.f);
  },
  addRenameRes: function addRenameRes() {
    this._pre_load_res.push("prefab/roleinfo/role_setname_view.prefab");
 
    var sketon_path = PathTool.getSpinePath(PathTool.getEffectRes(237), "action");
 
    this._pre_load_res.push(sketon_path);
  },
  initPreloadRes: function initPreloadRes() {
    this._pre_load_res = ["spine/E50069/action.atlas"];
 
    for (var atlas_i in cacheAtlas) {
      var atlas_path = cacheAtlas[atlas_i];
 
      this._pre_load_res.push(atlas_path + ".plist");
    }
 
    for (var prefab_i in cachePrefabs) {
      var prefab_path = "prefab/" + cachePrefabs[prefab_i] + ".prefab";
 
      this._pre_load_res.push(prefab_path);
    }
  },
  preloadRes: function preloadRes(finish_cb) {
    var cur_num = 0;
    this.preload_loading = true;
    LoaderManager.getInstance().initConfigScript();
 
    for (var res_i in this._pre_load_res) {
      this.waiting_timer = gcore.Timer.set(function (res_path) {
        LoaderManager.getInstance().loadRes(res_path, function (res_i) {
          cur_num++;
          var progress = cur_num / this._pre_load_res.length;
          var cur_progress = 0.5 + progress * 0.4;
          LoginController.getInstance().updateLoading(cur_progress);
          LoginController.getInstance().updateSeconLoading(progress);
 
          if (cur_num == this._pre_load_res.length && finish_cb) {
            // var ModuleInfo = require("modulelist");
            // for (var k in ModuleInfo.module_list) {
            //     var c = require(ModuleInfo.module_list[k]);
            //     if (c.getInstance) {
            //         c.getInstance();
            //     }
            // }
            this.preload_loading = false;
            finish_cb();
 
            if (!OUT_NET) {
              var GmCmd = require("gmcmd");
 
              GmCmd.show();
            }
          }
        }.bind(this, res_i));
      }.bind(this, this._pre_load_res[res_i]), 100, this._pre_load_res.length);
    }
  },
  updateLoadingStatus: function updateLoadingStatus(status) {
    this.finish_loading = status;
  },
  updateWaitingStatus: function updateWaitingStatus(status) {
    if (this.views_js) this.views_js.updateWaitingStatus(status);
  },
  relogin: function relogin() {
    this.scheduleOnce(function () {
      if (PLATFORM_TYPR == "SH_SDK") {
        LoginController.getInstance().openLoginWindow({
          status: true,
          index: 1
        });
      } else {
        window.location.reload();
      }
    }, 2);
  },
  // 调整帧率
  adjustFrame: function adjustFrame() {
    if (cc.sys.os == cc.sys.OS_ANDROID) {
      if (cc.sys.osVersion < 8) {
        cc.game.setFrameRate(40);
      } else {
        cc.game.setFrameRate(60);
      }
    } else if (cc.sys.os == cc.sys.OS_IOS) {
      cc.game.setFrameRate(40);
    } else {
      cc.game.setFrameRate(60);
    }
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcZ2FtZXN0YXJ0LmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJ3aW5kb3ciLCJDb25maWciLCJnY29yZSIsIkxvZyIsImdkYXRhIiwiQ29yZVV0aWxzIiwiZ2V0RGF0YUtleVZhbCIsIkxvYWRlck1hbmFnZXIiLCJMb2dpbkNvbnRyb2xsZXIiLCJaaXBMb2FkZXIiLCJEb3dubG9hZE1hbmFnZXIiLCJjYyIsIkNsYXNzIiwiQ29tcG9uZW50IiwicHJvcGVydGllcyIsImdhbWVfY2FudmFzIiwidHlwZSIsIkNhbnZhcyIsImN0b3IiLCJmaW5pc2hfbG9hZGluZyIsInByZWxvYWRfbG9hZGluZyIsImdhbWUiLCJvbkxvYWQiLCJhZGp1c3RGcmFtZSIsImNsaV9sb2ciLCJsb2dfbG9hZGluZ19zdGFydCIsInNjcmVlbl9zY2FsZSIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJ2aWV3X3NpemUiLCJ2aWV3IiwiZ2V0RnJhbWVTaXplIiwiY3VyX3NjYWxlIiwid2lkdGgiLCJoZWlnaHQiLCJpc01vYmlsZSIsInN5cyIsIm9zIiwiT1NfT1NYIiwiT1NfV0lORE9XUyIsIk9TX0xJTlVYIiwiT1VUX05FVCIsIldFTl9ESU5HX0ZVIiwiRklUX0hFSURHSFQiLCJmaXRIZWlnaHQiLCJmaXRXaWR0aCIsIkZJVF9TQ0FMRSIsIk1hdGgiLCJjZWlsIiwiRklUX1dJRFRIIiwiZ3JhcGhpY3NfY3AiLCJub2RlIiwiYWRkQ29tcG9uZW50IiwiR3JhcGhpY3MiLCJjbGVhciIsImZpbGxDb2xvciIsImNvbG9yIiwicmVjdCIsImZpbGwiLCJzY2hlZHVsZU9uY2UiLCJnZXRJbnN0YW5jZSIsImxvYWRQcmVmYWIiLCJ2aWV3X2RhdGEiLCJ2aWV3cyIsImFkZENoaWxkIiwidmlld3NfanMiLCJpbml0V2FpdGluZ1ZpZXciLCJpbml0Vmlld1RhZ3MiLCJzaG93RnJhbWUiLCJiaW5kIiwiaW5pdFByZWxvYWRSZXMiLCJJbXBvcnRDb25maWdzIiwiY29uc29sZSIsImxvZyIsIlZpZXdNYW5hZ2VyIiwiYWRkU2NlbmVOb2RlIiwiU0NFTkVfVEFHIiwic2NlbmUiLCJzY2VuZV90YWciLCJiYXR0bGUiLCJiYXR0bGVfdGFnIiwiZWZmZWN0IiwiZWZmZWN0X3RhZyIsInVpIiwidWlfdGFnIiwid2luIiwid2luX3RhZyIsInRvcCIsInRvcF90YWciLCJkaWFsb2d1ZSIsImRpYWxvZ3VlX3RhZyIsIm1zZyIsIm1zZ190YWciLCJyZWNvbm5lY3QiLCJyZWNvbm5lY3RfdGFnIiwibG9hZGluZyIsImxvYWRpbmdfdGFnIiwidmlld19pbml0Iiwib3BlbkxvZ2luV2luZG93Iiwic3RhdHVzIiwiaW5kZXgiLCJpbml0Q29uZmlncyIsImZpbmlzaF9jYiIsInByb2dyZXNzIiwidXBkYXRlTG9hZGluZyIsInVwZGF0ZVNlY29uTG9hZGluZyIsIlJvbGVDb250cm9sbGVyIiwiTW9kdWxlSW5mbyIsImsiLCJtb2R1bGVfbGlzdCIsImMiLCJ1cGRhdGVQcm90b1Byb2dyZXNzIiwicHJvZ2dyZXNzIiwiY3VyX3Byb2dyZXNzIiwidXBkYXRlIiwiZHQiLCJTbWFydFNvY2tldCIsImhhbmRsZU1zZyIsIkJhdHRsZUNvbnRyb2xsZXIiLCJpbml0TXNnVmlldyIsImFkZEd1aWRlUmVzIiwiX3ByZV9sb2FkX3JlcyIsInB1c2giLCJhZGRDaGFwdGVyUmVzIiwiY2hhcHRlcl9pZCIsImRyYW1hX2NvbmZpZyIsImR1bmdlb25fZGF0YSIsImRhdGFfZHJhbWFfd29ybGRfaW5mbyIsImJhdHRsZV9yZXNfaWQiLCJtYXBfaWQiLCJkcmFtYV9wYXRocyIsIlBhdGhUb29sIiwiZ2V0QmF0dGxlRHJhbWVCZyIsInMiLCJmIiwiYWRkUmVuYW1lUmVzIiwic2tldG9uX3BhdGgiLCJnZXRTcGluZVBhdGgiLCJnZXRFZmZlY3RSZXMiLCJhdGxhc19pIiwiY2FjaGVBdGxhcyIsImF0bGFzX3BhdGgiLCJwcmVmYWJfaSIsImNhY2hlUHJlZmFicyIsInByZWZhYl9wYXRoIiwicHJlbG9hZFJlcyIsImN1cl9udW0iLCJpbml0Q29uZmlnU2NyaXB0IiwicmVzX2kiLCJ3YWl0aW5nX3RpbWVyIiwiVGltZXIiLCJzZXQiLCJyZXNfcGF0aCIsImxvYWRSZXMiLCJsZW5ndGgiLCJHbUNtZCIsInNob3ciLCJ1cGRhdGVMb2FkaW5nU3RhdHVzIiwidXBkYXRlV2FpdGluZ1N0YXR1cyIsInJlbG9naW4iLCJQTEFURk9STV9UWVBSIiwibG9jYXRpb24iLCJyZWxvYWQiLCJPU19BTkRST0lEIiwib3NWZXJzaW9uIiwic2V0RnJhbWVSYXRlIiwiT1NfSU9TIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBQSxPQUFPLENBQUMsV0FBRCxDQUFQOztBQUNBQSxPQUFPLENBQUMsZ0JBQUQsQ0FBUDs7QUFDQUEsT0FBTyxDQUFDLFVBQUQsQ0FBUDs7QUFDQUEsT0FBTyxDQUFDLFdBQUQsQ0FBUDs7QUFDQUEsT0FBTyxDQUFDLFFBQUQsQ0FBUDs7QUFDQUEsT0FBTyxDQUFDLGFBQUQsQ0FBUDs7QUFDQUEsT0FBTyxDQUFDLGtCQUFELENBQVA7O0FBQ0FBLE9BQU8sQ0FBQyxRQUFELENBQVA7O0FBRUFDLE1BQU0sQ0FBQ0MsTUFBUCxHQUFnQixFQUFoQjtBQUNBRCxNQUFNLENBQUNFLEtBQVAsR0FBZUgsT0FBTyxDQUFDLGtCQUFELENBQXRCO0FBQ0FDLE1BQU0sQ0FBQ0csR0FBUCxHQUFhRCxLQUFLLENBQUNDLEdBQW5CO0FBQ0FILE1BQU0sQ0FBQ0ksS0FBUCxHQUFlRixLQUFLLENBQUNHLFNBQU4sQ0FBZ0JDLGFBQS9COztBQUVBLElBQUlDLGFBQWEsR0FBR1IsT0FBTyxDQUFDLGVBQUQsQ0FBM0I7O0FBQ0EsSUFBSVMsZUFBZSxHQUFHVCxPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBQ0EsSUFBSVUsU0FBUyxHQUFHVixPQUFPLENBQUMsV0FBRCxDQUF2Qjs7QUFDQSxJQUFJVyxlQUFlLEdBQUdYLE9BQU8sQ0FBQyxpQkFBRCxDQUE3Qjs7QUFFQVks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TSxFQUFFLElBQVY7QUFBZ0JDLFVBQUFBLEtBQUssRUFBRTtBQUF2QixTQUE5QztBQUNILE9BRkQsTUFFSztBQUNEcEcsUUFBQUEsTUFBTSxDQUFDaUssUUFBUCxDQUFnQkMsTUFBaEI7QUFDSDtBQUNKLEtBTkQsRUFNRyxDQU5IO0FBT0gsR0FyUUk7QUF1UUw7QUFDQTNJLEVBQUFBLFdBQVcsRUFBRSx1QkFBVztBQUNwQixRQUFJWixFQUFFLENBQUN5QixHQUFILENBQU9DLEVBQVAsSUFBYTFCLEVBQUUsQ0FBQ3lCLEdBQUgsQ0FBTytILFVBQXhCLEVBQW9DO0FBQ2hDLFVBQUl4SixFQUFFLENBQUN5QixHQUFILENBQU9nSSxTQUFQLEdBQW1CLENBQXZCLEVBQTBCO0FBQ3RCekosUUFBQUEsRUFBRSxDQUFDVSxJQUFILENBQVFnSixZQUFSLENBQXFCLEVBQXJCO0FBQ0gsT0FGRCxNQUVPO0FBQ0gxSixRQUFBQSxFQUFFLENBQUNVLElBQUgsQ0FBUWdKLFlBQVIsQ0FBcUIsRUFBckI7QUFDSDtBQUNKLEtBTkQsTUFNTyxJQUFJMUosRUFBRSxDQUFDeUIsR0FBSCxDQUFPQyxFQUFQLElBQWExQixFQUFFLENBQUN5QixHQUFILENBQU9rSSxNQUF4QixFQUFnQztBQUNuQzNKLE1BQUFBLEVBQUUsQ0FBQ1UsSUFBSCxDQUFRZ0osWUFBUixDQUFxQixFQUFyQjtBQUNILEtBRk0sTUFFQTtBQUNIMUosTUFBQUEsRUFBRSxDQUFDVSxJQUFILENBQVFnSixZQUFSLENBQXFCLEVBQXJCO0FBQ0g7QUFDSjtBQXBSSSxDQUFUIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDkuLvlnLrmma/nmoTlhaXlj6Ncbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnJlcXVpcmUoXCJiYXNlY2xhc3NcIik7XG5yZXF1aXJlKFwiYmFzZWNvbnRyb2xsZXJcIik7XG5yZXF1aXJlKFwiYmFzZXZpZXdcIik7XG5yZXF1aXJlKFwiYmFzZXBhbmVsXCIpO1xucmVxdWlyZShcImdsb2JhbFwiKTtcbnJlcXVpcmUoXCJ2aWV3bWFuYWdlclwiKTtcbnJlcXVpcmUoXCJnbG9iYWxtZXNzYWdlbWdyXCIpO1xucmVxdWlyZShcImNvbmZpZ1wiKTtcblxud2luZG93LkNvbmZpZyA9IHt9O1xud2luZG93Lmdjb3JlID0gcmVxdWlyZShcImdhbWUtY29yZS1qcy1taW5cIik7XG53aW5kb3cuTG9nID0gZ2NvcmUuTG9nO1xud2luZG93LmdkYXRhID0gZ2NvcmUuQ29yZVV0aWxzLmdldERhdGFLZXlWYWw7XG5cbnZhciBMb2FkZXJNYW5hZ2VyID0gcmVxdWlyZShcImxvYWRlcm1hbmFnZXJcIik7XG52YXIgTG9naW5Db250cm9sbGVyID0gcmVxdWlyZShcImxvZ2luX2NvbnRyb2xsZXJcIik7XG52YXIgWmlwTG9hZGVyID0gcmVxdWlyZShcIlppcExvYWRlclwiKTtcbnZhciBEb3dubG9hZE1hbmFnZXIgPSByZXF1aXJlKFwiZG93bmxvYWRtYW5hZ2VyXCIpO1xuXG5jYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogY2MuQ29tcG9uZW50LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBnYW1lX2NhbnZhczogeyBkZWZhdWx0OiBudWxsLCB0eXBlOiBjYy5DYW52YXMgfSxcbiAgICB9LFxuXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZpbmlzaF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJlbG9hZF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHdpbmRvdy5nYW1lID0gdGhpcztcbiAgICB9LFxuXG5cbiAgICBvbkxvYWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hZGp1c3RGcmFtZSgpO1xuXG4gICAgICAgIC8v5ri45oiP5Yqg6L295byA5aeL5LiK5oqlXG4gICAgICAgIGlmIChjbGlfbG9nICYmIGNsaV9sb2cubG9nX2xvYWRpbmdfc3RhcnQpIHtcbiAgICAgICAgICAgIGNsaV9sb2cubG9nX2xvYWRpbmdfc3RhcnQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBjYy5nYW1lLnNldEZyYW1lUmF0ZSg2MCk7XG4gICAgICAgIC8vIOiwg+aVtOmAgumFjeetlueVpSAgICAgICAgXG4gICAgICAgIHZhciBzY3JlZW5fc2NhbGUgPSBTQ1JFRU5fV0lEVEggLyBTQ1JFRU5fSEVJR0hUO1xuICAgICAgICB2YXIgdmlld19zaXplID0gY2Mudmlldy5nZXRGcmFtZVNpemUoKTtcbiAgICAgICAgdmFyIGN1cl9zY2FsZSA9IHZpZXdfc2l6ZS53aWR0aCAvIHZpZXdfc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHdpbmRvdy5pc01vYmlsZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfT1NYIHx8IGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfV0lORE9XUyB8fCBjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0xJTlVYKVxuICAgICAgICAgICAgd2luZG93LmlzTW9iaWxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFPVVRfTkVUKXtcbiAgICAgICAgICAgIHdpbmRvdy5pc01vYmlsZSA9IHRydWU7XG4gICAgICAgICAgICBpZih3aW5kb3cuV0VOX0RJTkdfRlUpe1xuICAgICAgICAgICAgICAgIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX09TWCB8fCBjYy5zeXMub3MgPT0gY2Muc3lzLk9TX1dJTkRPV1MgfHwgY2Muc3lzLm9zID09IGNjLnN5cy5PU19MSU5VWClcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmlzTW9iaWxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG5cbiAgICAgICAgaWYgKGlzTW9iaWxlKSB7XG4gICAgICAgICAgICBpZiAoY3VyX3NjYWxlID4gc2NyZWVuX3NjYWxlKSB7ICAgLy8g6YCC5bqU6auY77yM6LCD5pW05a69XG4gICAgICAgICAgICAgICAgd2luZG93LkZJVF9IRUlER0hUID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmdhbWVfY2FudmFzLmZpdEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5nYW1lX2NhbnZhcy5maXRXaWR0aCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5GSVRfU0NBTEUgPSBNYXRoLmNlaWwoY3VyX3NjYWxlIC8gc2NyZWVuX3NjYWxlICogMTAwKSAvIDEwMDtcbiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDpgILlupTlrr3vvIzosIPmlbTpq5hcbiAgICAgICAgICAgICAgICB3aW5kb3cuRklUX1dJRFRIID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmdhbWVfY2FudmFzLmZpdEhlaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2FtZV9jYW52YXMuZml0V2lkdGggPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5GSVRfU0NBTEUgPSBNYXRoLmNlaWwoc2NyZWVuX3NjYWxlIC8gY3VyX3NjYWxlICogMTAwKSAvIDEwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2FtZV9jYW52YXMuZml0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZ2FtZV9jYW52YXMuZml0V2lkdGggPSB0cnVlO1xuICAgICAgICAgICAgd2luZG93LkZJVF9TQ0FMRSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ3JhcGhpY3NfY3AgPSB0aGlzLm5vZGUuYWRkQ29tcG9uZW50KGNjLkdyYXBoaWNzKTtcbiAgICAgICAgZ3JhcGhpY3NfY3AuY2xlYXIoKTtcbiAgICAgICAgZ3JhcGhpY3NfY3AuZmlsbENvbG9yID0gY2MuY29sb3IoMTExLCAxMTEsIDExMSwgMTI4KTtcbiAgICAgICAgZ3JhcGhpY3NfY3AucmVjdCgtMC41ICogdGhpcy5ub2RlLndpZHRoLCAtMC41ICogdGhpcy5ub2RlLmhlaWdodCwgdGhpcy5ub2RlLndpZHRoLCB0aGlzLm5vZGUuaGVpZ2h0KTtcbiAgICAgICAgZ3JhcGhpY3NfY3AuZmlsbCgpO1xuXG4gICAgICAgIHRoaXMuc2NoZWR1bGVPbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUHJlZmFiKFwicHJlZmFiL2xvZ2luL2dhbWVfdmlld3NcIiwgZnVuY3Rpb24gKHZpZXdfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdzID0gdmlld19kYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUuYWRkQ2hpbGQodmlld3MpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnZpZXdzX2pzID0gdmlld3MuZ2V0Q29tcG9uZW50KFwiZ2FtZV92aWV3c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3c19qcyA9IHZpZXdzLmFkZENvbXBvbmVudChcImdhbWVfdmlld3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3NfanMuaW5pdFdhaXRpbmdWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZpZXdUYWdzKHRoaXMudmlld3NfanMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LkZJVF9TQ0FMRSA9PSAxICYmICF3aW5kb3cuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld3NfanMuc2hvd0ZyYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICAvLyB2YXIgdXJsID0gVVJMX0NPTkZJRyArIFwiP3BsYXRmb3JtPVwiICsgUExBVEZPUk0gKyBcIiZjaGFubGVJZD1cIiArIENIQU5ORUwgKyBcIiZ0aW1lPVwiICsgRGF0ZS5ub3coKTsgICAgICAgIFxuICAgICAgICAgICAgLy8gY2MubG9hZGVyLmxvYWQodXJsLCAoZnVuY3Rpb24oZXJyLCBkYXRhKXtcbiAgICAgICAgICAgIC8vICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgLy8gICAgIGNjLmxvZyhcIkRERERERERERERERERERERERERcIik7XG4gICAgICAgICAgICAvLyAgICAgY2MubG9nKGRhdGEpO1xuXG4gICAgICAgICAgICAvLyAgICAgZm9yKHZhciBrIGluIGRhdGEpe1xuICAgICAgICAgICAgLy8gICAgICAgICBMb2cuZGVidWcoaywgZGF0YVtrXSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIHdpbmRvd1trXSA9IGRhdGFba107XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMudXJsX2luaXQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMudmlld19pbml0KVxuICAgICAgICAgICAgLy8gTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkxvZ2luV2luZG93KHtzdGF0dXM6dHJ1ZSwgaW5kZXg6MX0pO1xuICAgICAgICAgICAgLy8gfSkuYmluZCh0aGlzKSk7IFxuXG4gICAgICAgICAgICB0aGlzLmluaXRQcmVsb2FkUmVzKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMC4xKTtcblxuICAgICAgICBpZiAod2luZG93LkltcG9ydENvbmZpZ3MpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHdpbmRvdy5JbXBvcnRDb25maWdzKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRWaWV3VGFnczogZnVuY3Rpb24gKHZpZXdzKSB7XG4gICAgICAgIC8vIOWCqOWtmOWQhOS4quWxgue6p+iKgueCuVxuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNjZW5lTm9kZShTQ0VORV9UQUcuc2NlbmUsIHZpZXdzLnNjZW5lX3RhZyk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkU2NlbmVOb2RlKFNDRU5FX1RBRy5iYXR0bGUsIHZpZXdzLmJhdHRsZV90YWcpO1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNjZW5lTm9kZShTQ0VORV9UQUcuZWZmZWN0LCB2aWV3cy5lZmZlY3RfdGFnKTtcbiAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRTY2VuZU5vZGUoU0NFTkVfVEFHLnVpLCB2aWV3cy51aV90YWcpO1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNjZW5lTm9kZShTQ0VORV9UQUcud2luLCB2aWV3cy53aW5fdGFnKTtcbiAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRTY2VuZU5vZGUoU0NFTkVfVEFHLnRvcCwgdmlld3MudG9wX3RhZyk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkU2NlbmVOb2RlKFNDRU5FX1RBRy5kaWFsb2d1ZSwgdmlld3MuZGlhbG9ndWVfdGFnKTtcbiAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRTY2VuZU5vZGUoU0NFTkVfVEFHLm1zZywgdmlld3MubXNnX3RhZyk7XG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkU2NlbmVOb2RlKFNDRU5FX1RBRy5yZWNvbm5lY3QsIHZpZXdzLnJlY29ubmVjdF90YWcpO1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNjZW5lTm9kZShTQ0VORV9UQUcubG9hZGluZywgdmlld3MubG9hZGluZ190YWcpO1xuXG4gICAgICAgIHRoaXMudmlld19pbml0ID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAodGhpcy51cmxfaW5pdClcbiAgICAgICAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkxvZ2luV2luZG93KHsgc3RhdHVzOiB0cnVlLCBpbmRleDogMSB9KTtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZ3M6IGZ1bmN0aW9uIChmaW5pc2hfY2IpIHtcbiAgICAgICAgLy8g5Yqg6L296YWN572u6KGoXG4gICAgICAgIC8vIHZhciBjb25maWdfemlwX3VybCA9IERBVEFfVVJMICsgXCJkYXRhLnppcFwiICsgXCI/XCIgKyBEQVRBX1ZFUjtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXRDb25maWdzKGZ1bmN0aW9uIChwcm9ncmVzcykge1xuICAgICAgICAgICAgaWYgKHByb2dyZXNzID4gMSlcbiAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IDE7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvZ3Jlc3MgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZUxvYWRpbmcocHJvZ3Jlc3MgKiAwLjUpO1xuICAgICAgICAgICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVNlY29uTG9hZGluZyhwcm9ncmVzcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0Q29uZmlnU2NyaXB0KCk7XG4gICAgICAgICAgICAgICAgdmFyIE1vZHVsZUluZm8gPSByZXF1aXJlKFwibW9kdWxlbGlzdFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIE1vZHVsZUluZm8ubW9kdWxlX2xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSByZXF1aXJlKE1vZHVsZUluZm8ubW9kdWxlX2xpc3Rba10pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy5nZXRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaW5pc2hfY2IpXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaF9jYigpO1xuXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8vIOWNj+iuruivt+axguabtOaWsFxuICAgIHVwZGF0ZVByb3RvUHJvZ3Jlc3M6IGZ1bmN0aW9uIChwcm9nZ3Jlc3MpIHtcbiAgICAgICAgdmFyIGN1cl9wcm9ncmVzcyA9IDAuNSArIHByb2dncmVzcyAqIDAuNDtcbiAgICAgICAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkudXBkYXRlTG9hZGluZyhjdXJfcHJvZ3Jlc3MpO1xuICAgICAgICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGVTZWNvbkxvYWRpbmcocHJvZ2dyZXNzKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlOiBmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgZ2NvcmUuU21hcnRTb2NrZXQuaGFuZGxlTXNnKCk7XG4gICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkudXBkYXRlKGR0KTtcbiAgICB9LFxuXG4gICAgaW5pdE1zZ1ZpZXc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52aWV3c19qcy5pbml0TXNnVmlldygpO1xuICAgIH0sXG5cbiAgICBhZGRHdWlkZVJlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMucHVzaChcInByZWZhYi9kcmFtYS9ndWlkZV9tYWluX3ZpZXcucHJlZmFiXCIpO1xuICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMucHVzaChcInByZWZhYi9kcmFtYS9kcmFtYXRhbGtfdmlldy5wcmVmYWJcIik7XG4gICAgfSxcblxuICAgIGFkZENoYXB0ZXJSZXM6IGZ1bmN0aW9uKGNoYXB0ZXJfaWQpIHtcbiAgICAgICAgaWYgKCFjaGFwdGVyX2lkKVxuICAgICAgICAgICAgY2hhcHRlcl9pZCA9IDE7XG4gICAgICAgIHZhciBkcmFtYV9jb25maWcgPSBDb25maWcuZHVuZ2Vvbl9kYXRhLmRhdGFfZHJhbWFfd29ybGRfaW5mb1tcIjFcIl1bY2hhcHRlcl9pZF07XG4gICAgICAgIHZhciBiYXR0bGVfcmVzX2lkID0gZHJhbWFfY29uZmlnLm1hcF9pZDtcbiAgICAgICAgdmFyIGRyYW1hX3BhdGhzID0gUGF0aFRvb2wuZ2V0QmF0dGxlRHJhbWVCZyhiYXR0bGVfcmVzX2lkKTsgICAgICAgIFxuICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMucHVzaChkcmFtYV9wYXRocy5zKTtcbiAgICAgICAgdGhpcy5fcHJlX2xvYWRfcmVzLnB1c2goZHJhbWFfcGF0aHMuZik7XG4gICAgfSxcblxuICAgIGFkZFJlbmFtZVJlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMucHVzaChcInByZWZhYi9yb2xlaW5mby9yb2xlX3NldG5hbWVfdmlldy5wcmVmYWJcIik7XG4gICAgICAgIHZhciBza2V0b25fcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMjM3KSwgXCJhY3Rpb25cIilcbiAgICAgICAgdGhpcy5fcHJlX2xvYWRfcmVzLnB1c2goc2tldG9uX3BhdGgpO1xuICAgIH0sXG5cbiAgICBpbml0UHJlbG9hZFJlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMgPSBbXG4gICAgICAgICAgICBcInNwaW5lL0U1MDA2OS9hY3Rpb24uYXRsYXNcIlxuICAgICAgICBdXG5cbiAgICAgICAgZm9yICh2YXIgYXRsYXNfaSBpbiBjYWNoZUF0bGFzKSB7XG4gICAgICAgICAgICB2YXIgYXRsYXNfcGF0aCA9IGNhY2hlQXRsYXNbYXRsYXNfaV07XG4gICAgICAgICAgICB0aGlzLl9wcmVfbG9hZF9yZXMucHVzaChhdGxhc19wYXRoICsgXCIucGxpc3RcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBwcmVmYWJfaSBpbiBjYWNoZVByZWZhYnMpIHtcbiAgICAgICAgICAgIHZhciBwcmVmYWJfcGF0aCA9IFwicHJlZmFiL1wiICsgY2FjaGVQcmVmYWJzW3ByZWZhYl9pXSArIFwiLnByZWZhYlwiO1xuICAgICAgICAgICAgdGhpcy5fcHJlX2xvYWRfcmVzLnB1c2gocHJlZmFiX3BhdGgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHByZWxvYWRSZXM6IGZ1bmN0aW9uIChmaW5pc2hfY2IpIHtcbiAgICAgICAgdmFyIGN1cl9udW0gPSAwO1xuICAgICAgICB0aGlzLnByZWxvYWRfbG9hZGluZyA9IHRydWU7XG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0Q29uZmlnU2NyaXB0KCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciByZXNfaSBpbiB0aGlzLl9wcmVfbG9hZF9yZXMpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdGluZ190aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAocmVzX3BhdGgpIHtcbiAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhyZXNfcGF0aCwgZnVuY3Rpb24gKHJlc19pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9udW0rKztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gY3VyX251bSAvIHRoaXMuX3ByZV9sb2FkX3Jlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJfcHJvZ3Jlc3MgPSAwLjUgKyBwcm9ncmVzcyAqIDAuNDtcbiAgICAgICAgICAgICAgICAgICAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkudXBkYXRlTG9hZGluZyhjdXJfcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGVTZWNvbkxvYWRpbmcocHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJfbnVtID09IHRoaXMuX3ByZV9sb2FkX3Jlcy5sZW5ndGggJiYgZmluaXNoX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXIgTW9kdWxlSW5mbyA9IHJlcXVpcmUoXCJtb2R1bGVsaXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yICh2YXIgayBpbiBNb2R1bGVJbmZvLm1vZHVsZV9saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdmFyIGMgPSByZXF1aXJlKE1vZHVsZUluZm8ubW9kdWxlX2xpc3Rba10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChjLmdldEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGMuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlbG9hZF9sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaF9jYigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9VVF9ORVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgR21DbWQgPSByZXF1aXJlKFwiZ21jbWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR21DbWQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgcmVzX2kpKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCB0aGlzLl9wcmVfbG9hZF9yZXNbcmVzX2ldKSwgMTAwLCB0aGlzLl9wcmVfbG9hZF9yZXMubGVuZ3RoKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZUxvYWRpbmdTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5maW5pc2hfbG9hZGluZyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgdXBkYXRlV2FpdGluZ1N0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy52aWV3c19qcylcbiAgICAgICAgICAgIHRoaXMudmlld3NfanMudXBkYXRlV2FpdGluZ1N0YXR1cyhzdGF0dXMpO1xuICAgIH0sXG5cbiAgICByZWxvZ2luOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVPbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9TREtcIil7XG4gICAgICAgICAgICAgICAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkxvZ2luV2luZG93KHsgc3RhdHVzOiB0cnVlLCBpbmRleDogMSB9KTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMilcbiAgICB9LFxuXG4gICAgLy8g6LCD5pW05bin546HXG4gICAgYWRqdXN0RnJhbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19BTkRST0lEKSB7XG4gICAgICAgICAgICBpZiAoY2Muc3lzLm9zVmVyc2lvbiA8IDgpIHtcbiAgICAgICAgICAgICAgICBjYy5nYW1lLnNldEZyYW1lUmF0ZSg0MCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNjLmdhbWUuc2V0RnJhbWVSYXRlKDYwKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcbiAgICAgICAgICAgIGNjLmdhbWUuc2V0RnJhbWVSYXRlKDQwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNjLmdhbWUuc2V0RnJhbWVSYXRlKDYwKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbn0pO1xuIl19