UNPKG

@tangential/input-widgets

Version:

Input Widgets with persistable, dynamic configuration.

204 lines (202 loc) 21 kB
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Hacks } from '@tangential/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/material/form-field"; import * as i4 from "@angular/material/input"; import * as i5 from "./text-widget.component"; /** * Provider Expression that allows this widget to register as a ControlValueAccessor. * This allows it to support [(ngModel)]. * @docs-private */ export const TANJ_TEXT_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextWidgetConfigureComponent), multi: true }; export class TextWidgetConfigureChange { constructor(source, value) { this.source = source; this.value = value; } } export class TextWidgetConfigureComponent { constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; this.flex = ''; this.flexLayout = 'column'; this.flexLayoutAlign = 'start'; this.value = ''; this.valueChange = new EventEmitter(false); this.labelPosition = 'before'; this.disabled = false; /** * Configuration Fields */ this.label = ''; this.defaultValue = ''; this.maxLength = 100; this.minLength = 0; this.labelChange = new EventEmitter(false); this.defaultValueChange = new EventEmitter(false); this.maxLengthChange = new EventEmitter(false); this.minLengthChange = new EventEmitter(false); this.change = new EventEmitter(false); /** * Called when the spinner is blurred. Needed to properly implement ControlValueAccessor. * @docs-private */ this.onTouched = () => { }; this.controlValueAccessorChangeFn = (value) => { }; } ngOnInit() { Hacks.materialDesignPlaceholderText(this.changeDetectorRef); } ngOnChanges(changes) { } emitChangeEvent(value, label) { this.controlValueAccessorChangeFn(this.value); this.change.emit(new TextWidgetConfigureChange(this, this.value)); if (value) { this.valueChange.emit(this.value); this.defaultValueChange.emit(this.defaultValue); } if (label) { this.labelChange.emit(this.label); } } /** * Boilerplate / required for Angular * */ writeValue(value) { this.value = value; } registerOnChange(fn) { this.controlValueAccessorChangeFn = fn; } registerOnTouched(fn) { this.onTouched = fn; } /** * Sets the input's disabled state. Implemented as a part of ControlValueAccessor. * @param isDisabled Whether the input should be disabled. */ setDisabledState(isDisabled) { this.disabled = isDisabled; } } TextWidgetConfigureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: TextWidgetConfigureComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); TextWidgetConfigureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: TextWidgetConfigureComponent, selector: "tanj-text-configure", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", label: "label", defaultValue: "defaultValue", maxLength: "maxLength", minLength: "minLength" }, outputs: { valueChange: "valueChange", labelChange: "labelChange", defaultValueChange: "defaultValueChange", maxLengthChange: "maxLengthChange", minLengthChange: "minLengthChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_TEXT_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- --> <div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start"> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input" (change)="labelChange.emit(label)" [(ngModel)]="label"/> </mat-form-field> <ng-container *ngIf="label"> <tanj-text-widget [(value)]="defaultValue" (valueChange)="value = defaultValue; emitChangeEvent(true, false)" [defaultValue]="defaultValue" [maxLength]="maxLength" [minLength]="minLength" label="Default Value"></tanj-text-widget> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Min Length" (change)="minLengthChange.emit(minLength)" [(ngModel)]="minLength"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Max Length" (change)="maxLengthChange.emit(maxLength)" [(ngModel)]="maxLength"/> </mat-form-field> </ng-container> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.TextWidgetComponent, selector: "tanj-text-widget", inputs: ["value", "labelPosition", "disabled", "hideLabel", "onlyLabel", "label", "defaultValue", "maxLength", "minLength"], outputs: ["valueChange", "change"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: TextWidgetConfigureComponent, decorators: [{ type: Component, args: [{ selector: 'tanj-text-configure', template: `<!-- --> <div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start"> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input" (change)="labelChange.emit(label)" [(ngModel)]="label"/> </mat-form-field> <ng-container *ngIf="label"> <tanj-text-widget [(value)]="defaultValue" (valueChange)="value = defaultValue; emitChangeEvent(true, false)" [defaultValue]="defaultValue" [maxLength]="maxLength" [minLength]="minLength" label="Default Value"></tanj-text-widget> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Min Length" (change)="minLengthChange.emit(minLength)" [(ngModel)]="minLength"/> </mat-form-field> <mat-form-field dividerColor="accent"> <input matInput class="tanj-input" type="number" placeholder="Max Length" (change)="maxLengthChange.emit(maxLength)" [(ngModel)]="maxLength"/> </mat-form-field> </ng-container> </div> `, providers: [TANJ_TEXT_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{ type: HostBinding, args: ['attr.flex'] }], flexLayout: [{ type: HostBinding, args: ['attr.layout'] }], flexLayoutAlign: [{ type: HostBinding, args: ['attr.layout-align'] }], value: [{ type: Input }], valueChange: [{ type: Output }], labelPosition: [{ type: Input }], disabled: [{ type: Input }], label: [{ type: Input }], defaultValue: [{ type: Input }], maxLength: [{ type: Input }], minLength: [{ type: Input }], labelChange: [{ type: Output }], defaultValueChange: [{ type: Output }], maxLengthChange: [{ type: Output }], minLengthChange: [{ type: Output }], change: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC13aWRnZXQtY29uZmlndXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdlbnRpYWwvaW5wdXQtd2lkZ2V0cy9zcmMvbGliL3RleHQtd2lkZ2V0L3RleHQtd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTs7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sOENBQThDLEdBQVE7SUFDakUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDO0lBQzNELEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLFlBQW1CLE1BQW9DLEVBQVMsS0FBYTtRQUExRCxXQUFNLEdBQU4sTUFBTSxDQUE4QjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVE7SUFDN0UsQ0FBQztDQUNGO0FBMENELE1BQU0sT0FBTyw0QkFBNEI7SUFvQ3ZDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBakM5QixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFLLEdBQVcsRUFBRSxDQUFBO1FBQ2pCLGdCQUFXLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTVELGtCQUFhLEdBQWlDLFFBQVEsQ0FBQTtRQUN0RCxhQUFRLEdBQVksS0FBSyxDQUFBO1FBRWxDOztXQUVHO1FBQ00sVUFBSyxHQUFXLEVBQUUsQ0FBQTtRQUNsQixpQkFBWSxHQUFXLEVBQUUsQ0FBQTtRQUN6QixjQUFTLEdBQVcsR0FBRyxDQUFBO1FBQ3ZCLGNBQVMsR0FBVyxDQUFDLENBQUE7UUFFcEIsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDM0QsdUJBQWtCLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xFLG9CQUFlLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9ELG9CQUFlLEdBQXlCLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRy9ELFdBQU0sR0FBc0IsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFN0Q7OztXQUdHO1FBQ0gsY0FBUyxHQUFjLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QixpQ0FBNEIsR0FBeUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUc1RSxDQUFDO0lBRUQsUUFBUTtRQUNOLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXFEO0lBQ2pFLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYyxFQUFFLEtBQWM7UUFDNUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHlCQUF5QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNqRSxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtTQUNoRDtRQUNELElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ2xDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3BCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFPO1FBQzdCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEVBQU87UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7OzBIQWhGVSw0QkFBNEI7OEdBQTVCLDRCQUE0QiwwaUJBSHhCLENBQUMsOENBQThDLENBQUMsK0NBbENoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWlDQzs0RkFJTCw0QkFBNEI7a0JBdkN4QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBTyxxQkFBcUI7b0JBQ3BDLFFBQVEsRUFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWlDQztvQkFDaEIsU0FBUyxFQUFNLENBQUMsOENBQThDLENBQUM7b0JBQy9ELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzt3R0FJMkIsSUFBSTtzQkFBN0IsV0FBVzt1QkFBQyxXQUFXO2dCQUNJLFVBQVU7c0JBQXJDLFdBQVc7dUJBQUMsYUFBYTtnQkFDUSxlQUFlO3NCQUFoRCxXQUFXO3VCQUFDLG1CQUFtQjtnQkFFdkIsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUUsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9URVhUX1dJREdFVF9DT05GSUdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiAgICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRleHRXaWRnZXRDb25maWd1cmVDb21wb25lbnQpLFxuICBtdWx0aTogICAgICAgdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFRleHRXaWRnZXRDb25maWd1cmVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBUZXh0V2lkZ2V0Q29uZmlndXJlQ29tcG9uZW50LCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLXRleHQtY29uZmlndXJlJyxcbiAgdGVtcGxhdGU6ICAgICAgYDwhLS0gLS0+XG4gIDxkaXYgY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1jb25maWd1cmVcIiBmbGV4IGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGRpdmlkZXJDb2xvcj1cImFjY2VudFwiPlxuICAgICAgPGlucHV0IG1hdElucHV0IGNsYXNzPVwidGFuai1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiNTBcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbGFiZWwgZm9yIHRoaXMgaW5wdXRcIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwibGFiZWxDaGFuZ2UuZW1pdChsYWJlbClcIlxuICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibGFiZWxcIi8+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFiZWxcIj5cbiAgICAgIDx0YW5qLXRleHQtd2lkZ2V0IFsodmFsdWUpXT1cImRlZmF1bHRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsgZW1pdENoYW5nZUV2ZW50KHRydWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZGVmYXVsdFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJtYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRGVmYXVsdCBWYWx1ZVwiPjwvdGFuai10ZXh0LXdpZGdldD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIj5cbiAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1pbiBMZW5ndGhcIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtaW5MZW5ndGhDaGFuZ2UuZW1pdChtaW5MZW5ndGgpXCJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWluTGVuZ3RoXCIvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBkaXZpZGVyQ29sb3I9XCJhY2NlbnRcIj5cbiAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICBjbGFzcz1cInRhbmotaW5wdXRcIlxuICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk1heCBMZW5ndGhcIlxuICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJtYXhMZW5ndGhDaGFuZ2UuZW1pdChtYXhMZW5ndGgpXCJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWF4TGVuZ3RoXCIvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgYCxcbiAgcHJvdmlkZXJzOiAgICAgW1RBTkpfVEVYVF9XSURHRVRfQ09ORklHX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRleHRXaWRnZXRDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmcgPSAnJ1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAnYmVmb3JlJyB8ICdhZnRlcicgfCAnYmVsb3cnID0gJ2JlZm9yZSdcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIEZpZWxkc1xuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICcnXG4gIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZTogc3RyaW5nID0gJydcbiAgQElucHV0KCkgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDBcbiAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAwXG5cbiAgQE91dHB1dCgpIGxhYmVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG4gIEBPdXRwdXQoKSBkZWZhdWx0VmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcbiAgQE91dHB1dCgpIG1heExlbmd0aENoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgbWluTGVuZ3RoQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBzcGlubmVyIGlzIGJsdXJyZWQuIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIEhhY2tzLm1hdGVyaWFsRGVzaWduUGxhY2Vob2xkZXJUZXh0KHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IGNvbmZpZzogU2ltcGxlQ2hhbmdlLCBpdmFsOiBTaW1wbGVDaGFuZ2UgfSkge1xuICB9XG5cbiAgZW1pdENoYW5nZUV2ZW50KHZhbHVlOiBib29sZWFuLCBsYWJlbDogYm9vbGVhbikge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBUZXh0V2lkZ2V0Q29uZmlndXJlQ2hhbmdlKHRoaXMsIHRoaXMudmFsdWUpKVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmRlZmF1bHRWYWx1ZSlcbiAgICB9XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICB0aGlzLmxhYmVsQ2hhbmdlLmVtaXQodGhpcy5sYWJlbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9pbGVycGxhdGUgLyByZXF1aXJlZCBmb3IgQW5ndWxhclxuICAgKlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGUuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbn1cbiJdfQ==