UNPKG

ng-zorro-antd

Version:

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

336 lines 33.5 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 { NgTemplateOutlet } from '@angular/common'; 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 { InputBoolean, isNonEmptyString, isTemplateRef } from 'ng-zorro-antd/core/util'; import { NzPopoverDirective } from 'ng-zorro-antd/popover'; import { NzColorBlockComponent } from './color-block.component'; import { NzColorFormatComponent } from './color-format.component'; import { NgAntdColorPickerModule } from './src/ng-antd-color-picker.module'; import { defaultColor, generateColor } from './src/util/util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "./src/ng-antd-color-picker.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.nzDisabledAlpha = 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(); } get isNzTitleNonEmptyString() { return isNonEmptyString(this.nzTitle); } get isNzTitleTemplateRef() { return isTemplateRef(this.nzTitle); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzColorPickerComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.4", type: NzColorPickerComponent, isStandalone: true, 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", nzDisabledAlpha: "nzDisabledAlpha" }, 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)" > @if (!nzFlipFlop) { <nz-color-block [nzColor]="blockColor" [nzSize]="nzSize" /> } @else { <ng-template [ngTemplateOutlet]="nzFlipFlop" /> } @if (nzShowText && !!showText && !nzFlipFlop) { <div class="ant-color-picker-trigger-text"> {{ showText }} </div> } </div> <ng-template #colorPicker> <ng-antd-color-picker [value]="nzValue" [defaultValue]="nzDefaultValue" [disabled]="nzDisabled" [panelRenderHeader]="nzPanelRenderHeader" [panelRenderFooter]="nzPanelRenderFooter" [disabledAlpha]="nzDisabledAlpha" (nzOnChange)="colorChange($event)" /> </ng-template> <ng-template #nzPanelRenderHeader> @if (nzTitle || nzAllowClear) { <div class="ant-color-picker-title"> <div class="ant-color-picker-title-content"> @if (isNzTitleTemplateRef) { <ng-container *ngTemplateOutlet="$any(nzTitle)" /> } @if (isNzTitleNonEmptyString) { <span [innerHTML]="nzTitle"></span> } </div> @if (nzAllowClear) { <div class="ant-color-picker-clear" (click)="clearColorHandle()"></div> } </div> } </ng-template> <ng-template #nzPanelRenderFooter> <nz-color-format [colorValue]="blockColor" [clearColor]="clearColor" [format]="nzFormat" [nzDisabledAlpha]="nzDisabledAlpha" (formatChange)="formatChange($event)" (nzOnFormatChange)="nzOnFormatChange.emit($event)" /> </ng-template> `, isInline: true, dependencies: [{ kind: "ngmodule", type: NgAntdColorPickerModule }, { kind: "component", type: i2.NgAntdColorPickerComponent, selector: "ng-antd-color-picker", inputs: ["value", "defaultValue", "panelRenderHeader", "panelRenderFooter", "disabledAlpha", "disabled"], outputs: ["nzOnChange", "nzOnChangeComplete"] }, { kind: "directive", type: 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: NzColorBlockComponent, selector: "nz-color-block", inputs: ["nzColor", "nzSize"], outputs: ["nzOnClick"], exportAs: ["NzColorBlock"] }, { kind: "component", type: NzColorFormatComponent, selector: "nz-color-format", inputs: ["format", "colorValue", "clearColor", "nzDisabledAlpha"], outputs: ["formatChange", "nzOnFormatChange"], exportAs: ["NzColorFormat"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], 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); __decorate([ InputBoolean() ], NzColorPickerComponent.prototype, "nzDisabledAlpha", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: NzColorPickerComponent, decorators: [{ type: Component, args: [{ selector: 'nz-color-picker', exportAs: 'NzColorPicker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ NgAntdColorPickerModule, NzPopoverDirective, NzColorBlockComponent, NzColorFormatComponent, NgTemplateOutlet ], 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)" > @if (!nzFlipFlop) { <nz-color-block [nzColor]="blockColor" [nzSize]="nzSize" /> } @else { <ng-template [ngTemplateOutlet]="nzFlipFlop" /> } @if (nzShowText && !!showText && !nzFlipFlop) { <div class="ant-color-picker-trigger-text"> {{ showText }} </div> } </div> <ng-template #colorPicker> <ng-antd-color-picker [value]="nzValue" [defaultValue]="nzDefaultValue" [disabled]="nzDisabled" [panelRenderHeader]="nzPanelRenderHeader" [panelRenderFooter]="nzPanelRenderFooter" [disabledAlpha]="nzDisabledAlpha" (nzOnChange)="colorChange($event)" /> </ng-template> <ng-template #nzPanelRenderHeader> @if (nzTitle || nzAllowClear) { <div class="ant-color-picker-title"> <div class="ant-color-picker-title-content"> @if (isNzTitleTemplateRef) { <ng-container *ngTemplateOutlet="$any(nzTitle)" /> } @if (isNzTitleNonEmptyString) { <span [innerHTML]="nzTitle"></span> } </div> @if (nzAllowClear) { <div class="ant-color-picker-clear" (click)="clearColorHandle()"></div> } </div> } </ng-template> <ng-template #nzPanelRenderFooter> <nz-color-format [colorValue]="blockColor" [clearColor]="clearColor" [format]="nzFormat" [nzDisabledAlpha]="nzDisabledAlpha" (formatChange)="formatChange($event)" (nzOnFormatChange)="nzOnFormatChange.emit($event)" /> </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 }], nzDisabledAlpha: [{ type: Input }], nzOnChange: [{ type: Output }], nzOnFormatChange: [{ type: Output }], nzOnClear: [{ type: Output }], nzOnOpenChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFDLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBd0Y5RCxNQUFNLE9BQU8sc0JBQXNCO0lBZ0NqQyxZQUNVLFdBQXdCLEVBQ3hCLEdBQXNCO1FBRHRCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0J2QixhQUFRLEdBQW1DLElBQUksQ0FBQztRQUNoRCxZQUFPLEdBQXFCLEVBQUUs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QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7Z0hBUVUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDbUIsVUFBVTtzQkFBbEMsS0FBSztnQkFDbUIsTUFBTTtzQkFBOUIsS0FBSztnQkFDbUIsWUFBWTtzQkFBcEMsS0FBSztnQkFDbUIsVUFBVTtzQkFBbEMsS0FBSztnQkFDbUIsZUFBZTtzQkFBdkMsS0FBSztnQkFDYSxVQUFVO3NCQUE1QixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxTQUFTO3NCQUEzQixNQUFNO2dCQUNZLGNBQWM7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOelNhZmVBbnksIE56U2l6ZUxEU1R5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuLCBpc05vbkVtcHR5U3RyaW5nLCBpc1RlbXBsYXRlUmVmIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpQb3BvdmVyRGlyZWN0aXZlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9wb3BvdmVyJztcblxuaW1wb3J0IHsgTnpDb2xvckJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jb2xvci1ibG9jay5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpDb2xvckZvcm1hdENvbXBvbmVudCB9IGZyb20gJy4vY29sb3ItZm9ybWF0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0FudGRDb2xvclBpY2tlck1vZHVsZSB9IGZyb20gJy4vc3JjL25nLWFudGQtY29sb3ItcGlja2VyLm1vZHVsZSc7XG5pbXBvcnQgeyBkZWZhdWx0Q29sb3IsIGdlbmVyYXRlQ29sb3IgfSBmcm9tICcuL3NyYy91dGlsL3V0aWwnO1xuaW1wb3J0IHsgTnpDb2xvciwgTnpDb2xvclBpY2tlckZvcm1hdFR5cGUsIE56Q29sb3JQaWNrZXJUcmlnZ2VyVHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWNvbG9yLXBpY2tlcicsXG4gIGV4cG9ydEFzOiAnTnpDb2xvclBpY2tlcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdBbnRkQ29sb3JQaWNrZXJNb2R1bGUsXG4gICAgTnpQb3BvdmVyRGlyZWN0aXZlLFxuICAgIE56Q29sb3JCbG9ja0NvbXBvbmVudCxcbiAgICBOekNvbG9yRm9ybWF0Q29tcG9uZW50LFxuICAgIE5nVGVtcGxhdGVPdXRsZXRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBbY2xhc3MuYW50LWNvbG9yLXBpY2tlci10cmlnZ2VyXT1cIiFuekZsaXBGbG9wXCJcbiAgICAgIFtjbGFzcy5hbnQtY29sb3ItcGlja2VyLXNtXT1cIm56U2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbY2xhc3MuYW50LWNvbG9yLXBpY2tlci1sZ109XCJuelNpemUgPT09ICdsYXJnZSdcIlxuICAgICAgbnotcG9wb3ZlclxuICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwiY29sb3JQaWNrZXJcIlxuICAgICAgW256UG9wb3ZlclRyaWdnZXJdPVwiIW56RGlzYWJsZWQgPyBuelRyaWdnZXIgOiBudWxsXCJcbiAgICAgIFtuelBvcG92ZXJWaXNpYmxlXT1cIm56T3BlblwiXG4gICAgICAobnpQb3BvdmVyVmlzaWJsZUNoYW5nZSk9XCJuek9uT3BlbkNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgID5cbiAgICAgIEBpZiAoIW56RmxpcEZsb3ApIHtcbiAgICAgICAgPG56LWNvbG9yLWJsb2NrIFtuekNvbG9yXT1cImJsb2NrQ29sb3JcIiBbbnpTaXplXT1cIm56U2l6ZVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm56RmxpcEZsb3BcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChuelNob3dUZXh0ICYmICEhc2hvd1RleHQgJiYgIW56RmxpcEZsb3ApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItdHJpZ2dlci10ZXh0XCI+XG4gICAgICAgICAge3sgc2hvd1RleHQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNjb2xvclBpY2tlcj5cbiAgICAgIDxuZy1hbnRkLWNvbG9yLXBpY2tlclxuICAgICAgICBbdmFsdWVdPVwibnpWYWx1ZVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwibnpEZWZhdWx0VmFsdWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICAgIFtwYW5lbFJlbmRlckhlYWRlcl09XCJuelBhbmVsUmVuZGVySGVhZGVyXCJcbiAgICAgICAgW3BhbmVsUmVuZGVyRm9vdGVyXT1cIm56UGFuZWxSZW5kZXJGb290ZXJcIlxuICAgICAgICBbZGlzYWJsZWRBbHBoYV09XCJuekRpc2FibGVkQWxwaGFcIlxuICAgICAgICAobnpPbkNoYW5nZSk9XCJjb2xvckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI256UGFuZWxSZW5kZXJIZWFkZXI+XG4gICAgICBAaWYgKG56VGl0bGUgfHwgbnpBbGxvd0NsZWFyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXRpdGxlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAgQGlmIChpc056VGl0bGVUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShuelRpdGxlKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGlzTnpUaXRsZU5vbkVtcHR5U3RyaW5nKSB7XG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibnpUaXRsZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKG56QWxsb3dDbGVhcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItY2xlYXJcIiAoY2xpY2spPVwiY2xlYXJDb2xvckhhbmRsZSgpXCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbnpQYW5lbFJlbmRlckZvb3Rlcj5cbiAgICAgIDxuei1jb2xvci1mb3JtYXRcbiAgICAgICAgW2NvbG9yVmFsdWVdPVwiYmxvY2tDb2xvclwiXG4gICAgICAgIFtjbGVhckNvbG9yXT1cImNsZWFyQ29sb3JcIlxuICAgICAgICBbZm9ybWF0XT1cIm56Rm9ybWF0XCJcbiAgICAgICAgW256RGlzYWJsZWRBbHBoYV09XCJuekRpc2FibGVkQWxwaGFcIlxuICAgICAgICAoZm9ybWF0Q2hhbmdlKT1cImZvcm1hdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG56T25Gb3JtYXRDaGFuZ2UpPVwibnpPbkZvcm1hdENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtY29sb3ItcGlja2VyLWlubGluZScsXG4gICAgJ1tjbGFzcy5hbnQtY29sb3ItcGlja2VyLWRpc2FibGVkXSc6IGBuekRpc2FibGVkYFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q29sb3JQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTnpDb2xvclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2hvd1RleHQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256T3BlbjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpBbGxvd0NsZWFyOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRpc2FibGVkQWxwaGE6IEJvb2xlYW5JbnB1dDtcblxuICBASW5wdXQoKSBuekZvcm1hdDogTnpDb2xvclBpY2tlckZvcm1hdFR5cGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpWYWx1ZTogc3RyaW5nIHwgTnpDb2xvciA9ICcnO1xuICBASW5wdXQoKSBuelNpemU6IE56U2l6ZUxEU1R5cGUgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIG56RGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBOekNvbG9yID0gJyc7XG4gIEBJbnB1dCgpIG56VHJpZ2dlcjogTnpDb2xvclBpY2tlclRyaWdnZXJUeXBlID0gJ2NsaWNrJztcbiAgQElucHV0KCkgbnpUaXRsZTogVGVtcGxhdGVSZWY8dm9pZD4gfCBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpGbGlwRmxvcDogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd1RleHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpBbGxvd0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRpc2FibGVkQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sb3I6IE56Q29sb3I7IGZvcm1hdDogc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRm9ybWF0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOekNvbG9yUGlja2VyRm9ybWF0VHlwZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25DbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25PcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc1RlbXBsYXRlUmVmID0gaXNUZW1wbGF0ZVJlZjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTm9uRW1wdHlTdHJpbmcgPSBpc05vbkVtcHR5U3RyaW5nO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBpc056RGlzYWJsZUZpcnN0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZTtcbiAgYmxvY2tDb2xvcjogc3RyaW5nID0gJyc7XG4gIGNsZWFyQ29sb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1RleHQ6IHN0cmluZyA9IGRlZmF1bHRDb2xvci50b0hleFN0cmluZygpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycpO1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubnpWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZ2V0QmxvY2tDb2xvcigpO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCgpOiB2b2lkIHt9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uekRpc2FibGVkID0gKHRoaXMuaXNOekRpc2FibGVGaXJzdENoYW5nZSAmJiB0aGlzLm56RGlzYWJsZWQpIHx8IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5pc056RGlzYWJsZUZpcnN0Q2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldEJsb2NrQ29sb3IoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIGlmICghIXZhbHVlKSB7XG4gICAgICAgIGxldCBjb2xvciA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5uekZvcm1hdCA9PT0gJ2hleCcpIHtcbiAgICAgICAgICBjb2xvciA9XG4gICAgICAgICAgICBnZW5lcmF0ZUNvbG9yKHZhbHVlKS5nZXRBbHBoYSgpIDwgMVxuICAgICAgICAgICAgICA/IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvSGV4OFN0cmluZygpXG4gICAgICAgICAgICAgIDogZ2VuZXJhdGVDb2xvcih2YWx1ZSkudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm56Rm9ybWF0ID09PSAnaHNiJykge1xuICAgICAgICAgIGNvbG9yID0gZ2VuZXJhdGVDb2xvcih2YWx1ZSkudG9Ic2JTdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm56Rm9ybWF0ID09PSAncmdiJykge1xuICAgICAgICAgIGNvbG9yID0gZ2VuZXJhdGVDb2xvcih2YWx1ZSkudG9SZ2JTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dUZXh0ID0gY29sb3I7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoY29sb3IpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56VmFsdWUsIG56RGVmYXVsdFZhbHVlIH0gPSBjaGFuZ2VzO1xuICAgIGlmIChuelZhbHVlIHx8IG56RGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLmdldEJsb2NrQ29sb3IoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckNvbG9ySGFuZGxlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJDb2xvciA9IHRydWU7XG4gICAgdGhpcy5uek9uQ2xlYXIuZW1pdCh0cnVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldEJsb2NrQ29sb3IoKTogdm9pZCB7XG4gICAgaWYgKCEhdGhpcy5uelZhbHVlKSB7XG4gICAgICB0aGlzLmJsb2NrQ29sb3IgPSBnZW5lcmF0ZUNvbG9yKHRoaXMubnpWYWx1ZSkudG9SZ2JTdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKCEhdGhpcy5uekRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5ibG9ja0NvbG9yID0gZ2VuZXJhdGVDb2xvcih0aGlzLm56RGVmYXVsdFZhbHVlKS50b1JnYlN0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJsb2NrQ29sb3IgPSBkZWZhdWx0Q29sb3IudG9IZXhTdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBjb2xvckNoYW5nZSh2YWx1ZTogeyBjb2xvcjogTnpDb2xvciB9KTogdm9pZCB7XG4gICAgdGhpcy5ibG9ja0NvbG9yID0gdmFsdWUuY29sb3IuZ2V0QWxwaGEoKSA8IDEgPyB2YWx1ZS5jb2xvci50b0hleDhTdHJpbmcoKSA6IHZhbHVlLmNvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgdGhpcy5jbGVhckNvbG9yID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBmb3JtYXRDaGFuZ2UodmFsdWU6IHsgY29sb3I6IHN0cmluZzsgZm9ybWF0OiBOekNvbG9yUGlja2VyRm9ybWF0VHlwZSB9KTogdm9pZCB7XG4gICAgdGhpcy5uelZhbHVlID0gdmFsdWUuY29sb3I7XG4gICAgdGhpcy5jbGVhckNvbG9yID0gZmFsc2U7XG4gICAgdGhpcy5nZXRCbG9ja0NvbG9yKCk7XG4gICAgdGhpcy5uek9uQ2hhbmdlLmVtaXQoeyBjb2xvcjogZ2VuZXJhdGVDb2xvcih2YWx1ZS5jb2xvciksIGZvcm1hdDogdmFsdWUuZm9ybWF0IH0pO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZS5jb2xvcik7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXQgaXNOelRpdGxlTm9uRW1wdHlTdHJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTm9uRW1wdHlTdHJpbmcodGhpcy5uelRpdGxlKTtcbiAgfVxuXG4gIGdldCBpc056VGl0bGVUZW1wbGF0ZVJlZigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNUZW1wbGF0ZVJlZih0aGlzLm56VGl0bGUpO1xuICB9XG59XG4iXX0=