UNPKG

@ng-dynamic-forms/ui-bootstrap

Version:

Bootstrap UI package for NG Dynamic Forms

180 lines 47.5 kB
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren, ViewContainerRef } from "@angular/core"; import { ReactiveFormsModule } from "@angular/forms"; import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX, DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX_GROUP, DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, DYNAMIC_FORM_CONTROL_TYPE_GROUP, DYNAMIC_FORM_CONTROL_TYPE_INPUT, DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP, DYNAMIC_FORM_CONTROL_TYPE_RATING, DYNAMIC_FORM_CONTROL_TYPE_SELECT, DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA, DYNAMIC_FORM_CONTROL_TYPE_TIMEPICKER, DynamicFormControlContainerComponent, DynamicTemplateDirective, DynamicFormArrayComponent, DynamicFormGroupComponent } from "@ng-dynamic-forms/core"; import { DynamicBootstrapCheckboxComponent } from "./checkbox/dynamic-bootstrap-checkbox.component"; import { DynamicBootstrapDatePickerComponent } from "./datepicker/dynamic-bootstrap-datepicker.component"; import { DynamicBootstrapInputComponent } from "./input/dynamic-bootstrap-input.component"; import { DynamicBootstrapRadioGroupComponent } from "./radio-group/dynamic-bootstrap-radio-group.component"; import { DynamicBootstrapRatingComponent } from "./rating/dynamic-bootstrap-rating.component"; import { DynamicBootstrapSelectComponent } from "./select/dynamic-bootstrap-select.component"; import { DynamicBootstrapTextAreaComponent } from "./textarea/dynamic-bootstrap-textarea.component"; import { DynamicBootstrapTimePickerComponent } from "./timepicker/dynamic-bootstrap-timepicker.component"; import { NgClass, NgFor, NgTemplateOutlet, NgIf } from "@angular/common"; import * as i0 from "@angular/core"; import * as i1 from "@ng-dynamic-forms/core"; import * as i2 from "@angular/forms"; export class DynamicBootstrapFormControlContainerComponent extends DynamicFormControlContainerComponent { get componentType() { return this.componentService.getCustomComponentType(this.model) || bootstrapUIFormControlMapFn(this.model); } constructor(changeDetectorRef, componentFactoryResolver, layoutService, validationService, componentService, relationService) { super(changeDetectorRef, componentFactoryResolver, layoutService, validationService, componentService, relationService); this.changeDetectorRef = changeDetectorRef; this.componentFactoryResolver = componentFactoryResolver; this.layoutService = layoutService; this.validationService = validationService; this.componentService = componentService; this.relationService = relationService; this.asBootstrapFormGroup = true; this.context = null; this.blur = new EventEmitter(); this.change = new EventEmitter(); this.focus = new EventEmitter(); // tslint:disable-next-line:no-output-rename this.customEvent = new EventEmitter(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormControlContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }, { token: i1.DynamicFormComponentService }, { token: i1.DynamicFormRelationService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicBootstrapFormControlContainerComponent, isStandalone: true, selector: "dynamic-bootstrap-form-control", inputs: { asBootstrapFormGroup: "asBootstrapFormGroup", context: "context", group: "group", hostClass: "hostClass", inputTemplateList: ["templates", "inputTemplateList"], layout: "layout", model: "model" }, outputs: { blur: "blur", change: "change", focus: "focus", customEvent: "bsEvent" }, host: { properties: { "class": "this.klass" } }, queries: [{ propertyName: "contentTemplateList", predicate: DynamicTemplateDirective }], viewQueries: [{ propertyName: "componentViewContainerRef", first: true, predicate: ["componentViewContainer"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div [class.form-group]=\"asBootstrapFormGroup || getClass('element', 'container').includes('form-group')\"\n [class.has-error]=\"showErrorMessages\"\n [formGroup]=\"group\"\n [ngClass]=\"['ng-dynamic-forms-'+model.type.toLowerCase(), getClass('element', 'container'), getClass('grid', 'container')]\">\n\n <label *ngIf=\"!isCheckbox && hasLabel\"\n [for]=\"id\"\n [innerHTML]=\"model.label\"\n [ngClass]=\"[getClass('element', 'label'), getClass('grid', 'label')]\"></label>\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: model\"></ng-container>\n\n <div [ngClass]=\"getClass('grid', 'control')\">\n\n <ng-container #componentViewContainer></ng-container>\n\n <span *ngIf=\"hasHint\" class=\"help-block\" [innerHTML]=\"hint\"\n [ngClass]=\"getClass('element', 'hint')\"></span>\n\n </div>\n\n <ul *ngIf=\"showErrorMessages\" class=\"has-error\"\n [ngClass]=\"[getClass('element', 'errors'), getClass('grid', 'errors')]\">\n\n <li *ngFor=\"let message of errorMessages\" class=\"help-block\">{{ message }}</li>\n\n </ul>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: model\"></ng-container>\n\n <ng-content></ng-content>\n\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormControlContainerComponent, decorators: [{ type: Component, args: [{ selector: "dynamic-bootstrap-form-control", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ReactiveFormsModule, NgClass, NgIf, NgTemplateOutlet, NgFor], template: "<div [class.form-group]=\"asBootstrapFormGroup || getClass('element', 'container').includes('form-group')\"\n [class.has-error]=\"showErrorMessages\"\n [formGroup]=\"group\"\n [ngClass]=\"['ng-dynamic-forms-'+model.type.toLowerCase(), getClass('element', 'container'), getClass('grid', 'container')]\">\n\n <label *ngIf=\"!isCheckbox && hasLabel\"\n [for]=\"id\"\n [innerHTML]=\"model.label\"\n [ngClass]=\"[getClass('element', 'label'), getClass('grid', 'label')]\"></label>\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: model\"></ng-container>\n\n <div [ngClass]=\"getClass('grid', 'control')\">\n\n <ng-container #componentViewContainer></ng-container>\n\n <span *ngIf=\"hasHint\" class=\"help-block\" [innerHTML]=\"hint\"\n [ngClass]=\"getClass('element', 'hint')\"></span>\n\n </div>\n\n <ul *ngIf=\"showErrorMessages\" class=\"has-error\"\n [ngClass]=\"[getClass('element', 'errors'), getClass('grid', 'errors')]\">\n\n <li *ngFor=\"let message of errorMessages\" class=\"help-block\">{{ message }}</li>\n\n </ul>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: model\"></ng-container>\n\n <ng-content></ng-content>\n\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ComponentFactoryResolver }, { type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }, { type: i1.DynamicFormComponentService }, { type: i1.DynamicFormRelationService }]; }, propDecorators: { contentTemplateList: [{ type: ContentChildren, args: [DynamicTemplateDirective] }], klass: [{ type: HostBinding, args: ["class"] }], asBootstrapFormGroup: [{ type: Input }], context: [{ type: Input }], group: [{ type: Input }], hostClass: [{ type: Input }], inputTemplateList: [{ type: Input, args: ["templates"] }], layout: [{ type: Input }], model: [{ type: Input }], blur: [{ type: Output }], change: [{ type: Output }], focus: [{ type: Output }], customEvent: [{ type: Output, args: ["bsEvent"] }], componentViewContainerRef: [{ type: ViewChild, args: ["componentViewContainer", { read: ViewContainerRef, static: true }] }] } }); export function bootstrapUIFormControlMapFn(model) { switch (model.type) { case DYNAMIC_FORM_CONTROL_TYPE_ARRAY: return DynamicBootstrapFormArrayComponent; case DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX: return DynamicBootstrapCheckboxComponent; case DYNAMIC_FORM_CONTROL_TYPE_CHECKBOX_GROUP: return DynamicBootstrapFormGroupComponent; case DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER: return DynamicBootstrapDatePickerComponent; case DYNAMIC_FORM_CONTROL_TYPE_GROUP: return DynamicBootstrapFormGroupComponent; case DYNAMIC_FORM_CONTROL_TYPE_INPUT: return DynamicBootstrapInputComponent; case DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP: return DynamicBootstrapRadioGroupComponent; case DYNAMIC_FORM_CONTROL_TYPE_RATING: return DynamicBootstrapRatingComponent; case DYNAMIC_FORM_CONTROL_TYPE_SELECT: return DynamicBootstrapSelectComponent; case DYNAMIC_FORM_CONTROL_TYPE_TEXTAREA: return DynamicBootstrapTextAreaComponent; case DYNAMIC_FORM_CONTROL_TYPE_TIMEPICKER: return DynamicBootstrapTimePickerComponent; default: return null; } } export class DynamicBootstrapFormArrayComponent extends DynamicFormArrayComponent { constructor(layoutService, validationService) { super(layoutService, validationService); this.layoutService = layoutService; this.validationService = validationService; this.blur = new EventEmitter(); this.change = new EventEmitter(); this.customEvent = new EventEmitter(); this.focus = new EventEmitter(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormArrayComponent, deps: [{ token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicBootstrapFormArrayComponent, isStandalone: true, selector: "dynamic-bootstrap-form-array", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model", templates: "templates" }, outputs: { blur: "blur", change: "change", customEvent: "customEvent", focus: "focus" }, viewQueries: [{ propertyName: "components", predicate: DynamicBootstrapFormControlContainerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group\">\n\n <div [formArrayName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element', 'control')\">\n\n <div *ngFor=\"let groupModel of model.groups; let idx = index\" role=\"group\"\n [formGroupName]=\"idx\" [ngClass]=\"[getClass('element', 'group'), getClass('grid', 'group')]\">\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: groupModel\"></ng-container>\n\n <dynamic-bootstrap-form-control *ngFor=\"let _model of groupModel.group\"\n [context]=\"groupModel\"\n [group]=\"array.at(idx)\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (bsEvent)=\"onCustomEvent($event, null, true)\"></dynamic-bootstrap-form-control>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: groupModel\"></ng-container>\n\n </div>\n\n </div>\n\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DynamicBootstrapFormControlContainerComponent, selector: "dynamic-bootstrap-form-control", inputs: ["asBootstrapFormGroup", "context", "group", "hostClass", "templates", "layout", "model"], outputs: ["blur", "change", "focus", "bsEvent"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormArrayComponent, decorators: [{ type: Component, args: [{ selector: "dynamic-bootstrap-form-array", standalone: true, imports: [ReactiveFormsModule, NgClass, NgFor, NgTemplateOutlet, DynamicBootstrapFormControlContainerComponent], template: "<ng-container [formGroup]=\"group\">\n\n <div [formArrayName]=\"model.id\" [id]=\"id\" [ngClass]=\"getClass('element', 'control')\">\n\n <div *ngFor=\"let groupModel of model.groups; let idx = index\" role=\"group\"\n [formGroupName]=\"idx\" [ngClass]=\"[getClass('element', 'group'), getClass('grid', 'group')]\">\n\n <ng-container *ngTemplateOutlet=\"startTemplate?.templateRef; context: groupModel\"></ng-container>\n\n <dynamic-bootstrap-form-control *ngFor=\"let _model of groupModel.group\"\n [context]=\"groupModel\"\n [group]=\"array.at(idx)\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (bsEvent)=\"onCustomEvent($event, null, true)\"></dynamic-bootstrap-form-control>\n\n <ng-container *ngTemplateOutlet=\"endTemplate?.templateRef; context: groupModel\"></ng-container>\n\n </div>\n\n </div>\n\n</ng-container>\n" }] }], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{ type: Input }], group: [{ type: Input }], layout: [{ type: Input }], model: [{ type: Input }], templates: [{ type: Input }], blur: [{ type: Output }], change: [{ type: Output }], customEvent: [{ type: Output }], focus: [{ type: Output }], components: [{ type: ViewChildren, args: [DynamicBootstrapFormControlContainerComponent] }] } }); export class DynamicBootstrapFormGroupComponent extends DynamicFormGroupComponent { constructor(layoutService, validationService) { super(layoutService, validationService); this.layoutService = layoutService; this.validationService = validationService; this.blur = new EventEmitter(); this.change = new EventEmitter(); this.customEvent = new EventEmitter(); this.focus = new EventEmitter(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormGroupComponent, deps: [{ token: i1.DynamicFormLayoutService }, { token: i1.DynamicFormValidationService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.3", type: DynamicBootstrapFormGroupComponent, isStandalone: true, selector: "dynamic-bootstrap-form-group", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model", templates: "templates" }, outputs: { blur: "blur", change: "change", customEvent: "customEvent", focus: "focus" }, viewQueries: [{ propertyName: "components", predicate: DynamicBootstrapFormControlContainerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group\">\n\n <fieldset [formGroupName]=\"model.id\"\n [id]=\"id\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\">\n\n <legend *ngIf=\"model.legend\" [innerHTML]=\"model.legend\"></legend>\n\n <dynamic-bootstrap-form-control *ngFor=\"let _model of model.group\"\n [asBootstrapFormGroup]=\"false\"\n [group]=\"control\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (bsEvent)=\"onCustomEvent($event, null, true)\"></dynamic-bootstrap-form-control>\n </fieldset>\n\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DynamicBootstrapFormControlContainerComponent, selector: "dynamic-bootstrap-form-control", inputs: ["asBootstrapFormGroup", "context", "group", "hostClass", "templates", "layout", "model"], outputs: ["blur", "change", "focus", "bsEvent"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapFormGroupComponent, decorators: [{ type: Component, args: [{ selector: "dynamic-bootstrap-form-group", standalone: true, imports: [ReactiveFormsModule, NgClass, NgIf, NgFor, DynamicBootstrapFormControlContainerComponent], template: "<ng-container [formGroup]=\"group\">\n\n <fieldset [formGroupName]=\"model.id\"\n [id]=\"id\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\">\n\n <legend *ngIf=\"model.legend\" [innerHTML]=\"model.legend\"></legend>\n\n <dynamic-bootstrap-form-control *ngFor=\"let _model of model.group\"\n [asBootstrapFormGroup]=\"false\"\n [group]=\"control\"\n [hidden]=\"_model.hidden\"\n [layout]=\"formLayout\"\n [model]=\"_model\"\n [templates]=\"templates\"\n [hostClass]=\"[getClass('element','children'), getClass('grid','children')]\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"\n (bsEvent)=\"onCustomEvent($event, null, true)\"></dynamic-bootstrap-form-control>\n </fieldset>\n\n</ng-container>\n" }] }], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{ type: Input }], group: [{ type: Input }], layout: [{ type: Input }], model: [{ type: Input }], templates: [{ type: Input }], blur: [{ type: Output }], change: [{ type: Output }], customEvent: [{ type: Output }], focus: [{ type: Output }], components: [{ type: ViewChildren, args: [DynamicBootstrapFormControlContainerComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1ib290c3RyYXAtZm9ybS1jb250cm9sLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWZvcm1zL3VpLWJvb3RzdHJhcC9zcmMvbGliL2R5bmFtaWMtYm9vdHN0cmFwLWZvcm0tY29udHJvbC1jb250YWluZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2wtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLWJvb3RzdHJhcC1mb3JtLWFycmF5LmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1ib290c3RyYXAvc3JjL2xpYi9keW5hbWljLWJvb3RzdHJhcC1mb3JtLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULGVBQWUsRUFDZixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCwrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLHdDQUF3QyxFQUN4QyxvQ0FBb0MsRUFDcEMsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQixxQ0FBcUMsRUFDckMsZ0NBQWdDLEVBQ2hDLGdDQUFnQyxFQUNoQyxrQ0FB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O1FBQy9DLGdCQUFXLEdBQWdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUUsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBTXhELENBQUM7OEdBaEJRLGtDQUFrQztrR0FBbEMsa0NBQWtDLGdVQVk3Qiw2Q0FBNkMsdUVHdkwvRCxvdUNBd0JBLDJDSGlKYyxtQkFBbUIsbWJBQUUsT0FBTyxvRkFBRSxJQUFJLDZGQUFFLEtBQUssbUhBekcxQyw2Q0FBNkM7OzJGQTJHN0Msa0NBQWtDO2tCQU45QyxTQUFTOytCQUNJLDhCQUE4QixjQUU1QixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSw2Q0FBNkMsQ0FBQzswSkFHMUYsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBRXNELFVBQVU7c0JBQXRFLFlBQVk7dUJBQUMsNkNBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0FSUkFZLFxuICAgIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfQ0hFQ0tCT1gsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9DSEVDS0JPWF9HUk9VUCxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0RBVEVQSUNLRVIsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9HUk9VUCxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0lOUFVULFxuICAgIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfUkFESU9fR1JPVVAsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9SQVRJTkcsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TRUxFQ1QsXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9URVhUQVJFQSxcbiAgICBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX1RJTUVQSUNLRVIsXG4gICAgRHluYW1pY0Zvcm1BcnJheUdyb3VwTW9kZWwsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sLFxuICAgIER5bmFtaWNGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xFdmVudCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCxcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1MYXlvdXQsXG4gICAgRHluYW1pY0Zvcm1MYXlvdXRTZXJ2aWNlLFxuICAgIER5bmFtaWNGb3JtUmVsYXRpb25TZXJ2aWNlLFxuICAgIER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgRHluYW1pY1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgIER5bmFtaWNGb3JtQXJyYXlDb21wb25lbnQsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTGF5b3V0LFxuICAgIER5bmFtaWNGb3JtQXJyYXlNb2RlbCxcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xDdXN0b21FdmVudCxcbiAgICBEeW5hbWljRm9ybUdyb3VwQ29tcG9uZW50LFxuICAgIER5bmFtaWNGb3JtR3JvdXBNb2RlbFxufSBmcm9tIFwiQG5nLWR5bmFtaWMtZm9ybXMvY29yZVwiO1xuaW1wb3J0IHsgRHluYW1pY0Jvb3RzdHJhcENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4vY2hlY2tib3gvZHluYW1pYy1ib290c3RyYXAtY2hlY2tib3guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEeW5hbWljQm9vdHN0cmFwRGF0ZVBpY2tlckNvbXBvbmVudCB9IGZyb20gXCIuL2RhdGVwaWNrZXIvZHluYW1pYy1ib290c3RyYXAtZGF0ZXBpY2tlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNCb290c3RyYXBJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuL2lucHV0L2R5bmFtaWMtYm9vdHN0cmFwLWlucHV0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY0Jvb3RzdHJhcFJhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tIFwiLi9yYWRpby1ncm91cC9keW5hbWljLWJvb3RzdHJhcC1yYWRpby1ncm91cC5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNCb290c3RyYXBSYXRpbmdDb21wb25lbnQgfSBmcm9tIFwiLi9yYXRpbmcvZHluYW1pYy1ib290c3RyYXAtcmF0aW5nLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHluYW1pY0Jvb3RzdHJhcFNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuL3NlbGVjdC9keW5hbWljLWJvb3RzdHJhcC1zZWxlY3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEeW5hbWljQm9vdHN0cmFwVGV4dEFyZWFDb21wb25lbnQgfSBmcm9tIFwiLi90ZXh0YXJlYS9keW5hbWljLWJvb3RzdHJhcC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IER5bmFtaWNCb290c3RyYXBUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSBcIi4vdGltZXBpY2tlci9keW5hbWljLWJvb3RzdHJhcC10aW1lcGlja2VyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXQsIE5nSWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcImR5bmFtaWMtYm9vdHN0cmFwLWZvcm0tY29udHJvbFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy1ib290c3RyYXAtZm9ybS1jb250cm9sLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbFwiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIE5nQ2xhc3MsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIE5nRm9yXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQm9vdHN0cmFwRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnQgZXh0ZW5kcyBEeW5hbWljRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnQge1xuICAgIEBDb250ZW50Q2hpbGRyZW4oRHluYW1pY1RlbXBsYXRlRGlyZWN0aXZlKSBjb250ZW50VGVtcGxhdGVMaXN0ITogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT47XG5cbiAgICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKSBrbGFzcz86IHN0cmluZztcblxuICAgIEBJbnB1dCgpIGFzQm9vdHN0cmFwRm9ybUdyb3VwID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBjb250ZXh0OiBEeW5hbWljRm9ybUFycmF5R3JvdXBNb2RlbCB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBASW5wdXQoKSBob3N0Q2xhc3M/OiBzdHJpbmdbXTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXG4gICAgQElucHV0KFwidGVtcGxhdGVzXCIpIGlucHV0VGVtcGxhdGVMaXN0PzogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQElucHV0KCkgbGF5b3V0PzogRHluYW1pY0Zvcm1MYXlvdXQ7XG4gICAgQElucHV0KCkgbW9kZWwhOiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbDtcblxuICAgIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgZm9jdXM6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PigpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtcmVuYW1lXG4gICAgQE91dHB1dChcImJzRXZlbnRcIikgY3VzdG9tRXZlbnQ6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PigpO1xuXG4gICAgQFZpZXdDaGlsZChcImNvbXBvbmVudFZpZXdDb250YWluZXJcIiwge3JlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZX0pIGNvbXBvbmVudFZpZXdDb250YWluZXJSZWYhOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgZ2V0IGNvbXBvbmVudFR5cGUoKTogVHlwZTxEeW5hbWljRm9ybUNvbnRyb2w+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZ2V0Q3VzdG9tQ29tcG9uZW50VHlwZSh0aGlzLm1vZGVsKSB8fCBib290c3RyYXBVSUZvcm1Db250cm9sTWFwRm4odGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGxheW91dFNlcnZpY2U6IER5bmFtaWNGb3JtTGF5b3V0U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvblNlcnZpY2U6IER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGNvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNGb3JtQ29tcG9uZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVsYXRpb25TZXJ2aWNlOiBEeW5hbWljRm9ybVJlbGF0aW9uU2VydmljZSkge1xuICAgICAgICBzdXBlcihjaGFuZ2VEZXRlY3RvclJlZiwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBsYXlvdXRTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSwgY29tcG9uZW50U2VydmljZSwgcmVsYXRpb25TZXJ2aWNlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBVSUZvcm1Db250cm9sTWFwRm4obW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsKTogVHlwZTxEeW5hbWljRm9ybUNvbnRyb2w+IHwgbnVsbCB7XG4gICAgc3dpdGNoIChtb2RlbC50eXBlKSB7XG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9BUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljQm9vdHN0cmFwRm9ybUFycmF5Q29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9DSEVDS0JPWDpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljQm9vdHN0cmFwQ2hlY2tib3hDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0NIRUNLQk9YX0dST1VQOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNCb290c3RyYXBGb3JtR3JvdXBDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0RBVEVQSUNLRVI6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY0Jvb3RzdHJhcERhdGVQaWNrZXJDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0dST1VQOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNCb290c3RyYXBGb3JtR3JvdXBDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX0lOUFVUOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNCb290c3RyYXBJbnB1dENvbXBvbmVudDtcblxuICAgICAgICBjYXNlIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfUkFESU9fR1JPVVA6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY0Jvb3RzdHJhcFJhZGlvR3JvdXBDb21wb25lbnQ7XG5cbiAgICAgICAgY2FzZSBEWU5BTUlDX0ZPUk1fQ09OVFJPTF9UWVBFX1JBVElORzpcbiAgICAgICAgICAgIHJldHVybiBEeW5hbWljQm9vdHN0cmFwUmF0aW5nQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9TRUxFQ1Q6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY0Jvb3RzdHJhcFNlbGVjdENvbXBvbmVudDtcblxuICAgICAgICBjYXNlIERZTkFNSUNfRk9STV9DT05UUk9MX1RZUEVfVEVYVEFSRUE6XG4gICAgICAgICAgICByZXR1cm4gRHluYW1pY0Jvb3RzdHJhcFRleHRBcmVhQ29tcG9uZW50O1xuXG4gICAgICAgIGNhc2UgRFlOQU1JQ19GT1JNX0NPTlRST0xfVFlQRV9USU1FUElDS0VSOlxuICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNCb290c3RyYXBUaW1lUGlja2VyQ29tcG9uZW50O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcImR5bmFtaWMtYm9vdHN0cmFwLWZvcm0tYXJyYXlcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtYm9vdHN0cmFwLWZvcm0tYXJyYXkuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0NsYXNzLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgRHluYW1pY0Jvb3RzdHJhcEZvcm1Db250cm9sQ29udGFpbmVyQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQm9vdHN0cmFwRm9ybUFycmF5Q29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0Zvcm1BcnJheUNvbXBvbmVudCB7XG4gICAgQElucHV0KCkgZm9ybUxheW91dD86IER5bmFtaWNGb3JtTGF5b3V0O1xuICAgIEBJbnB1dCgpIGdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBASW5wdXQoKSBsYXlvdXQ/OiBEeW5hbWljRm9ybUNvbnRyb2xMYXlvdXQ7XG4gICAgQElucHV0KCkgbW9kZWwhOiBEeW5hbWljRm9ybUFycmF5TW9kZWw7XG4gICAgQElucHV0KCkgdGVtcGxhdGVzPzogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT47XG5cbiAgICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGN1c3RvbUV2ZW50OiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKER5bmFtaWNCb290c3RyYXBGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudCkgY29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxEeW5hbWljQm9vdHN0cmFwRm9ybUNvbnRyb2xDb250YWluZXJDb21wb25lbnQ+O1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGxheW91dFNlcnZpY2U6IER5bmFtaWNGb3JtTGF5b3V0U2VydmljZSwgcHJvdGVjdGVkIHZhbGlkYXRpb25TZXJ2aWNlOiBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGxheW91dFNlcnZpY2UsIHZhbGlkYXRpb25TZXJ2aWNlKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcImR5bmFtaWMtYm9vdHN0cmFwLWZvcm0tZ3JvdXBcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtYm9vdHN0cmFwLWZvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0NsYXNzLCBOZ0lmLCBOZ0ZvciwgRHluYW1pY0Jvb3RzdHJhcEZvcm1Db250cm9sQ29udGFpbmVyQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQm9vdHN0cmFwRm9ybUdyb3VwQ29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0Zvcm1Hcm91cENvbXBvbmVudCB7XG4gICAgQElucHV0KCkgZm9ybUxheW91dD86IER5bmFtaWNGb3JtTGF5b3V0O1xuICAgIEBJbnB1dCgpIGdyb3VwITogVW50eXBlZEZvcm1Hcm91cDtcbiAgICBASW5wdXQoKSBsYXlvdXQ/OiBEeW5hbWljRm9ybUNvbnRyb2xMYXlvdXQ7XG4gICAgQElucHV0KCkgbW9kZWwhOiBEeW5hbWljRm9ybUdyb3VwTW9kZWw7XG4gICAgQElucHV0KCkgdGVtcGxhdGVzPzogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT4gfCBEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmVbXTtcblxuICAgIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQ6IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oRHluYW1pY0Jvb3RzdHJhcEZvcm1Db250cm9sQ29udGFpbmVyQ29tcG9uZW50KSBjb21wb25lbnRzITogUXVlcnlMaXN0PER5bmFtaWNCb290c3RyYXBGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudD47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbGF5b3V0U2VydmljZTogRHluYW1pY0Zvcm1MYXlvdXRTZXJ2aWNlLCBwcm90ZWN0ZWQgdmFsaWRhdGlvblNlcnZpY2U6IER5bmFtaWNGb3JtVmFsaWRhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIobGF5b3V0U2VydmljZSwgdmFsaWRhdGlvblNlcnZpY2UpO1xuICAgIH1cbn1cbiIsIjxkaXYgW2NsYXNzLmZvcm0tZ3JvdXBdPVwiYXNCb290c3RyYXBGb3JtR3JvdXAgfHwgZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnY29udGFpbmVyJykuaW5jbHVkZXMoJ2Zvcm0tZ3JvdXAnKVwiXG4gICAgIFtjbGFzcy5oYXMtZXJyb3JdPVwic2hvd0Vycm9yTWVzc2FnZXNcIlxuICAgICBbZm9ybUdyb3VwXT1cImdyb3VwXCJcbiAgICAgW25nQ2xhc3NdPVwiWyduZy1keW5hbWljLWZvcm1zLScrbW9kZWwudHlwZS50b0xvd2VyQ2FzZSgpLCBnZXRDbGFzcygnZWxlbWVudCcsICdjb250YWluZXInKSwgZ2V0Q2xhc3MoJ2dyaWQnLCAnY29udGFpbmVyJyldXCI+XG5cbiAgICA8bGFiZWwgKm5nSWY9XCIhaXNDaGVja2JveCAmJiBoYXNMYWJlbFwiXG4gICAgICAgICAgIFtmb3JdPVwiaWRcIlxuICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm1vZGVsLmxhYmVsXCJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwiW2dldENsYXNzKCdlbGVtZW50JywgJ2xhYmVsJyksIGdldENsYXNzKCdncmlkJywgJ2xhYmVsJyldXCI+PC9sYWJlbD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGFydFRlbXBsYXRlPy50ZW1wbGF0ZVJlZjsgY29udGV4dDogbW9kZWxcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2dyaWQnLCAnY29udHJvbCcpXCI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAjY29tcG9uZW50Vmlld0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cImhhc0hpbnRcIiBjbGFzcz1cImhlbHAtYmxvY2tcIiBbaW5uZXJIVE1MXT1cImhpbnRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcygnZWxlbWVudCcsICdoaW50JylcIj48L3NwYW4+XG5cbiAgICA8L2Rpdj5cblxuICAgIDx1bCAqbmdJZj1cInNob3dFcnJvck1lc3NhZ2VzXCIgY2xhc3M9XCJoYXMtZXJyb3JcIlxuICAgICAgICBbbmdDbGFzc109XCJbZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnZXJyb3JzJyksIGdldENsYXNzKCdncmlkJywgJ2Vycm9ycycpXVwiPlxuXG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBlcnJvck1lc3NhZ2VzXCIgY2xhc3M9XCJoZWxwLWJsb2NrXCI+e3sgbWVzc2FnZSB9fTwvbGk+XG5cbiAgICA8L3VsPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVuZFRlbXBsYXRlPy50ZW1wbGF0ZVJlZjsgY29udGV4dDogbW9kZWxcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPC9kaXY+XG4iLCI8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cblxuICAgIDxkaXYgW2Zvcm1BcnJheU5hbWVdPVwibW9kZWwuaWRcIiBbaWRdPVwiaWRcIiBbbmdDbGFzc109XCJnZXRDbGFzcygnZWxlbWVudCcsICdjb250cm9sJylcIj5cblxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cE1vZGVsIG9mIG1vZGVsLmdyb3VwczsgbGV0IGlkeCA9IGluZGV4XCIgcm9sZT1cImdyb3VwXCJcbiAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpZHhcIiBbbmdDbGFzc109XCJbZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnZ3JvdXAnKSwgZ2V0Q2xhc3MoJ2dyaWQnLCAnZ3JvdXAnKV1cIj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXJ0VGVtcGxhdGU/LnRlbXBsYXRlUmVmOyBjb250ZXh0OiBncm91cE1vZGVsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkeW5hbWljLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2wgKm5nRm9yPVwibGV0IF9tb2RlbCBvZiBncm91cE1vZGVsLmdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiZ3JvdXBNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJhcnJheS5hdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJfbW9kZWwuaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xheW91dF09XCJmb3JtTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIl9tb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNdPVwidGVtcGxhdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvc3RDbGFzc109XCJbZ2V0Q2xhc3MoJ2VsZW1lbnQnLCdjaGlsZHJlbicpLCBnZXRDbGFzcygnZ3JpZCcsJ2NoaWxkcmVuJyldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJzRXZlbnQpPVwib25DdXN0b21FdmVudCgkZXZlbnQsIG51bGwsIHRydWUpXCI+PC9keW5hbWljLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2w+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbmRUZW1wbGF0ZT8udGVtcGxhdGVSZWY7IGNvbnRleHQ6IGdyb3VwTW9kZWxcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuXG48L25nLWNvbnRhaW5lcj5cbiIsIjxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxuXG4gICAgPGZpZWxkc2V0IFtmb3JtR3JvdXBOYW1lXT1cIm1vZGVsLmlkXCJcbiAgICAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwibW9kZWwubmFtZVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldENsYXNzKCdlbGVtZW50JywgJ2NvbnRyb2wnKVwiPlxuXG4gICAgICAgIDxsZWdlbmQgKm5nSWY9XCJtb2RlbC5sZWdlbmRcIiBbaW5uZXJIVE1MXT1cIm1vZGVsLmxlZ2VuZFwiPjwvbGVnZW5kPlxuXG4gICAgICAgIDxkeW5hbWljLWJvb3RzdHJhcC1mb3JtLWNvbnRyb2wgKm5nRm9yPVwibGV0IF9tb2RlbCBvZiBtb2RlbC5ncm91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FzQm9vdHN0cmFwRm9ybUdyb3VwXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJfbW9kZWwuaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGF5b3V0XT1cImZvcm1MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJfbW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZXNdPVwidGVtcGxhdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaG9zdENsYXNzXT1cIltnZXRDbGFzcygnZWxlbWVudCcsJ2NoaWxkcmVuJyksIGdldENsYXNzKCdncmlkJywnY2hpbGRyZW4nKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChic0V2ZW50KT1cIm9uQ3VzdG9tRXZlbnQoJGV2ZW50LCBudWxsLCB0cnVlKVwiPjwvZHluYW1pYy1ib290c3RyYXAtZm9ybS1jb250cm9sPlxuICAgIDwvZmllbGRzZXQ+XG5cbjwvbmctY29udGFpbmVyPlxuIl19