kwikui
Version:
KwikID's UI Component Library in Angular
214 lines • 30 kB
JavaScript
import { Component, EventEmitter, forwardRef, Input, Output } from "@angular/core";
import { FormControl, FormGroup, NG_VALUE_ACCESSOR } from "@angular/forms";
import { TUI_INPUT_PASSWORD_DEFAULT_OPTIONS, TUI_INPUT_PASSWORD_OPTIONS } from "@taiga-ui/kit";
import { Subscription } from "rxjs";
import { distinctUntilChanged } from "rxjs/operators";
import { throwErrorMessage } from "../../../../helpers/kwikui.common.helpers";
import { DEFAULT_VALUES, VALIDATE_KEY_VALUES } from "./input-password.constants";
import { isValidKeyValue } from "./input-password.validations";
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/kit";
import * as i2 from "@taiga-ui/core";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/common";
export class KwikUIInputPasswordComponent {
constructor() {
this.disabled = DEFAULT_VALUES.disabled;
this.focus = DEFAULT_VALUES.focus;
this.formControl = new FormControl({});
this.formControlName = DEFAULT_VALUES.formControlName;
this.hintContent = DEFAULT_VALUES.hintContent;
this.icon = DEFAULT_VALUES.icon;
this.id = DEFAULT_VALUES.id;
this.invalid = DEFAULT_VALUES.invalid;
this.isShowLabelOutside = DEFAULT_VALUES.isShowLabelOutside;
this.label = DEFAULT_VALUES.label;
this.placeholder = DEFAULT_VALUES.placeholder;
this.postfix = DEFAULT_VALUES.postfix;
this.prefix = DEFAULT_VALUES.prefix;
this.properties = { readOnly: false };
this.size = DEFAULT_VALUES.size;
this.validators = { required: true };
this.getKeyValue = new EventEmitter();
this.formGroup = new FormGroup({});
this.subscriptions = new Subscription();
}
ngOnInit() {
this.formGroup.addControl(this.formControlName, this.formControl);
this.focus = this.focus === undefined ? false : this.focus;
this.invalid =
this.invalid === undefined ? false : this.invalid && this.focus;
this.validators = Object.assign({}, this.validators);
this.properties = Object.assign({}, this.properties);
this.setDisabled();
this.subscriptions.add(this.formGroup.controls[this.formControlName].valueChanges
.pipe(distinctUntilChanged()) // makes sure the value has actually changed.
.subscribe((value) => this.handleInputValueChange(value)));
}
ngOnChanges(changes) {
const verifyChange = (key) => {
return changes.hasOwnProperty(key) && !changes[key].firstChange;
};
for (const change of Object.entries(changes)) {
const key = change[0];
const value = change[1].currentValue;
this.validateInputProperty(key, value);
}
if (verifyChange("formControl")) {
this.formControl = changes.formControl.currentValue;
}
if (verifyChange("invalid")) {
this.invalid = Boolean(changes.invalid.currentValue);
this.setError();
}
if (verifyChange("isShowLabelOutside")) {
this.isShowLabelOutside = Boolean(changes.isShowLabelOutside.currentValue);
}
if (verifyChange("focus")) {
this.focus = Boolean(changes.focus.currentValue);
}
if (verifyChange("disabled")) {
this.disabled = Boolean(changes.disabled.currentValue);
this.setDisabled();
}
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
// ensure when component is destroyed the subscription is also and not left open.
}
validateInputProperty(key, value) {
if (VALIDATE_KEY_VALUES[key] && !isValidKeyValue(key, value)) {
this[key] = DEFAULT_VALUES[key];
throwErrorMessage("kwikui-input-password", this.id, key, value, DEFAULT_VALUES[key]);
}
}
/**
* @description Handles setting up of error and focus on the input field is it is invalid
*/
setDisabled() {
if (this.formGroup.controls[this.formControlName] !== undefined) {
if (this.disabled === true) {
this.formGroup.controls[this.formControlName].disable({
emitEvent: false
});
}
else {
this.formGroup.controls[this.formControlName].enable({
emitEvent: false
});
}
}
}
/**
* @description Handles setting up of error and focus on the input field is it is invalid
*/
setError() {
if (this.formGroup.controls[this.formControlName] !== undefined &&
this.formGroup.controls[this.formControlName].invalid) {
this.invalid = true;
this.focus = true;
}
else {
this.invalid = false;
this.focus = false;
}
}
/**
* @description Handles firing of 2 events on (keyup) event
*
* @param value
*/
handleInputValueChange(value) {
if (value === this.formControl.value) {
this.emitEvent(this.getKeyValue, {
key: this.formControlName,
value: this.formControl.value
});
}
}
handleFocusedChange(e) {
if (!this.invalid) {
this.focus = e;
}
}
emitEvent(event, data) {
event.emit(data);
}
/** Method Implementations for Abstract Control */
writeValue(value) { }
registerOnChange(fn) { }
registerOnTouched(fn) { }
setDisabledState(isDisabled) { }
}
/** @nocollapse */ KwikUIInputPasswordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikUIInputPasswordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputPasswordComponent, selector: "kwikui-input-password", inputs: { disabled: "disabled", focus: "focus", formControl: "formControl", formControlName: "formControlName", hintContent: "hintContent", icon: "icon", id: "id", invalid: "invalid", isShowLabelOutside: "isShowLabelOutside", label: "label", placeholder: "placeholder", postfix: "postfix", prefix: "prefix", properties: "properties", size: "size", validators: "validators" }, outputs: { getKeyValue: "getKeyValue" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputPasswordComponent)),
multi: true
},
{
provide: TUI_INPUT_PASSWORD_OPTIONS,
useValue: Object.assign(Object.assign({}, TUI_INPUT_PASSWORD_DEFAULT_OPTIONS), { icons: {
hide: "tuiIconEyeOff",
show: "tuiIconEye"
} })
}
], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <p\n *ngIf=\"isShowLabelOutside\"\n class=\"tui-space_bottom-2\"\n >\n <b>\n {{ label }}\n <span *ngIf=\"validators.required\">*</span>\n </b>\n </p>\n <tui-input-password\n [formControlName]=\"formControlName\"\n [nativeId]=\"id\"\n [pseudoFocus]=\"focus ?? null\"\n [pseudoInvalid]=\"invalid === undefined ? null : invalid\"\n [readOnly]=\"properties?.readOnly ?? false\"\n [tuiHintContent]=\"hintContent\"\n [tuiTextfieldCleaner]=\"true\"\n [tuiTextfieldLabelOutside]=\"isShowLabelOutside\"\n [tuiTextfieldIconLeft]=\"icon\"\n [tuiTextfieldPostfix]=\"postfix\"\n [tuiTextfieldPrefix]=\"prefix\"\n [tuiTextfieldSize]=\"size\"\n (focusedChange)=\"handleFocusedChange($event)\"\n >\n <div *ngIf=\"!isShowLabelOutside\">\n {{ label }}\n <span\n class=\"tui-required\"\n *ngIf=\"validators.required\"\n ></span>\n </div>\n <div *ngIf=\"isShowLabelOutside\">\n {{ placeholder }}\n </div>\n <input\n tuiTextfield\n [attr.placeholder]=\"placeholder ?? ''\"\n [attr.required]=\"validators.required\"\n />\n </tui-input-password>\n</div>\n", styles: [""], components: [{ type: i1.TuiInputPasswordComponent, selector: "tui-input-password" }, { type: i2.TuiTextfieldComponent, selector: "input[tuiTextfield], textarea[tuiTextfield]" }], directives: [{ type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.TuiInputPasswordDirective, selector: "tui-input-password" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.TuiHintOptionsDirective, selector: "[tuiHintContent]", inputs: ["tuiHintContent", "tuiHintDirection", "tuiHintAppearance", "tuiHintShowDelay", "tuiHintHideDelay"] }, { type: i2.TuiTextfieldCleanerDirective, selector: "[tuiTextfieldCleaner]", inputs: ["tuiTextfieldCleaner"] }, { type: i2.TuiTextfieldLabelOutsideDirective, selector: "[tuiTextfieldLabelOutside]", inputs: ["tuiTextfieldLabelOutside"] }, { type: i2.TuiTextfieldIconLeftDirective, selector: "[tuiTextfieldIconLeft]", inputs: ["tuiTextfieldIconLeft"] }, { type: i2.TuiTextfieldPostfixDirective, selector: "[tuiTextfieldPostfix]", inputs: ["tuiTextfieldPostfix"] }, { type: i2.TuiTextfieldPrefixDirective, selector: "[tuiTextfieldPrefix]", inputs: ["tuiTextfieldPrefix"] }, { type: i2.TuiTextfieldSizeDirective, selector: "[tuiTextfieldSize]", inputs: ["tuiTextfieldSize"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputPasswordComponent, decorators: [{
type: Component,
args: [{
selector: "kwikui-input-password",
templateUrl: "./input-password.component.html",
styleUrls: ["./input-password.component.scss"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputPasswordComponent)),
multi: true
},
{
provide: TUI_INPUT_PASSWORD_OPTIONS,
useValue: Object.assign(Object.assign({}, TUI_INPUT_PASSWORD_DEFAULT_OPTIONS), { icons: {
hide: "tuiIconEyeOff",
show: "tuiIconEye"
} })
}
]
}]
}], ctorParameters: function () { return []; }, propDecorators: { disabled: [{
type: Input
}], focus: [{
type: Input
}], formControl: [{
type: Input
}], formControlName: [{
type: Input
}], hintContent: [{
type: Input
}], icon: [{
type: Input
}], id: [{
type: Input
}], invalid: [{
type: Input
}], isShowLabelOutside: [{
type: Input
}], label: [{
type: Input
}], placeholder: [{
type: Input
}], postfix: [{
type: Input
}], prefix: [{
type: Input
}], properties: [{
type: Input
}], size: [{
type: Input
}], validators: [{
type: Input
}], getKeyValue: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGFzc3dvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa3VpL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2lucHV0cy9pbnB1dC1wYXNzd29yZC9pbnB1dC1wYXNzd29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvaW5wdXRzL2lucHV0LXBhc3N3b3JkL2lucHV0LXBhc3N3b3JkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMsMEJBQTBCLEVBQzNCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7OztBQXdCL0QsTUFBTSxPQUFPLDRCQUE0QjtJQXdDdkM7UUF0Q1MsYUFBUSxHQUFZLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFFNUMsVUFBSyxHQUFZLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFFdEMsZ0JBQVcsR0FBZ0IsSUFBSSxX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NkIsRUFBQzs0QkFDM0QsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLDBCQUEwQjs0QkFDbkMsUUFBUSxrQ0FDSCxrQ0FBa0MsS0FDckMsS0FBSyxFQUFFO29DQUNMLElBQUksRUFBRSxlQUFlO29DQUNyQixJQUFJLEVBQUUsWUFBWTtpQ0FDbkIsR0FDRjt5QkFDRjtxQkFDRjtpQkFDRjswRUFHVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsRUFBRTtzQkFBVixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBOR19WQUxVRV9BQ0NFU1NPUlxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIFRVSV9JTlBVVF9QQVNTV09SRF9ERUZBVUxUX09QVElPTlMsXG4gIFRVSV9JTlBVVF9QQVNTV09SRF9PUFRJT05TXG59IGZyb20gXCJAdGFpZ2EtdWkva2l0XCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IHRocm93RXJyb3JNZXNzYWdlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2hlbHBlcnMva3dpa3VpLmNvbW1vbi5oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX1ZBTFVFUyxcbiAgVkFMSURBVEVfS0VZX1ZBTFVFU1xufSBmcm9tIFwiLi9pbnB1dC1wYXNzd29yZC5jb25zdGFudHNcIjtcbmltcG9ydCB7IFRLd2lrVUlJbnB1dFBhc3N3b3JkU2l6ZSB9IGZyb20gXCIuL2lucHV0LXBhc3N3b3JkLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBpc1ZhbGlkS2V5VmFsdWUgfSBmcm9tIFwiLi9pbnB1dC1wYXNzd29yZC52YWxpZGF0aW9uc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa3VpLWlucHV0LXBhc3N3b3JkXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW5wdXQtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2lucHV0LXBhc3N3b3JkLmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEt3aWtVSUlucHV0UGFzc3dvcmRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRVSV9JTlBVVF9QQVNTV09SRF9PUFRJT05TLFxuICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgLi4uVFVJX0lOUFVUX1BBU1NXT1JEX0RFRkFVTFRfT1BUSU9OUyxcbiAgICAgICAgaWNvbnM6IHtcbiAgICAgICAgICBoaWRlOiBcInR1aUljb25FeWVPZmZcIixcbiAgICAgICAgICBzaG93OiBcInR1aUljb25FeWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtVSUlucHV0UGFzc3dvcmRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IERFRkFVTFRfVkFMVUVTLmRpc2FibGVkO1xuXG4gIEBJbnB1dCgpIGZvY3VzOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuZm9jdXM7XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHt9KTtcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLmZvcm1Db250cm9sTmFtZTtcblxuICBASW5wdXQoKSBoaW50Q29udGVudDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuaGludENvbnRlbnQ7XG5cbiAgQElucHV0KCkgaWNvbjogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuaWNvbjtcblxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuaWQ7XG5cbiAgQElucHV0KCkgaW52YWxpZDogYm9vbGVhbiA9IERFRkFVTFRfVkFMVUVTLmludmFsaWQ7XG5cbiAgQElucHV0KCkgaXNTaG93TGFiZWxPdXRzaWRlOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuaXNTaG93TGFiZWxPdXRzaWRlO1xuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5sYWJlbDtcblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucGxhY2Vob2xkZXI7XG5cbiAgQElucHV0KCkgcG9zdGZpeDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucG9zdGZpeDtcblxuICBASW5wdXQoKSBwcmVmaXg6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLnByZWZpeDtcblxuICBASW5wdXQoKSBwcm9wZXJ0aWVzID0geyByZWFkT25seTogZmFsc2UgfTtcblxuICBASW5wdXQoKSBzaXplOiBUS3dpa1VJSW5wdXRQYXNzd29yZFNpemUgPSBERUZBVUxUX1ZBTFVFUy5zaXplO1xuXG4gIEBJbnB1dCgpIHZhbGlkYXRvcnMgPSB7IHJlcXVpcmVkOiB0cnVlIH07XG5cbiAgQE91dHB1dCgpIGdldEtleVZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbCh0aGlzLmZvcm1Db250cm9sTmFtZSwgdGhpcy5mb3JtQ29udHJvbCk7XG4gICAgdGhpcy5mb2N1cyA9IHRoaXMuZm9jdXMgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5mb2N1cztcbiAgICB0aGlzLmludmFsaWQgPVxuICAgICAgdGhpcy5pbnZhbGlkID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuaW52YWxpZCAmJiB0aGlzLmZvY3VzO1xuICAgIHRoaXMudmFsaWRhdG9ycyA9IHsgLi4udGhpcy52YWxpZGF0b3JzIH07XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi50aGlzLnByb3BlcnRpZXMgfTtcbiAgICB0aGlzLnNldERpc2FibGVkKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKSAvLyBtYWtlcyBzdXJlIHRoZSB2YWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMuaGFuZGxlSW5wdXRWYWx1ZUNoYW5nZSh2YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCB2ZXJpZnlDaGFuZ2UgPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2VzLmhhc093blByb3BlcnR5KGtleSkgJiYgIWNoYW5nZXNba2V5XS5maXJzdENoYW5nZTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykpIHtcbiAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gY2hhbmdlWzBdO1xuICAgICAgY29uc3QgdmFsdWU6IGFueSA9IGNoYW5nZVsxXS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnZhbGlkYXRlSW5wdXRQcm9wZXJ0eShrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZm9ybUNvbnRyb2xcIikpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBjaGFuZ2VzLmZvcm1Db250cm9sLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImludmFsaWRcIikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IEJvb2xlYW4oY2hhbmdlcy5pbnZhbGlkLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLnNldEVycm9yKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpc1Nob3dMYWJlbE91dHNpZGVcIikpIHtcbiAgICAgIHRoaXMuaXNTaG93TGFiZWxPdXRzaWRlID0gQm9vbGVhbihjaGFuZ2VzLmlzU2hvd0xhYmVsT3V0c2lkZS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZm9jdXNcIikpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBCb29sZWFuKGNoYW5nZXMuZm9jdXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImRpc2FibGVkXCIpKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gQm9vbGVhbihjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLnNldERpc2FibGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgLy8gZW5zdXJlIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZCB0aGUgc3Vic2NyaXB0aW9uIGlzIGFsc28gYW5kIG5vdCBsZWZ0IG9wZW4uXG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlSW5wdXRQcm9wZXJ0eShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmIChWQUxJREFURV9LRVlfVkFMVUVTW2tleV0gJiYgIWlzVmFsaWRLZXlWYWx1ZShrZXksIHZhbHVlKSkge1xuICAgICAgdGhpc1trZXldID0gREVGQVVMVF9WQUxVRVNba2V5XTtcbiAgICAgIHRocm93RXJyb3JNZXNzYWdlKFxuICAgICAgICBcImt3aWt1aS1pbnB1dC1wYXNzd29yZFwiLFxuICAgICAgICB0aGlzLmlkLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBERUZBVUxUX1ZBTFVFU1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZXR0aW5nIHVwIG9mIGVycm9yIGFuZCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGQgaXMgaXQgaXMgaW52YWxpZFxuICAgKi9cbiAgc2V0RGlzYWJsZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0uZGlzYWJsZSh7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5lbmFibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNldHRpbmcgdXAgb2YgZXJyb3IgYW5kIGZvY3VzIG9uIHRoZSBpbnB1dCBmaWVsZCBpcyBpdCBpcyBpbnZhbGlkXG4gICAqL1xuICBzZXRFcnJvcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmludmFsaWRcbiAgICApIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpcmluZyBvZiAyIGV2ZW50cyBvbiAoa2V5dXApIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgaGFuZGxlSW5wdXRWYWx1ZUNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCh0aGlzLmdldEtleVZhbHVlLCB7XG4gICAgICAgIGtleTogdGhpcy5mb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Db250cm9sLnZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGb2N1c2VkQ2hhbmdlKGU6IGFueSkge1xuICAgIGlmICghdGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZTtcbiAgICB9XG4gIH1cblxuICBlbWl0RXZlbnQoZXZlbnQ6IGFueSwgZGF0YTogYW55KSB7XG4gICAgZXZlbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIC8qKiBNZXRob2QgSW1wbGVtZW50YXRpb25zIGZvciBBYnN0cmFjdCBDb250cm9sICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7fVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICA8cFxuICAgICpuZ0lmPVwiaXNTaG93TGFiZWxPdXRzaWRlXCJcbiAgICBjbGFzcz1cInR1aS1zcGFjZV9ib3R0b20tMlwiXG4gID5cbiAgICA8Yj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8c3BhbiAqbmdJZj1cInZhbGlkYXRvcnMucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgIDwvYj5cbiAgPC9wPlxuICA8dHVpLWlucHV0LXBhc3N3b3JkXG4gICAgW2Zvcm1Db250cm9sTmFtZV09XCJmb3JtQ29udHJvbE5hbWVcIlxuICAgIFtuYXRpdmVJZF09XCJpZFwiXG4gICAgW3BzZXVkb0ZvY3VzXT1cImZvY3VzID8/IG51bGxcIlxuICAgIFtwc2V1ZG9JbnZhbGlkXT1cImludmFsaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBpbnZhbGlkXCJcbiAgICBbcmVhZE9ubHldPVwicHJvcGVydGllcz8ucmVhZE9ubHkgPz8gZmFsc2VcIlxuICAgIFt0dWlIaW50Q29udGVudF09XCJoaW50Q29udGVudFwiXG4gICAgW3R1aVRleHRmaWVsZENsZWFuZXJdPVwidHJ1ZVwiXG4gICAgW3R1aVRleHRmaWVsZExhYmVsT3V0c2lkZV09XCJpc1Nob3dMYWJlbE91dHNpZGVcIlxuICAgIFt0dWlUZXh0ZmllbGRJY29uTGVmdF09XCJpY29uXCJcbiAgICBbdHVpVGV4dGZpZWxkUG9zdGZpeF09XCJwb3N0Zml4XCJcbiAgICBbdHVpVGV4dGZpZWxkUHJlZml4XT1cInByZWZpeFwiXG4gICAgW3R1aVRleHRmaWVsZFNpemVdPVwic2l6ZVwiXG4gICAgKGZvY3VzZWRDaGFuZ2UpPVwiaGFuZGxlRm9jdXNlZENoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTaG93TGFiZWxPdXRzaWRlXCI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJ0dWktcmVxdWlyZWRcIlxuICAgICAgICAqbmdJZj1cInZhbGlkYXRvcnMucmVxdWlyZWRcIlxuICAgICAgPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNTaG93TGFiZWxPdXRzaWRlXCI+XG4gICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgIDwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgdHVpVGV4dGZpZWxkXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciA/PyAnJ1wiXG4gICAgICBbYXR0ci5yZXF1aXJlZF09XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICAvPlxuICA8L3R1aS1pbnB1dC1wYXNzd29yZD5cbjwvZGl2PlxuIl19