UNPKG

io.parrots

Version:

Parrots.io App

443 lines (442 loc) 53.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Headers, RequestOptions } from '@angular/http'; import { AbstractServerResource } from 'com.phloxui'; export class ParrotsAccountResource extends AbstractServerResource { /** * @param {?} connectionMgr */ constructor(connectionMgr) { super(connectionMgr); this.basePath = './account'; } /** * @param {?} options * @param {?} headerData * @return {?} */ addingHeaderRequestOptionsArgs(options, headerData) { if (options === null || typeof options === 'undefined') { options = new RequestOptions(); } if (headerData !== null && typeof headerData !== 'undefined') { if (options.headers !== null && typeof options.headers !== 'undefined') { for (let /** @type {?} */ key in headerData) { options.headers.set(key, headerData[key]); } } else { options.headers = new Headers(headerData); } } return options; } /** * @param {?} body * @return {?} */ changePasswordWithHttpInfo(body) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/recovery/setpassword"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} body * @return {?} */ changePassword(body) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/recovery/setpassword"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); let /** @type {?} */ responseProm = this.connectionMgr.post(url, body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} email * @return {?} */ sendEmailChangePasswordWithHttpInfo(email) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/recovery/request"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = { email: email }; let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} email * @return {?} */ sendEmailChangePassword(email) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/recovery/request"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = { email: email }; let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} body * @return {?} */ sendEmailValidationAccountWithHttpInfo(body) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/sendemailvalidationaccount"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = body; let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} body * @return {?} */ sendEmailValidationAccount(body) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/sendemailvalidationaccount"; //! for testing let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = body; let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} userId * @param {?} secret * @return {?} */ activateAccountWithHttpInfo(userId, secret) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/activate/confirm?userId=" + userId + "&secret=" + secret; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); let /** @type {?} */ body = { userId: userId, secret: secret }; let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} value * @return {?} */ getAccountsInfo(value) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + ""; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, value, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} body * @return {?} */ getAccountsInfos(body) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/search"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} username * @param {?} password * @return {?} */ loginWithHttpInfo(username, password) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/login"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = { "userId": username, "password": password, "client": {} }; return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); } else { Promise.reject(null); } } /** * @param {?} createAccountDTO * @return {?} */ registerWithHttpInfo(createAccountDTO) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/register"; //! for testing let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = createAccountDTO; let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} createAccountDTO * @return {?} */ register(createAccountDTO) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/register"; //! for testing let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = createAccountDTO; let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} req * @return {?} */ checkWithHttpInfo(req) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/check"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = { "userId": req.username, "email": req.email }; let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} req * @return {?} */ check(req) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/check"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); requestOptionsArgs.body = { "userId": req.username, "email": req.email }; let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs); if (responseProm != null && typeof responseProm !== 'undefined') { return new Promise((resolve, reject) => { responseProm.then((response) => { resolve(response); }, (error) => { reject(error); }); }); } } return new Promise((resolve, reject) => { resolve(null); }); } /** * @param {?} authenProvider * @param {?} clientId * @param {?} token * @param {?=} clientName * @param {?=} clientData * @return {?} */ oauthLoginWithHttpInfo(authenProvider, clientId, token, clientName, clientData) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/oauth/login"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); this.addingHeaderRequestOptionsArgs(requestOptionsArgs, { "Token": token, "Authen-Provider": authenProvider, "Client-Id": clientId, "Client-Name": clientName }); requestOptionsArgs.body = (clientData !== undefined && clientData !== null) ? clientData : {}; return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); } else { Promise.reject(null); } } /** * @param {?} authenProvider * @param {?} clientId * @param {?} token * @param {?} registerDTO * @return {?} */ createOauthWithHttpInfo(authenProvider, clientId, token, registerDTO) { if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') { let /** @type {?} */ url = this.basePath + "/oauth"; let /** @type {?} */ requestOptionsArgs = new RequestOptions(); this.addingHeaderRequestOptionsArgs(requestOptionsArgs, { "Token": token, "Authen-Provider": authenProvider, "Client-Id": clientId }); // registerDTO as "userId" // { // "userId": "string", // "password": "string", // "email": "string", // "firstName": "string", // "lastName": "string" // } requestOptionsArgs.body = (registerDTO !== undefined && registerDTO !== null) ? registerDTO : {}; return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs); } else { Promise.reject(null); } } } function ParrotsAccountResource_tsickle_Closure_declarations() { /** @type {?} */ ParrotsAccountResource.prototype.basePath; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0FjY291bnRSZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvLnBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvc2hhcmUvcmVzb3VyY2UvUGFycm90c0FjY291bnRSZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFrQixPQUFPLEVBQUUsY0FBYyxFQUEyRSxNQUFNLGVBQWUsQ0FBQztBQUdqSixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJckQsTUFBTSw2QkFBOEIsU0FBUSxzQkFBc0I7Ozs7SUFJaEUsWUFBWSxhQUFpQztRQUMzQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBSEosV0FBVztLQUk3Qjs7Ozs7O0lBRU8sOEJBQThCLENBQUMsT0FBMkIsRUFBRSxVQUFzQztRQUN4RyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7U0FDaEM7UUFFRCxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxDQUFDLHFCQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUs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QUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUUzQyxxQkFBSSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDdEQsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsaUJBQWlCLEVBQUUsY0FBYztnQkFDakMsV0FBVyxFQUFFLFFBQVE7YUFDdEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7WUFTSCxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFLLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBRTlGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCOztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cCwgUmVzcG9uc2UsIEhlYWRlcnMsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc0FyZ3MsIFVSTFNlYXJjaFBhcmFtcywgUmVzcG9uc2VDb250ZW50VHlwZSwgUmVxdWVzdE1ldGhvZCB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNlcnZlclJlc291cmNlIH0gZnJvbSAnY29tLnBobG94dWknO1xuaW1wb3J0IHsgRmFjZWJvb2tMb2dpblByb3ZpZGVyLCBHb29nbGVMb2dpblByb3ZpZGVyIH0gZnJvbSAnYW5ndWxhci02LXNvY2lhbC1sb2dpbic7XG5pbXBvcnQgeyBDcmVhdGVBY2NvdW50RFRPLCBTZXggfSBmcm9tICcuLi9tb2RlbC9tb2RlbHMnO1xuXG5leHBvcnQgY2xhc3MgUGFycm90c0FjY291bnRSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0U2VydmVyUmVzb3VyY2Uge1xuXG4gIHByaXZhdGUgYmFzZVBhdGggPSAnLi9hY2NvdW50JztcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uTWdyOiBJQ29ubmVjdGlvbk1hbmFnZXIpIHtcbiAgICBzdXBlcihjb25uZWN0aW9uTWdyKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkaW5nSGVhZGVyUmVxdWVzdE9wdGlvbnNBcmdzKG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zQXJncywgaGVhZGVyRGF0YTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0pOiBSZXF1ZXN0T3B0aW9uc0FyZ3Mge1xuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgIH1cblxuICAgIGlmIChoZWFkZXJEYXRhICE9PSBudWxsICYmIHR5cGVvZiBoZWFkZXJEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9ucy5oZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gaGVhZGVyRGF0YSkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoa2V5LCBoZWFkZXJEYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhoZWFkZXJEYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXNzd29yZFdpdGhIdHRwSW5mbyhib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9zZXRwYXNzd29yZFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdFdpdGhIdHRwSW5mbyh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXNzd29yZChib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9zZXRwYXNzd29yZFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kRW1haWxDaGFuZ2VQYXNzd29yZFdpdGhIdHRwSW5mbyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uTWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb25NZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VQYXRoICsgXCIvcmVjb3ZlcnkvcmVxdWVzdFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IHtcbiAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmRFbWFpbENoYW5nZVBhc3N3b3JkKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9yZXF1ZXN0XCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEVtYWlsVmFsaWRhdGlvbkFjY291bnRXaXRoSHR0cEluZm8oYm9keTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9zZW5kZW1haWx2YWxpZGF0aW9uYWNjb3VudFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IGJvZHk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdFdpdGhIdHRwSW5mbyh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEVtYWlsVmFsaWRhdGlvbkFjY291bnQoYm9keTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uTWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb25NZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VQYXRoICsgXCIvc2VuZGVtYWlsdmFsaWRhdGlvbmFjY291bnRcIjtcblxuICAgICAgLy8hIGZvciB0ZXN0aW5nXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IGJvZHk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVBY2NvdW50V2l0aEh0dHBJbmZvKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2FjdGl2YXRlL2NvbmZpcm0/dXNlcklkPVwiICsgdXNlcklkICsgXCImc2VjcmV0PVwiICsgc2VjcmV0O1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICBsZXQgYm9keSA9IHtcbiAgICAgICAgdXNlcklkOiB1c2VySWQsXG4gICAgICAgIHNlY3JldDogc2VjcmV0XG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCBib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHNJbmZvKHZhbHVlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIlwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCB2YWx1ZSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHNJbmZvcyhib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9zZWFyY2hcIjtcblxuICAgICAgbGV0IHJlcXVlc3RPcHRpb25zQXJncyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgICAgbGV0IHJlc3BvbnNlUHJvbSA9IHRoaXMuY29ubmVjdGlvbk1nci5wb3N0V2l0aEh0dHBJbmZvKHVybCwgYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9naW5XaXRoSHR0cEluZm8odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2xvZ2luXCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBcInVzZXJJZFwiOiB1c2VybmFtZSxcbiAgICAgICAgXCJwYXNzd29yZFwiOiBwYXNzd29yZCxcbiAgICAgICAgXCJjbGllbnRcIjoge1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlamVjdChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJXaXRoSHR0cEluZm8oY3JlYXRlQWNjb3VudERUTzogQ3JlYXRlQWNjb3VudERUTyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL3JlZ2lzdGVyXCI7XG5cbiAgICAgIC8vISBmb3IgdGVzdGluZ1xuICAgICAgbGV0IHJlcXVlc3RPcHRpb25zQXJncyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLmJvZHkgPSBjcmVhdGVBY2NvdW50RFRPO1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKGNyZWF0ZUFjY291bnREVE86IENyZWF0ZUFjY291bnREVE8pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWdpc3RlclwiO1xuXG4gICAgICAvLyEgZm9yIHRlc3RpbmdcbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0gY3JlYXRlQWNjb3VudERUTztcblxuICAgICAgbGV0IHJlc3BvbnNlUHJvbSA9IHRoaXMuY29ubmVjdGlvbk1nci5wb3N0KHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzLmJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1dpdGhIdHRwSW5mbyhyZXE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2NoZWNrXCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBcInVzZXJJZFwiOiByZXEudXNlcm5hbWUsXG4gICAgICAgIFwiZW1haWxcIjogcmVxLmVtYWlsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgIC