@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
36 lines • 28.7 kB
JavaScript
import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker';
import { Component } from '@angular/core';
import { AbstractSearchOperandInputComponent, DATE_FORMAT_STRING, DATE_TIME_FORMAT, DATE_TIME_FORMAT_STRING, SearchInputType } from '@netgrif/components-core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ngbracket/ngx-layout";
import * as i3 from "@angular/material/autocomplete";
import * as i4 from "@angular/material/core";
import * as i5 from "@angular/material/datepicker";
import * as i6 from "@angular/material/icon";
import * as i7 from "@angular/material/input";
import * as i8 from "@angular/material/form-field";
import * as i9 from "@angular/material/slide-toggle";
import * as i10 from "@angular/forms";
import * as i11 from "@angular-material-components/datetime-picker";
import * as i12 from "@ngx-translate/core";
export class SearchOperandInputComponent extends AbstractSearchOperandInputComponent {
// make enum accessible in HTMl
searchInputType = SearchInputType;
dateFormat = DATE_FORMAT_STRING;
dateTimeFormat = DATE_TIME_FORMAT_STRING;
constructor() {
super();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchOperandInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchOperandInputComponent, selector: "nc-search-operand-input", providers: [
{ provide: NGX_MAT_DATE_FORMATS, useValue: DATE_TIME_FORMAT }
], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"!isInputFilled(); then operandSelection else operandDisplay\"></div>\n\n<ng-template #operandSelection>\n <div [ngSwitch]=\"inputType\">\n <ng-template [ngSwitchCase]=\"searchInputType.TEXT\">\n <mat-form-field appearance=\"outline\">\n <input type=\"text\" matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur()\"\n (blur)=\"confirmInput()\"\n #operandInput>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.AUTOCOMPLETE\">\n <mat-form-field appearance=\"outline\">\n <input type=\"text\" matInput autocomplete=\"off\"\n #autocompleteInput\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [formControl]=\"inputFormControl\"\n [matAutocomplete]=\"searchAutocomplete\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur(); autocompleteTrigger.closePanel()\"\n (focus)=\"editInput()\"\n #operandInput>\n <mat-autocomplete #searchAutocomplete=\"matAutocomplete\"\n [displayWith]=\"renderSelection\"\n (optionSelected)=\"autocompleteInput.blur()\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option\">\n <mat-icon *ngIf=\"option.icon\">{{option.icon}}</mat-icon>\n <span>{{option.text | translate}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.DATE\">\n <mat-form-field appearance=\"outline\">\n <input matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [matDatepicker]=\"searchDatepicker\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"searchDatepicker.close()\"\n (focus)=\"editInput(); searchDatepicker.open()\"\n #operandInput>\n <mat-datepicker-toggle matPrefix [for]=\"searchDatepicker\"></mat-datepicker-toggle>\n <mat-datepicker\n #searchDatepicker\n (closed)=\"confirmInput()\"></mat-datepicker>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.DATE_TIME\">\n <mat-form-field appearance=\"outline\">\n <input matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [ngxMatDatetimePicker]=\"searchDateTimepicker\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"searchDateTimepicker.close()\"\n (focus)=\"editInput(); searchDateTimepicker.open()\"\n #operandInput>\n <mat-datepicker-toggle matPrefix [for]=\"searchDateTimepicker\">\n <mat-icon matDatepickerToggleIcon>schedule</mat-icon>\n </mat-datepicker-toggle>\n <ngx-mat-datetime-picker #searchDateTimepicker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"5\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n (closed)=\"confirmInput()\"></ngx-mat-datetime-picker>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.NUMBER\">\n <mat-form-field appearance=\"outline\">\n <input type=\"number\" matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur()\"\n (focus)=\"editInput()\"\n (blur)=\"confirmInput()\"\n #operandInput>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.BOOLEAN\">\n <div fxLayout=\"row\">\n <mat-slide-toggle [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (focus)=\"editInput()\"\n (toggleChange)=\"confirmInput()\"></mat-slide-toggle>\n </div>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #operandDisplay>\n <div [ngSwitch]=\"inputType\" (click)=\"editInput()\" class=\"bold-text\">\n <div *ngSwitchCase=\"searchInputType.AUTOCOMPLETE\">\n {{inputFormControl.value.text | translate}}\n </div>\n <div *ngSwitchCase=\"searchInputType.DATE\">\n {{inputFormControl.value.format(dateFormat)}}\n </div>\n <div *ngSwitchCase=\"searchInputType.DATE_TIME\">\n {{inputFormControl.value.format(dateTimeFormat)}}\n </div>\n <div *ngSwitchDefault>\n {{inputFormControl.value}}\n </div>\n </div>\n</ng-template>\n", styles: [".bold-text{font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "component", type: i3.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i5.MatDatepickerToggleIcon, selector: "[matDatepickerToggleIcon]" }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: i9.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i10.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: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i11.NgxMatDatetimepicker, selector: "ngx-mat-datetime-picker", exportAs: ["ngxMatDatetimePicker"] }, { kind: "directive", type: i11.NgxMatDatepickerInput, selector: "input[ngxMatDatetimePicker]", inputs: ["ngxMatDatetimePicker", "min", "max", "matDatepickerFilter"], exportAs: ["ngxMatDatepickerInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchOperandInputComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-search-operand-input', providers: [
{ provide: NGX_MAT_DATE_FORMATS, useValue: DATE_TIME_FORMAT }
], template: "<div *ngIf=\"!isInputFilled(); then operandSelection else operandDisplay\"></div>\n\n<ng-template #operandSelection>\n <div [ngSwitch]=\"inputType\">\n <ng-template [ngSwitchCase]=\"searchInputType.TEXT\">\n <mat-form-field appearance=\"outline\">\n <input type=\"text\" matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur()\"\n (blur)=\"confirmInput()\"\n #operandInput>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.AUTOCOMPLETE\">\n <mat-form-field appearance=\"outline\">\n <input type=\"text\" matInput autocomplete=\"off\"\n #autocompleteInput\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [formControl]=\"inputFormControl\"\n [matAutocomplete]=\"searchAutocomplete\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur(); autocompleteTrigger.closePanel()\"\n (focus)=\"editInput()\"\n #operandInput>\n <mat-autocomplete #searchAutocomplete=\"matAutocomplete\"\n [displayWith]=\"renderSelection\"\n (optionSelected)=\"autocompleteInput.blur()\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option\">\n <mat-icon *ngIf=\"option.icon\">{{option.icon}}</mat-icon>\n <span>{{option.text | translate}}</span>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.DATE\">\n <mat-form-field appearance=\"outline\">\n <input matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [matDatepicker]=\"searchDatepicker\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"searchDatepicker.close()\"\n (focus)=\"editInput(); searchDatepicker.open()\"\n #operandInput>\n <mat-datepicker-toggle matPrefix [for]=\"searchDatepicker\"></mat-datepicker-toggle>\n <mat-datepicker\n #searchDatepicker\n (closed)=\"confirmInput()\"></mat-datepicker>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.DATE_TIME\">\n <mat-form-field appearance=\"outline\">\n <input matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [ngxMatDatetimePicker]=\"searchDateTimepicker\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"searchDateTimepicker.close()\"\n (focus)=\"editInput(); searchDateTimepicker.open()\"\n #operandInput>\n <mat-datepicker-toggle matPrefix [for]=\"searchDateTimepicker\">\n <mat-icon matDatepickerToggleIcon>schedule</mat-icon>\n </mat-datepicker-toggle>\n <ngx-mat-datetime-picker #searchDateTimepicker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"5\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n (closed)=\"confirmInput()\"></ngx-mat-datetime-picker>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.NUMBER\">\n <mat-form-field appearance=\"outline\">\n <input type=\"number\" matInput autocomplete=\"off\"\n [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (keydown.enter)=\"$event.target.blur()\"\n (focus)=\"editInput()\"\n (blur)=\"confirmInput()\"\n #operandInput>\n </mat-form-field>\n </ng-template>\n\n <ng-template [ngSwitchCase]=\"searchInputType.BOOLEAN\">\n <div fxLayout=\"row\">\n <mat-slide-toggle [formControl]=\"inputFormControl\"\n [disabled]=\"!editable\"\n (focus)=\"editInput()\"\n (toggleChange)=\"confirmInput()\"></mat-slide-toggle>\n </div>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #operandDisplay>\n <div [ngSwitch]=\"inputType\" (click)=\"editInput()\" class=\"bold-text\">\n <div *ngSwitchCase=\"searchInputType.AUTOCOMPLETE\">\n {{inputFormControl.value.text | translate}}\n </div>\n <div *ngSwitchCase=\"searchInputType.DATE\">\n {{inputFormControl.value.format(dateFormat)}}\n </div>\n <div *ngSwitchCase=\"searchInputType.DATE_TIME\">\n {{inputFormControl.value.format(dateTimeFormat)}}\n </div>\n <div *ngSwitchDefault>\n {{inputFormControl.value}}\n </div>\n </div>\n</ng-template>\n", styles: [".bold-text{font-weight:700}\n"] }]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLW9wZXJhbmQtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC9zZWFyY2gtb3BlcmFuZC1pbnB1dC1jb21wb25lbnQvc2VhcmNoLW9wZXJhbmQtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC9zZWFyY2gtb3BlcmFuZC1pbnB1dC1jb21wb25lbnQvc2VhcmNoLW9wZXJhbmQtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQ0gsbUNBQW1DLEVBQ25DLGtCQUFrQixFQUFFLGdCQUFnQixFQUNwQyx1QkFBdUIsRUFDdkIsZUFBZSxFQUNsQixNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVVsQyxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsbUNBQW1DO0lBRWhGLCtCQUErQjtJQUN4QixlQUFlLEdBQUcsZUFBZSxDQUFDO0lBRWxDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUNoQyxjQUFjLEdBQUcsdUJBQXVCLENBQUM7SUFFaEQ7UUFDSSxLQUFLLEVBQUUsQ0FBQztJQUNaLENBQUM7d0dBVlEsMkJBQTJCOzRGQUEzQiwyQkFBMkIsa0RBSnpCO1lBQ1AsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFDO1NBQzlELGlEQ2ZMLHVtTEFtSEE7OzRGRGxHYSwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0kseUJBQXlCLGFBR3hCO3dCQUNQLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQztxQkFDOUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05HWF9NQVRfREFURV9GT1JNQVRTfSBmcm9tICdAYW5ndWxhci1tYXRlcmlhbC1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlcic7XG5pbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0U2VhcmNoT3BlcmFuZElucHV0Q29tcG9uZW50LFxuICAgIERBVEVfRk9STUFUX1NUUklORywgREFURV9USU1FX0ZPUk1BVCxcbiAgICBEQVRFX1RJTUVfRk9STUFUX1NUUklORyxcbiAgICBTZWFyY2hJbnB1dFR5cGVcbn0gZnJvbSAnQG5ldGdyaWYvY29tcG9uZW50cy1jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYy1zZWFyY2gtb3BlcmFuZC1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1vcGVyYW5kLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtb3BlcmFuZC1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7cHJvdmlkZTogTkdYX01BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBEQVRFX1RJTUVfRk9STUFUfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoT3BlcmFuZElucHV0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hPcGVyYW5kSW5wdXRDb21wb25lbnQge1xuXG4gICAgLy8gbWFrZSBlbnVtIGFjY2Vzc2libGUgaW4gSFRNbFxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFR5cGUgPSBTZWFyY2hJbnB1dFR5cGU7XG5cbiAgICBwdWJsaWMgZGF0ZUZvcm1hdCA9IERBVEVfRk9STUFUX1NUUklORztcbiAgICBwdWJsaWMgZGF0ZVRpbWVGb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUX1NUUklORztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCIhaXNJbnB1dEZpbGxlZCgpOyB0aGVuIG9wZXJhbmRTZWxlY3Rpb24gZWxzZSBvcGVyYW5kRGlzcGxheVwiPjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI29wZXJhbmRTZWxlY3Rpb24+XG4gICAgPGRpdiBbbmdTd2l0Y2hdPVwiaW5wdXRUeXBlXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cInNlYXJjaElucHV0VHlwZS5URVhUXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5wdXRGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQudGFyZ2V0LmJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImNvbmZpcm1JbnB1dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI29wZXJhbmRJbnB1dD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwic2VhcmNoSW5wdXRUeXBlLkFVVE9DT01QTEVURVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI2F1dG9jb21wbGV0ZUlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICNhdXRvY29tcGxldGVUcmlnZ2VyPVwibWF0QXV0b2NvbXBsZXRlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dEZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJzZWFyY2hBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnRhcmdldC5ibHVyKCk7IGF1dG9jb21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImVkaXRJbnB1dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI29wZXJhbmRJbnB1dD5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjc2VhcmNoQXV0b2NvbXBsZXRlPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwicmVuZGVyU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwiYXV0b2NvbXBsZXRlSW5wdXQuYmx1cigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9uLmljb25cIj57e29wdGlvbi5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tvcHRpb24udGV4dCB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgW25nU3dpdGNoQ2FzZV09XCJzZWFyY2hJbnB1dFR5cGUuREFURVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dEZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwic2VhcmNoRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2hEYXRlcGlja2VyLmNsb3NlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiZWRpdElucHV0KCk7IHNlYXJjaERhdGVwaWNrZXIub3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI29wZXJhbmRJbnB1dD5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFByZWZpeCBbZm9yXT1cInNlYXJjaERhdGVwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaERhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJjb25maXJtSW5wdXQoKVwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cInNlYXJjaElucHV0VHlwZS5EQVRFX1RJTUVcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5wdXRGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ3hNYXREYXRldGltZVBpY2tlcl09XCJzZWFyY2hEYXRlVGltZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2hEYXRlVGltZXBpY2tlci5jbG9zZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImVkaXRJbnB1dCgpOyBzZWFyY2hEYXRlVGltZXBpY2tlci5vcGVuKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAjb3BlcmFuZElucHV0PlxuICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0UHJlZml4IFtmb3JdPVwic2VhcmNoRGF0ZVRpbWVwaWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdERhdGVwaWNrZXJUb2dnbGVJY29uPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8bmd4LW1hdC1kYXRldGltZS1waWNrZXIgI3NlYXJjaERhdGVUaW1lcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U3Bpbm5lcnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2Vjb25kc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwSG91cl09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBNaW51dGVdPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlTWVyaWRpYW5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cImNvbmZpcm1JbnB1dCgpXCI+PC9uZ3gtbWF0LWRhdGV0aW1lLXBpY2tlcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwic2VhcmNoSW5wdXRUeXBlLk5VTUJFUlwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5wdXRGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQudGFyZ2V0LmJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJlZGl0SW5wdXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImNvbmZpcm1JbnB1dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgI29wZXJhbmRJbnB1dD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwic2VhcmNoSW5wdXRUeXBlLkJPT0xFQU5cIj5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbZm9ybUNvbnRyb2xdPVwiaW5wdXRGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImVkaXRJbnB1dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQ2hhbmdlKT1cImNvbmZpcm1JbnB1dCgpXCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI29wZXJhbmREaXNwbGF5PlxuICAgIDxkaXYgW25nU3dpdGNoXT1cImlucHV0VHlwZVwiIChjbGljayk9XCJlZGl0SW5wdXQoKVwiIGNsYXNzPVwiYm9sZC10ZXh0XCI+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cInNlYXJjaElucHV0VHlwZS5BVVRPQ09NUExFVEVcIj5cbiAgICAgICAgICAgIHt7aW5wdXRGb3JtQ29udHJvbC52YWx1ZS50ZXh0IHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cInNlYXJjaElucHV0VHlwZS5EQVRFXCI+XG4gICAgICAgICAgICB7e2lucHV0Rm9ybUNvbnRyb2wudmFsdWUuZm9ybWF0KGRhdGVGb3JtYXQpfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cInNlYXJjaElucHV0VHlwZS5EQVRFX1RJTUVcIj5cbiAgICAgICAgICAgIHt7aW5wdXRGb3JtQ29udHJvbC52YWx1ZS5mb3JtYXQoZGF0ZVRpbWVGb3JtYXQpfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgIHt7aW5wdXRGb3JtQ29udHJvbC52YWx1ZX19XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==