kwikui
Version:
KwikID's UI Component Library in Angular
216 lines • 29.9 kB
JavaScript
import { Component, EventEmitter, forwardRef, Input, Output } from "@angular/core";
import { FormControl, FormGroup, NG_VALUE_ACCESSOR } from "@angular/forms";
import { TUI_DATE_FORMAT, TUI_DATE_SEPARATOR } from "@taiga-ui/cdk";
import { Subscription } from "rxjs";
import { distinctUntilChanged } from "rxjs/operators";
import { throwErrorMessage } from "../../../../helpers/kwikui.common.helpers";
import { DEFAULT_VALUES, VALIDATE_KEY_VALUES } from "./input-date-range.constants";
import { isValidKeyValue } from "./input-date-range.validation";
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 KwikUIInputDateRangeComponent {
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.label = DEFAULT_VALUES.label;
this.max = DEFAULT_VALUES.max;
this.maxLength = DEFAULT_VALUES.maxLength;
this.min = DEFAULT_VALUES.min;
this.minLength = DEFAULT_VALUES.minLength;
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("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-date-range", 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
*/
setReset() {
this.formGroup.controls[this.formControlName].reset();
}
/**
* @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 */ KwikUIInputDateRangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputDateRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikUIInputDateRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikUIInputDateRangeComponent, selector: "kwikui-input-date-range", inputs: { disabled: "disabled", focus: "focus", formControl: "formControl", formControlName: "formControlName", hintContent: "hintContent", icon: "icon", id: "id", invalid: "invalid", label: "label", max: "max", maxLength: "maxLength", min: "min", minLength: "minLength", placeholder: "placeholder", postfix: "postfix", prefix: "prefix", properties: "properties", size: "size", validators: "validators" }, outputs: { getKeyValue: "getKeyValue" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputDateRangeComponent)),
multi: true
},
{ provide: TUI_DATE_FORMAT, useValue: `DMY` },
{ provide: TUI_DATE_SEPARATOR, useValue: `-` }
], usesOnChanges: true, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <tui-input-date-range\n tuiUnfinishedValidator=\"Finish filling the field\"\n [formControlName]=\"formControlName\"\n [max]=\"max\"\n [maxLength]=\"maxLength\"\n [min]=\"min\"\n [minLength]=\"minLength\"\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 [tuiTextfieldIconLeft]=\"icon\"\n [tuiTextfieldPostfix]=\"postfix\"\n [tuiTextfieldPrefix]=\"prefix\"\n [tuiTextfieldSize]=\"size\"\n (focusedChange)=\"handleFocusedChange($event)\"\n >\n {{ label }}\n <span\n class=\"tui-required\"\n *ngIf=\"validators.required\"\n ></span>\n <input\n tuiTextfield\n [attr.placeholder]=\"placeholder ?? ''\"\n [attr.required]=\"validators.required\"\n />\n </tui-input-date-range>\n</div>\n", styles: [""], components: [{ type: i1.TuiInputDateRangeComponent, selector: "tui-input-date-range", inputs: ["disabledItemHandler", "markerHandler", "defaultViewedMonth", "items", "min", "max", "minLength", "maxLength"] }, { 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: i1.TuiInputDateRangeDirective, selector: "tui-input-date-range" }, { type: i1.TuiUnfinishedValidatorDirective, selector: "[tuiUnfinishedValidator]" }, { 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.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"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikUIInputDateRangeComponent, decorators: [{
type: Component,
args: [{
selector: "kwikui-input-date-range",
templateUrl: "./input-date-range.component.html",
styleUrls: ["./input-date-range.component.scss"],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((() => KwikUIInputDateRangeComponent)),
multi: true
},
{ provide: TUI_DATE_FORMAT, useValue: `DMY` },
{ provide: TUI_DATE_SEPARATOR, useValue: `-` }
]
}]
}], 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
}], label: [{
type: Input
}], max: [{
type: Input
}], maxLength: [{
type: Input
}], min: [{
type: Input
}], minLength: [{
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZGF0ZS1yYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvaW5wdXRzL2lucHV0LWRhdGUtcmFuZ2UvaW5wdXQtZGF0ZS1yYW5nZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lrdWkvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvaW5wdXRzL2lucHV0LWRhdGUtcmFuZ2UvaW5wdXQtZGF0ZS1yYW5nZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7OztBQWdCaEUsTUFBTSxPQUFPLDZCQUE2QjtJQXNEeEM7UUFwRFMsYUFBUSxHQUFZLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFFNUMsVUFBSyxHQUFZLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFFdEMsZ0JBQVcsR0FBZ0Is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QUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLDhCQUE4QixFQUFDOzRCQUM1RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRCxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTt3QkFDN0MsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtxQkFDL0M7aUJBQ0Y7MEVBR1UsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEVBQUU7c0JBQVYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQU1HLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBOR19WQUxVRV9BQ0NFU1NPUlxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFRVSV9EQVRFX0ZPUk1BVCwgVFVJX0RBVEVfU0VQQVJBVE9SLCBUdWlEYXkgfSBmcm9tIFwiQHRhaWdhLXVpL2Nka1wiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyB0aHJvd0Vycm9yTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9oZWxwZXJzL2t3aWt1aS5jb21tb24uaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9WQUxVRVMsXG4gIFZBTElEQVRFX0tFWV9WQUxVRVNcbn0gZnJvbSBcIi4vaW5wdXQtZGF0ZS1yYW5nZS5jb25zdGFudHNcIjtcbmltcG9ydCB7IFRLd2lrVUlJbnB1dERhdGVSYW5nZVNpemUgfSBmcm9tIFwiLi9pbnB1dC1kYXRlLXJhbmdlLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBpc1ZhbGlkS2V5VmFsdWUgfSBmcm9tIFwiLi9pbnB1dC1kYXRlLXJhbmdlLnZhbGlkYXRpb25cIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWt1aS1pbnB1dC1kYXRlLXJhbmdlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW5wdXQtZGF0ZS1yYW5nZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vaW5wdXQtZGF0ZS1yYW5nZS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBLd2lrVUlJbnB1dERhdGVSYW5nZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBUVUlfREFURV9GT1JNQVQsIHVzZVZhbHVlOiBgRE1ZYCB9LFxuICAgIHsgcHJvdmlkZTogVFVJX0RBVEVfU0VQQVJBVE9SLCB1c2VWYWx1ZTogYC1gIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrVUlJbnB1dERhdGVSYW5nZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuZGlzYWJsZWQ7XG5cbiAgQElucHV0KCkgZm9jdXM6IGJvb2xlYW4gPSBERUZBVUxUX1ZBTFVFUy5mb2N1cztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woe30pO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMuZm9ybUNvbnRyb2xOYW1lO1xuXG4gIEBJbnB1dCgpIGhpbnRDb250ZW50OiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5oaW50Q29udGVudDtcblxuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pY29uO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBERUZBVUxUX1ZBTFVFUy5pZDtcblxuICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuID0gREVGQVVMVF9WQUxVRVMuaW52YWxpZDtcblxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMubGFiZWw7XG5cbiAgQElucHV0KCkgbWF4OiBUdWlEYXkgPSBERUZBVUxUX1ZBTFVFUy5tYXg7XG5cbiAgQElucHV0KCkgbWF4TGVuZ3RoOiB7XG4gICAgeWVhcj86IG51bWJlcjtcbiAgICBtb250aD86IG51bWJlcjtcbiAgICBkYXk/OiBudW1iZXI7XG4gIH0gfCBudWxsID0gREVGQVVMVF9WQUxVRVMubWF4TGVuZ3RoO1xuXG4gIEBJbnB1dCgpIG1pbjogVHVpRGF5ID0gREVGQVVMVF9WQUxVRVMubWluO1xuXG4gIEBJbnB1dCgpIG1pbkxlbmd0aDoge1xuICAgIHllYXI/OiBudW1iZXI7XG4gICAgbW9udGg/OiBudW1iZXI7XG4gICAgZGF5PzogbnVtYmVyO1xuICB9IHwgbnVsbCA9IERFRkFVTFRfVkFMVUVTLm1pbkxlbmd0aDtcblxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucGxhY2Vob2xkZXI7XG5cbiAgQElucHV0KCkgcG9zdGZpeDogc3RyaW5nID0gREVGQVVMVF9WQUxVRVMucG9zdGZpeDtcblxuICBASW5wdXQoKSBwcmVmaXg6IHN0cmluZyA9IERFRkFVTFRfVkFMVUVTLnByZWZpeDtcblxuICBASW5wdXQoKSBwcm9wZXJ0aWVzID0geyByZWFkT25seTogZmFsc2UgfTtcblxuICBASW5wdXQoKSBzaXplOiBUS3dpa1VJSW5wdXREYXRlUmFuZ2VTaXplID0gREVGQVVMVF9WQUxVRVMuc2l6ZTtcblxuICBASW5wdXQoKSB2YWxpZGF0b3JzID0geyByZXF1aXJlZDogdHJ1ZSB9O1xuXG4gIEBPdXRwdXQoKSBnZXRLZXlWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5mb3JtQ29udHJvbE5hbWUsIHRoaXMuZm9ybUNvbnRyb2wpO1xuICAgIHRoaXMuZm9jdXMgPSB0aGlzLmZvY3VzID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMuZm9jdXM7XG4gICAgdGhpcy5pbnZhbGlkID1cbiAgICAgIHRoaXMuaW52YWxpZCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLmludmFsaWQgJiYgdGhpcy5mb2N1cztcbiAgICB0aGlzLnZhbGlkYXRvcnMgPSB7IC4uLnRoaXMudmFsaWRhdG9ycyB9O1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4udGhpcy5wcm9wZXJ0aWVzIH07XG4gICAgdGhpcy5zZXREaXNhYmxlZCgpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkgLy8gbWFrZXMgc3VyZSB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmhhbmRsZUlucHV0VmFsdWVDaGFuZ2UodmFsdWUpKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFjaGFuZ2VzW2tleV0uZmlyc3RDaGFuZ2U7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBrZXk6IHN0cmluZyA9IGNoYW5nZVswXTtcbiAgICAgIGNvbnN0IHZhbHVlOiBhbnkgPSBjaGFuZ2VbMV0uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy52YWxpZGF0ZUlucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1Db250cm9sXCIpKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gY2hhbmdlcy5mb3JtQ29udHJvbC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpbnZhbGlkXCIpKSB7XG4gICAgICB0aGlzLmludmFsaWQgPSBCb29sZWFuKGNoYW5nZXMuaW52YWxpZC5jdXJyZW50VmFsdWUpO1xuICAgICAgdGhpcy5zZXRFcnJvcigpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZm9jdXNcIikpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBCb29sZWFuKGNoYW5nZXMuZm9jdXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImRpc2FibGVkXCIpKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gQm9vbGVhbihjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB0aGlzLnNldERpc2FibGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgLy8gZW5zdXJlIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZCB0aGUgc3Vic2NyaXB0aW9uIGlzIGFsc28gYW5kIG5vdCBsZWZ0IG9wZW4uXG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlSW5wdXRQcm9wZXJ0eShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmIChWQUxJREFURV9LRVlfVkFMVUVTW2tleV0gJiYgIWlzVmFsaWRLZXlWYWx1ZShrZXksIHZhbHVlKSkge1xuICAgICAgdGhpc1trZXldID0gREVGQVVMVF9WQUxVRVNba2V5XTtcbiAgICAgIHRocm93RXJyb3JNZXNzYWdlKFxuICAgICAgICBcImt3aWt1aS1pbnB1dC1kYXRlLXJhbmdlXCIsXG4gICAgICAgIHRoaXMuaWQsXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIERFRkFVTFRfVkFMVUVTW2tleV1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNldHRpbmcgdXAgb2YgZXJyb3IgYW5kIGZvY3VzIG9uIHRoZSBpbnB1dCBmaWVsZCBpcyBpdCBpcyBpbnZhbGlkXG4gICAqL1xuICBzZXREaXNhYmxlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5kaXNhYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmVuYWJsZSh7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2V0dGluZyB1cCBvZiBlcnJvciBhbmQgZm9jdXMgb24gdGhlIGlucHV0IGZpZWxkIGlzIGl0IGlzIGludmFsaWRcbiAgICovXG4gIHNldFJlc2V0KCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZm9ybUNvbnRyb2xOYW1lXS5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHNldHRpbmcgdXAgb2YgZXJyb3IgYW5kIGZvY3VzIG9uIHRoZSBpbnB1dCBmaWVsZCBpcyBpdCBpcyBpbnZhbGlkXG4gICAqL1xuICBzZXRFcnJvcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZvcm1Db250cm9sTmFtZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5mb3JtQ29udHJvbE5hbWVdLmludmFsaWRcbiAgICApIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpcmluZyBvZiAyIGV2ZW50cyBvbiAoa2V5dXApIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgaGFuZGxlSW5wdXRWYWx1ZUNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICB0aGlzLmVtaXRFdmVudCh0aGlzLmdldEtleVZhbHVlLCB7XG4gICAgICAgIGtleTogdGhpcy5mb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Db250cm9sLnZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGb2N1c2VkQ2hhbmdlKGU6IGFueSkge1xuICAgIGlmICghdGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZTtcbiAgICB9XG4gIH1cblxuICBlbWl0RXZlbnQoZXZlbnQ6IGFueSwgZGF0YTogYW55KSB7XG4gICAgZXZlbnQuZW1pdChkYXRhKTtcbiAgfVxuXG4gIC8qKiBNZXRob2QgSW1wbGVtZW50YXRpb25zIGZvciBBYnN0cmFjdCBDb250cm9sICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge31cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7fVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICA8dHVpLWlucHV0LWRhdGUtcmFuZ2VcbiAgICB0dWlVbmZpbmlzaGVkVmFsaWRhdG9yPVwiRmluaXNoIGZpbGxpbmcgdGhlIGZpZWxkXCJcbiAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZvcm1Db250cm9sTmFtZVwiXG4gICAgW21heF09XCJtYXhcIlxuICAgIFttYXhMZW5ndGhdPVwibWF4TGVuZ3RoXCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21pbkxlbmd0aF09XCJtaW5MZW5ndGhcIlxuICAgIFtuYXRpdmVJZF09XCJpZFwiXG4gICAgW3BzZXVkb0ZvY3VzXT1cImZvY3VzID8/IG51bGxcIlxuICAgIFtwc2V1ZG9JbnZhbGlkXT1cImludmFsaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBpbnZhbGlkXCJcbiAgICBbcmVhZE9ubHldPVwicHJvcGVydGllcz8ucmVhZE9ubHkgPz8gZmFsc2VcIlxuICAgIFt0dWlIaW50Q29udGVudF09XCJoaW50Q29udGVudFwiXG4gICAgW3R1aVRleHRmaWVsZENsZWFuZXJdPVwidHJ1ZVwiXG4gICAgW3R1aVRleHRmaWVsZEljb25MZWZ0XT1cImljb25cIlxuICAgIFt0dWlUZXh0ZmllbGRQb3N0Zml4XT1cInBvc3RmaXhcIlxuICAgIFt0dWlUZXh0ZmllbGRQcmVmaXhdPVwicHJlZml4XCJcbiAgICBbdHVpVGV4dGZpZWxkU2l6ZV09XCJzaXplXCJcbiAgICAoZm9jdXNlZENoYW5nZSk9XCJoYW5kbGVGb2N1c2VkQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAge3sgbGFiZWwgfX1cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJ0dWktcmVxdWlyZWRcIlxuICAgICAgKm5nSWY9XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICA+PC9zcGFuPlxuICAgIDxpbnB1dFxuICAgICAgdHVpVGV4dGZpZWxkXG4gICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciA/PyAnJ1wiXG4gICAgICBbYXR0ci5yZXF1aXJlZF09XCJ2YWxpZGF0b3JzLnJlcXVpcmVkXCJcbiAgICAvPlxuICA8L3R1aS1pbnB1dC1kYXRlLXJhbmdlPlxuPC9kaXY+XG4iXX0=