UNPKG

@jsonforms/angular-material

Version:

Material Renderer Set for Angular module of JSON Forms

191 lines (187 loc) 22 kB
/* The MIT License Copyright (c) 2017-2019 EclipseSource Munich https://github.com/eclipsesource/jsonforms Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, ChangeDetectionStrategy, Inject, ViewEncapsulation, } from '@angular/core'; import { defaultDateFormat, isDateControl, rankWith, } from '@jsonforms/core'; import { JsonFormsAngularService, JsonFormsControl } from '@jsonforms/angular'; import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; import { MyFormat } from '../util/date-format'; import { DayJsDateAdapter } from '../util/dayjs-date-adapter'; import * as i0 from "@angular/core"; import * as i1 from "@jsonforms/angular"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/form-field"; import * as i4 from "@angular/material/input"; import * as i5 from "@angular/material/datepicker"; import * as i6 from "@angular/forms"; import * as i7 from "../util/date-format"; import * as i8 from "../util/dayjs-date-adapter"; export class DateControlRenderer extends JsonFormsControl { dateFormat; dateAdapter; focused = false; views = []; startView = ''; panelClass = ''; constructor(jsonformsService, dateFormat, dateAdapter) { super(jsonformsService); this.dateFormat = dateFormat; this.dateAdapter = dateAdapter; } getEventValue = (event) => { const value = event.value ? event.value : event; return this.dateAdapter.toSaveFormat(value); }; mapToProps(state) { const props = super.mapToProps(state); const saveFormat = this.uischema?.options?.dateSaveFormat ? this.uischema.options.dateSaveFormat : defaultDateFormat; this.views = this.uischema?.options?.views ? this.uischema.options.views : ['year', 'month', 'day']; this.setViewProperties(); const dateFormat = this.uischema?.options?.dateFormat; if (dateFormat) { this.dateFormat.setDisplayFormat(dateFormat); } this.dateAdapter.setSaveFormat(saveFormat); if (this.jsonFormsService.getLocale()) { this.dateAdapter.setLocale(this.jsonFormsService.getLocale()); } const date = this.dateAdapter.parseSaveFormat(props.data); return { ...props, data: date }; } yearSelected($event, datepicker) { if (!this.views.includes('day') && !this.views.includes('month')) { this.onChange($event); datepicker.close(); } } monthSelected($event, datepicker) { if (!this.views.includes('day')) { this.onChange($event); datepicker.close(); } } setViewProperties() { if (!this.views.includes('day')) { this.startView = 'multi-year'; this.panelClass = 'no-panel-navigation'; } else { this.startView = 'month'; } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateControlRenderer, deps: [{ token: i1.JsonFormsAngularService }, { token: MAT_DATE_FORMATS }, { token: DateAdapter }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: DateControlRenderer, selector: "DateControlRenderer", providers: [ { provide: DateAdapter, useClass: DayJsDateAdapter, }, { provide: MAT_DATE_FORMATS, useClass: MyFormat, }, ], usesInheritance: true, ngImport: i0, template: ` <mat-form-field class="date-control-renderer" [ngStyle]="{ display: hidden ? 'none' : '' }" > <mat-label>{{ label }}</mat-label> <input matInput (dateChange)="onChange($event)" [id]="id" [formControl]="form" [matDatepicker]="datepicker" (focus)="focused = true" (focusout)="focused = false" /> <mat-datepicker-toggle matSuffix [for]="datepicker" ></mat-datepicker-toggle> <mat-datepicker #datepicker (monthSelected)="monthSelected($event, datepicker)" (yearSelected)="yearSelected($event, datepicker)" [startView]="startView" [panelClass]="panelClass" ></mat-datepicker> <mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{ description }}</mat-hint> <mat-error>{{ error }}</mat-error> </mat-form-field> `, isInline: true, styles: ["DateControlRenderer{display:flex;flex-direction:row}.date-control-renderer{flex:1 1 auto}.no-panel-navigation .mat-calendar-period-button{pointer-events:none}.no-panel-navigation .mat-calendar-arrow{display:none}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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.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: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateControlRenderer, decorators: [{ type: Component, args: [{ selector: 'DateControlRenderer', template: ` <mat-form-field class="date-control-renderer" [ngStyle]="{ display: hidden ? 'none' : '' }" > <mat-label>{{ label }}</mat-label> <input matInput (dateChange)="onChange($event)" [id]="id" [formControl]="form" [matDatepicker]="datepicker" (focus)="focused = true" (focusout)="focused = false" /> <mat-datepicker-toggle matSuffix [for]="datepicker" ></mat-datepicker-toggle> <mat-datepicker #datepicker (monthSelected)="monthSelected($event, datepicker)" (yearSelected)="yearSelected($event, datepicker)" [startView]="startView" [panelClass]="panelClass" ></mat-datepicker> <mat-hint *ngIf="shouldShowUnfocusedDescription() || focused">{{ description }}</mat-hint> <mat-error>{{ error }}</mat-error> </mat-form-field> `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: DateAdapter, useClass: DayJsDateAdapter, }, { provide: MAT_DATE_FORMATS, useClass: MyFormat, }, ], styles: ["DateControlRenderer{display:flex;flex-direction:row}.date-control-renderer{flex:1 1 auto}.no-panel-navigation .mat-calendar-period-button{pointer-events:none}.no-panel-navigation .mat-calendar-arrow{display:none}\n"] }] }], ctorParameters: () => [{ type: i1.JsonFormsAngularService }, { type: i7.MyFormat, decorators: [{ type: Inject, args: [MAT_DATE_FORMATS] }] }, { type: i8.DayJsDateAdapter, decorators: [{ type: Inject, args: [DateAdapter] }] }] }); export const DateControlRendererTester = rankWith(2, isDateControl); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWJyYXJ5L2NvbnRyb2xzL2RhdGUucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFHYixRQUFRLEdBRVQsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7O0FBbUU5RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsZ0JBQWdCO0lBUW5CO0lBQ0w7SUFSL0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3JCLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDZixVQUFVLEdBQUcsRUFBRSxDQUFDO0lBRWhCLFlBQ0UsZ0JBQXlDLEVBQ1AsVUFBb0IsRUFDekIsV0FBNkI7UUFFMUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFIVSxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUc1RCxDQUFDO0lBRUQsYUFBYSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMs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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCVDs7NEZBK0JVLG1CQUFtQjtrQkFoRS9CLFNBQVM7K0JBQ0UscUJBQXFCLFlBQ3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULGlCQWtCYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixRQUFRLEVBQUUsZ0JBQWdCO3lCQUMzQjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsZ0JBQWdCOzRCQUN6QixRQUFRLEVBQUUsUUFBUTt5QkFDbkI7cUJBQ0Y7OzBCQVVFLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxXQUFXOztBQXlEdkIsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCLFFBQVEsQ0FDN0QsQ0FBQyxFQUNELGFBQWEsQ0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIE1JVCBMaWNlbnNlXG4gIFxuICBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOSBFY2xpcHNlU291cmNlIE11bmljaFxuICBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZXNvdXJjZS9qc29uZm9ybXNcbiAgXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAgVEhFIFNPRlRXQVJFLlxuKi9cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEluamVjdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdERhdGVGb3JtYXQsXG4gIGlzRGF0ZUNvbnRyb2wsXG4gIEpzb25Gb3Jtc1N0YXRlLFxuICBSYW5rZWRUZXN0ZXIsXG4gIHJhbmtXaXRoLFxuICBTdGF0ZVByb3BzT2ZDb250cm9sLFxufSBmcm9tICdAanNvbmZvcm1zL2NvcmUnO1xuaW1wb3J0IHsgSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UsIEpzb25Gb3Jtc0NvbnRyb2wgfSBmcm9tICdAanNvbmZvcm1zL2FuZ3VsYXInO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFMgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE15Rm9ybWF0IH0gZnJvbSAnLi4vdXRpbC9kYXRlLWZvcm1hdCc7XG5pbXBvcnQgeyBEYXlKc0RhdGVBZGFwdGVyIH0gZnJvbSAnLi4vdXRpbC9kYXlqcy1kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdEYXRlQ29udHJvbFJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgIGNsYXNzPVwiZGF0ZS1jb250cm9sLXJlbmRlcmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsgZGlzcGxheTogaGlkZGVuID8gJ25vbmUnIDogJycgfVwiXG4gICAgPlxuICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybVwiXG4gICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVwaWNrZXJcIlxuICAgICAgICAoZm9jdXMpPVwiZm9jdXNlZCA9IHRydWVcIlxuICAgICAgICAoZm9jdXNvdXQpPVwiZm9jdXNlZCA9IGZhbHNlXCJcbiAgICAgIC8+XG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICBbZm9yXT1cImRhdGVwaWNrZXJcIlxuICAgICAgPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgPG1hdC1kYXRlcGlja2VyXG4gICAgICAgICNkYXRlcGlja2VyXG4gICAgICAgIChtb250aFNlbGVjdGVkKT1cIm1vbnRoU2VsZWN0ZWQoJGV2ZW50LCBkYXRlcGlja2VyKVwiXG4gICAgICAgICh5ZWFyU2VsZWN0ZWQpPVwieWVhclNlbGVjdGVkKCRldmVudCwgZGF0ZXBpY2tlcilcIlxuICAgICAgICBbc3RhcnRWaWV3XT1cInN0YXJ0Vmlld1wiXG4gICAgICAgIFtwYW5lbENsYXNzXT1cInBhbmVsQ2xhc3NcIlxuICAgICAgPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICA8bWF0LWhpbnQgKm5nSWY9XCJzaG91bGRTaG93VW5mb2N1c2VkRGVzY3JpcHRpb24oKSB8fCBmb2N1c2VkXCI+e3tcbiAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgIH19PC9tYXQtaGludD5cbiAgICAgIDxtYXQtZXJyb3I+e3sgZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBEYXRlQ29udHJvbFJlbmRlcmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIC5kYXRlLWNvbnRyb2wtcmVuZGVyZXIge1xuICAgICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIH1cbiAgICAgIC5uby1wYW5lbC1uYXZpZ2F0aW9uIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgICAgLm5vLXBhbmVsLW5hdmlnYXRpb24gLm1hdC1jYWxlbmRhci1hcnJvdyB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IERhdGVBZGFwdGVyLFxuICAgICAgdXNlQ2xhc3M6IERheUpzRGF0ZUFkYXB0ZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLFxuICAgICAgdXNlQ2xhc3M6IE15Rm9ybWF0LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVDb250cm9sUmVuZGVyZXIgZXh0ZW5kcyBKc29uRm9ybXNDb250cm9sIHtcbiAgZm9jdXNlZCA9IGZhbHNlO1xuICB2aWV3czogc3RyaW5nW10gPSBbXTtcbiAgc3RhcnRWaWV3ID0gJyc7XG4gIHBhbmVsQ2xhc3MgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBqc29uZm9ybXNTZXJ2aWNlOiBKc29uRm9ybXNBbmd1bGFyU2VydmljZSxcbiAgICBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIHByaXZhdGUgZGF0ZUZvcm1hdDogTXlGb3JtYXQsXG4gICAgQEluamVjdChEYXRlQWRhcHRlcikgcHJpdmF0ZSBkYXRlQWRhcHRlcjogRGF5SnNEYXRlQWRhcHRlclxuICApIHtcbiAgICBzdXBlcihqc29uZm9ybXNTZXJ2aWNlKTtcbiAgfVxuXG4gIGdldEV2ZW50VmFsdWUgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWUgPyBldmVudC52YWx1ZSA6IGV2ZW50O1xuICAgIHJldHVybiB0aGlzLmRhdGVBZGFwdGVyLnRvU2F2ZUZvcm1hdCh2YWx1ZSk7XG4gIH07XG5cbiAgcHJvdGVjdGVkIG1hcFRvUHJvcHMoc3RhdGU6IEpzb25Gb3Jtc1N0YXRlKTogU3RhdGVQcm9wc09mQ29udHJvbCB7XG4gICAgY29uc3QgcHJvcHMgPSBzdXBlci5tYXBUb1Byb3BzKHN0YXRlKTtcbiAgICBjb25zdCBzYXZlRm9ybWF0ID0gdGhpcy51aXNjaGVtYT8ub3B0aW9ucz8uZGF0ZVNhdmVGb3JtYXRcbiAgICAgID8gdGhpcy51aXNjaGVtYS5vcHRpb25zLmRhdGVTYXZlRm9ybWF0XG4gICAgICA6IGRlZmF1bHREYXRlRm9ybWF0O1xuICAgIHRoaXMudmlld3MgPSB0aGlzLnVpc2NoZW1hPy5vcHRpb25zPy52aWV3c1xuICAgICAgPyB0aGlzLnVpc2NoZW1hLm9wdGlvbnMudmlld3NcbiAgICAgIDogWyd5ZWFyJywgJ21vbnRoJywgJ2RheSddO1xuICAgIHRoaXMuc2V0Vmlld1Byb3BlcnRpZXMoKTtcblxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB0aGlzLnVpc2NoZW1hPy5vcHRpb25zPy5kYXRlRm9ybWF0O1xuXG4gICAgaWYgKGRhdGVGb3JtYXQpIHtcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdC5zZXREaXNwbGF5Rm9ybWF0KGRhdGVGb3JtYXQpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0U2F2ZUZvcm1hdChzYXZlRm9ybWF0KTtcbiAgICBpZiAodGhpcy5qc29uRm9ybXNTZXJ2aWNlLmdldExvY2FsZSgpKSB7XG4gICAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZSh0aGlzLmpzb25Gb3Jtc1NlcnZpY2UuZ2V0TG9jYWxlKCkpO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZVNhdmVGb3JtYXQocHJvcHMuZGF0YSk7XG4gICAgcmV0dXJuIHsgLi4ucHJvcHMsIGRhdGE6IGRhdGUgfTtcbiAgfVxuXG4gIHllYXJTZWxlY3RlZCgkZXZlbnQ6IGFueSwgZGF0ZXBpY2tlcjogTWF0RGF0ZXBpY2tlcjxEYXlKc0RhdGVBZGFwdGVyPikge1xuICAgIGlmICghdGhpcy52aWV3cy5pbmNsdWRlcygnZGF5JykgJiYgIXRoaXMudmlld3MuaW5jbHVkZXMoJ21vbnRoJykpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoJGV2ZW50KTtcbiAgICAgIGRhdGVwaWNrZXIuY2xvc2UoKTtcbiAgICB9XG4gIH1cbiAgbW9udGhTZWxlY3RlZCgkZXZlbnQ6IGFueSwgZGF0ZXBpY2tlcjogTWF0RGF0ZXBpY2tlcjxEYXlKc0RhdGVBZGFwdGVyPikge1xuICAgIGlmICghdGhpcy52aWV3cy5pbmNsdWRlcygnZGF5JykpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoJGV2ZW50KTtcbiAgICAgIGRhdGVwaWNrZXIuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBzZXRWaWV3UHJvcGVydGllcygpIHtcbiAgICBpZiAoIXRoaXMudmlld3MuaW5jbHVkZXMoJ2RheScpKSB7XG4gICAgICB0aGlzLnN0YXJ0VmlldyA9ICdtdWx0aS15ZWFyJztcbiAgICAgIHRoaXMucGFuZWxDbGFzcyA9ICduby1wYW5lbC1uYXZpZ2F0aW9uJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydFZpZXcgPSAnbW9udGgnO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRGF0ZUNvbnRyb2xSZW5kZXJlclRlc3RlcjogUmFua2VkVGVzdGVyID0gcmFua1dpdGgoXG4gIDIsXG4gIGlzRGF0ZUNvbnRyb2xcbik7XG4iXX0=