(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/common/soundmanager.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, '03fc8rWMcFCwa4YduIk1BBp', 'soundmanager'); // Scripts/common/soundmanager.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 按钮播放音效的 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var PathTool = require("pathtool"); var LoaderManager = require("loadermanager"); window.AUDIO_TYPE = { COMMON: "common", SCENE: "scene", BATTLE: "battle", DUBBING: "dubbing", Recruit: "recruit", Drama: "drama" }; window.SoundManager = cc.Class({ "extends": cc.Component, properties: { effects: { "default": {} }, _cur_bg_music: { "default": {} }, hero_effects: { "default": {} } }, statics: { instance: null }, ctor: function ctor() { this.registerEvent(); this.initSoundSetting(); }, initSoundSetting: function initSoundSetting() { this.music_status = gcore.SysEnv.get("music_status", "1") == "1"; // 音乐 this.sound_status = gcore.SysEnv.get("sound_status", "1") == "1"; // 音效 this.voice_status = gcore.SysEnv.get("voice_status", "1") == "1"; }, registerEvent: function registerEvent() { gcore.GlobalEvent.bind(EventId.VOICE_SETTING, function (type) { if (type) this.upateSetting(type); }.bind(this)); }, upateSetting: function upateSetting(type) { if (type == "music_status") { var new_status = gcore.SysEnv.get("music_status", "1") == "1"; if (new_status != this.music_status) { this.music_status = new_status; if (new_status) { // if(window.AudioSourceUi){ // window.AudioSourceUi.enabled = true; // } if (this.music_info) this.playMusic(this.music_info.type, this.music_info.name, this.music_info.loop); } else { if (this._cur_bg_music) { // cc.audioEngine.stop(this._cur_bg_music.audio_id); if (this._audio) { this._audio.stop(); } LoaderManager.getInstance().releaseRes(this._cur_bg_music.res_path); this._cur_bg_music = null; // if(window.AudioSourceUi){ // window.AudioSourceUi.enabled = false; // } } } } } else if (type == "sound_status") { var new_status = gcore.SysEnv.get("sound_status", "1") == "1"; if (new_status != this.sound_status) { this.sound_status = new_status; } } else if (type == "voice_status") { var new_status = gcore.SysEnv.get("voice_status", "1") == "1"; } }, // 这里可以处理播放音效 play: function play(event, customEventData) { if (event.type == cc.Node.EventType.TOUCH_END) { customEventData = customEventData || "c_button1"; if (customEventData) this.playEffect(AUDIO_TYPE.COMMON, customEventData); } }, playEffect: function playEffect(res_type, res_id) { // cache不释放 if (!this.sound_status) return; if (this.effects[res_id]) { cc.audioEngine.playEffect(this.effects[res_id], false); return; } var sound_path = PathTool.getSoundRes(res_type, res_id); // 这里有一个问题.第一次不播放 LoaderManager.getInstance().loadRes(sound_path, function (res_id, res_object) { if (res_object) { if (res_object.name == res_id) { this.effects[res_id] = res_object; } cc.audioEngine.playEffect(res_object, false); } }.bind(this, res_id)); }, playEffectOnce: function playEffectOnce(res_type, res_id) { // if (!this.sound_status) return; var sound_path = PathTool.getSoundRes(res_type, res_id); LoaderManager.getInstance().loadRes(sound_path, function (sound_path, res_object) { if (res_object) { var audio_id = cc.audioEngine.playEffect(res_object, false); cc.audioEngine.setFinishCallback(audio_id, this.finishPlayMusic.bind(this, sound_path, audio_id, res_object)); } }.bind(this, sound_path)); }, finishPlayMusic: function finishPlayMusic(sound_path, audio_id, res_object) { cc.audioEngine.stop(audio_id); cc.audioEngine.uncache(res_object); LoaderManager.getInstance().releaseRes(sound_path); }, //英雄语音 playHeroEffectOnce: function playHeroEffectOnce(res_type, res_id) { if (!this.sound_status) return; if (this.hero_effects[res_id]) { var id = cc.audioEngine.playEffect(this.hero_effects[res_id], false); return id; } var sound_path = PathTool.getSoundRes(res_type, res_id); LoaderManager.getInstance().loadRes(sound_path, function (sound_path, res_object) { if (res_object) { if (res_object.name == res_id) { this.hero_effects[res_id] = res_object; } var audio_id = cc.audioEngine.playEffect(res_object, false); this.hero_id = audio_id; cc.audioEngine.setFinishCallback(audio_id, this.finishHeroPlayMusic.bind(this, sound_path, audio_id, res_object)); } }.bind(this, sound_path)); }, removeEffectSound: function removeEffectSound(obj) { obj = obj || this.hero_id; if (obj == null) { cc.audioEngine.stopAll(); } else { cc.audioEngine.stop(obj); } }, finishHeroPlayMusic: function finishHeroPlayMusic(sound_path, audio_id, res_object) { gcore.Timer.set(function () { cc.audioEngine.stop(audio_id); cc.audioEngine.uncache(res_object); LoaderManager.getInstance().releaseRes(sound_path); this.hero_effects[res_object.name] = null; }.bind(this), 10 * 1000, 1); }, // 播放背景乐 // playMusic: function(type, name, loop) { // var sound_path = PathTool.getSoundRes(type, name); // if (!sound_path) return; // if (this._cur_bg_music && this._cur_bg_music.res_path == sound_path) return; // this.music_info = {type: type, name: name, loop: loop} // if (!this.music_status) return; // if (this.is_loading) { // if (this.is_loading == sound_path) { // this.wating = null; // return; // } else { // this.wating = sound_path; // return // } // } // cc.log(sound_path); // this.is_loading = sound_path; // LoaderManager.getInstance().loadRes(sound_path, function (sound_path, loop, res_object) { // this.is_loading = null; // cc.log(sound_path,this.music_info.name, "sound_path") // if (res_object) { // if (this._cur_bg_music) { // // if (this._cur_bg_music.res_path == sound_path) return; // cc.audioEngine.stop(this._cur_bg_music.audio_id); // cc.audioEngine.uncache(this._cur_bg_music.res_obj); // LoaderManager.getInstance().releaseRes(this._cur_bg_music.res_path); // } // // let audio = AudioSourceUi // // audio.clip = res_object // // audio.loop = loop; // // audio.play(); // cc.audioEngine.stopAll(); // var audio_id = cc.audioEngine.playEffect(res_object, loop); // var cur_data = {}; // cur_data.audio_id = audio_id; // cur_data.res_path = sound_path; // cur_data.res_obj = res_object; // this._cur_bg_music = cur_data; // } // if (this.wating) { // this.playMusic(this.music_info.type, this.music_info.name, this.music_info.loop); // this.wating = null; // } // }.bind(this, sound_path, loop)); // }, // 播放背景乐 playMusic: function playMusic(type, name, loop) { var sound_path = PathTool.getSoundRes(type, name); if (this._cur_bg_music && this._cur_bg_music.res_path == sound_path) return; this.music_info = { type: type, name: name, loop: loop }; if (!this.music_status) return; LoaderManager.getInstance().loadRes(sound_path, function (sound_path, loop, res_object) { if (this._cur_bg_music && sound_path == this._cur_bg_music.res_path) return; cc.log(sound_path, this.music_info.name, "sound_path"); if (res_object) { if (this._cur_bg_music && window.AudioSourceUi) { AudioSourceUi.stop(); LoaderManager.getInstance().releaseRes(this._cur_bg_music.res_path); } if (!window.AudioSourceUi) { window.AudioSourceUi = cc.find("Canvas/game_views").addComponent(cc.AudioSource); } var audio = AudioSourceUi; audio.clip = res_object; audio.loop = loop; audio.play(); this._audio = audio; // var audio_id = cc.audioEngine.playEffect(res_object, loop); var cur_data = {}; // cur_data.audio_id = audio; cur_data.res_path = sound_path; cur_data.res_obj = res_object; this._cur_bg_music = cur_data; } }.bind(this, sound_path, loop)); }, getBackgroundVolume: function getBackgroundVolume() { if (this._audio) { return this._audio.volume; } }, setBackgroundVolume: function setBackgroundVolume(value) { if (this._audio) { this._audio.volume = value; } }, start: function start() {} }); SoundManager.getInstance = function () { if (!SoundManager.instance) { SoundManager.instance = new SoundManager(); } return SoundManager.instance; }; module.exports = SoundManager; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxzb3VuZG1hbmFnZXIuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiTG9hZGVyTWFuYWdlciIsIndpbmRvdyIsIkFVRElPX1RZUEUiLCJDT01NT04iLCJTQ0VORSIsIkJBVFRMRSIsIkRVQkJJTkciLCJSZWNydWl0IiwiRHJhbWEiLCJTb3VuZE1hbmFnZXIiLCJjYyIsIkNsYXNzIiwiQ29tcG9uZW50IiwicHJvcGVydGllcyIsImVmZmVjdHMiLCJfY3VyX2JnX211c2ljIiwiaGVyb19lZmZlY3RzIiwic3RhdGljcyIsImluc3RhbmNlIiwiY3RvciIsInJlZ2lzdGVyRXZlbnQiLCJpbml0U291bmRTZXR0aW5nIiwibXVzaWNfc3RhdHVzIiwiZ2NvcmUiLCJTeXNFbnYiLCJnZXQiLCJzb3VuZF9zdGF0dXMiLCJ2b2ljZV9zdGF0dXMiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiVk9JQ0VfU0VUVElORyIsInR5cGUiLCJ1cGF0ZVNldHRpbmciLCJuZXdfc3RhdHVzIiwibXVzaWNfaW5mbyIsInBsYXlNdXNpYyIsIm5hbWUiLCJsb29wIiwiX2F1ZGlvIiwic3RvcCIsImdldEluc3RhbmNlIiwicmVsZWFzZVJlcyIsInJlc19wYXRoIiwicGxheSIsImV2ZW50IiwiY3VzdG9tRXZlbnREYXRhIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInBsYXlFZmZlY3QiLCJyZXNfdHlwZSIsInJlc19pZCIsImF1ZGlvRW5naW5lIiwic291bmRfcGF0aCIsImdldFNvdW5kUmVzIiwibG9hZFJlcyIsInJlc19vYmplY3QiLCJwbGF5RWZmZWN0T25jZSIsImF1ZGlvX2lkIiwic2V0RmluaXNoQ2FsbGJhY2siLCJmaW5pc2hQbGF5TXVzaWMiLCJ1bmNhY2hlIiwicGxheUhlcm9FZmZlY3RPbmNlIiwiaWQiLCJoZXJvX2lkIiwiZmluaXNoSGVyb1BsYXlNdXNpYyIsInJlbW92ZUVmZmVjdFNvdW5kIiwib2JqIiwic3RvcEFsbCIsIlRpbWVyIiwic2V0IiwibG9nIiwiQXVkaW9Tb3VyY2VVaSIsImZpbmQiLCJhZGRDb21wb25lbnQiLCJBdWRpb1NvdXJjZSIsImF1ZGlvIiwiY2xpcCIsImN1cl9kYXRhIiwicmVzX29iaiIsImdldEJhY2tncm91bmRWb2x1bWUiLCJ2b2x1bWUiLCJzZXRCYWNrZ3JvdW5kVm9sdW1lIiwidmFsdWUiLCJzdGFydCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxhQUFhLEdBQUdELE9BQU8sQ0FBQyxlQUFELENBQTNCOztBQUVBRSxNQUFNLENBQUNDLFVBQVAsR0FBb0I7QUFDaEJDLEVBQUFBLE1BQU0sRUFBRSxRQURRO0FBRWhCQyxFQUFBQSxLQUFLLEVBQUUsT0FGUztBQUdoQkMsRUFBQUEsTUFBTSxFQUFFLFFBSFE7QUFJaEJDLEVBQUFBLE9BQU8sRUFBRSxTQUpPO0FBS2hCQyxFQUFBQSxPQUFPLEVBQUUsU0FMTztBQU1oQkMsRUFBQUEsS0FBSyxFQUFFO0FBTlMsQ0FBcEI7QUFTQVAsTUFBTSxDQUFDUSxZQUFQLEdBQXNCQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUMzQixhQUFTRCxFQUFFLENBQUNFLFNBRGU7QUFHM0JDLEVBQUFBLFVBQVUsRUFBRTtBQUNSQyxJQUFBQSxPQUFPLEVBQUU7QUFDTCxpQkFBUztBQURKLEtBREQ7QUFJUkMsSUFBQUEsYUFBYSxFQUFFO0FBQ1gsaUJBQVM7QUFERSxLQUpQO0FBT1JDLElBQUFBLFlBQVksRUFBRTtBQUNWLGlCQUFTO0FBREM7QUFQTixHQUhlO0FBZTNCQyxFQUFBQSxPQUFPLEVBQUU7QUFDTEMsSUFBQUEsUUFBUSxFQUFFO0FBREwsR0Fma0I7QUFtQjNCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxh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Q0FhWjs7QUFDQSxZQUFJRSxRQUFRLEdBQUcsRUFBZixDQWRZLENBZVo7O0FBQ0FBLFFBQUFBLFFBQVEsQ0FBQ3BDLFFBQVQsR0FBb0JXLFVBQXBCO0FBQ0F5QixRQUFBQSxRQUFRLENBQUNDLE9BQVQsR0FBbUJ2QixVQUFuQjtBQUNBLGFBQUsxQyxhQUFMLEdBQXFCZ0UsUUFBckI7QUFDSDtBQUNKLEtBdkIrQyxDQXVCOUNsRCxJQXZCOEMsQ0F1QnpDLElBdkJ5QyxFQXVCbkN5QixVQXZCbUMsRUF1QnZCaEIsSUF2QnVCLENBQWhEO0FBd0JILEdBL08wQjtBQWtQM0IyQyxFQUFBQSxtQkFBbUIsRUFBRSwrQkFBWTtBQUM3QixRQUFJLEtBQUsxQyxNQUFULEVBQWlCO0FBQ2IsYUFBTyxLQUFLQSxNQUFMLENBQVkyQyxNQUFuQjtBQUNIO0FBQ0osR0F0UDBCO0FBd1AzQkMsRUFBQUEsbUJBQW1CLEVBQUUsNkJBQVVDLEtBQVYsRUFBaUI7QUFDbEMsUUFBSSxLQUFLN0MsTUFBVCxFQUFpQjtBQUNiLFdBQUtBLE1BQUwsQ0FBWTJDLE1BQVosR0FBcUJFLEtBQXJCO0FBQ0g7QUFDSixHQTVQMEI7QUFnUTNCQyxFQUFBQSxLQWhRMkIsbUJBZ1FuQixDQUVQO0FBbFEwQixDQUFULENBQXRCOztBQXNRQTVFLFlBQVksQ0FBQ2dDLFdBQWIsR0FBMkIsWUFBWTtBQUNuQyxNQUFJLENBQUNoQyxZQUFZLENBQUNTLFFBQWxCLEVBQTRCO0FBQ3hCVCxJQUFBQSxZQUFZLENBQUNTLFFBQWIsR0FBd0IsSUFBSVQsWUFBSixFQUF4QjtBQUNIOztBQUNELFNBQU9BLFlBQVksQ0FBQ1MsUUFBcEI7QUFDSCxDQUxEOztBQU9Bb0UsTUFBTSxDQUFDQyxPQUFQLEdBQWlCOUUsWUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOaMiemSruaSreaUvumfs+aViOeahFxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcclxudmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcclxuXHJcbndpbmRvdy5BVURJT19UWVBFID0ge1xyXG4gICAgQ09NTU9OOiBcImNvbW1vblwiLFxyXG4gICAgU0NFTkU6IFwic2NlbmVcIixcclxuICAgIEJBVFRMRTogXCJiYXR0bGVcIixcclxuICAgIERVQkJJTkc6IFwiZHViYmluZ1wiLFxyXG4gICAgUmVjcnVpdDogXCJyZWNydWl0XCIsXHJcbiAgICBEcmFtYTogXCJkcmFtYVwiLFxyXG59XHJcblxyXG53aW5kb3cuU291bmRNYW5hZ2VyID0gY2MuQ2xhc3Moe1xyXG4gICAgZXh0ZW5kczogY2MuQ29tcG9uZW50LFxyXG5cclxuICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICBlZmZlY3RzOiB7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBfY3VyX2JnX211c2ljOiB7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBoZXJvX2VmZmVjdHM6IHtcclxuICAgICAgICAgICAgZGVmYXVsdDoge31cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHN0YXRpY3M6IHtcclxuICAgICAgICBpbnN0YW5jZTogbnVsbCxcclxuICAgIH0sXHJcblxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFNvdW5kU2V0dGluZygpO1xyXG4gICAgfSxcclxuXHJcbiAgICBpbml0U291bmRTZXR0aW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5tdXNpY19zdGF0dXMgPSBnY29yZS5TeXNFbnYuZ2V0KFwibXVzaWNfc3RhdHVzXCIsIFwiMVwiKSA9PSBcIjFcIjsgLy8g6Z+z5LmQXHJcbiAgICAgICAgdGhpcy5zb3VuZF9zdGF0dXMgPSBnY29yZS5TeXNFbnYuZ2V0KFwic291bmRfc3RhdHVzXCIsIFwiMVwiKSA9PSBcIjFcIjsgLy8g6Z+z5pWIXHJcbiAgICAgICAgdGhpcy52b2ljZV9zdGF0dXMgPSBnY29yZS5TeXNFbnYuZ2V0KFwidm9pY2Vfc3RhdHVzXCIsIFwiMVwiKSA9PSBcIjFcIjtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuVk9JQ0VfU0VUVElORywgZnVuY3Rpb24gKHR5cGUpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwYXRlU2V0dGluZyh0eXBlKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGF0ZVNldHRpbmc6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT0gXCJtdXNpY19zdGF0dXNcIikge1xyXG4gICAgICAgICAgICB2YXIgbmV3X3N0YXR1cyA9IGdjb3JlLlN5c0Vudi5nZXQoXCJtdXNpY19zdGF0dXNcIiwgXCIxXCIpID09IFwiMVwiO1xyXG4gICAgICAgICAgICBpZiAobmV3X3N0YXR1cyAhPSB0aGlzLm11c2ljX3N0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tdXNpY19zdGF0dXMgPSBuZXdfc3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld19zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZih3aW5kb3cuQXVkaW9Tb3VyY2VVaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5BdWRpb1NvdXJjZVVpLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdXNpY19pbmZvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlNdXNpYyh0aGlzLm11c2ljX2luZm8udHlwZSwgdGhpcy5tdXNpY19pbmZvLm5hbWUsIHRoaXMubXVzaWNfaW5mby5sb29wKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cl9iZ19tdXNpYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYy5hdWRpb0VuZ2luZS5zdG9wKHRoaXMuX2N1cl9iZ19tdXNpYy5hdWRpb19pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdWRpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXVkaW8uc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuX2N1cl9iZ19tdXNpYy5yZXNfcGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cl9iZ19tdXNpYyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKHdpbmRvdy5BdWRpb1NvdXJjZVVpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5BdWRpb1NvdXJjZVVpLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNvdW5kX3N0YXR1c1wiKSB7XHJcbiAgICAgICAgICAgIHZhciBuZXdfc3RhdHVzID0gZ2NvcmUuU3lzRW52LmdldChcInNvdW5kX3N0YXR1c1wiLCBcIjFcIikgPT0gXCIxXCI7XHJcbiAgICAgICAgICAgIGlmIChuZXdfc3RhdHVzICE9IHRoaXMuc291bmRfc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdW5kX3N0YXR1cyA9IG5ld19zdGF0dXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJ2b2ljZV9zdGF0dXNcIikge1xyXG4gICAgICAgICAgICB2YXIgbmV3X3N0YXR1cyA9IGdjb3JlLlN5c0Vudi5nZXQoXCJ2b2ljZV9zdGF0dXNcIiwgXCIxXCIpID09IFwiMVwiO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8g6L+Z6YeM5Y+v5Lul5aSE55CG5pKt5pS+6Z+z5pWIXHJcbiAgICBwbGF5OiBmdW5jdGlvbiAoZXZlbnQsIGN1c3RvbUV2ZW50RGF0YSkge1xyXG4gICAgICAgIGlmIChldmVudC50eXBlID09IGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCkge1xyXG4gICAgICAgICAgICBjdXN0b21FdmVudERhdGEgPSBjdXN0b21FdmVudERhdGEgfHwgXCJjX2J1dHRvbjFcIjtcclxuICAgICAgICAgICAgaWYgKGN1c3RvbUV2ZW50RGF0YSlcclxuICAgICAgICAgICAgICAgIHRoaXMucGxheUVmZmVjdChBVURJT19UWVBFLkNPTU1PTiwgY3VzdG9tRXZlbnREYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHBsYXlFZmZlY3Q6IGZ1bmN0aW9uIChyZXNfdHlwZSwgcmVzX2lkKSB7ICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZeS4jemHiuaUvlxyXG4gICAgICAgIGlmICghdGhpcy5zb3VuZF9zdGF0dXMpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5lZmZlY3RzW3Jlc19pZF0pIHtcclxuICAgICAgICAgICAgY2MuYXVkaW9FbmdpbmUucGxheUVmZmVjdCh0aGlzLmVmZmVjdHNbcmVzX2lkXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzb3VuZF9wYXRoID0gUGF0aFRvb2wuZ2V0U291bmRSZXMocmVzX3R5cGUsIHJlc19pZCk7XHJcbiAgICAgICAgLy8g6L+Z6YeM5pyJ5LiA5Liq6Zeu6aKYLuesrOS4gOasoeS4jeaSreaUvlxyXG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHNvdW5kX3BhdGgsIGZ1bmN0aW9uIChyZXNfaWQsIHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNfb2JqZWN0Lm5hbWUgPT0gcmVzX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RzW3Jlc19pZF0gPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2MuYXVkaW9FbmdpbmUucGxheUVmZmVjdChyZXNfb2JqZWN0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcywgcmVzX2lkKSlcclxuICAgIH0sXHJcblxyXG4gICAgcGxheUVmZmVjdE9uY2U6IGZ1bmN0aW9uIChyZXNfdHlwZSwgcmVzX2lkKSB7ICAgICAgICAgICAgICAgIC8vIFxyXG4gICAgICAgIGlmICghdGhpcy5zb3VuZF9zdGF0dXMpIHJldHVybjtcclxuICAgICAgICB2YXIgc291bmRfcGF0aCA9IFBhdGhUb29sLmdldFNvdW5kUmVzKHJlc190eXBlLCByZXNfaWQpO1xyXG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHNvdW5kX3BhdGgsIGZ1bmN0aW9uIChzb3VuZF9wYXRoLCByZXNfb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNfb2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXVkaW9faWQgPSBjYy5hdWRpb0VuZ2luZS5wbGF5RWZmZWN0KHJlc19vYmplY3QsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGNjLmF1ZGlvRW5naW5lLnNldEZpbmlzaENhbGxiYWNrKGF1ZGlvX2lkLCB0aGlzLmZpbmlzaFBsYXlNdXNpYy5iaW5kKHRoaXMsIHNvdW5kX3BhdGgsIGF1ZGlvX2lkLCByZXNfb2JqZWN0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcywgc291bmRfcGF0aCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBmaW5pc2hQbGF5TXVzaWM6IGZ1bmN0aW9uIChzb3VuZF9wYXRoLCBhdWRpb19pZCwgcmVzX29iamVjdCkge1xyXG4gICAgICAgIGNjLmF1ZGlvRW5naW5lLnN0b3AoYXVkaW9faWQpO1xyXG4gICAgICAgIGNjLmF1ZGlvRW5naW5lLnVuY2FjaGUocmVzX29iamVjdCk7XHJcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXMoc291bmRfcGF0aCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6Iux6ZuE6K+t6Z+zXHJcbiAgICBwbGF5SGVyb0VmZmVjdE9uY2U6IGZ1bmN0aW9uIChyZXNfdHlwZSwgcmVzX2lkKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdW5kX3N0YXR1cykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLmhlcm9fZWZmZWN0c1tyZXNfaWRdKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9IGNjLmF1ZGlvRW5naW5lLnBsYXlFZmZlY3QodGhpcy5oZXJvX2VmZmVjdHNbcmVzX2lkXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzb3VuZF9wYXRoID0gUGF0aFRvb2wuZ2V0U291bmRSZXMocmVzX3R5cGUsIHJlc19pZCk7XHJcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoc291bmRfcGF0aCwgZnVuY3Rpb24gKHNvdW5kX3BhdGgsIHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNfb2JqZWN0Lm5hbWUgPT0gcmVzX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZXJvX2VmZmVjdHNbcmVzX2lkXSA9IHJlc19vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgYXVkaW9faWQgPSBjYy5hdWRpb0VuZ2luZS5wbGF5RWZmZWN0KHJlc19vYmplY3QsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19pZCA9IGF1ZGlvX2lkO1xyXG4gICAgICAgICAgICAgICAgY2MuYXVkaW9FbmdpbmUuc2V0RmluaXNoQ2FsbGJhY2soYXVkaW9faWQsIHRoaXMuZmluaXNoSGVyb1BsYXlNdXNpYy5iaW5kKHRoaXMsIHNvdW5kX3BhdGgsIGF1ZGlvX2lkLCByZXNfb2JqZWN0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcywgc291bmRfcGF0aCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZW1vdmVFZmZlY3RTb3VuZDogZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIG9iaiA9IG9iaiB8fCB0aGlzLmhlcm9faWQ7XHJcbiAgICAgICAgaWYob2JqID09IG51bGwpe1xyXG4gICAgICAgICAgICBjYy5hdWRpb0VuZ2luZS5zdG9wQWxsKCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNjLmF1ZGlvRW5naW5lLnN0b3Aob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGZpbmlzaEhlcm9QbGF5TXVzaWM6IGZ1bmN0aW9uIChzb3VuZF9wYXRoLCBhdWRpb19pZCwgcmVzX29iamVjdCkge1xyXG4gICAgICAgIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBjYy5hdWRpb0VuZ2luZS5zdG9wKGF1ZGlvX2lkKTtcclxuICAgICAgICAgICAgY2MuYXVkaW9FbmdpbmUudW5jYWNoZShyZXNfb2JqZWN0KTtcclxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXMoc291bmRfcGF0aCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVyb19lZmZlY3RzW3Jlc19vYmplY3QubmFtZV09IG51bGw7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpLDEwKiAxMDAwLDEpXHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOaSreaUvuiDjOaZr+S5kFxyXG4gICAgLy8gcGxheU11c2ljOiBmdW5jdGlvbih0eXBlLCBuYW1lLCBsb29wKSB7XHJcbiAgICAvLyAgICAgdmFyIHNvdW5kX3BhdGggPSBQYXRoVG9vbC5nZXRTb3VuZFJlcyh0eXBlLCBuYW1lKTtcclxuICAgIC8vICAgICBpZiAoIXNvdW5kX3BhdGgpIHJldHVybjtcclxuICAgIC8vICAgICBpZiAodGhpcy5fY3VyX2JnX211c2ljICYmIHRoaXMuX2N1cl9iZ19tdXNpYy5yZXNfcGF0aCA9PSBzb3VuZF9wYXRoKSByZXR1cm47XHJcbiAgICAvLyAgICAgdGhpcy5tdXNpY19pbmZvID0ge3R5cGU6IHR5cGUsIG5hbWU6IG5hbWUsIGxvb3A6IGxvb3B9XHJcbiAgICAvLyAgICAgaWYgKCF0aGlzLm11c2ljX3N0YXR1cykgcmV0dXJuO1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5pc19sb2FkaW5nKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLmlzX2xvYWRpbmcgPT0gc291bmRfcGF0aCkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy53YXRpbmcgPSBudWxsO1xyXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy53YXRpbmcgPSBzb3VuZF9wYXRoO1xyXG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNjLmxvZyhzb3VuZF9wYXRoKTtcclxuXHJcbiAgICAvLyAgICAgdGhpcy5pc19sb2FkaW5nID0gc291bmRfcGF0aDtcclxuICAgIC8vICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhzb3VuZF9wYXRoLCBmdW5jdGlvbiAoc291bmRfcGF0aCwgbG9vcCwgcmVzX29iamVjdCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSBudWxsO1xyXG4gICAgLy8gICAgICAgICBjYy5sb2coc291bmRfcGF0aCx0aGlzLm11c2ljX2luZm8ubmFtZSwgXCJzb3VuZF9wYXRoXCIpXHJcbiAgICAvLyAgICAgICAgIGlmIChyZXNfb2JqZWN0KSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAodGhpcy5fY3VyX2JnX211c2ljKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9jdXJfYmdfbXVzaWMucmVzX3BhdGggPT0gc291bmRfcGF0aCkgcmV0dXJuO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICBjYy5hdWRpb0VuZ2luZS5zdG9wKHRoaXMuX2N1cl9iZ19tdXNpYy5hdWRpb19pZCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNjLmF1ZGlvRW5naW5lLnVuY2FjaGUodGhpcy5fY3VyX2JnX211c2ljLnJlc19vYmopO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyh0aGlzLl9jdXJfYmdfbXVzaWMucmVzX3BhdGgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vIGxldCBhdWRpbyA9IEF1ZGlvU291cmNlVWlcclxuICAgIC8vICAgICAgICAgICAgIC8vIGF1ZGlvLmNsaXAgPSByZXNfb2JqZWN0XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBhdWRpby5sb29wID0gbG9vcDtcclxuICAgIC8vICAgICAgICAgICAgIC8vIGF1ZGlvLnBsYXkoKTtcclxuICAgIC8vICAgICAgICAgICAgICBjYy5hdWRpb0VuZ2luZS5zdG9wQWxsKCk7XHJcbiAgICAvLyAgICAgICAgICAgICB2YXIgYXVkaW9faWQgPSAgY2MuYXVkaW9FbmdpbmUucGxheUVmZmVjdChyZXNfb2JqZWN0LCBsb29wKTtcclxuICAgIC8vICAgICAgICAgICAgIHZhciBjdXJfZGF0YSA9IHt9O1xyXG4gICAgLy8gICAgICAgICAgICAgY3VyX2RhdGEuYXVkaW9faWQgPSBhdWRpb19pZDtcclxuICAgIC8vICAgICAgICAgICAgIGN1cl9kYXRhLnJlc19wYXRoID0gc291bmRfcGF0aDtcclxuICAgIC8vICAgICAgICAgICAgIGN1cl9kYXRhLnJlc19vYmogPSByZXNfb2JqZWN0O1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5fY3VyX2JnX211c2ljID0gY3VyX2RhdGE7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLndhdGluZykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5wbGF5TXVzaWModGhpcy5tdXNpY19pbmZvLnR5cGUsIHRoaXMubXVzaWNfaW5mby5uYW1lLCB0aGlzLm11c2ljX2luZm8ubG9vcCk7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLndhdGluZyA9IG51bGw7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgfS5iaW5kKHRoaXMsIHNvdW5kX3BhdGgsIGxvb3ApKTsgICAgICAgIFxyXG4gICAgLy8gfSxcclxuXHJcbiAgICAvLyDmkq3mlL7og4zmma/kuZBcclxuICAgIHBsYXlNdXNpYzogZnVuY3Rpb24gKHR5cGUsIG5hbWUsIGxvb3ApIHtcclxuICAgICAgICB2YXIgc291bmRfcGF0aCA9IFBhdGhUb29sLmdldFNvdW5kUmVzKHR5cGUsIG5hbWUpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jdXJfYmdfbXVzaWMgJiYgdGhpcy5fY3VyX2JnX211c2ljLnJlc19wYXRoID09IHNvdW5kX3BhdGgpIHJldHVybjtcclxuICAgICAgICB0aGlzLm11c2ljX2luZm8gPSB7IHR5cGU6IHR5cGUsIG5hbWU6IG5hbWUsIGxvb3A6IGxvb3AgfVxyXG4gICAgICAgIGlmICghdGhpcy5tdXNpY19zdGF0dXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoc291bmRfcGF0aCwgZnVuY3Rpb24gKHNvdW5kX3BhdGgsIGxvb3AsIHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cl9iZ19tdXNpYyAmJiBzb3VuZF9wYXRoID09IHRoaXMuX2N1cl9iZ19tdXNpYy5yZXNfcGF0aCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjYy5sb2coc291bmRfcGF0aCwgdGhpcy5tdXNpY19pbmZvLm5hbWUsIFwic291bmRfcGF0aFwiKVxyXG4gICAgICAgICAgICBpZiAocmVzX29iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cl9iZ19tdXNpYyAmJiB3aW5kb3cuQXVkaW9Tb3VyY2VVaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlVWkuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuX2N1cl9iZ19tdXNpYy5yZXNfcGF0aCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5BdWRpb1NvdXJjZVVpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LkF1ZGlvU291cmNlVWkgPSBjYy5maW5kKFwiQ2FudmFzL2dhbWVfdmlld3NcIikuYWRkQ29tcG9uZW50KGNjLkF1ZGlvU291cmNlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGF1ZGlvID0gQXVkaW9Tb3VyY2VVaVxyXG4gICAgICAgICAgICAgICAgYXVkaW8uY2xpcCA9IHJlc19vYmplY3RcclxuICAgICAgICAgICAgICAgIGF1ZGlvLmxvb3AgPSBsb29wO1xyXG4gICAgICAgICAgICAgICAgYXVkaW8ucGxheSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXVkaW8gPSBhdWRpbztcclxuICAgICAgICAgICAgICAgIC8vIHZhciBhdWRpb19pZCA9ICBjYy5hdWRpb0VuZ2luZS5wbGF5RWZmZWN0KHJlc19vYmplY3QsIGxvb3ApO1xyXG4gICAgICAgICAgICAgICAgdmFyIGN1cl9kYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAvLyBjdXJfZGF0YS5hdWRpb19pZCA9IGF1ZGlvO1xyXG4gICAgICAgICAgICAgICAgY3VyX2RhdGEucmVzX3BhdGggPSBzb3VuZF9wYXRoO1xyXG4gICAgICAgICAgICAgICAgY3VyX2RhdGEucmVzX29iaiA9IHJlc19vYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJfYmdfbXVzaWMgPSBjdXJfZGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzLCBzb3VuZF9wYXRoLCBsb29wKSk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBnZXRCYWNrZ3JvdW5kVm9sdW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdWRpby52b2x1bWVcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHNldEJhY2tncm91bmRWb2x1bWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9hdWRpbykge1xyXG4gICAgICAgICAgICB0aGlzLl9hdWRpby52b2x1bWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gICAgc3RhcnQoKSB7XHJcblxyXG4gICAgfSxcclxufSk7XHJcblxyXG5cclxuU291bmRNYW5hZ2VyLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCFTb3VuZE1hbmFnZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICBTb3VuZE1hbmFnZXIuaW5zdGFuY2UgPSBuZXcgU291bmRNYW5hZ2VyKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU291bmRNYW5hZ2VyLmluc3RhbmNlO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNvdW5kTWFuYWdlcjsiXX0=