/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { NbAuthIllegalTokenError, NbAuthResult, NbAuthStrategy } from '@nebular/auth'; import { of as observableOf } from 'rxjs'; import { switchMap, map, catchError, concatAll } from 'rxjs/operators'; import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { ActivatedRoute } from '@angular/router'; import { namePasswordStrategyOptions } from './name-password-strategy-option'; import * as JSEncrypt from 'jsencrypt'; var ResultError = /** @class */ (function () { function ResultError(message) { this.message = message; } return ResultError; }()); export { ResultError }; if (false) { /** @type {?} */ ResultError.prototype.message; } var NamePasswordStrategyService = /** @class */ (function (_super) { tslib_1.__extends(NamePasswordStrategyService, _super); function NamePasswordStrategyService(http, route) { var _this = _super.call(this) || this; _this.http = http; _this.route = route; _this.defaultOptions = namePasswordStrategyOptions; return _this; } /** * @param {?} options * @return {?} */ NamePasswordStrategyService.setup = /** * @param {?} options * @return {?} */ function (options) { return [NamePasswordStrategyService, options]; }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.authenticate = /** * @param {?=} data * @return {?} */ function (data) { var _this = this; /** @type {?} */ var module = 'login'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); /** @type {?} */ var requireValidToken = this.getOption(module + ".requireValidToken"); return this.getEncryptPassword(data.loginPassword).pipe(map((/** * @param {?} body * @return {?} */ function (body) { body.loginID = data.loginId; return _this.http.request(method, url, { body: body, observe: 'response' }) .pipe(map((/** * @param {?} res * @return {?} */ function (res) { if (_this.getOption(module + ".alwaysFail")) { throw _this.createFailResponse(data); } else if (!_this.getOption('success.getter')(module, res, _this.options)) { throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options)); } return res; })), map((/** * @param {?} res * @return {?} */ function (res) { return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options)); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); })), concatAll()); }; /** * @return {?} */ NamePasswordStrategyService.prototype.logout = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var module = 'logout'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); return observableOf({}) .pipe(switchMap((/** * @param {?} res * @return {?} */ function (res) { if (!url) { return observableOf(res); } return _this.http.request(method, url, { observe: 'response' }); })), map((/** * @param {?} res * @return {?} */ function (res) { if (_this.getOption(module + ".alwaysFail")) { throw _this.createFailResponse(); } return res; })), map((/** * @param {?} res * @return {?} */ function (res) { return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options)); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.refreshToken = /** * @param {?=} data * @return {?} */ function (data) { return undefined; }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.register = /** * @param {?=} data * @return {?} */ function (data) { return undefined; }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.requestPassword = /** * @param {?=} data * @return {?} */ function (data) { return undefined; }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.resetPassword = /** * @param {?=} data * @return {?} */ function (data) { var _this = this; /** @type {?} */ var module = 'resetPass'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); return this.getEncryptPassword(data.loginPasswordNew + '-' + data.loginPasswordOld).pipe(map((/** * @param {?} body * @return {?} */ function (body) { body.passwordData = body.loginPassword; return _this.http.request(method, url, { body: body, observe: 'response' }) .pipe(map((/** * @param {?} res * @return {?} */ function (res) { if (_this.getOption(module + ".alwaysFail")) { throw _this.createFailResponse(data); } else if (!_this.getOption('success.getter')(module, res, _this.options)) { throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options)); } return res; })), map((/** * @param {?} res * @return {?} */ function (res) { return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options)); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); })), concatAll()); }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.createUser = /** * @param {?=} data * @return {?} */ function (data) { var _this = this; /** @type {?} */ var module = 'createUser'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); return this.getEncryptPassword(data.loginPassword).pipe(map((/** * @param {?} body * @return {?} */ function (body) { body.userName = data.userName; body.loginID = data.loginID; return _this.http.request(method, url, { body: body, observe: 'response' }) .pipe(map((/** * @param {?} res * @return {?} */ function (res) { if (_this.getOption(module + ".alwaysFail")) { throw _this.createFailResponse(data); } else if (!_this.getOption('success.getter')(module, res, _this.options)) { throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options)); } return res; })), map((/** * @param {?} res * @return {?} */ function (res) { return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options)); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); })), concatAll()); }; /** * @param {?=} data * @return {?} */ NamePasswordStrategyService.prototype.updatePasswordForAdmin = /** * @param {?=} data * @return {?} */ function (data) { var _this = this; /** @type {?} */ var module = 'updatePasswordForAdmin'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); return this.getEncryptPassword(data.loginPassword).pipe(map((/** * @param {?} body * @return {?} */ function (body) { body.userID = data.userID; return _this.http.request(method, url, { body: body, observe: 'response' }) .pipe(map((/** * @param {?} res * @return {?} */ function (res) { if (_this.getOption(module + ".alwaysFail")) { throw _this.createFailResponse(data); } else if (!_this.getOption('success.getter')(module, res, _this.options)) { throw new ResultError(_this.getOption('messages.getter')(module, res, _this.options)); } return res; })), map((/** * @param {?} res * @return {?} */ function (res) { return new NbAuthResult(true, res, _this.getOption(module + ".redirect.success"), [], _this.getOption('messages.getter')(module, res, _this.options)); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); })), concatAll()); }; /** * @param {?} password * @return {?} */ NamePasswordStrategyService.prototype.getEncryptPassword = /** * @param {?} password * @return {?} */ function (password) { var _this = this; /** @type {?} */ var module = 'getPublicKey'; /** @type {?} */ var method = this.getOption(module + ".method"); /** @type {?} */ var url = this.getActionEndpoint(module); return this.http.request(method, url, { observe: 'response' }) .pipe(map((/** * @param {?} res * @return {?} */ function (res) { return encryptPassword(res.body, password); })), catchError((/** * @param {?} res * @return {?} */ function (res) { return _this.handleResponseError(res, module); }))); /** * @param {?} result * @param {?} data * @return {?} */ function encryptPassword(result, data) { /** @type {?} */ var now = Date.now(); /** @type {?} */ var encrypt = new JSEncrypt.JSEncrypt(); encrypt.setPublicKey(result.data.publicPEMKey); /** @type {?} */ var encryptPass = encrypt.encrypt(data + now); return { cryptoKeyID: result.data.cryptoKeyID, utcTimestamp: now, loginPassword: encryptPass }; } }; /** * @protected * @param {?} res * @param {?} module * @return {?} */ NamePasswordStrategyService.prototype.handleResponseError = /** * @protected * @param {?} res * @param {?} module * @return {?} */ function (res, module) { /** @type {?} */ var errors = []; if (res instanceof HttpErrorResponse) { errors = this.getOption('errors.getter')(module, res, this.options); } else if (res instanceof NbAuthIllegalTokenError) { errors.push(res.message); } else if (res instanceof ResultError) { errors = res.message; } else { errors.push('Something went wrong.'); } return observableOf(new NbAuthResult(false, res, this.getOption(module + ".redirect.failure"), errors)); }; NamePasswordStrategyService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NamePasswordStrategyService.ctorParameters = function () { return [ { type: HttpClient }, { type: ActivatedRoute } ]; }; return NamePasswordStrategyService; }(NbAuthStrategy)); export { NamePasswordStrategyService }; if (false) { /** * @type {?} * @protected */ NamePasswordStrategyService.prototype.defaultOptions; /** * @type {?} * @protected */ NamePasswordStrategyService.prototype.http; /** * @type {?} * @private */ NamePasswordStrategyService.prototype.route; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wYXNzd29yZC1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2UtYWRtaW4tYXV0aC8iLCJzb3VyY2VzIjpbImxpYi9zdHJhdGVneS9uYW1lLXBhc3N3b3JkLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLGNBQWMsRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFtQywyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9HLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBR3ZDO0lBQ0UscUJBQW1CLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7SUFFcEMsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7Ozs7SUFIYSw4QkFBd0I7O0FBS3RDO0lBQ2lELHVEQUFjO0lBUTdELHFDQUFzQixJQUFnQixFQUFVLEtBQXFCO1FBQXJFLFlBQ0UsaUJBQU8sU0FDUjtRQUZxQixVQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBSyxHQUFMLEtBQUssQ0FBZ0I7UUFGM0Qsb0JBQWMsR0FBb0MsMkJBQTJCLENBQUM7O0lBSXhGLENBQUM7Ozs7O0lBUk0saUNBQUs7Ozs7SUFBWixVQUFhLE9BQXdDO1FBQ25E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QUFJLEdBQUcsWUFBWSx1QkFBdUIsRUFBRTtZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQjthQUFNLElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztTQUN0QjthQUFNO1lBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxZQUFZLENBQ2pCLElBQUksWUFBWSxDQUNkLEtBQUssRUFDTCxHQUFHLEVBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBSSxNQUFNLHNCQUFtQixDQUFDLEVBQzVDLE1BQU0sQ0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDOztnQkEzT0YsVUFBVTs7OztnQkFiRixVQUFVO2dCQUVWLGNBQWM7O0lBdVB2QixrQ0FBQztDQUFBLEFBNU9ELENBQ2lELGNBQWMsR0EyTzlEO1NBM09ZLDJCQUEyQjs7Ozs7O0lBTXRDLHFEQUF3Rjs7Ozs7SUFFNUUsMkNBQTBCOzs7OztJQUFFLDRDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5CX0FVVEhfT1BUSU9OUyxcclxuICBOYkF1dGhJbGxlZ2FsVG9rZW5FcnJvcixcclxuICBOYkF1dGhSZXN1bHQsXHJcbiAgTmJBdXRoU3RyYXRlZ3ksIE5iQXV0aFN0cmF0ZWd5Q2xhc3NcclxufSBmcm9tICdAbmVidWxhci9hdXRoJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgbWFwLCBjYXRjaEVycm9yLCBjb25jYXRBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlLCBIdHRwUmVzcG9uc2VCYXNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyB0aHJvd0Vycm9yIGFzIF9vYnNlcnZhYmxlVGhyb3cgfSBmcm9tICdyeGpzL2luZGV4JztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zLCBuYW1lUGFzc3dvcmRTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuL25hbWUtcGFzc3dvcmQtc3RyYXRlZ3ktb3B0aW9uJztcclxuaW1wb3J0ICogYXMgSlNFbmNyeXB0IGZyb20gJ2pzZW5jcnlwdCc7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlc3VsdEVycm9yIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogU3RyaW5nW10pIHtcclxuXHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYW1lUGFzc3dvcmRTdHJhdGVneVNlcnZpY2UgZXh0ZW5kcyBOYkF1dGhTdHJhdGVneSB7XHJcblxyXG4gIHN0YXRpYyBzZXR1cChvcHRpb25zOiBOYW1lUGFzc3dvcmRBdXRoU3RyYXRlZ3lPcHRpb25zKTogW05iQXV0aFN0cmF0ZWd5Q2xhc3MsIE5hbWVQYXNzd29yZEF1dGhTdHJhdGVneU9wdGlvbnNdIHtcclxuICAgIHJldHVybiBbTmFtZVBhc3N3b3JkU3RyYXRlZ3lTZXJ2aWNlLCBvcHRpb25zXTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkZWZhdWx0T3B0aW9uczogTmFtZVBhc3N3b3JkQXV0aFN0cmF0ZWd5T3B0aW9ucyA9IG5hbWVQYXNzd29yZFN0cmF0ZWd5T3B0aW9ucztcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aGVudGljYXRlKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ2xvZ2luJztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICBjb25zdCByZXF1aXJlVmFsaWRUb2tlbiA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVxdWlyZVZhbGlkVG9rZW5gKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JZDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdsb2dvdXQnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuXHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHt9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHJlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hUb2tlbihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZWdpc3RlcihkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICByZXF1ZXN0UGFzc3dvcmQoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZChkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcclxuICAgIGNvbnN0IG1vZHVsZSA9ICdyZXNldFBhc3MnO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmROZXcgKyAnLScgKyBkYXRhLmxvZ2luUGFzc3dvcmRPbGQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkucGFzc3dvcmREYXRhID0gYm9keS5sb2dpblBhc3N3b3JkO1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgYm9keSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0uYWx3YXlzRmFpbGApKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVGYWlsUmVzcG9uc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZ2V0T3B0aW9uKCdzdWNjZXNzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3VsdEVycm9yKHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgbWFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOYkF1dGhSZXN1bHQoXHJcbiAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5yZWRpcmVjdC5zdWNjZXNzYCksXHJcbiAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzLCBtb2R1bGUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSksIGNvbmNhdEFsbCgpKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVzZXIoZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnY3JlYXRlVXNlcic7XHJcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9Lm1ldGhvZGApO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRBY3Rpb25FbmRwb2ludChtb2R1bGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5jcnlwdFBhc3N3b3JkKGRhdGEubG9naW5QYXNzd29yZCkucGlwZShtYXAoKGJvZHkpID0+IHtcclxuICAgICAgYm9keS51c2VyTmFtZSA9IGRhdGEudXNlck5hbWU7XHJcbiAgICAgIGJvZHkubG9naW5JRCA9IGRhdGEubG9naW5JRDtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG1ldGhvZCwgdXJsLCB7IGJvZHksIG9ic2VydmU6ICdyZXNwb25zZScgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LmFsd2F5c0ZhaWxgKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IHRoaXMuY3JlYXRlRmFpbFJlc3BvbnNlKGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdldE9wdGlvbignc3VjY2Vzcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBSZXN1bHRFcnJvcih0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ucmVkaXJlY3Quc3VjY2Vzc2ApLFxyXG4gICAgICAgICAgICAgIFtdLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdtZXNzYWdlcy5nZXR0ZXInKShtb2R1bGUsIHJlcywgdGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlcywgbW9kdWxlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pLCBjb25jYXRBbGwoKSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQYXNzd29yZEZvckFkbWluKGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgbW9kdWxlID0gJ3VwZGF0ZVBhc3N3b3JkRm9yQWRtaW4nO1xyXG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5tZXRob2RgKTtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QWN0aW9uRW5kcG9pbnQobW9kdWxlKTtcclxuICAgIHJldHVybiB0aGlzLmdldEVuY3J5cHRQYXNzd29yZChkYXRhLmxvZ2luUGFzc3dvcmQpLnBpcGUobWFwKChib2R5KSA9PiB7XHJcbiAgICAgIGJvZHkudXNlcklEID0gZGF0YS51c2VySUQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChtZXRob2QsIHVybCwgeyBib2R5LCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oYCR7bW9kdWxlfS5hbHdheXNGYWlsYCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUZhaWxSZXNwb25zZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5nZXRPcHRpb24oJ3N1Y2Nlc3MuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzdWx0RXJyb3IodGhpcy5nZXRPcHRpb24oJ21lc3NhZ2VzLmdldHRlcicpKG1vZHVsZSwgcmVzLCB0aGlzLm9wdGlvbnMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5iQXV0aFJlc3VsdChcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIHJlcyxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LnN1Y2Nlc3NgKSxcclxuICAgICAgICAgICAgICBbXSxcclxuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbignbWVzc2FnZXMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9KSwgY29uY2F0QWxsKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldEVuY3J5cHRQYXNzd29yZChwYXNzd29yZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBtb2R1bGUgPSAnZ2V0UHVibGljS2V5JztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0T3B0aW9uKGAke21vZHVsZX0ubWV0aG9kYCk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFjdGlvbkVuZHBvaW50KG1vZHVsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobWV0aG9kLCB1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGVuY3J5cHRQYXNzd29yZChyZXMuYm9keSwgcGFzc3dvcmQpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXMsIG1vZHVsZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuXHJcbiAgICBmdW5jdGlvbiBlbmNyeXB0UGFzc3dvcmQocmVzdWx0LCBkYXRhKSB7XHJcbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICBsZXQgZW5jcnlwdCA9IG5ldyBKU0VuY3J5cHQuSlNFbmNyeXB0KCk7XHJcbiAgICAgIGVuY3J5cHQuc2V0UHVibGljS2V5KHJlc3VsdC5kYXRhLnB1YmxpY1BFTUtleSk7XHJcbiAgICAgIGxldCBlbmNyeXB0UGFzcyA9IGVuY3J5cHQuZW5jcnlwdChkYXRhICsgbm93KTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjcnlwdG9LZXlJRDogcmVzdWx0LmRhdGEuY3J5cHRvS2V5SUQsXHJcbiAgICAgICAgdXRjVGltZXN0YW1wOiBub3csXHJcbiAgICAgICAgbG9naW5QYXNzd29yZDogZW5jcnlwdFBhc3NcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXM6IGFueSwgbW9kdWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xyXG4gICAgbGV0IGVycm9ycyA9IFtdO1xyXG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgIGVycm9ycyA9IHRoaXMuZ2V0T3B0aW9uKCdlcnJvcnMuZ2V0dGVyJykobW9kdWxlLCByZXMsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIE5iQXV0aElsbGVnYWxUb2tlbkVycm9yKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKHJlcy5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgUmVzdWx0RXJyb3IpIHtcclxuICAgICAgZXJyb3JzID0gcmVzLm1lc3NhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKFxyXG4gICAgICBuZXcgTmJBdXRoUmVzdWx0KFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHJlcyxcclxuICAgICAgICB0aGlzLmdldE9wdGlvbihgJHttb2R1bGV9LnJlZGlyZWN0LmZhaWx1cmVgKSxcclxuICAgICAgICBlcnJvcnNcclxuICAgICAgKSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=