@nebular/auth
Version:
@nebular/auth
65 lines • 24.5 kB
JavaScript
/**
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { NB_AUTH_OPTIONS } from '../../auth.options';
import { getDeepFromObject } from '../../helpers';
import * as i0 from "@angular/core";
import * as i1 from "../../services/auth.service";
import * as i2 from "@angular/router";
import * as i3 from "@angular/common";
import * as i4 from "@nebular/theme";
import * as i5 from "@angular/forms";
export class NbResetPasswordComponent {
constructor(service, options = {}, cd, router) {
this.service = service;
this.options = options;
this.cd = cd;
this.router = router;
this.redirectDelay = 0;
this.showMessages = {};
this.strategy = '';
this.submitted = false;
this.errors = [];
this.messages = [];
this.user = {};
this.redirectDelay = this.getConfigValue('forms.resetPassword.redirectDelay');
this.showMessages = this.getConfigValue('forms.resetPassword.showMessages');
this.strategy = this.getConfigValue('forms.resetPassword.strategy');
}
resetPass() {
this.errors = this.messages = [];
this.submitted = true;
this.service.resetPassword(this.strategy, this.user).subscribe((result) => {
this.submitted = false;
if (result.isSuccess()) {
this.messages = result.getMessages();
}
else {
this.errors = result.getErrors();
}
const redirect = result.getRedirect();
if (redirect) {
setTimeout(() => {
return this.router.navigateByUrl(redirect);
}, this.redirectDelay);
}
this.cd.detectChanges();
});
}
getConfigValue(key) {
return getDeepFromObject(this.options, key, null);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NbResetPasswordComponent, deps: [{ token: i1.NbAuthService }, { token: NB_AUTH_OPTIONS }, { token: i0.ChangeDetectorRef }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: NbResetPasswordComponent, selector: "nb-reset-password-page", ngImport: i0, template: "<h1 id=\"title\" class=\"title\">Change password</h1>\n<p class=\"sub-title\">Please set a new password</p>\n\n<nb-alert *ngIf=\"showMessages.error && errors?.length && !submitted\" outline=\"danger\" role=\"alert\">\n <p class=\"alert-title\"><b>Oh snap!</b></p>\n <ul class=\"alert-message-list\">\n <li *ngFor=\"let error of errors\" class=\"alert-message\">{{ error }}</li>\n </ul>\n</nb-alert>\n\n<nb-alert *ngIf=\"showMessages.success && messages?.length && !submitted\" outline=\"success\" role=\"alert\">\n <p class=\"alert-title\"><b>Hooray!</b></p>\n <ul class=\"alert-message-list\">\n <li *ngFor=\"let message of messages\" class=\"alert-message\">{{ message }}</li>\n </ul>\n</nb-alert>\n\n<form (ngSubmit)=\"resetPass()\" #resetPassForm=\"ngForm\" aria-labelledby=\"title\">\n\n <div class=\"form-control-group\">\n <label class=\"label\" for=\"input-password\">New Password:</label>\n <input nbInput\n [(ngModel)]=\"user.password\"\n #password=\"ngModel\"\n type=\"password\"\n id=\"input-password\"\n name=\"password\"\n class=\"first\"\n placeholder=\"New Password\"\n autofocus\n fullWidth\n fieldSize=\"large\"\n [status]=\"password.dirty ? (password.invalid ? 'danger' : 'success') : 'basic'\"\n [required]=\"getConfigValue('forms.validation.password.required')\"\n [minlength]=\"getConfigValue('forms.validation.password.minLength')\"\n [maxlength]=\"getConfigValue('forms.validation.password.maxLength')\"\n [attr.aria-invalid]=\"password.invalid && password.touched ? true : null\">\n <ng-container *ngIf=\"password.invalid && password.touched\">\n <p class=\"caption status-danger\" *ngIf=\"password.errors?.required\">\n Password is required!\n </p>\n <p class=\"caption status-danger\" *ngIf=\"password.errors?.minlength || password.errors?.maxlength\">\n Password should contains\n from {{getConfigValue('forms.validation.password.minLength')}}\n to {{getConfigValue('forms.validation.password.maxLength')}}\n characters\n </p>\n </ng-container>\n </div>\n\n <div class=\"form-group\">\n <label class=\"label\" for=\"input-re-password\">Confirm Password:</label>\n <input nbInput\n [(ngModel)]=\"user.confirmPassword\"\n #rePass=\"ngModel\"\n id=\"input-re-password\"\n name=\"rePass\"\n type=\"password\"\n class=\"last\"\n placeholder=\"Confirm Password\"\n fullWidth\n fieldSize=\"large\"\n [status]=\"rePass.touched\n ? (rePass.invalid || password.value != rePass.value ? 'danger' : 'success')\n : 'basic'\"\n [required]=\"getConfigValue('forms.validation.password.required')\"\n [attr.aria-invalid]=\"rePass.invalid && rePass.touched ? true : null\">\n <ng-container *ngIf=\"rePass.touched\">\n <p class=\"caption status-danger\" *ngIf=\"rePass.invalid && rePass.errors?.required\">\n Password confirmation is required!\n </p>\n <p class=\"caption status-danger\" *ngIf=\"password.value != rePass.value && !rePass.errors?.required\">\n Password does not match the confirm password.\n </p>\n </ng-container>\n </div>\n\n <button nbButton\n status=\"primary\"\n fullWidth\n size=\"large\"\n [disabled]=\"submitted || !resetPassForm.valid\"\n [class.btn-pulse]=\"submitted\">\n Change password\n </button>\n</form>\n\n<section class=\"sign-in-or-up\" aria-label=\"Sign in or sign up\">\n <p><a class=\"text-link\" routerLink=\"../login\">Back to Log In</a></p>\n <p><a class=\"text-link\" routerLink=\"../register\">Register</a></p>\n</section>\n", styles: ["/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */:host .form-group:last-of-type{margin-bottom:3rem}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.NbAlertComponent, selector: "nb-alert", inputs: ["size", "status", "accent", "outline", "closable"], outputs: ["close"] }, { kind: "directive", type: i4.NbInputDirective, selector: "input[nbInput],textarea[nbInput]", inputs: ["fieldSize", "status", "shape", "fullWidth"] }, { kind: "component", type: i4.NbButtonComponent, selector: "button[nbButton],a[nbButton],input[type=\"button\"][nbButton],input[type=\"submit\"][nbButton]", inputs: ["hero"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: NbResetPasswordComponent, decorators: [{
type: Component,
args: [{ selector: 'nb-reset-password-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<h1 id=\"title\" class=\"title\">Change password</h1>\n<p class=\"sub-title\">Please set a new password</p>\n\n<nb-alert *ngIf=\"showMessages.error && errors?.length && !submitted\" outline=\"danger\" role=\"alert\">\n <p class=\"alert-title\"><b>Oh snap!</b></p>\n <ul class=\"alert-message-list\">\n <li *ngFor=\"let error of errors\" class=\"alert-message\">{{ error }}</li>\n </ul>\n</nb-alert>\n\n<nb-alert *ngIf=\"showMessages.success && messages?.length && !submitted\" outline=\"success\" role=\"alert\">\n <p class=\"alert-title\"><b>Hooray!</b></p>\n <ul class=\"alert-message-list\">\n <li *ngFor=\"let message of messages\" class=\"alert-message\">{{ message }}</li>\n </ul>\n</nb-alert>\n\n<form (ngSubmit)=\"resetPass()\" #resetPassForm=\"ngForm\" aria-labelledby=\"title\">\n\n <div class=\"form-control-group\">\n <label class=\"label\" for=\"input-password\">New Password:</label>\n <input nbInput\n [(ngModel)]=\"user.password\"\n #password=\"ngModel\"\n type=\"password\"\n id=\"input-password\"\n name=\"password\"\n class=\"first\"\n placeholder=\"New Password\"\n autofocus\n fullWidth\n fieldSize=\"large\"\n [status]=\"password.dirty ? (password.invalid ? 'danger' : 'success') : 'basic'\"\n [required]=\"getConfigValue('forms.validation.password.required')\"\n [minlength]=\"getConfigValue('forms.validation.password.minLength')\"\n [maxlength]=\"getConfigValue('forms.validation.password.maxLength')\"\n [attr.aria-invalid]=\"password.invalid && password.touched ? true : null\">\n <ng-container *ngIf=\"password.invalid && password.touched\">\n <p class=\"caption status-danger\" *ngIf=\"password.errors?.required\">\n Password is required!\n </p>\n <p class=\"caption status-danger\" *ngIf=\"password.errors?.minlength || password.errors?.maxlength\">\n Password should contains\n from {{getConfigValue('forms.validation.password.minLength')}}\n to {{getConfigValue('forms.validation.password.maxLength')}}\n characters\n </p>\n </ng-container>\n </div>\n\n <div class=\"form-group\">\n <label class=\"label\" for=\"input-re-password\">Confirm Password:</label>\n <input nbInput\n [(ngModel)]=\"user.confirmPassword\"\n #rePass=\"ngModel\"\n id=\"input-re-password\"\n name=\"rePass\"\n type=\"password\"\n class=\"last\"\n placeholder=\"Confirm Password\"\n fullWidth\n fieldSize=\"large\"\n [status]=\"rePass.touched\n ? (rePass.invalid || password.value != rePass.value ? 'danger' : 'success')\n : 'basic'\"\n [required]=\"getConfigValue('forms.validation.password.required')\"\n [attr.aria-invalid]=\"rePass.invalid && rePass.touched ? true : null\">\n <ng-container *ngIf=\"rePass.touched\">\n <p class=\"caption status-danger\" *ngIf=\"rePass.invalid && rePass.errors?.required\">\n Password confirmation is required!\n </p>\n <p class=\"caption status-danger\" *ngIf=\"password.value != rePass.value && !rePass.errors?.required\">\n Password does not match the confirm password.\n </p>\n </ng-container>\n </div>\n\n <button nbButton\n status=\"primary\"\n fullWidth\n size=\"large\"\n [disabled]=\"submitted || !resetPassForm.valid\"\n [class.btn-pulse]=\"submitted\">\n Change password\n </button>\n</form>\n\n<section class=\"sign-in-or-up\" aria-label=\"Sign in or sign up\">\n <p><a class=\"text-link\" routerLink=\"../login\">Back to Log In</a></p>\n <p><a class=\"text-link\" routerLink=\"../register\">Register</a></p>\n</section>\n", styles: ["/**\n * @license\n * Copyright Akveo. All Rights Reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n */:host .form-group:last-of-type{margin-bottom:3rem}\n"] }]
}], ctorParameters: () => [{ type: i1.NbAuthService }, { type: undefined, decorators: [{
type: Inject,
args: [NB_AUTH_OPTIONS]
}] }, { type: i0.ChangeDetectorRef }, { type: i2.Router }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZXQtcGFzc3dvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ZyYW1ld29yay9hdXRoL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQvcmVzZXQtcGFzc3dvcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2ZyYW1ld29yay9hdXRoL2NvbXBvbmVudHMvcmVzZXQtcGFzc3dvcmQvcmVzZXQtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBV2xELE1BQU0sT0FBTyx3QkFBd0I7SUFXbkMsWUFBc0IsT0FBc0IsRUFDRyxVQUFVLEVBQUUsRUFDckMsRUFBcUIsRUFDckIsTUFBYztRQUhkLFlBQU8sR0FBUCxPQUFPLENBQWU7UUFDRyxZQUFPLEdBQVAsT0FBTyxDQUFLO1FBQ3JDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFacEMsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUV0QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUN4QixTQUFJLEdBQVEsRUFBRSxDQUFDO1FBT2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQW9CLEVBQUUsRUFBRTtZQUN0RixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBVztRQUN4QixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7OEdBN0NVLHdCQUF3QiwrQ0FZZixlQUFlO2tHQVp4Qix3QkFBd0IsOERDbkJyQyxpeEhBMkZBOzsyRkR4RWEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTTs7MEJBY2xDLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOQl9BVVRIX09QVElPTlMgfSBmcm9tICcuLi8uLi9hdXRoLm9wdGlvbnMnO1xuaW1wb3J0IHsgZ2V0RGVlcEZyb21PYmplY3QgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcblxuaW1wb3J0IHsgTmJBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBOYkF1dGhSZXN1bHQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLXJlc3VsdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25iLXJlc2V0LXBhc3N3b3JkLXBhZ2UnLFxuICBzdHlsZVVybHM6IFsnLi9yZXNldC1wYXNzd29yZC5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzZXQtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmJSZXNldFBhc3N3b3JkQ29tcG9uZW50IHtcblxuICByZWRpcmVjdERlbGF5OiBudW1iZXIgPSAwO1xuICBzaG93TWVzc2FnZXM6IGFueSA9IHt9O1xuICBzdHJhdGVneTogc3RyaW5nID0gJyc7XG5cbiAgc3VibWl0dGVkID0gZmFsc2U7XG4gIGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gIHVzZXI6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzZXJ2aWNlOiBOYkF1dGhTZXJ2aWNlLFxuICAgICAgICAgICAgICBASW5qZWN0KE5CX0FVVEhfT1BUSU9OUykgcHJvdGVjdGVkIG9wdGlvbnMgPSB7fSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyKSB7XG5cbiAgICB0aGlzLnJlZGlyZWN0RGVsYXkgPSB0aGlzLmdldENvbmZpZ1ZhbHVlKCdmb3Jtcy5yZXNldFBhc3N3b3JkLnJlZGlyZWN0RGVsYXknKTtcbiAgICB0aGlzLnNob3dNZXNzYWdlcyA9IHRoaXMuZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnJlc2V0UGFzc3dvcmQuc2hvd01lc3NhZ2VzJyk7XG4gICAgdGhpcy5zdHJhdGVneSA9IHRoaXMuZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnJlc2V0UGFzc3dvcmQuc3RyYXRlZ3knKTtcbiAgfVxuXG4gIHJlc2V0UGFzcygpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9ycyA9IHRoaXMubWVzc2FnZXMgPSBbXTtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG5cbiAgICB0aGlzLnNlcnZpY2UucmVzZXRQYXNzd29yZCh0aGlzLnN0cmF0ZWd5LCB0aGlzLnVzZXIpLnN1YnNjcmliZSgocmVzdWx0OiBOYkF1dGhSZXN1bHQpID0+IHtcbiAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSByZXN1bHQuZ2V0TWVzc2FnZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gcmVzdWx0LmdldEVycm9ycygpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWRpcmVjdCA9IHJlc3VsdC5nZXRSZWRpcmVjdCgpO1xuICAgICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJlZGlyZWN0KTtcbiAgICAgICAgfSwgdGhpcy5yZWRpcmVjdERlbGF5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnVmFsdWUoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBnZXREZWVwRnJvbU9iamVjdCh0aGlzLm9wdGlvbnMsIGtleSwgbnVsbCk7XG4gIH1cbn1cbiIsIjxoMSBpZD1cInRpdGxlXCIgY2xhc3M9XCJ0aXRsZVwiPkNoYW5nZSBwYXNzd29yZDwvaDE+XG48cCBjbGFzcz1cInN1Yi10aXRsZVwiPlBsZWFzZSBzZXQgYSBuZXcgcGFzc3dvcmQ8L3A+XG5cbjxuYi1hbGVydCAqbmdJZj1cInNob3dNZXNzYWdlcy5lcnJvciAmJiBlcnJvcnM/Lmxlbmd0aCAmJiAhc3VibWl0dGVkXCIgb3V0bGluZT1cImRhbmdlclwiIHJvbGU9XCJhbGVydFwiPlxuICA8cCBjbGFzcz1cImFsZXJ0LXRpdGxlXCI+PGI+T2ggc25hcCE8L2I+PC9wPlxuICA8dWwgY2xhc3M9XCJhbGVydC1tZXNzYWdlLWxpc3RcIj5cbiAgICA8bGkgKm5nRm9yPVwibGV0IGVycm9yIG9mIGVycm9yc1wiIGNsYXNzPVwiYWxlcnQtbWVzc2FnZVwiPnt7IGVycm9yIH19PC9saT5cbiAgPC91bD5cbjwvbmItYWxlcnQ+XG5cbjxuYi1hbGVydCAqbmdJZj1cInNob3dNZXNzYWdlcy5zdWNjZXNzICYmIG1lc3NhZ2VzPy5sZW5ndGggJiYgIXN1Ym1pdHRlZFwiIG91dGxpbmU9XCJzdWNjZXNzXCIgcm9sZT1cImFsZXJ0XCI+XG4gIDxwIGNsYXNzPVwiYWxlcnQtdGl0bGVcIj48Yj5Ib29yYXkhPC9iPjwvcD5cbiAgPHVsIGNsYXNzPVwiYWxlcnQtbWVzc2FnZS1saXN0XCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzXCIgY2xhc3M9XCJhbGVydC1tZXNzYWdlXCI+e3sgbWVzc2FnZSB9fTwvbGk+XG4gIDwvdWw+XG48L25iLWFsZXJ0PlxuXG48Zm9ybSAobmdTdWJtaXQpPVwicmVzZXRQYXNzKClcIiAjcmVzZXRQYXNzRm9ybT1cIm5nRm9ybVwiIGFyaWEtbGFiZWxsZWRieT1cInRpdGxlXCI+XG5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbC1ncm91cFwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCIgZm9yPVwiaW5wdXQtcGFzc3dvcmRcIj5OZXcgUGFzc3dvcmQ6PC9sYWJlbD5cbiAgICA8aW5wdXQgbmJJbnB1dFxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cInVzZXIucGFzc3dvcmRcIlxuICAgICAgICAgICAjcGFzc3dvcmQ9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgaWQ9XCJpbnB1dC1wYXNzd29yZFwiXG4gICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgIGNsYXNzPVwiZmlyc3RcIlxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5ldyBQYXNzd29yZFwiXG4gICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICAgZmllbGRTaXplPVwibGFyZ2VcIlxuICAgICAgICAgICBbc3RhdHVzXT1cInBhc3N3b3JkLmRpcnR5ID8gKHBhc3N3b3JkLmludmFsaWQgID8gJ2RhbmdlcicgOiAnc3VjY2VzcycpIDogJ2Jhc2ljJ1wiXG4gICAgICAgICAgIFtyZXF1aXJlZF09XCJnZXRDb25maWdWYWx1ZSgnZm9ybXMudmFsaWRhdGlvbi5wYXNzd29yZC5yZXF1aXJlZCcpXCJcbiAgICAgICAgICAgW21pbmxlbmd0aF09XCJnZXRDb25maWdWYWx1ZSgnZm9ybXMudmFsaWRhdGlvbi5wYXNzd29yZC5taW5MZW5ndGgnKVwiXG4gICAgICAgICAgIFttYXhsZW5ndGhdPVwiZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnZhbGlkYXRpb24ucGFzc3dvcmQubWF4TGVuZ3RoJylcIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwicGFzc3dvcmQuaW52YWxpZCAmJiBwYXNzd29yZC50b3VjaGVkID8gdHJ1ZSA6IG51bGxcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFzc3dvcmQuaW52YWxpZCAmJiBwYXNzd29yZC50b3VjaGVkXCI+XG4gICAgICA8cCBjbGFzcz1cImNhcHRpb24gc3RhdHVzLWRhbmdlclwiICpuZ0lmPVwicGFzc3dvcmQuZXJyb3JzPy5yZXF1aXJlZFwiPlxuICAgICAgICBQYXNzd29yZCBpcyByZXF1aXJlZCFcbiAgICAgIDwvcD5cbiAgICAgIDxwIGNsYXNzPVwiY2FwdGlvbiBzdGF0dXMtZGFuZ2VyXCIgKm5nSWY9XCJwYXNzd29yZC5lcnJvcnM/Lm1pbmxlbmd0aCB8fCBwYXNzd29yZC5lcnJvcnM/Lm1heGxlbmd0aFwiPlxuICAgICAgICBQYXNzd29yZCBzaG91bGQgY29udGFpbnNcbiAgICAgICAgZnJvbSB7e2dldENvbmZpZ1ZhbHVlKCdmb3Jtcy52YWxpZGF0aW9uLnBhc3N3b3JkLm1pbkxlbmd0aCcpfX1cbiAgICAgICAgdG8ge3tnZXRDb25maWdWYWx1ZSgnZm9ybXMudmFsaWRhdGlvbi5wYXNzd29yZC5tYXhMZW5ndGgnKX19XG4gICAgICAgIGNoYXJhY3RlcnNcbiAgICAgIDwvcD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIGZvcj1cImlucHV0LXJlLXBhc3N3b3JkXCI+Q29uZmlybSBQYXNzd29yZDo8L2xhYmVsPlxuICAgIDxpbnB1dCBuYklucHV0XG4gICAgICAgICAgIFsobmdNb2RlbCldPVwidXNlci5jb25maXJtUGFzc3dvcmRcIlxuICAgICAgICAgICAjcmVQYXNzPVwibmdNb2RlbFwiXG4gICAgICAgICAgIGlkPVwiaW5wdXQtcmUtcGFzc3dvcmRcIlxuICAgICAgICAgICBuYW1lPVwicmVQYXNzXCJcbiAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgY2xhc3M9XCJsYXN0XCJcbiAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb25maXJtIFBhc3N3b3JkXCJcbiAgICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgIGZpZWxkU2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICAgW3N0YXR1c109XCJyZVBhc3MudG91Y2hlZFxuICAgICAgICAgICAgICAgPyAocmVQYXNzLmludmFsaWQgfHwgcGFzc3dvcmQudmFsdWUgIT0gcmVQYXNzLnZhbHVlID8gJ2RhbmdlcicgOiAnc3VjY2VzcycpXG4gICAgICAgICAgICAgICA6ICdiYXNpYydcIlxuICAgICAgICAgICBbcmVxdWlyZWRdPVwiZ2V0Q29uZmlnVmFsdWUoJ2Zvcm1zLnZhbGlkYXRpb24ucGFzc3dvcmQucmVxdWlyZWQnKVwiXG4gICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJyZVBhc3MuaW52YWxpZCAmJiByZVBhc3MudG91Y2hlZCA/IHRydWUgOiBudWxsXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlUGFzcy50b3VjaGVkXCI+XG4gICAgICA8cCBjbGFzcz1cImNhcHRpb24gc3RhdHVzLWRhbmdlclwiICpuZ0lmPVwicmVQYXNzLmludmFsaWQgJiYgcmVQYXNzLmVycm9ycz8ucmVxdWlyZWRcIj5cbiAgICAgICAgUGFzc3dvcmQgY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkIVxuICAgICAgPC9wPlxuICAgICAgPHAgY2xhc3M9XCJjYXB0aW9uIHN0YXR1cy1kYW5nZXJcIiAqbmdJZj1cInBhc3N3b3JkLnZhbHVlICE9IHJlUGFzcy52YWx1ZSAmJiAhcmVQYXNzLmVycm9ycz8ucmVxdWlyZWRcIj5cbiAgICAgICAgUGFzc3dvcmQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpcm0gcGFzc3dvcmQuXG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxidXR0b24gbmJCdXR0b25cbiAgICAgICAgICBzdGF0dXM9XCJwcmltYXJ5XCJcbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICBzaXplPVwibGFyZ2VcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzdWJtaXR0ZWQgfHwgIXJlc2V0UGFzc0Zvcm0udmFsaWRcIlxuICAgICAgICAgIFtjbGFzcy5idG4tcHVsc2VdPVwic3VibWl0dGVkXCI+XG4gICAgQ2hhbmdlIHBhc3N3b3JkXG4gIDwvYnV0dG9uPlxuPC9mb3JtPlxuXG48c2VjdGlvbiBjbGFzcz1cInNpZ24taW4tb3ItdXBcIiBhcmlhLWxhYmVsPVwiU2lnbiBpbiBvciBzaWduIHVwXCI+XG4gIDxwPjxhIGNsYXNzPVwidGV4dC1saW5rXCIgcm91dGVyTGluaz1cIi4uL2xvZ2luXCI+QmFjayB0byBMb2cgSW48L2E+PC9wPlxuICA8cD48YSBjbGFzcz1cInRleHQtbGlua1wiIHJvdXRlckxpbms9XCIuLi9yZWdpc3RlclwiPlJlZ2lzdGVyPC9hPjwvcD5cbjwvc2VjdGlvbj5cbiJdfQ==