UNPKG

ng-yunzai-mobile

Version:

1. 适配yunzai_uni_app_x

522 lines 36.2 kB
/** * @fileoverview added by tsickle * Generated from: devices/wechat.micro.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { BaseDevice } from "./base.device"; import { from } from "rxjs"; import { TokenService } from "../token/token.service"; import { UserService } from "../user/user.service"; import { HttpClient } from "@angular/common/http"; import { BASE_CLIENT } from "../client/base.client"; import { Inject, Injectable } from "@angular/core"; import { preloaderFinished } from "../auth/preloader"; import { Title } from "@angular/platform-browser"; import * as i0 from "@angular/core"; import * as i1 from "../token/token.service"; import * as i2 from "@angular/common/http"; import * as i3 from "../user/user.service"; import * as i4 from "@angular/platform-browser"; import * as i5 from "../client/base.client"; /** @type {?} */ var apis = [ "updateAppMessageShareData", "updateTimelineShareData", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareWeibo", "onMenuShareQZone", "startRecord", "stopRecord", "onVoiceRecordEnd", "playVoice", "pauseVoice", "stopVoice", "onVoicePlayEnd", "uploadVoice", "downloadVoice", "chooseImage", "previewImage", "uploadImage", "downloadImage", "translateVoice", "getNetworkType", "openLocation", "getLocation", "hideOptionMenu", "showOptionMenu", "hideMenuItems", "showMenuItems", "hideAllNonBaseMenuItem", "showAllNonBaseMenuItem", "closeWindow", "scanQRCode", "chooseWXPay", "openProductSpecificView", "addCard", "chooseCard", "openCard", ]; /** @type {?} */ var openTags = [ 'wx-open-launch-weapp', 'wx-open-launch-app', 'wx-open-subscribe', 'wx-open-audio' ]; var WechatMicro = /** @class */ (function (_super) { tslib_1.__extends(WechatMicro, _super); function WechatMicro(tokenService, http, user, title, baseclient) { var _this = _super.call(this) || this; _this.tokenService = tokenService; _this.http = http; _this.user = user; _this.title = title; _this.baseclient = baseclient; return _this; } /** * @return {?} */ WechatMicro.prototype.auth = /** * @return {?} */ function () { var _this = this; if (this.baseclient.wechatMicro && this.baseclient.wechatMicro.auth === false) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { preloaderFinished(); resolve(true); })); } return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { /** @type {?} */ var tokenInfo = {}; tokenInfo.account = _this.getUrlParam('account'); tokenInfo.accessToken = _this.getUrlParam('accessToken'); tokenInfo.userId = _this.getUrlParam('userId'); tokenInfo.tokenType = 'bearer'; _this.tokenService.set((/** @type {?} */ (tokenInfo))); _this.http .get(_this.baseclient.gateway + "/auth/user") .subscribe((/** * @param {?} response * @return {?} */ function (response) { // 设置user _this.user.set(tslib_1.__assign({}, response.principal, { tenantId: response.tenantId })); _this.generateWechatConfig(); // 加载结束 preloaderFinished(); resolve(true); })); })); }; /** * @return {?} */ WechatMicro.prototype.generateWechatConfig = /** * @return {?} */ function () { this.http .get(this.baseclient.gateway + "/wechat/mp/jssdk?url=" + encodeURIComponent(window.location.href)) .subscribe((/** * @param {?} response * @return {?} */ function (response) { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: response.appId, // 必填,公众号的唯一标识 timestamp: response.timestamp, // 必填,生成签名的时间戳 nonceStr: response.nonceStr, // 必填,生成签名的随机串 signature: response.signature, // 必填,签名 jsApiList: apis, // 必填,需要使用的JS接口列表 openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app'] }); })); wx.ready((/** * @return {?} */ function () { // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作, // 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 console.log('微信jssdk初始化完成.'); })); wx.error((/** * @param {?} res * @return {?} */ function (res) { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log('微信jssdk初始化失败:', res); })); }; /** * @param {?} iwindow * @return {?} */ WechatMicro.prototype.openWindow = /** * @param {?} iwindow * @return {?} */ function (iwindow) { window.location.href = iwindow.url; }; /** * @param {?} ititle * @return {?} */ WechatMicro.prototype.setTitle = /** * @param {?} ititle * @return {?} */ function (ititle) { this.title.setTitle(ititle.title); }; /** * @param {?} navigationBar * @return {?} */ WechatMicro.prototype.setNavigationBar = /** * @param {?} navigationBar * @return {?} */ function (navigationBar) { alert("小程序暂不支持放置按钮,请在APP中使用此功能!"); }; /** * @param {?} ishare * @return {?} */ WechatMicro.prototype.share = /** * @param {?} ishare * @return {?} */ function (ishare) { alert("小程序暂不支持分享,请在APP中使用此功能!"); }; /** * @return {?} */ WechatMicro.prototype.getToken = /** * @return {?} */ function () { /** @type {?} */ var itoken = { accessToken: this.tokenService.get().accessToken, tokenType: null, tokenDataLine: null, scope: null, }; return itoken; }; /** * @return {?} */ WechatMicro.prototype.scanCode = /** * @return {?} */ function () { /** @type {?} */ var p = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { wx.scanQRCode({ needResult: 1, scanType: ['qrCode', 'barCode'], success: (/** * @param {?} res * @return {?} */ function (res) { resolve(res.resultStr); }), }); })); return from(p); }; /** * @return {?} */ WechatMicro.prototype.userLocation = /** * @return {?} */ function () { /** @type {?} */ var p = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { wx.getLocation({ type: 'wgs84', success: // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' /** * @param {?} res * @return {?} */ function (res) { if (res.errMsg === 'getLocation:ok') { /** @type {?} */ var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 /** @type {?} */ var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 /** @type {?} */ var address = '微信无address'; resolve({ latitude: latitude, longitude: longitude, address: address }); } }, }); })); return from(p); }; /** * @param {?} bssids * @return {?} */ WechatMicro.prototype.validateInWifi = /** * @param {?} bssids * @return {?} */ function (bssids) { alert("小程序暂不支持WIFI验证,请在APP中使用此功能!"); return undefined; }; /** * @return {?} */ WechatMicro.prototype.getWifiMac = /** * @return {?} */ function () { alert("小程序暂不支持获取MAC地址,请在APP中使用此功能!"); return undefined; }; /** * @param {?} count * @return {?} */ WechatMicro.prototype.chooseContacts = /** * @param {?} count * @return {?} */ function (count) { alert("小程序暂不支持获取联系人,请在APP中使用此功能!"); return undefined; }; /** * @param {?} targetUserId * @return {?} */ WechatMicro.prototype.contactDetails = /** * @param {?} targetUserId * @return {?} */ function (targetUserId) { alert("小程序暂不支持查询联系人详细信息,请在APP中使用此功能!"); return undefined; }; /** * @param {?} count * @param {?} sourceType * @return {?} */ WechatMicro.prototype.uploadImage = /** * @param {?} count * @param {?} sourceType * @return {?} */ function (count, sourceType) { alert("小程序暂不支持图片上传,请在APP中使用此功能!"); return undefined; }; /** * @param {?} url * @param {?} openType * @param {?} title * @param {?} id * @param {?} type * @return {?} */ WechatMicro.prototype.openReadWithTimer = /** * @param {?} url * @param {?} openType * @param {?} title * @param {?} id * @param {?} type * @return {?} */ function (url, openType, title, id, type) { alert("小程序暂不支持读物时间统计,请在APP中使用此功能!"); return undefined; }; /** * @param {?} limitMinute * @return {?} */ WechatMicro.prototype.uploadMovie = /** * @param {?} limitMinute * @return {?} */ function (limitMinute) { alert("小程序暂不支持视频上传,请在APP中使用此功能!"); return undefined; }; /** * @param {?} url * @param {?} title * @return {?} */ WechatMicro.prototype.fileBrowser = /** * @param {?} url * @param {?} title * @return {?} */ function (url, title) { alert("小程序暂不支持此功能,请在APP中使用此功能!"); return undefined; }; /** * @param {?} ticket * @param {?} callback * @return {?} */ WechatMicro.prototype.startSearchBeacons = /** * @param {?} ticket * @param {?} callback * @return {?} */ function (ticket, callback) { wx.startSearchBeacons({ ticket: ticket, complete: callback, }); }; /** * @param {?} callback * @return {?} */ WechatMicro.prototype.stopSearchBeacons = /** * @param {?} callback * @return {?} */ function (callback) { wx.stopSearchBeacons({ complete: callback, }); }; /** * @param {?} callback * @return {?} */ WechatMicro.prototype.onSearchBeacons = /** * @param {?} callback * @return {?} */ function (callback) { wx.onSearchBeacons({ complete: callback, }); }; // 封装方法: 获取url中的参数 // 封装方法: 获取url中的参数 /** * @private * @param {?} name * @return {?} */ WechatMicro.prototype.getUrlParam = // 封装方法: 获取url中的参数 /** * @private * @param {?} name * @return {?} */ function (name) { // 构造一个含有目标参数的正则表达式对象 /** @type {?} */ var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); /** @type {?} */ var strings = window.location.href.split('?'); // 匹配目标参数 /** @type {?} */ var r = strings[strings.length - 1].match(reg); if (r != null) { return unescape(r[2]); } return null; }; WechatMicro.decorators = [ { type: Injectable, args: [{ providedIn: "root", },] } ]; /** @nocollapse */ WechatMicro.ctorParameters = function () { return [ { type: TokenService }, { type: HttpClient }, { type: UserService }, { type: Title }, { type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] } ]; }; /** @nocollapse */ WechatMicro.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMicro_Factory() { return new WechatMicro(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMicro, providedIn: "root" }); return WechatMicro; }(BaseDevice)); export { WechatMicro }; if (false) { /** * @type {?} * @private */ WechatMicro.prototype.tokenService; /** * @type {?} * @private */ WechatMicro.prototype.http; /** * @type {?} * @private */ WechatMicro.prototype.user; /** * @type {?} * @private */ WechatMicro.prototype.title; /** * @type {?} * @private */ WechatMicro.prototype.baseclient; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1pY3JvLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1pY3JvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7SUFFNUMsSUFBSSxHQUFHO0lBQ1gsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QixxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHdCQUF3QjtJQUN4Qix3QkFBd0I7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RCxxQ0FBZTs7OztJQUFmLFVBQWdCLFFBQTZCO1FBQzNDLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjs7Ozs7OztJQUNWLGlDQUFXOzs7Ozs7O0lBQW5CLFVBQW9CLElBQUk7OztZQUVoQixHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxlQUFlLENBQUM7O1lBQ2xELE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOzs7WUFFekMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O2dCQXJNRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7O2dCQTNEUSxZQUFZO2dCQUVaLFVBQVU7Z0JBRFYsV0FBVztnQkFLWCxLQUFLO2dEQTREVCxNQUFNLFNBQUMsV0FBVzs7O3NCQXRFdkI7Q0FtUUMsQUF0TUQsQ0FHaUMsVUFBVSxHQW1NMUM7U0FuTVksV0FBVzs7Ozs7O0lBRXBCLG1DQUFrQzs7Ozs7SUFDbEMsMkJBQXdCOzs7OztJQUN4QiwyQkFBeUI7Ozs7O0lBQ3pCLDRCQUFvQjs7Ozs7SUFDcEIsaUNBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZURldmljZSB9IGZyb20gXCIuL2Jhc2UuZGV2aWNlXCI7XHJcbmltcG9ydCB7IElTaGFyZSwgSVRpdGxlLCBJV2luZG93LCBOYXZpZ2F0aW9uQmFyLCBVc2VyTG9jYXRpb24gfSBmcm9tIFwiLi9tb2RlbFwiO1xyXG5pbXBvcnQgeyBJdG9rZW4gfSBmcm9tIFwiLi4vYXV0aFwiO1xyXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3VzZXIvdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgQkFTRV9DTElFTlQsIEJhc2VDbGllbnQgfSBmcm9tIFwiLi4vY2xpZW50L2Jhc2UuY2xpZW50XCI7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IHByZWxvYWRlckZpbmlzaGVkIH0gZnJvbSBcIi4uL2F1dGgvcHJlbG9hZGVyXCI7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcclxuXHJcbmNvbnN0IGFwaXMgPSBbXHJcbiAgXCJ1cGRhdGVBcHBNZXNzYWdlU2hhcmVEYXRhXCIsXHJcbiAgXCJ1cGRhdGVUaW1lbGluZVNoYXJlRGF0YVwiLFxyXG4gIFwib25NZW51U2hhcmVUaW1lbGluZVwiLFxyXG4gIFwib25NZW51U2hhcmVBcHBNZXNzYWdlXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFRXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVdlaWJvXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFab25lXCIsXHJcbiAgXCJzdGFydFJlY29yZFwiLFxyXG4gIFwic3RvcFJlY29yZFwiLFxyXG4gIFwib25Wb2ljZVJlY29yZEVuZFwiLFxyXG4gIFwicGxheVZvaWNlXCIsXHJcbiAgXCJwYXVzZVZvaWNlXCIsXHJcbiAgXCJzdG9wVm9pY2VcIixcclxuICBcIm9uVm9pY2VQbGF5RW5kXCIsXHJcbiAgXCJ1cGxvYWRWb2ljZVwiLFxyXG4gIFwiZG93bmxvYWRWb2ljZVwiLFxyXG4gIFwiY2hvb3NlSW1hZ2VcIixcclxuICBcInByZXZpZXdJbWFnZVwiLFxyXG4gIFwidXBsb2FkSW1hZ2VcIixcclxuICBcImRvd25sb2FkSW1hZ2VcIixcclxuICBcInRyYW5zbGF0ZVZvaWNlXCIsXHJcbiAgXCJnZXROZXR3b3JrVHlwZVwiLFxyXG4gIFwib3BlbkxvY2F0aW9uXCIsXHJcbiAgXCJnZXRMb2NhdGlvblwiLFxyXG4gIFwiaGlkZU9wdGlvbk1lbnVcIixcclxuICBcInNob3dPcHRpb25NZW51XCIsXHJcbiAgXCJoaWRlTWVudUl0ZW1zXCIsXHJcbiAgXCJzaG93TWVudUl0ZW1zXCIsXHJcbiAgXCJoaWRlQWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJzaG93QWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJjbG9zZVdpbmRvd1wiLFxyXG4gIFwic2NhblFSQ29kZVwiLFxyXG4gIFwiY2hvb3NlV1hQYXlcIixcclxuICBcIm9wZW5Qcm9kdWN0U3BlY2lmaWNWaWV3XCIsXHJcbiAgXCJhZGRDYXJkXCIsXHJcbiAgXCJjaG9vc2VDYXJkXCIsXHJcbiAgXCJvcGVuQ2FyZFwiLFxyXG5dO1xyXG5cclxuY29uc3Qgb3BlblRhZ3MgPSBbXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLXdlYXBwJyxcclxuICAnd3gtb3Blbi1sYXVuY2gtYXBwJyxcclxuICAnd3gtb3Blbi1zdWJzY3JpYmUnLFxyXG4gICd3eC1vcGVuLWF1ZGlvJ1xyXG5dO1xyXG5cclxuZGVjbGFyZSBsZXQgd3g7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWNoYXRNaWNybyBleHRlbmRzIEJhc2VEZXZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIEBJbmplY3QoQkFTRV9DTElFTlQpIHByaXZhdGUgYmFzZWNsaWVudDogQmFzZUNsaWVudFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGF1dGgoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQud2VjaGF0TWljcm8gJiYgdGhpcy5iYXNlY2xpZW50LndlY2hhdE1pY3JvLmF1dGggPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCB0b2tlbkluZm86IGFueSA9IHt9O1xyXG4gICAgICB0b2tlbkluZm8uYWNjb3VudCA9IHRoaXMuZ2V0VXJsUGFyYW0oJ2FjY291bnQnKTtcclxuICAgICAgdG9rZW5JbmZvLmFjY2Vzc1Rva2VuID0gdGhpcy5nZXRVcmxQYXJhbSgnYWNjZXNzVG9rZW4nKTtcclxuICAgICAgdG9rZW5JbmZvLnVzZXJJZCA9IHRoaXMuZ2V0VXJsUGFyYW0oJ3VzZXJJZCcpO1xyXG4gICAgICB0b2tlbkluZm8udG9rZW5UeXBlID0gJ2JlYXJlcic7XHJcbiAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLnNldCh0b2tlbkluZm8gYXMgYW55KTtcclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vYXV0aC91c2VyYClcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyDorr7nva51c2VyXHJcbiAgICAgICAgICB0aGlzLnVzZXIuc2V0KHsgLi4ucmVzcG9uc2UucHJpbmNpcGFsLCB0ZW5hbnRJZDogcmVzcG9uc2UudGVuYW50SWQgfSk7XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlV2VjaGF0Q29uZmlnKCk7XHJcbiAgICAgICAgICAvLyDliqDovb3nu5PmnZ9cclxuICAgICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVdlY2hhdENvbmZpZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS93ZWNoYXQvbXAvanNzZGs/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgd3guY29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiBmYWxzZSwgLy8g5byA5ZCv6LCD6K+V5qih5byPLOiwg+eUqOeahOaJgOaciWFwaeeahOi/lOWbnuWAvOS8muWcqOWuouaIt+err2FsZXJ05Ye65p2l77yM6Iul6KaB5p+l55yL5Lyg5YWl55qE5Y+C5pWw77yM5Y+v5Lul5ZyocGPnq6/miZPlvIDvvIzlj4LmlbDkv6Hmga/kvJrpgJrov4dsb2fmiZPlh7rvvIzku4XlnKhwY+err+aXtuaJjeS8muaJk+WNsOOAglxyXG4gICAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcElkLCAvLyDlv4XloavvvIzlhazkvJflj7fnmoTllK/kuIDmoIfor4ZcclxuICAgICAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UudGltZXN0YW1wLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTml7bpl7TmiLNcclxuICAgICAgICAgIG5vbmNlU3RyOiByZXNwb25zZS5ub25jZVN0ciwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE6ZqP5py65LiyXHJcbiAgICAgICAgICBzaWduYXR1cmU6IHJlc3BvbnNlLnNpZ25hdHVyZSwgLy8g5b+F5aGr77yM562+5ZCNXHJcbiAgICAgICAgICBqc0FwaUxpc3Q6IGFwaXMsIC8vIOW/heWhq++8jOmcgOimgeS9v+eUqOeahEpT5o6l5Y+j5YiX6KGoXHJcbiAgICAgICAgICBvcGVuVGFnTGlzdDogb3BlblRhZ3MgLy8g5Y+v6YCJ77yM6ZyA6KaB5L2/55So55qE5byA5pS+5qCH562+5YiX6KGo77yM5L6L5aaCWyd3eC1vcGVuLWxhdW5jaC1hcHAnXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIHd4LnJlYWR5KCgpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5ZCO5Lya5omn6KGMcmVhZHnmlrnms5XvvIzmiYDmnInmjqXlj6PosIPnlKjpg73lv4XpobvlnKhjb25maWfmjqXlj6Pojrflvpfnu5PmnpzkuYvlkI7vvIxjb25maWfmmK/kuIDkuKrlrqLmiLfnq6/nmoTlvILmraXmk43kvZzvvIxcclxuICAgICAgLy8g5omA5Lul5aaC5p6c6ZyA6KaB5Zyo6aG16Z2i5Yqg6L295pe25bCx6LCD55So55u45YWz5o6l5Y+j77yM5YiZ6aG75oqK55u45YWz5o6l5Y+j5pS+5ZyocmVhZHnlh73mlbDkuK3osIPnlKjmnaXnoa7kv53mraPnoa7miafooYzjgILlr7nkuo7nlKjmiLfop6blj5Hml7bmiY3osIPnlKjnmoTmjqXlj6PvvIzliJnlj6/ku6Xnm7TmjqXosIPnlKjvvIzkuI3pnIDopoHmlL7lnKhyZWFkeeWHveaVsOS4reOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblrozmiJAuJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3eC5lcnJvcigocmVzKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWksei0peS8muaJp+ihjGVycm9y5Ye95pWw77yM5aaC562+5ZCN6L+H5pyf5a+86Ie06aqM6K+B5aSx6LSl77yM5YW35L2T6ZSZ6K+v5L+h5oGv5Y+v5Lul5omT5byAY29uZmln55qEZGVidWfmqKHlvI/mn6XnnIvvvIzkuZ/lj6/ku6XlnKjov5Tlm57nmoRyZXPlj4LmlbDkuK3mn6XnnIvvvIzlr7nkuo5TUEHlj6/ku6XlnKjov5nph4zmm7TmlrDnrb7lkI3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5aSx6LSlOicsIHJlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5XaW5kb3coaXdpbmRvdzogSVdpbmRvdyk6IHZvaWQge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpd2luZG93LnVybDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKGl0aXRsZTogSVRpdGxlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKGl0aXRsZS50aXRsZSk7XHJcbiAgfVxyXG5cclxuICBzZXROYXZpZ2F0aW9uQmFyKG5hdmlnYXRpb25CYXI6IE5hdmlnYXRpb25CYXIpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5pS+572u5oyJ6ZKuLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgfVxyXG5cclxuICBzaGFyZShpc2hhcmU6IElTaGFyZSk6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHliIbkuqss6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IEl0b2tlbiB7XHJcbiAgICBjb25zdCBpdG9rZW46IEl0b2tlbiA9IHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpLmFjY2Vzc1Rva2VuLFxyXG4gICAgICB0b2tlblR5cGU6IG51bGwsXHJcbiAgICAgIHRva2VuRGF0YUxpbmU6IG51bGwsXHJcbiAgICAgIHNjb3BlOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpdG9rZW47XHJcbiAgfVxyXG5cclxuICBzY2FuQ29kZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5zY2FuUVJDb2RlKHtcclxuICAgICAgICBuZWVkUmVzdWx0OiAxLFxyXG4gICAgICAgIHNjYW5UeXBlOiBbJ3FyQ29kZScsICdiYXJDb2RlJ10sXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcy5yZXN1bHRTdHIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHVzZXJMb2NhdGlvbigpOiBPYnNlcnZhYmxlPFVzZXJMb2NhdGlvbj4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPFVzZXJMb2NhdGlvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5nZXRMb2NhdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ3dnczg0JywgLy8g6buY6K6k5Li6d2dzODTnmoRncHPlnZDmoIfvvIzlpoLmnpzopoHov5Tlm57nm7TmjqXnu5lvcGVuTG9jYXRpb27nlKjnmoTngavmmJ/lnZDmoIfvvIzlj6/kvKDlhaUnZ2NqMDInXHJcbiAgICAgICAgc3VjY2VzcyhyZXM6IGFueSkge1xyXG4gICAgICAgICAgaWYgKHJlcy5lcnJNc2cgPT09ICdnZXRMb2NhdGlvbjpvaycpIHtcclxuICAgICAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSByZXMubGF0aXR1ZGU7IC8vIOe6rOW6pu+8jOa1rueCueaVsO+8jOiMg+WbtOS4ujkwIH4gLTkwXHJcbiAgICAgICAgICAgIGNvbnN0IGxvbmdpdHVkZSA9IHJlcy5sb25naXR1ZGU7IC8vIOe7j+W6pu+8jOa1rueCueaVsO+8jOiMg+WbtOS4ujE4MCB+IC0xODDjgIJcclxuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9ICflvq7kv6Hml6BhZGRyZXNzJztcclxuICAgICAgICAgICAgcmVzb2x2ZSh7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWRkcmVzc30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlSW5XaWZpKGJzc2lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyBV0lGSemqjOivgSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldFdpZmlNYWMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6I635Y+WTUFD5Zyw5Z2ALOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY2hvb3NlQ29udGFjdHMoY291bnQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeiOt+WPluiBlOezu+S6uizor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNvbnRhY3REZXRhaWxzKHRhcmdldFVzZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5p+l6K+i6IGU57O75Lq66K+m57uG5L+h5oGvLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkSW1hZ2UoY291bnQ6IG51bWJlciwgc291cmNlVHlwZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5Zu+54mH5LiK5LygLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgb3BlblJlYWRXaXRoVGltZXIoXHJcbiAgICB1cmw6IGFueSxcclxuICAgIG9wZW5UeXBlOiBhbnksXHJcbiAgICB0aXRsZTogYW55LFxyXG4gICAgaWQ6IGFueSxcclxuICAgIHR5cGU6IGFueVxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeivu+eJqeaXtumXtOe7n+iuoSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHVwbG9hZE1vdmllKGxpbWl0TWludXRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHop4bpopHkuIrkvKAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBmaWxlQnJvd3Nlcih1cmw6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeatpOWKn+iDvSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoQmVhY29ucyh0aWNrZXQ6IHN0cmluZywgY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0YXJ0U2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIHRpY2tldDogdGlja2V0LFxyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0b3BTZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG9uU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3gub25TZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDlsIHoo4Xmlrnms5U6IOiOt+WPlnVybOS4reeahOWPguaVsFxyXG4gIHByaXZhdGUgZ2V0VXJsUGFyYW0obmFtZSk6IHN0cmluZyB7XHJcbiAgICAvLyDmnoTpgKDkuIDkuKrlkKvmnInnm67moIflj4LmlbDnmoTmraPliJnooajovr7lvI/lr7nosaFcclxuICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoJyhefCYpJyArIG5hbWUgKyAnPShbXiZdKikoJnwkKScpO1xyXG4gICAgY29uc3Qgc3RyaW5ncyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/Jyk7XHJcbiAgICAvLyDljLnphY3nm67moIflj4LmlbBcclxuICAgIGNvbnN0IHIgPSBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0ubWF0Y2gocmVnKTtcclxuICAgIGlmIChyICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHVuZXNjYXBlKHJbMl0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==