UNPKG

ng-zorro-antd

Version:

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

453 lines 48.8 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 { A11yModule } from '@angular/cdk/a11y'; import { OverlayModule } from '@angular/cdk/overlay'; import { DOCUMENT, NgClass, NgStyle } from '@angular/common'; import { ChangeDetectionStrategy, Component, Directive, ElementRef, EventEmitter, Input, Output, ViewChildren, ViewEncapsulation, booleanAttribute, inject } from '@angular/core'; import { Subject } from 'rxjs'; import { finalize, first, takeUntil } from 'rxjs/operators'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { zoomBigMotion } from 'ng-zorro-antd/core/animation'; import { WithConfig } from 'ng-zorro-antd/core/config'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { NzOutletModule } from 'ng-zorro-antd/core/outlet'; import { NzOverlayModule } from 'ng-zorro-antd/core/overlay'; import { wrapIntoObservable } from 'ng-zorro-antd/core/util'; import { NzI18nModule } from 'ng-zorro-antd/i18n'; import { NzIconModule } from 'ng-zorro-antd/icon'; import { NzToolTipComponent, NzTooltipBaseDirective } from 'ng-zorro-antd/tooltip'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "ng-zorro-antd/core/overlay"; import * as i3 from "@angular/cdk/a11y"; import * as i4 from "ng-zorro-antd/core/outlet"; import * as i5 from "ng-zorro-antd/icon"; import * as i6 from "ng-zorro-antd/button"; import * as i7 from "ng-zorro-antd/core/transition-patch"; import * as i8 from "ng-zorro-antd/core/wave"; import * as i9 from "ng-zorro-antd/i18n"; const NZ_CONFIG_MODULE_NAME = 'popconfirm'; export class NzPopconfirmDirective extends NzTooltipBaseDirective { getProxyPropertyMap() { return { nzOkText: ['nzOkText', () => this.nzOkText], nzOkType: ['nzOkType', () => this.nzOkType], nzOkDanger: ['nzOkDanger', () => this.nzOkDanger], nzOkDisabled: ['nzOkDisabled', () => this.nzOkDisabled], nzCancelText: ['nzCancelText', () => this.nzCancelText], nzBeforeConfirm: ['nzBeforeConfirm', () => this.nzBeforeConfirm], nzCondition: ['nzCondition', () => this.nzCondition], nzIcon: ['nzIcon', () => this.nzIcon], nzPopconfirmShowArrow: ['nzPopconfirmShowArrow', () => this.nzPopconfirmShowArrow], nzPopconfirmBackdrop: ['nzBackdrop', () => this.nzPopconfirmBackdrop], nzPopconfirmContext: ['nzTitleContext', () => this.titleContext], nzAutoFocus: ['nzAutoFocus', () => this.nzAutofocus], ...super.getProxyPropertyMap() }; } constructor() { super(NzPopconfirmComponent); this._nzModuleName = NZ_CONFIG_MODULE_NAME; this.titleContext = null; this.trigger = 'click'; this.placement = 'top'; this.nzCondition = false; this.nzPopconfirmShowArrow = true; this.nzPopconfirmBackdrop = false; this.nzAutofocus = null; // eslint-disable-next-line @angular-eslint/no-output-rename this.visibleChange = new EventEmitter(); this.nzOnCancel = new EventEmitter(); this.nzOnConfirm = new EventEmitter(); } /** * @override */ createComponent() { super.createComponent(); this.component.nzOnCancel.pipe(takeUntil(this.destroy$)).subscribe(() => { this.nzOnCancel.emit(); }); this.component.nzOnConfirm.pipe(takeUntil(this.destroy$)).subscribe(() => { this.nzOnConfirm.emit(); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzPopconfirmDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.1.2", type: NzPopconfirmDirective, isStandalone: true, selector: "[nz-popconfirm]", inputs: { arrowPointAtCenter: ["nzPopconfirmArrowPointAtCenter", "arrowPointAtCenter", booleanAttribute], title: ["nzPopconfirmTitle", "title"], titleContext: ["nzPopconfirmTitleContext", "titleContext"], directiveTitle: ["nz-popconfirm", "directiveTitle"], trigger: ["nzPopconfirmTrigger", "trigger"], placement: ["nzPopconfirmPlacement", "placement"], origin: ["nzPopconfirmOrigin", "origin"], mouseEnterDelay: ["nzPopconfirmMouseEnterDelay", "mouseEnterDelay"], mouseLeaveDelay: ["nzPopconfirmMouseLeaveDelay", "mouseLeaveDelay"], overlayClassName: ["nzPopconfirmOverlayClassName", "overlayClassName"], overlayStyle: ["nzPopconfirmOverlayStyle", "overlayStyle"], visible: ["nzPopconfirmVisible", "visible"], nzOkText: "nzOkText", nzOkType: "nzOkType", nzOkDisabled: ["nzOkDisabled", "nzOkDisabled", booleanAttribute], nzOkDanger: ["nzOkDanger", "nzOkDanger", booleanAttribute], nzCancelText: "nzCancelText", nzBeforeConfirm: "nzBeforeConfirm", nzIcon: "nzIcon", nzCondition: ["nzCondition", "nzCondition", booleanAttribute], nzPopconfirmShowArrow: ["nzPopconfirmShowArrow", "nzPopconfirmShowArrow", booleanAttribute], nzPopconfirmBackdrop: "nzPopconfirmBackdrop", nzAutofocus: "nzAutofocus" }, outputs: { visibleChange: "nzPopconfirmVisibleChange", nzOnCancel: "nzOnCancel", nzOnConfirm: "nzOnConfirm" }, host: { properties: { "class.ant-popover-open": "visible" } }, exportAs: ["nzPopconfirm"], usesInheritance: true, ngImport: i0 }); } } __decorate([ WithConfig() ], NzPopconfirmDirective.prototype, "nzPopconfirmBackdrop", void 0); __decorate([ WithConfig() ], NzPopconfirmDirective.prototype, "nzAutofocus", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzPopconfirmDirective, decorators: [{ type: Directive, args: [{ selector: '[nz-popconfirm]', exportAs: 'nzPopconfirm', host: { '[class.ant-popover-open]': 'visible' }, standalone: true }] }], ctorParameters: () => [], propDecorators: { arrowPointAtCenter: [{ type: Input, args: [{ alias: 'nzPopconfirmArrowPointAtCenter', transform: booleanAttribute }] }], title: [{ type: Input, args: ['nzPopconfirmTitle'] }], titleContext: [{ type: Input, args: ['nzPopconfirmTitleContext'] }], directiveTitle: [{ type: Input, args: ['nz-popconfirm'] }], trigger: [{ type: Input, args: ['nzPopconfirmTrigger'] }], placement: [{ type: Input, args: ['nzPopconfirmPlacement'] }], origin: [{ type: Input, args: ['nzPopconfirmOrigin'] }], mouseEnterDelay: [{ type: Input, args: ['nzPopconfirmMouseEnterDelay'] }], mouseLeaveDelay: [{ type: Input, args: ['nzPopconfirmMouseLeaveDelay'] }], overlayClassName: [{ type: Input, args: ['nzPopconfirmOverlayClassName'] }], overlayStyle: [{ type: Input, args: ['nzPopconfirmOverlayStyle'] }], visible: [{ type: Input, args: ['nzPopconfirmVisible'] }], nzOkText: [{ type: Input }], nzOkType: [{ type: Input }], nzOkDisabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzOkDanger: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzCancelText: [{ type: Input }], nzBeforeConfirm: [{ type: Input }], nzIcon: [{ type: Input }], nzCondition: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzPopconfirmShowArrow: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzPopconfirmBackdrop: [{ type: Input }], nzAutofocus: [{ type: Input }], visibleChange: [{ type: Output, args: ['nzPopconfirmVisibleChange'] }], nzOnCancel: [{ type: Output }], nzOnConfirm: [{ type: Output }] } }); export class NzPopconfirmComponent extends NzToolTipComponent { constructor(elementRef) { super(); this.elementRef = elementRef; this.nzCondition = false; this.nzPopconfirmShowArrow = true; this.nzOkType = 'primary'; this.nzOkDanger = false; this.nzOkDisabled = false; this.nzAutoFocus = null; this.nzBeforeConfirm = null; this.nzOnCancel = new Subject(); this.nzOnConfirm = new Subject(); this._trigger = 'click'; this.elementFocusedBeforeModalWasOpened = null; this.document = inject(DOCUMENT); this._prefix = 'ant-popover'; this.confirmLoading = false; } ngOnDestroy() { super.ngOnDestroy(); this.nzOnCancel.complete(); this.nzOnConfirm.complete(); } /** * @override */ show() { if (!this.nzCondition) { this.capturePreviouslyFocusedElement(); super.show(); } else { this.onConfirm(); } } hide() { super.hide(); this.restoreFocus(); } handleConfirm() { this.nzOnConfirm.next(); super.hide(); } onCancel() { this.nzOnCancel.next(); super.hide(); } onConfirm() { if (this.nzBeforeConfirm) { const observable = wrapIntoObservable(this.nzBeforeConfirm()).pipe(first()); this.confirmLoading = true; observable .pipe(finalize(() => { this.confirmLoading = false; this.cdr.markForCheck(); }), takeUntil(this.nzVisibleChange), takeUntil(this.destroy$)) .subscribe(value => { if (value) { this.handleConfirm(); } }); } else { this.handleConfirm(); } } capturePreviouslyFocusedElement() { if (this.document) { this.elementFocusedBeforeModalWasOpened = this.document.activeElement; } } restoreFocus() { const toFocus = this.elementFocusedBeforeModalWasOpened; // We need the extra check, because IE can set the `activeElement` to null in some cases. if (toFocus && typeof toFocus.focus === 'function') { const activeElement = this.document.activeElement; const element = this.elementRef.nativeElement; if (!activeElement || activeElement === this.document.body || activeElement === element || element.contains(activeElement)) { toFocus.focus(); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzPopconfirmComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzPopconfirmComponent, isStandalone: true, selector: "nz-popconfirm", viewQueries: [{ propertyName: "okBtn", predicate: ["okBtn"], descendants: true, read: ElementRef }, { propertyName: "cancelBtn", predicate: ["cancelBtn"], descendants: true, read: ElementRef }], exportAs: ["nzPopconfirmComponent"], usesInheritance: true, ngImport: i0, template: ` <ng-template #overlay="cdkConnectedOverlay" cdkConnectedOverlay nzConnectedOverlay [cdkConnectedOverlayHasBackdrop]="nzBackdrop" [cdkConnectedOverlayOrigin]="origin" (overlayOutsideClick)="onClickOutside($event)" (detach)="hide()" (positionChange)="onPositionChange($event)" [cdkConnectedOverlayPositions]="_positions" [cdkConnectedOverlayOpen]="_visible" [cdkConnectedOverlayPush]="cdkConnectedOverlayPush" [nzArrowPointAtCenter]="nzArrowPointAtCenter" > <div cdkTrapFocus [cdkTrapFocusAutoCapture]="nzAutoFocus !== null" class="ant-popover" [ngClass]="_classMap" [class.ant-popover-rtl]="dir === 'rtl'" [ngStyle]="nzOverlayStyle" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [@zoomBigMotion]="'active'" > <div class="ant-popover-content"> @if (nzPopconfirmShowArrow) { <div class="ant-popover-arrow"> <span class="ant-popover-arrow-content"></span> </div> } <div class="ant-popover-inner"> <div> <div class="ant-popover-inner-content"> <div class="ant-popover-message"> <ng-container *nzStringTemplateOutlet="nzTitle; context: nzTitleContext"> <ng-container *nzStringTemplateOutlet="nzIcon; let icon"> <span class="ant-popover-message-icon"> <span nz-icon [nzType]="icon || 'exclamation-circle'" nzTheme="fill"></span> </span> </ng-container> <div class="ant-popover-message-title">{{ nzTitle }}</div> </ng-container> </div> <div class="ant-popover-buttons"> <button nz-button #cancelBtn [nzSize]="'small'" (click)="onCancel()" [attr.cdkFocusInitial]="nzAutoFocus === 'cancel' || null" > @if (nzCancelText) { {{ nzCancelText }} } @else { {{ 'Modal.cancelText' | nzI18n }} } </button> <button nz-button #okBtn [nzSize]="'small'" [nzType]="nzOkType !== 'danger' ? nzOkType : 'primary'" [nzDanger]="nzOkDanger || nzOkType === 'danger'" [nzLoading]="confirmLoading" [disabled]="nzOkDisabled" (click)="onConfirm()" [attr.cdkFocusInitial]="nzAutoFocus === 'ok' || null" > @if (nzOkText) { {{ nzOkText }} } @else { {{ 'Modal.okText' | nzI18n }} } </button> </div> </div> </div> </div> </div> </div> </ng-template> `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: NzOverlayModule }, { kind: "directive", type: i2.NzConnectedOverlayDirective, selector: "[cdkConnectedOverlay][nzConnectedOverlay]", inputs: ["nzArrowPointAtCenter"], exportAs: ["nzConnectedOverlay"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NzNoAnimationDirective, selector: "[nzNoAnimation]", inputs: ["nzNoAnimation"], exportAs: ["nzNoAnimation"] }, { kind: "ngmodule", type: NzOutletModule }, { kind: "directive", type: i4.NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i7.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i8.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "ngmodule", type: NzI18nModule }, { kind: "pipe", type: i9.NzI18nPipe, name: "nzI18n" }], animations: [zoomBigMotion], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzPopconfirmComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, selector: 'nz-popconfirm', exportAs: 'nzPopconfirmComponent', preserveWhitespaces: false, animations: [zoomBigMotion], template: ` <ng-template #overlay="cdkConnectedOverlay" cdkConnectedOverlay nzConnectedOverlay [cdkConnectedOverlayHasBackdrop]="nzBackdrop" [cdkConnectedOverlayOrigin]="origin" (overlayOutsideClick)="onClickOutside($event)" (detach)="hide()" (positionChange)="onPositionChange($event)" [cdkConnectedOverlayPositions]="_positions" [cdkConnectedOverlayOpen]="_visible" [cdkConnectedOverlayPush]="cdkConnectedOverlayPush" [nzArrowPointAtCenter]="nzArrowPointAtCenter" > <div cdkTrapFocus [cdkTrapFocusAutoCapture]="nzAutoFocus !== null" class="ant-popover" [ngClass]="_classMap" [class.ant-popover-rtl]="dir === 'rtl'" [ngStyle]="nzOverlayStyle" [@.disabled]="!!noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [@zoomBigMotion]="'active'" > <div class="ant-popover-content"> @if (nzPopconfirmShowArrow) { <div class="ant-popover-arrow"> <span class="ant-popover-arrow-content"></span> </div> } <div class="ant-popover-inner"> <div> <div class="ant-popover-inner-content"> <div class="ant-popover-message"> <ng-container *nzStringTemplateOutlet="nzTitle; context: nzTitleContext"> <ng-container *nzStringTemplateOutlet="nzIcon; let icon"> <span class="ant-popover-message-icon"> <span nz-icon [nzType]="icon || 'exclamation-circle'" nzTheme="fill"></span> </span> </ng-container> <div class="ant-popover-message-title">{{ nzTitle }}</div> </ng-container> </div> <div class="ant-popover-buttons"> <button nz-button #cancelBtn [nzSize]="'small'" (click)="onCancel()" [attr.cdkFocusInitial]="nzAutoFocus === 'cancel' || null" > @if (nzCancelText) { {{ nzCancelText }} } @else { {{ 'Modal.cancelText' | nzI18n }} } </button> <button nz-button #okBtn [nzSize]="'small'" [nzType]="nzOkType !== 'danger' ? nzOkType : 'primary'" [nzDanger]="nzOkDanger || nzOkType === 'danger'" [nzLoading]="confirmLoading" [disabled]="nzOkDisabled" (click)="onConfirm()" [attr.cdkFocusInitial]="nzAutoFocus === 'ok' || null" > @if (nzOkText) { {{ nzOkText }} } @else { {{ 'Modal.okText' | nzI18n }} } </button> </div> </div> </div> </div> </div> </div> </ng-template> `, imports: [ OverlayModule, NzOverlayModule, A11yModule, NgClass, NgStyle, NzNoAnimationDirective, NzOutletModule, NzIconModule, NzButtonModule, NzI18nModule ], standalone: true }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { okBtn: [{ type: ViewChildren, args: ['okBtn', { read: ElementRef }] }], cancelBtn: [{ type: ViewChildren, args: ['cancelBtn', { read: ElementRef }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wY29uZmlybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvcG9wY29uZmlybS9wb3Bjb25maXJtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBR04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFlLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FB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aXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBPdmVybGF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgRE9DVU1FTlQsIE5nQ2xhc3MsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIGZpcnN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56QnV0dG9uTW9kdWxlLCBOekJ1dHRvblR5cGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyB6b29tQmlnTW90aW9uIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2FuaW1hdGlvbic7XG5pbXBvcnQgeyBOekNvbmZpZ0tleSwgV2l0aENvbmZpZyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgTnpPdXRsZXRNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvb3V0bGV0JztcbmltcG9ydCB7IE56T3ZlcmxheU1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9vdmVybGF5JztcbmltcG9ydCB7IE5nU3R5bGVJbnRlcmZhY2UsIE56VFNUeXBlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IHdyYXBJbnRvT2JzZXJ2YWJsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IE56STE4bk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xuaW1wb3J0IHsgTnpUb29sVGlwQ29tcG9uZW50LCBOelRvb2x0aXBCYXNlRGlyZWN0aXZlLCBOelRvb2x0aXBUcmlnZ2VyLCBQcm9wZXJ0eU1hcHBpbmcgfSBmcm9tICduZy16b3Jyby1hbnRkL3Rvb2x0aXAnO1xuXG5leHBvcnQgdHlwZSBOekF1dG9Gb2N1c1R5cGUgPSBudWxsIHwgJ29rJyB8ICdjYW5jZWwnO1xuXG5jb25zdCBOWl9DT05GSUdfTU9EVUxFX05BTUU6IE56Q29uZmlnS2V5ID0gJ3BvcGNvbmZpcm0nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnotcG9wY29uZmlybV0nLFxuICBleHBvcnRBczogJ256UG9wY29uZmlybScsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC1wb3BvdmVyLW9wZW5dJzogJ3Zpc2libGUnXG4gIH0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpQb3Bjb25maXJtRGlyZWN0aXZlIGV4dGVuZHMgTnpUb29sdGlwQmFzZURpcmVjdGl2ZSB7XG4gIHJlYWRvbmx5IF9uek1vZHVsZU5hbWU6IE56Q29uZmlnS2V5ID0gTlpfQ09ORklHX01PRFVMRV9OQU1FO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnbnpQb3Bjb25maXJtQXJyb3dQb2ludEF0Q2VudGVyJywgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIG92ZXJyaWRlIGFycm93UG9pbnRBdENlbnRlcj86IGJvb2xlYW47XG4gIEBJbnB1dCgnbnpQb3Bjb25maXJtVGl0bGUnKSBvdmVycmlkZSB0aXRsZT86IE56VFNUeXBlO1xuICBASW5wdXQoJ256UG9wY29uZmlybVRpdGxlQ29udGV4dCcpIHRpdGxlQ29udGV4dD86IE9iamVjdCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoJ256LXBvcGNvbmZpcm0nKSBvdmVycmlkZSBkaXJlY3RpdmVUaXRsZT86IE56VFNUeXBlIHwgbnVsbDtcbiAgQElucHV0KCduelBvcGNvbmZpcm1UcmlnZ2VyJykgb3ZlcnJpZGUgdHJpZ2dlcj86IE56VG9vbHRpcFRyaWdnZXIgPSAnY2xpY2snO1xuICBASW5wdXQoJ256UG9wY29uZmlybVBsYWNlbWVudCcpIG92ZXJyaWRlIHBsYWNlbWVudD86IHN0cmluZyB8IHN0cmluZ1tdID0gJ3RvcCc7XG4gIEBJbnB1dCgnbnpQb3Bjb25maXJtT3JpZ2luJykgb3ZlcnJpZGUgb3JpZ2luPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBJbnB1dCgnbnpQb3Bjb25maXJtTW91c2VFbnRlckRlbGF5Jykgb3ZlcnJpZGUgbW91c2VFbnRlckRlbGF5PzogbnVtYmVyO1xuICBASW5wdXQoJ256UG9wY29uZmlybU1vdXNlTGVhdmVEZWxheScpIG92ZXJyaWRlIG1vdXNlTGVhdmVEZWxheT86IG51bWJlcjtcbiAgQElucHV0KCduelBvcGNvbmZpcm1PdmVybGF5Q2xhc3NOYW1lJykgb3ZlcnJpZGUgb3ZlcmxheUNsYXNzTmFtZT86IHN0cmluZztcbiAgQElucHV0KCduelBvcGNvbmZpcm1PdmVybGF5U3R5bGUnKSBvdmVycmlkZSBvdmVybGF5U3R5bGU/OiBOZ1N0eWxlSW50ZXJmYWNlO1xuICBASW5wdXQoJ256UG9wY29uZmlybVZpc2libGUnKSBvdmVycmlkZSB2aXNpYmxlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgbnpPa1RleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56T2tUeXBlPzogc3RyaW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpPa0Rpc2FibGVkPzogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56T2tEYW5nZXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBuekNhbmNlbFRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56QmVmb3JlQ29uZmlybT86ICgpID0+IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgQElucHV0KCkgbnpJY29uPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekNvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpQb3Bjb25maXJtU2hvd0Fycm93OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuelBvcGNvbmZpcm1CYWNrZHJvcD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuekF1dG9mb2N1czogTnpBdXRvRm9jdXNUeXBlID0gbnVsbDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgQE91dHB1dCgnbnpQb3Bjb25maXJtVmlzaWJsZUNoYW5nZScpIG92ZXJyaWRlIHJlYWRvbmx5IHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3h5UHJvcGVydHlNYXAoKTogUHJvcGVydHlNYXBwaW5nIHtcbiAgICByZXR1cm4ge1xuICAgICAgbnpPa1RleHQ6IFsnbnpPa1RleHQnLCAoKSA9PiB0aGlzLm56T2tUZXh0XSxcbiAgICAgIG56T2tUeXBlOiBbJ256T2tUeXBlJywgKCkgPT4gdGhpcy5uek9rVHlwZV0sXG4gICAgICBuek9rRGFuZ2VyOiBbJ256T2tEYW5nZXInLCAoKSA9PiB0aGlzLm56T2tEYW5nZXJdLFxuICAgICAgbnpPa0Rpc2FibGVkOiBbJ256T2tEaXNhYmxlZCcsICgpID0+IHRoaXMubnpPa0Rpc2FibGVkXSxcbiAgICAgIG56Q2FuY2VsVGV4dDogWyduekNhbmNlbFRleHQnLCAoKSA9PiB0aGlzLm56Q2FuY2VsVGV4dF0sXG4gICAgICBuekJlZm9yZUNvbmZpcm06IFsnbnpCZWZvcmVDb25maXJtJywgKCkgPT4gdGhpcy5uekJlZm9yZUNvbmZpcm1dLFxuICAgICAgbnpDb25kaXRpb246IFsnbnpDb25kaXRpb24nLCAoKSA9PiB0aGlzLm56Q29uZGl0aW9uXSxcbiAgICAgIG56SWNvbjogWyduekljb24nLCAoKSA9PiB0aGlzLm56SWNvbl0sXG4gICAgICBuelBvcGNvbmZpcm1TaG93QXJyb3c6IFsnbnpQb3Bjb25maXJtU2hvd0Fycm93JywgKCkgPT4gdGhpcy5uelBvcGNvbmZpcm1TaG93QXJyb3ddLFxuICAgICAgbnpQb3Bjb25maXJtQmFja2Ryb3A6IFsnbnpCYWNrZHJvcCcsICgpID0+IHRoaXMubnpQb3Bjb25maXJtQmFja2Ryb3BdLFxuICAgICAgbnpQb3Bjb25maXJtQ29udGV4dDogWyduelRpdGxlQ29udGV4dCcsICgpID0+IHRoaXMudGl0bGVDb250ZXh0XSxcbiAgICAgIG56QXV0b0ZvY3VzOiBbJ256QXV0b0ZvY3VzJywgKCkgPT4gdGhpcy5uekF1dG9mb2N1c10sXG4gICAgICAuLi5zdXBlci5nZXRQcm94eVByb3BlcnR5TWFwKClcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoTnpQb3Bjb25maXJtQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVDb21wb25lbnQoKTogdm9pZCB7XG4gICAgc3VwZXIuY3JlYXRlQ29tcG9uZW50KCk7XG5cbiAgICAodGhpcy5jb21wb25lbnQgYXMgTnpQb3Bjb25maXJtQ29tcG9uZW50KS5uek9uQ2FuY2VsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5uek9uQ2FuY2VsLmVtaXQoKTtcbiAgICB9KTtcbiAgICAodGhpcy5jb21wb25lbnQgYXMgTnpQb3Bjb25maXJtQ29tcG9uZW50KS5uek9uQ29uZmlybS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubnpPbkNvbmZpcm0uZW1pdCgpO1xuICAgIH0pO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICduei1wb3Bjb25maXJtJyxcbiAgZXhwb3J0QXM6ICduelBvcGNvbmZpcm1Db21wb25lbnQnLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgYW5pbWF0aW9uczogW3pvb21CaWdNb3Rpb25dLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgI292ZXJsYXk9XCJjZGtDb25uZWN0ZWRPdmVybGF5XCJcbiAgICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICAgIG56Q29ubmVjdGVkT3ZlcmxheVxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJuekJhY2tkcm9wXCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm9yaWdpblwiXG4gICAgICAob3ZlcmxheU91dHNpZGVDbGljayk9XCJvbkNsaWNrT3V0c2lkZSgkZXZlbnQpXCJcbiAgICAgIChkZXRhY2gpPVwiaGlkZSgpXCJcbiAgICAgIChwb3NpdGlvbkNoYW5nZSk9XCJvblBvc2l0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwiX3Bvc2l0aW9uc1wiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiX3Zpc2libGVcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQdXNoXT1cImNka0Nvbm5lY3RlZE92ZXJsYXlQdXNoXCJcbiAgICAgIFtuekFycm93UG9pbnRBdENlbnRlcl09XCJuekFycm93UG9pbnRBdENlbnRlclwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW2Nka1RyYXBGb2N1c0F1dG9DYXB0dXJlXT1cIm56QXV0b0ZvY3VzICE9PSBudWxsXCJcbiAgICAgICAgY2xhc3M9XCJhbnQtcG9wb3ZlclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIl9jbGFzc01hcFwiXG4gICAgICAgIFtjbGFzcy5hbnQtcG9wb3Zlci1ydGxdPVwiZGlyID09PSAncnRsJ1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cIm56T3ZlcmxheVN0eWxlXCJcbiAgICAgICAgW0AuZGlzYWJsZWRdPVwiISFub0FuaW1hdGlvbj8ubnpOb0FuaW1hdGlvblwiXG4gICAgICAgIFtuek5vQW5pbWF0aW9uXT1cIm5vQW5pbWF0aW9uPy5uek5vQW5pbWF0aW9uXCJcbiAgICAgICAgW0B6b29tQmlnTW90aW9uXT1cIidhY3RpdmUnXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1wb3BvdmVyLWNvbnRlbnRcIj5cbiAgICAgICAgICBAaWYgKG56UG9wY29uZmlybVNob3dBcnJvdykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1wb3BvdmVyLWFycm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW50LXBvcG92ZXItYXJyb3ctY29udGVudFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LXBvcG92ZXItaW5uZXJcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtcG9wb3Zlci1pbm5lci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1wb3BvdmVyLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm56U3RyaW5nVGVtcGxhdGVPdXRsZXQ9XCJuelRpdGxlOyBjb250ZXh0OiBuelRpdGxlQ29udGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwibnpJY29uOyBsZXQgaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW50LXBvcG92ZXItbWVzc2FnZS1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBuei1pY29uIFtuelR5cGVdPVwiaWNvbiB8fCAnZXhjbGFtYXRpb24tY2lyY2xlJ1wiIG56VGhlbWU9XCJmaWxsXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtcG9wb3Zlci1tZXNzYWdlLXRpdGxlXCI+e3sgbnpUaXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1wb3BvdmVyLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbnotYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICNjYW5jZWxCdG5cbiAgICAgICAgICAgICAgICAgICAgW256U2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5jZGtGb2N1c0luaXRpYWxdPVwibnpBdXRvRm9jdXMgPT09ICdjYW5jZWwnIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG56Q2FuY2VsVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgIHt7IG56Q2FuY2VsVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyAnTW9kYWwuY2FuY2VsVGV4dCcgfCBuekkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG56LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAjb2tCdG5cbiAgICAgICAgICAgICAgICAgICAgW256U2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgICAgICAgICAgICAgW256VHlwZV09XCJuek9rVHlwZSAhPT0gJ2RhbmdlcicgPyBuek9rVHlwZSA6ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtuekRhbmdlcl09XCJuek9rRGFuZ2VyIHx8IG56T2tUeXBlID09PSAnZGFuZ2VyJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuekxvYWRpbmddPVwiY29uZmlybUxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibnpPa0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuY2RrRm9jdXNJbml0aWFsXT1cIm56QXV0b0ZvY3VzID09PSAnb2snIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG56T2tUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgbnpPa1RleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ01vZGFsLm9rVGV4dCcgfCBuekkxOG4gfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgaW1wb3J0czogW1xuICAgIE92ZXJsYXlNb2R1bGUsXG4gICAgTnpPdmVybGF5TW9kdWxlLFxuICAgIEExMXlNb2R1bGUsXG4gICAgTmdDbGFzcyxcbiAgICBOZ1N0eWxlLFxuICAgIE56Tm9BbmltYXRpb25EaXJlY3RpdmUsXG4gICAgTnpPdXRsZXRNb2R1bGUsXG4gICAgTnpJY29uTW9kdWxlLFxuICAgIE56QnV0dG9uTW9kdWxlLFxuICAgIE56STE4bk1vZHVsZVxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56UG9wY29uZmlybUNvbXBvbmVudCBleHRlbmRzIE56VG9vbFRpcENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGRyZW4oJ29rQnRuJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIG9rQnRuITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkcmVuKCdjYW5jZWxCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY2FuY2VsQnRuITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIG56Q2FuY2VsVGV4dD86IHN0cmluZztcbiAgbnpDb25kaXRpb24gPSBmYWxzZTtcbiAgbnpQb3Bjb25maXJtU2hvd0Fycm93ID0gdHJ1ZTtcbiAgbnpJY29uPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIG56T2tUZXh0Pzogc3RyaW5nO1xuICBuek9rVHlwZTogTnpCdXR0b25UeXBlIHwgJ2RhbmdlcicgPSAncHJpbWFyeSc7XG4gIG56T2tEYW5nZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbnpPa0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIG56QXV0b0ZvY3VzOiBOekF1dG9Gb2N1c1R5cGUgPSBudWxsO1xuICBuekJlZm9yZUNvbmZpcm06ICgoKSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4pIHwgbnVsbCA9IG51bGw7XG5cbiAgcmVhZG9ubHkgbnpPbkNhbmNlbCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IG56T25Db25maXJtID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3RyaWdnZXI6IE56VG9vbHRpcFRyaWdnZXIgPSAnY2xpY2snO1xuICBwcml2YXRlIGVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICBvdmVycmlkZSBfcHJlZml4ID0gJ2FudC1wb3BvdmVyJztcblxuICBjb25maXJtTG9hZGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgdGhpcy5uek9uQ2FuY2VsLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5uek9uQ29uZmlybS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgb3ZlcnJpZGUgc2hvdygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuY2FwdHVyZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpO1xuICAgICAgc3VwZXIuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uQ29uZmlybSgpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGhpZGUoKTogdm9pZCB7XG4gICAgc3VwZXIuaGlkZSgpO1xuICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gIH1cblxuICBoYW5kbGVDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubnpPbkNvbmZpcm0ubmV4dCgpO1xuICAgIHN1cGVyLmhpZGUoKTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMubnpPbkNhbmNlbC5uZXh0KCk7XG4gICAgc3VwZXIuaGlkZSgpO1xuICB9XG5cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56QmVmb3JlQ29uZmlybSkge1xuICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IHdyYXBJbnRvT2JzZXJ2YWJsZSh0aGlzLm56QmVmb3JlQ29uZmlybSgpKS5waXBlKGZpcnN0KCkpO1xuICAgICAgdGhpcy5jb25maXJtTG9hZGluZyA9IHRydWU7XG4gICAgICBvYnNlcnZhYmxlXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm56VmlzaWJsZUNoYW5nZSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbmZpcm0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbmZpcm0oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZCA9IHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCB0b0ZvY3VzID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgLy8gV2UgbmVlZCB0aGUgZXh0cmEgY2hlY2ssIGJlY2F1c2UgSUUgY2FuIHNldCB0aGUgYGFjdGl2ZUVsZW1lbnRgIHRvIG51bGwgaW4gc29tZSBjYXNlcy5cbiAgICBpZiAodG9Gb2N1cyAmJiB0eXBlb2YgdG9Gb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBFbGVtZW50O1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBpZiAoXG4gICAgICAgICFhY3RpdmVFbGVtZW50IHx8XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZG9jdW1lbnQuYm9keSB8fFxuICAgICAgICBhY3RpdmVFbGVtZW50ID09PSBlbGVtZW50IHx8XG4gICAgICAgIGVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICB0b0ZvY3VzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=