UNPKG

@xmagic/nz-formly

Version:

基于ng-zorro-antd UI 扩展的ngx-formly组件库

377 lines (363 loc) 31.9 kB
import { ChangeDetectionStrategy, Component, Optional } from '@angular/core'; import { FieldType } from '@ngx-formly/core'; import { resolveTplName, hasTplNameValue } from '@xmagic/nz-formly/common'; import * as i0 from "@angular/core"; import * as i1 from "@xmagic/nz-formly/common"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "ng-zorro-antd/input"; import * as i5 from "ng-zorro-antd/input-number"; import * as i6 from "ng-zorro-antd/core/outlet"; import * as i7 from "@ngx-formly/core"; import * as i8 from "ng-zorro-antd/auto-complete"; import * as i9 from "ng-zorro-antd/icon"; import * as i10 from "@xmagic/nzx-antd/pipe"; export class FormlyFieldInputComponent extends FieldType { fieldTemplates; defaultOptions = { props: { step: 1, enableHTML: false, clearable: true, nzDefaultActiveFirstOption: true, nzPrecisionMode: 'toFixed', filterFn: (item, query) => (query == null ? true : item.label.indexOf(query) > -1), compareWith: (o1, o2) => o1 === o2 } }; type = 'text'; isPwdVisible = false; mouseEnter = false; inputFocus = false; get clearVisible() { return this.inputFocus || this.mouseEnter; } constructor(fieldTemplates) { super(); this.fieldTemplates = fieldTemplates; } ngOnInit() { if (this.props.type) { this.type = this.props.type; } } get isDisabled() { return this.props.nzDisabled || this.props.disabled || this.formControl?.disabled; } get hasAddon() { return (hasTplNameValue(this.props, 'nzAddOnAfter') || hasTplNameValue(this.props, 'nzAddOnBefore') || hasTplNameValue(this.props, 'nzPrefix') || hasTplNameValue(this.props, 'nzSuffix') || this.props.nzCompact === true || this.props.nzSearch === true || (!this.props.type || this.props.type === 'text' || this.props.type === 'password')); } get nzAddOnAfter() { return resolveTplName(this.props, this.fieldTemplates, 'nzAddOnAfter'); } get nzAddOnBefore() { return resolveTplName(this.props, this.fieldTemplates, 'nzAddOnBefore'); } get nzPrefix() { return resolveTplName(this.props, this.fieldTemplates, 'nzPrefix'); } get nzSuffix() { return resolveTplName(this.props, this.fieldTemplates, 'nzSuffix'); } get content() { return resolveTplName(this.props, this.fieldTemplates, 'content'); } get labelTemplate() { return resolveTplName(this.props, this.fieldTemplates, 'labelTemplate'); } onMouseenter(evt) { this.mouseEnter = true; } onMouseleave(evt) { this.mouseEnter = false; } onFocus(evt) { this.inputFocus = true; } onBlur(evt) { this.inputFocus = false; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormlyFieldInputComponent, deps: [{ token: i1.FormlyBoxTemplates, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormlyFieldInputComponent, selector: "nz-formly-input", usesInheritance: true, ngImport: i0, template: ` <nz-input-group *ngIf="hasAddon; else inputTemplate" [nzSize]="props.nzSize" [nzSearch]="props.nzSearch" [nzAddOnAfter]="nzAddOnAfter" [nzAddOnBefore]="nzAddOnBefore" [nzPrefix]="nzPrefix" [nzAddOnAfterIcon]="props.nzAddOnAfterIcon" [nzAddOnBeforeIcon]="props.nzAddOnBeforeIcon" [nzPrefixIcon]="props.nzPrefixIcon" [nzSuffix]="suffixTemplate" [nzSuffixIcon]="props.nzSuffixIcon" [nzCompact]="props.nzCompact === true" (mouseenter)="onMouseenter($event)" (mouseleave)="onMouseleave($event)" > <ng-container *ngIf="props.showInput !== false"> <ng-container *ngTemplateOutlet="inputTemplate"></ng-container> </ng-container> <ng-container *nzStringTemplateOutlet="content; context: { $implicit: field, options: props }"> <div [innerHTML]="content"></div> </ng-container> </nz-input-group> <ng-template #suffixTemplate> <ng-container *ngIf="nzSuffix; else clearTemplate"> <ng-container *nzStringTemplateOutlet="nzSuffix; context: { $implicit: field, options: props }"> <div [innerHTML]="nzSuffix"></div> </ng-container> </ng-container> </ng-template> <ng-template #clearTemplate> <i *ngIf="type === 'password'" nz-icon style="cursor: pointer" [nzType]="isPwdVisible ? 'eye-invisible' : 'eye'" (click)="isPwdVisible = !isPwdVisible;props.type = isPwdVisible? 'text' : 'password'" ></i> <div style="width: 14px" *ngIf="type === 'text' && props.clearable && !isDisabled"> <i *ngIf="clearVisible && formControl.value" nz-icon style="cursor: pointer" [nzType]="props.nzClearIcon || 'close-circle'" (click)="formControl.setValue(null)" ></i> </div> </ng-template> <ng-template #inputTemplate> <ng-container *ngIf="props.type !== 'number'; else numberTmp"> <input *ngIf="!props.nzAutocomplete; else autoCompleteTemplate" nz-input autocomplete="off" [formControl]="$any(formControl)" [type]="props.type || 'text'" [formlyAttributes]="field" [nzBorderless]="props.nzBorderless" [nzStatus]="props.nzStatus" [nzSize]="props.nzSize" [readOnly]="props.nzReadOnly || props.readOnly" [disabled]="isDisabled" maxlength="" ngDefaultControl (focus)="onFocus($event)" (blur)="onBlur($event)" /> </ng-container> </ng-template> <ng-template #autoCompleteTemplate> <input nz-input autocomplete="off" [formControl]="$any(formControl)" [type]="props.type || 'text'" [formlyAttributes]="field" [nzSize]="props.nzSize" [nzAutocomplete]="auto" [nzBorderless]="props.nzBorderless" [nzStatus]="props.nzStatus" [readOnly]="props.nzReadOnly || props.readOnly" [disabled]="isDisabled" maxlength="" ngDefaultControl /> </ng-template> <ng-template #numberTmp> <nz-input-number #instance style="width: 100%" [formControl]="$any(formControl)" [formlyAttributes]="field" [nzMin]="props.min" [nzMax]="props.max" [nzDisabled]="isDisabled" [nzPrecision]="props.nzPrecision" [nzPrecisionMode]="props.nzPrecisionMode" [nzSize]="props.nzSize" [nzPlaceHolder]="props.nzPlaceHolder || props.placeholder" [nzStep]="props.step" [nzStatus]="props.nzStatus" [nzReadOnly]="props.nzReadOnly || props.readOnly" (nzFocus)="props.nzFocus?.($event, field, instance)" (nzBlur)="props.nzBlur?.($event, field, instance)" ngDefaultControl ></nz-input-number> </ng-template> <nz-autocomplete #auto [nzBackfill]="props.nzBackfill" [nzDefaultActiveFirstOption]="props.nzDefaultActiveFirstOption" [nzWidth]="props.nzWidth" [nzOverlayClassName]="props.nzOverlayClassName" [nzOverlayStyle]="props.nzOverlayStyle" [compareWith]="props.compareWith" > <ng-container *ngFor="let item of props.options | toAsync: $any(props) | async | filter: props.filterFn : formControl?.value" > <nz-auto-option *ngIf="item.hide !== false" [nzValue]="item.value" [nzDisabled]="item.disabled"> <ng-container *ngIf="labelTemplate; else strLabelTpl"> <ng-container *nzStringTemplateOutlet="labelTemplate; context: { $implicit: item, field: field }"> <span>{{ labelTemplate }}</span> </ng-container> </ng-container> <ng-template #strLabelTpl> <span>{{ item.label }}</span> </ng-template> </nz-auto-option> </ng-container> </nz-autocomplete> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i4.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i4.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "component", type: i5.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i6.NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }, { kind: "directive", type: i7.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "component", type: i8.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i8.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i8.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "directive", type: i9.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.ToAsyncPipe, name: "toAsync" }, { kind: "pipe", type: i10.FilterPipe, name: "filter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormlyFieldInputComponent, decorators: [{ type: Component, args: [{ selector: 'nz-formly-input', template: ` <nz-input-group *ngIf="hasAddon; else inputTemplate" [nzSize]="props.nzSize" [nzSearch]="props.nzSearch" [nzAddOnAfter]="nzAddOnAfter" [nzAddOnBefore]="nzAddOnBefore" [nzPrefix]="nzPrefix" [nzAddOnAfterIcon]="props.nzAddOnAfterIcon" [nzAddOnBeforeIcon]="props.nzAddOnBeforeIcon" [nzPrefixIcon]="props.nzPrefixIcon" [nzSuffix]="suffixTemplate" [nzSuffixIcon]="props.nzSuffixIcon" [nzCompact]="props.nzCompact === true" (mouseenter)="onMouseenter($event)" (mouseleave)="onMouseleave($event)" > <ng-container *ngIf="props.showInput !== false"> <ng-container *ngTemplateOutlet="inputTemplate"></ng-container> </ng-container> <ng-container *nzStringTemplateOutlet="content; context: { $implicit: field, options: props }"> <div [innerHTML]="content"></div> </ng-container> </nz-input-group> <ng-template #suffixTemplate> <ng-container *ngIf="nzSuffix; else clearTemplate"> <ng-container *nzStringTemplateOutlet="nzSuffix; context: { $implicit: field, options: props }"> <div [innerHTML]="nzSuffix"></div> </ng-container> </ng-container> </ng-template> <ng-template #clearTemplate> <i *ngIf="type === 'password'" nz-icon style="cursor: pointer" [nzType]="isPwdVisible ? 'eye-invisible' : 'eye'" (click)="isPwdVisible = !isPwdVisible;props.type = isPwdVisible? 'text' : 'password'" ></i> <div style="width: 14px" *ngIf="type === 'text' && props.clearable && !isDisabled"> <i *ngIf="clearVisible && formControl.value" nz-icon style="cursor: pointer" [nzType]="props.nzClearIcon || 'close-circle'" (click)="formControl.setValue(null)" ></i> </div> </ng-template> <ng-template #inputTemplate> <ng-container *ngIf="props.type !== 'number'; else numberTmp"> <input *ngIf="!props.nzAutocomplete; else autoCompleteTemplate" nz-input autocomplete="off" [formControl]="$any(formControl)" [type]="props.type || 'text'" [formlyAttributes]="field" [nzBorderless]="props.nzBorderless" [nzStatus]="props.nzStatus" [nzSize]="props.nzSize" [readOnly]="props.nzReadOnly || props.readOnly" [disabled]="isDisabled" maxlength="" ngDefaultControl (focus)="onFocus($event)" (blur)="onBlur($event)" /> </ng-container> </ng-template> <ng-template #autoCompleteTemplate> <input nz-input autocomplete="off" [formControl]="$any(formControl)" [type]="props.type || 'text'" [formlyAttributes]="field" [nzSize]="props.nzSize" [nzAutocomplete]="auto" [nzBorderless]="props.nzBorderless" [nzStatus]="props.nzStatus" [readOnly]="props.nzReadOnly || props.readOnly" [disabled]="isDisabled" maxlength="" ngDefaultControl /> </ng-template> <ng-template #numberTmp> <nz-input-number #instance style="width: 100%" [formControl]="$any(formControl)" [formlyAttributes]="field" [nzMin]="props.min" [nzMax]="props.max" [nzDisabled]="isDisabled" [nzPrecision]="props.nzPrecision" [nzPrecisionMode]="props.nzPrecisionMode" [nzSize]="props.nzSize" [nzPlaceHolder]="props.nzPlaceHolder || props.placeholder" [nzStep]="props.step" [nzStatus]="props.nzStatus" [nzReadOnly]="props.nzReadOnly || props.readOnly" (nzFocus)="props.nzFocus?.($event, field, instance)" (nzBlur)="props.nzBlur?.($event, field, instance)" ngDefaultControl ></nz-input-number> </ng-template> <nz-autocomplete #auto [nzBackfill]="props.nzBackfill" [nzDefaultActiveFirstOption]="props.nzDefaultActiveFirstOption" [nzWidth]="props.nzWidth" [nzOverlayClassName]="props.nzOverlayClassName" [nzOverlayStyle]="props.nzOverlayStyle" [compareWith]="props.compareWith" > <ng-container *ngFor="let item of props.options | toAsync: $any(props) | async | filter: props.filterFn : formControl?.value" > <nz-auto-option *ngIf="item.hide !== false" [nzValue]="item.value" [nzDisabled]="item.disabled"> <ng-container *ngIf="labelTemplate; else strLabelTpl"> <ng-container *nzStringTemplateOutlet="labelTemplate; context: { $implicit: item, field: field }"> <span>{{ labelTemplate }}</span> </ng-container> </ng-container> <ng-template #strLabelTpl> <span>{{ item.label }}</span> </ng-template> </nz-auto-option> </ng-container> </nz-autocomplete> `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: () => [{ type: i1.FormlyBoxTemplates, decorators: [{ type: Optional }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFzQixjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQW1KL0YsTUFBTSxPQUFPLHlCQUEwQixTQUFRLFNBQVM7SUFzQnZCO0lBckJ0QixjQUFjLEdBQUc7UUFDeEIsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLENBQUM7WUFDUCxVQUFVLEVBQUUsS0FBSztZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLDBCQUEwQixFQUFFLElBQUk7WUFDaEMsZUFBZSxFQUFFLFNBQVM7WUFDMUIsUUFBUSxFQUFFLENBQUMsSUFBZSxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLFdBQVcsRUFBRSxDQUFDLEVBQWEsRUFBRSxFQUFhLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO1NBQ3pEO0tBQ0YsQ0FBQztJQUVGLElBQUksR0FBRyxNQUFNLENBQUM7SUFDZCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUVuQixJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJ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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJJVDs7NEZBR1UseUJBQXlCO2tCQWhKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EySVQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkF1QmMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgRm9ybWx5Qm94VGVtcGxhdGVzLCByZXNvbHZlVHBsTmFtZSwgaGFzVHBsTmFtZVZhbHVlIH0gZnJvbSAnQHhtYWdpYy9uei1mb3JtbHkvY29tbW9uJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWZvcm1seS1pbnB1dCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG56LWlucHV0LWdyb3VwXG4gICAgICAqbmdJZj1cImhhc0FkZG9uOyBlbHNlIGlucHV0VGVtcGxhdGVcIlxuICAgICAgW256U2l6ZV09XCJwcm9wcy5uelNpemVcIlxuICAgICAgW256U2VhcmNoXT1cInByb3BzLm56U2VhcmNoXCJcbiAgICAgIFtuekFkZE9uQWZ0ZXJdPVwibnpBZGRPbkFmdGVyXCJcbiAgICAgIFtuekFkZE9uQmVmb3JlXT1cIm56QWRkT25CZWZvcmVcIlxuICAgICAgW256UHJlZml4XT1cIm56UHJlZml4XCJcbiAgICAgIFtuekFkZE9uQWZ0ZXJJY29uXT1cInByb3BzLm56QWRkT25BZnRlckljb25cIlxuICAgICAgW256QWRkT25CZWZvcmVJY29uXT1cInByb3BzLm56QWRkT25CZWZvcmVJY29uXCJcbiAgICAgIFtuelByZWZpeEljb25dPVwicHJvcHMubnpQcmVmaXhJY29uXCJcbiAgICAgIFtuelN1ZmZpeF09XCJzdWZmaXhUZW1wbGF0ZVwiXG4gICAgICBbbnpTdWZmaXhJY29uXT1cInByb3BzLm56U3VmZml4SWNvblwiXG4gICAgICBbbnpDb21wYWN0XT1cInByb3BzLm56Q29tcGFjdCA9PT0gdHJ1ZVwiXG4gICAgICAobW91c2VlbnRlcik9XCJvbk1vdXNlZW50ZXIoJGV2ZW50KVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJvbk1vdXNlbGVhdmUoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BzLnNob3dJbnB1dCAhPT0gZmFsc2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbnpTdHJpbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgb3B0aW9uczogcHJvcHMgfVwiPlxuICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiY29udGVudFwiPjwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uei1pbnB1dC1ncm91cD5cblxuICAgIDxuZy10ZW1wbGF0ZSAjc3VmZml4VGVtcGxhdGU+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnpTdWZmaXg7IGVsc2UgY2xlYXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwibnpTdWZmaXg7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgb3B0aW9uczogcHJvcHMgfVwiPlxuICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJuelN1ZmZpeFwiPjwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2NsZWFyVGVtcGxhdGU+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cInR5cGUgPT09ICdwYXNzd29yZCdcIlxuICAgICAgICBuei1pY29uXG4gICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgW256VHlwZV09XCJpc1B3ZFZpc2libGUgPyAnZXllLWludmlzaWJsZScgOiAnZXllJ1wiXG4gICAgICAgIChjbGljayk9XCJpc1B3ZFZpc2libGUgPSAhaXNQd2RWaXNpYmxlO3Byb3BzLnR5cGUgPSBpc1B3ZFZpc2libGU/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIlxuICAgICAgPjwvaT5cbiAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTRweFwiICpuZ0lmPVwidHlwZSA9PT0gJ3RleHQnICYmIHByb3BzLmNsZWFyYWJsZSAmJiAhaXNEaXNhYmxlZFwiPlxuICAgICAgICA8aVxuICAgICAgICAgICpuZ0lmPVwiY2xlYXJWaXNpYmxlICYmIGZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgICAgICBuei1pY29uXG4gICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgIFtuelR5cGVdPVwicHJvcHMubnpDbGVhckljb24gfHwgJ2Nsb3NlLWNpcmNsZSdcIlxuICAgICAgICAgIChjbGljayk9XCJmb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNpbnB1dFRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BzLnR5cGUgIT09ICdudW1iZXInOyBlbHNlIG51bWJlclRtcFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAqbmdJZj1cIiFwcm9wcy5uekF1dG9jb21wbGV0ZTsgZWxzZSBhdXRvQ29tcGxldGVUZW1wbGF0ZVwiXG4gICAgICAgICAgbnotaW5wdXRcbiAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCIkYW55KGZvcm1Db250cm9sKVwiXG4gICAgICAgICAgW3R5cGVdPVwicHJvcHMudHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgICBbbnpCb3JkZXJsZXNzXT1cInByb3BzLm56Qm9yZGVybGVzc1wiXG4gICAgICAgICAgW256U3RhdHVzXT1cInByb3BzLm56U3RhdHVzXCJcbiAgICAgICAgICBbbnpTaXplXT1cInByb3BzLm56U2l6ZVwiXG4gICAgICAgICAgW3JlYWRPbmx5XT1cInByb3BzLm56UmVhZE9ubHkgfHwgcHJvcHMucmVhZE9ubHlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgICAgICBtYXhsZW5ndGg9XCJcIlxuICAgICAgICAgIG5nRGVmYXVsdENvbnRyb2xcbiAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNhdXRvQ29tcGxldGVUZW1wbGF0ZT5cbiAgICAgIDxpbnB1dFxuICAgICAgICBuei1pbnB1dFxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiJGFueShmb3JtQ29udHJvbClcIlxuICAgICAgICBbdHlwZV09XCJwcm9wcy50eXBlIHx8ICd0ZXh0J1wiXG4gICAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgW256U2l6ZV09XCJwcm9wcy5uelNpemVcIlxuICAgICAgICBbbnpBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgIFtuekJvcmRlcmxlc3NdPVwicHJvcHMubnpCb3JkZXJsZXNzXCJcbiAgICAgICAgW256U3RhdHVzXT1cInByb3BzLm56U3RhdHVzXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInByb3BzLm56UmVhZE9ubHkgfHwgcHJvcHMucmVhZE9ubHlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICAgIG1heGxlbmd0aD1cIlwiXG4gICAgICAgIG5nRGVmYXVsdENvbnRyb2xcbiAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbnVtYmVyVG1wPlxuICAgICAgPG56LWlucHV0LW51bWJlclxuICAgICAgICAjaW5zdGFuY2VcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCIkYW55KGZvcm1Db250cm9sKVwiXG4gICAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cImZpZWxkXCJcbiAgICAgICAgW256TWluXT1cInByb3BzLm1pblwiXG4gICAgICAgIFtuek1heF09XCJwcm9wcy5tYXhcIlxuICAgICAgICBbbnpEaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgICAgW256UHJlY2lzaW9uXT1cInByb3BzLm56UHJlY2lzaW9uXCJcbiAgICAgICAgW256UHJlY2lzaW9uTW9kZV09XCJwcm9wcy5uelByZWNpc2lvbk1vZGVcIlxuICAgICAgICBbbnpTaXplXT1cInByb3BzLm56U2l6ZVwiXG4gICAgICAgIFtuelBsYWNlSG9sZGVyXT1cInByb3BzLm56UGxhY2VIb2xkZXIgfHwgcHJvcHMucGxhY2Vob2xkZXJcIlxuICAgICAgICBbbnpTdGVwXT1cInByb3BzLnN0ZXBcIlxuICAgICAgICBbbnpTdGF0dXNdPVwicHJvcHMubnpTdGF0dXNcIlxuICAgICAgICBbbnpSZWFkT25seV09XCJwcm9wcy5uelJlYWRPbmx5IHx8IHByb3BzLnJlYWRPbmx5XCJcbiAgICAgICAgKG56Rm9jdXMpPVwicHJvcHMubnpGb2N1cz8uKCRldmVudCwgZmllbGQsIGluc3RhbmNlKVwiXG4gICAgICAgIChuekJsdXIpPVwicHJvcHMubnpCbHVyPy4oJGV2ZW50LCBmaWVsZCwgaW5zdGFuY2UpXCJcbiAgICAgICAgbmdEZWZhdWx0Q29udHJvbFxuICAgICAgPjwvbnotaW5wdXQtbnVtYmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bnotYXV0b2NvbXBsZXRlXG4gICAgICAjYXV0b1xuICAgICAgW256QmFja2ZpbGxdPVwicHJvcHMubnpCYWNrZmlsbFwiXG4gICAgICBbbnpEZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25dPVwicHJvcHMubnpEZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cIlxuICAgICAgW256V2lkdGhdPVwicHJvcHMubnpXaWR0aFwiXG4gICAgICBbbnpPdmVybGF5Q2xhc3NOYW1lXT1cInByb3BzLm56T3ZlcmxheUNsYXNzTmFtZVwiXG4gICAgICBbbnpPdmVybGF5U3R5bGVdPVwicHJvcHMubnpPdmVybGF5U3R5bGVcIlxuICAgICAgW2NvbXBhcmVXaXRoXT1cInByb3BzLmNvbXBhcmVXaXRoXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHByb3BzLm9wdGlvbnMgfCB0b0FzeW5jOiAkYW55KHByb3BzKSB8IGFzeW5jIHwgZmlsdGVyOiBwcm9wcy5maWx0ZXJGbiA6IGZvcm1Db250cm9sPy52YWx1ZVwiXG4gICAgICA+XG4gICAgICAgIDxuei1hdXRvLW9wdGlvbiAqbmdJZj1cIml0ZW0uaGlkZSAhPT0gZmFsc2VcIiBbbnpWYWx1ZV09XCJpdGVtLnZhbHVlXCIgW256RGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFRlbXBsYXRlOyBlbHNlIHN0ckxhYmVsVHBsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwibGFiZWxUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsVGVtcGxhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RyTGFiZWxUcGw+XG4gICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbnotYXV0by1vcHRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L256LWF1dG9jb21wbGV0ZT5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRm9ybWx5RmllbGRJbnB1dENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG92ZXJyaWRlIGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBzdGVwOiAxLFxuICAgICAgZW5hYmxlSFRNTDogZmFsc2UsXG4gICAgICBjbGVhcmFibGU6IHRydWUsXG4gICAgICBuekRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbjogdHJ1ZSxcbiAgICAgIG56UHJlY2lzaW9uTW9kZTogJ3RvRml4ZWQnLFxuICAgICAgZmlsdGVyRm46IChpdGVtOiBOelNhZmVBbnksIHF1ZXJ5OiBzdHJpbmcpID0+IChxdWVyeSA9PSBudWxsID8gdHJ1ZSA6IGl0ZW0ubGFiZWwuaW5kZXhPZihxdWVyeSkgPiAtMSksXG4gICAgICBjb21wYXJlV2l0aDogKG8xOiBOelNhZmVBbnksIG8yOiBOelNhZmVBbnkpID0+IG8xID09PSBvMlxuICAgIH1cbiAgfTtcblxuICB0eXBlID0gJ3RleHQnO1xuICBpc1B3ZFZpc2libGUgPSBmYWxzZTtcbiAgbW91c2VFbnRlciA9IGZhbHNlO1xuICBpbnB1dEZvY3VzID0gZmFsc2U7XG5cbiAgZ2V0IGNsZWFyVmlzaWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXMgfHwgdGhpcy5tb3VzZUVudGVyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHVibGljIGZpZWxkVGVtcGxhdGVzOiBGb3JtbHlCb3hUZW1wbGF0ZXMpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICBpZiAodGhpcy5wcm9wcy50eXBlKSB7XG4gICAgIHRoaXMudHlwZSA9IHRoaXMucHJvcHMudHlwZTtcbiAgIH1cbiAgfVxuXG4gIGdldCBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm56RGlzYWJsZWQgfHwgdGhpcy5wcm9wcy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1Db250cm9sPy5kaXNhYmxlZFxuICB9XG5cbiAgZ2V0IGhhc0FkZG9uKCkge1xuICAgIHJldHVybiAoXG4gICAgICBoYXNUcGxOYW1lVmFsdWUodGhpcy5wcm9wcywgJ256QWRkT25BZnRlcicpIHx8XG4gICAgICBoYXNUcGxOYW1lVmFsdWUodGhpcy5wcm9wcywgJ256QWRkT25CZWZvcmUnKSB8fFxuICAgICAgaGFzVHBsTmFtZVZhbHVlKHRoaXMucHJvcHMsICduelByZWZpeCcpIHx8XG4gICAgICBoYXNUcGxOYW1lVmFsdWUodGhpcy5wcm9wcywgJ256U3VmZml4JykgfHxcbiAgICAgIHRoaXMucHJvcHMubnpDb21wYWN0ID09PSB0cnVlIHx8XG4gICAgICB0aGlzLnByb3BzLm56U2VhcmNoID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMucHJvcHMudHlwZSB8fCB0aGlzLnByb3BzLnR5cGUgPT09ICd0ZXh0JyB8fCB0aGlzLnByb3BzLnR5cGUgPT09ICdwYXNzd29yZCcpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBuekFkZE9uQWZ0ZXIoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVUcGxOYW1lKHRoaXMucHJvcHMsIHRoaXMuZmllbGRUZW1wbGF0ZXMsICduekFkZE9uQWZ0ZXInKTtcbiAgfVxuXG4gIGdldCBuekFkZE9uQmVmb3JlKCkge1xuICAgIHJldHVybiByZXNvbHZlVHBsTmFtZSh0aGlzLnByb3BzLCB0aGlzLmZpZWxkVGVtcGxhdGVzLCAnbnpBZGRPbkJlZm9yZScpO1xuICB9XG5cbiAgZ2V0IG56UHJlZml4KCkge1xuICAgIHJldHVybiByZXNvbHZlVHBsTmFtZSh0aGlzLnByb3BzLCB0aGlzLmZpZWxkVGVtcGxhdGVzLCAnbnpQcmVmaXgnKTtcbiAgfVxuXG4gIGdldCBuelN1ZmZpeCgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRwbE5hbWUodGhpcy5wcm9wcywgdGhpcy5maWVsZFRlbXBsYXRlcywgJ256U3VmZml4Jyk7XG4gIH1cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVUcGxOYW1lKHRoaXMucHJvcHMsIHRoaXMuZmllbGRUZW1wbGF0ZXMsICdjb250ZW50Jyk7XG4gIH1cblxuICBnZXQgbGFiZWxUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRwbE5hbWUodGhpcy5wcm9wcywgdGhpcy5maWVsZFRlbXBsYXRlcywgJ2xhYmVsVGVtcGxhdGUnKTtcbiAgfVxuXG4gIG9uTW91c2VlbnRlcihldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlRW50ZXIgPSB0cnVlO1xuICB9XG4gIG9uTW91c2VsZWF2ZShldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlRW50ZXIgPSBmYWxzZTtcbiAgfVxuXG4gIG9uRm9jdXMoZXZ0OiBGb2N1c0V2ZW50KSB7XG4gICB0aGlzLmlucHV0Rm9jdXMgPSB0cnVlO1xuICB9XG5cbiAgb25CbHVyKGV2dDogRm9jdXNFdmVudCkge1xuICAgdGhpcy5pbnB1dEZvY3VzID0gZmFsc2U7XG4gIH1cbn1cbiJdfQ==