UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

341 lines 37.5 kB
import { ButtonModule, DIALOG_DATA, DialogModule, DialogRef, FormModule, IconModule, InputModule, MessageService, NotificationService, } from '@alauda/ui'; import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChild, Directive, EventEmitter, Inject, Input, Optional, Output, TemplateRef, } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { get } from 'lodash-es'; import { BehaviorSubject, combineLatest, from, Subject, finalize, map, takeUntil, } from 'rxjs'; import { EffectDirectiveModule } from '../../effect-directive/module'; import { TranslateModule } from '../../translate/public-api'; import { DeleteType } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "@alauda/ui"; import * as i2 from "../../translate/translate.pipe"; import * as i3 from "@angular/forms"; import * as i4 from "../../effect-directive/e2e-attribute-binding.directive"; function ConfirmDeleteComponent_ng_container_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵtextInterpolate(ctx_r0.deleteTips); } } function ConfirmDeleteComponent_ng_container_7_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function ConfirmDeleteComponent_ng_container_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, ConfirmDeleteComponent_ng_container_7_ng_container_1_Template, 1, 0, "ng-container", 8); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.deleteTipTemplate); } } function ConfirmDeleteComponent_ng_container_8_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function ConfirmDeleteComponent_ng_container_8_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, ConfirmDeleteComponent_ng_container_8_ng_container_1_Template, 1, 0, "ng-container", 8); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.contentTemplate); } } function ConfirmDeleteComponent_ng_container_10_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function ConfirmDeleteComponent_ng_container_10_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, ConfirmDeleteComponent_ng_container_10_ng_container_1_Template, 1, 0, "ng-container", 8); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r0.labelTemplate); } } function ConfirmDeleteComponent_ng_container_11_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", ctx_r0.confirmTips, " "); } } function ConfirmDeleteComponent_ng_container_11_ng_container_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1); i0.ɵɵpipe(2, "translate"); i0.ɵɵelementStart(3, "span", 9); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵtext(5); i0.ɵɵpipe(6, "translate"); i0.ɵɵpipe(7, "translate"); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 5, "please_enter_extra"), " "); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(ctx_r0.resourceName); i0.ɵɵadvance(); i0.ɵɵtextInterpolate3(" ", i0.ɵɵpipeBind1(6, 7, "extra_determine_" + ctx_r0.type), "", ctx_r0.extraConfirmTips ? i0.ɵɵpipeBind1(7, 9, "period_symbol") : null, "", ctx_r0.extraConfirmTips, " "); } } function ConfirmDeleteComponent_ng_container_11_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, ConfirmDeleteComponent_ng_container_11_ng_container_1_Template, 2, 1, "ng-container", 3)(2, ConfirmDeleteComponent_ng_container_11_ng_container_2_Template, 8, 11, "ng-container", 3); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx_r0.confirmTips); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", !ctx_r0.confirmTips); } } export class ConfirmDeleteTipDirective { constructor(templateRef) { this.templateRef = templateRef; } static { this.ɵfac = function ConfirmDeleteTipDirective_Factory(t) { return new (t || ConfirmDeleteTipDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ConfirmDeleteTipDirective, selectors: [["", "aclConfirmDeleteTip", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDeleteTipDirective, [{ type: Directive, args: [{ selector: '[aclConfirmDeleteTip]', standalone: true, }] }], () => [{ type: i0.TemplateRef }], null); })(); export class ConfirmDeleteContentDirective { constructor(templateRef) { this.templateRef = templateRef; } static { this.ɵfac = function ConfirmDeleteContentDirective_Factory(t) { return new (t || ConfirmDeleteContentDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ConfirmDeleteContentDirective, selectors: [["", "aclConfirmDeleteContent", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDeleteContentDirective, [{ type: Directive, args: [{ standalone: true, selector: '[aclConfirmDeleteContent]', }] }], () => [{ type: i0.TemplateRef }], null); })(); export class ConfirmDeleteLabelDirective { constructor(templateRef) { this.templateRef = templateRef; } static { this.ɵfac = function ConfirmDeleteLabelDirective_Factory(t) { return new (t || ConfirmDeleteLabelDirective)(i0.ɵɵdirectiveInject(i0.TemplateRef)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ConfirmDeleteLabelDirective, selectors: [["", "aclConfirmDeleteLabel", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDeleteLabelDirective, [{ type: Directive, args: [{ standalone: true, selector: '[aclConfirmDeleteLabel]', }] }], () => [{ type: i0.TemplateRef }], null); })(); export class ConfirmDeleteComponent { constructor(message, notification, dialogRef, data) { this.message = message; this.notification = notification; this.dialogRef = dialogRef; this.data = data; this.type = DeleteType.DELETE; this.close = new EventEmitter(); this.inputValue = ''; this.inputValue$$ = new BehaviorSubject(this.inputValue); this.deleting$$ = new BehaviorSubject(false); this.disabled$ = combineLatest([this.inputValue$$, this.deleting$$]).pipe(map(([inputValue, deleting]) => { const { resourceName } = this; return (deleting || !(Array.isArray(resourceName) ? resourceName.includes(inputValue) : inputValue === resourceName)); })); this.destroy$$ = new Subject(); this.resolveData(); } ngOnDestroy() { this.destroy$$.next(); this.destroy$$.complete(); } onConfirm() { this.deleting$$.next(true); const completed$$ = new Subject(); from(this.deleteResourceApi.call(this.context, this.inputValue, this.deleteResourceParams)) .pipe(finalize(() => this.deleting$$.next(false)), takeUntil(completed$$), takeUntil(this.destroy$$)) .subscribe({ next: result => { if (this.deleteSuccessMsg) { this.message.success(this.deleteSuccessMsg); } this.closeDialog(result); completed$$.next(); }, error: (e) => { if (this.deleteFailMsg) { this.notification.error({ title: this.deleteFailMsg, content: get(e.error, 'message', e.message), }); } completed$$.next(); }, }); } closeDialog(result) { if (this.dialogRef) { this.dialogRef.close(result); } else { this.close.emit(result); } } resolveData() { if (!this.data) { return; } Object.entries(this.data).forEach(([key, value]) => { if (value != null) { this[key] = value; } }); } static { this.ɵfac = function ConfirmDeleteComponent_Factory(t) { return new (t || ConfirmDeleteComponent)(i0.ɵɵdirectiveInject(i1.MessageService), i0.ɵɵdirectiveInject(i1.NotificationService), i0.ɵɵdirectiveInject(i1.DialogRef, 8), i0.ɵɵdirectiveInject(DIALOG_DATA, 8)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConfirmDeleteComponent, selectors: [["acl-confirm-delete"]], contentQueries: function ConfirmDeleteComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) { i0.ɵɵcontentQuery(dirIndex, ConfirmDeleteTipDirective, 5, TemplateRef); i0.ɵɵcontentQuery(dirIndex, ConfirmDeleteContentDirective, 5, TemplateRef); i0.ɵɵcontentQuery(dirIndex, ConfirmDeleteLabelDirective, 5, TemplateRef); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.deleteTipTemplate = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.contentTemplate = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.labelTemplate = _t.first); } }, inputs: { context: "context", type: "type", title: "title", resourceName: "resourceName", deleteTips: "deleteTips", confirmTips: "confirmTips", extraConfirmTips: "extraConfirmTips", confirmText: "confirmText", deleteResourceApi: "deleteResourceApi", deleteResourceParams: "deleteResourceParams", deleteSuccessMsg: "deleteSuccessMsg", deleteFailMsg: "deleteFailMsg" }, outputs: { close: "close" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 22, vars: 19, consts: [[3, "ngSubmit"], ["icon", "exclamation_triangle_s", "background", "triangle", "size", "22"], [1, "tw-mt-0", "tw-mb-12", "tw-text-main-text"], [4, "ngIf"], [1, "tw-mb-4", "tw-text-main-text"], ["auiFormItemControl", "", "aui-input", "", "name", "resource-name", 3, "ngModelChange", "ngModel"], ["aui-button", "danger", 3, "loading", "disabled"], ["aui-button", "", "type", "button", 3, "click"], [4, "ngTemplateOutlet"], [1, "tw-text-red"]], template: function ConfirmDeleteComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "form", 0); i0.ɵɵlistener("ngSubmit", function ConfirmDeleteComponent_Template_form_ngSubmit_0_listener() { return ctx.onConfirm(); }); i0.ɵɵelementStart(1, "aui-dialog-header"); i0.ɵɵelement(2, "aui-icon", 1); i0.ɵɵtext(3); i0.ɵɵelementEnd(); i0.ɵɵelementStart(4, "aui-dialog-content")(5, "p", 2); i0.ɵɵtemplate(6, ConfirmDeleteComponent_ng_container_6_Template, 2, 1, "ng-container", 3)(7, ConfirmDeleteComponent_ng_container_7_Template, 2, 1, "ng-container", 3); i0.ɵɵelementEnd(); i0.ɵɵtemplate(8, ConfirmDeleteComponent_ng_container_8_Template, 2, 1, "ng-container", 3); i0.ɵɵelementStart(9, "div", 4); i0.ɵɵtemplate(10, ConfirmDeleteComponent_ng_container_10_Template, 2, 1, "ng-container", 3)(11, ConfirmDeleteComponent_ng_container_11_Template, 3, 2, "ng-container", 3); i0.ɵɵelementEnd(); i0.ɵɵelementStart(12, "input", 5); i0.ɵɵtwoWayListener("ngModelChange", function ConfirmDeleteComponent_Template_input_ngModelChange_12_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.inputValue, $event) || (ctx.inputValue = $event); return $event; }); i0.ɵɵlistener("ngModelChange", function ConfirmDeleteComponent_Template_input_ngModelChange_12_listener($event) { return ctx.inputValue$$.next($event); }); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(13, "aui-dialog-footer")(14, "button", 6); i0.ɵɵpipe(15, "async"); i0.ɵɵpipe(16, "async"); i0.ɵɵtext(17); i0.ɵɵpipe(18, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(19, "button", 7); i0.ɵɵlistener("click", function ConfirmDeleteComponent_Template_button_click_19_listener() { return ctx.closeDialog(); }); i0.ɵɵtext(20); i0.ɵɵpipe(21, "translate"); i0.ɵɵelementEnd()()(); } if (rf & 2) { i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", ctx.title, " "); i0.ɵɵadvance(3); i0.ɵɵproperty("ngIf", ctx.deleteTips); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.deleteTipTemplate); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.contentTemplate); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.labelTemplate); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", !ctx.labelTemplate); i0.ɵɵadvance(); i0.ɵɵtwoWayProperty("ngModel", ctx.inputValue); i0.ɵɵadvance(2); i0.ɵɵproperty("loading", i0.ɵɵpipeBind1(15, 11, ctx.deleting$$))("disabled", i0.ɵɵpipeBind1(16, 13, ctx.disabled$)); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 15, ctx.confirmText || ctx.type), " "); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 17, "cancel"), " "); } }, dependencies: [DialogModule, i1.DialogHeaderComponent, i1.DialogContentComponent, i1.DialogFooterComponent, ButtonModule, i1.ButtonComponent, TranslateModule, i2.TranslatePipe, FormsModule, i3.ɵNgNoValidate, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.NgModel, i3.NgForm, InputModule, i1.InputComponent, IconModule, i1.IconComponent, NgIf, NgTemplateOutlet, FormModule, i1.FormItemControlDirective, AsyncPipe, EffectDirectiveModule, i4.E2eAttributeBindingDirective], encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDeleteComponent, [{ type: Component, args: [{ selector: 'acl-confirm-delete', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ DialogModule, ButtonModule, TranslateModule, FormsModule, InputModule, IconModule, NgIf, NgTemplateOutlet, FormModule, AsyncPipe, EffectDirectiveModule, ], standalone: true, template: "<form (ngSubmit)=\"onConfirm()\">\n <aui-dialog-header>\n <aui-icon\n icon=\"exclamation_triangle_s\"\n background=\"triangle\"\n size=\"22\"\n ></aui-icon>\n {{ title }}\n </aui-dialog-header>\n <aui-dialog-content>\n <p class=\"tw-mt-0 tw-mb-12 tw-text-main-text\">\n <ng-container *ngIf=\"deleteTips\">{{ deleteTips }}</ng-container>\n <ng-container *ngIf=\"deleteTipTemplate\">\n <ng-container *ngTemplateOutlet=\"deleteTipTemplate\"></ng-container>\n </ng-container>\n </p>\n <ng-container *ngIf=\"contentTemplate\">\n <ng-container *ngTemplateOutlet=\"contentTemplate\"></ng-container>\n </ng-container>\n <div class=\"tw-mb-4 tw-text-main-text\">\n <ng-container *ngIf=\"labelTemplate\">\n <ng-container *ngTemplateOutlet=\"labelTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!labelTemplate\">\n <ng-container *ngIf=\"confirmTips\">\n {{ confirmTips }}\n </ng-container>\n <ng-container *ngIf=\"!confirmTips\">\n {{ 'please_enter_extra' | translate }}\n <span class=\"tw-text-red\">{{ resourceName }}</span>\n {{ 'extra_determine_' + type | translate\n }}{{ extraConfirmTips ? ('period_symbol' | translate) : null\n }}{{ extraConfirmTips }}\n </ng-container>\n </ng-container>\n </div>\n <input\n auiFormItemControl\n aui-input\n name=\"resource-name\"\n [(ngModel)]=\"inputValue\"\n (ngModelChange)=\"inputValue$$.next($event)\"\n />\n </aui-dialog-content>\n <aui-dialog-footer>\n <button\n aui-button=\"danger\"\n [loading]=\"deleting$$ | async\"\n [disabled]=\"disabled$ | async\"\n >\n {{ confirmText || type | translate }}\n </button>\n <button\n aui-button\n type=\"button\"\n (click)=\"closeDialog()\"\n >\n {{ 'cancel' | translate }}\n </button>\n </aui-dialog-footer>\n</form>\n" }] }], () => [{ type: i1.MessageService }, { type: i1.NotificationService }, { type: i1.DialogRef, decorators: [{ type: Optional }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DIALOG_DATA] }] }], { context: [{ type: Input }], type: [{ type: Input }], title: [{ type: Input }], resourceName: [{ type: Input }], deleteTips: [{ type: Input }], confirmTips: [{ type: Input }], extraConfirmTips: [{ type: Input }], confirmText: [{ type: Input }], deleteResourceApi: [{ type: Input }], deleteResourceParams: [{ type: Input }], deleteSuccessMsg: [{ type: Input }], deleteFailMsg: [{ type: Input }], // eslint-disable-next-line @angular-eslint/no-output-native close: [{ type: Output }], deleteTipTemplate: [{ type: ContentChild, args: [ConfirmDeleteTipDirective, { read: TemplateRef, }] }], contentTemplate: [{ type: ContentChild, args: [ConfirmDeleteContentDirective, { read: TemplateRef, }] }], labelTemplate: [{ type: ContentChild, args: [ConfirmDeleteLabelDirective, { read: TemplateRef, }] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConfirmDeleteComponent, { className: "ConfirmDeleteComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kZWxldGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3dpZGdldC9jb25maXJtLWRlbGV0ZS9jb25maXJtLWRlbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvd2lkZ2V0L2NvbmZpcm0tZGVsZXRlL2NvbmZpcm0tZGVsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxFQUNILFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCxPQUFPLEVBQXdDLFVBQVUsRUFBRSxNQUFN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ZUFBZTtvQkFDZixXQUFXO29CQUNYLFdBQVc7b0JBQ1gsVUFBVTtvQkFDVixJQUFJO29CQUNKLGdCQUFnQjtvQkFDaEIsVUFBVTtvQkFDVixTQUFTO29CQUNULHFCQUFxQjtpQkFDdEIsY0FDVyxJQUFJOztzQkFtRmIsUUFBUTs7c0JBRVIsUUFBUTs7c0JBQ1IsTUFBTTt1QkFBQyxXQUFXO3FCQWhGckIsT0FBTztrQkFETixLQUFLO1lBSU4sSUFBSTtrQkFESCxLQUFLO1lBSU4sS0FBSztrQkFESixLQUFLO1lBSU4sWUFBWTtrQkFEWCxLQUFLO1lBSU4sVUFBVTtrQkFEVCxLQUFLO1lBSU4sV0FBVztrQkFEVixLQUFLO1lBSU4sZ0JBQWdCO2tCQURmLEtBQUs7WUFJTixXQUFXO2tCQURWLEtBQUs7WUFJTixpQkFBaUI7a0JBRGhCLEtBQUs7WUFJTixvQkFBb0I7a0JBRG5CLEtBQUs7WUFJTixnQkFBZ0I7a0JBRGYsS0FBSztZQUlOLGFBQWE7a0JBRFosS0FBSzs7SUFJTiw0REFBNEQ7SUFDNUQsS0FBSztrQkFGSixNQUFNO1lBT1AsaUJBQWlCO2tCQUhoQixZQUFZO21CQUFDLHlCQUF5QixFQUFFO29CQUN2QyxJQUFJLEVBQUUsV0FBVztpQkFDbEI7WUFNRCxlQUFlO2tCQUhkLFlBQVk7bUJBQUMsNkJBQTZCLEVBQUU7b0JBQzNDLElBQUksRUFBRSxXQUFXO2lCQUNsQjtZQU1ELGFBQWE7a0JBSFosWUFBWTttQkFBQywyQkFBMkIsRUFBRTtvQkFDekMsSUFBSSxFQUFFLFdBQVc7aUJBQ2xCOztrRkF2RFUsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnV0dG9uTW9kdWxlLFxuICBESUFMT0dfREFUQSxcbiAgRGlhbG9nTW9kdWxlLFxuICBEaWFsb2dSZWYsXG4gIEZvcm1Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxuICBNZXNzYWdlU2VydmljZSxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZnJvbSxcbiAgU3ViamVjdCxcbiAgZmluYWxpemUsXG4gIG1hcCxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWZmZWN0RGlyZWN0aXZlTW9kdWxlIH0gZnJvbSAnLi4vLi4vZWZmZWN0LWRpcmVjdGl2ZS9tb2R1bGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL3B1YmxpYy1hcGknO1xuXG5pbXBvcnQgeyBDb25maXJtRGVsZXRlRGF0YSwgRGVsZXRlUmVzb3VyY2VBcGksIERlbGV0ZVR5cGUgfSBmcm9tICcuL3V0aWxzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FjbENvbmZpcm1EZWxldGVUaXBdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlybURlbGV0ZVRpcERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge31cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW2FjbENvbmZpcm1EZWxldGVDb250ZW50XScsXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1EZWxldGVDb250ZW50RGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7fVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbYWNsQ29uZmlybURlbGV0ZUxhYmVsXScsXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1EZWxldGVMYWJlbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge31cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLWNvbmZpcm0tZGVsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpcm0tZGVsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgRGlhbG9nTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBOZ0lmLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgRm9ybU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgRWZmZWN0RGlyZWN0aXZlTW9kdWxlLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb25maXJtRGVsZXRlQ29tcG9uZW50PFAgPSB1bmtub3duLCBSID0gdW5rbm93bj5cbiAgaW1wbGVtZW50cyBDb25maXJtRGVsZXRlRGF0YTxQLCBSPiwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIGNvbnRleHQ/OiB1bmtub3duO1xuXG4gIEBJbnB1dCgpXG4gIHR5cGU6IERlbGV0ZVR5cGUgPSBEZWxldGVUeXBlLkRFTEVURTtcblxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHJlc291cmNlTmFtZTogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgQElucHV0KClcbiAgZGVsZXRlVGlwcz86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBjb25maXJtVGlwcz86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBleHRyYUNvbmZpcm1UaXBzPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGNvbmZpcm1UZXh0Pzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGRlbGV0ZVJlc291cmNlQXBpOiBEZWxldGVSZXNvdXJjZUFwaTxQLCBSPjtcblxuICBASW5wdXQoKVxuICBkZWxldGVSZXNvdXJjZVBhcmFtcz86IFA7XG5cbiAgQElucHV0KClcbiAgZGVsZXRlU3VjY2Vzc01zZzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGRlbGV0ZUZhaWxNc2c6IHN0cmluZztcblxuICBAT3V0cHV0KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxSPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoQ29uZmlybURlbGV0ZVRpcERpcmVjdGl2ZSwge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBkZWxldGVUaXBUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAQ29udGVudENoaWxkKENvbmZpcm1EZWxldGVDb250ZW50RGlyZWN0aXZlLCB7XG4gICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gIH0pXG4gIGNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAQ29udGVudENoaWxkKENvbmZpcm1EZWxldGVMYWJlbERpcmVjdGl2ZSwge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBsYWJlbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGlucHV0VmFsdWUgPSAnJztcblxuICBpbnB1dFZhbHVlJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuaW5wdXRWYWx1ZSk7XG5cbiAgZGVsZXRpbmckJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIGRpc2FibGVkJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaW5wdXRWYWx1ZSQkLCB0aGlzLmRlbGV0aW5nJCRdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0VmFsdWUsIGRlbGV0aW5nXSkgPT4ge1xuICAgICAgY29uc3QgeyByZXNvdXJjZU5hbWUgfSA9IHRoaXM7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBkZWxldGluZyB8fFxuICAgICAgICAhKEFycmF5LmlzQXJyYXkocmVzb3VyY2VOYW1lKVxuICAgICAgICAgID8gcmVzb3VyY2VOYW1lLmluY2x1ZGVzKGlucHV0VmFsdWUpXG4gICAgICAgICAgOiBpbnB1dFZhbHVlID09PSByZXNvdXJjZU5hbWUpXG4gICAgICApO1xuICAgIH0pLFxuICApO1xuXG4gIGRlc3Ryb3kkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmPzogRGlhbG9nUmVmPENvbmZpcm1EZWxldGVDb21wb25lbnQ8UCwgUj4sIFI+LFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChESUFMT0dfREFUQSlcbiAgICBwdWJsaWMgZGF0YT86IENvbmZpcm1EZWxldGVEYXRhPFAsIFI+LFxuICApIHtcbiAgICB0aGlzLnJlc29sdmVEYXRhKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uQ29uZmlybSgpIHtcbiAgICB0aGlzLmRlbGV0aW5nJCQubmV4dCh0cnVlKTtcbiAgICBjb25zdCBjb21wbGV0ZWQkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgZnJvbShcbiAgICAgIHRoaXMuZGVsZXRlUmVzb3VyY2VBcGkuY2FsbChcbiAgICAgICAgdGhpcy5jb250ZXh0LFxuICAgICAgICB0aGlzLmlucHV0VmFsdWUsXG4gICAgICAgIHRoaXMuZGVsZXRlUmVzb3VyY2VQYXJhbXMsXG4gICAgICApLFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmRlbGV0aW5nJCQubmV4dChmYWxzZSkpLFxuICAgICAgICB0YWtlVW50aWwoY29tcGxldGVkJCQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVsZXRlU3VjY2Vzc01zZykge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnN1Y2Nlc3ModGhpcy5kZWxldGVTdWNjZXNzTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbG9zZURpYWxvZyhyZXN1bHQpO1xuICAgICAgICAgIGNvbXBsZXRlZCQkLm5leHQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZUZhaWxNc2cpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uLmVycm9yKHtcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZGVsZXRlRmFpbE1zZyxcbiAgICAgICAgICAgICAgY29udGVudDogZ2V0KGUuZXJyb3IsICdtZXNzYWdlJywgZS5tZXNzYWdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wbGV0ZWQkJC5uZXh0KCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlRGlhbG9nKHJlc3VsdD86IFIpIHtcbiAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UuZW1pdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZURhdGEoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdGhpc1trZXkgYXMga2V5b2YgQ29uZmlybURlbGV0ZURhdGE8UCwgUj5dID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmb3JtIChuZ1N1Ym1pdCk9XCJvbkNvbmZpcm0oKVwiPlxuICA8YXVpLWRpYWxvZy1oZWFkZXI+XG4gICAgPGF1aS1pY29uXG4gICAgICBpY29uPVwiZXhjbGFtYXRpb25fdHJpYW5nbGVfc1wiXG4gICAgICBiYWNrZ3JvdW5kPVwidHJpYW5nbGVcIlxuICAgICAgc2l6ZT1cIjIyXCJcbiAgICA+PC9hdWktaWNvbj5cbiAgICB7eyB0aXRsZSB9fVxuICA8L2F1aS1kaWFsb2ctaGVhZGVyPlxuICA8YXVpLWRpYWxvZy1jb250ZW50PlxuICAgIDxwIGNsYXNzPVwidHctbXQtMCB0dy1tYi0xMiB0dy10ZXh0LW1haW4tdGV4dFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlbGV0ZVRpcHNcIj57eyBkZWxldGVUaXBzIH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVsZXRlVGlwVGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZVRpcFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3A+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJ0dy1tYi00IHR3LXRleHQtbWFpbi10ZXh0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFiZWxUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGFiZWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhYmVsVGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpcm1UaXBzXCI+XG4gICAgICAgICAge3sgY29uZmlybVRpcHMgfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29uZmlybVRpcHNcIj5cbiAgICAgICAgICB7eyAncGxlYXNlX2VudGVyX2V4dHJhJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctdGV4dC1yZWRcIj57eyByZXNvdXJjZU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAge3sgJ2V4dHJhX2RldGVybWluZV8nICsgdHlwZSB8IHRyYW5zbGF0ZVxuICAgICAgICAgIH19e3sgZXh0cmFDb25maXJtVGlwcyA/ICgncGVyaW9kX3N5bWJvbCcgfCB0cmFuc2xhdGUpIDogbnVsbFxuICAgICAgICAgIH19e3sgZXh0cmFDb25maXJtVGlwcyB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICBhdWktaW5wdXRcbiAgICAgIG5hbWU9XCJyZXNvdXJjZS1uYW1lXCJcbiAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJpbnB1dFZhbHVlJCQubmV4dCgkZXZlbnQpXCJcbiAgICAvPlxuICA8L2F1aS1kaWFsb2ctY29udGVudD5cbiAgPGF1aS1kaWFsb2ctZm9vdGVyPlxuICAgIDxidXR0b25cbiAgICAgIGF1aS1idXR0b249XCJkYW5nZXJcIlxuICAgICAgW2xvYWRpbmddPVwiZGVsZXRpbmckJCB8IGFzeW5jXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCQgfCBhc3luY1wiXG4gICAgPlxuICAgICAge3sgY29uZmlybVRleHQgfHwgdHlwZSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGF1aS1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIlxuICAgID5cbiAgICAgIHt7ICdjYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvYXVpLWRpYWxvZy1mb290ZXI+XG48L2Zvcm0+XG4iXX0=