(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: // 主场景的入口 //
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