UNPKG

kwikui

Version:

KwikID's UI Component Library in Angular

241 lines 32 kB
import { Component, EventEmitter, forwardRef, Input, Output } from "@angular/core"; import { FormControl, FormGroup, NG_VALUE_ACCESSOR } from "@angular/forms"; import { TUI_NUMBER_FORMAT } from "@taiga-ui/core"; import { Subscription } from "rxjs"; import { distinctUntilChanged } from "rxjs/operators"; import { throwErrorMessage } from "../../../../helpers/kwikui.common.helpers"; import { DEFAULT_VALUES, VALIDATE_KEY_VALUES } from "./input-slider.constants"; import { isValidKeyValue } from "./input-slider.validation"; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/kit"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/common"; import * as i4 from "@taiga-ui/core"; export class KwikUIInputSliderComponent { 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.max = DEFAULT_VALUES.max; this.min = DEFAULT_VALUES.min; this.placeholder = DEFAULT_VALUES.placeholder; this.postfix = DEFAULT_VALUES.postfix; this.prefix = DEFAULT_VALUES.prefix; this.properties = { readOnly: false }; this.quantum = DEFAULT_VALUES.quantum; this.size = DEFAULT_VALUES.size; this.steps = DEFAULT_VALUES.steps; this.type = DEFAULT_VALUES.type; 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(); } if (verifyChange("min")) { this.min = Number(changes.min.currentValue); } if (verifyChange("max")) { this.max = Number(changes.max.currentValue); } if (verifyChange("steps")) { this.steps = Number(changes.steps.currentValue); } if (verifyChange("quantum")) { this.quantum = Number(changes.quantum.currentValue); } } 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-slider", 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 */ KwikUIInputSliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikUIInputSliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputSliderComponent, selector: "kwikui-input-slider", inputs: { disabled: "disabled", focus: "focus", formControl: "formControl", formControlName: "formControlName", hintContent: "hintContent", icon: "icon", id: "id", invalid: "invalid", isShowLabelOutside: "isShowLabelOutside", label: "label", max: "max", min: "min", placeholder: "placeholder", postfix: "postfix", prefix: "prefix", properties: "properties", quantum: "quantum", size: "size", steps: "steps", type: "type", validators: "validators" }, outputs: { getKeyValue: "getKeyValue" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => KwikUIInputSliderComponent)), multi: true }, { provide: TUI_NUMBER_FORMAT, useValue: { decimalSeparator: ".", thousandSeparator: "" } } ], 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-slider\n [formControlName]=\"formControlName\"\n [max]=\"max\"\n [min]=\"min\"\n [nativeId]=\"id\"\n [pseudoFocus]=\"focus ?? null\"\n [pseudoInvalid]=\"invalid === undefined ? null : invalid\"\n [quantum]=\"quantum\"\n [readOnly]=\"properties?.readOnly ?? false\"\n [steps]=\"steps\"\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 </tui-input-slider>\n</div>\n", styles: [""], components: [{ type: i1.TuiInputSliderComponent, selector: "tui-input-slider", inputs: ["min", "max", "quantum", "steps", "segments", "keySteps", "valueContent", "prefix", "postfix"] }], directives: [{ type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.TuiHintOptionsDirective, selector: "[tuiHintContent]", inputs: ["tuiHintContent", "tuiHintDirection", "tuiHintAppearance", "tuiHintShowDelay", "tuiHintHideDelay"] }, { type: i4.TuiTextfieldCleanerDirective, selector: "[tuiTextfieldCleaner]", inputs: ["tuiTextfieldCleaner"] }, { type: i4.TuiTextfieldLabelOutsideDirective, selector: "[tuiTextfieldLabelOutside]", inputs: ["tuiTextfieldLabelOutside"] }, { type: i4.TuiTextfieldIconLeftDirective, selector: "[tuiTextfieldIconLeft]", inputs: ["tuiTextfieldIconLeft"] }, { type: i4.TuiTextfieldPostfixDirective, selector: "[tuiTextfieldPostfix]", inputs: ["tuiTextfieldPostfix"] }, { type: i4.TuiTextfieldPrefixDirective, selector: "[tuiTextfieldPrefix]", inputs: ["tuiTextfieldPrefix"] }, { type: i4.TuiTextfieldSizeDirective, selector: "[tuiTextfieldSize]", inputs: ["tuiTextfieldSize"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputSliderComponent, decorators: [{ type: Component, args: [{ selector: "kwikui-input-slider", templateUrl: "./input-slider.component.html", styleUrls: ["./input-slider.component.scss"], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => KwikUIInputSliderComponent)), multi: true }, { provide: TUI_NUMBER_FORMAT, useValue: { decimalSeparator: ".", thousandSeparator: "" } } ] }] }], 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 }], max: [{ type: Input }], min: [{ type: Input }], placeholder: [{ type: Input }], postfix: [{ type: Input }], prefix: [{ type: Input }], properties: [{ type: Input }], quantum: [{ type: Input }], size: [{ type: Input }], steps: [{ type: Input }], type: [{ type: Input }], validators: [{ type: Input }], getKeyValue: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtc2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWt1aS9zcmMvbGliL2NvbXBvbmVudHMvY29yZS9pbnB1dHMvaW5wdXQtc2xpZGVyL2lucHV0LXNsaWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvaW5wdXRzL2lucHV0LXNsaWRlci9pbnB1dC1zbGlkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7QUFxQjVELE1BQU0sT0FBTywwQkFBMEI7SUFrRHJDO1FBaERTLGFBQVEsR0FBWSxjQUFjLENBQUMsUUFBUSxDQUFDO1FBRTVDLFVBQUssR0FBWSxjQUFjLENBQUMsS0FBSyxDQUFDO1FBRXRDLGdCQUFXLEdBQWdCLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFD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TztzQkFBZixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgTkdfVkFMVUVfQUNDRVNTT1Jcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUVUlfTlVNQkVSX0ZPUk1BVCB9IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyB0aHJvd0Vycm9yTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9oZWxwZXJzL2t3aWt1aS5jb21tb24uaGVscGVyc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9WQUxVRVMsIFZBTElEQVRFX0tFWV9WQUxVRVMgfSBmcm9tIFwiLi9pbnB1dC1zbGlkZXIuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBUS3dpa1VJSW5wdXRTaXplIH0gZnJvbSBcIi4vaW5wdXQtc2xpZGVyLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBpc1ZhbGlkS2V5VmFsdWUgfSBmcm9tIFwiLi9pbnB1dC1zbGlkZXIudmFsaWRhdGlvblwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa3VpLWlucHV0LXNsaWRlclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2lucHV0LXNsaWRlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vaW5wdXQtc2xpZGVyLmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEt3aWtVSUlucHV0U2xpZGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBUVUlfTlVNQkVSX0ZPUk1BVCxcbiAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgIGRlY2ltYWxTZXBhcmF0b3I6IFwiLlwiLFxuICAgICAgICB0aG91c2FuZFNlcGFyYXRvcjogXCJcIlxuICAgICAgfVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrVUlJbnB1dFNsaWRlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuZGlzYWJsZWQ7XG5cbiAgQElucHV0KCkgZm9jdXM6IGJvb2xlYW4gPSBERUZBVUxUX1ZBTFVFUy5mb2N1cztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woe30pO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuZm9ybUNvbnRyb2xOYW1lO1xuXG4gIEBJbnB1dCgpIGhpbnRDb250ZW50OiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5oaW50Q29udGVudDtcblxuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pY29uO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pZDtcblxuICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuaW52YWxpZDtcblxuICBASW5wdXQoKSBpc1Nob3dMYWJlbE91dHNpZGU6IGJvb2xlYW4gPSBERUZBVUxUX1ZBTFVFUy5pc1Nob3dMYWJlbE91dHNpZGU7XG5cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLmxhYmVsO1xuXG4gIEBJbnB1dCgpIG1heDogbnVtYmVyID0gREVGQVVMVF9WQUxVRVMubWF4O1xuXG4gIEBJbnB1dCgpIG1pbjogbnVtYmVyID0gREVGQVVMVF9WQUxVRVMubWluO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5wbGFjZWhvbGRlcjtcblxuICBASW5wdXQoKSBwb3N0Zml4OiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5wb3N0Zml4O1xuXG4gIEBJbnB1dCgpIHByZWZpeDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucHJlZml4O1xuXG4gIEBJbnB1dCgpIHByb3BlcnRpZXMgPSB7IHJlYWRPbmx5OiBmYWxzZSB9O1xuXG4gIEBJbnB1dCgpIHF1YW50dW06IG51bWJlciA9IERFRkFVTFRfVkFMVUVTLnF1YW50dW07XG5cbiAgQElucHV0KCkgc2l6ZTogVEt3aWtVSUlucHV0U2l6ZSA9IERFRkFVTFRfVkFMVUVTLnNpemU7XG5cbiAgQElucHV0KCkgc3RlcHM6IG51bWJlciA9IERFRkFVTFRfVkFMVUVTLnN0ZXBzO1xuXG4gIEBJbnB1dCgpIHR5cGU6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLnR5cGU7XG5cbiAgQElucHV0KCkgdmFsaWRhdG9ycyA9IHsgcmVxdWlyZWQ6IHRydWUgfTtcblxuICBAT3V0cHV0KCkgZ2V0S2V5VmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKHRoaXMuZm9ybUNvbnRyb2xOYW1lLCB0aGlzLmZvcm1Db250cm9sKTtcbiAgICB0aGlzLmZvY3VzID0gdGhpcy5mb2N1cyA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmZvY3VzO1xuICAgIHRoaXMuaW52YWxpZCA9XG4gICAgICB0aGlzLmludmFsaWQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5pbnZhbGlkICYmIHRoaXMuZm9jdXM7XG4gICAgdGhpcy52YWxpZGF0b3JzID0geyAuLi50aGlzLnZhbGlkYXRvcnMgfTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLnRoaXMucHJvcGVydGllcyB9O1xuICAgIHRoaXMuc2V0RGlzYWJsZWQoKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpIC8vIG1ha2VzIHN1cmUgdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5oYW5kbGVJbnB1dFZhbHVlQ2hhbmdlKHZhbHVlKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSBjaGFuZ2VbMF07XG4gICAgICBjb25zdCB2YWx1ZTogYW55ID0gY2hhbmdlWzFdLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudmFsaWRhdGVJbnB1dFByb3BlcnR5KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtQ29udHJvbFwiKSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IGNoYW5nZXMuZm9ybUNvbnRyb2wuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiaW52YWxpZFwiKSkge1xuICAgICAgdGhpcy5pbnZhbGlkID0gQm9vbGVhbihjaGFuZ2VzLmludmFsaWQuY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImlzU2hvd0xhYmVsT3V0c2lkZVwiKSkge1xuICAgICAgdGhpcy5pc1Nob3dMYWJlbE91dHNpZGUgPSBCb29sZWFuKGNoYW5nZXMuaXNTaG93TGFiZWxPdXRzaWRlLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb2N1c1wiKSkge1xuICAgICAgdGhpcy5mb2N1cyA9IEJvb2xlYW4oY2hhbmdlcy5mb2N1cy5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBCb29sZWFuKGNoYW5nZXMuZGlzYWJsZWQuY3VycmVudFZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RGlzYWJsZWQoKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcIm1pblwiKSkge1xuICAgICAgdGhpcy5taW4gPSBOdW1iZXIoY2hhbmdlcy5taW4uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcIm1heFwiKSkge1xuICAgICAgdGhpcy5tYXggPSBOdW1iZXIoY2hhbmdlcy5tYXguY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcInN0ZXBzXCIpKSB7XG4gICAgICB0aGlzLnN0ZXBzID0gTnVtYmVyKGNoYW5nZXMuc3RlcHMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcInF1YW50dW1cIikpIHtcbiAgICAgIHRoaXMucXVhbnR1bSA9IE51bWJlcihjaGFuZ2VzLnF1YW50dW0uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAvLyBlbnN1cmUgd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkIHRoZSBzdWJzY3JpcHRpb24gaXMgYWxzbyBhbmQgbm90IGxlZnQgb3Blbi5cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVJbnB1dFByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKFZBTElEQVRFX0tFWV9WQUxVRVNba2V5XSAmJiAhaXNWYWxpZEtleVZhbHVlKGtleSwgdmFsdWUpKSB7XG4gICAgICB0aGlzW2tleV0gPSBERUZBVUxUX1ZBTFVFU1trZXldO1xuICAgICAgdGhyb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgIFwia3dpa3VpLWlucHV0LXNsaWRlclwiLFxuICAgICAgICB0aGlzLmlkLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBERUZBVUxUX1ZBTFVFU1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZXR0aW5nIHVwIG9mIGVycm9yIGFuZCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGQgaXMgaXQgaXMgaW52YWxpZFxuICAgKi9cbiAgc2V0RGlzYWJsZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0uZGlzYWJsZSh7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5lbmFibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNldHRpbmcgdXAgb2YgZXJyb3IgYW5kIGZvY3VzIG9uIHRoZSBpbnB1dCBmaWVsZCBpcyBpdCBpcyBpbnZhbGlkXG4gICAqL1xuICBzZXRFcnJvcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmludmFsaWRcbiAgICApIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpcmluZyBvZiAyIGV2ZW50cyBvbiAoa2V5dXApIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgaGFuZGxlSW5wdXRWYWx1ZUNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCh0aGlzLmdldEtleVZhbHVlLCB7XG4gICAgICAgIGtleTogdGhpcy5mb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Db250cm9sLnZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGb2N1c2VkQ2hhbmdlKGU6IGFueSkge1xuICAgIGlmICghdGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZTtcbiAgICB9XG4gIH1cblxuICBlbWl0RXZlbnQoZXZlbnQ6IGFueSwgZGF0YTogYW55KSB7XG4gICAgZXZlbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIC8qKiBNZXRob2QgSW1wbGVtZW50YXRpb25zIGZvciBBYnN0cmFjdCBDb250cm9sICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7fVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICA8cFxuICAgICpuZ0lmPVwiaXNTaG93TGFiZWxPdXRzaWRlXCJcbiAgICBjbGFzcz1cInR1aS1zcGFjZV9ib3R0b20tMlwiXG4gID5cbiAgICA8Yj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8c3BhbiAqbmdJZj1cInZhbGlkYXRvcnMucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgIDwvYj5cbiAgPC9wPlxuICA8dHVpLWlucHV0LXNsaWRlclxuICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUNvbnRyb2xOYW1lXCJcbiAgICBbbWF4XT1cIm1heFwiXG4gICAgW21pbl09XCJtaW5cIlxuICAgIFtuYXRpdmVJZF09XCJpZFwiXG4gICAgW3BzZXVkb0ZvY3VzXT1cImZvY3VzID8/IG51bGxcIlxuICAgIFtwc2V1ZG9JbnZhbGlkXT1cImludmFsaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBpbnZhbGlkXCJcbiAgICBbcXVhbnR1bV09XCJxdWFudHVtXCJcbiAgICBbcmVhZE9ubHldPVwicHJvcGVydGllcz8ucmVhZE9ubHkgPz8gZmFsc2VcIlxuICAgIFtzdGVwc109XCJzdGVwc1wiXG4gICAgW3R1aUhpbnRDb250ZW50XT1cImhpbnRDb250ZW50XCJcbiAgICBbdHVpVGV4dGZpZWxkQ2xlYW5lcl09XCJ0cnVlXCJcbiAgICBbdHVpVGV4dGZpZWxkTGFiZWxPdXRzaWRlXT1cImlzU2hvd0xhYmVsT3V0c2lkZVwiXG4gICAgW3R1aVRleHRmaWVsZEljb25MZWZ0XT1cImljb25cIlxuICAgIFt0dWlUZXh0ZmllbGRQb3N0Zml4XT1cInBvc3RmaXhcIlxuICAgIFt0dWlUZXh0ZmllbGRQcmVmaXhdPVwicHJlZml4XCJcbiAgICBbdHVpVGV4dGZpZWxkU2l6ZV09XCJzaXplXCJcbiAgICAoZm9jdXNlZENoYW5nZSk9XCJoYW5kbGVGb2N1c2VkQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1Nob3dMYWJlbE91dHNpZGVcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cInR1aS1yZXF1aXJlZFwiXG4gICAgICAgICpuZ0lmPVwidmFsaWRhdG9ycy5yZXF1aXJlZFwiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJpc1Nob3dMYWJlbE91dHNpZGVcIj5cbiAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgPC9kaXY+XG4gIDwvdHVpLWlucHV0LXNsaWRlcj5cbjwvZGl2PlxuIl19