@ng-dynamic-forms/ui-bootstrap
Version:
Bootstrap UI package for NG Dynamic Forms
39 lines • 22.6 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
import { ReactiveFormsModule } from "@angular/forms";
import { DynamicFormControlComponent, DynamicFormsCoreModule } from "@ng-dynamic-forms/core";
import { NgxMaskDirective } from "ngx-mask";
import { NgIf, NgClass, NgFor, AsyncPipe } 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 DynamicBootstrapInputComponent extends DynamicFormControlComponent {
constructor(layoutService, validationService) {
super(layoutService, validationService);
this.layoutService = layoutService;
this.validationService = validationService;
this.blur = new EventEmitter();
this.change = new EventEmitter();
this.focus = new EventEmitter();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapInputComponent, 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: DynamicBootstrapInputComponent, isStandalone: true, selector: "dynamic-bootstrap-input", inputs: { formLayout: "formLayout", group: "group", layout: "layout", model: "model" }, outputs: { blur: "blur", change: "change", focus: "focus" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"group\" [class.input-group]=\"model.prefix || model.suffix\">\n\n <div *ngIf=\"model.prefix\" class=\"input-group-addon\" [innerHTML]=\"model.prefix\"></div>\n\n <input *ngIf=\"model.inputType === 'file'; else maskedInput\" class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n\n <ng-template #maskedInput>\n <input class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [mask]=\"model.mask\"\n [specialCharacters]=\"model.maskConfig?.specialCharacters\"\n [patterns]=\"model.maskConfig?.patterns\"\n [prefix]=\"model.maskConfig?.prefix\"\n [suffix]=\"model.maskConfig?.suffix\"\n [thousandSeparator]=\"model.maskConfig?.thousandSeparator\"\n [decimalMarker]=\"model.maskConfig?.decimalMarker\"\n [dropSpecialCharacters]=\"model.maskConfig?.dropSpecialCharacters\"\n [hiddenInput]=\"model.maskConfig?.hiddenInput\"\n [showMaskTyped]=\"model.maskConfig?.showMaskTyped\"\n [placeHolderCharacter]=\"model.maskConfig?.placeHolderCharacter\"\n [shownMaskExpression]=\"model.maskConfig?.shownMaskExpression\"\n [showTemplate]=\"model.maskConfig?.showTemplate\"\n [clearIfNotMatch]=\"model.maskConfig.clearIfNotMatch\"\n [validation]=\"model.maskConfig.validation\"\n [separatorLimit]=\"model.maskConfig.separatorLimit\"\n [allowNegativeNumbers]=\"model.maskConfig.allowNegativeNumbers\"\n [leadZeroDateTime]=\"model.maskConfig.leadZeroDateTime\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n </ng-template>\n\n <div *ngIf=\"model.suffix\" class=\"input-group-addon\" [innerHTML]=\"model.suffix\"></div>\n\n <datalist *ngIf=\"model.hasList\" [id]=\"model.listId\">\n <option *ngFor=\"let option of model.list$ | async\" [value]=\"option\">\n </datalist>\n\n</div>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DynamicFormsCoreModule }, { kind: "directive", type: i1.DynamicListDirective, selector: "[dynamicList]", inputs: ["dynamicList"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicBootstrapInputComponent, decorators: [{
type: Component,
args: [{ selector: "dynamic-bootstrap-input", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ReactiveFormsModule, NgIf, DynamicFormsCoreModule, NgClass, NgxMaskDirective, NgFor, AsyncPipe], template: "<div [formGroup]=\"group\" [class.input-group]=\"model.prefix || model.suffix\">\n\n <div *ngIf=\"model.prefix\" class=\"input-group-addon\" [innerHTML]=\"model.prefix\"></div>\n\n <input *ngIf=\"model.inputType === 'file'; else maskedInput\" class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n\n <ng-template #maskedInput>\n <input class=\"form-control\"\n [attr.accept]=\"model.accept\"\n [attr.max]=\"model.max\"\n [attr.min]=\"model.min\"\n [attr.multiple]=\"model.multiple\"\n [attr.step]=\"model.step\"\n [autocomplete]=\"model.autoComplete\"\n [autofocus]=\"model.autoFocus\"\n [dynamicList]=\"model.listId\"\n [formControlName]=\"model.id\"\n [id]=\"id\"\n [maxlength]=\"model.maxLength\"\n [minlength]=\"model.minLength\"\n [name]=\"model.name\"\n [ngClass]=\"getClass('element', 'control')\"\n [pattern]=\"model.pattern\"\n [placeholder]=\"model.placeholder\"\n [readonly]=\"model.readOnly\"\n [required]=\"model.required\"\n [spellcheck]=\"model.spellCheck\"\n [tabindex]=\"model.tabIndex\"\n [mask]=\"model.mask\"\n [specialCharacters]=\"model.maskConfig?.specialCharacters\"\n [patterns]=\"model.maskConfig?.patterns\"\n [prefix]=\"model.maskConfig?.prefix\"\n [suffix]=\"model.maskConfig?.suffix\"\n [thousandSeparator]=\"model.maskConfig?.thousandSeparator\"\n [decimalMarker]=\"model.maskConfig?.decimalMarker\"\n [dropSpecialCharacters]=\"model.maskConfig?.dropSpecialCharacters\"\n [hiddenInput]=\"model.maskConfig?.hiddenInput\"\n [showMaskTyped]=\"model.maskConfig?.showMaskTyped\"\n [placeHolderCharacter]=\"model.maskConfig?.placeHolderCharacter\"\n [shownMaskExpression]=\"model.maskConfig?.shownMaskExpression\"\n [showTemplate]=\"model.maskConfig?.showTemplate\"\n [clearIfNotMatch]=\"model.maskConfig.clearIfNotMatch\"\n [validation]=\"model.maskConfig.validation\"\n [separatorLimit]=\"model.maskConfig.separatorLimit\"\n [allowNegativeNumbers]=\"model.maskConfig.allowNegativeNumbers\"\n [leadZeroDateTime]=\"model.maskConfig.leadZeroDateTime\"\n [type]=\"model.inputType\"\n (blur)=\"onBlur($event)\"\n (change)=\"onChange($event)\"\n (focus)=\"onFocus($event)\"/>\n </ng-template>\n\n <div *ngIf=\"model.suffix\" class=\"input-group-addon\" [innerHTML]=\"model.suffix\"></div>\n\n <datalist *ngIf=\"model.hasList\" [id]=\"model.listId\">\n <option *ngFor=\"let option of model.list$ | async\" [value]=\"option\">\n </datalist>\n\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i1.DynamicFormLayoutService }, { type: i1.DynamicFormValidationService }]; }, propDecorators: { formLayout: [{
type: Input
}], group: [{
type: Input
}], layout: [{
type: Input
}], model: [{
type: Input
}], blur: [{
type: Output
}], change: [{
type: Output
}], focus: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1ib290c3RyYXAtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZHluYW1pYy1mb3Jtcy91aS1ib290c3RyYXAvc3JjL2xpYi9pbnB1dC9keW5hbWljLWJvb3RzdHJhcC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWZvcm1zL3VpLWJvb3RzdHJhcC9zcmMvbGliL2lucHV0L2R5bmFtaWMtYm9vdHN0cmFwLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEcsT0FBTyxFQUFvQixtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDSCwyQkFBMkIsRUFNM0Isc0JBQXNCLEVBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQVNsRSxNQUFNLE9BQU8sOEJBQStCLFNBQVEsMkJBQTJCO0lBVTNFLFlBQXNCLGFBQXVDLEVBQVksaUJBQStDO1FBQ3BILEtBQUssQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUR0QixrQkFBYSxHQUFiLGFBQWEsQ0FBMEI7UUFBWSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQThCO1FBSjlHLFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsVUFBSyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBSXhELENBQUM7OEdBWlEsOEJBQThCO2tHQUE5Qiw4QkFBOEIsK1BDckIzQyxxNEhBbUZBLDJDRGhFYyxtQkFBbUIsNnVEQUFFLElBQUksNEZBQUUsc0JBQXNCLHlJQUFFLE9BQU8sb0ZBQUUsZ0JBQWdCLHVlQUFFLEtBQUssOEdBQUUsU0FBUzs7MkZBRS9GLDhCQUE4QjtrQkFQMUMsU0FBUzsrQkFDSSx5QkFBeUIsbUJBRWxCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDOzBKQUdoRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gICAgRHluYW1pY0Zvcm1Db250cm9sQ29tcG9uZW50LFxuICAgIER5bmFtaWNGb3JtQ29udHJvbExheW91dCxcbiAgICBEeW5hbWljRm9ybUxheW91dCxcbiAgICBEeW5hbWljRm9ybUxheW91dFNlcnZpY2UsXG4gICAgRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcbiAgICBEeW5hbWljSW5wdXRNb2RlbCxcbiAgICBEeW5hbWljRm9ybXNDb3JlTW9kdWxlXG59IGZyb20gXCJAbmctZHluYW1pYy1mb3Jtcy9jb3JlXCI7XG5pbXBvcnQgeyBOZ3hNYXNrRGlyZWN0aXZlIH0gZnJvbSBcIm5neC1tYXNrXCI7XG5pbXBvcnQgeyBOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgQXN5bmNQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJkeW5hbWljLWJvb3RzdHJhcC1pbnB1dFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy1ib290c3RyYXAtaW5wdXQuY29tcG9uZW50Lmh0bWxcIixcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOZ0lmLCBEeW5hbWljRm9ybXNDb3JlTW9kdWxlLCBOZ0NsYXNzLCBOZ3hNYXNrRGlyZWN0aXZlLCBOZ0ZvciwgQXN5bmNQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQm9vdHN0cmFwSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBEeW5hbWljRm9ybUNvbnRyb2xDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGZvcm1MYXlvdXQ/OiBEeW5hbWljRm9ybUxheW91dDtcbiAgICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgQElucHV0KCkgbGF5b3V0PzogRHluYW1pY0Zvcm1Db250cm9sTGF5b3V0O1xuICAgIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0lucHV0TW9kZWw7XG5cbiAgICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBsYXlvdXRTZXJ2aWNlOiBEeW5hbWljRm9ybUxheW91dFNlcnZpY2UsIHByb3RlY3RlZCB2YWxpZGF0aW9uU2VydmljZTogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSkge1xuICAgICAgICBzdXBlcihsYXlvdXRTZXJ2aWNlLCB2YWxpZGF0aW9uU2VydmljZSk7XG4gICAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCIgW2NsYXNzLmlucHV0LWdyb3VwXT1cIm1vZGVsLnByZWZpeCB8fCBtb2RlbC5zdWZmaXhcIj5cblxuICAgIDxkaXYgKm5nSWY9XCJtb2RlbC5wcmVmaXhcIiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCIgW2lubmVySFRNTF09XCJtb2RlbC5wcmVmaXhcIj48L2Rpdj5cblxuICAgIDxpbnB1dCAqbmdJZj1cIm1vZGVsLmlucHV0VHlwZSA9PT0gJ2ZpbGUnOyBlbHNlIG1hc2tlZElucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICBbYXR0ci5hY2NlcHRdPVwibW9kZWwuYWNjZXB0XCJcbiAgICAgICAgICAgW2F0dHIubWF4XT1cIm1vZGVsLm1heFwiXG4gICAgICAgICAgIFthdHRyLm1pbl09XCJtb2RlbC5taW5cIlxuICAgICAgICAgICBbYXR0ci5tdWx0aXBsZV09XCJtb2RlbC5tdWx0aXBsZVwiXG4gICAgICAgICAgIFthdHRyLnN0ZXBdPVwibW9kZWwuc3RlcFwiXG4gICAgICAgICAgIFthdXRvY29tcGxldGVdPVwibW9kZWwuYXV0b0NvbXBsZXRlXCJcbiAgICAgICAgICAgW2F1dG9mb2N1c109XCJtb2RlbC5hdXRvRm9jdXNcIlxuICAgICAgICAgICBbZHluYW1pY0xpc3RdPVwibW9kZWwubGlzdElkXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJtb2RlbC5pZFwiXG4gICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgIFttYXhsZW5ndGhdPVwibW9kZWwubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgW21pbmxlbmd0aF09XCJtb2RlbC5taW5MZW5ndGhcIlxuICAgICAgICAgICBbbmFtZV09XCJtb2RlbC5uYW1lXCJcbiAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2VsZW1lbnQnLCAnY29udHJvbCcpXCJcbiAgICAgICAgICAgW3BhdHRlcm5dPVwibW9kZWwucGF0dGVyblwiXG4gICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2RlbC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgIFtyZWFkb25seV09XCJtb2RlbC5yZWFkT25seVwiXG4gICAgICAgICAgIFtyZXF1aXJlZF09XCJtb2RlbC5yZXF1aXJlZFwiXG4gICAgICAgICAgIFtzcGVsbGNoZWNrXT1cIm1vZGVsLnNwZWxsQ2hlY2tcIlxuICAgICAgICAgICBbdGFiaW5kZXhdPVwibW9kZWwudGFiSW5kZXhcIlxuICAgICAgICAgICBbdHlwZV09XCJtb2RlbC5pbnB1dFR5cGVcIlxuICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIi8+XG5cbiAgICA8bmctdGVtcGxhdGUgI21hc2tlZElucHV0PlxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgW2F0dHIuYWNjZXB0XT1cIm1vZGVsLmFjY2VwdFwiXG4gICAgICAgICAgICAgICBbYXR0ci5tYXhdPVwibW9kZWwubWF4XCJcbiAgICAgICAgICAgICAgIFthdHRyLm1pbl09XCJtb2RlbC5taW5cIlxuICAgICAgICAgICAgICAgW2F0dHIubXVsdGlwbGVdPVwibW9kZWwubXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgW2F0dHIuc3RlcF09XCJtb2RlbC5zdGVwXCJcbiAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwibW9kZWwuYXV0b0NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwibW9kZWwuYXV0b0ZvY3VzXCJcbiAgICAgICAgICAgICAgIFtkeW5hbWljTGlzdF09XCJtb2RlbC5saXN0SWRcIlxuICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJtb2RlbC5pZFwiXG4gICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtb2RlbC5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtb2RlbC5taW5MZW5ndGhcIlxuICAgICAgICAgICAgICAgW25hbWVdPVwibW9kZWwubmFtZVwiXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRDbGFzcygnZWxlbWVudCcsICdjb250cm9sJylcIlxuICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwibW9kZWwucGF0dGVyblwiXG4gICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibW9kZWwucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIm1vZGVsLnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtb2RlbC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICBbc3BlbGxjaGVja109XCJtb2RlbC5zcGVsbENoZWNrXCJcbiAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJtb2RlbC50YWJJbmRleFwiXG4gICAgICAgICAgICAgICBbbWFza109XCJtb2RlbC5tYXNrXCJcbiAgICAgICAgICAgICAgIFtzcGVjaWFsQ2hhcmFjdGVyc109XCJtb2RlbC5tYXNrQ29uZmlnPy5zcGVjaWFsQ2hhcmFjdGVyc1wiXG4gICAgICAgICAgICAgICBbcGF0dGVybnNdPVwibW9kZWwubWFza0NvbmZpZz8ucGF0dGVybnNcIlxuICAgICAgICAgICAgICAgW3ByZWZpeF09XCJtb2RlbC5tYXNrQ29uZmlnPy5wcmVmaXhcIlxuICAgICAgICAgICAgICAgW3N1ZmZpeF09XCJtb2RlbC5tYXNrQ29uZmlnPy5zdWZmaXhcIlxuICAgICAgICAgICAgICAgW3Rob3VzYW5kU2VwYXJhdG9yXT1cIm1vZGVsLm1hc2tDb25maWc/LnRob3VzYW5kU2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgIFtkZWNpbWFsTWFya2VyXT1cIm1vZGVsLm1hc2tDb25maWc/LmRlY2ltYWxNYXJrZXJcIlxuICAgICAgICAgICAgICAgW2Ryb3BTcGVjaWFsQ2hhcmFjdGVyc109XCJtb2RlbC5tYXNrQ29uZmlnPy5kcm9wU3BlY2lhbENoYXJhY3RlcnNcIlxuICAgICAgICAgICAgICAgW2hpZGRlbklucHV0XT1cIm1vZGVsLm1hc2tDb25maWc/LmhpZGRlbklucHV0XCJcbiAgICAgICAgICAgICAgIFtzaG93TWFza1R5cGVkXT1cIm1vZGVsLm1hc2tDb25maWc/LnNob3dNYXNrVHlwZWRcIlxuICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyQ2hhcmFjdGVyXT1cIm1vZGVsLm1hc2tDb25maWc/LnBsYWNlSG9sZGVyQ2hhcmFjdGVyXCJcbiAgICAgICAgICAgICAgIFtzaG93bk1hc2tFeHByZXNzaW9uXT1cIm1vZGVsLm1hc2tDb25maWc/LnNob3duTWFza0V4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgW3Nob3dUZW1wbGF0ZV09XCJtb2RlbC5tYXNrQ29uZmlnPy5zaG93VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgW2NsZWFySWZOb3RNYXRjaF09XCJtb2RlbC5tYXNrQ29uZmlnLmNsZWFySWZOb3RNYXRjaFwiXG4gICAgICAgICAgICAgICBbdmFsaWRhdGlvbl09XCJtb2RlbC5tYXNrQ29uZmlnLnZhbGlkYXRpb25cIlxuICAgICAgICAgICAgICAgW3NlcGFyYXRvckxpbWl0XT1cIm1vZGVsLm1hc2tDb25maWcuc2VwYXJhdG9yTGltaXRcIlxuICAgICAgICAgICAgICAgW2FsbG93TmVnYXRpdmVOdW1iZXJzXT1cIm1vZGVsLm1hc2tDb25maWcuYWxsb3dOZWdhdGl2ZU51bWJlcnNcIlxuICAgICAgICAgICAgICAgW2xlYWRaZXJvRGF0ZVRpbWVdPVwibW9kZWwubWFza0NvbmZpZy5sZWFkWmVyb0RhdGVUaW1lXCJcbiAgICAgICAgICAgICAgIFt0eXBlXT1cIm1vZGVsLmlucHV0VHlwZVwiXG4gICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPGRpdiAqbmdJZj1cIm1vZGVsLnN1ZmZpeFwiIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIiBbaW5uZXJIVE1MXT1cIm1vZGVsLnN1ZmZpeFwiPjwvZGl2PlxuXG4gICAgPGRhdGFsaXN0ICpuZ0lmPVwibW9kZWwuaGFzTGlzdFwiIFtpZF09XCJtb2RlbC5saXN0SWRcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG1vZGVsLmxpc3QkIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgPC9kYXRhbGlzdD5cblxuPC9kaXY+XG4iXX0=