UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

137 lines 21.1 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Host, HostBinding, Input, Optional, Output, Self, ViewEncapsulation, } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BehaviorSubject, Subject, delay, distinctUntilChanged, skip, takeUntil } from 'rxjs'; import { DOKU_FORM_FIELD_ACCESSOR, DokuFormFieldModule, } from '../form-field'; import { DokuInput } from '../input'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../form-field"; import * as i3 from "../form-field/form-field.component"; import * as i4 from "../form-field/directives/field-prefix.directive"; export class DokuColorPicker { /** * Value of the color picker in hexadecimal format. * @default '' */ get value() { return this._value || ''; } set value(hexColor) { this._value = hexColor || ''; this.value$.next(this._value); } constructor(cdr, ngControl, formField) { this.cdr = cdr; this.ngControl = ngControl; this.formField = formField; /** * Whether to disable the color picker. * @default false */ this.disabled = false; /** * Whether color picker is readonly. * @default false */ this.readonly = false; this._value = ''; /** * An event emitted when value changes. */ this.valueChange = new EventEmitter(); this.classes = ['d-color-picker']; this.value$ = new BehaviorSubject(this.value); this.destroy$ = new Subject(); this.fieldOptions = { withoutInputStyle: true }; if (ngControl) { this.ngControl.valueAccessor = this; } } registerOnDisable(fn) { this.onDisable = fn; } registerOnReadonly(fn) { this.onReadonly = fn; } registerOnValidate(fn) { this.onValidate = fn; } writeValue(value) { this.value = value; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } ngOnInit() { this.value$ .pipe(skip(1), distinctUntilChanged(), takeUntil(this.destroy$)) .subscribe((value) => { this.valueChange.emit(value); this.onChange?.(value); this.cdr.detectChanges(); }); this.ngControl?.statusChanges ?.pipe(distinctUntilChanged(), delay(0), takeUntil(this.destroy$)) .subscribe((status) => { if (status === 'VALID') { this.onValidate?.('valid'); } else if (status === 'INVALID') { this.onValidate?.('invalid'); } else { this.onValidate?.(); } this.cdr.detectChanges(); }); } ngOnChanges(changes) { if (changes['disabled']?.previousValue !== changes['disabled']?.currentValue) { this.onDisable?.(!!this.disabled); } if (changes['readonly']?.previousValue !== changes['readonly']?.currentValue) { this.onReadonly?.(!!this.readonly); } } ngOnDestroy() { this.destroy$.next(true); this.destroy$.unsubscribe(); } onColorChange(event) { this.value = event.target.value; this.onTouched?.(); } } DokuColorPicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuColorPicker, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i2.DokuFormField, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); DokuColorPicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuColorPicker, isStandalone: true, selector: "doku-color-picker", inputs: { disabled: "disabled", readonly: "readonly", value: "value" }, outputs: { valueChange: "valueChange" }, host: { properties: { "class": "this.classes" } }, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuColorPicker }], exportAs: ["dokuColorPicker"], usesOnChanges: true, ngImport: i0, template: "<doku-form-field\n [isErrorState]=\"formField?.['isError']\"\n [isSuccessState]=\"formField?.['isSuccess']\"\n [showSuccessBehavior]=\"!!formField?.['showSuccessBehavior']\"\n>\n <input\n type=\"text\"\n doku-input\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [maxlength]=\"7\"\n />\n <doku-form-field doku-field-prefix appearance=\"border-block-inside\" class=\"d-color-picker-prefix\">\n <input\n type=\"color\"\n class=\"d-color-picker-input-color\"\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled || readonly\"\n [readonly]=\"readonly\"\n />\n </doku-form-field>\n</doku-form-field>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DokuFormFieldModule }, { kind: "component", type: i3.DokuFormField, selector: "doku-form-field", inputs: ["showSuccessBehavior", "isErrorState", "isSuccessState"], exportAs: ["dokuFormField"] }, { kind: "directive", type: i4.DokuFieldPrefix, selector: "[doku-field-prefix]", inputs: ["appearance", "useBackgroundColor"], exportAs: ["dokuFieldPrefix"] }, { kind: "directive", type: DokuInput, selector: "input[doku-input], textarea[doku-input]", inputs: ["disabled", "readonly"], exportAs: ["dokuInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuColorPicker, decorators: [{ type: Component, args: [{ selector: 'doku-color-picker', exportAs: 'dokuColorPicker', standalone: true, imports: [CommonModule, DokuFormFieldModule, DokuInput, ReactiveFormsModule, FormsModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: DOKU_FORM_FIELD_ACCESSOR, useExisting: DokuColorPicker }], template: "<doku-form-field\n [isErrorState]=\"formField?.['isError']\"\n [isSuccessState]=\"formField?.['isSuccess']\"\n [showSuccessBehavior]=\"!!formField?.['showSuccessBehavior']\"\n>\n <input\n type=\"text\"\n doku-input\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [maxlength]=\"7\"\n />\n <doku-form-field doku-field-prefix appearance=\"border-block-inside\" class=\"d-color-picker-prefix\">\n <input\n type=\"color\"\n class=\"d-color-picker-input-color\"\n [(ngModel)]=\"value\"\n (input)=\"onColorChange($event)\"\n [disabled]=\"disabled || readonly\"\n [readonly]=\"readonly\"\n />\n </doku-form-field>\n</doku-form-field>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{ type: Optional }, { type: Self }] }, { type: i2.DokuFormField, decorators: [{ type: Optional }, { type: Host }] }]; }, propDecorators: { disabled: [{ type: Input }], readonly: [{ type: Input }], value: [{ type: Input }], valueChange: [{ type: Output }], classes: [{ type: HostBinding, args: ['class'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQVcsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFdBQVcsRUFDWCxLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBRUosaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFhLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUYsT0FBTyxFQUNMLHdCQUF3QixFQUl4QixtQkFBbUIsR0FFcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBWXJDLE1BQU0sT0FBTyxlQUFlO0lBZTFCOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMs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aUJBRTFFLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLGlCQUFpQixFQUFFLENBQUM7OzBCQTRDN0UsUUFBUTs7MEJBQUksSUFBSTs7MEJBQ2hCLFFBQVE7OzBCQUFJLElBQUk7NENBcENWLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSztnQkFPRixLQUFLO3NCQURSLEtBQUs7Z0JBYUksV0FBVztzQkFBcEIsTUFBTTtnQkFHWSxPQUFPO3NCQUR6QixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5nQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgZGVsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBza2lwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERPS1VfRk9STV9GSUVMRF9BQ0NFU1NPUixcbiAgRG9rdUZvcm1GaWVsZCxcbiAgRG9rdUZvcm1GaWVsZEFjY2Vzc29yLFxuICBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlLFxuICBEb2t1Rm9ybUZpZWxkTW9kdWxlLFxuICBEb2t1Rm9ybUZpZWxkT3B0aW9ucyxcbn0gZnJvbSAnLi4vZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEb2t1SW5wdXQgfSBmcm9tICcuLi9pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rva3UtY29sb3ItcGlja2VyJyxcbiAgZXhwb3J0QXM6ICdkb2t1Q29sb3JQaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEb2t1Rm9ybUZpZWxkTW9kdWxlLCBEb2t1SW5wdXQsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbG9yLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IERPS1VfRk9STV9GSUVMRF9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IERva3VDb2xvclBpY2tlciB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdUNvbG9yUGlja2VyXG4gIGltcGxlbWVudHMgRG9rdUZvcm1GaWVsZEFjY2Vzc29yLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBjb2xvciBwaWNrZXIuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNvbG9yIHBpY2tlciBpcyByZWFkb25seS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSBjb2xvciBwaWNrZXIgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LlxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlIHx8ICcnO1xuICB9XG4gIHNldCB2YWx1ZShoZXhDb2xvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gaGV4Q29sb3IgfHwgJyc7XG4gICAgdGhpcy52YWx1ZSQubmV4dCh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlZCB3aGVuIHZhbHVlIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsYXNzZXM6IE5nQ2xhc3NbJ25nQ2xhc3MnXSA9IFsnZC1jb2xvci1waWNrZXInXTtcblxuICBwcml2YXRlIHZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy52YWx1ZSk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcm90ZWN0ZWQgZm9ybUZpZWxkPzogRG9rdUZvcm1GaWVsZFxuICApIHtcbiAgICBpZiAobmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBmaWVsZE9wdGlvbnM/OiBEb2t1Rm9ybUZpZWxkT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHsgd2l0aG91dElucHV0U3R5bGU6IHRydWUgfTtcbiAgb25EaXNhYmxlPzogKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9uUmVhZG9ubHk/OiAoKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgb25WYWxpZGF0ZT86ICgodmFsdWU/OiBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVnaXN0ZXJPbkRpc2FibGUoZm46ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25EaXNhYmxlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblJlYWRvbmx5KGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVhZG9ubHkgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVmFsaWRhdGU/KGZuOiAodmFsdWU/OiBEb2t1Rm9ybUZpZWxkQWNjZXNzb3JWYWxpZGF0ZVZhbHVlIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblZhbGlkYXRlID0gZm47XG4gIH1cblxuICBvbkNoYW5nZT86ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuICB3cml0ZVZhbHVlKHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlJFxuICAgICAgLnBpcGUoc2tpcCgxKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZT8uKHZhbHVlKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm5nQ29udHJvbD8uc3RhdHVzQ2hhbmdlc1xuICAgICAgPy5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIGRlbGF5KDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ1ZBTElEJykge1xuICAgICAgICAgIHRoaXMub25WYWxpZGF0ZT8uKCd2YWxpZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ0lOVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5vblZhbGlkYXRlPy4oJ2ludmFsaWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uVmFsaWRhdGU/LigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydkaXNhYmxlZCddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMub25EaXNhYmxlPy4oISF0aGlzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sncmVhZG9ubHknXT8ucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlc1sncmVhZG9ubHknXT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLm9uUmVhZG9ubHk/LighIXRoaXMucmVhZG9ubHkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Db2xvckNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9uVG91Y2hlZD8uKCk7XG4gIH1cbn1cbiIsIjxkb2t1LWZvcm0tZmllbGRcbiAgW2lzRXJyb3JTdGF0ZV09XCJmb3JtRmllbGQ/LlsnaXNFcnJvciddXCJcbiAgW2lzU3VjY2Vzc1N0YXRlXT1cImZvcm1GaWVsZD8uWydpc1N1Y2Nlc3MnXVwiXG4gIFtzaG93U3VjY2Vzc0JlaGF2aW9yXT1cIiEhZm9ybUZpZWxkPy5bJ3Nob3dTdWNjZXNzQmVoYXZpb3InXVwiXG4+XG4gIDxpbnB1dFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBkb2t1LWlucHV0XG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgKGlucHV0KT1cIm9uQ29sb3JDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFttYXhsZW5ndGhdPVwiN1wiXG4gIC8+XG4gIDxkb2t1LWZvcm0tZmllbGQgZG9rdS1maWVsZC1wcmVmaXggYXBwZWFyYW5jZT1cImJvcmRlci1ibG9jay1pbnNpZGVcIiBjbGFzcz1cImQtY29sb3ItcGlja2VyLXByZWZpeFwiPlxuICAgIDxpbnB1dFxuICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgIGNsYXNzPVwiZC1jb2xvci1waWNrZXItaW5wdXQtY29sb3JcIlxuICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgICAoaW5wdXQpPVwib25Db2xvckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIC8+XG4gIDwvZG9rdS1mb3JtLWZpZWxkPlxuPC9kb2t1LWZvcm0tZmllbGQ+XG4iXX0=