@seniorsistemas/components-ai 0.0.0-master-e597799c → 0.0.0-master-1723005a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.mjs +17 -23
- package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +5 -5
- package/esm2022/lib/components/export-dialog/export-dialog.component.mjs +27 -33
- package/esm2022/lib/i18n/en-US.json +4 -5
- package/esm2022/lib/i18n/es-ES.json +4 -5
- package/esm2022/lib/i18n/pt-BR.json +4 -5
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/seniorsistemas-components-ai.mjs +158 -175
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -1
- package/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.d.ts +4 -7
- package/lib/components/export-dialog/export-dialog.component.d.ts +4 -7
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/lib/i18n/en-US.json +4 -5
- package/src/lib/i18n/es-ES.json +4 -5
- package/src/lib/i18n/pt-BR.json +4 -5
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { DialogModule } from 'primeng/dialog';
|
|
4
4
|
import { ButtonModule } from 'primeng/button';
|
|
5
5
|
import { ProgressBarModule } from 'primeng/progressbar';
|
|
6
6
|
import { TagModule } from 'primeng/tag';
|
|
7
7
|
import { catchError, concatMap, from, of } from 'rxjs';
|
|
8
|
-
import {
|
|
8
|
+
import { TranslatePipe } from '../../pipes/translate.pipe';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "
|
|
11
|
-
import * as i2 from "primeng/
|
|
12
|
-
import * as i3 from "primeng/
|
|
13
|
-
import * as i4 from "primeng/
|
|
14
|
-
import * as i5 from "primeng/
|
|
10
|
+
import * as i1 from "../../services/translation.service";
|
|
11
|
+
import * as i2 from "primeng/dialog";
|
|
12
|
+
import * as i3 from "primeng/api";
|
|
13
|
+
import * as i4 from "primeng/button";
|
|
14
|
+
import * as i5 from "primeng/progressbar";
|
|
15
|
+
import * as i6 from "primeng/tag";
|
|
15
16
|
export class BulkDeleteDialogComponent {
|
|
16
17
|
translationService;
|
|
17
18
|
visible = false;
|
|
@@ -31,9 +32,6 @@ export class BulkDeleteDialogComponent {
|
|
|
31
32
|
constructor(translationService) {
|
|
32
33
|
this.translationService = translationService;
|
|
33
34
|
}
|
|
34
|
-
t(key, params) {
|
|
35
|
-
return TranslationHelper.translate(this.translationService, key, params);
|
|
36
|
-
}
|
|
37
35
|
ngOnChanges() {
|
|
38
36
|
if (this.visible && this.stages.length > 0) {
|
|
39
37
|
this.initializeStatuses();
|
|
@@ -82,7 +80,7 @@ export class BulkDeleteDialogComponent {
|
|
|
82
80
|
}
|
|
83
81
|
else {
|
|
84
82
|
deleteStatus.status = 'error';
|
|
85
|
-
deleteStatus.errorMessage = error?.message || error?.statusText || this.
|
|
83
|
+
deleteStatus.errorMessage = error?.message || error?.statusText || this.translationService.translate('design.components_ai.bulk_delete_error_generic');
|
|
86
84
|
this.errorCount++;
|
|
87
85
|
}
|
|
88
86
|
return of(null);
|
|
@@ -118,7 +116,7 @@ export class BulkDeleteDialogComponent {
|
|
|
118
116
|
}
|
|
119
117
|
}
|
|
120
118
|
getStatusLabel(status) {
|
|
121
|
-
return this.
|
|
119
|
+
return this.translationService.translate(`design.components_ai.bulk_delete_status_${status}`);
|
|
122
120
|
}
|
|
123
121
|
getStatusIcon(status) {
|
|
124
122
|
switch (status) {
|
|
@@ -129,8 +127,8 @@ export class BulkDeleteDialogComponent {
|
|
|
129
127
|
default: return 'pi pi-question';
|
|
130
128
|
}
|
|
131
129
|
}
|
|
132
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, deps: [{ token:
|
|
133
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BulkDeleteDialogComponent, isStandalone: true, selector: "sia-bulk-delete-dialog", inputs: { visible: "visible", stages: "stages", service: "service", entityNameField: "entityNameField", entityCodeField: "entityCodeField", translationPrefix: "translationPrefix" }, outputs: { visibleChange: "visibleChange", onComplete: "onComplete" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ t('bulk_delete_title') }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"t('bulk_delete_warning', { count: stages.length })\"></span>\n </p>\n <p class=\"summary-description\">\n {{ t('bulk_delete_description') }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ t('bulk_delete_progress') }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ t('bulk_delete_success_count') }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ t('bulk_delete_error_count') }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ t('bulk_delete_code_label') }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ t('bulk_delete_success_message') }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ t('bulk_delete_completed_with_errors', { count: errorCount }) }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"t('cancel')\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"t('bulk_delete_confirm')\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"t('close')\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i4.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i5.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }] });
|
|
130
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
131
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BulkDeleteDialogComponent, isStandalone: true, selector: "sia-bulk-delete-dialog", inputs: { visible: "visible", stages: "stages", service: "service", entityNameField: "entityNameField", entityCodeField: "entityCodeField", translationPrefix: "translationPrefix" }, outputs: { visibleChange: "visibleChange", onComplete: "onComplete" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ 'design.components_ai.bulk_delete_title' | translate }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"'design.components_ai.bulk_delete_warning' | translate:{ count: stages.length }\"></span>\n </p>\n <p class=\"summary-description\">\n {{ 'design.components_ai.bulk_delete_description' | translate }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ 'design.components_ai.bulk_delete_progress' | translate }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ 'design.components_ai.bulk_delete_success_count' | translate }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ 'design.components_ai.bulk_delete_error_count' | translate }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ 'design.components_ai.bulk_delete_code_label' | translate }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_success_message' | translate }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_completed_with_errors' | translate:{ count: errorCount } }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.bulk_delete_confirm' | translate\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"'design.components_ai.close' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i5.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i6.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
134
132
|
}
|
|
135
133
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BulkDeleteDialogComponent, decorators: [{
|
|
136
134
|
type: Component,
|
|
@@ -139,14 +137,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
139
137
|
DialogModule,
|
|
140
138
|
ButtonModule,
|
|
141
139
|
ProgressBarModule,
|
|
142
|
-
TagModule
|
|
143
|
-
|
|
144
|
-
}]
|
|
145
|
-
|
|
146
|
-
}, {
|
|
147
|
-
type: Inject,
|
|
148
|
-
args: ['TranslationService']
|
|
149
|
-
}] }], propDecorators: { visible: [{
|
|
140
|
+
TagModule,
|
|
141
|
+
TranslatePipe
|
|
142
|
+
], template: "<p-dialog\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [closable]=\"canClose\"\n [closeOnEscape]=\"canClose\"\n [dismissableMask]=\"false\"\n [style]=\"{ width: '700px', maxWidth: '90vw' }\"\n (onHide)=\"onHide()\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"dialog-header\">\n <i class=\"pi pi-trash header-icon\"></i>\n <h2>{{ 'design.components_ai.bulk_delete_title' | translate }}</h2>\n </div>\n </ng-template>\n\n <div class=\"dialog-content\">\n <!-- Summary -->\n @if (!isProcessing && !isCompleted) {\n <div class=\"summary-section\">\n <p class=\"summary-text\">\n <i class=\"pi pi-exclamation-triangle warning-icon\"></i>\n <span [innerHTML]=\"'design.components_ai.bulk_delete_warning' | translate:{ count: stages.length }\"></span>\n </p>\n <p class=\"summary-description\">\n {{ 'design.components_ai.bulk_delete_description' | translate }}\n </p>\n </div>\n }\n\n <!-- Progress Bar -->\n @if (isProcessing || isCompleted) {\n <div class=\"progress-section\">\n <div class=\"progress-info\">\n <span class=\"progress-label\">{{ 'design.components_ai.bulk_delete_progress' | translate }}</span>\n <span class=\"progress-count\">{{ currentIndex }} / {{ deleteStatuses.length }}</span>\n </div>\n <p-progressBar \n [value]=\"progress\" \n [showValue]=\"false\"\n styleClass=\"custom-progress\"\n ></p-progressBar>\n \n <div class=\"progress-stats\">\n <div class=\"stat success\">\n <i class=\"pi pi-check-circle\"></i>\n <span>{{ successCount }} {{ 'design.components_ai.bulk_delete_success_count' | translate }}</span>\n </div>\n @if (errorCount > 0) {\n <div class=\"stat error\">\n <i class=\"pi pi-times-circle\"></i>\n <span>{{ errorCount }} {{ 'design.components_ai.bulk_delete_error_count' | translate }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Status List -->\n @if (isProcessing || isCompleted) {\n <div class=\"status-list\">\n @for (item of deleteStatuses; track item.entity) {\n <div class=\"status-item\">\n <div class=\"status-info\">\n <i [class]=\"getStatusIcon(item.status)\" class=\"status-icon\"></i>\n <div class=\"status-details\">\n <span class=\"stage-name\">{{ item.entity[entityNameField] }}</span>\n @if (item.entity[entityCodeField]) {\n <span class=\"stage-code\">{{ 'design.components_ai.bulk_delete_code_label' | translate }}: {{ item.entity[entityCodeField] }}</span>\n }\n </div>\n </div>\n <div class=\"status-badge\">\n <p-tag \n [value]=\"getStatusLabel(item.status)\" \n [severity]=\"getStatusSeverity(item.status)\"\n >\n @if (item.status === 'processing') {\n <i class=\"pi pi-spin pi-spinner\"></i>\n }\n </p-tag>\n @if (item.status === 'error' && item.errorMessage) {\n <small class=\"error-message\">\n {{ item.errorMessage }}\n </small>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Completion Message -->\n @if (isCompleted) {\n <div class=\"completion-section\">\n <div class=\"completion-message\" [class.has-errors]=\"errorCount > 0\">\n <i [class]=\"errorCount > 0 ? 'pi pi-exclamation-circle' : 'pi pi-check-circle'\" class=\"completion-icon\"></i>\n @if (errorCount === 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_success_message' | translate }}\n </p>\n }\n @if (errorCount > 0) {\n <p>\n {{ 'design.components_ai.bulk_delete_completed_with_errors' | translate:{ count: errorCount } }}\n </p>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"dialog-footer\">\n @if (!isProcessing && !isCompleted) {\n <p-button\n [label]=\"'design.components_ai.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onClose()\"\n ></p-button>\n <p-button\n [label]=\"'design.components_ai.bulk_delete_confirm' | translate\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n (onClick)=\"startDeletion()\"\n ></p-button>\n }\n @if (isCompleted) {\n <p-button\n [label]=\"'design.components_ai.close' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onClose()\"\n ></p-button>\n }\n </div>\n </ng-template>\n</p-dialog>\n", styles: [".dialog-header{display:flex;align-items:center;gap:12px}.dialog-header .header-icon{font-size:24px;color:#ef4444}.dialog-header h2{margin:0;font-size:20px;font-weight:700;color:var(--neutral-color-800)}.dialog-content{padding:8px 0}.summary-section{padding:20px;background:linear-gradient(135deg,#fef3c7,#fde68a);border-radius:12px;border:1px solid #fbbf24;margin-bottom:24px}.summary-section .summary-text{display:flex;align-items:center;gap:12px;margin:0 0 12px;font-size:16px;color:var(--neutral-color-800)}.summary-section .summary-text .warning-icon{font-size:24px;color:#f59e0b}.summary-section .summary-text strong{color:#d97706}.summary-section .summary-description{margin:0;font-size:14px;color:var(--neutral-color-600);padding-left:36px}.progress-section{margin-bottom:24px}.progress-section .progress-info{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-section .progress-info .progress-label{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.progress-section .progress-info .progress-count{font-size:14px;color:var(--neutral-color-600);font-weight:500}.progress-section .progress-stats{display:flex;gap:20px;margin-top:12px}.progress-section .progress-stats .stat{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500}.progress-section .progress-stats .stat.success{color:#10b981}.progress-section .progress-stats .stat.success i{font-size:18px}.progress-section .progress-stats .stat.error{color:#ef4444}.progress-section .progress-stats .stat.error i{font-size:18px}.status-list{max-height:400px;overflow-y:auto;border:1px solid var(--p-surface-200);border-radius:12px;padding:12px;background-color:#fafafa}.status-list .status-item{display:flex;justify-content:space-between;align-items:center;padding:12px;background-color:#fff;border-radius:8px;margin-bottom:8px;transition:all .2s ease}.status-list .status-item:last-child{margin-bottom:0}.status-list .status-item:hover{box-shadow:0 2px 8px #00000014}.status-list .status-item .status-info{display:flex;align-items:center;gap:12px;flex:1}.status-list .status-item .status-info .status-icon{font-size:20px}.status-list .status-item .status-info .status-icon.pi-clock{color:var(--neutral-color-400)}.status-list .status-item .status-info .status-icon.pi-spinner{color:#3b82f6}.status-list .status-item .status-info .status-icon.pi-check{color:#10b981}.status-list .status-item .status-info .status-icon.pi-times{color:#ef4444}.status-list .status-item .status-info .status-details{display:flex;flex-direction:column;gap:4px}.status-list .status-item .status-info .status-details .stage-name{font-weight:600;font-size:14px;color:var(--neutral-color-800)}.status-list .status-item .status-info .status-details .stage-code{font-size:12px;color:var(--neutral-color-500)}.status-list .status-item .status-badge{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.status-list .status-item .status-badge .error-message{font-size:11px;color:#ef4444;max-width:200px;text-align:right}.completion-section{margin-top:24px}.completion-section .completion-message{padding:20px;background:linear-gradient(135deg,#d1fae5,#a7f3d0);border-radius:12px;border:1px solid #10b981;display:flex;align-items:center;gap:16px}.completion-section .completion-message.has-errors{background:linear-gradient(135deg,#fee2e2,#fecaca);border-color:#ef4444}.completion-section .completion-message.has-errors .completion-icon{color:#ef4444}.completion-section .completion-message .completion-icon{font-size:32px;color:#10b981}.completion-section .completion-message p{margin:0;font-size:16px;font-weight:600;color:var(--neutral-color-800)}.dialog-footer{display:flex;justify-content:flex-end;gap:12px}::ng-deep .custom-progress{height:12px;border-radius:6px}::ng-deep .custom-progress .p-progressbar-value{background:linear-gradient(90deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);border-radius:6px}.status-list::-webkit-scrollbar{width:8px}.status-list::-webkit-scrollbar-track{background:var(--p-surface-100);border-radius:4px}.status-list::-webkit-scrollbar-thumb{background:var(--neutral-color-400);border-radius:4px}.status-list::-webkit-scrollbar-thumb:hover{background:var(--neutral-color-500)}\n"] }]
|
|
143
|
+
}], ctorParameters: () => [{ type: i1.TranslationService }], propDecorators: { visible: [{
|
|
150
144
|
type: Input
|
|
151
145
|
}], stages: [{
|
|
152
146
|
type: Input
|
|
@@ -163,4 +157,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
163
157
|
}], onComplete: [{
|
|
164
158
|
type: Output
|
|
165
159
|
}] } });
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2J1bGstZGVsZXRlLWRpYWxvZy9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvYnVsay1kZWxldGUtZGlhbG9nL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7O0FBK0JuRSxNQUFNLE9BQU8seUJBQXlCO0lBaUIwQjtJQWhCckQsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixNQUFNLEdBQVUsRUFBRSxDQUFDLENBQUMsbUJBQW1CO0lBQ3ZDLE9BQU8sQ0FBaUIsQ0FBQyxrQkFBa0I7SUFDM0MsZUFBZSxHQUFXLE1BQU0s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LGNBQ3RCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLFNBQVM7cUJBQ1Y7OzBCQXFCWSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjt5Q0FoQjNDLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIE9uQ2hhbmdlcywgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9wcm9ncmVzc2Jhcic7XG5pbXBvcnQgeyBUYWdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhZyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBjb25jYXRNYXAsIGZyb20sIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbkhlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9uLmhlbHBlcic7XG5cbmludGVyZmFjZSBEZWxldGVTdGF0dXMge1xuICBlbnRpdHk6IGFueTtcbiAgc3RhdHVzOiAncGVuZGluZycgfCAncHJvY2Vzc2luZycgfCAnc3VjY2VzcycgfCAnZXJyb3InO1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8vIEludGVyZmFjZSBwYXJhIG8gc2VydmnDp28gZGUgZW50aWRhZGUgKGR1Y2sgdHlwaW5nKVxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTZXJ2aWNlIHtcbiAgZGVsZXRlKGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT47XG59XG5cbi8vIEludGVyZmFjZSBwYXJhIG8gc2VydmnDp28gZGUgdHJhZHXDp8OjbyAoZHVjayB0eXBpbmcpXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uU2VydmljZSB7XG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgcGFyYW1zPzogYW55KTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtYnVsay1kZWxldGUtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFByb2dyZXNzQmFyTW9kdWxlLFxuICAgIFRhZ01vZHVsZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQnVsa0RlbGV0ZURpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc3RhZ2VzOiBhbnlbXSA9IFtdOyAvLyBHZW5lcmljIGVudGl0aWVzXG4gIEBJbnB1dCgpIHNlcnZpY2UhOiBFbnRpdHlTZXJ2aWNlOyAvLyBHZW5lcmljIHNlcnZpY2VcbiAgQElucHV0KCkgZW50aXR5TmFtZUZpZWxkOiBzdHJpbmcgPSAnbmFtZSc7IC8vIEZpZWxkIHRvIGRpc3BsYXkgZW50aXR5IG5hbWVcbiAgQElucHV0KCkgZW50aXR5Q29kZUZpZWxkOiBzdHJpbmcgPSAnY29kZSc7IC8vIEZpZWxkIHRvIGRpc3BsYXkgZW50aXR5IGNvZGUgKG9wdGlvbmFsKVxuICBASW5wdXQoKSB0cmFuc2xhdGlvblByZWZpeDogc3RyaW5nID0gJ2Rlc2lnbi5jb21wb25lbnRzX2FpJztcbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGRlbGV0ZVN0YXR1c2VzOiBEZWxldGVTdGF0dXNbXSA9IFtdO1xuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudEluZGV4OiBudW1iZXIgPSAwO1xuICBzdWNjZXNzQ291bnQ6IG51bWJlciA9IDA7XG4gIGVycm9yQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdCgnVHJhbnNsYXRpb25TZXJ2aWNlJykgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U/OiBUcmFuc2xhdGlvblNlcnZpY2UpIHt9XG5cbiAgdChrZXk6IHN0cmluZywgcGFyYW1zPzogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25IZWxwZXIudHJhbnNsYXRlKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLCBrZXksIHBhcmFtcyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aXNpYmxlICYmIHRoaXMuc3RhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0YXR1c2VzKCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0YXR1c2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlU3RhdHVzZXMgPSB0aGlzLnN0YWdlcy5tYXAoZW50aXR5ID0+ICh7XG4gICAgICBlbnRpdHksXG4gICAgICBzdGF0dXM6ICdwZW5kaW5nJ1xuICAgIH0pKTtcbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5zdWNjZXNzQ291bnQgPSAwO1xuICAgIHRoaXMuZXJyb3JDb3VudCA9IDA7XG4gIH1cblxuICBnZXQgcHJvZ3Jlc3MoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5kZWxldGVTdGF0dXNlcy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0aGlzLmN1cnJlbnRJbmRleCAvIHRoaXMuZGVsZXRlU3RhdHVzZXMubGVuZ3RoKSAqIDEwMCk7XG4gIH1cblxuICBnZXQgY2FuQ2xvc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzUHJvY2Vzc2luZyB8fCB0aGlzLmlzQ29tcGxldGVkO1xuICB9XG5cbiAgc3RhcnREZWxldGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VydmljZSkge1xuICAgICAgY29uc29sZS5lcnJvcignU2VydmljZSBub3QgcHJvdmlkZWQgdG8gQnVsa0RlbGV0ZURpYWxvZ0NvbXBvbmVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmlzQ29tcGxldGVkID0gZmFsc2U7XG5cbiAgICAvLyBQcm9jZXNzIGRlbGV0aW9ucyBzZXF1ZW50aWFsbHlcbiAgICBmcm9tKHRoaXMuZGVsZXRlU3RhdHVzZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgY29uY2F0TWFwKChkZWxldGVTdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBkZWxldGVTdGF0dXMuc3RhdHVzID0gJ3Byb2Nlc3NpbmcnO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZGVsZXRlKGRlbGV0ZVN0YXR1cy5lbnRpdHkuaWQpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICBkZWxldGVTdGF0dXMuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3NDb3VudCsrO1xuICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhY3R1YWxseSBhIHN1Y2Nlc3MgKDIwNCBObyBDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gMjA0KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzLnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3NDb3VudCsrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVN0YXR1cy5zdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgIGRlbGV0ZVN0YXR1cy5lcnJvck1lc3NhZ2UgPSBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8uc3RhdHVzVGV4dCB8fCB0aGlzLnQoJ2J1bGtfZGVsZXRlX2Vycm9yX2dlbmVyaWMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmRlbGV0ZVN0YXR1c2VzLmxlbmd0aDtcbiAgICAgICAgICB0aGlzLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uSGlkZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuQ2xvc2UpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQgJiYgdGhpcy5zdWNjZXNzQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkhpZGUoKTtcbiAgfVxuXG4gIGdldFN0YXR1c1NldmVyaXR5KHN0YXR1czogc3RyaW5nKTogJ3NlY29uZGFyeScgfCAnaW5mbycgfCAnc3VjY2VzcycgfCAnZGFuZ2VyJyB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3BlbmRpbmcnOiByZXR1cm4gJ3NlY29uZGFyeSc7XG4gICAgICBjYXNlICdwcm9jZXNzaW5nJzogcmV0dXJuICdpbmZvJztcbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiByZXR1cm4gJ3N1Y2Nlc3MnO1xuICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gJ2Rhbmdlcic7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3NlY29uZGFyeSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzTGFiZWwoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnQoYGJ1bGtfZGVsZXRlX3N0YXR1c18ke3N0YXR1c31gKTtcbiAgfVxuXG4gIGdldFN0YXR1c0ljb24oc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdwZW5kaW5nJzogcmV0dXJuICdwaSBwaS1jbG9jayc7XG4gICAgICBjYXNlICdwcm9jZXNzaW5nJzogcmV0dXJuICdwaSBwaS1zcGluIHBpLXNwaW5uZXInO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHJldHVybiAncGkgcGktY2hlY2snO1xuICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gJ3BpIHBpLXRpbWVzJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAncGkgcGktcXVlc3Rpb24nO1xuICAgIH1cbiAgfVxufVxuIiwiPHAtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgW2Nsb3NhYmxlXT1cImNhbkNsb3NlXCJcbiAgW2Nsb3NlT25Fc2NhcGVdPVwiY2FuQ2xvc2VcIlxuICBbZGlzbWlzc2FibGVNYXNrXT1cImZhbHNlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc3MDBweCcsIG1heFdpZHRoOiAnOTB2dycgfVwiXG4gIChvbkhpZGUpPVwib25IaWRlKClcIlxuPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktdHJhc2ggaGVhZGVyLWljb25cIj48L2k+XG4gICAgICA8aDI+e3sgdCgnYnVsa19kZWxldGVfdGl0bGUnKSB9fTwvaDI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XG4gICAgPCEtLSBTdW1tYXJ5IC0tPlxuICAgIEBpZiAoIWlzUHJvY2Vzc2luZyAmJiAhaXNDb21wbGV0ZWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXNlY3Rpb25cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LXRleHRcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIHdhcm5pbmctaWNvblwiPjwvaT5cbiAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInQoJ2J1bGtfZGVsZXRlX3dhcm5pbmcnLCB7IGNvdW50OiBzdGFnZXMubGVuZ3RoIH0pXCI+PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwic3VtbWFyeS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIHt7IHQoJ2J1bGtfZGVsZXRlX2Rlc2NyaXB0aW9uJykgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBQcm9ncmVzcyBCYXIgLS0+XG4gICAgQGlmIChpc1Byb2Nlc3NpbmcgfHwgaXNDb21wbGV0ZWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1pbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9ncmVzcy1sYWJlbFwiPnt7IHQoJ2J1bGtfZGVsZXRlX3Byb2dyZXNzJykgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9ncmVzcy1jb3VudFwiPnt7IGN1cnJlbnRJbmRleCB9fSAvIHt7IGRlbGV0ZVN0YXR1c2VzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLXByb2dyZXNzQmFyIFxuICAgICAgICAgIFt2YWx1ZV09XCJwcm9ncmVzc1wiIFxuICAgICAgICAgIFtzaG93VmFsdWVdPVwiZmFsc2VcIlxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJjdXN0b20tcHJvZ3Jlc3NcIlxuICAgICAgICA+PC9wLXByb2dyZXNzQmFyPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLXN0YXRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQgc3VjY2Vzc1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGVjay1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyBzdWNjZXNzQ291bnQgfX0ge3sgdCgnYnVsa19kZWxldGVfc3VjY2Vzc19jb3VudCcpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAoZXJyb3JDb3VudCA+IDApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0IGVycm9yXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdGltZXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBlcnJvckNvdW50IH19IHt7IHQoJ2J1bGtfZGVsZXRlX2Vycm9yX2NvdW50JykgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBTdGF0dXMgTGlzdCAtLT5cbiAgICBAaWYgKGlzUHJvY2Vzc2luZyB8fCBpc0NvbXBsZXRlZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1saXN0XCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgZGVsZXRlU3RhdHVzZXM7IHRyYWNrIGl0ZW0uZW50aXR5KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pdGVtXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWluZm9cIj5cbiAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImdldFN0YXR1c0ljb24oaXRlbS5zdGF0dXMpXCIgY2xhc3M9XCJzdGF0dXMtaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFnZS1uYW1lXCI+e3sgaXRlbS5lbnRpdHlbZW50aXR5TmFtZUZpZWxkXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZW50aXR5W2VudGl0eUNvZGVGaWVsZF0pIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhZ2UtY29kZVwiPnt7IHQoJ2J1bGtfZGVsZXRlX2NvZGVfbGFiZWwnKSB9fToge3sgaXRlbS5lbnRpdHlbZW50aXR5Q29kZUZpZWxkXSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWJhZGdlXCI+XG4gICAgICAgICAgICAgIDxwLXRhZyBcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0U3RhdHVzTGFiZWwoaXRlbS5zdGF0dXMpXCIgXG4gICAgICAgICAgICAgICAgW3NldmVyaXR5XT1cImdldFN0YXR1c1NldmVyaXR5KGl0ZW0uc3RhdHVzKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uc3RhdHVzID09PSAncHJvY2Vzc2luZycpIHtcbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9wLXRhZz5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLnN0YXR1cyA9PT0gJ2Vycm9yJyAmJiBpdGVtLmVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZXJyb3JNZXNzYWdlIH19XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gQ29tcGxldGlvbiBNZXNzYWdlIC0tPlxuICAgIEBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0aW9uLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRpb24tbWVzc2FnZVwiIFtjbGFzcy5oYXMtZXJyb3JzXT1cImVycm9yQ291bnQgPiAwXCI+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cImVycm9yQ291bnQgPiAwID8gJ3BpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZScgOiAncGkgcGktY2hlY2stY2lyY2xlJ1wiIGNsYXNzPVwiY29tcGxldGlvbi1pY29uXCI+PC9pPlxuICAgICAgICAgIEBpZiAoZXJyb3JDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIHt7IHQoJ2J1bGtfZGVsZXRlX3N1Y2Nlc3NfbWVzc2FnZScpIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZXJyb3JDb3VudCA+IDApIHtcbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICB7eyB0KCdidWxrX2RlbGV0ZV9jb21wbGV0ZWRfd2l0aF9lcnJvcnMnLCB7IGNvdW50OiBlcnJvckNvdW50IH0pIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICBAaWYgKCFpc1Byb2Nlc3NpbmcgJiYgIWlzQ29tcGxldGVkKSB7XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdjYW5jZWwnKVwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgW291dGxpbmVkXT1cInRydWVcIlxuICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgID48L3AtYnV0dG9uPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwidCgnYnVsa19kZWxldGVfY29uZmlybScpXCJcbiAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcbiAgICAgICAgICAob25DbGljayk9XCJzdGFydERlbGV0aW9uKClcIlxuICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2Nsb3NlJylcIlxuICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgICAgPjwvcC1idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuIl19
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2J1bGstZGVsZXRlLWRpYWxvZy9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvYnVsay1kZWxldGUtZGlhbG9nL2J1bGstZGVsZXRlLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7O0FBNEIzRCxNQUFNLE9BQU8seUJBQXlCO0lBaUJoQjtJQWhCWCxPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLE1BQU0sR0FBVSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7SUFDdkMsT0FBTyxDQUFpQixDQUFDLGtCQUFrQjtJQUMzQyxlQUFlLEdBQVcsTUFBTSxDQUFDLENBQUMsK0JBQStCO0lBQ2pF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TTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcHJvZ3Jlc3NiYXInO1xuaW1wb3J0IHsgVGFnTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWcnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBmcm9tLCBvZiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3RyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgRGVsZXRlU3RhdHVzIHtcbiAgZW50aXR5OiBhbnk7XG4gIHN0YXR1czogJ3BlbmRpbmcnIHwgJ3Byb2Nlc3NpbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2Vycm9yJztcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vLyBJbnRlcmZhY2UgcGFyYSBvIHNlcnZpw6dvIGRlIGVudGlkYWRlIChkdWNrIHR5cGluZylcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2VydmljZSB7XG4gIGRlbGV0ZShpZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtYnVsay1kZWxldGUtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFByb2dyZXNzQmFyTW9kdWxlLFxuICAgIFRhZ01vZHVsZSxcbiAgICBUcmFuc2xhdGVQaXBlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9idWxrLWRlbGV0ZS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYnVsay1kZWxldGUtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCdWxrRGVsZXRlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdGFnZXM6IGFueVtdID0gW107IC8vIEdlbmVyaWMgZW50aXRpZXNcbiAgQElucHV0KCkgc2VydmljZSE6IEVudGl0eVNlcnZpY2U7IC8vIEdlbmVyaWMgc2VydmljZVxuICBASW5wdXQoKSBlbnRpdHlOYW1lRmllbGQ6IHN0cmluZyA9ICduYW1lJzsgLy8gRmllbGQgdG8gZGlzcGxheSBlbnRpdHkgbmFtZVxuICBASW5wdXQoKSBlbnRpdHlDb2RlRmllbGQ6IHN0cmluZyA9ICdjb2RlJzsgLy8gRmllbGQgdG8gZGlzcGxheSBlbnRpdHkgY29kZSAob3B0aW9uYWwpXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uUHJlZml4OiBzdHJpbmcgPSAnZGVzaWduLmNvbXBvbmVudHNfYWknO1xuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIG9uQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZGVsZXRlU3RhdHVzZXM6IERlbGV0ZVN0YXR1c1tdID0gW107XG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50SW5kZXg6IG51bWJlciA9IDA7XG4gIHN1Y2Nlc3NDb3VudDogbnVtYmVyID0gMDtcbiAgZXJyb3JDb3VudDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpc2libGUgJiYgdGhpcy5zdGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplU3RhdHVzZXMoKTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplU3RhdHVzZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVTdGF0dXNlcyA9IHRoaXMuc3RhZ2VzLm1hcChlbnRpdHkgPT4gKHtcbiAgICAgIGVudGl0eSxcbiAgICAgIHN0YXR1czogJ3BlbmRpbmcnXG4gICAgfSkpO1xuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLnN1Y2Nlc3NDb3VudCA9IDA7XG4gICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgfVxuXG4gIGdldCBwcm9ncmVzcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmRlbGV0ZVN0YXR1c2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuY3VycmVudEluZGV4IC8gdGhpcy5kZWxldGVTdGF0dXNlcy5sZW5ndGgpICogMTAwKTtcbiAgfVxuXG4gIGdldCBjYW5DbG9zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNQcm9jZXNzaW5nIHx8IHRoaXMuaXNDb21wbGV0ZWQ7XG4gIH1cblxuICBzdGFydERlbGV0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXJ2aWNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTZXJ2aWNlIG5vdCBwcm92aWRlZCB0byBCdWxrRGVsZXRlRGlhbG9nQ29tcG9uZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFByb2Nlc3MgZGVsZXRpb25zIHNlcXVlbnRpYWxseVxuICAgIGZyb20odGhpcy5kZWxldGVTdGF0dXNlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKGRlbGV0ZVN0YXR1cywgaW5kZXgpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIGRlbGV0ZVN0YXR1cy5zdGF0dXMgPSAncHJvY2Vzc2luZyc7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kZWxldGUoZGVsZXRlU3RhdHVzLmVudGl0eS5pZCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgIGRlbGV0ZVN0YXR1cy5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0NvdW50Kys7XG4gICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFjdHVhbGx5IGEgc3VjY2VzcyAoMjA0IE5vIENvbnRlbnQpXG4gICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSAyMDQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVTdGF0dXMuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0NvdW50Kys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzLnN0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzLmVycm9yTWVzc2FnZSA9IGVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5zdGF0dXNUZXh0IHx8IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfZXJyb3JfZ2VuZXJpYycpO1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuZGVsZXRlU3RhdHVzZXMubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25IaWRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5DbG9zZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCAmJiB0aGlzLnN1Y2Nlc3NDb3VudCA+IDApIHtcbiAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uSGlkZSgpO1xuICB9XG5cbiAgZ2V0U3RhdHVzU2V2ZXJpdHkoc3RhdHVzOiBzdHJpbmcpOiAnc2Vjb25kYXJ5JyB8ICdpbmZvJyB8ICdzdWNjZXNzJyB8ICdkYW5nZXInIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAncGVuZGluZyc6IHJldHVybiAnc2Vjb25kYXJ5JztcbiAgICAgIGNhc2UgJ3Byb2Nlc3NpbmcnOiByZXR1cm4gJ2luZm8nO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlICdlcnJvcic6IHJldHVybiAnZGFuZ2VyJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnc2Vjb25kYXJ5JztcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShgZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfc3RhdHVzXyR7c3RhdHVzfWApO1xuICB9XG5cbiAgZ2V0U3RhdHVzSWNvbihzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3BlbmRpbmcnOiByZXR1cm4gJ3BpIHBpLWNsb2NrJztcbiAgICAgIGNhc2UgJ3Byb2Nlc3NpbmcnOiByZXR1cm4gJ3BpIHBpLXNwaW4gcGktc3Bpbm5lcic7XG4gICAgICBjYXNlICdzdWNjZXNzJzogcmV0dXJuICdwaSBwaS1jaGVjayc7XG4gICAgICBjYXNlICdlcnJvcic6IHJldHVybiAncGkgcGktdGltZXMnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdwaSBwaS1xdWVzdGlvbic7XG4gICAgfVxuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJ2aXNpYmxlXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbY2xvc2FibGVdPVwiY2FuQ2xvc2VcIlxuICBbY2xvc2VPbkVzY2FwZV09XCJjYW5DbG9zZVwiXG4gIFtkaXNtaXNzYWJsZU1hc2tdPVwiZmFsc2VcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzcwMHB4JywgbWF4V2lkdGg6ICc5MHZ3JyB9XCJcbiAgKG9uSGlkZSk9XCJvbkhpZGUoKVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWhlYWRlclwiPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS10cmFzaCBoZWFkZXItaWNvblwiPjwvaT5cbiAgICAgIDxoMj57eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfdGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oMj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj5cbiAgICA8IS0tIFN1bW1hcnkgLS0+XG4gICAgQGlmICghaXNQcm9jZXNzaW5nICYmICFpc0NvbXBsZXRlZCkge1xuICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktc2VjdGlvblwiPlxuICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dFwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktZXhjbGFtYXRpb24tdHJpYW5nbGUgd2FybmluZy1pY29uXCI+PC9pPlxuICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmJ1bGtfZGVsZXRlX3dhcm5pbmcnIHwgdHJhbnNsYXRlOnsgY291bnQ6IHN0YWdlcy5sZW5ndGggfVwiPjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICB7eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gUHJvZ3Jlc3MgQmFyIC0tPlxuICAgIEBpZiAoaXNQcm9jZXNzaW5nIHx8IGlzQ29tcGxldGVkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3Mtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5mb1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj57eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfcHJvZ3Jlc3MnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvZ3Jlc3MtY291bnRcIj57eyBjdXJyZW50SW5kZXggfX0gLyB7eyBkZWxldGVTdGF0dXNlcy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1wcm9ncmVzc0JhciBcbiAgICAgICAgICBbdmFsdWVdPVwicHJvZ3Jlc3NcIiBcbiAgICAgICAgICBbc2hvd1ZhbHVlXT1cImZhbHNlXCJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwiY3VzdG9tLXByb2dyZXNzXCJcbiAgICAgICAgPjwvcC1wcm9ncmVzc0Jhcj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGF0c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0IHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hlY2stY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgc3VjY2Vzc0NvdW50IH19IHt7ICdkZXNpZ24uY29tcG9uZW50c19haS5idWxrX2RlbGV0ZV9zdWNjZXNzX2NvdW50JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGVycm9yQ291bnQgPiAwKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdCBlcnJvclwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXRpbWVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgZXJyb3JDb3VudCB9fSB7eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfZXJyb3JfY291bnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gU3RhdHVzIExpc3QgLS0+XG4gICAgQGlmIChpc1Byb2Nlc3NpbmcgfHwgaXNDb21wbGV0ZWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtbGlzdFwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGRlbGV0ZVN0YXR1c2VzOyB0cmFjayBpdGVtLmVudGl0eSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaXRlbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XG4gICAgICAgICAgICAgIDxpIFtjbGFzc109XCJnZXRTdGF0dXNJY29uKGl0ZW0uc3RhdHVzKVwiIGNsYXNzPVwic3RhdHVzLWljb25cIj48L2k+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhZ2UtbmFtZVwiPnt7IGl0ZW0uZW50aXR5W2VudGl0eU5hbWVGaWVsZF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtLmVudGl0eVtlbnRpdHlDb2RlRmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YWdlLWNvZGVcIj57eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfY29kZV9sYWJlbCcgfCB0cmFuc2xhdGUgfX06IHt7IGl0ZW0uZW50aXR5W2VudGl0eUNvZGVGaWVsZF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1iYWRnZVwiPlxuICAgICAgICAgICAgICA8cC10YWcgXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFN0YXR1c0xhYmVsKGl0ZW0uc3RhdHVzKVwiIFxuICAgICAgICAgICAgICAgIFtzZXZlcml0eV09XCJnZXRTdGF0dXNTZXZlcml0eShpdGVtLnN0YXR1cylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtLnN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnKSB7XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNwaW4gcGktc3Bpbm5lclwiPjwvaT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvcC10YWc+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5zdGF0dXMgPT09ICdlcnJvcicgJiYgaXRlbS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmVycm9yTWVzc2FnZSB9fVxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIENvbXBsZXRpb24gTWVzc2FnZSAtLT5cbiAgICBAaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGlvbi1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0aW9uLW1lc3NhZ2VcIiBbY2xhc3MuaGFzLWVycm9yc109XCJlcnJvckNvdW50ID4gMFwiPlxuICAgICAgICAgIDxpIFtjbGFzc109XCJlcnJvckNvdW50ID4gMCA/ICdwaSBwaS1leGNsYW1hdGlvbi1jaXJjbGUnIDogJ3BpIHBpLWNoZWNrLWNpcmNsZSdcIiBjbGFzcz1cImNvbXBsZXRpb24taWNvblwiPjwvaT5cbiAgICAgICAgICBAaWYgKGVycm9yQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICB7eyAnZGVzaWduLmNvbXBvbmVudHNfYWkuYnVsa19kZWxldGVfc3VjY2Vzc19tZXNzYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGVycm9yQ291bnQgPiAwKSB7XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAge3sgJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmJ1bGtfZGVsZXRlX2NvbXBsZXRlZF93aXRoX2Vycm9ycycgfCB0cmFuc2xhdGU6eyBjb3VudDogZXJyb3JDb3VudCB9IH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICBAaWYgKCFpc1Byb2Nlc3NpbmcgJiYgIWlzQ29tcGxldGVkKSB7XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCInZGVzaWduLmNvbXBvbmVudHNfYWkuY2FuY2VsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgW291dGxpbmVkXT1cInRydWVcIlxuICAgICAgICAgIChvbkNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgID48L3AtYnV0dG9uPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiJ2Rlc2lnbi5jb21wb25lbnRzX2FpLmJ1bGtfZGVsZXRlX2NvbmZpcm0nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcbiAgICAgICAgICAob25DbGljayk9XCJzdGFydERlbGV0aW9uKClcIlxuICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIidkZXNpZ24uY29tcG9uZW50c19haS5jbG9zZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25DbG9zZSgpXCJcbiAgICAgICAgPjwvcC1idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGlhbG9nPlxuIl19
|