123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import { ChangeDetectionStrategy, Component, DestroyRef, EventEmitter, Input, Output, forwardRef, inject, } from '@angular/core';
- import { FormGenericComponent } from '../../services/form-generic.abstract';
- import { FormErrorComponent } from '../error/error.component';
- import { LabelComponent } from '../label/label.component';
- import { AsyncPipe, NgClass } from '@angular/common';
- import { IconComponent } from '../../components/atoms/icon/icon.component';
- import { OptionComponent } from '../option/option.component';
- import { provideControlContainer, provideValueAccessor } from '../utils/form.util';
- import { InputComponent } from '../input/input.component';
- import { BehaviorSubject, Subject, debounceTime } from 'rxjs';
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
- import * as i0 from "@angular/core";
- import * as i1 from "@angular/forms";
- export class AutocompleteComponent extends FormGenericComponent {
- constructor(formGroupDirective) {
- super(formGroupDirective);
- this.destroyRef = inject(DestroyRef);
- this.key = '';
- this.options = [];
- this.label = '';
- this.icon = '';
- this.helper = '';
- this.placeholder = '';
- this.value = '';
- this.inputValue = '';
- this.iconPosition = 'left';
- this.disposition = 'vertical';
- this.fullSize = true;
- this.multiple = false;
- this.showError = false;
- this.typed = new EventEmitter();
- this.selected = new EventEmitter();
- this.focusOut$ = new Subject();
- this.inputValue$ = new BehaviorSubject('');
- this.focusOut$.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(150)).subscribe(() => {
- this.options = [];
- this.triggerTouched();
- this.triggerMarkCheck();
- });
- }
- input(value) {
- if (!value)
- this.options = [];
- if (this.value && !this.multiple) {
- this.setValue(null);
- this.inputValue$.next('');
- return;
- }
- if (this.multiple) {
- this.inputValue$.next(value);
- }
- this.typed.emit(value);
- }
- setValue(value, propagate = true) {
- this.value = value;
- if (propagate) {
- this.triggerChange(value);
- this.selected.emit(value);
- }
- if (value) {
- const selectedOption = this.options.find(option => option.key === value);
- if (!this.multiple)
- this.inputValue$.next(selectedOption ? selectedOption.label : this.placeholder);
- else {
- const currentWords = this.inputValue$.getValue().split(' ');
- // replacing the last word with the current 'label' value
- currentWords[currentWords.length - 1] = selectedOption ? selectedOption.label : this.placeholder;
- this.inputValue$.next(currentWords.join(' '));
- }
- }
- }
- writeValue(value) {
- this.triggerMarkCheck();
- this.setValue(value, false);
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: AutocompleteComponent, deps: [{ token: i1.FormGroupDirective }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: AutocompleteComponent, isStandalone: true, selector: "ct-autocomplete", inputs: { formControlName: "formControlName", key: "key", options: "options", label: "label", icon: "icon", helper: "helper", placeholder: "placeholder", value: "value", inputValue: "inputValue", iconPosition: "iconPosition", disposition: "disposition", fullSize: "fullSize", multiple: "multiple", showError: "showError" }, outputs: { typed: "typed", selected: "selected" }, providers: [provideValueAccessor(forwardRef(() => AutocompleteComponent))], usesInheritance: true, ngImport: i0, template: "<div class=\"flex gap-1 font-primary\" [class.flex-col]=\"disposition === 'vertical'\">\n @if (label) {\n <ct-form-label\n [text]=\"label\"\n [hasError]=\"hasErrors(formControl)\"\n [showError]=\"showError\"\n [formControlName]=\"formControlName\" />\n }\n <div class=\"flex flex-col\" [class.w-full]=\"fullSize\" [class.w-fit]=\"!fullSize\">\n <ct-input\n key=\"autocomplete\"\n [canDelete]=\"true\"\n [helper]=\"helper\"\n [value]=\"inputValue$ | async\"\n [placeholder]=\"placeholder\"\n (typed)=\"input($event)\"\n (focusout)=\"focusOut$.next($event)\" />\n @if (options && options.length > 0) {\n <div class=\"relative flex flex-col\">\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-0.5 z-10 flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @for (option of options; track option) {\n <ct-option (click)=\"setValue(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n }\n </div>\n @if (formControl) {\n <ct-form-alert\n [hasErrors]=\"hasErrors(formControl)\"\n [helper]=\"helper\"\n [errors]=\"formControl.errors ?? {}\"\n size=\"xs\" />\n }\n</div>\n", dependencies: [{ kind: "component", type: FormErrorComponent, selector: "ct-form-alert", inputs: ["errors", "size", "hasErrors", "fullSize", "helper", "errorMessages"] }, { kind: "component", type: LabelComponent, selector: "ct-form-label", inputs: ["text", "type", "formControlName", "hasError", "showError"] }, { kind: "component", type: OptionComponent, selector: "ct-option", inputs: ["label", "icon"] }, { kind: "component", type: InputComponent, selector: "ct-input", inputs: ["formControlName", "key", "type", "value", "label", "icon", "helper", "placeholder", "symbol", "canDelete", "fullSize", "showError", "min", "max", "iconPosition", "disposition"], outputs: ["typed"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], viewProviders: [provideControlContainer()], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: AutocompleteComponent, decorators: [{
- type: Component,
- args: [{ selector: 'ct-autocomplete', standalone: true, imports: [IconComponent, FormErrorComponent, LabelComponent, OptionComponent, InputComponent, NgClass, AsyncPipe], providers: [provideValueAccessor(forwardRef(() => AutocompleteComponent))], viewProviders: [provideControlContainer()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex gap-1 font-primary\" [class.flex-col]=\"disposition === 'vertical'\">\n @if (label) {\n <ct-form-label\n [text]=\"label\"\n [hasError]=\"hasErrors(formControl)\"\n [showError]=\"showError\"\n [formControlName]=\"formControlName\" />\n }\n <div class=\"flex flex-col\" [class.w-full]=\"fullSize\" [class.w-fit]=\"!fullSize\">\n <ct-input\n key=\"autocomplete\"\n [canDelete]=\"true\"\n [helper]=\"helper\"\n [value]=\"inputValue$ | async\"\n [placeholder]=\"placeholder\"\n (typed)=\"input($event)\"\n (focusout)=\"focusOut$.next($event)\" />\n @if (options && options.length > 0) {\n <div class=\"relative flex flex-col\">\n <div\n [class.w-full]=\"fullSize\"\n [class.w-fit]=\"!fullSize\"\n class=\"absolute top-0.5 z-10 flex max-h-72 flex-col overflow-y-auto rounded-md border border-neutral-400 bg-surface text-on-surface shadow-lg dark:bg-surface-dark dark:text-on-surface-dark\">\n @for (option of options; track option) {\n <ct-option (click)=\"setValue(option.key)\" [label]=\"option.label\" [icon]=\"option.icon!\" />\n }\n </div>\n </div>\n }\n </div>\n @if (formControl) {\n <ct-form-alert\n [hasErrors]=\"hasErrors(formControl)\"\n [helper]=\"helper\"\n [errors]=\"formControl.errors ?? {}\"\n size=\"xs\" />\n }\n</div>\n" }]
- }], ctorParameters: () => [{ type: i1.FormGroupDirective }], propDecorators: { formControlName: [{
- type: Input
- }], key: [{
- type: Input,
- args: [{ required: true }]
- }], options: [{
- type: Input,
- args: [{ required: true }]
- }], label: [{
- type: Input
- }], icon: [{
- type: Input
- }], helper: [{
- type: Input
- }], placeholder: [{
- type: Input
- }], value: [{
- type: Input
- }], inputValue: [{
- type: Input
- }], iconPosition: [{
- type: Input
- }], disposition: [{
- type: Input
- }], fullSize: [{
- type: Input
- }], multiple: [{
- type: Input
- }], showError: [{
- type: Input
- }], typed: [{
- type: Output
- }], selected: [{
- type: Output
- }] } });
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9mb3Jtcy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBWWhFLE1BQU0sT0FBTyxxQkFB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QUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ0UsT0FBTztzQkFBakMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdlbmVyaWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLWdlbmVyaWMuYWJzdHJhY3QnO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9zaXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9jb21wb25lbnRzL2NvbXBvbmVudC1wb3NpdGlvbi50eXBlJztcbmltcG9ydCB7IEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1FcnJvckNvbXBvbmVudCB9IGZyb20gJy4uL2Vycm9yL2Vycm9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2xhYmVsL2xhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtT3B0aW9uQmFzZSB9IGZyb20gJy4uLy4uL21vZGVsL2Zvcm1zL2Zvcm0tYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi9vcHRpb24vb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBwcm92aWRlQ29udHJvbENvbnRhaW5lciwgcHJvdmlkZVZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9mb3JtLnV0aWwnO1xuaW1wb3J0IHsgSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbXBvbmVudERpc3Bvc2l0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWwvY29tcG9uZW50cy9jb21wb25lbnQtZGlzcG9zaXRpb24uZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N0LWF1dG9jb21wbGV0ZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJY29uQ29tcG9uZW50LCBGb3JtRXJyb3JDb21wb25lbnQsIExhYmVsQ29tcG9uZW50LCBPcHRpb25Db21wb25lbnQsIElucHV0Q29tcG9uZW50LCBOZ0NsYXNzLCBBc3luY1BpcGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbcHJvdmlkZVZhbHVlQWNjZXNzb3IoZm9yd2FyZFJlZigoKSA9PiBBdXRvY29tcGxldGVDb21wb25lbnQpKV0sXG4gIHZpZXdQcm92aWRlcnM6IFtwcm92aWRlQ29udHJvbENvbnRhaW5lcigpXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudCBleHRlbmRzIEZvcm1HZW5lcmljQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBASW5wdXQoKSBmb3JtQ29udHJvbE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGtleSA9ICcnO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBvcHRpb25zOiBGb3JtT3B0aW9uQmFzZVtdID0gW107XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGljb24gPSAnJztcbiAgQElucHV0KCkgaGVscGVyID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIHZhbHVlOiBhbnkgPSAnJztcbiAgQElucHV0KCkgaW5wdXRWYWx1ZSA9ICcnO1xuICBASW5wdXQoKSBpY29uUG9zaXRpb246IENvbXBvbmVudFBvc2l0aW9uID0gJ2xlZnQnO1xuICBASW5wdXQoKSBkaXNwb3NpdGlvbjogQ29tcG9uZW50RGlzcG9zaXRpb24gPSAndmVydGljYWwnO1xuICBASW5wdXQoKSBmdWxsU2l6ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dFcnJvciA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB0eXBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmb2N1c091dCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIGlucHV0VmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcblxuICBjb25zdHJ1Y3Rvcihmb3JtR3JvdXBEaXJlY3RpdmU6IEZvcm1Hcm91cERpcmVjdGl2ZSkge1xuICAgIHN1cGVyKGZvcm1Hcm91cERpcmVjdGl2ZSk7XG5cbiAgICB0aGlzLmZvY3VzT3V0JC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLCBkZWJvdW5jZVRpbWUoMTUwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgICAgdGhpcy50cmlnZ2VyVG91Y2hlZCgpO1xuICAgICAgdGhpcy50cmlnZ2VyTWFya0NoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpbnB1dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkgdGhpcy5vcHRpb25zID0gW107XG4gICAgaWYgKHRoaXMudmFsdWUgJiYgIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCk7XG4gICAgICB0aGlzLmlucHV0VmFsdWUkLm5leHQoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlJC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy50eXBlZC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBhbnksIHByb3BhZ2F0ZSA9IHRydWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocHJvcGFnYXRlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5rZXkgPT09IHZhbHVlKSE7XG4gICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHRoaXMuaW5wdXRWYWx1ZSQubmV4dChzZWxlY3RlZE9wdGlvbiA/IHNlbGVjdGVkT3B0aW9uLmxhYmVsIDogdGhpcy5wbGFjZWhvbGRlcik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudFdvcmRzID0gdGhpcy5pbnB1dFZhbHVlJC5nZXRWYWx1ZSgpLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vIHJlcGxhY2luZyB0aGUgbGFzdCB3b3JkIHdpdGggdGhlIGN1cnJlbnQgJ2xhYmVsJyB2YWx1ZVxuICAgICAgICBjdXJyZW50V29yZHNbY3VycmVudFdvcmRzLmxlbmd0aCAtIDFdID0gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi5sYWJlbCA6IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSQubmV4dChjdXJyZW50V29yZHMuam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnRyaWdnZXJNYXJrQ2hlY2soKTtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGdhcC0xIGZvbnQtcHJpbWFyeVwiIFtjbGFzcy5mbGV4LWNvbF09XCJkaXNwb3NpdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiPlxuICBAaWYgKGxhYmVsKSB7XG4gICAgPGN0LWZvcm0tbGFiZWxcbiAgICAgIFt0ZXh0XT1cImxhYmVsXCJcbiAgICAgIFtoYXNFcnJvcl09XCJoYXNFcnJvcnMoZm9ybUNvbnRyb2wpXCJcbiAgICAgIFtzaG93RXJyb3JdPVwic2hvd0Vycm9yXCJcbiAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUNvbnRyb2xOYW1lXCIgLz5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIiBbY2xhc3Mudy1maXRdPVwiIWZ1bGxTaXplXCI+XG4gICAgPGN0LWlucHV0XG4gICAgICBrZXk9XCJhdXRvY29tcGxldGVcIlxuICAgICAgW2NhbkRlbGV0ZV09XCJ0cnVlXCJcbiAgICAgIFtoZWxwZXJdPVwiaGVscGVyXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dFZhbHVlJCB8IGFzeW5jXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAodHlwZWQpPVwiaW5wdXQoJGV2ZW50KVwiXG4gICAgICAoZm9jdXNvdXQpPVwiZm9jdXNPdXQkLm5leHQoJGV2ZW50KVwiIC8+XG4gICAgQGlmIChvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiZnVsbFNpemVcIlxuICAgICAgICAgIFtjbGFzcy53LWZpdF09XCIhZnVsbFNpemVcIlxuICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAuNSB6LTEwIGZsZXggbWF4LWgtNzIgZmxleC1jb2wgb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1uZXV0cmFsLTQwMCBiZy1zdXJmYWNlIHRleHQtb24tc3VyZmFjZSBzaGFkb3ctbGcgZGFyazpiZy1zdXJmYWNlLWRhcmsgZGFyazp0ZXh0LW9uLXN1cmZhY2UtZGFya1wiPlxuICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDxjdC1vcHRpb24gKGNsaWNrKT1cInNldFZhbHVlKG9wdGlvbi5rZXkpXCIgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiIFtpY29uXT1cIm9wdGlvbi5pY29uIVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICA8Y3QtZm9ybS1hbGVydFxuICAgICAgW2hhc0Vycm9yc109XCJoYXNFcnJvcnMoZm9ybUNvbnRyb2wpXCJcbiAgICAgIFtoZWxwZXJdPVwiaGVscGVyXCJcbiAgICAgIFtlcnJvcnNdPVwiZm9ybUNvbnRyb2wuZXJyb3JzID8/IHt9XCJcbiAgICAgIHNpemU9XCJ4c1wiIC8+XG4gIH1cbjwvZGl2PlxuIl19
|