UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

69 lines 21.1 kB
import { Component, forwardRef, Input, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { isStringEmptyOrNull } from '../../shared'; import { BaseInputComboComponent } from './base-input-combo.component'; import { DsfrInputTypeConst } from './form-input.model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "../../components/button/button.component"; import * as i4 from "../../shared/components/input-group/input-group.component"; export class DsfrFormInputComponent extends BaseInputComboComponent { /** @deprecated since 1.2 use `type` instead. */ get textarea() { return this.isTextArea(); } /** @deprecated (@since 1.2) utiliser `type` à la place. */ set textarea(value) { this.type = value ? DsfrInputTypeConst.TEXTAREA : DsfrInputTypeConst.TEXT; } /** @internal */ isTextArea() { return this.type === DsfrInputTypeConst.TEXTAREA; } /** @internal */ hasInputWrap() { return this.hasButton() || !isStringEmptyOrNull(this.icon); } /** @internal */ getWrapClasses() { let classes = ['fr-input-wrap']; if (this.hasButton() && this.inputWrapMode === 'addon') classes.push('fr-input-wrap--addon'); if (this.hasButton() && this.inputWrapMode === 'action') classes.push('fr-input-wrap--action'); if (this.icon) classes.push(this.icon); return classes; } /** @internal */ onButtonClick(event) { if (this.buttonType != 'submit') this.buttonSelect.emit(event); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrFormInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrFormInputComponent, selector: "dsfr-form-input", inputs: { rows: "rows", width: "width", textarea: "textarea" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrFormInputComponent), multi: true, }, ], usesInheritance: true, ngImport: i0, template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"severity\">\n <label class=\"fr-label\" [for]=\"inputId\">\n <ng-container *ngIf=\"label\">{{ label }}</ng-container>\n <ng-content *ngIf=\"!label\" select=\"[label]\"></ng-content>\n <span *ngIf=\"hint\" class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <ng-container *ngIf=\"!isTextArea(); else textareaTemplate\">\n <ng-container *ngIf=\"!hasInputWrap(); else inputWrapTemplate\" [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n </ng-container>\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"role || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled ?? false\"\n [required]=\"required ?? false\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\n\n<!-- Template input wrap -->\n<ng-template #inputWrapTemplate>\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n <dsfr-button\n *ngIf=\"hasButton()\"\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n </div>\n</ng-template>\n\n<!-- Template textarea -->\n<ng-template #textareaTemplate>\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled ?? false\"\n [attr.required]=\"required || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.DsfrButtonComponent, selector: "dsfr-button", inputs: ["label", "type", "tooltipMessage", "variant", "size", "icon", "iconPosition", "disabled", "uppercase", "loader", "ariaLabel", "invertedOutlineContrast", "id", "ariaControls", "customClass"] }, { kind: "component", type: i4.InputGroupComponent, selector: "edu-input-group", inputs: ["label", "inputId", "hint", "disabled", "message", "severity", "messagesGroupId"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrFormInputComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-form-input', encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrFormInputComponent), multi: true, }, ], template: "<edu-input-group\n [inputId]=\"inputId\"\n [label]=\"label\"\n [hint]=\"hint\"\n [messagesGroupId]=\"messagesGroupId\"\n [disabled]=\"disabled\"\n [message]=\"message\"\n [severity]=\"severity\">\n <label class=\"fr-label\" [for]=\"inputId\">\n <ng-container *ngIf=\"label\">{{ label }}</ng-container>\n <ng-content *ngIf=\"!label\" select=\"[label]\"></ng-content>\n <span *ngIf=\"hint\" class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <ng-container *ngIf=\"!isTextArea(); else textareaTemplate\">\n <ng-container *ngIf=\"!hasInputWrap(); else inputWrapTemplate\" [ngTemplateOutlet]=\"inputTemplate\"></ng-container>\n </ng-container>\n</edu-input-group>\n\n<!-- Templates -------------------------------------------------------------------------------------------------------->\n\n<!-- Template input -->\n<ng-template #inputTemplate>\n <input\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-autocomplete]=\"ariaAutocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-required]=\"required || null\"\n [attr.role]=\"role || null\"\n [attr.inputmode]=\"inputMode || null\"\n [attr.autocorrect]=\"autoCorrect ? null : 'off'\"\n [(ngModel)]=\"value\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [attr.type]=\"type || null\"\n [disabled]=\"disabled ?? false\"\n [required]=\"required ?? false\"\n [attr.pattern]=\"pattern || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.spellcheck]=\"spellCheck || null\"\n [ngStyle]=\"width ? { width: width } : {}\" />\n</ng-template>\n\n<!-- Template input wrap -->\n<ng-template #inputWrapTemplate>\n <div [ngClass]=\"getWrapClasses()\">\n <ng-container *ngTemplateOutlet=\"inputTemplate\"></ng-container>\n <dsfr-button\n *ngIf=\"hasButton()\"\n [ariaLabel]=\"buttonAriaLabel\"\n [disabled]=\"buttonDisabled\"\n [icon]=\"buttonIcon\"\n [label]=\"buttonLabel\"\n [tooltipMessage]=\"buttonTooltipMessage\"\n [type]=\"buttonType\"\n [variant]=\"buttonVariant\"\n (click)=\"onButtonClick($event)\"></dsfr-button>\n </div>\n</ng-template>\n\n<!-- Template textarea -->\n<ng-template #textareaTemplate>\n <textarea\n class=\"fr-input\"\n [ngClass]=\"customClass || null\"\n [id]=\"inputId\"\n [attr.name]=\"name || null\"\n [disabled]=\"disabled ?? false\"\n [attr.required]=\"required || null\"\n [attr.placeholder]=\"placeHolder || null\"\n [attr.min]=\"min || null\"\n [attr.max]=\"max || null\"\n [attr.maxLength]=\"maxLength || null\"\n [attr.minLength]=\"minLength || null\"\n [attr.autocomplete]=\"autocomplete || null\"\n [attr.aria-describedby]=\"messagesGroupId\"\n [(ngModel)]=\"value\"\n [ngStyle]=\"width ? { width: width } : {}\"\n [attr.rows]=\"rows || null\"></textarea>\n</ng-template>\n" }] }], propDecorators: { rows: [{ type: Input }], width: [{ type: Input }], textarea: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvZm9ybXMvZm9ybS1pbnB1dC9mb3JtLWlucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7O0FBY3hELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSx1QkFBdUI7SUFZakUsZ0RBQWdEO0lBQ2hELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsSUFBYSxRQUFRLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7SUFDNUUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztJQUNuRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGNBQWM7UUFDWixJQUFJLE9BQU8sR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTztZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM3RixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVE7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDL0YsSUFBSSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsYUFBYSxDQUFDLEtBQVk7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDOytHQTdDVSxzQkFBc0I7bUdBQXRCLHNCQUFzQiwwR0FSdEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2dCQUNyRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsaURDaEJILGlzR0F3RkE7OzRGRHRFYSxzQkFBc0I7a0JBWmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUVaLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUM7NEJBQ3JELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQU1RLElBQUk7c0JBQVosS0FBSztnQkFNRyxLQUFLO3NCQUFiLEtBQUs7Z0JBUU8sUUFBUTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzU3RyaW5nRW1wdHlPck51bGwgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgQmFzZUlucHV0Q29tYm9Db21wb25lbnQgfSBmcm9tICcuL2Jhc2UtaW5wdXQtY29tYm8uY29tcG9uZW50JztcbmltcG9ydCB7IERzZnJJbnB1dFR5cGVDb25zdCB9IGZyb20gJy4vZm9ybS1pbnB1dC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZm9ybS1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRm9ybUlucHV0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJGb3JtSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBCYXNlSW5wdXRDb21ib0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBUeXBlICd0ZXh0YXJlYScgOiBub21icmUgZGUgbGlnbmVzLlxuICAgKi9cbiAgQElucHV0KCkgcm93czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS4yKSB1dGlsaXNlciBgY3VzdG9tQ2xhc3NgIMOgIGxhIHBsYWNlLlxuICAgKiBMYXJnZXVyIGRlIGwnaW5wdXQsIGAnMTAwJSdgIHBhciBkw6lmYXV0LCBgJzEwcmVtJ2AgcGFyIGTDqWZhdXQgcG91ciB1biB0eXBlIGRhdGUuXG4gICAqL1xuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nO1xuXG4gIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjIgdXNlIGB0eXBlYCBpbnN0ZWFkLiAqL1xuICBnZXQgdGV4dGFyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNUZXh0QXJlYSgpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChAc2luY2UgMS4yKSB1dGlsaXNlciBgdHlwZWAgw6AgbGEgcGxhY2UuICovXG4gIEBJbnB1dCgpIHNldCB0ZXh0YXJlYSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudHlwZSA9IHZhbHVlID8gRHNmcklucHV0VHlwZUNvbnN0LlRFWFRBUkVBIDogRHNmcklucHV0VHlwZUNvbnN0LlRFWFQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGlzVGV4dEFyZWEoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRHNmcklucHV0VHlwZUNvbnN0LlRFWFRBUkVBO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBoYXNJbnB1dFdyYXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQnV0dG9uKCkgfHwgIWlzU3RyaW5nRW1wdHlPck51bGwodGhpcy5pY29uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0V3JhcENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzID0gWydmci1pbnB1dC13cmFwJ107XG4gICAgaWYgKHRoaXMuaGFzQnV0dG9uKCkgJiYgdGhpcy5pbnB1dFdyYXBNb2RlID09PSAnYWRkb24nKSBjbGFzc2VzLnB1c2goJ2ZyLWlucHV0LXdyYXAtLWFkZG9uJyk7XG4gICAgaWYgKHRoaXMuaGFzQnV0dG9uKCkgJiYgdGhpcy5pbnB1dFdyYXBNb2RlID09PSAnYWN0aW9uJykgY2xhc3Nlcy5wdXNoKCdmci1pbnB1dC13cmFwLS1hY3Rpb24nKTtcbiAgICBpZiAodGhpcy5pY29uKSBjbGFzc2VzLnB1c2godGhpcy5pY29uKTtcblxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkJ1dHRvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmJ1dHRvblR5cGUgIT0gJ3N1Ym1pdCcpIHRoaXMuYnV0dG9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8ZWR1LWlucHV0LWdyb3VwXG4gIFtpbnB1dElkXT1cImlucHV0SWRcIlxuICBbbGFiZWxdPVwibGFiZWxcIlxuICBbaGludF09XCJoaW50XCJcbiAgW21lc3NhZ2VzR3JvdXBJZF09XCJtZXNzYWdlc0dyb3VwSWRcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgW3NldmVyaXR5XT1cInNldmVyaXR5XCI+XG4gIDxsYWJlbCBjbGFzcz1cImZyLWxhYmVsXCIgW2Zvcl09XCJpbnB1dElkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxhYmVsXCI+e3sgbGFiZWwgfX08L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudCAqbmdJZj1cIiFsYWJlbFwiIHNlbGVjdD1cIltsYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPHNwYW4gKm5nSWY9XCJoaW50XCIgY2xhc3M9XCJmci1oaW50LXRleHRcIj57eyBoaW50IH19PC9zcGFuPlxuICA8L2xhYmVsPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGV4dEFyZWEoKTsgZWxzZSB0ZXh0YXJlYVRlbXBsYXRlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNJbnB1dFdyYXAoKTsgZWxzZSBpbnB1dFdyYXBUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImlucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2VkdS1pbnB1dC1ncm91cD5cblxuPCEtLSBUZW1wbGF0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG5cbjwhLS0gVGVtcGxhdGUgaW5wdXQgLS0+XG48bmctdGVtcGxhdGUgI2lucHV0VGVtcGxhdGU+XG4gIDxpbnB1dFxuICAgIGNsYXNzPVwiZnItaW5wdXRcIlxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzIHx8IG51bGxcIlxuICAgIFthdHRyLmF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXJpYUF1dG9jb21wbGV0ZSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm1lc3NhZ2VzR3JvdXBJZFwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFyaWFFeHBhbmRlZCAhPT0gdW5kZWZpbmVkID8gYXJpYUV4cGFuZGVkIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZCB8fCBudWxsXCJcbiAgICBbYXR0ci5yb2xlXT1cInJvbGUgfHwgbnVsbFwiXG4gICAgW2F0dHIuaW5wdXRtb2RlXT1cImlucHV0TW9kZSB8fCBudWxsXCJcbiAgICBbYXR0ci5hdXRvY29ycmVjdF09XCJhdXRvQ29ycmVjdCA/IG51bGwgOiAnb2ZmJ1wiXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgW2lkXT1cImlucHV0SWRcIlxuICAgIFthdHRyLm5hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICBbYXR0ci50eXBlXT1cInR5cGUgfHwgbnVsbFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkID8/IGZhbHNlXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWQgPz8gZmFsc2VcIlxuICAgIFthdHRyLnBhdHRlcm5dPVwicGF0dGVybiB8fCBudWxsXCJcbiAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlciB8fCBudWxsXCJcbiAgICBbYXR0ci5taW5dPVwibWluIHx8IG51bGxcIlxuICAgIFthdHRyLm1heF09XCJtYXggfHwgbnVsbFwiXG4gICAgW2F0dHIubWF4TGVuZ3RoXT1cIm1heExlbmd0aCB8fCBudWxsXCJcbiAgICBbYXR0ci5taW5MZW5ndGhdPVwibWluTGVuZ3RoIHx8IG51bGxcIlxuICAgIFthdHRyLnNwZWxsY2hlY2tdPVwic3BlbGxDaGVjayB8fCBudWxsXCJcbiAgICBbbmdTdHlsZV09XCJ3aWR0aCA/IHsgd2lkdGg6IHdpZHRoIH0gOiB7fVwiIC8+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRlbXBsYXRlIGlucHV0IHdyYXAgLS0+XG48bmctdGVtcGxhdGUgI2lucHV0V3JhcFRlbXBsYXRlPlxuICA8ZGl2IFtuZ0NsYXNzXT1cImdldFdyYXBDbGFzc2VzKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxkc2ZyLWJ1dHRvblxuICAgICAgKm5nSWY9XCJoYXNCdXR0b24oKVwiXG4gICAgICBbYXJpYUxhYmVsXT1cImJ1dHRvbkFyaWFMYWJlbFwiXG4gICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uRGlzYWJsZWRcIlxuICAgICAgW2ljb25dPVwiYnV0dG9uSWNvblwiXG4gICAgICBbbGFiZWxdPVwiYnV0dG9uTGFiZWxcIlxuICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cImJ1dHRvblRvb2x0aXBNZXNzYWdlXCJcbiAgICAgIFt0eXBlXT1cImJ1dHRvblR5cGVcIlxuICAgICAgW3ZhcmlhbnRdPVwiYnV0dG9uVmFyaWFudFwiXG4gICAgICAoY2xpY2spPVwib25CdXR0b25DbGljaygkZXZlbnQpXCI+PC9kc2ZyLWJ1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRlbXBsYXRlIHRleHRhcmVhIC0tPlxuPG5nLXRlbXBsYXRlICN0ZXh0YXJlYVRlbXBsYXRlPlxuICA8dGV4dGFyZWFcbiAgICBjbGFzcz1cImZyLWlucHV0XCJcbiAgICBbbmdDbGFzc109XCJjdXN0b21DbGFzcyB8fCBudWxsXCJcbiAgICBbaWRdPVwiaW5wdXRJZFwiXG4gICAgW2F0dHIubmFtZV09XCJuYW1lIHx8IG51bGxcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCA/PyBmYWxzZVwiXG4gICAgW2F0dHIucmVxdWlyZWRdPVwicmVxdWlyZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2VIb2xkZXIgfHwgbnVsbFwiXG4gICAgW2F0dHIubWluXT1cIm1pbiB8fCBudWxsXCJcbiAgICBbYXR0ci5tYXhdPVwibWF4IHx8IG51bGxcIlxuICAgIFthdHRyLm1heExlbmd0aF09XCJtYXhMZW5ndGggfHwgbnVsbFwiXG4gICAgW2F0dHIubWluTGVuZ3RoXT1cIm1pbkxlbmd0aCB8fCBudWxsXCJcbiAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibWVzc2FnZXNHcm91cElkXCJcbiAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICBbbmdTdHlsZV09XCJ3aWR0aCA/IHsgd2lkdGg6IHdpZHRoIH0gOiB7fVwiXG4gICAgW2F0dHIucm93c109XCJyb3dzIHx8IG51bGxcIj48L3RleHRhcmVhPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==