ngx-surveys
Version:
Angular 18+ survey / form builder
156 lines • 20.5 kB
JavaScript
import { Component, Input, ViewChild, Output, EventEmitter } from '@angular/core';
import { FormItemDirective } from './form-item.directive';
import { FormItemString, FormItemStringComponent } from './form-item-string/form-item-string.component';
import { FormItemRating, FormItemRatingComponent } from './form-item-rating/form-item-rating.component';
import { FormItemText, FormItemTextComponent } from './form-item-text/form-item-text.component';
import { FormItemDate, FormItemDateComponent } from './form-item-date/form-item-date.component';
import { FormItemSegments, FormItemSegmentsComponent } from './form-item-segments/form-item-segments.component';
import { FormItemRadio, FormItemRadioComponent } from './form-item-radio/form-item-radio.component';
import { FormItemNumericRating, FormItemNumericRatingComponent } from './form-item-numeric-rating/form-item-numeric-rating.component';
import { FormItemSelect, FormItemSelectComponent } from './form-item-select/form-item-select.component';
import { FormItemOptionsEditor, FormItemOptionsEditorComponent } from './form-item-options-editor/form-item-options-editor.component';
import { FormItemCheckbox, FormItemCheckboxComponent } from './form-item-checkbox/form-item-checkbox.component';
import { FormItemFile, FormItemFileComponent } from './form-item-file/form-item-file.component';
import { FormItemVoice, FormItemVoiceComponent } from './form-item-voice/form-item-voice.component';
import { FormItemLabel, FormItemLabelComponent } from './form-item-label/form-item-label.component';
import * as i0 from "@angular/core";
import * as i1 from "./form-item.directive";
export const FormItemTypes = {
label: {
component: FormItemLabelComponent,
model: FormItemLabel,
label: 'Label'
},
'string': {
component: FormItemStringComponent,
model: FormItemString,
label: 'Short text'
},
text: {
component: FormItemTextComponent,
model: FormItemText,
label: 'Long text'
},
rating: {
component: FormItemRatingComponent,
model: FormItemRating,
label: 'Star rating'
},
numericRating: {
component: FormItemNumericRatingComponent,
model: FormItemNumericRating,
label: 'Numeric rating'
},
segments: {
component: FormItemSegmentsComponent,
model: FormItemSegments,
label: 'Segments'
},
radio: {
component: FormItemRadioComponent,
model: FormItemRadio,
label: 'Multi Choice'
},
select: {
component: FormItemSelectComponent,
model: FormItemSelect,
//label: 'Select'
},
optionsEditor: {
component: FormItemOptionsEditorComponent,
model: FormItemOptionsEditor
},
checkbox: {
component: FormItemCheckboxComponent,
model: FormItemCheckbox,
label: 'Checkbox'
},
date: {
component: FormItemDateComponent,
model: FormItemDate,
label: 'Date'
},
file: {
component: FormItemFileComponent,
model: FormItemFile,
label: 'File Upload'
},
voice: {
component: FormItemVoiceComponent,
model: FormItemVoice,
label: 'Voice Record'
},
};
export function buildOption(optionValue, label) {
return { optionValue, label };
}
export function buildField(type, data, required) {
const obj = Object.assign(new (FormItemTypes[type].model), data);
obj.type = type;
if (required) {
obj.fieldValidations = {
rules: [
{
minLength: 1
}
]
};
}
return obj;
}
export class FormItemComponent {
constructor(componentFactoryResolver) {
this.componentFactoryResolver = componentFactoryResolver;
this.editable = true;
this.isMobile = false;
this.changes = new EventEmitter();
}
ngOnInit() {
this.loadComponent();
}
ngOnChanges(changes) {
if (changes && (changes.type || changes.id)) {
this.loadComponent();
}
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
loadComponent() {
if (!FormItemTypes[this.type]) {
return;
}
let componentFactory = this.componentFactoryResolver.resolveComponentFactory(FormItemTypes[this.type].component);
let viewContainerRef = this.itemHost.viewContainerRef;
viewContainerRef.clear();
let componentRef = viewContainerRef.createComponent(componentFactory);
componentRef.instance.item = this.item;
componentRef.instance.editable = this.editable;
componentRef.instance.isMobile = this.isMobile;
this.subscription = componentRef.instance.changes.subscribe(item => this.changes.emit(item));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemComponent, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FormItemComponent, selector: "ngx-survey-form-item", inputs: { type: "type", item: "item", editable: "editable", isMobile: "isMobile", id: "id" }, outputs: { changes: "changes" }, viewQueries: [{ propertyName: "itemHost", first: true, predicate: FormItemDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template form-item-host></ng-template>\n", styles: [":host ::ng-deep label,:host ::ng-deep .label{color:#0000008a}:host ::ng-deep label.has-error,:host ::ng-deep .label.has-error{color:#f44336}\n"], dependencies: [{ kind: "directive", type: i1.FormItemDirective, selector: "[form-item-host]" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-survey-form-item', template: "<ng-template form-item-host></ng-template>\n", styles: [":host ::ng-deep label,:host ::ng-deep .label{color:#0000008a}:host ::ng-deep label.has-error,:host ::ng-deep .label.has-error{color:#f44336}\n"] }]
}], ctorParameters: () => [{ type: i0.ComponentFactoryResolver }], propDecorators: { type: [{
type: Input
}], item: [{
type: Input
}], editable: [{
type: Input
}], isMobile: [{
type: Input
}], id: [{
type: Input
}], changes: [{
type: Output
}], itemHost: [{
type: ViewChild,
args: [FormItemDirective, { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdXJ2ZXlzL3NyYy9saWIvZm9ybS1pdGVtL2Zvcm0taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VydmV5cy9zcmMvbGliL2Zvcm0taXRlbS9mb3JtLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLFNBQVMsRUFBNEIsTUFBTSxFQUFFLFlBQVksRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDekosT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN4RyxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUN0SSxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDdEksT0FBTyxFQUFF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UUFBUSxDQUFDO1FBQzlDLFlBQVksQ0FBQyxRQUFTLENBQUMsUUFBUSxHQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFL0QsSUFBSSxDQUFDLFlBQVksR0FBa0IsWUFBWSxDQUFDLFFBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRyxDQUFDOytHQXZEUSxpQkFBaUI7bUdBQWpCLGlCQUFpQixxT0FVZixpQkFBaUIsbUZDM0hoQyw4Q0FDQTs7NEZEZ0hhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxzQkFBc0I7NkZBTXJCLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNO2dCQUVnRCxRQUFRO3NCQUE5RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBWaWV3Q2hpbGQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2Zvcm0taXRlbS5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBGb3JtSXRlbSwgRm9ybUl0ZW1XaWRnZXQsIEZvcm1JdGVtVmFsaWRhdGlvbiwgRm9ybUl0ZW1PcHRpb25JdGVtIH0gZnJvbSAnLi9mb3JtLWl0ZW0nO1xuaW1wb3J0IHsgRm9ybUl0ZW1TdHJpbmcsIEZvcm1JdGVtU3RyaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWl0ZW0tc3RyaW5nL2Zvcm0taXRlbS1zdHJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1JdGVtUmF0aW5nLCBGb3JtSXRlbVJhdGluZ0NvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLXJhdGluZy9mb3JtLWl0ZW0tcmF0aW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtSXRlbVRleHQsIEZvcm1JdGVtVGV4dENvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLXRleHQvZm9ybS1pdGVtLXRleHQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1JdGVtRGF0ZSwgRm9ybUl0ZW1EYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWl0ZW0tZGF0ZS9mb3JtLWl0ZW0tZGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1TZWdtZW50cywgRm9ybUl0ZW1TZWdtZW50c0NvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLXNlZ21lbnRzL2Zvcm0taXRlbS1zZWdtZW50cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1SYWRpbywgRm9ybUl0ZW1SYWRpb0NvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLXJhZGlvL2Zvcm0taXRlbS1yYWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1OdW1lcmljUmF0aW5nLCBGb3JtSXRlbU51bWVyaWNSYXRpbmdDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0taXRlbS1udW1lcmljLXJhdGluZy9mb3JtLWl0ZW0tbnVtZXJpYy1yYXRpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1JdGVtU2VsZWN0LCBGb3JtSXRlbVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLXNlbGVjdC9mb3JtLWl0ZW0tc2VsZWN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtSXRlbU9wdGlvbnNFZGl0b3IsIEZvcm1JdGVtT3B0aW9uc0VkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLW9wdGlvbnMtZWRpdG9yL2Zvcm0taXRlbS1vcHRpb25zLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUl0ZW1DaGVja2JveCwgRm9ybUl0ZW1DaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLWNoZWNrYm94L2Zvcm0taXRlbS1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGb3JtSXRlbUZpbGUsIEZvcm1JdGVtRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1pdGVtLWZpbGUvZm9ybS1pdGVtLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1JdGVtVm9pY2UsIEZvcm1JdGVtVm9pY2VDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0taXRlbS12b2ljZS9mb3JtLWl0ZW0tdm9pY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1JdGVtTGFiZWwsIEZvcm1JdGVtTGFiZWxDb21wb25lbnQgfSBmcm9tICcuL2Zvcm0taXRlbS1sYWJlbC9mb3JtLWl0ZW0tbGFiZWwuY29tcG9uZW50JztcblxuZXhwb3J0IGNvbnN0IEZvcm1JdGVtVHlwZXM9e1xuICAgIGxhYmVsIDoge1xuICAgICAgICBjb21wb25lbnQ6IEZvcm1JdGVtTGFiZWxDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbUxhYmVsLFxuICAgICAgICBsYWJlbDogJ0xhYmVsJ1xuICAgIH0sXG4gICAgJ3N0cmluZycgOiB7XG4gICAgICAgIGNvbXBvbmVudDogRm9ybUl0ZW1TdHJpbmdDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbVN0cmluZyxcbiAgICAgICAgbGFiZWw6ICdTaG9ydCB0ZXh0J1xuICAgIH0sXG4gICAgdGV4dCA6IHtcbiAgICAgICAgY29tcG9uZW50OiBGb3JtSXRlbVRleHRDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbVRleHQsXG4gICAgICAgIGxhYmVsOiAnTG9uZyB0ZXh0J1xuICAgIH0sXG4gICAgcmF0aW5nIDoge1xuICAgICAgICBjb21wb25lbnQ6IEZvcm1JdGVtUmF0aW5nQ29tcG9uZW50LFxuICAgICAgICBtb2RlbDogRm9ybUl0ZW1SYXRpbmcsXG4gICAgICAgIGxhYmVsOiAnU3RhciByYXRpbmcnXG4gICAgfSxcbiAgICBudW1lcmljUmF0aW5nIDoge1xuICAgICAgICBjb21wb25lbnQ6IEZvcm1JdGVtTnVtZXJpY1JhdGluZ0NvbXBvbmVudCxcbiAgICAgICAgbW9kZWw6IEZvcm1JdGVtTnVtZXJpY1JhdGluZyxcbiAgICAgICAgbGFiZWw6ICdOdW1lcmljIHJhdGluZydcbiAgICB9LFxuICAgIHNlZ21lbnRzIDoge1xuICAgICAgICBjb21wb25lbnQ6IEZvcm1JdGVtU2VnbWVudHNDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbVNlZ21lbnRzLFxuICAgICAgICBsYWJlbDogJ1NlZ21lbnRzJ1xuICAgIH0sXG4gICAgcmFkaW8gOiB7XG4gICAgICAgIGNvbXBvbmVudDogRm9ybUl0ZW1SYWRpb0NvbXBvbmVudCxcbiAgICAgICAgbW9kZWw6IEZvcm1JdGVtUmFkaW8sXG4gICAgICAgIGxhYmVsOiAnTXVsdGkgQ2hvaWNlJ1xuICAgIH0sXG4gICAgc2VsZWN0IDogeyAvL0RlcHJpY2F0ZWRcbiAgICAgICAgY29tcG9uZW50OiBGb3JtSXRlbVNlbGVjdENvbXBvbmVudCxcbiAgICAgICAgbW9kZWw6IEZvcm1JdGVtU2VsZWN0LFxuICAgICAgICAvL2xhYmVsOiAnU2VsZWN0J1xuICAgIH0sXG4gICAgb3B0aW9uc0VkaXRvciA6IHtcbiAgICAgICAgY29tcG9uZW50OiBGb3JtSXRlbU9wdGlvbnNFZGl0b3JDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbU9wdGlvbnNFZGl0b3JcbiAgICB9LFxuICAgIGNoZWNrYm94IDoge1xuICAgICAgICBjb21wb25lbnQ6IEZvcm1JdGVtQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbUNoZWNrYm94LFxuICAgICAgICBsYWJlbDogJ0NoZWNrYm94J1xuICAgIH0sXG4gICAgZGF0ZSA6IHtcbiAgICAgICAgY29tcG9uZW50OiBGb3JtSXRlbURhdGVDb21wb25lbnQsXG4gICAgICAgIG1vZGVsOiBGb3JtSXRlbURhdGUsXG4gICAgICAgIGxhYmVsOiAnRGF0ZSdcbiAgICB9LFxuICAgIGZpbGUgOiB7XG4gICAgICAgIGNvbXBvbmVudDogRm9ybUl0ZW1GaWxlQ29tcG9uZW50LFxuICAgICAgICBtb2RlbDogRm9ybUl0ZW1GaWxlLFxuICAgICAgICBsYWJlbDogJ0ZpbGUgVXBsb2FkJ1xuICAgIH0sXG4gICAgdm9pY2UgOiB7XG4gICAgICAgIGNvbXBvbmVudDogRm9ybUl0ZW1Wb2ljZUNvbXBvbmVudCxcbiAgICAgICAgbW9kZWw6IEZvcm1JdGVtVm9pY2UsXG4gICAgICAgIGxhYmVsOiAnVm9pY2UgUmVjb3JkJ1xuICAgIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcHRpb24ob3B0aW9uVmFsdWU6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IEZvcm1JdGVtT3B0aW9uSXRlbSB7XG4gICAgcmV0dXJuIDxGb3JtSXRlbU9wdGlvbkl0ZW0+IHsgb3B0aW9uVmFsdWUsIGxhYmVsIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpZWxkKHR5cGU6c3RyaW5nLCBkYXRhOmFueSwgcmVxdWlyZWQ/OmJvb2xlYW4pOiBGb3JtSXRlbSB7XG4gICAgY29uc3Qgb2JqPU9iamVjdC5hc3NpZ24obmV3IChGb3JtSXRlbVR5cGVzW3R5cGVdLm1vZGVsKSwgZGF0YSk7XG4gICAgb2JqLnR5cGU9dHlwZTtcblxuICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgICAoPEZvcm1JdGVtVmFsaWRhdGlvbj5vYmouZmllbGRWYWxpZGF0aW9ucyk9e1xuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXN1cnZleS1mb3JtLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICAgIEBJbnB1dCgpIHR5cGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBpdGVtOiBGb3JtSXRlbSB8IEZvcm1JdGVtU3RyaW5nIHwgRm9ybUl0ZW1SYXRpbmcgfCBGb3JtSXRlbVRleHQgfCBGb3JtSXRlbURhdGUgfCBGb3JtSXRlbVNlZ21lbnRzIHwgRm9ybUl0ZW1SYWRpbyB8IEZvcm1JdGVtTnVtZXJpY1JhdGluZ1xuICAgICAgICB8IEZvcm1JdGVtU2VsZWN0IHwgRm9ybUl0ZW1PcHRpb25zRWRpdG9yIHwgRm9ybUl0ZW1DaGVja2JveCB8IEZvcm1JdGVtRmlsZSB8IEZvcm1JdGVtTGFiZWw7XG4gICAgQElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW49dHJ1ZTtcbiAgICBASW5wdXQoKSBpc01vYmlsZTogYm9vbGVhbj1mYWxzZTtcbiAgICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAgIEBPdXRwdXQoKSBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAVmlld0NoaWxkKEZvcm1JdGVtRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgaXRlbUhvc3Q6IEZvcm1JdGVtRGlyZWN0aXZlO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICkge1xuXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6U2ltcGxlQ2hhbmdlcykge1xuXG4gICAgICAgIGlmIChjaGFuZ2VzICYmIChjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5pZCkpe1xuICAgICAgICAgICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKXtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgbG9hZENvbXBvbmVudCgpIHtcbiAgICAgICAgaWYgKCFGb3JtSXRlbVR5cGVzW3RoaXMudHlwZV0pe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShGb3JtSXRlbVR5cGVzW3RoaXMudHlwZV0uY29tcG9uZW50KTtcblxuICAgICAgICBsZXQgdmlld0NvbnRhaW5lclJlZiA9IHRoaXMuaXRlbUhvc3Qudmlld0NvbnRhaW5lclJlZjtcbiAgICAgICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuXG4gICAgICAgIGxldCBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgKDxGb3JtSXRlbVdpZGdldD5jb21wb25lbnRSZWYuaW5zdGFuY2UpLml0ZW09dGhpcy5pdGVtO1xuICAgICAgICAoPEZvcm1JdGVtV2lkZ2V0PmNvbXBvbmVudFJlZi5pbnN0YW5jZSkuZWRpdGFibGU9dGhpcy5lZGl0YWJsZTtcbiAgICAgICAgKDxGb3JtSXRlbVdpZGdldD5jb21wb25lbnRSZWYuaW5zdGFuY2UpLmlzTW9iaWxlPXRoaXMuaXNNb2JpbGU7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb249KDxGb3JtSXRlbVdpZGdldD5jb21wb25lbnRSZWYuaW5zdGFuY2UpLmNoYW5nZXMuc3Vic2NyaWJlKGl0ZW09PnRoaXMuY2hhbmdlcy5lbWl0KGl0ZW0pKTtcbiAgICB9XG5cbn1cbiIsIjxuZy10ZW1wbGF0ZSBmb3JtLWl0ZW0taG9zdD48L25nLXRlbXBsYXRlPlxuIl19