@cqa-lib/cqa-ui 1.1.233 → 1.1.235

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.
@@ -2,9 +2,10 @@ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, Conten
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/material/icon";
4
4
  import * as i2 from "../dynamic-select/dynamic-select-field.component";
5
- import * as i3 from "@angular/common";
6
- import * as i4 from "@angular/material/tooltip";
7
- import * as i5 from "ngx-drag-drop";
5
+ import * as i3 from "@angular/material/progress-spinner";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "@angular/material/tooltip";
8
+ import * as i6 from "ngx-drag-drop";
8
9
  export class AddPrerequisiteCasesSectionComponent {
9
10
  constructor(cdr) {
10
11
  this.cdr = cdr;
@@ -33,6 +34,14 @@ export class AddPrerequisiteCasesSectionComponent {
33
34
  this.hideAddPrerequisite = false;
34
35
  /** When provided, controls Update button disabled state. Use for dirty-state validation (enable when form changed). When undefined, falls back to !allRowsHaveValues(). */
35
36
  this.updateDisabled = undefined;
37
+ /** When true, Update button is disabled and shows a loader (API in progress) */
38
+ this.isUpdating = false;
39
+ /** When true, prerequisite dropdown uses server-side search and load more (emit searchOptions / loadMoreOptions). */
40
+ this.enableServerSearch = false;
41
+ /** Per-row: whether more options are available for load more. Key = row index. */
42
+ this.hasMoreOptions = {};
43
+ /** Per-row: true while options are loading for that dropdown. Key = row index. */
44
+ this.isLoadingOptions = {};
36
45
  /** Validation message shown when Add Another/Update are disabled (not all rows have values) */
37
46
  this.selectFirstValidationMessage = 'Please select a prerequisite for each row first, then click Add Another.';
38
47
  this.expandedChange = new EventEmitter();
@@ -45,6 +54,10 @@ export class AddPrerequisiteCasesSectionComponent {
45
54
  this.cancel = new EventEmitter();
46
55
  /** Emitted when a single row's selection changes */
47
56
  this.selectionChange = new EventEmitter();
57
+ /** Emitted when user searches in prerequisite dropdown (server search). Parent should fetch options and update options input. */
58
+ this.searchOptions = new EventEmitter();
59
+ /** Emitted when user scrolls to load more options. Parent should append to options and set hasMoreOptions. */
60
+ this.loadMoreOptions = new EventEmitter();
48
61
  /** Emitted when any select changes - returns all current prerequisite selections in order */
49
62
  this.prerequisitesChange = new EventEmitter();
50
63
  /** Set to true when user clicks Add Another while invalid - shows validation message */
@@ -96,6 +109,8 @@ export class AddPrerequisiteCasesSectionComponent {
96
109
  return row.key;
97
110
  }
98
111
  onUpdate() {
112
+ if (this.isUpdating)
113
+ return;
99
114
  this.update.emit();
100
115
  }
101
116
  onCancel() {
@@ -118,7 +133,7 @@ export class AddPrerequisiteCasesSectionComponent {
118
133
  return val != null && val !== '';
119
134
  });
120
135
  }
121
- /** Computed disabled state for Update button. Uses updateDisabled input if provided, else falls back to !allRowsHaveValues(). */
136
+ /** Computed disabled state for Update button. When isUpdating we do not disable (show loader only); use updateDisabled for other cases. */
122
137
  isUpdateDisabled() {
123
138
  if (this.updateDisabled !== undefined) {
124
139
  return this.updateDisabled;
@@ -137,14 +152,27 @@ export class AddPrerequisiteCasesSectionComponent {
137
152
  }
138
153
  getConfig(index) {
139
154
  const opts = this.options?.length ? this.options : undefined;
140
- return this.getSelectConfig?.(index, opts) ?? { key: `row_${index}`, options: this.options ?? [] };
155
+ const base = this.getSelectConfig?.(index, opts) ?? { key: `row_${index}`, options: this.options ?? [] };
156
+ if (this.enableServerSearch) {
157
+ return {
158
+ ...base,
159
+ searchable: true,
160
+ serverSearch: true,
161
+ initialFetchOnOpen: true,
162
+ hasMore: this.hasMoreOptions[index] ?? false,
163
+ isLoading: this.isLoadingOptions[index] ?? false,
164
+ onSearch: (q) => this.searchOptions.emit({ index, query: q ?? '' }),
165
+ onLoadMore: (q) => this.loadMoreOptions.emit({ index, query: q ?? '' }),
166
+ };
167
+ }
168
+ return base;
141
169
  }
142
170
  }
143
171
  AddPrerequisiteCasesSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AddPrerequisiteCasesSectionComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
144
- AddPrerequisiteCasesSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AddPrerequisiteCasesSectionComponent, selector: "cqa-add-prerequisite-cases-section", inputs: { expanded: "expanded", form: "form", rows: "rows", options: "options", getSelectConfig: "getSelectConfig", label: "label", infoTooltip: "infoTooltip", addAnotherText: "addAnotherText", updateText: "updateText", cancelText: "cancelText", addTriggerText: "addTriggerText", hideAddPrerequisite: "hideAddPrerequisite", updateDisabled: "updateDisabled", selectFirstValidationMessage: "selectFirstValidationMessage" }, outputs: { expandedChange: "expandedChange", addRow: "addRow", removeRow: "removeRow", rowsReordered: "rowsReordered", update: "update", cancel: "cancel", selectionChange: "selectionChange", prerequisitesChange: "prerequisitesChange" }, host: { classAttribute: "cqa-ui-root cqa-add-prerequisite-cases-section-host" }, queries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBody"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-mt-4 cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db]\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n {{ updateText }}\n </button>\n </div>\n </div>\n</ng-container>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i5.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i5.DndHandleDirective, selector: "[dndHandle]" }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
172
+ AddPrerequisiteCasesSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AddPrerequisiteCasesSectionComponent, selector: "cqa-add-prerequisite-cases-section", inputs: { expanded: "expanded", form: "form", rows: "rows", options: "options", getSelectConfig: "getSelectConfig", label: "label", infoTooltip: "infoTooltip", addAnotherText: "addAnotherText", updateText: "updateText", cancelText: "cancelText", addTriggerText: "addTriggerText", hideAddPrerequisite: "hideAddPrerequisite", updateDisabled: "updateDisabled", isUpdating: "isUpdating", enableServerSearch: "enableServerSearch", hasMoreOptions: "hasMoreOptions", isLoadingOptions: "isLoadingOptions", selectFirstValidationMessage: "selectFirstValidationMessage" }, outputs: { expandedChange: "expandedChange", addRow: "addRow", removeRow: "removeRow", rowsReordered: "rowsReordered", update: "update", cancel: "cancel", selectionChange: "selectionChange", searchOptions: "searchOptions", loadMoreOptions: "loadMoreOptions", prerequisitesChange: "prerequisitesChange" }, host: { classAttribute: "cqa-ui-root cqa-add-prerequisite-cases-section-host" }, queries: [{ propertyName: "selectBodyTpl", first: true, predicate: ["selectBody"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n", styles: [":host ::ng-deep .update-spinner-white circle{stroke:#fff!important}\n"], components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i6.DndDropzoneDirective, selector: "[dndDropzone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i6.DndPlaceholderRefDirective, selector: "[dndPlaceholderRef]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i6.DndHandleDirective, selector: "[dndHandle]" }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
145
173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AddPrerequisiteCasesSectionComponent, decorators: [{
146
174
  type: Component,
147
- args: [{ selector: 'cqa-add-prerequisite-cases-section', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root cqa-add-prerequisite-cases-section-host' }, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-mt-4 cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db]\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n {{ updateText }}\n </button>\n </div>\n </div>\n</ng-container>\n", styles: [] }]
175
+ args: [{ selector: 'cqa-add-prerequisite-cases-section', styles: [":host ::ng-deep .update-spinner-white circle{stroke:#fff!important}\n"], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root cqa-add-prerequisite-cases-section-host' }, template: "<!-- Add Prerequisite trigger - only when collapsed and no rows (user must click to expand); hide when parent has prerequisites -->\n<ng-container *ngIf=\"rows.length === 0 && !expanded && !hideAddPrerequisite\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddPrerequisiteClick()\">\n <mat-icon class=\"cqa-text-[12px] cqa-w-[12px] cqa-h-[12px] cqa-text-[#3F43EE]\">add</mat-icon>\n <span class=\"cqa-font-regular cqa-font-inter cqa-text-sm cqa-text-[#3F43EE]\">{{ addTriggerText }}</span>\n </div>\n</ng-container>\n\n<!-- Collapsed summary when we have rows but expanded=false -->\n<ng-container *ngIf=\"rows.length > 0 && !expanded\">\n <div\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#D8D9FC] cqa-rounded-lg cqa-p-1.5 cqa-mt-4 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-between cqa-min-h-[27px] cqa-hover:cqa-border-[#9ca3af] cqa-hover:cqa-bg-[#f9fafb] cqa-active:cqa-border-[#6366f1] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"toggleExpanded(true)\">\n <span class=\"cqa-text-[#4a5565] cqa-font-normal cqa-font-inter cqa-text-xs\">{{ rows.length }} prerequisite{{ rows.length !== 1 ? 's' : '' }}</span>\n <mat-icon class=\"cqa-text-[14px] cqa-w-[14px] cqa-h-[14px] cqa-text-[#4a5565]\">expand_more</mat-icon>\n </div>\n</ng-container>\n\n<!-- Expanded form - when expanded=true (with or without rows; no Add Prerequisite trigger) -->\n<ng-container *ngIf=\"expanded\">\n <div class=\"cqa-p-3 cqa-bg-white cqa-border cqa-border-[#e5e7eb] cqa-rounded-lg\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-mb-3\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-[#374151] cqa-m-0 cqa-leading-none\">{{ label }}</label>\n <mat-icon class=\"cqa-inline-flex cqa-mt-1 cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-text-sm cqa-text-[#6b7280] cqa-cursor-help cqa-flex-shrink-0\" [matTooltip]=\"infoTooltip\" matTooltipPosition=\"above\" matTooltipShowDelay=\"300\">info</mat-icon>\n <button\n type=\"button\"\n class=\"cqa-ml-auto cqa-flex cqa-items-center cqa-justify-center cqa-w-7 cqa-h-7 cqa-p-0 cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"toggleExpanded(false)\"\n matTooltip=\"Close\">\n <mat-icon class=\"cqa-text-xl cqa-w-5 cqa-h-5\">expand_less</mat-icon>\n </button>\n </div>\n\n <div\n class=\"prerequisite-drop-list cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-3\"\n [dndDropzone]=\"['prerequisite-row']\"\n dndEffectAllowed=\"move\"\n dndDragoverClass=\"dndDragover\"\n (dndDrop)=\"onDndDrop($event)\">\n <div dndPlaceholderRef class=\"prerequisite-drag-placeholder\">Drop here</div>\n <div\n *ngFor=\"let row of rows; let i = index; trackBy: trackByKey\"\n class=\"prerequisite-drag-item cqa-flex cqa-items-center cqa-gap-2\"\n [dndDraggable]=\"row\"\n [dndDisableIf]=\"rows.length <= 1\"\n dndEffectAllowed=\"move\"\n dndType=\"prerequisite-row\">\n <!-- 9-dot grid drag handle (only when multiple rows to reorder) -->\n <div *ngIf=\"rows.length > 1\" dndHandle class=\"cqa-flex cqa-flex-shrink-0 cqa-items-center cqa-justify-center cqa-cursor-grab cqa-text-[#6B7280] cqa-hover:cqa-text-[#111827] active:cqa-cursor-grabbing\" matTooltip=\"Drag to reorder\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"3\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"8\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"13\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n </svg>\n </div>\n\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <!-- Custom template (e.g. parent-provided cqa-dynamic-select) -->\n <ng-container *ngIf=\"selectBodyTpl\">\n <ng-container\n *ngTemplateOutlet=\"selectBodyTpl; context: {\n $implicit: row,\n index: i,\n form: form,\n config: getConfig(i)\n }\">\n </ng-container>\n </ng-container>\n <!-- Default: built-in cqa-dynamic-select -->\n <cqa-dynamic-select\n *ngIf=\"!selectBodyTpl && form\"\n [form]=\"form\"\n [config]=\"getConfig(i)\"\n (selectionChange)=\"onSelectionChange($event, i)\">\n </cqa-dynamic-select>\n </div>\n\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-min-w-[32px] cqa-bg-transparent cqa-border-none cqa-rounded-md cqa-text-[#6b7280] cqa-cursor-pointer cqa-p-0 cqa-hover:cqa-bg-[#f3f4f6] cqa-hover:cqa-text-[#374151]\"\n (click)=\"onRemoveRow(i)\"\n matTooltip=\"Cancel\">\n <mat-icon class=\"cqa-text-lg cqa-w-[18px] cqa-h-[18px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"showAddAnotherValidation && !allRowsHaveValues()\" class=\"cqa-text-xs cqa-text-[#dc2626] cqa-mb-2\">\n {{ selectFirstValidationMessage }}\n </div>\n <!-- Add Prerequisite button only in empty state; hide when parent has prerequisites (e.g. collapsing after update) -->\n <div\n *ngIf=\"rows.length === 0 && !hideAddPrerequisite\"\n class=\"cqa-border-2 cqa-border-dashed cqa-border-[#ccccff] cqa-rounded-lg cqa-p-3 cqa-mb-3 cqa-bg-white cqa-cursor-pointer cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-flex cqa-items-center cqa-justify-center cqa-gap-2 cqa-min-h-[40px] cqa-w-full cqa-hover:cqa-border-[#9999ee] cqa-hover:cqa-bg-[#f8f8ff] cqa-active:cqa-border-[#7c7ce0] cqa-active:cqa-bg-[#eff6ff]\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px] cqa-text-[#3b82f6]\">add</mat-icon>\n <span class=\"cqa-font-medium cqa-font-inter cqa-text-sm cqa-text-[#3b82f6]\">{{ addTriggerText }}</span>\n </div>\n <!-- Add Another link when we already have at least one row -->\n <button\n *ngIf=\"rows.length > 0 && !hideAddPrerequisite\"\n type=\"button\"\n class=\"cqa-mb-3 cqa-flex cqa-items-center cqa-gap-2 cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer cqa-font-inter cqa-text-sm cqa-text-[#4242DB] cqa-hover:cqa-underline\"\n (click)=\"onAddRow()\">\n <mat-icon class=\"cqa-text-[18px] cqa-w-[18px] cqa-h-[18px]\">add</mat-icon>\n <span>{{ addAnotherText }}</span>\n </button>\n <div class=\"cqa-flex cqa-gap-3 cqa-justify-end\">\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-bg-white cqa-text-[#374151] cqa-border cqa-border-[#d1d5db] cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-cursor-pointer cqa-hover:cqa-bg-[#f9fafb]\"\n (click)=\"onCancel()\">\n {{ cancelText }}\n </button>\n <button\n type=\"button\"\n class=\"cqa-py-2.5 cqa-px-4 cqa-rounded-md cqa-text-sm cqa-font-semibold cqa-border-none cqa-cursor-pointer disabled:cqa-opacity-50 disabled:cqa-cursor-not-allowed cqa-bg-[#1a56db] cqa-text-white cqa-hover:cqa-bg-[#1647b8] disabled:cqa-bg-[#1a56db] cqa-flex cqa-items-center cqa-justify-center cqa-gap-2\"\n [style.pointer-events]=\"isUpdating ? 'none' : 'auto'\"\n [style.cursor]=\"isUpdating ? 'not-allowed' : 'pointer'\"\n [disabled]=\"isUpdateDisabled()\"\n (click)=\"onUpdate()\">\n <mat-spinner *ngIf=\"isUpdating\" diameter=\"16\" class=\"cqa-inline-block update-spinner-white\"></mat-spinner>\n <span>{{ updateText }}</span>\n </button>\n </div>\n </div>\n</ng-container>\n" }]
148
176
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { expanded: [{
149
177
  type: Input
150
178
  }], form: [{
@@ -171,6 +199,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
171
199
  type: Input
172
200
  }], updateDisabled: [{
173
201
  type: Input
202
+ }], isUpdating: [{
203
+ type: Input
204
+ }], enableServerSearch: [{
205
+ type: Input
206
+ }], hasMoreOptions: [{
207
+ type: Input
208
+ }], isLoadingOptions: [{
209
+ type: Input
174
210
  }], selectFirstValidationMessage: [{
175
211
  type: Input
176
212
  }], selectBodyTpl: [{
@@ -190,7 +226,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
190
226
  type: Output
191
227
  }], selectionChange: [{
192
228
  type: Output
229
+ }], searchOptions: [{
230
+ type: Output
231
+ }], loadMoreOptions: [{
232
+ type: Output
193
233
  }], prerequisitesChange: [{
194
234
  type: Output
195
235
  }] } });
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFdBQVcsR0FFWixNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQXNCdkIsTUFBTSxPQUFPLG9DQUFvQztJQTJFL0MsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUExRTFDLHlEQUF5RDtRQUNoRCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSzFCLHVEQUF1RDtRQUM5QyxTQUFJLEdBQXNCLEVBQUUsQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxZQUFPLEdBQW1CLEVBQUUsQ0FBQztRQVV0QyxnREFBZ0Q7UUFDdkMsVUFBSyxHQUFHLG9CQUFvQixDQUFDO1FBRXRDLGdDQUFnQztRQUN2QixnQkFBVyxHQUFHLGlFQUFpRSxDQUFDO1FBRXpGLHdDQUF3QztRQUMvQixtQkFBYyxHQUFHLGFBQWEsQ0FBQztRQUV4QyxpQ0FBaUM7UUFDeEIsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUUvQixpQ0FBaUM7UUFDeEIsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUUvQiwyQ0FBMkM7UUFDbEMsbUJBQWMsR0FBRyxrQkFBa0IsQ0FBQztRQUU3QyxxSUFBcUk7UUFDNUgsd0JBQW1CLEdBQUcsS0FBSyxDQUFD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SztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTUcsT0FBTztzQkFBZixLQUFLO2dCQVFHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRzZDLGFBQWE7c0JBQS9ELFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPdkMsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbnRlbnRDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERuZERyb3BFdmVudCB9IGZyb20gJ25neC1kcmFnLWRyb3AnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByZXJlcXVpc2l0ZVJvdyB7XG4gIGtleTogc3RyaW5nO1xufVxuXG4vKiogRW1pdHRlZCB3aGVuIGFueSBwcmVyZXF1aXNpdGUgc2VsZWN0IGNoYW5nZXMgLSBjb250YWlucyBhbGwgY3VycmVudCBzZWxlY3Rpb25zICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXJlcXVpc2l0ZVNlbGVjdGlvbiB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogdW5rbm93bjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290IGNxYS1hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24taG9zdCcgfSxcbn0pXG5leHBvcnQgY2xhc3MgQWRkUHJlcmVxdWlzaXRlQ2FzZXNTZWN0aW9uQ29tcG9uZW50IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHNlY3Rpb24gaXMgZXhwYW5kZWQgKHNob3dpbmcgdGhlIGZvcm0pICovXG4gIEBJbnB1dCgpIGV4cGFuZGVkID0gZmFsc2U7XG5cbiAgLyoqIEZvcm0gZ3JvdXAgY29udGFpbmluZyBjb250cm9scyBmb3IgZWFjaCByb3cgKGtleWVkIGJ5IHJvdy5rZXkpICovXG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XG5cbiAgLyoqIEFycmF5IG9mIHJvdyBkZXNjcmlwdG9ycywgZWFjaCB3aXRoIGEgdW5pcXVlIGtleSAqL1xuICBASW5wdXQoKSByb3dzOiBQcmVyZXF1aXNpdGVSb3dbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcmVyZXF1aXNpdGUgb3B0aW9ucyBmcm9tIEFQSSAoZS5nLiB0ZXN0IGNhc2VzIHRvIGNob29zZSBmcm9tKS5cbiAgICogUGFzc2VkIHRvIGdldFNlbGVjdENvbmZpZyB3aGVuIGJ1aWxkaW5nIHRoZSBjb25maWcgZm9yIGVhY2ggcm93LlxuICAgKi9cbiAgQElucHV0KCkgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBkeW5hbWljIHNlbGVjdCBjb25maWcgZm9yIGEgZ2l2ZW4gcm93IGluZGV4LlxuICAgKiBSZWNlaXZlcyBvcHRpb25hbCBvcHRpb25zIChmcm9tIHRoaXMub3B0aW9ucyB3aGVuIHByb3ZpZGVkKS5cbiAgICogRWFjaCByb3cgY2FuIGhhdmUgZGlmZmVyZW50IG9wdGlvbnMuIFRvIGF2b2lkIGR1cGxpY2F0ZXMsIGV4Y2x1ZGUgb3B0aW9uc1xuICAgKiBhbHJlYWR5IHNlbGVjdGVkIGluIG90aGVyIHJvd3MgKGtlZXAgY3VycmVudCByb3cncyBzZWxlY3Rpb24gc28gaXQgZGlzcGxheXMpLlxuICAgKi9cbiAgQElucHV0KCkgZ2V0U2VsZWN0Q29uZmlnITogKGluZGV4OiBudW1iZXIsIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXSkgPT4gRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuXG4gIC8qKiBTZWN0aW9uIGxhYmVsIChlLmcuIFwiUHJlcmVxdWlzaXRlIENhc2VzXCIpICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJ1ByZXJlcXVpc2l0ZSBDYXNlcyc7XG5cbiAgLyoqIFRvb2x0aXAgZm9yIHRoZSBpbmZvIGljb24gKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXAgPSAnQWRkIHByZXJlcXVpc2l0ZSB0ZXN0IGNhc2VzIHRoYXQgbXVzdCBydW4gYmVmb3JlIHRoaXMgdGVzdCBjYXNlJztcblxuICAvKiogVGV4dCBmb3IgdGhlIFwiQWRkIEFub3RoZXJcIiBidXR0b24gKi9cbiAgQElucHV0KCkgYWRkQW5vdGhlclRleHQgPSAnQWRkIEFub3RoZXInO1xuXG4gIC8qKiBUZXh0IGZvciB0aGUgVXBkYXRlIGJ1dHRvbiAqL1xuICBASW5wdXQoKSB1cGRhdGVUZXh0ID0gJ1VwZGF0ZSc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uICovXG4gIEBJbnB1dCgpIGNhbmNlbFRleHQgPSAnQ2FuY2VsJztcblxuICAvKiogVGV4dCBmb3IgdGhlIGNvbGxhcHNlZCBcIkFkZFwiIHRyaWdnZXIgKi9cbiAgQElucHV0KCkgYWRkVHJpZ2dlclRleHQgPSAnQWRkIFByZXJlcXVpc2l0ZSc7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgaGlkZSBBZGQgUHJlcmVxdWlzaXRlIGJ1dHRvbiBldmVuIGlmIHJvd3MgYXJlIGVtcHR5IChlLmcuIHdoZW4gY29sbGFwc2luZyBhZnRlciB1cGRhdGUgd2l0aCBleGlzdGluZyBwcmVyZXF1aXNpdGVzKSAqL1xuICBASW5wdXQoKSBoaWRlQWRkUHJlcmVxdWlzaXRlID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gcHJvdmlkZWQsIGNvbnRyb2xzIFVwZGF0ZSBidXR0b24gZGlzYWJsZWQgc3RhdGUuIFVzZSBmb3IgZGlydHktc3RhdGUgdmFsaWRhdGlvbiAoZW5hYmxlIHdoZW4gZm9ybSBjaGFuZ2VkKS4gV2hlbiB1bmRlZmluZWQsIGZhbGxzIGJhY2sgdG8gIWFsbFJvd3NIYXZlVmFsdWVzKCkuICovXG4gIEBJbnB1dCgpIHVwZGF0ZURpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBWYWxpZGF0aW9uIG1lc3NhZ2Ugc2hvd24gd2hlbiBBZGQgQW5vdGhlci9VcGRhdGUgYXJlIGRpc2FibGVkIChub3QgYWxsIHJvd3MgaGF2ZSB2YWx1ZXMpICovXG4gIEBJbnB1dCgpIHNlbGVjdEZpcnN0VmFsaWRhdGlvbk1lc3NhZ2UgPSAnUGxlYXNlIHNlbGVjdCBhIHByZXJlcXVpc2l0ZSBmb3IgZWFjaCByb3cgZmlyc3QsIHRoZW4gY2xpY2sgQWRkIEFub3RoZXIuJztcblxuICAvKiogT3B0aW9uYWwgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgc2VsZWN0IHNsb3QuIFVzZSBuZy10ZW1wbGF0ZSAjc2VsZWN0Qm9keSB3aXRoIGxldC1yb3csIGxldC1pbmRleCwgbGV0LWZvcm0sIGxldC1jb25maWcuICovXG4gIEBDb250ZW50Q2hpbGQoJ3NlbGVjdEJvZHknLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pIHNlbGVjdEJvZHlUcGw/OiBUZW1wbGF0ZVJlZjx7XG4gICAgJGltcGxpY2l0OiBQcmVyZXF1aXNpdGVSb3c7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIH0+O1xuXG4gIEBPdXRwdXQoKSBleHBhbmRlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGFkZFJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcm93c1Jlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJlcmVxdWlzaXRlUm93W10+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gVXBkYXRlIGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gQ2FuY2VsIGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzaW5nbGUgcm93J3Mgc2VsZWN0aW9uIGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd247IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhbnkgc2VsZWN0IGNoYW5nZXMgLSByZXR1cm5zIGFsbCBjdXJyZW50IHByZXJlcXVpc2l0ZSBzZWxlY3Rpb25zIGluIG9yZGVyICovXG4gIEBPdXRwdXQoKSBwcmVyZXF1aXNpdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVTZWxlY3Rpb25bXT4oKTtcblxuICAvKiogU2V0IHRvIHRydWUgd2hlbiB1c2VyIGNsaWNrcyBBZGQgQW5vdGhlciB3aGlsZSBpbnZhbGlkIC0gc2hvd3MgdmFsaWRhdGlvbiBtZXNzYWdlICovXG4gIHNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB0b2dnbGVFeHBhbmRlZChzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9IHNob3c7XG4gICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHNob3cpO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiQWRkIFByZXJlcXVpc2l0ZVwiIHdpdGggbm8gcm93cyAtIGV4cGFuZHMgYW5kIGFkZHMgZmlyc3Qgcm93ICovXG4gIG9uQWRkUHJlcmVxdWlzaXRlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZCh0cnVlKTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZFJvdygpOiB2b2lkIHtcbiAgICAvLyBBbGxvdyBhZGRpbmcgZmlyc3Qgcm93IHdoZW4gZW1wdHkgKG5vIHZhbGlkYXRpb24gbmVlZGVkKVxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID4gMCAmJiAhdGhpcy5hbGxSb3dzSGF2ZVZhbHVlcygpKSB7XG4gICAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93QWRkQW5vdGhlclZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvblJlbW92ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVSb3cuZW1pdChpbmRleCk7XG4gIH1cblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhID09IG51bGwgfHwgZXZlbnQuaW5kZXggPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3BSb3cgPSBldmVudC5kYXRhIGFzIFByZXJlcXVpc2l0ZVJvdztcbiAgICBsZXQgZHJvcEluZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgocikgPT4gci5rZXkgPT09IGRyb3BSb3cua2V5KTtcbiAgICBpZiAoY3VycmVudEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IGRyb3BJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Um93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIG5ld1Jvd3Muc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgLy8gSWYgbW92aW5nIGZvcndhcmQsIGRyb3BJbmRleCBzaGlmdHMgYWZ0ZXIgcmVtb3ZhbFxuICAgIGlmIChjdXJyZW50SW5kZXggPCBkcm9wSW5kZXgpIHtcbiAgICAgIGRyb3BJbmRleC0tO1xuICAgIH1cbiAgICBuZXdSb3dzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyb3BSb3cpO1xuICAgIHRoaXMucm93c1Jlb3JkZXJlZC5lbWl0KG5ld1Jvd3MpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUtleShfaTogbnVtYmVyLCByb3c6IFByZXJlcXVpc2l0ZVJvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdy5rZXk7XG4gIH1cblxuICBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZS5lbWl0KCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyAuLi5ldmVudCwgaW5kZXggfSk7XG4gICAgdGhpcy5lbWl0QWxsUHJlcmVxdWlzaXRlcygpO1xuICAgIGlmICh0aGlzLmFsbFJvd3NIYXZlVmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuc2hvd0FkZEFub3RoZXJWYWxpZGF0aW9uID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBldmVyeSByb3cgaGFzIGEgbm9uLWVtcHR5IHZhbHVlIChubyBwbGFjZWhvbGRlcnMpICovXG4gIGFsbFJvd3NIYXZlVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5mb3JtIHx8ICF0aGlzLnJvd3MubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucm93cy5ldmVyeSgocm93KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm0uZ2V0KHJvdy5rZXkpPy52YWx1ZTtcbiAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbXB1dGVkIGRpc2FibGVkIHN0YXRlIGZvciBVcGRhdGUgYnV0dG9uLiBVc2VzIHVwZGF0ZURpc2FibGVkIGlucHV0IGlmIHByb3ZpZGVkLCBlbHNlIGZhbGxzIGJhY2sgdG8gIWFsbFJvd3NIYXZlVmFsdWVzKCkuICovXG4gIGlzVXBkYXRlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMudXBkYXRlRGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRGlzYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhbGwgY3VycmVudCBwcmVyZXF1aXNpdGUgc2VsZWN0aW9ucyAoa2V5ICsgdmFsdWUpIGluIHJvdyBvcmRlciAqL1xuICBwcml2YXRlIGVtaXRBbGxQcmVyZXF1aXNpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb3JtIHx8ICF0aGlzLnJvd3MubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0aW9uczogUHJlcmVxdWlzaXRlU2VsZWN0aW9uW10gPSB0aGlzLnJvd3MubWFwKChyb3cpID0+ICh7XG4gICAgICBrZXk6IHJvdy5rZXksXG4gICAgICB2YWx1ZTogdGhpcy5mb3JtLmdldChyb3cua2V5KT8udmFsdWUgPz8gbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5wcmVyZXF1aXNpdGVzQ2hhbmdlLmVtaXQoc2VsZWN0aW9ucyk7XG4gIH1cblxuICBnZXRDb25maWcoaW5kZXg6IG51bWJlcik6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucz8ubGVuZ3RoID8gdGhpcy5vcHRpb25zIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmdldFNlbGVjdENvbmZpZz8uKGluZGV4LCBvcHRzKSA/PyB7IGtleTogYHJvd18ke2luZGV4fWAsIG9wdGlvbnM6IHRoaXMub3B0aW9ucyA/PyBbXSB9O1xuICB9XG59XG4iLCI8IS0tIEFkZCBQcmVyZXF1aXNpdGUgdHJpZ2dlciAtIG9ubHkgd2hlbiBjb2xsYXBzZWQgYW5kIG5vIHJvd3MgKHVzZXIgbXVzdCBjbGljayB0byBleHBhbmQpOyBoaWRlIHdoZW4gcGFyZW50IGhhcyBwcmVyZXF1aXNpdGVzIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd3MubGVuZ3RoID09PSAwICYmICFleHBhbmRlZCAmJiAhaGlkZUFkZFByZXJlcXVpc2l0ZVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtYm9yZGVyLTIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bI0Q4RDlGQ10gY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtbXQtNCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtZHVyYXRpb24tMjAwIGNxYS1lYXNlLWluLW91dCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTIgIGNxYS13LWZ1bGwgY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5OTk5ZWVdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOGY4ZmZdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzdjN2NlMF0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAoY2xpY2spPVwib25BZGRQcmVyZXF1aXNpdGVDbGljaygpXCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS13LVsxMnB4XSBjcWEtaC1bMTJweF0gY3FhLXRleHQtWyMzRjQzRUVdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXJlZ3VsYXIgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyMzRjQzRUVdXCI+e3sgYWRkVHJpZ2dlclRleHQgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gQ29sbGFwc2VkIHN1bW1hcnkgd2hlbiB3ZSBoYXZlIHJvd3MgYnV0IGV4cGFuZGVkPWZhbHNlIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd3MubGVuZ3RoID4gMCAmJiAhZXhwYW5kZWRcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNEOEQ5RkNdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEuNSBjcWEtbXQtNCBjcWEtYmctd2hpdGUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10cmFuc2l0aW9uLWFsbCBjcWEtZHVyYXRpb24tMjAwIGNxYS1lYXNlLWluLW91dCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1pbi1oLVsyN3B4XSBjcWEtaG92ZXI6Y3FhLWJvcmRlci1bIzljYTNhZl0gY3FhLWhvdmVyOmNxYS1iZy1bI2Y5ZmFmYl0gY3FhLWFjdGl2ZTpjcWEtYm9yZGVyLVsjNjM2NmYxXSBjcWEtYWN0aXZlOmNxYS1iZy1bI2VmZjZmZl1cIlxuICAgIChjbGljayk9XCJ0b2dnbGVFeHBhbmRlZCh0cnVlKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM0YTU1NjVdIGNxYS1mb250LW5vcm1hbCBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC14c1wiPnt7IHJvd3MubGVuZ3RoIH19IHByZXJlcXVpc2l0ZXt7IHJvd3MubGVuZ3RoICE9PSAxID8gJ3MnIDogJycgfX08L3NwYW4+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS13LVsxNHB4XSBjcWEtaC1bMTRweF0gY3FhLXRleHQtWyM0YTU1NjVdXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIEV4cGFuZGVkIGZvcm0gLSB3aGVuIGV4cGFuZGVkPXRydWUgKHdpdGggb3Igd2l0aG91dCByb3dzOyBubyBBZGQgUHJlcmVxdWlzaXRlIHRyaWdnZXIpIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4cGFuZGVkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtbXQtNCBjcWEtcC0zIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNlNWU3ZWJdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1iLTNcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLW0tMCBjcWEtbGVhZGluZy1ub25lXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1tdC0xIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTQgY3FhLWgtNCBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzZiNzI4MF0gY3FhLWN1cnNvci1oZWxwIGNxYS1mbGV4LXNocmluay0wXCIgW21hdFRvb2x0aXBdPVwiaW5mb1Rvb2x0aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCIzMDBcIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLW1sLWF1dG8gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctNyBjcWEtaC03IGNxYS1wLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bIzZiNzI4MF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ob3ZlcjpjcWEtYmctWyNmM2Y0ZjZdIGNxYS1ob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQoZmFsc2UpXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkNsb3NlXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwcmVyZXF1aXNpdGUtZHJvcC1saXN0IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1iLTNcIlxuICAgICAgW2RuZERyb3B6b25lXT1cIlsncHJlcmVxdWlzaXRlLXJvdyddXCJcbiAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgIGRuZERyYWdvdmVyQ2xhc3M9XCJkbmREcmFnb3ZlclwiXG4gICAgICAoZG5kRHJvcCk9XCJvbkRuZERyb3AoJGV2ZW50KVwiPlxuICAgICAgPGRpdiBkbmRQbGFjZWhvbGRlclJlZiBjbGFzcz1cInByZXJlcXVpc2l0ZS1kcmFnLXBsYWNlaG9sZGVyXCI+RHJvcCBoZXJlPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUtleVwiXG4gICAgICAgIGNsYXNzPVwicHJlcmVxdWlzaXRlLWRyYWctaXRlbSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgIFtkbmREcmFnZ2FibGVdPVwicm93XCJcbiAgICAgICAgW2RuZERpc2FibGVJZl09XCJyb3dzLmxlbmd0aCA8PSAxXCJcbiAgICAgICAgZG5kRWZmZWN0QWxsb3dlZD1cIm1vdmVcIlxuICAgICAgICBkbmRUeXBlPVwicHJlcmVxdWlzaXRlLXJvd1wiPlxuICAgICAgICA8IS0tIDktZG90IGdyaWQgZHJhZyBoYW5kbGUgKG9ubHkgd2hlbiBtdWx0aXBsZSByb3dzIHRvIHJlb3JkZXIpIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwicm93cy5sZW5ndGggPiAxXCIgZG5kSGFuZGxlIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWN1cnNvci1ncmFiIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtaG92ZXI6Y3FhLXRleHQtWyMxMTE4MjddIGFjdGl2ZTpjcWEtY3Vyc29yLWdyYWJiaW5nXCIgbWF0VG9vbHRpcD1cIkRyYWcgdG8gcmVvcmRlclwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCI4XCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIxM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPCEtLSBDdXN0b20gdGVtcGxhdGUgKGUuZy4gcGFyZW50LXByb3ZpZGVkIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RCb2R5VHBsXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RCb2R5VHBsOyBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgZm9ybTogZm9ybSxcbiAgICAgICAgICAgICAgY29uZmlnOiBnZXRDb25maWcoaSlcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gRGVmYXVsdDogYnVpbHQtaW4gY3FhLWR5bmFtaWMtc2VsZWN0IC0tPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCIhc2VsZWN0Qm9keVRwbCAmJiBmb3JtXCJcbiAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZyhpKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1taW4tdy1bMzJweF0gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1bIzZiNzI4MF0gY3FhLWN1cnNvci1wb2ludGVyIGNxYS1wLTAgY3FhLWhvdmVyOmNxYS1iZy1bI2YzZjRmNl0gY3FhLWhvdmVyOmNxYS10ZXh0LVsjMzc0MTUxXVwiXG4gICAgICAgIChjbGljayk9XCJvblJlbW92ZVJvdyhpKVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJDYW5jZWxcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiAmJiAhYWxsUm93c0hhdmVWYWx1ZXMoKVwiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyNkYzI2MjZdIGNxYS1tYi0yXCI+XG4gICAgICB7eyBzZWxlY3RGaXJzdFZhbGlkYXRpb25NZXNzYWdlIH19XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBZGQgUHJlcmVxdWlzaXRlIGJ1dHRvbiBvbmx5IGluIGVtcHR5IHN0YXRlOyBoaWRlIHdoZW4gcGFyZW50IGhhcyBwcmVyZXF1aXNpdGVzIChlLmcuIGNvbGxhcHNpbmcgYWZ0ZXIgdXBkYXRlKSAtLT5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInJvd3MubGVuZ3RoID09PSAwICYmICFoaWRlQWRkUHJlcmVxdWlzaXRlXCJcbiAgICAgIGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNjY2NjZmZdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTMgY3FhLW1iLTMgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4taC1bNDBweF0gY3FhLXctZnVsbCBjcWEtaG92ZXI6Y3FhLWJvcmRlci1bIzk5OTllZV0gY3FhLWhvdmVyOmNxYS1iZy1bI2Y4ZjhmZl0gY3FhLWFjdGl2ZTpjcWEtYm9yZGVyLVsjN2M3Y2UwXSBjcWEtYWN0aXZlOmNxYS1iZy1bI2VmZjZmZl1cIlxuICAgICAgKGNsaWNrKT1cIm9uQWRkUm93KClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtdy1bMThweF0gY3FhLWgtWzE4cHhdIGNxYS10ZXh0LVsjM2I4MmY2XVwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzNiODJmNl1cIj57eyBhZGRUcmlnZ2VyVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEFkZCBBbm90aGVyIGxpbmsgd2hlbiB3ZSBhbHJlYWR5IGhhdmUgYXQgbGVhc3Qgb25lIHJvdyAtLT5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInJvd3MubGVuZ3RoID4gMCAmJiAhaGlkZUFkZFByZXJlcXVpc2l0ZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiY3FhLW1iLTMgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtZm9udC1pbnRlciBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzQyNDJEQl0gY3FhLWhvdmVyOmNxYS11bmRlcmxpbmVcIlxuICAgICAgKGNsaWNrKT1cIm9uQWRkUm93KClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtdy1bMThweF0gY3FhLWgtWzE4cHhdXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPnt7IGFkZEFub3RoZXJUZXh0IH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTMgY3FhLWp1c3RpZnktZW5kXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1weS0yLjUgY3FhLXB4LTQgY3FhLWJnLXdoaXRlIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNkMWQ1ZGJdIGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtaG92ZXI6Y3FhLWJnLVsjZjlmYWZiXVwiXG4gICAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgIHt7IGNhbmNlbFRleHQgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1yb3VuZGVkLW1kIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgZGlzYWJsZWQ6Y3FhLW9wYWNpdHktNTAgZGlzYWJsZWQ6Y3FhLWN1cnNvci1ub3QtYWxsb3dlZCBjcWEtYmctWyMxYTU2ZGJdIGNxYS10ZXh0LXdoaXRlIGNxYS1ob3ZlcjpjcWEtYmctWyMxNjQ3YjhdIGRpc2FibGVkOmNxYS1iZy1bIzFhNTZkYl1cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNVcGRhdGVEaXNhYmxlZCgpXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlKClcIj5cbiAgICAgICAge3sgdXBkYXRlVGV4dCB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FkZC1wcmVyZXF1aXNpdGUtY2FzZXMtc2VjdGlvbi9hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFdBQVcsR0FFWixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUE2QnZCLE1BQU0sT0FBTyxvQ0FBb0M7SUF5Ri9DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeEYxQyx5REFBeUQ7UUFDaEQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUsxQix1REFBdUQ7UUFDOUMsU0FBSSxHQUFzQixFQUFFLENBQUM7UUFFdEM7OztXQUdHO1FBQ00sWUFBTyxHQUFtQixFQUFFLENBQUM7UUFVdEMsZ0RBQWdEO1FBQ3ZDLFVBQUssR0FBRyxvQkFBb0IsQ0FBQztRQUV0QyxnQ0FBZ0M7UUFDdkIsZ0JBQVcsR0FBRyxpRUFBaUUsQ0FBQztRQUV6Rix3Q0FBd0M7UUFDL0IsbUJBQWMsR0FBRyxhQUFhLENBQUM7UUFFeEMsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsaUNBQWlDO1FBQ3hCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFFL0IsMkNBQTJDO1FBQ2xDLG1CQUFjLEdBQUcsa0JBQWtCLENBQUM7UUFFN0MscUlBQXFJO1FBQzVILHdCQUFtQixHQUFHLEtBQUssQ0FB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QUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRzZDLGFBQWE7c0JBQS9ELFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPdkMsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEbmREcm9wRXZlbnQgfSBmcm9tICduZ3gtZHJhZy1kcm9wJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBQcmVyZXF1aXNpdGVSb3cge1xuICBrZXk6IHN0cmluZztcbn1cblxuLyoqIEVtaXR0ZWQgd2hlbiBhbnkgcHJlcmVxdWlzaXRlIHNlbGVjdCBjaGFuZ2VzIC0gY29udGFpbnMgYWxsIGN1cnJlbnQgc2VsZWN0aW9ucyAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVyZXF1aXNpdGVTZWxlY3Rpb24ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hZGQtcHJlcmVxdWlzaXRlLWNhc2VzLXNlY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC51cGRhdGUtc3Bpbm5lci13aGl0ZSBjaXJjbGUge1xuICAgICAgICBzdHJva2U6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCBjcWEtYWRkLXByZXJlcXVpc2l0ZS1jYXNlcy1zZWN0aW9uLWhvc3QnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFkZFByZXJlcXVpc2l0ZUNhc2VzU2VjdGlvbkNvbXBvbmVudCB7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZWN0aW9uIGlzIGV4cGFuZGVkIChzaG93aW5nIHRoZSBmb3JtKSAqL1xuICBASW5wdXQoKSBleHBhbmRlZCA9IGZhbHNlO1xuXG4gIC8qKiBGb3JtIGdyb3VwIGNvbnRhaW5pbmcgY29udHJvbHMgZm9yIGVhY2ggcm93IChrZXllZCBieSByb3cua2V5KSAqL1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBBcnJheSBvZiByb3cgZGVzY3JpcHRvcnMsIGVhY2ggd2l0aCBhIHVuaXF1ZSBrZXkgKi9cbiAgQElucHV0KCkgcm93czogUHJlcmVxdWlzaXRlUm93W10gPSBbXTtcblxuICAvKipcbiAgICogUHJlcmVxdWlzaXRlIG9wdGlvbnMgZnJvbSBBUEkgKGUuZy4gdGVzdCBjYXNlcyB0byBjaG9vc2UgZnJvbSkuXG4gICAqIFBhc3NlZCB0byBnZXRTZWxlY3RDb25maWcgd2hlbiBidWlsZGluZyB0aGUgY29uZmlnIGZvciBlYWNoIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gW107XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgZHluYW1pYyBzZWxlY3QgY29uZmlnIGZvciBhIGdpdmVuIHJvdyBpbmRleC5cbiAgICogUmVjZWl2ZXMgb3B0aW9uYWwgb3B0aW9ucyAoZnJvbSB0aGlzLm9wdGlvbnMgd2hlbiBwcm92aWRlZCkuXG4gICAqIEVhY2ggcm93IGNhbiBoYXZlIGRpZmZlcmVudCBvcHRpb25zLiBUbyBhdm9pZCBkdXBsaWNhdGVzLCBleGNsdWRlIG9wdGlvbnNcbiAgICogYWxyZWFkeSBzZWxlY3RlZCBpbiBvdGhlciByb3dzIChrZWVwIGN1cnJlbnQgcm93J3Mgc2VsZWN0aW9uIHNvIGl0IGRpc3BsYXlzKS5cbiAgICovXG4gIEBJbnB1dCgpIGdldFNlbGVjdENvbmZpZyE6IChpbmRleDogbnVtYmVyLCBvcHRpb25zPzogU2VsZWN0T3B0aW9uW10pID0+IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICAvKiogU2VjdGlvbiBsYWJlbCAoZS5nLiBcIlByZXJlcXVpc2l0ZSBDYXNlc1wiKSAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICdQcmVyZXF1aXNpdGUgQ2FzZXMnO1xuXG4gIC8qKiBUb29sdGlwIGZvciB0aGUgaW5mbyBpY29uICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwID0gJ0FkZCBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlcyB0aGF0IG11c3QgcnVuIGJlZm9yZSB0aGlzIHRlc3QgY2FzZSc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBcIkFkZCBBbm90aGVyXCIgYnV0dG9uICovXG4gIEBJbnB1dCgpIGFkZEFub3RoZXJUZXh0ID0gJ0FkZCBBbm90aGVyJztcblxuICAvKiogVGV4dCBmb3IgdGhlIFVwZGF0ZSBidXR0b24gKi9cbiAgQElucHV0KCkgdXBkYXRlVGV4dCA9ICdVcGRhdGUnO1xuXG4gIC8qKiBUZXh0IGZvciB0aGUgQ2FuY2VsIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBjYW5jZWxUZXh0ID0gJ0NhbmNlbCc7XG5cbiAgLyoqIFRleHQgZm9yIHRoZSBjb2xsYXBzZWQgXCJBZGRcIiB0cmlnZ2VyICovXG4gIEBJbnB1dCgpIGFkZFRyaWdnZXJUZXh0ID0gJ0FkZCBQcmVyZXF1aXNpdGUnO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhpZGUgQWRkIFByZXJlcXVpc2l0ZSBidXR0b24gZXZlbiBpZiByb3dzIGFyZSBlbXB0eSAoZS5nLiB3aGVuIGNvbGxhcHNpbmcgYWZ0ZXIgdXBkYXRlIHdpdGggZXhpc3RpbmcgcHJlcmVxdWlzaXRlcykgKi9cbiAgQElucHV0KCkgaGlkZUFkZFByZXJlcXVpc2l0ZSA9IGZhbHNlO1xuXG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBjb250cm9scyBVcGRhdGUgYnV0dG9uIGRpc2FibGVkIHN0YXRlLiBVc2UgZm9yIGRpcnR5LXN0YXRlIHZhbGlkYXRpb24gKGVuYWJsZSB3aGVuIGZvcm0gY2hhbmdlZCkuIFdoZW4gdW5kZWZpbmVkLCBmYWxscyBiYWNrIHRvICFhbGxSb3dzSGF2ZVZhbHVlcygpLiAqL1xuICBASW5wdXQoKSB1cGRhdGVEaXNhYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogV2hlbiB0cnVlLCBVcGRhdGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBzaG93cyBhIGxvYWRlciAoQVBJIGluIHByb2dyZXNzKSAqL1xuICBASW5wdXQoKSBpc1VwZGF0aW5nID0gZmFsc2U7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgcHJlcmVxdWlzaXRlIGRyb3Bkb3duIHVzZXMgc2VydmVyLXNpZGUgc2VhcmNoIGFuZCBsb2FkIG1vcmUgKGVtaXQgc2VhcmNoT3B0aW9ucyAvIGxvYWRNb3JlT3B0aW9ucykuICovXG4gIEBJbnB1dCgpIGVuYWJsZVNlcnZlclNlYXJjaCA9IGZhbHNlO1xuICAvKiogUGVyLXJvdzogd2hldGhlciBtb3JlIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgbG9hZCBtb3JlLiBLZXkgPSByb3cgaW5kZXguICovXG4gIEBJbnB1dCgpIGhhc01vcmVPcHRpb25zOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiA9IHt9O1xuICAvKiogUGVyLXJvdzogdHJ1ZSB3aGlsZSBvcHRpb25zIGFyZSBsb2FkaW5nIGZvciB0aGF0IGRyb3Bkb3duLiBLZXkgPSByb3cgaW5kZXguICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ09wdGlvbnM6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+ID0ge307XG5cbiAgLyoqIFZhbGlkYXRpb24gbWVzc2FnZSBzaG93biB3aGVuIEFkZCBBbm90aGVyL1VwZGF0ZSBhcmUgZGlzYWJsZWQgKG5vdCBhbGwgcm93cyBoYXZlIHZhbHVlcykgKi9cbiAgQElucHV0KCkgc2VsZWN0Rmlyc3RWYWxpZGF0aW9uTWVzc2FnZSA9ICdQbGVhc2Ugc2VsZWN0IGEgcHJlcmVxdWlzaXRlIGZvciBlYWNoIHJvdyBmaXJzdCwgdGhlbiBjbGljayBBZGQgQW5vdGhlci4nO1xuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBzZWxlY3Qgc2xvdC4gVXNlIG5nLXRlbXBsYXRlICNzZWxlY3RCb2R5IHdpdGggbGV0LXJvdywgbGV0LWluZGV4LCBsZXQtZm9ybSwgbGV0LWNvbmZpZy4gKi9cbiAgQENvbnRlbnRDaGlsZCgnc2VsZWN0Qm9keScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgc2VsZWN0Qm9keVRwbD86IFRlbXBsYXRlUmVmPHtcbiAgICAkaW1wbGljaXQ6IFByZXJlcXVpc2l0ZVJvdztcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBjb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgfT47XG5cbiAgQE91dHB1dCgpIGV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgYWRkUm93ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVtb3ZlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByb3dzUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVSb3dbXT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBVcGRhdGUgYnV0dG9uIGlzIGNsaWNrZWQgKi9cbiAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBDYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWQgKi9cbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNpbmdsZSByb3cncyBzZWxlY3Rpb24gY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bjsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2VhcmNoZXMgaW4gcHJlcmVxdWlzaXRlIGRyb3Bkb3duIChzZXJ2ZXIgc2VhcmNoKS4gUGFyZW50IHNob3VsZCBmZXRjaCBvcHRpb25zIGFuZCB1cGRhdGUgb3B0aW9ucyBpbnB1dC4gKi9cbiAgQE91dHB1dCgpIHNlYXJjaE9wdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaW5kZXg6IG51bWJlcjsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUgb3B0aW9ucy4gUGFyZW50IHNob3VsZCBhcHBlbmQgdG8gb3B0aW9ucyBhbmQgc2V0IGhhc01vcmVPcHRpb25zLiAqL1xuICBAT3V0cHV0KCkgbG9hZE1vcmVPcHRpb25zID0gbmV3IEV2ZW50RW1pdHRlcjx7IGluZGV4OiBudW1iZXI7IHF1ZXJ5OiBzdHJpbmcgfT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiBhbnkgc2VsZWN0IGNoYW5nZXMgLSByZXR1cm5zIGFsbCBjdXJyZW50IHByZXJlcXVpc2l0ZSBzZWxlY3Rpb25zIGluIG9yZGVyICovXG4gIEBPdXRwdXQoKSBwcmVyZXF1aXNpdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcmVyZXF1aXNpdGVTZWxlY3Rpb25bXT4oKTtcblxuICAvKiogU2V0IHRvIHRydWUgd2hlbiB1c2VyIGNsaWNrcyBBZGQgQW5vdGhlciB3aGlsZSBpbnZhbGlkIC0gc2hvd3MgdmFsaWRhdGlvbiBtZXNzYWdlICovXG4gIHNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB0b2dnbGVFeHBhbmRlZChzaG93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZCA9IHNob3c7XG4gICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHNob3cpO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIFwiQWRkIFByZXJlcXVpc2l0ZVwiIHdpdGggbm8gcm93cyAtIGV4cGFuZHMgYW5kIGFkZHMgZmlyc3Qgcm93ICovXG4gIG9uQWRkUHJlcmVxdWlzaXRlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZCh0cnVlKTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZFJvdygpOiB2b2lkIHtcbiAgICAvLyBBbGxvdyBhZGRpbmcgZmlyc3Qgcm93IHdoZW4gZW1wdHkgKG5vIHZhbGlkYXRpb24gbmVlZGVkKVxuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID4gMCAmJiAhdGhpcy5hbGxSb3dzSGF2ZVZhbHVlcygpKSB7XG4gICAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93QWRkQW5vdGhlclZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmFkZFJvdy5lbWl0KCk7XG4gIH1cblxuICBvblJlbW92ZVJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVSb3cuZW1pdChpbmRleCk7XG4gIH1cblxuICBvbkRuZERyb3AoZXZlbnQ6IERuZERyb3BFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhID09IG51bGwgfHwgZXZlbnQuaW5kZXggPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRyb3BSb3cgPSBldmVudC5kYXRhIGFzIFByZXJlcXVpc2l0ZVJvdztcbiAgICBsZXQgZHJvcEluZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgocikgPT4gci5rZXkgPT09IGRyb3BSb3cua2V5KTtcbiAgICBpZiAoY3VycmVudEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIGlmIChjdXJyZW50SW5kZXggPT09IGRyb3BJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Um93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIG5ld1Jvd3Muc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgLy8gSWYgbW92aW5nIGZvcndhcmQsIGRyb3BJbmRleCBzaGlmdHMgYWZ0ZXIgcmVtb3ZhbFxuICAgIGlmIChjdXJyZW50SW5kZXggPCBkcm9wSW5kZXgpIHtcbiAgICAgIGRyb3BJbmRleC0tO1xuICAgIH1cbiAgICBuZXdSb3dzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyb3BSb3cpO1xuICAgIHRoaXMucm93c1Jlb3JkZXJlZC5lbWl0KG5ld1Jvd3MpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdHJhY2tCeUtleShfaTogbnVtYmVyLCByb3c6IFByZXJlcXVpc2l0ZVJvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdy5rZXk7XG4gIH1cblxuICBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1VwZGF0aW5nKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGUuZW1pdCgpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsgLi4uZXZlbnQsIGluZGV4IH0pO1xuICAgIHRoaXMuZW1pdEFsbFByZXJlcXVpc2l0ZXMoKTtcbiAgICBpZiAodGhpcy5hbGxSb3dzSGF2ZVZhbHVlcygpKSB7XG4gICAgICB0aGlzLnNob3dBZGRBbm90aGVyVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gZXZlcnkgcm93IGhhcyBhIG5vbi1lbXB0eSB2YWx1ZSAobm8gcGxhY2Vob2xkZXJzKSAqL1xuICBhbGxSb3dzSGF2ZVZhbHVlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZm9ybSB8fCAhdGhpcy5yb3dzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnJvd3MuZXZlcnkoKHJvdykgPT4ge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5mb3JtLmdldChyb3cua2V5KT8udmFsdWU7XG4gICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb21wdXRlZCBkaXNhYmxlZCBzdGF0ZSBmb3IgVXBkYXRlIGJ1dHRvbi4gV2hlbiBpc1VwZGF0aW5nIHdlIGRvIG5vdCBkaXNhYmxlIChzaG93IGxvYWRlciBvbmx5KTsgdXNlIHVwZGF0ZURpc2FibGVkIGZvciBvdGhlciBjYXNlcy4gKi9cbiAgaXNVcGRhdGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy51cGRhdGVEaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVEaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEVtaXRzIGFsbCBjdXJyZW50IHByZXJlcXVpc2l0ZSBzZWxlY3Rpb25zIChrZXkgKyB2YWx1ZSkgaW4gcm93IG9yZGVyICovXG4gIHByaXZhdGUgZW1pdEFsbFByZXJlcXVpc2l0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMucm93cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBQcmVyZXF1aXNpdGVTZWxlY3Rpb25bXSA9IHRoaXMucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICAgIGtleTogcm93LmtleSxcbiAgICAgIHZhbHVlOiB0aGlzLmZvcm0uZ2V0KHJvdy5rZXkpPy52YWx1ZSA/PyBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLnByZXJlcXVpc2l0ZXNDaGFuZ2UuZW1pdChzZWxlY3Rpb25zKTtcbiAgfVxuXG4gIGdldENvbmZpZyhpbmRleDogbnVtYmVyKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zPy5sZW5ndGggPyB0aGlzLm9wdGlvbnMgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuZ2V0U2VsZWN0Q29uZmlnPy4oaW5kZXgsIG9wdHMpID8/IHsga2V5OiBgcm93XyR7aW5kZXh9YCwgb3B0aW9uczogdGhpcy5vcHRpb25zID8/IFtdIH07XG4gICAgaWYgKHRoaXMuZW5hYmxlU2VydmVyU2VhcmNoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICAgIGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZSxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlT3B0aW9uc1tpbmRleF0gPz8gZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdPcHRpb25zW2luZGV4XSA/PyBmYWxzZSxcbiAgICAgICAgb25TZWFyY2g6IChxKSA9PiB0aGlzLnNlYXJjaE9wdGlvbnMuZW1pdCh7IGluZGV4LCBxdWVyeTogcSA/PyAnJyB9KSxcbiAgICAgICAgb25Mb2FkTW9yZTogKHEpID0+IHRoaXMubG9hZE1vcmVPcHRpb25zLmVtaXQoeyBpbmRleCwgcXVlcnk6IHEgPz8gJycgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxufVxuIiwiPCEtLSBBZGQgUHJlcmVxdWlzaXRlIHRyaWdnZXIgLSBvbmx5IHdoZW4gY29sbGFwc2VkIGFuZCBubyByb3dzICh1c2VyIG11c3QgY2xpY2sgdG8gZXhwYW5kKTsgaGlkZSB3aGVuIHBhcmVudCBoYXMgcHJlcmVxdWlzaXRlcyAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dzLmxlbmd0aCA9PT0gMCAmJiAhZXhwYW5kZWQgJiYgIWhpZGVBZGRQcmVyZXF1aXNpdGVcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItZGFzaGVkIGNxYS1ib3JkZXItWyNEOEQ5RkNdIGNxYS1yb3VuZGVkLWxnIGNxYS1wLTEgY3FhLW10LTQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWdhcC0yICBjcWEtdy1mdWxsIGNxYS1ob3ZlcjpjcWEtYm9yZGVyLVsjOTk5OWVlXSBjcWEtaG92ZXI6Y3FhLWJnLVsjZjhmOGZmXSBjcWEtYWN0aXZlOmNxYS1ib3JkZXItWyM3YzdjZTBdIGNxYS1hY3RpdmU6Y3FhLWJnLVsjZWZmNmZmXVwiXG4gICAgKGNsaWNrKT1cIm9uQWRkUHJlcmVxdWlzaXRlQ2xpY2soKVwiPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdy1bMTJweF0gY3FhLWgtWzEycHhdIGNxYS10ZXh0LVsjM0Y0M0VFXVwiPmFkZDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1yZWd1bGFyIGNxYS1mb250LWludGVyIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjM0Y0M0VFXVwiPnt7IGFkZFRyaWdnZXJUZXh0IH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIENvbGxhcHNlZCBzdW1tYXJ5IHdoZW4gd2UgaGF2ZSByb3dzIGJ1dCBleHBhbmRlZD1mYWxzZSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dzLmxlbmd0aCA+IDAgJiYgIWV4cGFuZGVkXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjRDhEOUZDXSBjcWEtcm91bmRlZC1sZyBjcWEtcC0xLjUgY3FhLW10LTQgY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1taW4taC1bMjdweF0gY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5Y2EzYWZdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOWZhZmJdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzYzNjZmMV0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQodHJ1ZSlcIj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNGE1NTY1XSBjcWEtZm9udC1ub3JtYWwgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQteHNcIj57eyByb3dzLmxlbmd0aCB9fSBwcmVyZXF1aXNpdGV7eyByb3dzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnIH19PC9zcGFuPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy1bMTRweF0gY3FhLWgtWzE0cHhdIGNxYS10ZXh0LVsjNGE1NTY1XVwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBFeHBhbmRlZCBmb3JtIC0gd2hlbiBleHBhbmRlZD10cnVlICh3aXRoIG9yIHdpdGhvdXQgcm93czsgbm8gQWRkIFByZXJlcXVpc2l0ZSB0cmlnZ2VyKSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJleHBhbmRlZFwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXAtMyBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjZTVlN2ViXSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1tYi0zXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1tLTAgY3FhLWxlYWRpbmctbm9uZVwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtbXQtMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy00IGNxYS1oLTQgY3FhLXRleHQtc20gY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItaGVscCBjcWEtZmxleC1zaHJpbmstMFwiIFttYXRUb29sdGlwXT1cImluZm9Ub29sdGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiMzAwXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1tbC1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTcgY3FhLWgtNyBjcWEtcC0wIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtaG92ZXI6Y3FhLWJnLVsjZjNmNGY2XSBjcWEtaG92ZXI6Y3FhLXRleHQtWyMzNzQxNTFdXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZGVkKGZhbHNlKVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJDbG9zZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicHJlcmVxdWlzaXRlLWRyb3AtbGlzdCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYi0zXCJcbiAgICAgIFtkbmREcm9wem9uZV09XCJbJ3ByZXJlcXVpc2l0ZS1yb3cnXVwiXG4gICAgICBkbmRFZmZlY3RBbGxvd2VkPVwibW92ZVwiXG4gICAgICBkbmREcmFnb3ZlckNsYXNzPVwiZG5kRHJhZ292ZXJcIlxuICAgICAgKGRuZERyb3ApPVwib25EbmREcm9wKCRldmVudClcIj5cbiAgICAgIDxkaXYgZG5kUGxhY2Vob2xkZXJSZWYgY2xhc3M9XCJwcmVyZXF1aXNpdGUtZHJhZy1wbGFjZWhvbGRlclwiPkRyb3AgaGVyZTwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIlxuICAgICAgICBjbGFzcz1cInByZXJlcXVpc2l0ZS1kcmFnLWl0ZW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIlxuICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cInJvd1wiXG4gICAgICAgIFtkbmREaXNhYmxlSWZdPVwicm93cy5sZW5ndGggPD0gMVwiXG4gICAgICAgIGRuZEVmZmVjdEFsbG93ZWQ9XCJtb3ZlXCJcbiAgICAgICAgZG5kVHlwZT1cInByZXJlcXVpc2l0ZS1yb3dcIj5cbiAgICAgICAgPCEtLSA5LWRvdCBncmlkIGRyYWcgaGFuZGxlIChvbmx5IHdoZW4gbXVsdGlwbGUgcm93cyB0byByZW9yZGVyKSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInJvd3MubGVuZ3RoID4gMVwiIGRuZEhhbmRsZSBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1jdXJzb3ItZ3JhYiBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWhvdmVyOmNxYS10ZXh0LVsjMTExODI3XSBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZ1wiIG1hdFRvb2x0aXA9XCJEcmFnIHRvIHJlb3JkZXJcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiM1wiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEzXCIgY3k9XCIzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiOFwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjNcIiBjeT1cIjEzXCIgcj1cIjEuNVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxM1wiIGN5PVwiMTNcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDwhLS0gQ3VzdG9tIHRlbXBsYXRlIChlLmcuIHBhcmVudC1wcm92aWRlZCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0Qm9keVRwbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Qm9keVRwbDsgY29udGV4dDoge1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvdyxcbiAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgIGZvcm06IGZvcm0sXG4gICAgICAgICAgICAgIGNvbmZpZzogZ2V0Q29uZmlnKGkpXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIERlZmF1bHQ6IGJ1aWx0LWluIGNxYS1keW5hbWljLXNlbGVjdCAtLT5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICpuZ0lmPVwiIXNlbGVjdEJvZHlUcGwgJiYgZm9ybVwiXG4gICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWcoaSlcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTggY3FhLWgtOCBjcWEtbWluLXctWzMycHhdIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXJvdW5kZWQtbWQgY3FhLXRleHQtWyM2YjcyODBdIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1ob3ZlcjpjcWEtYmctWyNmM2Y0ZjZdIGNxYS1ob3ZlcjpjcWEtdGV4dC1bIzM3NDE1MV1cIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmVSb3coaSlcIlxuICAgICAgICBtYXRUb29sdGlwPVwiQ2FuY2VsXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LWxnIGNxYS13LVsxOHB4XSBjcWEtaC1bMThweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93QWRkQW5vdGhlclZhbGlkYXRpb24gJiYgIWFsbFJvd3NIYXZlVmFsdWVzKClcIiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjZGMyNjI2XSBjcWEtbWItMlwiPlxuICAgICAge3sgc2VsZWN0Rmlyc3RWYWxpZGF0aW9uTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICAgIDwhLS0gQWRkIFByZXJlcXVpc2l0ZSBidXR0b24gb25seSBpbiBlbXB0eSBzdGF0ZTsgaGlkZSB3aGVuIHBhcmVudCBoYXMgcHJlcmVxdWlzaXRlcyAoZS5nLiBjb2xsYXBzaW5nIGFmdGVyIHVwZGF0ZSkgLS0+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJyb3dzLmxlbmd0aCA9PT0gMCAmJiAhaGlkZUFkZFByZXJlcXVpc2l0ZVwiXG4gICAgICBjbGFzcz1cImNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjY2NjY2ZmXSBjcWEtcm91bmRlZC1sZyBjcWEtcC0zIGNxYS1tYi0zIGNxYS1iZy13aGl0ZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLWgtWzQwcHhdIGNxYS13LWZ1bGwgY3FhLWhvdmVyOmNxYS1ib3JkZXItWyM5OTk5ZWVdIGNxYS1ob3ZlcjpjcWEtYmctWyNmOGY4ZmZdIGNxYS1hY3RpdmU6Y3FhLWJvcmRlci1bIzdjN2NlMF0gY3FhLWFjdGl2ZTpjcWEtYmctWyNlZmY2ZmZdXCJcbiAgICAgIChjbGljayk9XCJvbkFkZFJvdygpXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XSBjcWEtdGV4dC1bIzNiODJmNl1cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1tZWRpdW0gY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyMzYjgyZjZdXCI+e3sgYWRkVHJpZ2dlclRleHQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBBZGQgQW5vdGhlciBsaW5rIHdoZW4gd2UgYWxyZWFkeSBoYXZlIGF0IGxlYXN0IG9uZSByb3cgLS0+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJyb3dzLmxlbmd0aCA+IDAgJiYgIWhpZGVBZGRQcmVyZXF1aXNpdGVcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNxYS1tYi0zIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWZvbnQtaW50ZXIgY3FhLXRleHQtc20gY3FhLXRleHQtWyM0MjQyREJdIGNxYS1ob3ZlcjpjcWEtdW5kZXJsaW5lXCJcbiAgICAgIChjbGljayk9XCJvbkFkZFJvdygpXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLXctWzE4cHhdIGNxYS1oLVsxOHB4XVwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8c3Bhbj57eyBhZGRBbm90aGVyVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0zIGNxYS1qdXN0aWZ5LWVuZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcHktMi41IGNxYS1weC00IGNxYS1iZy13aGl0ZSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjZDFkNWRiXSBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWhvdmVyOmNxYS1iZy1bI2Y5ZmFmYl1cIlxuICAgICAgICAoY2xpY2spPVwib25DYW5jZWwoKVwiPlxuICAgICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXB5LTIuNSBjcWEtcHgtNCBjcWEtcm91bmRlZC1tZCBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGRpc2FibGVkOmNxYS1vcGFjaXR5LTUwIGRpc2FibGVkOmNxYS1jdXJzb3Itbm90LWFsbG93ZWQgY3FhLWJnLVsjMWE1NmRiXSBjcWEtdGV4dC13aGl0ZSBjcWEtaG92ZXI6Y3FhLWJnLVsjMTY0N2I4XSBkaXNhYmxlZDpjcWEtYmctWyMxYTU2ZGJdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCJpc1VwZGF0aW5nID8gJ25vbmUnIDogJ2F1dG8nXCJcbiAgICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc1VwZGF0aW5nID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1VwZGF0ZURpc2FibGVkKClcIlxuICAgICAgICAoY2xpY2spPVwib25VcGRhdGUoKVwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJpc1VwZGF0aW5nXCIgZGlhbWV0ZXI9XCIxNlwiIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayB1cGRhdGUtc3Bpbm5lci13aGl0ZVwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxzcGFuPnt7IHVwZGF0ZVRleHQgfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==