(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/mainscene/view/mainscene.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, '693f99CVQFBN5FORw91LWR9', 'mainscene'); // Scripts/mod/mainscene/view/mainscene.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 主城 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var LoaderManager = require("loadermanager"); var SceneCtrl = require("mainscene_controller"); var SceneEvent = require("mainscene_event"); var SceneConst = require("scene_const"); var BuildItem = require("build_item"); var GuideController = require("guide_controller"); var MainScene = cc.Class({ "extends": BaseClass, properties: { build_list: null, effect_render_list: [], config: null, cur_time_type: 1, // 当前时间类型 map_type: null, last_map_res: [], // 存储地图的资源路径 scene_effect: [], get_build_cb: { "default": {} }, build_items: { "default": {} } }, ctor: function ctor() { this.config = arguments[0]; this.initConfig(); this.createRootWnd(); this.registerEvent(); this.createScene(); }, // 初始化一些配置数据 initConfig: function initConfig() { this.size = cc.size(1440, 1280); // 地图尺寸 this.layer_num = 4; // 当前地图层数 this.map_layer = []; // 地图层级 this.speed_list = [0.2, 0, -0.15, 0]; // 各层地图相对一定的速度 this.init_x = 0; this.init_y = 0; this.map_cache = []; // 带创建的地图列表 this.layer_img_list = ["1.png", "2.png", "3.png", "4.jpg"]; this.last_point = null; }, setTimeType: function setTimeType(timevalue) { var cur_type; if (timevalue >= 6 && timevalue < 18) { cur_type = 1; } else { cur_type = 2; } if (this.cur_time_type !== cur_type) { this.cur_time_type = cur_type; if (this.root.active) this.changeSceneMap(); } }, getTiemType: function getTiemType() { var myDate = new Date(); var curTime = myDate.getHours(); var cur_time_type = 2; if (curTime >= 6 && curTime <= 18) { cur_time_type = 1; } return cur_time_type; }, // 创建主城相关节点 createRootWnd: function createRootWnd() { this.root = new cc.Node("base_root"); this.root.setAnchorPoint(0, 0); var scene_scale = this.scene_scale = 1; var width_scale = this.width_scale = 1; if (window.FIT_HEIDGHT) { width_scale = FIT_SCALE; } if (window.FIT_WIDTH) { scene_scale = FIT_SCALE; } this.root.setContentSize(SCREEN_WIDTH * width_scale, SCREEN_HEIGHT); this.root.setPosition(-SCREEN_WIDTH * 0.5 * width_scale, -SCREEN_HEIGHT * 0.5 * scene_scale); this.root.addComponent(cc.Mask); // 设置剪辑区域 ViewManager.getInstance().addToSceneNode(this.root, SCENE_TAG.scene); this.root.scale = scene_scale; this.rootShowY = this.root.y; this.rootHideY = -this.root.height * 2; // 主的操作节点 this.root_wnd = new cc.Node("handle_root"); this.root_wnd.setAnchorPoint(0, 0); this.root_wnd.setContentSize(this.size); this.root_wnd.parent = this.root; // 地图层级 for (var index = 0; index < this.layer_num; index++) { var map_layer = new cc.Node("map_layer" + index); map_layer.setAnchorPoint(0, 0); map_layer.setContentSize(this.size); this.root_wnd.addChild(map_layer, 10 - index); this.map_layer[index] = { node: map_layer, index: index, sprite: null, frame: null, res: null }; } // 初始化坐标 this.init_x = (SCREEN_WIDTH - this.size.width) * 0.5; this.init_y = (SCREEN_HEIGHT - this.size.height) * 0.5; this.updateMainScene(this.init_x, this.init_y); this.playBackgroundMusic(); }, // 注册监听事件,这里包含场景的 registerEvent: function registerEvent() { var self = this; this.root.on(cc.Node.EventType.TOUCH_START, function (event) { self.last_point = null; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = self.map_layer[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var iterator = _step.value; if (iterator.node) { iterator.node.stopAllActions(); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator["return"] != null) { _iterator["return"](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } self.root_wnd.stopAllActions(); }, this); this.root.on(cc.Node.EventType.TOUCH_MOVE, function (event) { var touches = event.getTouches(); self.last_point = touches[0].getDelta(); self.moveMainScene(self.last_point.x); }, this); this.root.on(cc.Node.EventType.TOUCH_END, function (event) { if (self.last_point == null) { return; } var interval_x = self.last_point.x * 3; // var interval_x = (self.last_point.x/Math.abs(self.last_point.x)) * 30; var temp_x = self.root_wnd.getPosition().x + interval_x; var target_x = self.scaleCheckPoint(temp_x); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = self.map_layer[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var iterator = _step2.value; if (iterator.node) { var speed = self.speed_list[iterator.index]; var move_to = cc.moveTo(2, (target_x - self.init_x) * speed, 0).easing(cc.easeBackOut()); iterator.node.runAction(move_to); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { _iterator2["return"](); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var root_move_to = cc.moveTo(2, target_x, self.init_y); self.root_wnd.runAction(root_move_to.easing(cc.easeBackOut())); }, this); }, // 设置主城是否可见 setVisible: function setVisible(status) { if (!status) { // this.rootY = this.root.y; this.root.y = this.rootHideY; // this.root.active = status; } else { var cur_time_type = this.getTiemType(); if (cur_time_type !== this.cur_time_type) { this.changeSceneMap(); } this.root.y = this.rootShowY; } }, // 移动主城位置 updateMainScene: function updateMainScene(x, y) { y = y ? y : this.init_y; for (var index = 0; index < this.map_layer.length; index++) { var element = this.map_layer[index]; var speed = this.speed_list[index]; element.node.setPosition((x - this.init_x) * speed, y - this.init_y); } this.root_wnd.setPosition(x, y); }, // 创建具体显示数据,包括背景,马赛克等 createScene: function createScene() { this.cur_time_type = this.getTiemType(); // this.changeSceneMap(); this.renderSmallPic(); gcore.Timer.set(function () { this.changeSceneMap(); }.bind(this), 2000, 1); var build_list = SceneCtrl.getInstance().getBuildList(); if (Utils.isEmpty(build_list) && !this.wait_create_build_event) { this.create_build_vo = gcore.GlobalEvent.bind(SceneEvent.CreateBuildVoOver, function () { this.wait_create_build_event = null; gcore.GlobalEvent.unbind(this.create_build_vo); this.beforeCreateBuild(); }.bind(this)); } else { this.beforeCreateBuild(); } // this.quequeCreateEffect(); // 开始预加载资源 DownloadManager.getInstance().checkAnimaCache(); }, // 延迟创建地图 mainLoop: function mainLoop() { if (this.map_cache && this.map_cache.length > 0) { var map_info = this.map_cache.shift(); if (map_info.res) { LoaderManager.getInstance().loadRes(map_info.res, function (limit_num, res_object) { var map_layer = this.map_layer[map_info.layer]; if (map_layer && map_layer.node) { if (map_layer.sprite == null) { map_layer.sprite = new cc.Node(); map_layer.sprite.setPosition(map_info.pos); map_layer.sprite.setAnchorPoint(map_info.ap); if (map_info.layer == 3) { //最后一层的时候需要放大4倍 if (this.cur_time_type == 1) { map_layer.sprite.setScale(4); } else { map_layer.sprite.setScale(1); } } map_layer.node.addChild(map_layer.sprite, -1); map_layer.frame = map_layer.sprite.addComponent(cc.Sprite); } map_layer.frame.spriteFrame = res_object; if (map_layer.res) { LoaderManager.getInstance().releaseRes(map_layer.res); } map_layer.res = map_info.res; // 储存资源,到时候切换时间的时候要释放掉的 } if (limit_num == 0) { if (this.small_sprite) { this.small_sprite.destroy(); this.small_sprite = null; LoaderManager.getInstance().deleteRes("res/centerscene/preview/centercity_1"); } } }.bind(this, this.map_cache.length)); } } if (this.effect_render_list.length > 0) this.quequeCreateEffect(); if (this.effect_render_list == 0 && this.map_cache.length == 0) { gcore.Timer.del(this.timer); this.timer = null; } }, // 创建马赛克地图 renderSmallPic: function renderSmallPic() { var small_path = "res/centerscene/preview/centercity_" + this.cur_time_type + ".jpg"; if (small_path && this.small_path) return; LoaderManager.getInstance().loadRes(small_path, function (res_object) { this.small_sprite = new cc.Node(); this.small_sprite.setPosition(0, 0); this.small_sprite.setAnchorPoint(0, 0); this.root_wnd.addChild(this.small_sprite, 1); var sprite = this.small_sprite.addComponent(cc.Sprite); sprite.spriteFrame = res_object; var size = this.small_sprite.getContentSize(); this.small_sprite.setScale(this.size.width / size.width, this.size.height / size.height); }.bind(this)); this.small_path = small_path; }, // 设置待创建资源 renderMapPic: function renderMapPic() { var map_res = "res/centerscene/centercity/" + this.map_type; for (var index = 0; index < this.layer_img_list.length; index++) { var pos = cc.v2(0, 0); var ap = cc.v2(0, 0); var element = this.layer_img_list[index]; // var res_path = map_res + "/" + (index + 1) + "/" + element; var res_path = map_res + "/" + element; if (index == 0) { pos.x = -80; } else if (index == 1) {} else if (index == 2) { pos.x = 59; pos.y = 472; } else { pos.y = this.size.height; ap.y = 1; } this.map_cache.push({ res: res_path, layer: index, pos: pos, ap: ap }); } }, // 地图移动 moveMainScene: function moveMainScene(x) { if (GuideController.getInstance().isInGuide()) return; x = this.root_wnd.getPosition().x + x; var _x = this.scaleCheckPoint(x); this.updateMainScene(_x); }, moveToBuild: function moveToBuild(id) { if (this.build_items[id]) { var build_nd = this.build_items[id].root_wnd; var build_word_pos = build_nd.convertToWorldSpaceAR(cc.v2(0, 0)); var final_pso = this.root_wnd.convertToNodeSpaceAR(build_word_pos); // var _x = this.scaleCheckPoint(-(final_pso.x - cc.winSize.width * 0.5)); var _x = this.scaleCheckPoint(-(final_pso.x - SCREEN_WIDTH * 0.5)); this.updateMainScene(_x); } }, // 判断点是否越界 scaleCheckPoint: function scaleCheckPoint(x) { var _x = x; if (x > 0) { _x = 0; } else if (x < this.root.width - this.size.width) { _x = this.root.width - this.size.width; } return _x; }, beforeCreateBuild: function beforeCreateBuild() { var build_list = SceneCtrl.getInstance().getBuildList(); var listNum = Object.keys(build_list).length; var scheIndex = 0; var createItemSche = gcore.Timer.set(function () { var buildKey = Object.keys(build_list)[scheIndex]; var buildInfo = build_list[buildKey]; this.createBuildItem(buildInfo); if (scheIndex == listNum - 1) { gcore.Timer.del(createItemSche); } scheIndex++; }.bind(this), 100, listNum); // var battle_drama_model = require("battle_drama_controller").getInstance().getModel(); // battle_drama_model.preloadDramaScene(); }, createBuildItem: function createBuildItem(buildInfo) { var build_item = new BuildItem(buildInfo, SceneConst.BuildItemType.build); var layerIndex = buildInfo.config.layer; this.map_layer[layerIndex - 1].node.addChild(build_item.root_wnd, 999); // 判断节点 this.build_items[buildInfo.config.bid] = build_item; if (this.get_build_cb[buildInfo.config.bid]) { var calbacks = this.get_build_cb[buildInfo.config.bid]; for (var cb_i in calbacks) { calbacks[cb_i](build_item); } } }, changeSceneMap: function changeSceneMap() { if (!this.map_type || this.map_type !== this.cur_time_type) { this.map_type = this.cur_time_type; this.renderSmallPic(); this.renderMapPic(); this.changeSceneEffect(); // 开始创建地图 if (!this.timer) { this.timer = gcore.Timer.set(function () { this.mainLoop(); }.bind(this), 400, -1); } } }, // 改变当前场景的一些特效 changeSceneEffect: function changeSceneEffect() { if (this.effect_render_list.length > 0) { this.effect_render_list.length = []; } for (var effectIndex in this.scene_effect) { this.scene_effect[effectIndex].deleteMe(); // var effectIten = this.scene_effect.shift(); // effectIten.deleteMe(); } this.analysisEffect(); }, // 解析特效数据 analysisEffect: function analysisEffect() { this.effect_render_list = []; if (this.config && this.config.building_list) { for (var buildIndex in this.config.building_list) { var buildItem = this.config.building_list[buildIndex]; if (buildItem.dun_id == 0 || this.cur_time_type == buildItem.dun_id) { if (buildItem.type !== SceneConst.BuildItemType.build) { if (buildItem && buildItem.res) { if (buildItem.res == "E54539" || buildItem.res == "E54540") { continue; } } this.effect_render_list.push(buildItem); } } } } }, // 创建场景特效 quequeCreateEffect: function quequeCreateEffect() { // for (var effectIndx = 0; effectIndx < this.effect_render_list.length; effectIndx ++) { var effectConf = this.effect_render_list.shift(); var buildItem = new BuildItem(effectConf, effectConf.type); this.map_layer[effectConf.layer - 1].node.addChild(buildItem.root_wnd); this.scene_effect.push(buildItem); // } }, playBackgroundMusic: function playBackgroundMusic() { Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true); }, getBuildById: function getBuildById(id, finish_cb) { if (this.build_items[id]) { finish_cb(this.build_items[id]); } else { if (!this.get_build_cb[id]) this.get_build_cb[id] = []; this.get_build_cb[id].push(finish_cb); } cc.log(this.get_build_cb); } }); module.exports = MainScene; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWluc2NlbmVcXHZpZXdcXG1haW5zY2VuZS5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlNjZW5lQ3RybCIsIlNjZW5lRXZlbnQiLCJTY2VuZUNvbnN0IiwiQnVpbGRJdGVtIiwiR3VpZGVDb250cm9sbGVyIiwiTWFpblNjZW5lIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsInByb3BlcnRpZXMiLCJidWlsZF9saXN0IiwiZWZmZWN0X3JlbmRlcl9saXN0IiwiY29uZmlnIiwiY3VyX3RpbWVfdHlwZSIsIm1hcF90eXBlIiwibGFzdF9tYXBfcmVzIiwic2NlbmVfZWZmZWN0IiwiZ2V0X2J1aWxkX2NiIiwiYnVpbGRfaXRlbXMiLCJjdG9yIiwiYXJndW1lbnRzIiwiaW5pdENvbmZpZyIsImNyZWF0ZVJvb3RXbmQiLCJyZWdpc3RlckV2ZW50IiwiY3JlYXRlU2NlbmUiLCJzaXplIiwibGF5ZXJfbnVtIiwibWFwX2xheWVyIiwic3BlZWRfbGlzdCIsImluaXRfeCIsImluaXRfeSIsIm1hcF9jYWNoZSIsImxheWVyX2ltZ19saXN0IiwibGFzdF9wb2ludCIsInNldFRpbWVUeXBlIiwidGltZXZhbHVlIiwiY3VyX3R5cGUiLCJyb290IiwiYWN0aXZlIiwiY2hhbmdlU2NlbmVNYXAiLCJnZXRUaWVtVHlwZSIsIm15RGF0ZSIsIkRhdGUiLCJjdXJUaW1lIiwiZ2V0SG91cnMiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJzY2VuZV9zY2FsZSIsIndpZHRoX3NjYWxlIiwid2luZG93IiwiRklUX0hFSURHSFQiLCJGSVRfU0NBTEUiLCJGSVRfV0lEVEgiLCJzZXRDb250ZW50U2l6ZSIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJzZXRQb3NpdGlvbiIsImFkZENvbXBvbmVudCIsIk1hc2siLCJWaWV3TWFuYWdlciIsImdldEluc3RhbmNlIiwiYWRkVG9TY2VuZU5vZGUiLCJTQ0VORV9UQUciLCJzY2VuZSIsInNjYWxlIiwicm9vdFNob3dZIiwieSIsInJvb3RIaWRlWSIsImhlaWdodCIsInJvb3Rfd25kIiwicGFyZW50IiwiaW5kZXgiLCJhZGRDaGlsZCIsIm5vZGUiLCJzcHJpdGUiLCJmcmFtZSIsInJlcyIsIndpZHRoIiwidXBkYXRlTWFpblNjZW5lIiwicGxheUJhY2tncm91bmRNdXNpYyIsInNlbGYiLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX1NUQVJUIiwiZXZlbnQiLCJpdGVyYXRvciIsInN0b3BBbGxBY3Rpb25zIiwiVE9VQ0hfTU9WRSIsInRvdWNoZXMiLCJnZXRUb3VjaGVzIiwiZ2V0RGVsdGEiLCJtb3ZlTWFpblNjZW5lIiwieCIsIlRPVUNIX0VORCIsImludGVydmFsX3giLCJ0ZW1wX3giLCJnZXRQb3NpdGlvbiIsInRhcmdldF94Iiwic2NhbGVDaGVja1BvaW50Iiwic3BlZWQiLCJtb3ZlX3RvIiwibW92ZVRvIiwiZWFzaW5nIiwiZWFzZUJhY2tPdXQiLCJydW5BY3Rpb24iLCJyb290X21vdmVfdG8iLCJzZXRWaXNpYmxlIiwic3RhdHVzIiwibGVuZ3RoIiwiZWxlbWVudCIsInJlbmRlclNtYWxsUGljIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImJpbmQiLCJnZXRCdWlsZExpc3QiLCJVdGlscyIsImlzRW1wdHkiLCJ3YWl0X2NyZWF0ZV9idWlsZF9ldmVudCIsImNyZWF0ZV9idWlsZF92byIsIkdsb2JhbEV2ZW50IiwiQ3JlYXRlQnVpbGRWb092ZXIiLCJ1bmJpbmQiLCJiZWZvcmVDcmVhdGVCdWlsZCIsIkRvd25sb2FkTWFuYWdlciIsImNoZWNrQW5pbWFDYWNoZSIsIm1haW5Mb29wIiwibWFwX2luZm8iLCJzaGlmdCIsImxvYWRSZXMiLCJsaW1pdF9udW0iLCJyZXNfb2JqZWN0IiwibGF5ZXIiLCJwb3MiLCJhcCIsInNldFNjYWxlIiwiU3ByaXRlIiwic3ByaXRlRnJhbWUiLCJyZWxlYXNlUmVzIiwic21hbGxfc3ByaXRlIiwiZGVzdHJveSIsImRlbGV0ZVJlcyIsInF1ZXF1ZUNyZWF0ZUVmZmVjdCIsImRlbCIsInRpbWVyIiwic21hbGxfcGF0aCIsImdldENvbnRlbnRTaXplIiwicmVuZGVyTWFwUGljIiwibWFwX3JlcyIsInYyIiwicmVzX3BhdGgiLCJwdXNoIiwiaXNJbkd1aWRlIiwiX3giLCJtb3ZlVG9CdWlsZCIsImlkIiwiYnVpbGRfbmQiLCJidWlsZF93b3JkX3BvcyIsImNvbnZlcnRUb1dvcmxkU3BhY2VBUiIsImZpbmFsX3BzbyIsImNvbnZlcnRUb05vZGVTcGFjZUFSIiwibGlzdE51bSIsIk9iamVjdCIsImtleXMiLCJzY2hlSW5kZXgiLCJjcmVhdGVJdGVtU2NoZSIsImJ1aWxkS2V5IiwiYnVpbGRJbmZvIiwiY3JlYXRlQnVpbGRJdGVtIiwiYnVpbGRfaXRlbSIsIkJ1aWxkSXRlbVR5cGUiLCJidWlsZCIsImxheWVySW5kZXgiLCJiaWQiLCJjYWxiYWNrcyIsImNiX2kiLCJjaGFuZ2VTY2VuZUVmZmVjdCIsImVmZmVjdEluZGV4IiwiZGVsZXRlTWUiLCJhbmFseXNpc0VmZmVjdCIsImJ1aWxkaW5nX2xpc3QiLCJidWlsZEluZGV4IiwiYnVpbGRJdGVtIiwiZHVuX2lkIiwidHlwZSIsImVmZmVjdENvbmYiLCJwbGF5TXVzaWMiLCJBVURJT19UWVBFIiwiU0NFTkUiLCJnZXRCdWlsZEJ5SWQiLCJmaW5pc2hfY2IiLCJsb2ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLGFBQWEsR0FBR0MsT0FBTyxDQUFDLGVBQUQsQ0FBM0I7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsc0JBQUQsQ0FBdkI7O0FBQ0EsSUFBSUUsVUFBVSxHQUFHRixPQUFPLENBQUMsaUJBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsVUFBVSxHQUFHSCxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxZQUFELENB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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg5Li75Z+OXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBTY2VuZUN0cmwgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG52YXIgU2NlbmVFdmVudCA9IHJlcXVpcmUoXCJtYWluc2NlbmVfZXZlbnRcIik7XG52YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbnZhciBCdWlsZEl0ZW0gPSByZXF1aXJlKFwiYnVpbGRfaXRlbVwiKTtcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIE1haW5TY2VuZSA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGJ1aWxkX2xpc3Q6IG51bGwsXG4gICAgICAgIGVmZmVjdF9yZW5kZXJfbGlzdDogW10sXG4gICAgICAgIGNvbmZpZzogbnVsbCxcbiAgICAgICAgY3VyX3RpbWVfdHlwZTogMSwgICAgICAgICAgIC8vIOW9k+WJjeaXtumXtOexu+Wei1xuICAgICAgICBtYXBfdHlwZTogbnVsbCxcbiAgICAgICAgbGFzdF9tYXBfcmVzOiBbXSwgICAgICAgICAgIC8vIOWtmOWCqOWcsOWbvueahOi1hOa6kOi3r+W+hFxuICAgICAgICBzY2VuZV9lZmZlY3Q6IFtdLFxuICAgICAgICBnZXRfYnVpbGRfY2I6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkX2l0ZW1zOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LCAgICAgICAgXG4gICAgfSxcblxuICAgIGN0b3I6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KClcbiAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnNpemUoMTQ0MCwgMTI4MCk7ICAgICAgICAgICAgLy8g5Zyw5Zu+5bC65a+4XG4gICAgICAgIHRoaXMubGF5ZXJfbnVtID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5Zyw5Zu+5bGC5pWwXG4gICAgICAgIHRoaXMubWFwX2xheWVyID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Zyw5Zu+5bGC57qnXG4gICAgICAgIHRoaXMuc3BlZWRfbGlzdCA9IFswLjIsIDAsIC0wLjE1LCAwXTsgICAvLyDlkITlsYLlnLDlm77nm7jlr7nkuIDlrprnmoTpgJ/luqZcbiAgICAgICAgdGhpcy5pbml0X3ggPSAwO1xuICAgICAgICB0aGlzLmluaXRfeSA9IDA7XG4gICAgICAgIHRoaXMubWFwX2NhY2hlID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5bim5Yib5bu655qE5Zyw5Zu+5YiX6KGoXG4gICAgICAgIHRoaXMubGF5ZXJfaW1nX2xpc3QgPSBbXCIxLnBuZ1wiLCBcIjIucG5nXCIsIFwiMy5wbmdcIiwgXCI0LmpwZ1wiXTtcblxuICAgICAgICB0aGlzLmxhc3RfcG9pbnQgPSBudWxsO1xuICAgIH0sXG5cbiAgICBzZXRUaW1lVHlwZTogZnVuY3Rpb24odGltZXZhbHVlKSB7XG4gICAgICAgIHZhciBjdXJfdHlwZTtcbiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+PSA2ICYmIHRpbWV2YWx1ZSA8IDE4KSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJfdGltZV90eXBlICE9PSBjdXJfdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfdGltZV90eXBlID0gY3VyX3R5cGU7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290LmFjdGl2ZSkgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpZW1UeXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG15RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjdXJUaW1lID0gbXlEYXRlLmdldEhvdXJzKCk7XG4gICAgICAgIHZhciBjdXJfdGltZV90eXBlID0gMjtcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gNiAmJiBjdXJUaW1lIDw9IDE4KSB7XG4gICAgICAgICAgICBjdXJfdGltZV90eXBlID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyX3RpbWVfdHlwZTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65Li75Z+O55u45YWz6IqC54K5XG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5yb290ID0gbmV3IGNjLk5vZGUoXCJiYXNlX3Jvb3RcIik7XG4gICAgICAgIHRoaXMucm9vdC5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgdmFyIHNjZW5lX3NjYWxlID0gdGhpcy5zY2VuZV9zY2FsZSA9IDE7XG4gICAgICAgIHZhciB3aWR0aF9zY2FsZSA9IHRoaXMud2lkdGhfc2NhbGUgPSAxO1xuXG4gICAgICAgIGlmICh3aW5kb3cuRklUX0hFSURHSFQpIHtcbiAgICAgICAgICAgIHdpZHRoX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5GSVRfV0lEVEgpIHtcbiAgICAgICAgICAgIHNjZW5lX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290LnNldENvbnRlbnRTaXplKFNDUkVFTl9XSURUSCAqIHdpZHRoX3NjYWxlLCBTQ1JFRU5fSEVJR0hUKTtcbiAgICAgICAgdGhpcy5yb290LnNldFBvc2l0aW9uKC1TQ1JFRU5fV0lEVEggKiAwLjUgKiB3aWR0aF9zY2FsZSwgLVNDUkVFTl9IRUlHSFQgKiAwLjUgKiBzY2VuZV9zY2FsZSk7XG4gICAgICAgIHRoaXMucm9vdC5hZGRDb21wb25lbnQoY2MuTWFzayk7ICAgIC8vIOiuvue9ruWJqui+keWMuuWfn1xuXG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5yb290LCBTQ0VORV9UQUcuc2NlbmUpO1xuICAgICAgICB0aGlzLnJvb3Quc2NhbGUgPSBzY2VuZV9zY2FsZTtcblxuICAgICAgICB0aGlzLnJvb3RTaG93WSA9IHRoaXMucm9vdC55O1xuICAgICAgICB0aGlzLnJvb3RIaWRlWSA9IC0gdGhpcy5yb290LmhlaWdodCAqIDI7XG5cbiAgICAgICAgLy8g5Li755qE5pON5L2c6IqC54K5XG4gICAgICAgIHRoaXMucm9vdF93bmQgPSBuZXcgY2MuTm9kZShcImhhbmRsZV9yb290XCIpO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldEFuY2hvclBvaW50KDAsIDApO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucm9vdF93bmQucGFyZW50ID0gdGhpcy5yb290O1xuXG4gICAgICAgIC8vIOWcsOWbvuWxgue6p1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5sYXllcl9udW07IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSBuZXcgY2MuTm9kZShcIm1hcF9sYXllclwiK2luZGV4KTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hZGRDaGlsZChtYXBfbGF5ZXIsICgxMC1pbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5tYXBfbGF5ZXJbaW5kZXhdID0ge25vZGU6bWFwX2xheWVyLCBpbmRleDppbmRleCwgc3ByaXRlOm51bGwsIGZyYW1lOm51bGwsIHJlczpudWxsfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWIneWni+WMluWdkOagh1xuICAgICAgICB0aGlzLmluaXRfeCA9IChTQ1JFRU5fV0lEVEggLSB0aGlzLnNpemUud2lkdGgpICogMC41O1xuICAgICAgICB0aGlzLmluaXRfeSA9IChTQ1JFRU5fSEVJR0hUIC0gdGhpcy5zaXplLmhlaWdodCkgKiAwLjU7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKHRoaXMuaW5pdF94LCB0aGlzLmluaXRfeSk7XG5cbiAgICAgICAgdGhpcy5wbGF5QmFja2dyb3VuZE11c2ljKCk7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tizov5nph4zljIXlkKvlnLrmma/nmoRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgdGhpcy5yb290Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHNlbGYubWFwX2xheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5yb290X3duZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmdldFRvdWNoZXMoKTtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IHRvdWNoZXNbMF0uZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHNlbGYubW92ZU1haW5TY2VuZShzZWxmLmxhc3RfcG9pbnQueCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIGlmIChzZWxmLmxhc3RfcG9pbnQgPT0gbnVsbCl7IFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGludGVydmFsX3ggPSBzZWxmLmxhc3RfcG9pbnQueCAqIDM7XG4gICAgICAgICAgICAvLyB2YXIgaW50ZXJ2YWxfeCA9IChzZWxmLmxhc3RfcG9pbnQueC9NYXRoLmFicyhzZWxmLmxhc3RfcG9pbnQueCkpICogMzA7XG4gICAgICAgICAgICB2YXIgdGVtcF94ID0gc2VsZi5yb290X3duZC5nZXRQb3NpdGlvbigpLnggKyBpbnRlcnZhbF94O1xuICAgICAgICAgICAgdmFyIHRhcmdldF94ID0gc2VsZi5zY2FsZUNoZWNrUG9pbnQodGVtcF94KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlcmF0b3Igb2Ygc2VsZi5tYXBfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3Iubm9kZSl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcGVlZCA9IHNlbGYuc3BlZWRfbGlzdFtpdGVyYXRvci5pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDIsICh0YXJnZXRfeCAtIHNlbGYuaW5pdF94KSAqIHNwZWVkLCAwKS5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5vZGUucnVuQWN0aW9uKG1vdmVfdG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByb290X21vdmVfdG8gPSBjYy5tb3ZlVG8oMiwgdGFyZ2V0X3gsIHNlbGYuaW5pdF95KTtcbiAgICAgICAgICAgIHNlbGYucm9vdF93bmQucnVuQWN0aW9uKHJvb3RfbW92ZV90by5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSkpO1xuXG4gICAgICAgIH0sIHRoaXMpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruS4u+WfjuaYr+WQpuWPr+ingVxuICAgIHNldFZpc2libGU6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIHRoaXMucm9vdFkgPSB0aGlzLnJvb3QueTtcbiAgICAgICAgICAgIHRoaXMucm9vdC55ID0gdGhpcy5yb290SGlkZVk7XG4gICAgICAgICAgICAvLyB0aGlzLnJvb3QuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgICAgICBpZiAoY3VyX3RpbWVfdHlwZSAhPT0gdGhpcy5jdXJfdGltZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yb290LnkgPSB0aGlzLnJvb3RTaG93WTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnp7vliqjkuLvln47kvY3nva5cbiAgICB1cGRhdGVNYWluU2NlbmU6ZnVuY3Rpb24oeCwgeSl7XG4gICAgICAgIHkgPSB5ID8geSA6IHRoaXMuaW5pdF95O1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5tYXBfbGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5tYXBfbGF5ZXJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3BlZWQgPSB0aGlzLnNwZWVkX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgZWxlbWVudC5ub2RlLnNldFBvc2l0aW9uKCh4LXRoaXMuaW5pdF94KSAqIHNwZWVkLCB5IC0gdGhpcy5pbml0X3kpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbih4LCB5KTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65YW35L2T5pi+56S65pWw5o2uLOWMheaLrOiDjOaZryzpqazotZvlhYvnrYlcbiAgICBjcmVhdGVTY2VuZTpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgIC8vIHRoaXMuY2hhbmdlU2NlbmVNYXAoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJTbWFsbFBpYygpO1xuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lTWFwKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwMCwgMSlcblxuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICBpZiAoVXRpbHMuaXNFbXB0eShidWlsZF9saXN0KSAmJiAhdGhpcy53YWl0X2NyZWF0ZV9idWlsZF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVfYnVpbGRfdm8gPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFNjZW5lRXZlbnQuQ3JlYXRlQnVpbGRWb092ZXIsIChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdF9jcmVhdGVfYnVpbGRfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmNyZWF0ZV9idWlsZF92byk7XG4gICAgICAgICAgICAgICAgdGhpcy5iZWZvcmVDcmVhdGVCdWlsZCgpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZUNyZWF0ZUJ1aWxkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5xdWVxdWVDcmVhdGVFZmZlY3QoKTtcbiAgICAgICAgLy8g5byA5aeL6aKE5Yqg6L296LWE5rqQXG4gICAgICAgIERvd25sb2FkTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrQW5pbWFDYWNoZSgpXG4gICAgfSxcblxuICAgIC8vIOW7tui/n+WIm+W7uuWcsOWbvlxuICAgIG1haW5Mb29wOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLm1hcF9jYWNoZSAmJiB0aGlzLm1hcF9jYWNoZS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHZhciBtYXBfaW5mbyA9IHRoaXMubWFwX2NhY2hlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAobWFwX2luZm8ucmVzKXtcbiAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhtYXBfaW5mby5yZXMsIGZ1bmN0aW9uKGxpbWl0X251bSwgcmVzX29iamVjdCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSB0aGlzLm1hcF9sYXllclttYXBfaW5mby5sYXllcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXBfbGF5ZXIgJiYgbWFwX2xheWVyLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9sYXllci5zcHJpdGUgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRQb3NpdGlvbihtYXBfaW5mby5wb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRBbmNob3JQb2ludChtYXBfaW5mby5hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9pbmZvLmxheWVyID09IDMpIHsgICAvL+acgOWQjuS4gOWxgueahOaXtuWAmemcgOimgeaUvuWkpzTlgI1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3RpbWVfdHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIuc3ByaXRlLnNldFNjYWxlKDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRTY2FsZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIubm9kZS5hZGRDaGlsZChtYXBfbGF5ZXIuc3ByaXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLmZyYW1lID0gbWFwX2xheWVyLnNwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9sYXllci5mcmFtZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwX2xheWVyLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKG1hcF9sYXllci5yZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnJlcyA9IG1hcF9pbmZvLnJlcyAgICAgICAgLy8g5YKo5a2Y6LWE5rqQLOWIsOaXtuWAmeWIh+aNouaXtumXtOeahOaXtuWAmeimgemHiuaUvuaOieeahFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdF9udW0gPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc21hbGxfc3ByaXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXMoXCJyZXMvY2VudGVyc2NlbmUvcHJldmlldy9jZW50ZXJjaXR5XzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgdGhpcy5tYXBfY2FjaGUubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRoaXMucXVlcXVlQ3JlYXRlRWZmZWN0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0ID09IDAgJiYgdGhpcy5tYXBfY2FjaGUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIm+W7uumprOi1m+WFi+WcsOWbvlxuICAgIHJlbmRlclNtYWxsUGljOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzbWFsbF9wYXRoICA9IFwicmVzL2NlbnRlcnNjZW5lL3ByZXZpZXcvY2VudGVyY2l0eV9cIiArIHRoaXMuY3VyX3RpbWVfdHlwZSArIFwiLmpwZ1wiXG4gICAgICAgIGlmIChzbWFsbF9wYXRoICYmIHRoaXMuc21hbGxfcGF0aCkgXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhzbWFsbF9wYXRoLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUuc2V0UG9zaXRpb24oMCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWRkQ2hpbGQodGhpcy5zbWFsbF9zcHJpdGUsIDEpO1xuXG4gICAgICAgICAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnNtYWxsX3Nwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIHNwcml0ZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc21hbGxfc3ByaXRlLmdldENvbnRlbnRTaXplKCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRTY2FsZSh0aGlzLnNpemUud2lkdGggLyBzaXplLndpZHRoLCB0aGlzLnNpemUuaGVpZ2h0IC8gc2l6ZS5oZWlnaHQpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnNtYWxsX3BhdGggPSBzbWFsbF9wYXRoO1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvoXliJvlu7rotYTmupBcbiAgICByZW5kZXJNYXBQaWM6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBtYXBfcmVzID0gXCJyZXMvY2VudGVyc2NlbmUvY2VudGVyY2l0eS9cIiArIHRoaXMubWFwX3R5cGU7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmxheWVyX2ltZ19saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGNjLnYyKDAsIDApXG4gICAgICAgICAgICB2YXIgYXAgPSBjYy52MigwLCAwKVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubGF5ZXJfaW1nX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgLy8gdmFyIHJlc19wYXRoID0gbWFwX3JlcyArIFwiL1wiICsgKGluZGV4ICsgMSkgKyBcIi9cIiArIGVsZW1lbnQ7XG4gICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBtYXBfcmVzICsgXCIvXCIgICsgZWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICBwb3MueCA9IC04MDtcbiAgICAgICAgICAgIH1lbHNlIGlmIChpbmRleCA9PSAxKXtcblxuICAgICAgICAgICAgfWVsc2UgaWYgKGluZGV4ID09IDIpe1xuICAgICAgICAgICAgICAgIHBvcy54ID0gNTk7XG4gICAgICAgICAgICAgICAgcG9zLnkgPSA0NzI7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwb3MueSA9IHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgYXAueSA9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwX2NhY2hlLnB1c2goe3JlczpyZXNfcGF0aCwgbGF5ZXI6aW5kZXgsIHBvczpwb3MsIGFwOmFwfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Zyw5Zu+56e75YqoXG4gICAgbW92ZU1haW5TY2VuZTogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzSW5HdWlkZSgpKVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgeCA9IHRoaXMucm9vdF93bmQuZ2V0UG9zaXRpb24oKS54ICsgeDtcbiAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoeCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKF94KTtcbiAgICB9LFxuXG4gICAgbW92ZVRvQnVpbGQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkX2l0ZW1zW2lkXSkge1xuICAgICAgICAgICAgdmFyIGJ1aWxkX25kID0gdGhpcy5idWlsZF9pdGVtc1tpZF0ucm9vdF93bmQ7XG4gICAgICAgICAgICB2YXIgYnVpbGRfd29yZF9wb3MgPSBidWlsZF9uZC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3BzbyA9IHRoaXMucm9vdF93bmQuY29udmVydFRvTm9kZVNwYWNlQVIoYnVpbGRfd29yZF9wb3MpO1xuXG4gICAgICAgICAgICAvLyB2YXIgX3ggPSB0aGlzLnNjYWxlQ2hlY2tQb2ludCgtKGZpbmFsX3Bzby54IC0gY2Mud2luU2l6ZS53aWR0aCAqIDAuNSkpO1xuICAgICAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoLShmaW5hbF9wc28ueCAtIFNDUkVFTl9XSURUSCAqIDAuNSkpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy51cGRhdGVNYWluU2NlbmUoX3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIpOaWreeCueaYr+WQpui2iueVjFxuICAgIHNjYWxlQ2hlY2tQb2ludDogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIF94ID0geDtcbiAgICAgICAgaWYgKHggPiAwKSB7XG4gICAgICAgICAgICBfeCA9IDBcbiAgICAgICAgfSBlbHNlIGlmICh4IDwgKHRoaXMucm9vdC53aWR0aCAtIHRoaXMuc2l6ZS53aWR0aCkpIHtcbiAgICAgICAgICAgIF94ID0gdGhpcy5yb290LndpZHRoIC0gdGhpcy5zaXplLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfeDtcbiAgICB9LFxuXG4gICAgYmVmb3JlQ3JlYXRlQnVpbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICB2YXIgbGlzdE51bSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpLmxlbmd0aDtcbiAgICAgICAgdmFyIHNjaGVJbmRleCA9IDA7XG4gICAgICAgIHZhciBjcmVhdGVJdGVtU2NoZSA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBidWlsZEtleSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpW3NjaGVJbmRleF07XG4gICAgICAgICAgICB2YXIgYnVpbGRJbmZvID0gYnVpbGRfbGlzdFtidWlsZEtleV07XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1aWxkSXRlbShidWlsZEluZm8pO1xuICAgICAgICAgICAgaWYgKHNjaGVJbmRleCA9PSBsaXN0TnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChjcmVhdGVJdGVtU2NoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2hlSW5kZXggKys7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIDEwMCwgbGlzdE51bSk7XG5cblxuICAgICAgICAvLyB2YXIgYmF0dGxlX2RyYW1hX21vZGVsID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgLy8gYmF0dGxlX2RyYW1hX21vZGVsLnByZWxvYWREcmFtYVNjZW5lKCk7XG4gICAgfSxcblxuXG4gICAgY3JlYXRlQnVpbGRJdGVtOiBmdW5jdGlvbihidWlsZEluZm8pIHtcbiAgICAgICAgdmFyIGJ1aWxkX2l0ZW0gPSBuZXcgQnVpbGRJdGVtKGJ1aWxkSW5mbywgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKTtcbiAgICAgICAgdmFyIGxheWVySW5kZXggPSBidWlsZEluZm8uY29uZmlnLmxheWVyO1xuICAgICAgICB0aGlzLm1hcF9sYXllcltsYXllckluZGV4IC0gMV0ubm9kZS5hZGRDaGlsZChidWlsZF9pdGVtLnJvb3Rfd25kLCA5OTkpO1xuXG4gICAgICAgIC8vIOWIpOaWreiKgueCuVxuICAgICAgICB0aGlzLmJ1aWxkX2l0ZW1zW2J1aWxkSW5mby5jb25maWcuYmlkXSA9IGJ1aWxkX2l0ZW07XG4gICAgICAgIGlmICh0aGlzLmdldF9idWlsZF9jYltidWlsZEluZm8uY29uZmlnLmJpZF0pIHtcbiAgICAgICAgICAgIHZhciBjYWxiYWNrcyA9IHRoaXMuZ2V0X2J1aWxkX2NiW2J1aWxkSW5mby5jb25maWcuYmlkXTtcbiAgICAgICAgICAgIGZvciAodmFyIGNiX2kgaW4gY2FsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjYWxiYWNrc1tjYl9pXShidWlsZF9pdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VTY2VuZU1hcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXBfdHlwZSB8fCB0aGlzLm1hcF90eXBlICE9PSB0aGlzLmN1cl90aW1lX3R5cGUpIHsgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5tYXBfdHlwZSA9IHRoaXMuY3VyX3RpbWVfdHlwZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU21hbGxQaWMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTWFwUGljKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lRWZmZWN0KCk7XG4gICAgICAgICAgICAvLyDlvIDlp4vliJvlu7rlnLDlm75cbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lcil7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lciA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWluTG9vcCgpO1xuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDQwMCwgLTEpO1xuICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaUueWPmOW9k+WJjeWcuuaZr+eahOS4gOS6m+eJueaViFxuICAgIGNoYW5nZVNjZW5lRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgZWZmZWN0SW5kZXggaW4gdGhpcy5zY2VuZV9lZmZlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0W2VmZmVjdEluZGV4XS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgLy8gdmFyIGVmZmVjdEl0ZW4gPSB0aGlzLnNjZW5lX2VmZmVjdC5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gZWZmZWN0SXRlbi5kZWxldGVNZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmFseXNpc0VmZmVjdCgpXG4gICAgfSxcblxuICAgIC8vIOino+aekOeJueaViOaVsOaNrlxuICAgIGFuYWx5c2lzRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmJ1aWxkaW5nX2xpc3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGJ1aWxkSW5kZXggaW4gdGhpcy5jb25maWcuYnVpbGRpbmdfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBidWlsZEl0ZW0gPSB0aGlzLmNvbmZpZy5idWlsZGluZ19saXN0W2J1aWxkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0uZHVuX2lkID09IDAgfHwgdGhpcy5jdXJfdGltZV90eXBlID09IGJ1aWxkSXRlbS5kdW5faWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkSXRlbS50eXBlICE9PSAgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKSB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0gJiYgYnVpbGRJdGVtLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0ucmVzID09IFwiRTU0NTM5XCIgfHwgYnVpbGRJdGVtLnJlcyA9PSBcIkU1NDU0MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0LnB1c2goYnVpbGRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rlnLrmma/nibnmlYhcbiAgICBxdWVxdWVDcmVhdGVFZmZlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBmb3IgKHZhciBlZmZlY3RJbmR4ID0gMDsgZWZmZWN0SW5keCA8IHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aDsgZWZmZWN0SW5keCArKykge1xuICAgICAgICAgICAgdmFyIGVmZmVjdENvbmYgPSB0aGlzLmVmZmVjdF9yZW5kZXJfbGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgdmFyIGJ1aWxkSXRlbSA9IG5ldyBCdWlsZEl0ZW0oZWZmZWN0Q29uZiwgZWZmZWN0Q29uZi50eXBlKTtcbiAgICAgICAgICAgIHRoaXMubWFwX2xheWVyW2VmZmVjdENvbmYubGF5ZXIgLSAxXS5ub2RlLmFkZENoaWxkKGJ1aWxkSXRlbS5yb290X3duZCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lX2VmZmVjdC5wdXNoKGJ1aWxkSXRlbSk7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgcGxheUJhY2tncm91bmRNdXNpYzogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLlNDRU5FLCBcInNfMDAyXCIsIHRydWUpO1xuICAgIH0sXG5cbiAgICBnZXRCdWlsZEJ5SWQ6IGZ1bmN0aW9uKGlkLCBmaW5pc2hfY2Ipe1xuICAgICAgICBpZiAodGhpcy5idWlsZF9pdGVtc1tpZF0pIHtcbiAgICAgICAgICAgIGZpbmlzaF9jYih0aGlzLmJ1aWxkX2l0ZW1zW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0X2J1aWxkX2NiW2lkXSlcbiAgICAgICAgICAgICAgICB0aGlzLmdldF9idWlsZF9jYltpZF0gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ2V0X2J1aWxkX2NiW2lkXS5wdXNoKGZpbmlzaF9jYik7XG4gICAgICAgIH1cblxuICAgICAgICBjYy5sb2codGhpcy5nZXRfYnVpbGRfY2IpO1xuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYWluU2NlbmU7Il19