361 lines
44 KiB
JavaScript
361 lines
44 KiB
JavaScript
|
||
(function() {
|
||
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
||
var __module = nodeEnv ? module : {exports:{}};
|
||
var __filename = 'preview-scripts/assets/Script/Sdk/MiniGameManager.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, '0d272pXVChFDqi5FXTD2JlR', 'MiniGameManager');
|
||
// Script/Sdk/MiniGameManager.ts
|
||
|
||
"use strict";
|
||
var __extends = (this && this.__extends) || (function () {
|
||
var extendStatics = function (d, b) {
|
||
extendStatics = Object.setPrototypeOf ||
|
||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
return extendStatics(d, b);
|
||
};
|
||
return function (d, b) {
|
||
extendStatics(d, b);
|
||
function __() { this.constructor = d; }
|
||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
};
|
||
})();
|
||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.MiniGameManager = void 0;
|
||
var MiniGameSdk_1 = require("./MiniGameSdk");
|
||
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
|
||
var EWechatAD;
|
||
(function (EWechatAD) {
|
||
EWechatAD["CUMSTOM_01"] = "adunit-f7c2417eb2c2e473";
|
||
})(EWechatAD || (EWechatAD = {}));
|
||
var MiniGameManager = /** @class */ (function (_super) {
|
||
__extends(MiniGameManager, _super);
|
||
function MiniGameManager() {
|
||
var _this = _super !== null && _super.apply(this, arguments) || this;
|
||
_this.entranceView = null;
|
||
return _this;
|
||
}
|
||
MiniGameManager_1 = MiniGameManager;
|
||
Object.defineProperty(MiniGameManager, "instance", {
|
||
get: function () {
|
||
if (!MiniGameManager_1._instance) {
|
||
MiniGameManager_1._instance = new MiniGameManager_1();
|
||
}
|
||
return MiniGameManager_1._instance;
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
MiniGameManager.prototype.start = function () {
|
||
// 禁用游戏入口视图
|
||
// this.entranceView.active = false;
|
||
// MiniGameSdk.API.getUserProfile(this.setUserId);
|
||
// cc.fx.GameTool.setUserInfo("");
|
||
this.onGetLoginCode();
|
||
// 尝试获取游戏入口按钮,如果存在则直接返回,不进行后续操作
|
||
// let buttonEntrance = this.node.getChildByName('Btns')?.getChildByName('Button_EntranceView');
|
||
// if (buttonEntrance) {
|
||
// return;
|
||
// }
|
||
// 如果是字节跳动小游戏环境,检查侧边栏是否存在
|
||
if (MiniGameSdk_1.MiniGameSdk.isBytedance()) {
|
||
//抖音环境,检测侧边栏存在
|
||
MiniGameSdk_1.MiniGameSdk.BytedanceSidebar.checkSideBar(function (success) {
|
||
// 根据侧边栏存在性激活或禁用游戏入口按钮
|
||
// buttonEntrance.active = success;
|
||
});
|
||
}
|
||
else {
|
||
// 非抖音小游戏环境,直接激活游戏入口按钮
|
||
// 非抖音环境,正常显示按钮
|
||
// buttonEntrance.active = true;
|
||
}
|
||
// 设置监听器,以处理来自侧边栏的交互事件
|
||
MiniGameSdk_1.MiniGameSdk.BytedanceSidebar.listenFromSidebar(function (success) {
|
||
// 如果交互成功,显示奖励提示
|
||
if (success) {
|
||
MiniGameSdk_1.MiniGameSdk.API.showToast('侧边栏奖励', 5);
|
||
}
|
||
});
|
||
};
|
||
MiniGameManager.prototype.update = function (deltaTime) {
|
||
};
|
||
/**
|
||
* 弹出广告横幅。
|
||
* 此方法用于加载并显示广告横幅。它首先加载指定广告位的横幅广告,然后显示广告。
|
||
* 加载广告和显示广告是通过MiniGameSdk.AdvertManager的实例方法来实现的。
|
||
*
|
||
* @remarks
|
||
* 此方法提供了两种显示横幅广告的方式:
|
||
* 1. 默认方式:调用showBanner方法显示广告,系统会自动选择显示位置。
|
||
* 2. 指定位置方式:可以通过传入额外的参数来指定广告显示在屏幕的顶部或底部,或者通过坐标指定显示位置。
|
||
*
|
||
* 示例代码中注释掉了两种显示广告的具体方法,可以根据实际需求选择使用。
|
||
*/
|
||
MiniGameManager.prototype.onShowBanner = function () {
|
||
// 加载指定广告位的横幅广告。
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.loadBanner('adunit-4e7ef467e3eaab51');
|
||
// 默认方式显示横幅广告。
|
||
// 方法1:默认调用
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showBanner();
|
||
// 示例:指定屏幕底部正中显示横幅广告。
|
||
// 方法2:指定屏幕顶部或底部正中
|
||
// MiniGameSdk.AdvertManager.instance.showBanner('adunit-4e7ef467e3eaab51', MiniGameSdk.EAdBannerLocation.BOTTOM);
|
||
// 示例:通过坐标指定位置显示横幅广告。
|
||
// 方法2:指定坐标
|
||
// MiniGameSdk.AdvertManager.instance.showBanner('adunit-4e7ef467e3eaab51', { top: 10, left: 10 });
|
||
};
|
||
/**
|
||
* 隐藏广告横幅的函数。
|
||
*
|
||
* 该函数调用MiniGameSdk.AdvertManager实例的方法,用于隐藏广告横幅。
|
||
* 当需要暂时停止展示广告或用户主动请求隐藏广告时,可以调用此函数。
|
||
*
|
||
* @remarks
|
||
* 此函数不接受任何参数,也不返回任何值。
|
||
* 它单纯地触发广告横幅的隐藏操作,具体实现依赖于AdvertManager的实现。
|
||
*/
|
||
MiniGameManager.prototype.onHideBanner = function () {
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.hideBanner();
|
||
};
|
||
/**
|
||
* 显示插屏广告的函数。
|
||
*
|
||
* 此函数调用MiniGameSdk.AdvertManager实例的方法,以显示一个指定的插屏广告。
|
||
* 它使用了硬编码的广告单元标识符,这意味着它专为特定的广告位设计。
|
||
* 在实际应用中,可能需要根据应用的配置或用户的特定条件来动态选择广告单元标识符。
|
||
*/
|
||
MiniGameManager.prototype.onShowInterstitial = function () {
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showInterstitial('adunit-eadd67851d3050ad');
|
||
};
|
||
/**
|
||
* 调用广告管理器加载并展示自定义广告。
|
||
* 此方法首先通过广告管理器的实例加载指定的自定义广告单元,然后展示这个自定义广告。
|
||
* 加载和展示广告是广告管理系统中的常见操作,这里通过两步分别完成加载和展示的过程,
|
||
* 以确保广告在展示前正确且充分地被加载。
|
||
*/
|
||
MiniGameManager.prototype.onShowCustom = function () {
|
||
// 加载指定的自定义广告单元。
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.loadCustom(EWechatAD.CUMSTOM_01);
|
||
// 展示已加载的自定义广告。
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showCustom(EWechatAD.CUMSTOM_01);
|
||
};
|
||
/**
|
||
* 隐藏自定义广告。
|
||
*
|
||
* 本函数调用MiniGameSdk.AdvertManager.instance.hideCustom()来隐藏自定义广告。
|
||
* 这是对接广告管理系统的一部分,用于控制广告的显示与隐藏。
|
||
* 在需要隐藏自定义广告的场景下,调用此函数即可实现相应功能。
|
||
*/
|
||
MiniGameManager.prototype.onHideCustom = function () {
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.hideCustom(EWechatAD.CUMSTOM_01);
|
||
};
|
||
/**
|
||
* 触发显示视频广告的函数。
|
||
* 通过调用MiniGameSdk.AdvertManager.instance.showVideo方法,显示一个视频广告,并根据用户观看广告的情况执行相应的逻辑。
|
||
*
|
||
* @remarks
|
||
* 此函数首先传入一个广告单元ID,用于标识要显示的视频广告。然后传入一个回调函数,该回调函数在用户观看广告后被调用,无论用户是完成了观看、拒绝了观看还是观看过程中发生了错误。
|
||
* 回调函数接收两个参数:一个是用户观看广告的结果,另一个是用户观看的广告数量。根据观看结果的不同,显示不同的提示信息。
|
||
*/
|
||
MiniGameManager.prototype.onShowVideo = function () {
|
||
// 广告单元ID,用于标识要显示的视频广告
|
||
// 广告单元ID的样例
|
||
//抖音形如: 1re3nfqkmy81m4m8ge
|
||
//微信形如: adunit-a7718f6e195e42fe
|
||
MiniGameSdk_1.MiniGameSdk.AdvertManager.instance.showVideo('1re3nfqkmy81m4m8ge', function (res, count) {
|
||
// 输出用户观看的广告数量
|
||
console.log('用户看的视频广告个数是:', count);
|
||
// 根据用户观看广告的结果,执行不同的逻辑
|
||
switch (res) {
|
||
case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.ACCEPT:
|
||
// 用户完成了广告观看,显示奖励提示
|
||
MiniGameSdk_1.MiniGameSdk.API.showToast('用户看完广告,可以奖励');
|
||
break;
|
||
case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.REJECT:
|
||
// 用户拒绝了广告观看,显示不奖励提示
|
||
MiniGameSdk_1.MiniGameSdk.API.showToast('用户拒绝掉广告,不奖励');
|
||
break;
|
||
case MiniGameSdk_1.MiniGameSdk.EAdVideoResult.ERROR:
|
||
// 广告播放发生错误,显示错误提示
|
||
MiniGameSdk_1.MiniGameSdk.API.showToast('播放广告发生错误,不奖励');
|
||
break;
|
||
default:
|
||
// 其他情况,不作处理
|
||
break;
|
||
}
|
||
});
|
||
};
|
||
/**
|
||
* 引导用户分享应用给朋友。
|
||
*
|
||
* 通过调用MiniGameSdk的API分享功能,向用户的朋友圈发送邀请,邀请他们一起玩游戏。
|
||
* 这是一个重要的推广手段,可以增加应用的曝光度和用户量。
|
||
*
|
||
* @remarks
|
||
* 此方法中调用的API依赖于特定的小游戏平台,因此在不同的平台上可能需要不同的实现。
|
||
*/
|
||
MiniGameManager.prototype.onShare = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.shareAppToFriends('来玩游戏吧');
|
||
};
|
||
/**
|
||
* 显示一个toast提示。
|
||
*
|
||
* 通过调用MiniGameSdk的API方法来显示一个简短的提示信息。toast是一种轻量级的提示方式,用于在界面上短暂地展示一些信息,不影响用户操作。
|
||
* 这里使用了固定的提示文本 '这是一个toast',在实际应用中,可以根据需要动态设置提示文本。
|
||
*/
|
||
MiniGameManager.prototype.onShowToast = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.showToast('这是一个toast');
|
||
};
|
||
/**
|
||
* 触发设备振动功能。
|
||
*
|
||
* 该方法用于调用MiniGameSdk提供的API,以实现设备的振动功能。当需要提醒用户或提供触觉反馈时,可以调用此方法。
|
||
* 例如,在游戏或应用中,当用户完成特定操作或发生特定事件时,可以通过振动给予用户反馈。
|
||
*
|
||
* @remarks
|
||
* 此方法无参数,也不返回任何值。
|
||
*/
|
||
MiniGameManager.prototype.onVirbrate = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.vibrate();
|
||
};
|
||
/**
|
||
* 重新启动游戏实例。
|
||
*
|
||
* 此函数调用MiniGameSdk中的API重新启动游戏。重新启动操作可能是为了初始化游戏环境、重置游戏状态或处理其他需要重启的场景。
|
||
* 调用此函数后,游戏将会重新开始,当前的游戏状态将会被清除。
|
||
*
|
||
* @remarks
|
||
* 此函数不接受任何参数。
|
||
*
|
||
* @returns 无返回值。
|
||
*/
|
||
MiniGameManager.prototype.onReboot = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.reboot();
|
||
};
|
||
/**
|
||
* 当前函数用于在迷你游戏中实现退出功能。
|
||
* 它调用了MiniGameSdk提供的API方法来触发退出操作。
|
||
* 该方法通常在需要结束当前迷你游戏或返回到上一级菜单时被调用。
|
||
*/
|
||
MiniGameManager.prototype.onExit = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.exit();
|
||
};
|
||
/**
|
||
* 显示分享菜单。
|
||
*
|
||
* 通过调用MiniGameSdk的API方法,触发显示分享菜单的操作。此函数旨在提供一个统一的入口,
|
||
* 以便在需要时轻松调用分享功能,而无需直接与具体的SDK接口交互。
|
||
*
|
||
* @remarks
|
||
* 此方法不接受任何参数,也不返回任何值。
|
||
*/
|
||
MiniGameManager.prototype.onShowShareMenu = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.showShareMenu();
|
||
};
|
||
/**
|
||
* 导航到指定的小游戏。
|
||
*
|
||
* 本函数用于触发导航到一个特定的小游戏。这需要提供目标小游戏的ID,
|
||
* 以便系统能够正确地将用户重定向到目标小游戏。
|
||
*
|
||
* 注意:这里的'xxx'是占位符,实际使用时需要替换为具体的小游戏ID。
|
||
*/
|
||
MiniGameManager.prototype.onNavigate = function () {
|
||
MiniGameSdk_1.MiniGameSdk.API.navigateTo('xxx'); // xxx替换为你的小游戏id
|
||
};
|
||
/**
|
||
* 激活字节跳动入口视图。
|
||
*
|
||
* 此方法用于将字节跳动入口视图设置为活跃状态。当需要在用户界面中显示字节跳动的入口时,
|
||
* 可以调用此方法来激活相应的视图元素,使其对用户可见。
|
||
*/
|
||
MiniGameManager.prototype.onBytedanceEntranceView = function () {
|
||
// this.entranceView.active = true;
|
||
};
|
||
/**
|
||
* 请求登录代码
|
||
*
|
||
* 本函数用于触发小程序的登录流程,获取微信或头条等第三方平台的登录代码。
|
||
* 这些代码可以用于后续的用户身份验证和数据同步流程。
|
||
*/
|
||
MiniGameManager.prototype.onGetLoginCode = function () {
|
||
var _this = this;
|
||
// 调用MiniGameSdk的API登录方法,传入一个回调函数处理登录结果
|
||
MiniGameSdk_1.MiniGameSdk.API.login(function (code, anonymousCode) {
|
||
// 打印微信或头条的登录代码
|
||
console.log('Wechat Or Bytedance Code:', code);
|
||
// 打印头条的匿名登录代码
|
||
// console.log('Bytedance Anonymous Code:', anonymousCode);
|
||
if (code) {
|
||
cc.fx.GameTool.getUserId(code, function (data) { return _this.setUserId(data); });
|
||
}
|
||
});
|
||
};
|
||
MiniGameManager.prototype.setUserId = function (data) {
|
||
cc.fx.GameConfig.GM_INFO.userId = data.data.userId;
|
||
MiniGameSdk_1.MiniGameSdk.API.getUserInfo(this.setUserInfo);
|
||
};
|
||
MiniGameManager.prototype.setUserInfo = function (data) {
|
||
console.log("获取到的用户信息", data.userInfo);
|
||
var useData = {
|
||
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
|
||
"userId": cc.fx.GameConfig.GM_INFO.userId,
|
||
"nickName": data.userInfo.nickName,
|
||
"pic": data.userInfo.avatarUrl
|
||
};
|
||
console.log("即将上传的用户信息:", cc.fx.GameConfig.GM_INFO.userId, data.userInfo.nickName, data.userInfo.avatarUrl);
|
||
console.log("Post数据:", useData);
|
||
cc.fx.HttpUtil.setUserInfo(useData, function (res) {
|
||
console.log("上传成功:", res);
|
||
});
|
||
};
|
||
/**
|
||
* 创建并显示游戏圈按钮
|
||
*
|
||
* 本函数通过调用MiniGameSdk的GameClub实例方法,实现游戏俱乐部的创建和显示。
|
||
* 它首先配置俱乐部的图标类型和位置大小,然后创建俱乐部,最后显示俱乐部。
|
||
* 这样做是为了在小游戏内创建并展示一个游戏俱乐部的图标,供玩家加入或互动。
|
||
*/
|
||
MiniGameManager.prototype.onCreateClub = function () {
|
||
// 配置俱乐部图标为绿色,设置图标的位置为顶部200像素,左侧0像素
|
||
MiniGameSdk_1.MiniGameSdk.GameClub.instance.create(MiniGameSdk_1.MiniGameSdk.EGameClubIcon.GREEN, { top: 200, left: 0 }, { width: 50, height: 50 });
|
||
// 显示游戏俱乐部图标
|
||
MiniGameSdk_1.MiniGameSdk.GameClub.instance.show();
|
||
};
|
||
var MiniGameManager_1;
|
||
__decorate([
|
||
property(cc.Node)
|
||
], MiniGameManager.prototype, "entranceView", void 0);
|
||
MiniGameManager = MiniGameManager_1 = __decorate([
|
||
ccclass
|
||
], MiniGameManager);
|
||
return MiniGameManager;
|
||
}(cc.Component));
|
||
exports.MiniGameManager = MiniGameManager;
|
||
|
||
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxTZGtcXE1pbmlHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQTRDO0FBQ3RDLElBQUEsS0FBd0IsRUFBRSxDQUFDLFVBQVUsRUFBbkMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFrQixDQUFDO0FBQzVDLElBQUssU0FFSjtBQUZELFdBQUssU0FBUztJQUNWLG1EQUFzQyxDQUFBO0FBQzFDLENBQUMsRUFGSSxTQUFTLEtBQVQsU0FBUyxRQUViO0FBR0Q7SUFBcUMsbUNBQVk7SUFBakQ7UUFBQSxxRUEyVUM7UUF4VUcsa0JBQVksR0FBWSxJQUFJLENBQUM7O0lBd1VqQyxDQUFDO3dCQTNVWSxlQUFlO0lBa0J4QixzQkFBVywyQkFBUTthQUFuQjtZQUNJLElBQUksQ0FBQyxpQkFBZSxDQUFDLFNBQVMsRUFBRTtnQkFDNUIsaUJBQWUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxpQkFBZSxFQUFFLENBQUM7YUFDckQ7WUFDRCxPQUFPLGlCQUFlLENBQUMsU0FBUyxDQUFDO1FBQ3JDLENBQUM7OztPQUFBO0lBRUQsK0JBQUssR0FBTDtRQUNJLFdBQVc7UUFDWCxvQ0FBb0M7UUFDcEMsa0RBQWtEO1FBQ2xELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsK0JBQStCO1FBQy9CLGdHQUFnRztRQUNoRyx3QkFBd0I7UUFDeEIsY0FBYztRQUNkLElBQUk7UUFFSix5QkFBeUI7UUFFekIsSUFBSSx5QkFBVyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzNCLGNBQWM7WUFDZCx5QkFBVyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFDLE9BQWdCO2dCQUN2RCxzQkFBc0I7Z0JBQ3RCLG1DQUFtQztZQUN2QyxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLGdDQUFn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QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxzQ0FBWSxHQUFaO1FBQ0ksbUNBQW1DO1FBQ25DLHlCQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ2hDLHlCQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFDL0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFDckIsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLFlBQVk7UUFDWix5QkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQzs7SUF2VUQ7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQzt5REFDVztJQUhwQixlQUFlO1FBRDNCLE9BQU87T0FDSyxlQUFlLENBMlUzQjtJQUFELHNCQUFDO0NBM1VELEFBMlVDLENBM1VvQyxFQUFFLENBQUMsU0FBUyxHQTJVaEQ7QUEzVVksMENBQWUiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgTWluaUdhbWVTZGsgfSBmcm9tIFwiLi9NaW5pR2FtZVNka1wiO1xyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xyXG5lbnVtIEVXZWNoYXRBRCB7XHJcbiAgICBDVU1TVE9NXzAxID0gJ2FkdW5pdC1mN2MyNDE3ZWIyYzJlNDczJ1xyXG59XHJcblxyXG5AY2NjbGFzc1xyXG5leHBvcnQgY2xhc3MgTWluaUdhbWVNYW5hZ2VyIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcbiAgICBAcHJvcGVydHkoY2MuTm9kZSlcclxuICAgIGVudHJhbmNlVmlldzogY2MuTm9kZSA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+a4uOaIj+WJjeeahOWIneWni+WMluaTjeS9nOOAglxyXG4gICAgICog5Li76KaB6LSf6LSj5qOA5p+l5bm25aSE55CG5ri45oiP5YWl5Y+j5oyJ6ZKu55qE5r+A5rS754q25oCB77yM5Lul5Y+K5Zyo54m55a6a546v5aKD5LiL6K6+572u5L6n6L655qCP55qE55uR5ZCs5Zmo44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5XpppblhYjlsIbmuLjmiI/lhaXlj6Pop4blm77orr7kuLrpnZ7mv4DmtLvnirbmgIHvvIzku6Xlh4blpIfov5vooYzlkI7nu63nmoTmo4Dmn6Xlkozorr7nva7jgIJcclxuICAgICAqIOWmguaenOW9k+WJjeeOr+Wig+aYr+aKlumfs+Wwj+a4uOaIj++8jOS8muajgOafpeaYr+WQpuWtmOWcqOS+p+i+ueagj++8jOW5tuagueaNruajgOafpee7k+aenOa/gOa0u+aIluemgeeUqOa4uOaIj+WFpeWPo+aMiemSruOAglxyXG4gICAgICog5a+55LqO6Z2e5oqW6Z+z5bCP5ri45oiP546v5aKD77yM55u05o6l5r+A5rS75ri45oiP5YWl5Y+j5oyJ6ZKu44CCXHJcbiAgICAgKiDmraTlpJbvvIzml6Dorrrnjq/looPlpoLkvZXvvIzpg73kvJrorr7nva7kuIDkuKrnm5HlkKzlmajvvIzku6XlpITnkIbmnaXoh6rkvqfovrnmoI/nmoTkuovku7bvvIzlpoLmiJDlip/op6blj5Hml7bmmL7npLrlpZblirHmj5DnpLrjgIJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaWQ6YW55O1xyXG4gICAgcHJpdmF0ZSBfdXNlckRhdGE6YW55O1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTWluaUdhbWVNYW5hZ2VyO1xyXG4gICAgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBNaW5pR2FtZU1hbmFnZXIge1xyXG4gICAgICAgIGlmICghTWluaUdhbWVNYW5hZ2VyLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBNaW5pR2FtZU1hbmFnZXIuX2luc3RhbmNlID0gbmV3IE1pbmlHYW1lTWFuYWdlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTWluaUdhbWVNYW5hZ2VyLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICAvLyDnpoHnlKjmuLjmiI/lhaXlj6Pop4blm75cclxuICAgICAgICAvLyB0aGlzLmVudHJhbmNlVmlldy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyBNaW5pR2FtZVNkay5BUEkuZ2V0VXNlclByb2ZpbGUodGhpcy5zZXRVc2VySWQpO1xyXG4gICAgICAgIC8vIGNjLmZ4LkdhbWVUb29sLnNldFVzZXJJbmZvKFwiXCIpO1xyXG4gICAgICAgIHRoaXMub25HZXRMb2dpbkNvZGUoKTtcclxuICAgICAgICAvLyDlsJ3or5Xojrflj5bmuLjmiI/lhaXlj6PmjInpkq7vvIzlpoLmnpzlrZjlnKjliJnnm7TmjqXov5Tlm57vvIzkuI3ov5vooYzlkI7nu63mk43kvZxcclxuICAgICAgICAvLyBsZXQgYnV0dG9uRW50cmFuY2UgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoJ0J0bnMnKT8uZ2V0Q2hpbGRCeU5hbWUoJ0J1dHRvbl9FbnRyYW5jZVZpZXcnKTtcclxuICAgICAgICAvLyBpZiAoYnV0dG9uRW50cmFuY2UpIHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8g5aaC5p6c5piv5a2X6IqC6Lez5Yqo5bCP5ri45oiP546v5aKD77yM5qOA5p+l5L6n6L655qCP5piv5ZCm5a2Y5ZyoXHJcblxyXG4gICAgICAgIGlmIChNaW5pR2FtZVNkay5pc0J5dGVkYW5jZSgpKSB7XHJcbiAgICAgICAgICAgIC8v5oqW6Z+z546v5aKD77yM5qOA5rWL5L6n6L655qCP5a2Y5ZyoXHJcbiAgICAgICAgICAgIE1pbmlHYW1lU2RrLkJ5dGVkYW5jZVNpZGViYXIuY2hlY2tTaWRlQmFyKChzdWNjZXNzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyDmoLnmja7kvqfovrnmoI/lrZjlnKjmgKfmv4DmtLvmiJbnpoHnlKjmuLjmiI/lhaXlj6PmjInpkq5cclxuICAgICAgICAgICAgICAgIC8vIGJ1dHRvbkVudHJhbmNlLmFjdGl2ZSA9IHN1Y2Nlc3M7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIOmdnuaKlumfs+Wwj+a4uOaIj+eOr+Wig++8jOebtOaOpea/gOa0u+a4uOaIj+WFpeWPo+aMiemSrlxyXG4gICAgICAgICAgICAvLyDpnZ7mipbpn7Pnjq/looPvvIzmraPluLjmmL7npLrmjInpkq5cclxuICAgICAgICAgICAgLy8gYnV0dG9uRW50cmFuY2UuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOiuvue9ruebkeWQrOWZqO+8jOS7peWkhOeQhuadpeiHquS+p+i+ueagj+eahOS6pOS6kuS6i+S7tlxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkJ5dGVkYW5jZVNpZGViYXIubGlzdGVuRnJvbVNpZGViYXIoKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgLy8g5aaC5p6c5Lqk5LqS5oiQ5Yqf77yM5pi+56S65aWW5Yqx5o+Q56S6XHJcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfkvqfovrnmoI/lpZblirEnLCA1KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZShkZWx0YVRpbWU6IG51bWJlcikge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8ueWHuuW5v+WRiuaoquW5heOAglxyXG4gICAgICog5q2k5pa55rOV55So5LqO5Yqg6L295bm25pi+56S65bm/5ZGK5qiq5bmF44CC5a6D6aaW5YWI5Yqg6L295oyH5a6a5bm/5ZGK5L2N55qE5qiq5bmF5bm/5ZGK77yM54S25ZCO5pi+56S65bm/5ZGK44CCXHJcbiAgICAgKiDliqDovb3lub/lkYrlkozmmL7npLrlub/lkYrmmK/pgJrov4dNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2Vy55qE5a6e5L6L5pa55rOV5p2l5a6e546w55qE44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiDmraTmlrnms5Xmj5DkvpvkuobkuKTnp43mmL7npLrmqKrluYXlub/lkYrnmoTmlrnlvI/vvJpcclxuICAgICAqIDEuIOm7mOiupOaWueW8j++8muiwg+eUqHNob3dCYW5uZXLmlrnms5XmmL7npLrlub/lkYrvvIzns7vnu5/kvJroh6rliqjpgInmi6nmmL7npLrkvY3nva7jgIJcclxuICAgICAqIDIuIOaMh+WumuS9jee9ruaWueW8j++8muWPr+S7pemAmui/h+S8oOWFpemineWklueahOWPguaVsOadpeaMh+WumuW5v+WRiuaYvuekuuWcqOWxj+W5leeahOmhtumDqOaIluW6lemDqO+8jOaIluiAhemAmui/h+WdkOagh+aMh+WumuaYvuekuuS9jee9ruOAglxyXG4gICAgICogXHJcbiAgICAgKiDnpLrkvovku6PnoIHkuK3ms6jph4rmjonkuobkuKTnp43mmL7npLrlub/lkYrnmoTlhbfkvZPmlrnms5XvvIzlj6/ku6XmoLnmja7lrp7pmYXpnIDmsYLpgInmi6nkvb/nlKjjgIJcclxuICAgICAqL1xyXG4gICAgb25TaG93QmFubmVyKCkge1xyXG4gICAgICAgIC8vIOWKoOi9veaMh+WumuW5v+WRiuS9jeeahOaoquW5heW5v+WRiuOAglxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2UubG9hZEJhbm5lcignYWR1bml0LTRlN2VmNDY3ZTNlYWFiNTEnKTtcclxuXHJcbiAgICAgICAgLy8g6buY6K6k5pa55byP5pi+56S65qiq5bmF5bm/5ZGK44CCXHJcbiAgICAgICAgLy8g5pa55rOVMe+8mum7mOiupOiwg+eUqFxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0Jhbm5lcigpO1xyXG5cclxuICAgICAgICAvLyDnpLrkvovvvJrmjIflrprlsY/luZXlupXpg6jmraPkuK3mmL7npLrmqKrluYXlub/lkYrjgIJcclxuICAgICAgICAvLyDmlrnms5Uy77ya5oyH5a6a5bGP5bmV6aG26YOo5oiW5bqV6YOo5q2j5LitXHJcbiAgICAgICAgLy8gTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93QmFubmVyKCdhZHVuaXQtNGU3ZWY0NjdlM2VhYWI1MScsIE1pbmlHYW1lU2RrLkVBZEJhbm5lckxvY2F0aW9uLkJPVFRPTSk7IFxyXG5cclxuICAgICAgICAvLyDnpLrkvovvvJrpgJrov4flnZDmoIfmjIflrprkvY3nva7mmL7npLrmqKrluYXlub/lkYrjgIJcclxuICAgICAgICAvLyDmlrnms5Uy77ya5oyH5a6a5Z2Q5qCHXHJcbiAgICAgICAgLy8gTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93QmFubmVyKCdhZHVuaXQtNGU3ZWY0NjdlM2VhYWI1MScsIHsgdG9wOiAxMCwgbGVmdDogMTAgfSk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZqQ6JeP5bm/5ZGK5qiq5bmF55qE5Ye95pWw44CCXHJcbiAgICAgKiBcclxuICAgICAqIOivpeWHveaVsOiwg+eUqE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXLlrp7kvovnmoTmlrnms5XvvIznlKjkuo7pmpDol4/lub/lkYrmqKrluYXjgIJcclxuICAgICAqIOW9k+mcgOimgeaaguaXtuWBnOatouWxleekuuW5v+WRiuaIlueUqOaIt+S4u+WKqOivt+axgumakOiXj+W5v+WRiuaXtu+8jOWPr+S7peiwg+eUqOatpOWHveaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw77yM5Lmf5LiN6L+U5Zue5Lu75L2V5YC844CCXHJcbiAgICAgKiDlroPljZXnuq/lnLDop6blj5Hlub/lkYrmqKrluYXnmoTpmpDol4/mk43kvZzvvIzlhbfkvZPlrp7njrDkvp3otZbkuo5BZHZlcnRNYW5hZ2Vy55qE5a6e546w44CCXHJcbiAgICAgKi9cclxuICAgIG9uSGlkZUJhbm5lcigpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmhpZGVCYW5uZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuaPkuWxj+W5v+WRiueahOWHveaVsOOAglxyXG4gICAgICogXHJcbiAgICAgKiDmraTlh73mlbDosIPnlKhNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2Vy5a6e5L6L55qE5pa55rOV77yM5Lul5pi+56S65LiA5Liq5oyH5a6a55qE5o+S5bGP5bm/5ZGK44CCXHJcbiAgICAgKiDlroPkvb/nlKjkuobnoaznvJbnoIHnmoTlub/lkYrljZXlhYPmoIfor4bnrKbvvIzov5nmhI/lkbPnnYDlroPkuJPkuLrnibnlrprnmoTlub/lkYrkvY3orr7orqHjgIJcclxuICAgICAqIOWcqOWunumZheW6lOeUqOS4re+8jOWPr+iDvemcgOimgeagueaNruW6lOeUqOeahOmFjee9ruaIlueUqOaIt+eahOeJueWumuadoeS7tuadpeWKqOaAgemAieaLqeW5v+WRiuWNleWFg+agh+ivhuespuOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dJbnRlcnN0aXRpYWwoKSB7XHJcbiAgICAgICAgTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5zaG93SW50ZXJzdGl0aWFsKCdhZHVuaXQtZWFkZDY3ODUxZDMwNTBhZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LCD55So5bm/5ZGK566h55CG5Zmo5Yqg6L295bm25bGV56S66Ieq5a6a5LmJ5bm/5ZGK44CCXHJcbiAgICAgKiDmraTmlrnms5XpppblhYjpgJrov4flub/lkYrnrqHnkIblmajnmoTlrp7kvovliqDovb3mjIflrprnmoToh6rlrprkuYnlub/lkYrljZXlhYPvvIznhLblkI7lsZXnpLrov5nkuKroh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIOWKoOi9veWSjOWxleekuuW5v+WRiuaYr+W5v+WRiueuoeeQhuezu+e7n+S4reeahOW4uOingeaTjeS9nO+8jOi/memHjOmAmui/h+S4pOatpeWIhuWIq+WujOaIkOWKoOi9veWSjOWxleekuueahOi/h+eoi++8jFxyXG4gICAgICog5Lul56Gu5L+d5bm/5ZGK5Zyo5bGV56S65YmN5q2j56Gu5LiU5YWF5YiG5Zyw6KKr5Yqg6L2944CCXHJcbiAgICAgKi9cclxuICAgIG9uU2hvd0N1c3RvbSgpIHtcclxuICAgICAgICAvLyDliqDovb3mjIflrprnmoToh6rlrprkuYnlub/lkYrljZXlhYPjgIJcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmxvYWRDdXN0b20oRVdlY2hhdEFELkNVTVNUT01fMDEpO1xyXG4gICAgICAgIC8vIOWxleekuuW3suWKoOi9veeahOiHquWumuS5ieW5v+WRiuOAglxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd0N1c3RvbShFV2VjaGF0QUQuQ1VNU1RPTV8wMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmpDol4/oh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIFxyXG4gICAgICog5pys5Ye95pWw6LCD55SoTWluaUdhbWVTZGsuQWR2ZXJ0TWFuYWdlci5pbnN0YW5jZS5oaWRlQ3VzdG9tKCnmnaXpmpDol4/oh6rlrprkuYnlub/lkYrjgIJcclxuICAgICAqIOi/meaYr+WvueaOpeW5v+WRiueuoeeQhuezu+e7n+eahOS4gOmDqOWIhu+8jOeUqOS6juaOp+WItuW5v+WRiueahOaYvuekuuS4jumakOiXj+OAglxyXG4gICAgICog5Zyo6ZyA6KaB6ZqQ6JeP6Ieq5a6a5LmJ5bm/5ZGK55qE5Zy65pmv5LiL77yM6LCD55So5q2k5Ye95pWw5Y2z5Y+v5a6e546w55u45bqU5Yqf6IO944CCXHJcbiAgICAgKi9cclxuICAgIG9uSGlkZUN1c3RvbSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLmhpZGVDdXN0b20oRVdlY2hhdEFELkNVTVNUT01fMDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5Y+R5pi+56S66KeG6aKR5bm/5ZGK55qE5Ye95pWw44CCXHJcbiAgICAgKiDpgJrov4fosIPnlKhNaW5pR2FtZVNkay5BZHZlcnRNYW5hZ2VyLmluc3RhbmNlLnNob3dWaWRlb+aWueazle+8jOaYvuekuuS4gOS4quinhumikeW5v+WRiu+8jOW5tuagueaNrueUqOaIt+ingueci+W5v+WRiueahOaDheWGteaJp+ihjOebuOW6lOeahOmAu+i+keOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw6aaW5YWI5Lyg5YWl5LiA5Liq5bm/5ZGK5Y2V5YWDSUTvvIznlKjkuo7moIfor4bopoHmmL7npLrnmoTop4bpopHlub/lkYrjgILnhLblkI7kvKDlhaXkuIDkuKrlm57osIPlh73mlbDvvIzor6Xlm57osIPlh73mlbDlnKjnlKjmiLfop4LnnIvlub/lkYrlkI7ooqvosIPnlKjvvIzml6DorrrnlKjmiLfmmK/lrozmiJDkuobop4LnnIvjgIHmi5Lnu53kuobop4LnnIvov5jmmK/op4LnnIvov4fnqIvkuK3lj5HnlJ/kuobplJnor6/jgIJcclxuICAgICAqIOWbnuiwg+WHveaVsOaOpeaUtuS4pOS4quWPguaVsO+8muS4gOS4quaYr+eUqOaIt+ingueci+W5v+WRiueahOe7k+aenO+8jOWPpuS4gOS4quaYr+eUqOaIt+ingueci+eahOW5v+WRiuaVsOmHj+OAguagueaNruingueci+e7k+aenOeahOS4jeWQjO+8jOaYvuekuuS4jeWQjOeahOaPkOekuuS/oeaBr+OAglxyXG4gICAgICovXHJcbiAgICBvblNob3dWaWRlbygpIHtcclxuICAgICAgICAvLyDlub/lkYrljZXlhYNJRO+8jOeUqOS6juagh+ivhuimgeaYvuekuueahOinhumikeW5v+WRilxyXG4gICAgICAgIC8vIOW5v+WRiuWNleWFg0lE55qE5qC35L6LXHJcbiAgICAgICAgLy/mipbpn7PlvaLlpoI6IDFyZTNuZnFrbXk4MW00bThnZVxyXG4gICAgICAgIC8v5b6u5L+h5b2i5aaCOiBhZHVuaXQtYTc3MThmNmUxOTVlNDJmZVxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFkdmVydE1hbmFnZXIuaW5zdGFuY2Uuc2hvd1ZpZGVvKCcxcmUzbmZxa215ODFtNG04Z2UnLCAocmVzOiBNaW5pR2FtZVNkay5FQWRWaWRlb1Jlc3VsdCwgY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAvLyDovpPlh7rnlKjmiLfop4LnnIvnmoTlub/lkYrmlbDph49cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ+eUqOaIt+eci+eahOinhumikeW5v+WRiuS4quaVsOaYrzonLCBjb3VudCk7XHJcblxyXG4gICAgICAgICAgICAvLyDmoLnmja7nlKjmiLfop4LnnIvlub/lkYrnmoTnu5PmnpzvvIzmiafooYzkuI3lkIznmoTpgLvovpFcclxuICAgICAgICAgICAgc3dpdGNoIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgTWluaUdhbWVTZGsuRUFkVmlkZW9SZXN1bHQuQUNDRVBUOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOeUqOaIt+WujOaIkOS6huW5v+WRiuingueci++8jOaYvuekuuWlluWKseaPkOekulxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaG93VG9hc3QoJ+eUqOaIt+eci+WujOW5v+WRiu+8jOWPr+S7peWlluWKsScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBNaW5pR2FtZVNkay5FQWRWaWRlb1Jlc3VsdC5SRUpFQ1Q6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g55So5oi35ouS57ud5LqG5bm/5ZGK6KeC55yL77yM5pi+56S65LiN5aWW5Yqx5o+Q56S6XHJcbiAgICAgICAgICAgICAgICAgICAgTWluaUdhbWVTZGsuQVBJLnNob3dUb2FzdCgn55So5oi35ouS57ud5o6J5bm/5ZGK77yM5LiN5aWW5YqxJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIE1pbmlHYW1lU2RrLkVBZFZpZGVvUmVzdWx0LkVSUk9SOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOW5v+WRiuaSreaUvuWPkeeUn+mUmeivr++8jOaYvuekuumUmeivr+aPkOekulxyXG4gICAgICAgICAgICAgICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaG93VG9hc3QoJ+aSreaUvuW5v+WRiuWPkeeUn+mUmeivr++8jOS4jeWlluWKsScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvLyDlhbbku5bmg4XlhrXvvIzkuI3kvZzlpITnkIZcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5byV5a+855So5oi35YiG5Lqr5bqU55So57uZ5pyL5Y+L44CCXHJcbiAgICAgKiBcclxuICAgICAqIOmAmui/h+iwg+eUqE1pbmlHYW1lU2Rr55qEQVBJ5YiG5Lqr5Yqf6IO977yM5ZCR55So5oi355qE5pyL5Y+L5ZyI5Y+R6YCB6YKA6K+377yM6YKA6K+35LuW5Lus5LiA6LW3546p5ri45oiP44CCXHJcbiAgICAgKiDov5nmmK/kuIDkuKrph43opoHnmoTmjqjlub/miYvmrrXvvIzlj6/ku6Xlop7liqDlupTnlKjnmoTmm53lhYnluqblkoznlKjmiLfph4/jgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOaWueazleS4reiwg+eUqOeahEFQSeS+nei1luS6jueJueWumueahOWwj+a4uOaIj+W5s+WPsO+8jOWboOatpOWcqOS4jeWQjOeahOW5s+WPsOS4iuWPr+iDvemcgOimgeS4jeWQjOeahOWunueOsOOAglxyXG4gICAgICovXHJcbiAgICBvblNoYXJlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5zaGFyZUFwcFRvRnJpZW5kcygn5p2l546p5ri45oiP5ZCnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrkuIDkuKp0b2FzdOaPkOekuuOAglxyXG4gICAgICogXHJcbiAgICAgKiDpgJrov4fosIPnlKhNaW5pR2FtZVNka+eahEFQSeaWueazleadpeaYvuekuuS4gOS4queugOefreeahOaPkOekuuS/oeaBr+OAgnRvYXN05piv5LiA56eN6L276YeP57qn55qE5o+Q56S65pa55byP77yM55So5LqO5Zyo55WM6Z2i5LiK55+t5pqC5Zyw5bGV56S65LiA5Lqb5L+h5oGv77yM5LiN5b2x5ZON55So5oi35pON5L2c44CCXHJcbiAgICAgKiDov5nph4zkvb/nlKjkuoblm7rlrprnmoTmj5DnpLrmlofmnKwgJ+i/meaYr+S4gOS4qnRvYXN0J++8jOWcqOWunumZheW6lOeUqOS4re+8jOWPr+S7peagueaNrumcgOimgeWKqOaAgeiuvue9ruaPkOekuuaWh+acrOOAglxyXG4gICAgICovXHJcbiAgICBvblNob3dUb2FzdCgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1RvYXN0KCfov5nmmK/kuIDkuKp0b2FzdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5Y+R6K6+5aSH5oyv5Yqo5Yqf6IO944CCXHJcbiAgICAgKiBcclxuICAgICAqIOivpeaWueazleeUqOS6juiwg+eUqE1pbmlHYW1lU2Rr5o+Q5L6b55qEQVBJ77yM5Lul5a6e546w6K6+5aSH55qE5oyv5Yqo5Yqf6IO944CC5b2T6ZyA6KaB5o+Q6YaS55So5oi35oiW5o+Q5L6b6Kem6KeJ5Y+N6aaI5pe277yM5Y+v5Lul6LCD55So5q2k5pa55rOV44CCXHJcbiAgICAgKiDkvovlpoLvvIzlnKjmuLjmiI/miJblupTnlKjkuK3vvIzlvZPnlKjmiLflrozmiJDnibnlrprmk43kvZzmiJblj5HnlJ/nibnlrprkuovku7bml7bvvIzlj6/ku6XpgJrov4fmjK/liqjnu5nkuojnlKjmiLflj43ppojjgIJcclxuICAgICAqIFxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIOatpOaWueazleaXoOWPguaVsO+8jOS5n+S4jei/lOWbnuS7u+S9leWAvOOAglxyXG4gICAgICovXHJcbiAgICBvblZpcmJyYXRlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS52aWJyYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDph43mlrDlkK/liqjmuLjmiI/lrp7kvovjgIJcclxuICAgICAqIFxyXG4gICAgICog5q2k5Ye95pWw6LCD55SoTWluaUdhbWVTZGvkuK3nmoRBUEnph43mlrDlkK/liqjmuLjmiI/jgILph43mlrDlkK/liqjmk43kvZzlj6/og73mmK/kuLrkuobliJ3lp4vljJbmuLjmiI/njq/looPjgIHph43nva7muLjmiI/nirbmgIHmiJblpITnkIblhbbku5bpnIDopoHph43lkK/nmoTlnLrmma/jgIJcclxuICAgICAqIOiwg+eUqOatpOWHveaVsOWQju+8jOa4uOaIj+WwhuS8mumHjeaWsOW8gOWni++8jOW9k+WJjeeahOa4uOaIj+eKtuaAgeWwhuS8muiiq+a4hemZpOOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5Ye95pWw5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw44CCXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIOaXoOi/lOWbnuWAvOOAglxyXG4gICAgICovXHJcbiAgICBvblJlYm9vdCgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkucmVib290KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3lh73mlbDnlKjkuo7lnKjov7fkvaDmuLjmiI/kuK3lrp7njrDpgIDlh7rlip/og73jgIJcclxuICAgICAqIOWug+iwg+eUqOS6hk1pbmlHYW1lU2Rr5o+Q5L6b55qEQVBJ5pa55rOV5p2l6Kem5Y+R6YCA5Ye65pON5L2c44CCXHJcbiAgICAgKiDor6Xmlrnms5XpgJrluLjlnKjpnIDopoHnu5PmnZ/lvZPliY3ov7fkvaDmuLjmiI/miJbov5Tlm57liLDkuIrkuIDnuqfoj5zljZXml7booqvosIPnlKjjgIJcclxuICAgICAqL1xyXG4gICAgb25FeGl0KCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5leGl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmL7npLrliIbkuqvoj5zljZXjgIJcclxuICAgICAqIFxyXG4gICAgICog6YCa6L+H6LCD55SoTWluaUdhbWVTZGvnmoRBUEnmlrnms5XvvIzop6blj5HmmL7npLrliIbkuqvoj5zljZXnmoTmk43kvZzjgILmraTlh73mlbDml6jlnKjmj5DkvpvkuIDkuKrnu5/kuIDnmoTlhaXlj6PvvIxcclxuICAgICAqIOS7peS+v+WcqOmcgOimgeaXtui9u+advuiwg+eUqOWIhuS6q+WKn+iDve+8jOiAjOaXoOmcgOebtOaOpeS4juWFt+S9k+eahFNES+aOpeWPo+S6pOS6kuOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICog5q2k5pa55rOV5LiN5o6l5Y+X5Lu75L2V5Y+C5pWw77yM5Lmf5LiN6L+U5Zue5Lu75L2V5YC844CCXHJcbiAgICAgKi9cclxuICAgIG9uU2hvd1NoYXJlTWVudSgpIHtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuc2hvd1NoYXJlTWVudSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a+86Iiq5Yiw5oyH5a6a55qE5bCP5ri45oiP44CCXHJcbiAgICAgKiBcclxuICAgICAqIOacrOWHveaVsOeUqOS6juinpuWPkeWvvOiIquWIsOS4gOS4queJueWumueahOWwj+a4uOaIj+OAgui/memcgOimgeaPkOS+m+ebruagh+Wwj+a4uOaIj+eahElE77yMXHJcbiAgICAgKiDku6Xkvr/ns7vnu5/og73lpJ/mraPnoa7lnLDlsIbnlKjmiLfph43lrprlkJHliLDnm67moIflsI/muLjmiI/jgIJcclxuICAgICAqIFxyXG4gICAgICog5rOo5oSP77ya6L+Z6YeM55qEJ3h4eCfmmK/ljaDkvY3nrKbvvIzlrp7pmYXkvb/nlKjml7bpnIDopoHmm7/mjaLkuLrlhbfkvZPnmoTlsI/muLjmiI9JROOAglxyXG4gICAgICovXHJcbiAgICBvbk5hdmlnYXRlKCkge1xyXG4gICAgICAgIE1pbmlHYW1lU2RrLkFQSS5uYXZpZ2F0ZVRvKCd4eHgnKTsgLy8geHh45pu/5o2i5Li65L2g55qE5bCP5ri45oiPaWRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa/gOa0u+Wtl+iKgui3s+WKqOWFpeWPo+inhuWbvuOAglxyXG4gICAgICogXHJcbiAgICAgKiDmraTmlrnms5XnlKjkuo7lsIblrZfoioLot7PliqjlhaXlj6Pop4blm77orr7nva7kuLrmtLvot4PnirbmgIHjgILlvZPpnIDopoHlnKjnlKjmiLfnlYzpnaLkuK3mmL7npLrlrZfoioLot7PliqjnmoTlhaXlj6Pml7bvvIxcclxuICAgICAqIOWPr+S7peiwg+eUqOatpOaWueazleadpea/gOa0u+ebuOW6lOeahOinhuWbvuWFg+e0oO+8jOS9v+WFtuWvueeUqOaIt+WPr+ingeOAglxyXG4gICAgICovXHJcbiAgICBvbkJ5dGVkYW5jZUVudHJhbmNlVmlldygpIHtcclxuICAgICAgICAvLyB0aGlzLmVudHJhbmNlVmlldy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K+35rGC55m75b2V5Luj56CBXHJcbiAgICAgKiBcclxuICAgICAqIOacrOWHveaVsOeUqOS6juinpuWPkeWwj+eoi+W6j+eahOeZu+W9lea1geeoi++8jOiOt+WPluW+ruS/oeaIluWktOadoeetieesrOS4ieaWueW5s+WPsOeahOeZu+W9leS7o+eggeOAglxyXG4gICAgICog6L+Z5Lqb5Luj56CB5Y+v5Lul55So5LqO5ZCO57ut55qE55So5oi36Lqr5Lu96aqM6K+B5ZKM5pWw5o2u5ZCM5q2l5rWB56iL44CCXHJcbiAgICAgKi9cclxuICAgIG9uR2V0TG9naW5Db2RlKCkge1xyXG4gICAgICAgIC8vIOiwg+eUqE1pbmlHYW1lU2Rr55qEQVBJ55m75b2V5pa55rOV77yM5Lyg5YWl5LiA5Liq5Zue6LCD5Ye95pWw5aSE55CG55m75b2V57uT5p6cXHJcbiAgICAgICAgTWluaUdhbWVTZGsuQVBJLmxvZ2luKChjb2RlOiBzdHJpbmcsIGFub255bW91c0NvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAvLyDmiZPljbDlvq7kv6HmiJblpLTmnaHnmoTnmbvlvZXku6PnoIFcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dlY2hhdCBPciBCeXRlZGFuY2UgQ29kZTonLCBjb2RlKTtcclxuICAgICAgICAgICAgLy8g5omT5Y2w5aS05p2h55qE5Yy/5ZCN55m75b2V5Luj56CBXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCeXRlZGFuY2UgQW5vbnltb3VzIENvZGU6JywgYW5vbnltb3VzQ29kZSk7XHJcbiAgICAgICAgICAgIGlmKGNvZGUpe1xyXG4gICAgICAgICAgICAgICAgY2MuZnguR2FtZVRvb2wuZ2V0VXNlcklkKGNvZGUsIGRhdGEgPT4gdGhpcy5zZXRVc2VySWQoZGF0YSkpOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFVzZXJJZChkYXRhKXtcclxuICAgICAgICBjYy5meC5HYW1lQ29uZmlnLkdNX0lORk8udXNlcklkID0gZGF0YS5kYXRhLnVzZXJJZDtcclxuICAgICAgICBNaW5pR2FtZVNkay5BUEkuZ2V0VXNlckluZm8odGhpcy5zZXRVc2VySW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXNlckluZm8oZGF0YSl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bliLDnmoTnlKjmiLfkv6Hmga9cIixkYXRhLnVzZXJJbmZvKTtcclxuICAgICAgICB2YXIgdXNlRGF0YSA9IHtcclxuICAgICAgICAgICAgXCJnYW1lSWRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLmdhbWVJZCxcclxuICAgICAgICAgICAgXCJ1c2VySWRcIjogY2MuZnguR2FtZUNvbmZpZy5HTV9JTkZPLnVzZXJJZCxcclxuICAgICAgICAgICAgXCJuaWNrTmFtZVwiOmRhdGEudXNlckluZm8ubmlja05hbWUsXHJcbiAgICAgICAgICAgIFwicGljXCI6IGRhdGEudXNlckluZm8uYXZhdGFyVXJsXHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5Y2z5bCG5LiK5Lyg55qE55So5oi35L+h5oGvOlwiLGNjLmZ4LkdhbWVDb25maWcuR01fSU5GTy51c2VySWQsZGF0YS51c2VySW5mby5uaWNrTmFtZSxkYXRhLnVzZXJJbmZvLmF2YXRhclVybCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJQb3N05pWw5o2uOlwiLHVzZURhdGEpO1xyXG4gICAgICAgIGNjLmZ4Lkh0dHBVdGlsLnNldFVzZXJJbmZvKHVzZURhdGEsKHJlcyk9PntcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDmiJDlip86XCIscmVzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uuW5tuaYvuekuua4uOaIj+WciOaMiemSrlxyXG4gICAgICogXHJcbiAgICAgKiDmnKzlh73mlbDpgJrov4fosIPnlKhNaW5pR2FtZVNka+eahEdhbWVDbHVi5a6e5L6L5pa55rOV77yM5a6e546w5ri45oiP5L+x5LmQ6YOo55qE5Yib5bu65ZKM5pi+56S644CCXHJcbiAgICAgKiDlroPpppblhYjphY3nva7kv7HkuZDpg6jnmoTlm77moIfnsbvlnovlkozkvY3nva7lpKflsI/vvIznhLblkI7liJvlu7rkv7HkuZDpg6jvvIzmnIDlkI7mmL7npLrkv7HkuZDpg6jjgIJcclxuICAgICAqIOi/meagt+WBmuaYr+S4uuS6huWcqOWwj+a4uOaIj+WGheWIm+W7uuW5tuWxleekuuS4gOS4qua4uOaIj+S/seS5kOmDqOeahOWbvuagh++8jOS+m+eOqeWutuWKoOWFpeaIluS6kuWKqOOAglxyXG4gICAgICovXHJcbiAgICBvbkNyZWF0ZUNsdWIoKSB7XHJcbiAgICAgICAgLy8g6YWN572u5L+x5LmQ6YOo5Zu+5qCH5Li657u/6Imy77yM6K6+572u5Zu+5qCH55qE5L2N572u5Li66aG26YOoMjAw5YOP57Sg77yM5bem5L6nMOWDj+e0oFxyXG4gICAgICAgIE1pbmlHYW1lU2RrLkdhbWVDbHViLmluc3RhbmNlLmNyZWF0ZShcclxuICAgICAgICAgICAgTWluaUdhbWVTZGsuRUdhbWVDbHViSWNvbi5HUkVFTixcclxuICAgICAgICAgICAgeyB0b3A6IDIwMCwgbGVmdDogMCB9LFxyXG4gICAgICAgICAgICB7IHdpZHRoOiA1MCwgaGVpZ2h0OiA1MCB9KTtcclxuICAgICAgICAvLyDmmL7npLrmuLjmiI/kv7HkuZDpg6jlm77moIdcclxuICAgICAgICBNaW5pR2FtZVNkay5HYW1lQ2x1Yi5pbnN0YW5jZS5zaG93KCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|