UNPKG

ng-zorro-antd

Version:

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

321 lines (317 loc) 35.6 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, Input, Output } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { NzInputDirective, NzInputGroupComponent } from 'ng-zorro-antd/input'; import { NzInputNumberComponent } from 'ng-zorro-antd/input-number'; import { NzSelectModule } from 'ng-zorro-antd/select'; import { generateColor } from './src/util/util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ng-zorro-antd/select"; export class NzColorFormatComponent { validatorFn() { return (control) => { const REGEXP = /^[0-9a-fA-F]{6}$/; if (!control.value) { return { error: true }; } else if (!REGEXP.test(control.value)) { return { error: true }; } return null; }; } constructor(formBuilder) { this.formBuilder = formBuilder; this.format = null; this.colorValue = ''; this.clearColor = false; this.nzDisabledAlpha = false; this.formatChange = new EventEmitter(); this.nzOnFormatChange = new EventEmitter(); this.destroy$ = new Subject(); this.formatterPercent = (value) => `${value} %`; this.parserPercent = (value) => value.replace(' %', ''); this.validateForm = this.formBuilder.nonNullable.group({ isFormat: this.formBuilder.control('hex'), hex: this.formBuilder.control('1677FF', this.validatorFn()), hsbH: 215, hsbS: 91, hsbB: 100, rgbR: 22, rgbG: 119, rgbB: 255, roundA: 100 }); } ngOnInit() { this.validateForm.valueChanges .pipe(filter(() => this.validateForm.valid), debounceTime(200), takeUntil(this.destroy$)) .subscribe(value => { let color = ''; switch (value.isFormat) { case 'hsb': color = generateColor({ h: Number(value.hsbH), s: Number(value.hsbS) / 100, b: Number(value.hsbB) / 100, a: Number(value.roundA) / 100 }).toHsbString(); break; case 'rgb': color = generateColor({ r: Number(value.rgbR), g: Number(value.rgbG), b: Number(value.rgbB), a: Number(value.roundA) / 100 }).toRgbString(); break; default: const hex = generateColor(value.hex); const hexColor = generateColor({ r: hex.r, g: hex.g, b: hex.b, a: Number(value.roundA) / 100 }); color = hexColor.getAlpha() < 1 ? hexColor.toHex8String() : hexColor.toHexString(); break; } this.formatChange.emit({ color, format: value.isFormat || this.format || 'hex' }); }); this.validateForm .get('isFormat') ?.valueChanges.pipe(takeUntil(this.destroy$)) .subscribe(value => { this.nzOnFormatChange.emit(value); }); } ngOnChanges(changes) { const { colorValue, format, clearColor } = changes; if (colorValue) { const colorValue = { hex: generateColor(this.colorValue).toHex(), hsbH: Math.round(generateColor(this.colorValue).toHsb().h), hsbS: Math.round(generateColor(this.colorValue).toHsb().s * 100), hsbB: Math.round(generateColor(this.colorValue).toHsb().b * 100), rgbR: Math.round(generateColor(this.colorValue).r), rgbG: Math.round(generateColor(this.colorValue).g), rgbB: Math.round(generateColor(this.colorValue).b), roundA: Math.round(generateColor(this.colorValue).roundA * 100) }; this.validateForm.patchValue(colorValue); } if (format && this.format) { this.validateForm.get('isFormat')?.patchValue(this.format); } if (clearColor && this.clearColor) { this.validateForm.get('roundA')?.patchValue(0); } } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: NzColorFormatComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: NzColorFormatComponent, isStandalone: true, selector: "nz-color-format", inputs: { format: "format", colorValue: "colorValue", clearColor: "clearColor", nzDisabledAlpha: "nzDisabledAlpha" }, outputs: { formatChange: "formatChange", nzOnFormatChange: "nzOnFormatChange" }, exportAs: ["NzColorFormat"], usesOnChanges: true, ngImport: i0, template: ` <div [formGroup]="validateForm" class="ant-color-picker-input-container"> <div class="ant-color-picker-format-select"> <nz-select formControlName="isFormat" nzBorderless nzSize="small"> <nz-option nzValue="hex" nzLabel="HEX" /> <nz-option nzValue="hsb" nzLabel="HSB" /> <nz-option nzValue="rgb" nzLabel="RGB" /> </nz-select> </div> <div class="ant-color-picker-input"> @switch (validateForm.controls.isFormat.value) { @case ('hex') { <div class="ant-color-picker-hex-input"> <nz-input-group nzPrefix="#" nzSize="small"> <input nz-input nzSize="small" formControlName="hex" /> </nz-input-group> </div> } @case ('hsb') { <div class="ant-color-picker-hsb-input"> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbH" [nzMin]="0" [nzMax]="360" [nzStep]="1" [nzPrecision]="0" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbS" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbB" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> </div> } @default { <div class="ant-color-picker-rgb-input"> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbR" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbG" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbB" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> </div> } } </div> @if (!nzDisabledAlpha) { <div class="ant-color-picker-steppers ant-color-picker-alpha-input"> <nz-input-number formControlName="roundA" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> } </div> `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NzSelectModule }, { kind: "component", type: i2.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i2.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "directive", type: NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "component", type: 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } __decorate([ InputBoolean() ], NzColorFormatComponent.prototype, "nzDisabledAlpha", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: NzColorFormatComponent, decorators: [{ type: Component, args: [{ selector: 'nz-color-format', exportAs: 'NzColorFormat', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ReactiveFormsModule, NzSelectModule, NzInputDirective, NzInputGroupComponent, NzInputNumberComponent], template: ` <div [formGroup]="validateForm" class="ant-color-picker-input-container"> <div class="ant-color-picker-format-select"> <nz-select formControlName="isFormat" nzBorderless nzSize="small"> <nz-option nzValue="hex" nzLabel="HEX" /> <nz-option nzValue="hsb" nzLabel="HSB" /> <nz-option nzValue="rgb" nzLabel="RGB" /> </nz-select> </div> <div class="ant-color-picker-input"> @switch (validateForm.controls.isFormat.value) { @case ('hex') { <div class="ant-color-picker-hex-input"> <nz-input-group nzPrefix="#" nzSize="small"> <input nz-input nzSize="small" formControlName="hex" /> </nz-input-group> </div> } @case ('hsb') { <div class="ant-color-picker-hsb-input"> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbH" [nzMin]="0" [nzMax]="360" [nzStep]="1" [nzPrecision]="0" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbS" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-hsb-input"> <nz-input-number formControlName="hsbB" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> </div> } @default { <div class="ant-color-picker-rgb-input"> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbR" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbG" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> <div class="ant-color-picker-steppers ant-color-picker-rgb-input"> <nz-input-number formControlName="rgbB" [nzMin]="0" [nzMax]="255" [nzStep]="1" nzSize="small" /> </div> </div> } } </div> @if (!nzDisabledAlpha) { <div class="ant-color-picker-steppers ant-color-picker-alpha-input"> <nz-input-number formControlName="roundA" [nzMin]="0" [nzMax]="100" [nzStep]="1" [nzFormatter]="formatterPercent" [nzParser]="parserPercent" nzSize="small" /> </div> } </div> ` }] }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { format: [{ type: Input }], colorValue: [{ type: Input }], clearColor: [{ type: Input }], nzDisabledAlpha: [{ type: Input }], formatChange: [{ type: Output }], nzOnFormatChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZm9ybWF0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL2NvbG9yLWZvcm1hdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFLTCxtQkFBbUIsRUFHcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBZ0doRCxNQUFNLE9BQU8sc0JBQXNCO0lBVWpDLFdBQVc7UUFDVCxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtZQUMzRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7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S0FBSyxFQUFFO2dCQUMzQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzthQUNoRSxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOzhHQS9IVSxzQkFBc0I7a0dBQXRCLHNCQUFzQixvVUF2RnZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUZULDJEQXRGUyxtQkFBbUIsbTJCQUFFLGNBQWMsK2hDQUFFLGdCQUFnQixtTEFBRSxxQkFBcUIsa1JBQUUsc0JBQXNCOztBQTRGckY7SUFBZixZQUFZLEVBQUU7K0RBQWtDOzJGQUovQyxzQkFBc0I7a0JBN0ZsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSxlQUFlO29CQUN6QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsQ0FBQztvQkFDL0csUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUZUO2lCQUNGO2dGQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ21CLGVBQWU7c0JBQXZDLEtBQUs7Z0JBQ2EsWUFBWTtzQkFBOUIsTUFBTTtnQkFDWSxnQkFBZ0I7c0JBQWxDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGblxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBOeklucHV0RGlyZWN0aXZlLCBOeklucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcbmltcG9ydCB7IE56SW5wdXROdW1iZXJDb21wb25lbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0LW51bWJlcic7XG5pbXBvcnQgeyBOelNlbGVjdE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvc2VsZWN0JztcblxuaW1wb3J0IHsgZ2VuZXJhdGVDb2xvciB9IGZyb20gJy4vc3JjL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBOekNvbG9yUGlja2VyRm9ybWF0VHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWNvbG9yLWZvcm1hdCcsXG4gIGV4cG9ydEFzOiAnTnpDb2xvckZvcm1hdCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZSwgTnpTZWxlY3RNb2R1bGUsIE56SW5wdXREaXJlY3RpdmUsIE56SW5wdXRHcm91cENvbXBvbmVudCwgTnpJbnB1dE51bWJlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cInZhbGlkYXRlRm9ybVwiIGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLWZvcm1hdC1zZWxlY3RcIj5cbiAgICAgICAgPG56LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJpc0Zvcm1hdFwiIG56Qm9yZGVybGVzcyBuelNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgIDxuei1vcHRpb24gbnpWYWx1ZT1cImhleFwiIG56TGFiZWw9XCJIRVhcIiAvPlxuICAgICAgICAgIDxuei1vcHRpb24gbnpWYWx1ZT1cImhzYlwiIG56TGFiZWw9XCJIU0JcIiAvPlxuICAgICAgICAgIDxuei1vcHRpb24gbnpWYWx1ZT1cInJnYlwiIG56TGFiZWw9XCJSR0JcIiAvPlxuICAgICAgICA8L256LXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci1pbnB1dFwiPlxuICAgICAgICBAc3dpdGNoICh2YWxpZGF0ZUZvcm0uY29udHJvbHMuaXNGb3JtYXQudmFsdWUpIHtcbiAgICAgICAgICBAY2FzZSAoJ2hleCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLWhleC1pbnB1dFwiPlxuICAgICAgICAgICAgICA8bnotaW5wdXQtZ3JvdXAgbnpQcmVmaXg9XCIjXCIgbnpTaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbnotaW5wdXQgbnpTaXplPVwic21hbGxcIiBmb3JtQ29udHJvbE5hbWU9XCJoZXhcIiAvPlxuICAgICAgICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBjYXNlICgnaHNiJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItaHNiLWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXN0ZXBwZXJzIGFudC1jb2xvci1waWNrZXItaHNiLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LW51bWJlclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaHNiSFwiXG4gICAgICAgICAgICAgICAgICBbbnpNaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbnpNYXhdPVwiMzYwXCJcbiAgICAgICAgICAgICAgICAgIFtuelN0ZXBdPVwiMVwiXG4gICAgICAgICAgICAgICAgICBbbnpQcmVjaXNpb25dPVwiMFwiXG4gICAgICAgICAgICAgICAgICBuelNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXN0ZXBwZXJzIGFudC1jb2xvci1waWNrZXItaHNiLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LW51bWJlclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaHNiU1wiXG4gICAgICAgICAgICAgICAgICBbbnpNaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbnpNYXhdPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgIFtuelN0ZXBdPVwiMVwiXG4gICAgICAgICAgICAgICAgICBbbnpGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgICBbbnpQYXJzZXJdPVwicGFyc2VyUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgICBuelNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXN0ZXBwZXJzIGFudC1jb2xvci1waWNrZXItaHNiLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LW51bWJlclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaHNiQlwiXG4gICAgICAgICAgICAgICAgICBbbnpNaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbnpNYXhdPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgIFtuelN0ZXBdPVwiMVwiXG4gICAgICAgICAgICAgICAgICBbbnpGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgICBbbnpQYXJzZXJdPVwicGFyc2VyUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgICBuelNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItcmdiLWlucHV0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXN0ZXBwZXJzIGFudC1jb2xvci1waWNrZXItcmdiLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgPG56LWlucHV0LW51bWJlciBmb3JtQ29udHJvbE5hbWU9XCJyZ2JSXCIgW256TWluXT1cIjBcIiBbbnpNYXhdPVwiMjU1XCIgW256U3RlcF09XCIxXCIgbnpTaXplPVwic21hbGxcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItc3RlcHBlcnMgYW50LWNvbG9yLXBpY2tlci1yZ2ItaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8bnotaW5wdXQtbnVtYmVyIGZvcm1Db250cm9sTmFtZT1cInJnYkdcIiBbbnpNaW5dPVwiMFwiIFtuek1heF09XCIyNTVcIiBbbnpTdGVwXT1cIjFcIiBuelNpemU9XCJzbWFsbFwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci1zdGVwcGVycyBhbnQtY29sb3ItcGlja2VyLXJnYi1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxuei1pbnB1dC1udW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwicmdiQlwiIFtuek1pbl09XCIwXCIgW256TWF4XT1cIjI1NVwiIFtuelN0ZXBdPVwiMVwiIG56U2l6ZT1cInNtYWxsXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKCFuekRpc2FibGVkQWxwaGEpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItc3RlcHBlcnMgYW50LWNvbG9yLXBpY2tlci1hbHBoYS1pbnB1dFwiPlxuICAgICAgICAgIDxuei1pbnB1dC1udW1iZXJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJvdW5kQVwiXG4gICAgICAgICAgICBbbnpNaW5dPVwiMFwiXG4gICAgICAgICAgICBbbnpNYXhdPVwiMTAwXCJcbiAgICAgICAgICAgIFtuelN0ZXBdPVwiMVwiXG4gICAgICAgICAgICBbbnpGb3JtYXR0ZXJdPVwiZm9ybWF0dGVyUGVyY2VudFwiXG4gICAgICAgICAgICBbbnpQYXJzZXJdPVwicGFyc2VyUGVyY2VudFwiXG4gICAgICAgICAgICBuelNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgTnpDb2xvckZvcm1hdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBmb3JtYXQ6IE56Q29sb3JQaWNrZXJGb3JtYXRUeXBlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbG9yVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjbGVhckNvbG9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekRpc2FibGVkQWxwaGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGZvcm1hdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2xvcjogc3RyaW5nOyBmb3JtYXQ6IE56Q29sb3JQaWNrZXJGb3JtYXRUeXBlIH0+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRm9ybWF0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOekNvbG9yUGlja2VyRm9ybWF0VHlwZT4oKTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICB2YWxpZGF0b3JGbigpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBSRUdFWFAgPSAvXlswLTlhLWZBLUZdezZ9JC87XG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfTtcbiAgICAgIH0gZWxzZSBpZiAoIVJFR0VYUC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgdmFsaWRhdGVGb3JtOiBGb3JtR3JvdXA8e1xuICAgIGlzRm9ybWF0OiBGb3JtQ29udHJvbDxOekNvbG9yUGlja2VyRm9ybWF0VHlwZSB8IG51bGw+O1xuICAgIGhleDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XG4gICAgaHNiSDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICBoc2JTOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgIGhzYkI6IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgcmdiUjogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICByZ2JHOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgIHJnYkI6IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgcm91bmRBOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICB9PjtcblxuICBmb3JtYXR0ZXJQZXJjZW50ID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gYCR7dmFsdWV9ICVgO1xuICBwYXJzZXJQZXJjZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgnICUnLCAnJyk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIubm9uTnVsbGFibGUuZ3JvdXAoe1xuICAgICAgaXNGb3JtYXQ6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbDxOekNvbG9yUGlja2VyRm9ybWF0VHlwZT4oJ2hleCcpLFxuICAgICAgaGV4OiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nPignMTY3N0ZGJywgdGhpcy52YWxpZGF0b3JGbigpKSxcbiAgICAgIGhzYkg6IDIxNSxcbiAgICAgIGhzYlM6IDkxLFxuICAgICAgaHNiQjogMTAwLFxuICAgICAgcmdiUjogMjIsXG4gICAgICByZ2JHOiAxMTksXG4gICAgICByZ2JCOiAyNTUsXG4gICAgICByb3VuZEE6IDEwMFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMudmFsaWRhdGVGb3JtLnZhbGlkKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIGxldCBjb2xvciA9ICcnO1xuICAgICAgICBzd2l0Y2ggKHZhbHVlLmlzRm9ybWF0KSB7XG4gICAgICAgICAgY2FzZSAnaHNiJzpcbiAgICAgICAgICAgIGNvbG9yID0gZ2VuZXJhdGVDb2xvcih7XG4gICAgICAgICAgICAgIGg6IE51bWJlcih2YWx1ZS5oc2JIKSxcbiAgICAgICAgICAgICAgczogTnVtYmVyKHZhbHVlLmhzYlMpIC8gMTAwLFxuICAgICAgICAgICAgICBiOiBOdW1iZXIodmFsdWUuaHNiQikgLyAxMDAsXG4gICAgICAgICAgICAgIGE6IE51bWJlcih2YWx1ZS5yb3VuZEEpIC8gMTAwXG4gICAgICAgICAgICB9KS50b0hzYlN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgICAgIGNvbG9yID0gZ2VuZXJhdGVDb2xvcih7XG4gICAgICAgICAgICAgIHI6IE51bWJlcih2YWx1ZS5yZ2JSKSxcbiAgICAgICAgICAgICAgZzogTnVtYmVyKHZhbHVlLnJnYkcpLFxuICAgICAgICAgICAgICBiOiBOdW1iZXIodmFsdWUucmdiQiksXG4gICAgICAgICAgICAgIGE6IE51bWJlcih2YWx1ZS5yb3VuZEEpIC8gMTAwXG4gICAgICAgICAgICB9KS50b1JnYlN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IGdlbmVyYXRlQ29sb3IodmFsdWUuaGV4IGFzIE56Q29sb3JQaWNrZXJGb3JtYXRUeXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGhleENvbG9yID0gZ2VuZXJhdGVDb2xvcih7XG4gICAgICAgICAgICAgIHI6IGhleC5yLFxuICAgICAgICAgICAgICBnOiBoZXguZyxcbiAgICAgICAgICAgICAgYjogaGV4LmIsXG4gICAgICAgICAgICAgIGE6IE51bWJlcih2YWx1ZS5yb3VuZEEpIC8gMTAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbG9yID0gaGV4Q29sb3IuZ2V0QWxwaGEoKSA8IDEgPyBoZXhDb2xvci50b0hleDhTdHJpbmcoKSA6IGhleENvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1hdENoYW5nZS5lbWl0KHsgY29sb3IsIGZvcm1hdDogdmFsdWUuaXNGb3JtYXQgfHwgdGhpcy5mb3JtYXQgfHwgJ2hleCcgfSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVGb3JtXG4gICAgICAuZ2V0KCdpc0Zvcm1hdCcpXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLm56T25Gb3JtYXRDaGFuZ2UuZW1pdCh2YWx1ZSBhcyBOekNvbG9yUGlja2VyRm9ybWF0VHlwZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbG9yVmFsdWUsIGZvcm1hdCwgY2xlYXJDb2xvciB9ID0gY2hhbmdlcztcbiAgICBpZiAoY29sb3JWYWx1ZSkge1xuICAgICAgY29uc3QgY29sb3JWYWx1ZSA9IHtcbiAgICAgICAgaGV4OiBnZW5lcmF0ZUNvbG9yKHRoaXMuY29sb3JWYWx1ZSkudG9IZXgoKSxcbiAgICAgICAgaHNiSDogTWF0aC5yb3VuZChnZW5lcmF0ZUNvbG9yKHRoaXMuY29sb3JWYWx1ZSkudG9Ic2IoKS5oKSxcbiAgICAgICAgaHNiUzogTWF0aC5yb3VuZChnZW5lcmF0ZUNvbG9yKHRoaXMuY29sb3JWYWx1ZSkudG9Ic2IoKS5zICogMTAwKSxcbiAgICAgICAgaHNiQjogTWF0aC5yb3VuZChnZW5lcmF0ZUNvbG9yKHRoaXMuY29sb3JWYWx1ZSkudG9Ic2IoKS5iICogMTAwKSxcbiAgICAgICAgcmdiUjogTWF0aC5yb3VuZChnZW5lcmF0ZUNvbG9yKHRoaXMuY29sb3JWYWx1ZSkuciksXG4gICAgICAgIHJnYkc6IE1hdGgucm91bmQoZ2VuZXJhdGVDb2xvcih0aGlzLmNvbG9yVmFsdWUpLmcpLFxuICAgICAgICByZ2JCOiBNYXRoLnJvdW5kKGdlbmVyYXRlQ29sb3IodGhpcy5jb2xvclZhbHVlKS5iKSxcbiAgICAgICAgcm91bmRBOiBNYXRoLnJvdW5kKGdlbmVyYXRlQ29sb3IodGhpcy5jb2xvclZhbHVlKS5yb3VuZEEgKiAxMDApXG4gICAgICB9O1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0ucGF0Y2hWYWx1ZShjb2xvclZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0ICYmIHRoaXMuZm9ybWF0KSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5nZXQoJ2lzRm9ybWF0Jyk/LnBhdGNoVmFsdWUodGhpcy5mb3JtYXQpO1xuICAgIH1cblxuICAgIGlmIChjbGVhckNvbG9yICYmIHRoaXMuY2xlYXJDb2xvcikge1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uZ2V0KCdyb3VuZEEnKT8ucGF0Y2hWYWx1ZSgwKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==