UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

305 lines 31.3 kB
import { __decorate } from "tslib"; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { defaultColor, generateColor } from 'ng-antd-color-picker'; import { InputBoolean, isNonEmptyString, isTemplateRef } from 'ng-zorro-antd/core/util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "ng-antd-color-picker"; import * as i4 from "ng-zorro-antd/popover"; import * as i5 from "./color-block.component"; import * as i6 from "./color-format.component"; export class NzColorPickerComponent { constructor(formBuilder, cdr) { this.formBuilder = formBuilder; this.cdr = cdr; this.nzFormat = null; this.nzValue = ''; this.nzSize = 'default'; this.nzDefaultValue = ''; this.nzTrigger = 'click'; this.nzTitle = ''; this.nzFlipFlop = null; this.nzShowText = false; this.nzOpen = false; this.nzAllowClear = false; this.nzDisabled = false; this.nzOnChange = new EventEmitter(); this.nzOnFormatChange = new EventEmitter(); this.nzOnClear = new EventEmitter(); this.nzOnOpenChange = new EventEmitter(); this.isTemplateRef = isTemplateRef; this.isNonEmptyString = isNonEmptyString; this.destroy$ = new Subject(); this.isNzDisableFirstChange = true; this.blockColor = ''; this.clearColor = false; this.showText = defaultColor.toHexString(); this.formControl = this.formBuilder.control(''); this.onChange = () => { }; } writeValue(value) { this.nzValue = value; this.getBlockColor(); this.formControl.patchValue(value); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched() { } setDisabledState(isDisabled) { this.nzDisabled = (this.isNzDisableFirstChange && this.nzDisabled) || isDisabled; this.isNzDisableFirstChange = false; this.cdr.markForCheck(); } ngOnInit() { this.getBlockColor(); this.formControl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => { if (!!value) { let color = value; if (this.nzFormat === 'hex') { color = generateColor(value).getAlpha() < 1 ? generateColor(value).toHex8String() : generateColor(value).toHexString(); } else if (this.nzFormat === 'hsb') { color = generateColor(value).toHsbString(); } else if (this.nzFormat === 'rgb') { color = generateColor(value).toRgbString(); } this.showText = color; this.onChange(color); this.cdr.markForCheck(); } }); } ngOnChanges(changes) { const { nzValue, nzDefaultValue } = changes; if (nzValue || nzDefaultValue) { this.getBlockColor(); } } clearColorHandle() { this.clearColor = true; this.nzOnClear.emit(true); this.cdr.markForCheck(); } getBlockColor() { if (!!this.nzValue) { this.blockColor = generateColor(this.nzValue).toRgbString(); } else if (!!this.nzDefaultValue) { this.blockColor = generateColor(this.nzDefaultValue).toRgbString(); } else { this.blockColor = defaultColor.toHexString(); } } colorChange(value) { this.blockColor = value.color.getAlpha() < 1 ? value.color.toHex8String() : value.color.toHexString(); this.clearColor = false; this.cdr.markForCheck(); } formatChange(value) { this.nzValue = value.color; this.clearColor = false; this.getBlockColor(); this.nzOnChange.emit({ color: generateColor(value.color), format: value.format }); this.formControl.patchValue(value.color); this.cdr.markForCheck(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzColorPickerComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: NzColorPickerComponent, selector: "nz-color-picker", inputs: { nzFormat: "nzFormat", nzValue: "nzValue", nzSize: "nzSize", nzDefaultValue: "nzDefaultValue", nzTrigger: "nzTrigger", nzTitle: "nzTitle", nzFlipFlop: "nzFlipFlop", nzShowText: "nzShowText", nzOpen: "nzOpen", nzAllowClear: "nzAllowClear", nzDisabled: "nzDisabled" }, outputs: { nzOnChange: "nzOnChange", nzOnFormatChange: "nzOnFormatChange", nzOnClear: "nzOnClear", nzOnOpenChange: "nzOnOpenChange" }, host: { properties: { "class.ant-color-picker-disabled": "nzDisabled" }, classAttribute: "ant-color-picker-inline" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzColorPickerComponent), multi: true } ], exportAs: ["NzColorPicker"], usesOnChanges: true, ngImport: i0, template: ` <div [class.ant-color-picker-trigger]="!nzFlipFlop" [class.ant-color-picker-sm]="nzSize === 'small'" [class.ant-color-picker-lg]="nzSize === 'large'" nz-popover [nzPopoverContent]="colorPicker" [nzPopoverTrigger]="!nzDisabled ? nzTrigger : null" [nzPopoverVisible]="nzOpen" (nzPopoverVisibleChange)="nzOnOpenChange.emit($event)" > <ng-container *ngIf="!nzFlipFlop"> <nz-color-block [nzColor]="blockColor" [nzSize]="nzSize"></nz-color-block> </ng-container> <ng-container *ngIf="nzFlipFlop"> <ng-template [ngTemplateOutlet]="nzFlipFlop"></ng-template> </ng-container> <div class="ant-color-picker-trigger-text" *ngIf="nzShowText && !!showText && !nzFlipFlop"> {{ showText }} </div> </div> <ng-template #colorPicker> <ng-antd-color-picker [value]="nzValue" [defaultValue]="nzDefaultValue" [disabled]="nzDisabled" [panelRenderHeader]="nzPanelRenderHeader" [panelRenderFooter]="nzPanelRenderFooter" (nzOnChange)="colorChange($event)" ></ng-antd-color-picker> </ng-template> <ng-template #nzPanelRenderHeader> <div class="ant-color-picker-title" *ngIf="nzAllowClear || nzTitle"> <div class="ant-color-picker-title-content"> <ng-container [ngSwitch]="true"> <ng-container *ngSwitchCase="isTemplateRef(nzTitle)"> <ng-container *ngTemplateOutlet="$any(nzTitle)"></ng-container> </ng-container> <ng-container *ngSwitchCase="isNonEmptyString(nzTitle)"> <span [innerHTML]="nzTitle"></span> </ng-container> </ng-container> </div> <div class="ant-color-picker-clear" *ngIf="nzAllowClear" (click)="clearColorHandle()"></div> </div> </ng-template> <ng-template #nzPanelRenderFooter> <nz-color-format [colorValue]="blockColor" [clearColor]="clearColor" [format]="nzFormat" (formatChange)="formatChange($event)" (nzOnFormatChange)="nzOnFormatChange.emit($event)" ></nz-color-format> </ng-template> `, isInline: true, dependencies: [{ 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: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.NgAntdColorPickerComponent, selector: "ng-antd-color-picker", inputs: ["value", "defaultValue", "panelRenderHeader", "panelRenderFooter", "disabledAlpha", "disabled"], outputs: ["nzOnChange", "nzOnChangeComplete"] }, { kind: "directive", type: i4.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { kind: "component", type: i5.NzColorBlockComponent, selector: "nz-color-block", inputs: ["nzColor", "nzSize"], outputs: ["nzOnClick"], exportAs: ["NzColorBlock"] }, { kind: "component", type: i6.NzColorFormatComponent, selector: "nz-color-format", inputs: ["format", "colorValue", "clearColor"], outputs: ["formatChange", "nzOnFormatChange"], exportAs: ["NzColorFormat"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } __decorate([ InputBoolean() ], NzColorPickerComponent.prototype, "nzShowText", void 0); __decorate([ InputBoolean() ], NzColorPickerComponent.prototype, "nzOpen", void 0); __decorate([ InputBoolean() ], NzColorPickerComponent.prototype, "nzAllowClear", void 0); __decorate([ InputBoolean() ], NzColorPickerComponent.prototype, "nzDisabled", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzColorPickerComponent, decorators: [{ type: Component, args: [{ selector: 'nz-color-picker', exportAs: 'NzColorPicker', changeDetection: ChangeDetectionStrategy.OnPush, template: ` <div [class.ant-color-picker-trigger]="!nzFlipFlop" [class.ant-color-picker-sm]="nzSize === 'small'" [class.ant-color-picker-lg]="nzSize === 'large'" nz-popover [nzPopoverContent]="colorPicker" [nzPopoverTrigger]="!nzDisabled ? nzTrigger : null" [nzPopoverVisible]="nzOpen" (nzPopoverVisibleChange)="nzOnOpenChange.emit($event)" > <ng-container *ngIf="!nzFlipFlop"> <nz-color-block [nzColor]="blockColor" [nzSize]="nzSize"></nz-color-block> </ng-container> <ng-container *ngIf="nzFlipFlop"> <ng-template [ngTemplateOutlet]="nzFlipFlop"></ng-template> </ng-container> <div class="ant-color-picker-trigger-text" *ngIf="nzShowText && !!showText && !nzFlipFlop"> {{ showText }} </div> </div> <ng-template #colorPicker> <ng-antd-color-picker [value]="nzValue" [defaultValue]="nzDefaultValue" [disabled]="nzDisabled" [panelRenderHeader]="nzPanelRenderHeader" [panelRenderFooter]="nzPanelRenderFooter" (nzOnChange)="colorChange($event)" ></ng-antd-color-picker> </ng-template> <ng-template #nzPanelRenderHeader> <div class="ant-color-picker-title" *ngIf="nzAllowClear || nzTitle"> <div class="ant-color-picker-title-content"> <ng-container [ngSwitch]="true"> <ng-container *ngSwitchCase="isTemplateRef(nzTitle)"> <ng-container *ngTemplateOutlet="$any(nzTitle)"></ng-container> </ng-container> <ng-container *ngSwitchCase="isNonEmptyString(nzTitle)"> <span [innerHTML]="nzTitle"></span> </ng-container> </ng-container> </div> <div class="ant-color-picker-clear" *ngIf="nzAllowClear" (click)="clearColorHandle()"></div> </div> </ng-template> <ng-template #nzPanelRenderFooter> <nz-color-format [colorValue]="blockColor" [clearColor]="clearColor" [format]="nzFormat" (formatChange)="formatChange($event)" (nzOnFormatChange)="nzOnFormatChange.emit($event)" ></nz-color-format> </ng-template> `, host: { class: 'ant-color-picker-inline', '[class.ant-color-picker-disabled]': `nzDisabled` }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzColorPickerComponent), multi: true } ] }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { nzFormat: [{ type: Input }], nzValue: [{ type: Input }], nzSize: [{ type: Input }], nzDefaultValue: [{ type: Input }], nzTrigger: [{ type: Input }], nzTitle: [{ type: Input }], nzFlipFlop: [{ type: Input }], nzShowText: [{ type: Input }], nzOpen: [{ type: Input }], nzAllowClear: [{ type: Input }], nzDisabled: [{ type: Input }], nzOnChange: [{ type: Output }], nzOnFormatChange: [{ type: Output }], nzOnClear: [{ type: Output }], nzOnOpenChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFDLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUduRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7OztBQTRFeEYsTUFBTSxPQUFPLHNCQUFzQjtJQThCakMsWUFBb0IsV0FBd0IsRUFBVSxHQUFzQjtRQUF4RCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeEJuRSxhQUFRLEdBQW1DLElBQUksQ0FBQztRQUNoRCxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUMvQixXQUFNLEdBQWtCLFNBQVMsQ0FBQztRQUNsQyxtQkFBYyxHQUFxQixFQUFFLENBQUM7UUFDdEMsY0FBUyxHQUE2QixPQUFPLENBQUM7UUFDOUMsWUFBTyxHQUErQixFQUFFLENBQUM7UUFDekMsZUFBVSxHQUE2QixJQUFJLENBQUM7UUFDNUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RFQ7b0JBQ0QsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRSx5QkFBeUI7d0JBQ2hDLG1DQUFtQyxFQUFFLFlBQVk7cUJBQ2xEO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQzs0QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7Z0hBT1UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDbUIsVUFBVTtzQkFBbEMsS0FBSztnQkFDbUIsTUFBTTtzQkFBOUIsS0FBSztnQkFDbUIsWUFBWTtzQkFBcEMsS0FBSztnQkFDbUIsVUFBVTtzQkFBbEMsS0FBSztnQkFDYSxVQUFVO3NCQUE1QixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxTQUFTO3NCQUEzQixNQUFNO2dCQUNZLGNBQWM7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGRlZmF1bHRDb2xvciwgZ2VuZXJhdGVDb2xvciB9IGZyb20gJ25nLWFudGQtY29sb3ItcGlja2VyJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOelNhZmVBbnksIE56U2l6ZUxEU1R5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBpc05vbkVtcHR5U3RyaW5nLCBpc1RlbXBsYXRlUmVmIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQgeyBOekNvbG9yLCBOekNvbG9yUGlja2VyVHJpZ2dlclR5cGUsIE56Q29sb3JQaWNrZXJGb3JtYXRUeXBlIH0gZnJvbSAnLi90eXBpbmdzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotY29sb3ItcGlja2VyJyxcbiAgZXhwb3J0QXM6ICdOekNvbG9yUGlja2VyJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgW2NsYXNzLmFudC1jb2xvci1waWNrZXItdHJpZ2dlcl09XCIhbnpGbGlwRmxvcFwiXG4gICAgICBbY2xhc3MuYW50LWNvbG9yLXBpY2tlci1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgW2NsYXNzLmFudC1jb2xvci1waWNrZXItbGddPVwibnpTaXplID09PSAnbGFyZ2UnXCJcbiAgICAgIG56LXBvcG92ZXJcbiAgICAgIFtuelBvcG92ZXJDb250ZW50XT1cImNvbG9yUGlja2VyXCJcbiAgICAgIFtuelBvcG92ZXJUcmlnZ2VyXT1cIiFuekRpc2FibGVkID8gbnpUcmlnZ2VyIDogbnVsbFwiXG4gICAgICBbbnpQb3BvdmVyVmlzaWJsZV09XCJuek9wZW5cIlxuICAgICAgKG56UG9wb3ZlclZpc2libGVDaGFuZ2UpPVwibnpPbk9wZW5DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW56RmxpcEZsb3BcIj5cbiAgICAgICAgPG56LWNvbG9yLWJsb2NrIFtuekNvbG9yXT1cImJsb2NrQ29sb3JcIiBbbnpTaXplXT1cIm56U2l6ZVwiPjwvbnotY29sb3ItYmxvY2s+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJuekZsaXBGbG9wXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJuekZsaXBGbG9wXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItdHJpZ2dlci10ZXh0XCIgKm5nSWY9XCJuelNob3dUZXh0ICYmICEhc2hvd1RleHQgJiYgIW56RmxpcEZsb3BcIj5cbiAgICAgICAge3sgc2hvd1RleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjY29sb3JQaWNrZXI+XG4gICAgICA8bmctYW50ZC1jb2xvci1waWNrZXJcbiAgICAgICAgW3ZhbHVlXT1cIm56VmFsdWVcIlxuICAgICAgICBbZGVmYXVsdFZhbHVlXT1cIm56RGVmYXVsdFZhbHVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm56RGlzYWJsZWRcIlxuICAgICAgICBbcGFuZWxSZW5kZXJIZWFkZXJdPVwibnpQYW5lbFJlbmRlckhlYWRlclwiXG4gICAgICAgIFtwYW5lbFJlbmRlckZvb3Rlcl09XCJuelBhbmVsUmVuZGVyRm9vdGVyXCJcbiAgICAgICAgKG56T25DaGFuZ2UpPVwiY29sb3JDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9uZy1hbnRkLWNvbG9yLXBpY2tlcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbnpQYW5lbFJlbmRlckhlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXRpdGxlXCIgKm5nSWY9XCJuekFsbG93Q2xlYXIgfHwgbnpUaXRsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci10aXRsZS1jb250ZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihuelRpdGxlKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShuelRpdGxlKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc05vbkVtcHR5U3RyaW5nKG56VGl0bGUpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibnpUaXRsZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItY2xlYXJcIiAqbmdJZj1cIm56QWxsb3dDbGVhclwiIChjbGljayk9XCJjbGVhckNvbG9ySGFuZGxlKClcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNuelBhbmVsUmVuZGVyRm9vdGVyPlxuICAgICAgPG56LWNvbG9yLWZvcm1hdFxuICAgICAgICBbY29sb3JWYWx1ZV09XCJibG9ja0NvbG9yXCJcbiAgICAgICAgW2NsZWFyQ29sb3JdPVwiY2xlYXJDb2xvclwiXG4gICAgICAgIFtmb3JtYXRdPVwibnpGb3JtYXRcIlxuICAgICAgICAoZm9ybWF0Q2hhbmdlKT1cImZvcm1hdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG56T25Gb3JtYXRDaGFuZ2UpPVwibnpPbkZvcm1hdENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgPjwvbnotY29sb3ItZm9ybWF0PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2FudC1jb2xvci1waWNrZXItaW5saW5lJyxcbiAgICAnW2NsYXNzLmFudC1jb2xvci1waWNrZXItZGlzYWJsZWRdJzogYG56RGlzYWJsZWRgXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnpDb2xvclBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOekNvbG9yUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93VGV4dDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpPcGVuOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekFsbG93Q2xlYXI6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcblxuICBASW5wdXQoKSBuekZvcm1hdDogTnpDb2xvclBpY2tlckZvcm1hdFR5cGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpWYWx1ZTogc3RyaW5nIHwgTnpDb2xvciA9ICcnO1xuICBASW5wdXQoKSBuelNpemU6IE56U2l6ZUxEU1R5cGUgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIG56RGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBOekNvbG9yID0gJyc7XG4gIEBJbnB1dCgpIG56VHJpZ2dlcjogTnpDb2xvclBpY2tlclRyaWdnZXJUeXBlID0gJ2NsaWNrJztcbiAgQElucHV0KCkgbnpUaXRsZTogVGVtcGxhdGVSZWY8dm9pZD4gfCBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpGbGlwRmxvcDogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd1RleHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpBbGxvd0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbG9yOiBOekNvbG9yOyBmb3JtYXQ6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkZvcm1hdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpDb2xvclBpY2tlckZvcm1hdFR5cGU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNUZW1wbGF0ZVJlZiA9IGlzVGVtcGxhdGVSZWY7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc05vbkVtcHR5U3RyaW5nID0gaXNOb25FbXB0eVN0cmluZztcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgaXNOekRpc2FibGVGaXJzdENoYW5nZTogYm9vbGVhbiA9IHRydWU7XG4gIGJsb2NrQ29sb3I6IHN0cmluZyA9ICcnO1xuICBjbGVhckNvbG9yOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dUZXh0OiBzdHJpbmcgPSBkZWZhdWx0Q29sb3IudG9IZXhTdHJpbmcoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGZvcm1Db250cm9sID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm56VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmdldEJsb2NrQ29sb3IoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7fVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubnpEaXNhYmxlZCA9ICh0aGlzLmlzTnpEaXNhYmxlRmlyc3RDaGFuZ2UgJiYgdGhpcy5uekRpc2FibGVkKSB8fCBpc0Rpc2FibGVkO1xuICAgIHRoaXMuaXNOekRpc2FibGVGaXJzdENoYW5nZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRCbG9ja0NvbG9yKCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBpZiAoISF2YWx1ZSkge1xuICAgICAgICBsZXQgY29sb3IgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubnpGb3JtYXQgPT09ICdoZXgnKSB7XG4gICAgICAgICAgY29sb3IgPVxuICAgICAgICAgICAgZ2VuZXJhdGVDb2xvcih2YWx1ZSkuZ2V0QWxwaGEoKSA8IDFcbiAgICAgICAgICAgICAgPyBnZW5lcmF0ZUNvbG9yKHZhbHVlKS50b0hleDhTdHJpbmcoKVxuICAgICAgICAgICAgICA6IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uekZvcm1hdCA9PT0gJ2hzYicpIHtcbiAgICAgICAgICBjb2xvciA9IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvSHNiU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uekZvcm1hdCA9PT0gJ3JnYicpIHtcbiAgICAgICAgICBjb2xvciA9IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93VGV4dCA9IGNvbG9yO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKGNvbG9yKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuelZhbHVlLCBuekRlZmF1bHRWYWx1ZSB9ID0gY2hhbmdlcztcbiAgICBpZiAobnpWYWx1ZSB8fCBuekRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5nZXRCbG9ja0NvbG9yKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb2xvckhhbmRsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ29sb3IgPSB0cnVlO1xuICAgIHRoaXMubnpPbkNsZWFyLmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXRCbG9ja0NvbG9yKCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMubnpWYWx1ZSkge1xuICAgICAgdGhpcy5ibG9ja0NvbG9yID0gZ2VuZXJhdGVDb2xvcih0aGlzLm56VmFsdWUpLnRvUmdiU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICghIXRoaXMubnpEZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuYmxvY2tDb2xvciA9IGdlbmVyYXRlQ29sb3IodGhpcy5uekRlZmF1bHRWYWx1ZSkudG9SZ2JTdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ibG9ja0NvbG9yID0gZGVmYXVsdENvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgY29sb3JDaGFuZ2UodmFsdWU6IHsgY29sb3I6IE56Q29sb3IgfSk6IHZvaWQge1xuICAgIHRoaXMuYmxvY2tDb2xvciA9IHZhbHVlLmNvbG9yLmdldEFscGhhKCkgPCAxID8gdmFsdWUuY29sb3IudG9IZXg4U3RyaW5nKCkgOiB2YWx1ZS5jb2xvci50b0hleFN0cmluZygpO1xuICAgIHRoaXMuY2xlYXJDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9ybWF0Q2hhbmdlKHZhbHVlOiB7IGNvbG9yOiBzdHJpbmc7IGZvcm1hdDogTnpDb2xvclBpY2tlckZvcm1hdFR5cGUgfSk6IHZvaWQge1xuICAgIHRoaXMubnpWYWx1ZSA9IHZhbHVlLmNvbG9yO1xuICAgIHRoaXMuY2xlYXJDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuZ2V0QmxvY2tDb2xvcigpO1xuICAgIHRoaXMubnpPbkNoYW5nZS5lbWl0KHsgY29sb3I6IGdlbmVyYXRlQ29sb3IodmFsdWUuY29sb3IpLCBmb3JtYXQ6IHZhbHVlLmZvcm1hdCB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUuY29sb3IpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=