@cqa-lib/cqa-ui 1.1.436 → 1.1.438

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.
@@ -11,7 +11,7 @@ export class VersionHistoryCompareComponent {
11
11
  this.compareFromId = null;
12
12
  this.compareToId = null;
13
13
  this.formatValueHtmlFn = (v) => String(v ?? '');
14
- this.fieldLabelMap = {};
14
+ this.getFieldLabelFn = (f) => f || 'field';
15
15
  this.swapVersions = new EventEmitter();
16
16
  this.closeComparison = new EventEmitter();
17
17
  this.compareFromChange = new EventEmitter();
@@ -23,12 +23,6 @@ export class VersionHistoryCompareComponent {
23
23
  this.groupedStepChanges = this.buildGroupedStepChanges();
24
24
  }
25
25
  }
26
- getFieldLabel(field) {
27
- if (!field) {
28
- return 'field';
29
- }
30
- return this.fieldLabelMap[field] || field;
31
- }
32
26
  buildGroupedStepChanges() {
33
27
  const changes = this.compareResult?.stepChanges || [];
34
28
  if (!changes.length) {
@@ -59,10 +53,10 @@ export class VersionHistoryCompareComponent {
59
53
  }
60
54
  }
61
55
  VersionHistoryCompareComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryCompareComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
62
- VersionHistoryCompareComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryCompareComponent, selector: "cqa-version-history-compare", inputs: { compareResult: "compareResult", versions: "versions", compareFromId: "compareFromId", compareToId: "compareToId", formatValueHtmlFn: "formatValueHtmlFn", fieldLabelMap: "fieldLabelMap" }, outputs: { swapVersions: "swapVersions", closeComparison: "closeComparison", compareFromChange: "compareFromChange", compareToChange: "compareToChange" }, usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-header\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap versions\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2L4 14M4 14L1 11M4 14L7 11M12 14L12 2M12 2L9 5M12 2L15 5\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span class=\"cqa-vh-compare-title\">Version Comparison</span>\n <cqa-badge *ngIf=\"compareResult\" [label]=\"compareResult.totalDifferences + ' differences'\" size=\"small\"\n variant=\"info\" backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <cqa-button variant=\"outlined\" text=\"Close\" (clicked)=\"closeComparison.emit()\"></cqa-button>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-selectors\">\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; flex: 1; min-width: 0;\">\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareFromId\" (ngModelChange)=\"compareFromChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 5H14M14 5L11 2M14 5L11 8M14 11H2M2 11L5 8M2 11L5 14\" stroke=\"#3f43ee\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareToId\" (ngModelChange)=\"compareToChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"!compareResult\" class=\"cqa-vh-compare-loading\">\n Loading comparison...\n </div>\n\n <ng-container *ngIf=\"compareResult\">\n <div class=\"d-flex align-items-center cqa-vh-compare-summary-badges\">\n <cqa-badge [label]=\"'+ ' + compareResult.summary.added + ' added'\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n <cqa-badge [label]=\"'~ ' + compareResult.summary.modified + ' modified'\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n <cqa-badge [label]=\"'- ' + compareResult.summary.removed + ' removed'\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n <cqa-badge [label]=\"'= ' + compareResult.summary.unchanged + ' unchanged'\" size=\"small\" backgroundColor=\"#F2F4F7\"\n textColor=\"#344054\" borderColor=\"#E4E7EC\"></cqa-badge>\n </div>\n\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length || compareResult.stepChanges?.length; else noDiffs\">\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\">\n <span>Test Case Changes</span>\n <cqa-badge [label]=\"compareResult.testCaseChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div *ngFor=\"let change of compareResult.testCaseChanges\" class=\"cqa-vh-compare-diff-row\">\n <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabel(change.field) }}</div>\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0;\">\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compareResult.stepChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\"\n [style.margin-top.px]=\"compareResult.testCaseChanges?.length ? 20 : 0\">\n <span>Step Changes</span>\n <cqa-badge [label]=\"compareResult.stepChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <ng-container *ngFor=\"let stepGroup of groupedStepChanges; let sgi = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"cqa-vh-detail-step-group-header\" [style.margin-top.px]=\"sgi > 0 ? 14 : 4\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\" textColor=\"#636A71\"\n borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n\n <!-- Changes within this step -->\n <div class=\"cqa-vh-compare-diff-row-container\">\n <div *ngFor=\"let change of stepGroup.changes\"\n class=\"cqa-vh-compare-diff-row cqa-vh-compare-diff-row--indented\">\n <!-- <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabel(change.field) }}</div> -->\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0; flex-grow:1;\">\n <div *ngIf=\"change.fromValue != null\"\n class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #noDiffs>\n <div class=\"cqa-vh-compare-empty\">\n <cqa-empty-state title=\"No differences\" description=\"No differences between these versions.\"></cqa-empty-state>\n </div>\n </ng-template>\n </ng-container>\n</div>", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "date": i4.DatePipe } });
56
+ VersionHistoryCompareComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryCompareComponent, selector: "cqa-version-history-compare", inputs: { compareResult: "compareResult", versions: "versions", compareFromId: "compareFromId", compareToId: "compareToId", formatValueHtmlFn: "formatValueHtmlFn", getFieldLabelFn: "getFieldLabelFn" }, outputs: { swapVersions: "swapVersions", closeComparison: "closeComparison", compareFromChange: "compareFromChange", compareToChange: "compareToChange" }, usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-header\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap versions\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2L4 14M4 14L1 11M4 14L7 11M12 14L12 2M12 2L9 5M12 2L15 5\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span class=\"cqa-vh-compare-title\">Version Comparison</span>\n <cqa-badge *ngIf=\"compareResult\" [label]=\"compareResult.totalDifferences + ' differences'\" size=\"small\"\n variant=\"info\" backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <cqa-button variant=\"outlined\" text=\"Close\" (clicked)=\"closeComparison.emit()\"></cqa-button>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-selectors\">\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; flex: 1; min-width: 0;\">\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareFromId\" (ngModelChange)=\"compareFromChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 5H14M14 5L11 2M14 5L11 8M14 11H2M2 11L5 8M2 11L5 14\" stroke=\"#3f43ee\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareToId\" (ngModelChange)=\"compareToChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"!compareResult\" class=\"cqa-vh-compare-loading\">\n Loading comparison...\n </div>\n\n <ng-container *ngIf=\"compareResult\">\n <div class=\"d-flex align-items-center cqa-vh-compare-summary-badges\">\n <cqa-badge [label]=\"'+ ' + compareResult.summary.added + ' added'\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n <cqa-badge [label]=\"'~ ' + compareResult.summary.modified + ' modified'\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n <cqa-badge [label]=\"'- ' + compareResult.summary.removed + ' removed'\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n <cqa-badge [label]=\"'= ' + compareResult.summary.unchanged + ' unchanged'\" size=\"small\" backgroundColor=\"#F2F4F7\"\n textColor=\"#344054\" borderColor=\"#E4E7EC\"></cqa-badge>\n </div>\n\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length || compareResult.stepChanges?.length; else noDiffs\">\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\">\n <span>Test Case Changes</span>\n <cqa-badge [label]=\"compareResult.testCaseChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div *ngFor=\"let change of compareResult.testCaseChanges\" class=\"cqa-vh-compare-diff-row\">\n <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabelFn(change.field) }}</div>\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0;\">\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compareResult.stepChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\"\n [style.margin-top.px]=\"compareResult.testCaseChanges?.length ? 20 : 0\">\n <span>Step Changes</span>\n <cqa-badge [label]=\"compareResult.stepChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <ng-container *ngFor=\"let stepGroup of groupedStepChanges; let sgi = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"cqa-vh-detail-step-group-header\" [style.margin-top.px]=\"sgi > 0 ? 14 : 4\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\" textColor=\"#636A71\"\n borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n\n <!-- Changes within this step -->\n <div class=\"cqa-vh-compare-diff-row-container\">\n <div *ngFor=\"let change of stepGroup.changes\"\n class=\"cqa-vh-compare-diff-row cqa-vh-compare-diff-row--indented\">\n <!-- <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabelFn(change.field) }}</div> -->\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0; flex-grow:1;\">\n <div *ngIf=\"change.fromValue != null\"\n class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #noDiffs>\n <div class=\"cqa-vh-compare-empty\">\n <cqa-empty-state title=\"No differences\" description=\"No differences between these versions.\"></cqa-empty-state>\n </div>\n </ng-template>\n </ng-container>\n</div>", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "date": i4.DatePipe } });
63
57
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryCompareComponent, decorators: [{
64
58
  type: Component,
65
- args: [{ selector: 'cqa-version-history-compare', template: "<div>\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-header\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap versions\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2L4 14M4 14L1 11M4 14L7 11M12 14L12 2M12 2L9 5M12 2L15 5\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span class=\"cqa-vh-compare-title\">Version Comparison</span>\n <cqa-badge *ngIf=\"compareResult\" [label]=\"compareResult.totalDifferences + ' differences'\" size=\"small\"\n variant=\"info\" backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <cqa-button variant=\"outlined\" text=\"Close\" (clicked)=\"closeComparison.emit()\"></cqa-button>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-selectors\">\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; flex: 1; min-width: 0;\">\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareFromId\" (ngModelChange)=\"compareFromChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 5H14M14 5L11 2M14 5L11 8M14 11H2M2 11L5 8M2 11L5 14\" stroke=\"#3f43ee\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareToId\" (ngModelChange)=\"compareToChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"!compareResult\" class=\"cqa-vh-compare-loading\">\n Loading comparison...\n </div>\n\n <ng-container *ngIf=\"compareResult\">\n <div class=\"d-flex align-items-center cqa-vh-compare-summary-badges\">\n <cqa-badge [label]=\"'+ ' + compareResult.summary.added + ' added'\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n <cqa-badge [label]=\"'~ ' + compareResult.summary.modified + ' modified'\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n <cqa-badge [label]=\"'- ' + compareResult.summary.removed + ' removed'\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n <cqa-badge [label]=\"'= ' + compareResult.summary.unchanged + ' unchanged'\" size=\"small\" backgroundColor=\"#F2F4F7\"\n textColor=\"#344054\" borderColor=\"#E4E7EC\"></cqa-badge>\n </div>\n\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length || compareResult.stepChanges?.length; else noDiffs\">\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\">\n <span>Test Case Changes</span>\n <cqa-badge [label]=\"compareResult.testCaseChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div *ngFor=\"let change of compareResult.testCaseChanges\" class=\"cqa-vh-compare-diff-row\">\n <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabel(change.field) }}</div>\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0;\">\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compareResult.stepChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\"\n [style.margin-top.px]=\"compareResult.testCaseChanges?.length ? 20 : 0\">\n <span>Step Changes</span>\n <cqa-badge [label]=\"compareResult.stepChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <ng-container *ngFor=\"let stepGroup of groupedStepChanges; let sgi = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"cqa-vh-detail-step-group-header\" [style.margin-top.px]=\"sgi > 0 ? 14 : 4\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\" textColor=\"#636A71\"\n borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n\n <!-- Changes within this step -->\n <div class=\"cqa-vh-compare-diff-row-container\">\n <div *ngFor=\"let change of stepGroup.changes\"\n class=\"cqa-vh-compare-diff-row cqa-vh-compare-diff-row--indented\">\n <!-- <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabel(change.field) }}</div> -->\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0; flex-grow:1;\">\n <div *ngIf=\"change.fromValue != null\"\n class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #noDiffs>\n <div class=\"cqa-vh-compare-empty\">\n <cqa-empty-state title=\"No differences\" description=\"No differences between these versions.\"></cqa-empty-state>\n </div>\n </ng-template>\n </ng-container>\n</div>", styles: [] }]
59
+ args: [{ selector: 'cqa-version-history-compare', template: "<div>\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-header\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px;\">\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap versions\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 2L4 14M4 14L1 11M4 14L7 11M12 14L12 2M12 2L9 5M12 2L15 5\" stroke=\"#667085\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span class=\"cqa-vh-compare-title\">Version Comparison</span>\n <cqa-badge *ngIf=\"compareResult\" [label]=\"compareResult.totalDifferences + ' differences'\" size=\"small\"\n variant=\"info\" backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <cqa-button variant=\"outlined\" text=\"Close\" (clicked)=\"closeComparison.emit()\"></cqa-button>\n </div>\n\n <div class=\"d-flex align-items-center justify-content-between cqa-vh-compare-selectors\">\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; flex: 1; min-width: 0;\">\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareFromId\" (ngModelChange)=\"compareFromChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n <span class=\"cqa-vh-compare-swap-btn\" (click)=\"swapVersions.emit()\" title=\"Swap\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 5H14M14 5L11 2M14 5L11 8M14 11H2M2 11L5 8M2 11L5 14\" stroke=\"#3f43ee\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <select class=\"cqa-vh-compare-select\" [ngModel]=\"compareToId\" (ngModelChange)=\"compareToChange.emit($event)\">\n <option *ngFor=\"let v of versions\" [ngValue]=\"v.id\">V{{ v.versionNumber }} \u00B7 {{ v.displayDate | date:'MMM d,\n yyyy \u00B7 h:mm a' }}</option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"!compareResult\" class=\"cqa-vh-compare-loading\">\n Loading comparison...\n </div>\n\n <ng-container *ngIf=\"compareResult\">\n <div class=\"d-flex align-items-center cqa-vh-compare-summary-badges\">\n <cqa-badge [label]=\"'+ ' + compareResult.summary.added + ' added'\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n <cqa-badge [label]=\"'~ ' + compareResult.summary.modified + ' modified'\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n <cqa-badge [label]=\"'- ' + compareResult.summary.removed + ' removed'\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n <cqa-badge [label]=\"'= ' + compareResult.summary.unchanged + ' unchanged'\" size=\"small\" backgroundColor=\"#F2F4F7\"\n textColor=\"#344054\" borderColor=\"#E4E7EC\"></cqa-badge>\n </div>\n\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length || compareResult.stepChanges?.length; else noDiffs\">\n <ng-container *ngIf=\"compareResult.testCaseChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\">\n <span>Test Case Changes</span>\n <cqa-badge [label]=\"compareResult.testCaseChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div *ngFor=\"let change of compareResult.testCaseChanges\" class=\"cqa-vh-compare-diff-row\">\n <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabelFn(change.field) }}</div>\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0;\">\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compareResult.stepChanges?.length\">\n <div class=\"d-flex align-items-center cqa-vh-compare-section-header\"\n [style.margin-top.px]=\"compareResult.testCaseChanges?.length ? 20 : 0\">\n <span>Step Changes</span>\n <cqa-badge [label]=\"compareResult.stepChanges.length + ' diffs'\" size=\"small\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <ng-container *ngFor=\"let stepGroup of groupedStepChanges; let sgi = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"cqa-vh-detail-step-group-header\" [style.margin-top.px]=\"sgi > 0 ? 14 : 4\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\" textColor=\"#636A71\"\n borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n\n <!-- Changes within this step -->\n <div class=\"cqa-vh-compare-diff-row-container\">\n <div *ngFor=\"let change of stepGroup.changes\"\n class=\"cqa-vh-compare-diff-row cqa-vh-compare-diff-row--indented\">\n <!-- <div class=\"cqa-vh-compare-field-label\">{{ getFieldLabelFn(change.field) }}</div> -->\n <div style=\"display: flex; flex: 1; gap: 12px; min-width: 0; flex-grow:1;\">\n <div *ngIf=\"change.fromValue != null\"\n class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--removed\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.fromValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-compare-diff-cell cqa-vh-compare-diff-cell--added\">\n <div class=\"cqa-vh-compare-diff-cell-text\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></div>\n </div>\n <div *ngIf=\"change.toValue == null\" class=\"cqa-vh-compare-diff-cell-empty\"></div>\n </div>\n </div>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template #noDiffs>\n <div class=\"cqa-vh-compare-empty\">\n <cqa-empty-state title=\"No differences\" description=\"No differences between these versions.\"></cqa-empty-state>\n </div>\n </ng-template>\n </ng-container>\n</div>", styles: [] }]
66
60
  }], propDecorators: { compareResult: [{
67
61
  type: Input
68
62
  }], versions: [{
@@ -73,7 +67,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
73
67
  type: Input
74
68
  }], formatValueHtmlFn: [{
75
69
  type: Input
76
- }], fieldLabelMap: [{
70
+ }], getFieldLabelFn: [{
77
71
  type: Input
78
72
  }], swapVersions: [{
79
73
  type: Output
@@ -84,4 +78,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
84
78
  }], compareToChange: [{
85
79
  type: Output
86
80
  }] } });
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFPakcsTUFBTSxPQUFPLDhCQUE4QjtJQUwzQztRQU9XLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQ3BDLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxzQkFBaUIsR0FBMkIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkUsa0JBQWEsR0FBMkIsRUFBRSxDQUFDO1FBRTFDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0Msc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFdkQsdUJBQWtCLEdBQW9FLEVBQUUsQ0FBQztLQXFDMUY7SUFuQ0MsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUMxRDtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQUUsT0FBTyxPQUFPLENBQUM7U0FBRTtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxPQUFPLEdBQVUsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUVuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztRQUNyQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDOUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUMzRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QixNQUFNLEVBQUUsR0FBRyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ2xELEtBQUssRUFBRSxHQUFHLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3pELE9BQU8sRUFBRSxXQUFXO1NBQ3JCLENBQUMsQ0FBQzthQUNGLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQUUsT0FBTyxDQUFDLENBQUM7YUFBRTtZQUNwQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFBRTtZQUNyQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzJIQWpEVSw4QkFBOEI7K0dBQTlCLDhCQUE4Qix5YkNQM0MsazZPQXdITTsyRkRqSE8sOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLDZCQUE2Qjs4QkFLOUIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS12ZXJzaW9uLWhpc3RvcnktY29tcGFyZScsXG4gIHRlbXBsYXRlVXJsOiAnLi92ZXJzaW9uLWhpc3RvcnktY29tcGFyZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgVmVyc2lvbkhpc3RvcnlDb21wYXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29tcGFyZVJlc3VsdDogYW55O1xuICBASW5wdXQoKSB2ZXJzaW9uczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29tcGFyZUZyb21JZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbXBhcmVUb0lkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZm9ybWF0VmFsdWVIdG1sRm46ICh2YWx1ZTogYW55KSA9PiBzdHJpbmcgPSAodikgPT4gU3RyaW5nKHYgPz8gJycpO1xuICBASW5wdXQoKSBmaWVsZExhYmVsTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgQE91dHB1dCgpIHN3YXBWZXJzaW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNsb3NlQ29tcGFyaXNvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbXBhcmVGcm9tQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb21wYXJlVG9DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBncm91cGVkU3RlcENoYW5nZXM6IEFycmF5PHsgc3RlcElkOiBudW1iZXIgfCBudWxsOyBsYWJlbDogc3RyaW5nOyBjaGFuZ2VzOiBhbnlbXSB9PiA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29tcGFyZVJlc3VsdCddKSB7XG4gICAgICB0aGlzLmdyb3VwZWRTdGVwQ2hhbmdlcyA9IHRoaXMuYnVpbGRHcm91cGVkU3RlcENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWVsZExhYmVsKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZmllbGQpIHsgcmV0dXJuICdmaWVsZCc7IH1cbiAgICByZXR1cm4gdGhpcy5maWVsZExhYmVsTWFwW2ZpZWxkXSB8fCBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRHcm91cGVkU3RlcENoYW5nZXMoKTogQXJyYXk8eyBzdGVwSWQ6IG51bWJlciB8IG51bGw7IGxhYmVsOiBzdHJpbmc7IGNoYW5nZXM6IGFueVtdIH0+IHtcbiAgICBjb25zdCBjaGFuZ2VzOiBhbnlbXSA9IHRoaXMuY29tcGFyZVJlc3VsdD8uc3RlcENoYW5nZXMgfHwgW107XG4gICAgaWYgKCFjaGFuZ2VzLmxlbmd0aCkgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcbiAgICBjaGFuZ2VzLmZvckVhY2goKGNoYW5nZTogYW55KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBjaGFuZ2U/LnN0ZXBJZCAhPSBudWxsID8gU3RyaW5nKGNoYW5nZS5zdGVwSWQpIDogJ19fTk9fU1RFUF9fJztcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGtleSkgfHwgW107XG4gICAgICBsaXN0LnB1c2goY2hhbmdlKTtcbiAgICAgIG1hcC5zZXQoa2V5LCBsaXN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC5lbnRyaWVzKCkpXG4gICAgICAubWFwKChba2V5LCBzdGVwQ2hhbmdlc10pID0+ICh7XG4gICAgICAgIHN0ZXBJZDoga2V5ICE9PSAnX19OT19TVEVQX18nID8gTnVtYmVyKGtleSkgOiBudWxsLFxuICAgICAgICBsYWJlbDoga2V5ICE9PSAnX19OT19TVEVQX18nID8gYFN0ZXAgIyR7a2V5fWAgOiAnR2VuZXJhbCcsXG4gICAgICAgIGNoYW5nZXM6IHN0ZXBDaGFuZ2VzXG4gICAgICB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhLnN0ZXBJZCA9PT0gbnVsbCkgeyByZXR1cm4gMTsgfVxuICAgICAgICBpZiAoYi5zdGVwSWQgPT09IG51bGwpIHsgcmV0dXJuIC0xOyB9XG4gICAgICAgIHJldHVybiBhLnN0ZXBJZCAtIGIuc3RlcElkO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXY+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGNxYS12aC1jb21wYXJlLWhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDEwcHg7XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1jb21wYXJlLXN3YXAtYnRuXCIgKGNsaWNrKT1cInN3YXBWZXJzaW9ucy5lbWl0KClcIiB0aXRsZT1cIlN3YXAgdmVyc2lvbnNcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk00IDJMNCAxNE00IDE0TDEgMTFNNCAxNEw3IDExTTEyIDE0TDEyIDJNMTIgMkw5IDVNMTIgMkwxNSA1XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtdGl0bGVcIj5WZXJzaW9uIENvbXBhcmlzb248L3NwYW4+XG4gICAgICA8Y3FhLWJhZGdlICpuZ0lmPVwiY29tcGFyZVJlc3VsdFwiIFtsYWJlbF09XCJjb21wYXJlUmVzdWx0LnRvdGFsRGlmZmVyZW5jZXMgKyAnIGRpZmZlcmVuY2VzJ1wiIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIHZhcmlhbnQ9XCJpbmZvXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiIHRleHRDb2xvcj1cIiMzZjQzZWVcIiBib3JkZXJDb2xvcj1cIiNDN0Q3RkVcIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2xvc2VcIiAoY2xpY2tlZCk9XCJjbG9zZUNvbXBhcmlzb24uZW1pdCgpXCI+PC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBjcWEtdmgtY29tcGFyZS1zZWxlY3RvcnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA4cHg7IGZsZXg6IDE7IG1pbi13aWR0aDogMDtcIj5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1zZWxlY3RcIiBbbmdNb2RlbF09XCJjb21wYXJlRnJvbUlkXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY29tcGFyZUZyb21DaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHYgb2YgdmVyc2lvbnNcIiBbbmdWYWx1ZV09XCJ2LmlkXCI+Vnt7IHYudmVyc2lvbk51bWJlciB9fSDCtyB7eyB2LmRpc3BsYXlEYXRlIHwgZGF0ZTonTU1NIGQsXG4gICAgICAgICAgeXl5eSDCtyBoOm1tIGEnIH19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtc3dhcC1idG5cIiAoY2xpY2spPVwic3dhcFZlcnNpb25zLmVtaXQoKVwiIHRpdGxlPVwiU3dhcFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIgNUgxNE0xNCA1TDExIDJNMTQgNUwxMSA4TTE0IDExSDJNMiAxMUw1IDhNMiAxMUw1IDE0XCIgc3Ryb2tlPVwiIzNmNDNlZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1zZWxlY3RcIiBbbmdNb2RlbF09XCJjb21wYXJlVG9JZFwiIChuZ01vZGVsQ2hhbmdlKT1cImNvbXBhcmVUb0NoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdiBvZiB2ZXJzaW9uc1wiIFtuZ1ZhbHVlXT1cInYuaWRcIj5We3sgdi52ZXJzaW9uTnVtYmVyIH19IMK3IHt7IHYuZGlzcGxheURhdGUgfCBkYXRlOidNTU0gZCxcbiAgICAgICAgICB5eXl5IMK3IGg6bW0gYScgfX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiIWNvbXBhcmVSZXN1bHRcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWxvYWRpbmdcIj5cbiAgICBMb2FkaW5nIGNvbXBhcmlzb24uLi5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBhcmVSZXN1bHRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBjcWEtdmgtY29tcGFyZS1zdW1tYXJ5LWJhZGdlc1wiPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJysgJyArIGNvbXBhcmVSZXN1bHQuc3VtbWFyeS5hZGRlZCArICcgYWRkZWQnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VDRkRGM1wiXG4gICAgICAgIHRleHRDb2xvcj1cIiMwMjdBNDhcIiBib3JkZXJDb2xvcj1cIiNBN0YzRDBcIj48L2NxYS1iYWRnZT5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIid+ICcgKyBjb21wYXJlUmVzdWx0LnN1bW1hcnkubW9kaWZpZWQgKyAnIG1vZGlmaWVkJ1wiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNGRkZBRUJcIlxuICAgICAgICB0ZXh0Q29sb3I9XCIjQjU0NzA4XCIgYm9yZGVyQ29sb3I9XCIjRkVERjg5XCI+PC9jcWEtYmFkZ2U+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInLSAnICsgY29tcGFyZVJlc3VsdC5zdW1tYXJ5LnJlbW92ZWQgKyAnIHJlbW92ZWQnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0ZFRjNGMlwiXG4gICAgICAgIHRleHRDb2xvcj1cIiNCNDIzMThcIiBib3JkZXJDb2xvcj1cIiNGRUNEQ0FcIj48L2NxYS1iYWRnZT5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIic9ICcgKyBjb21wYXJlUmVzdWx0LnN1bW1hcnkudW5jaGFuZ2VkICsgJyB1bmNoYW5nZWQnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0YyRjRGN1wiXG4gICAgICAgIHRleHRDb2xvcj1cIiMzNDQwNTRcIiBib3JkZXJDb2xvcj1cIiNFNEU3RUNcIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wYXJlUmVzdWx0LnRlc3RDYXNlQ2hhbmdlcz8ubGVuZ3RoIHx8IGNvbXBhcmVSZXN1bHQuc3RlcENoYW5nZXM/Lmxlbmd0aDsgZWxzZSBub0RpZmZzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcGFyZVJlc3VsdC50ZXN0Q2FzZUNoYW5nZXM/Lmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBjcWEtdmgtY29tcGFyZS1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxzcGFuPlRlc3QgQ2FzZSBDaGFuZ2VzPC9zcGFuPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImNvbXBhcmVSZXN1bHQudGVzdENhc2VDaGFuZ2VzLmxlbmd0aCArICcgZGlmZnMnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGFuZ2Ugb2YgY29tcGFyZVJlc3VsdC50ZXN0Q2FzZUNoYW5nZXNcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWZpZWxkLWxhYmVsXCI+e3sgZ2V0RmllbGRMYWJlbChjaGFuZ2UuZmllbGQpIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXg6IDE7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS5mcm9tVmFsdWUgIT0gbnVsbFwiIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1jZWxsIGNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC0tcmVtb3ZlZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1jZWxsLXRleHRcIiBbaW5uZXJIVE1MXT1cImZvcm1hdFZhbHVlSHRtbEZuKGNoYW5nZS5mcm9tVmFsdWUpXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLWFkZGVkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtdGV4dFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUpXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UudG9WYWx1ZSA9PSBudWxsXCIgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtZW1wdHlcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBhcmVSZXN1bHQuc3RlcENoYW5nZXM/Lmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBjcWEtdmgtY29tcGFyZS1zZWN0aW9uLWhlYWRlclwiXG4gICAgICAgICAgW3N0eWxlLm1hcmdpbi10b3AucHhdPVwiY29tcGFyZVJlc3VsdC50ZXN0Q2FzZUNoYW5nZXM/Lmxlbmd0aCA/IDIwIDogMFwiPlxuICAgICAgICAgIDxzcGFuPlN0ZXAgQ2hhbmdlczwvc3Bhbj5cbiAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJjb21wYXJlUmVzdWx0LnN0ZXBDaGFuZ2VzLmxlbmd0aCArICcgZGlmZnMnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXBHcm91cCBvZiBncm91cGVkU3RlcENoYW5nZXM7IGxldCBzZ2kgPSBpbmRleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgIDwhLS0gU3RlcCBzdWItZ3JvdXAgaGVhZGVyIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1kZXRhaWwtc3RlcC1ncm91cC1oZWFkZXJcIiBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJzZ2kgPiAwID8gMTQgOiA0XCI+XG4gICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJjcWEtdmgtZGV0YWlsLXN0ZXAtZ3JvdXAtbGFiZWxcIj57eyBzdGVwR3JvdXAubGFiZWwgfX08L3NwYW4+IC0tPlxuICAgICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJzdGVwR3JvdXAubGFiZWxcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRURGMUYzXCIgdGV4dENvbG9yPVwiIzYzNkE3MVwiXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjREJERUUxXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDaGFuZ2VzIHdpdGhpbiB0aGlzIHN0ZXAgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1yb3ctY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoYW5nZSBvZiBzdGVwR3JvdXAuY2hhbmdlc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLXJvdyBjcWEtdmgtY29tcGFyZS1kaWZmLXJvdy0taW5kZW50ZWRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1maWVsZC1sYWJlbFwiPnt7IGdldEZpZWxkTGFiZWwoY2hhbmdlLmZpZWxkKSB9fTwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleDogMTsgZ2FwOiAxMnB4OyBtaW4td2lkdGg6IDA7IGZsZXgtZ3JvdzoxO1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS5mcm9tVmFsdWUgIT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1jZWxsIGNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC0tcmVtb3ZlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1jZWxsLXRleHRcIiBbaW5uZXJIVE1MXT1cImZvcm1hdFZhbHVlSHRtbEZuKGNoYW5nZS5mcm9tVmFsdWUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLWFkZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtdGV4dFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UudG9WYWx1ZSA9PSBudWxsXCIgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtZW1wdHlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub0RpZmZzPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWVtcHR5XCI+XG4gICAgICAgIDxjcWEtZW1wdHktc3RhdGUgdGl0bGU9XCJObyBkaWZmZXJlbmNlc1wiIGRlc2NyaXB0aW9uPVwiTm8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVzZSB2ZXJzaW9ucy5cIj48L2NxYS1lbXB0eS1zdGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+Il19
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUvdmVyc2lvbi1oaXN0b3J5LWNvbXBhcmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFPakcsTUFBTSxPQUFPLDhCQUE4QjtJQUwzQztRQU9XLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBQ3BDLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxzQkFBaUIsR0FBMkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkYsb0JBQWUsR0FBOEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7UUFFaEUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3hDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV2RCx1QkFBa0IsR0FBb0UsRUFBRSxDQUFDO0tBZ0MxRjtJQTlCQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixNQUFNLE9BQU8sR0FBVSxJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQzNFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsS0FBSyxFQUFFLEdBQUcsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekQsT0FBTyxFQUFFLFdBQVc7U0FDckIsQ0FBQyxDQUFDO2FBQ0YsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFBRSxPQUFPLENBQUMsQ0FBQzthQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUFFO1lBQ3JDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7MkhBNUNVLDhCQUE4QjsrR0FBOUIsOEJBQThCLDZiQ1AzQyw4OU9Bd0hNOzJGRGpITyw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0UsNkJBQTZCOzhCQUs5QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXZlcnNpb24taGlzdG9yeS1jb21wYXJlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZlcnNpb24taGlzdG9yeS1jb21wYXJlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBWZXJzaW9uSGlzdG9yeUNvbXBhcmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb21wYXJlUmVzdWx0OiBhbnk7XG4gIEBJbnB1dCgpIHZlcnNpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb21wYXJlRnJvbUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY29tcGFyZVRvSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBmb3JtYXRWYWx1ZUh0bWxGbjogKHZhbHVlOiBhbnksIGZpZWxkPzogc3RyaW5nKSA9PiBzdHJpbmcgPSAodikgPT4gU3RyaW5nKHYgPz8gJycpO1xuICBASW5wdXQoKSBnZXRGaWVsZExhYmVsRm46IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgPSAoZikgPT4gZiB8fCAnZmllbGQnO1xuXG4gIEBPdXRwdXQoKSBzd2FwVmVyc2lvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZUNvbXBhcmlzb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb21wYXJlRnJvbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29tcGFyZVRvQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgZ3JvdXBlZFN0ZXBDaGFuZ2VzOiBBcnJheTx7IHN0ZXBJZDogbnVtYmVyIHwgbnVsbDsgbGFiZWw6IHN0cmluZzsgY2hhbmdlczogYW55W10gfT4gPSBbXTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbXBhcmVSZXN1bHQnXSkge1xuICAgICAgdGhpcy5ncm91cGVkU3RlcENoYW5nZXMgPSB0aGlzLmJ1aWxkR3JvdXBlZFN0ZXBDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEdyb3VwZWRTdGVwQ2hhbmdlcygpOiBBcnJheTx7IHN0ZXBJZDogbnVtYmVyIHwgbnVsbDsgbGFiZWw6IHN0cmluZzsgY2hhbmdlczogYW55W10gfT4ge1xuICAgIGNvbnN0IGNoYW5nZXM6IGFueVtdID0gdGhpcy5jb21wYXJlUmVzdWx0Py5zdGVwQ2hhbmdlcyB8fCBbXTtcbiAgICBpZiAoIWNoYW5nZXMubGVuZ3RoKSB7IHJldHVybiBbXTsgfVxuXG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgIGNoYW5nZXMuZm9yRWFjaCgoY2hhbmdlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGNoYW5nZT8uc3RlcElkICE9IG51bGwgPyBTdHJpbmcoY2hhbmdlLnN0ZXBJZCkgOiAnX19OT19TVEVQX18nO1xuICAgICAgY29uc3QgbGlzdCA9IG1hcC5nZXQoa2V5KSB8fCBbXTtcbiAgICAgIGxpc3QucHVzaChjaGFuZ2UpO1xuICAgICAgbWFwLnNldChrZXksIGxpc3QpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obWFwLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtrZXksIHN0ZXBDaGFuZ2VzXSkgPT4gKHtcbiAgICAgICAgc3RlcElkOiBrZXkgIT09ICdfX05PX1NURVBfXycgPyBOdW1iZXIoa2V5KSA6IG51bGwsXG4gICAgICAgIGxhYmVsOiBrZXkgIT09ICdfX05PX1NURVBfXycgPyBgU3RlcCAjJHtrZXl9YCA6ICdHZW5lcmFsJyxcbiAgICAgICAgY2hhbmdlczogc3RlcENoYW5nZXNcbiAgICAgIH0pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEuc3RlcElkID09PSBudWxsKSB7IHJldHVybiAxOyB9XG4gICAgICAgIGlmIChiLnN0ZXBJZCA9PT0gbnVsbCkgeyByZXR1cm4gLTE7IH1cbiAgICAgICAgcmV0dXJuIGEuc3RlcElkIC0gYi5zdGVwSWQ7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gY3FhLXZoLWNvbXBhcmUtaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogMTBweDtcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtc3dhcC1idG5cIiAoY2xpY2spPVwic3dhcFZlcnNpb25zLmVtaXQoKVwiIHRpdGxlPVwiU3dhcCB2ZXJzaW9uc1wiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMkw0IDE0TTQgMTRMMSAxMU00IDE0TDcgMTFNMTIgMTRMMTIgMk0xMiAyTDkgNU0xMiAyTDE1IDVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtY29tcGFyZS10aXRsZVwiPlZlcnNpb24gQ29tcGFyaXNvbjwvc3Bhbj5cbiAgICAgIDxjcWEtYmFkZ2UgKm5nSWY9XCJjb21wYXJlUmVzdWx0XCIgW2xhYmVsXT1cImNvbXBhcmVSZXN1bHQudG90YWxEaWZmZXJlbmNlcyArICcgZGlmZmVyZW5jZXMnXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgdmFyaWFudD1cImluZm9cIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUZGNEZGXCIgdGV4dENvbG9yPVwiIzNmNDNlZVwiIGJvcmRlckNvbG9yPVwiI0M3RDdGRVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJDbG9zZVwiIChjbGlja2VkKT1cImNsb3NlQ29tcGFyaXNvbi5lbWl0KClcIj48L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGNxYS12aC1jb21wYXJlLXNlbGVjdG9yc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDhweDsgZmxleDogMTsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImNxYS12aC1jb21wYXJlLXNlbGVjdFwiIFtuZ01vZGVsXT1cImNvbXBhcmVGcm9tSWRcIiAobmdNb2RlbENoYW5nZSk9XCJjb21wYXJlRnJvbUNoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdiBvZiB2ZXJzaW9uc1wiIFtuZ1ZhbHVlXT1cInYuaWRcIj5We3sgdi52ZXJzaW9uTnVtYmVyIH19IMK3IHt7IHYuZGlzcGxheURhdGUgfCBkYXRlOidNTU0gZCxcbiAgICAgICAgICB5eXl5IMK3IGg6bW0gYScgfX08L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1zd2FwLWJ0blwiIChjbGljayk9XCJzd2FwVmVyc2lvbnMuZW1pdCgpXCIgdGl0bGU9XCJTd2FwXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMiA1SDE0TTE0IDVMMTEgMk0xNCA1TDExIDhNMTQgMTFIMk0yIDExTDUgOE0yIDExTDUgMTRcIiBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNlbGVjdCBjbGFzcz1cImNxYS12aC1jb21wYXJlLXNlbGVjdFwiIFtuZ01vZGVsXT1cImNvbXBhcmVUb0lkXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY29tcGFyZVRvQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2IG9mIHZlcnNpb25zXCIgW25nVmFsdWVdPVwidi5pZFwiPlZ7eyB2LnZlcnNpb25OdW1iZXIgfX0gwrcge3sgdi5kaXNwbGF5RGF0ZSB8IGRhdGU6J01NTSBkLFxuICAgICAgICAgIHl5eXkgwrcgaDptbSBhJyB9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCIhY29tcGFyZVJlc3VsdFwiIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtbG9hZGluZ1wiPlxuICAgIExvYWRpbmcgY29tcGFyaXNvbi4uLlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcGFyZVJlc3VsdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGNxYS12aC1jb21wYXJlLXN1bW1hcnktYmFkZ2VzXCI+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInKyAnICsgY29tcGFyZVJlc3VsdC5zdW1tYXJ5LmFkZGVkICsgJyBhZGRlZCdcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUNGREYzXCJcbiAgICAgICAgdGV4dENvbG9yPVwiIzAyN0E0OFwiIGJvcmRlckNvbG9yPVwiI0E3RjNEMFwiPjwvY3FhLWJhZGdlPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJ34gJyArIGNvbXBhcmVSZXN1bHQuc3VtbWFyeS5tb2RpZmllZCArICcgbW9kaWZpZWQnXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0ZGRkFFQlwiXG4gICAgICAgIHRleHRDb2xvcj1cIiNCNTQ3MDhcIiBib3JkZXJDb2xvcj1cIiNGRURGODlcIj48L2NxYS1iYWRnZT5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIictICcgKyBjb21wYXJlUmVzdWx0LnN1bW1hcnkucmVtb3ZlZCArICcgcmVtb3ZlZCdcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGM0YyXCJcbiAgICAgICAgdGV4dENvbG9yPVwiI0I0MjMxOFwiIGJvcmRlckNvbG9yPVwiI0ZFQ0RDQVwiPjwvY3FhLWJhZGdlPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJz0gJyArIGNvbXBhcmVSZXN1bHQuc3VtbWFyeS51bmNoYW5nZWQgKyAnIHVuY2hhbmdlZCdcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRjJGNEY3XCJcbiAgICAgICAgdGV4dENvbG9yPVwiIzM0NDA1NFwiIGJvcmRlckNvbG9yPVwiI0U0RTdFQ1wiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBhcmVSZXN1bHQudGVzdENhc2VDaGFuZ2VzPy5sZW5ndGggfHwgY29tcGFyZVJlc3VsdC5zdGVwQ2hhbmdlcz8ubGVuZ3RoOyBlbHNlIG5vRGlmZnNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wYXJlUmVzdWx0LnRlc3RDYXNlQ2hhbmdlcz8ubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGNxYS12aC1jb21wYXJlLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPHNwYW4+VGVzdCBDYXNlIENoYW5nZXM8L3NwYW4+XG4gICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiY29tcGFyZVJlc3VsdC50ZXN0Q2FzZUNoYW5nZXMubGVuZ3RoICsgJyBkaWZmcydcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUZGNEZGXCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMzZjQzZWVcIiBib3JkZXJDb2xvcj1cIiNDN0Q3RkVcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoYW5nZSBvZiBjb21wYXJlUmVzdWx0LnRlc3RDYXNlQ2hhbmdlc1wiIGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZGlmZi1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZmllbGQtbGFiZWxcIj57eyBnZXRGaWVsZExhYmVsRm4oY2hhbmdlLmZpZWxkKSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4OiAxOyBnYXA6IDEycHg7IG1pbi13aWR0aDogMDtcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLXJlbW92ZWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC10ZXh0XCIgW2lubmVySFRNTF09XCJmb3JtYXRWYWx1ZUh0bWxGbihjaGFuZ2UuZnJvbVZhbHVlLCBjaGFuZ2UuZmllbGQpXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLWFkZGVkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtdGV4dFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUsIGNoYW5nZS5maWVsZClcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcGFyZVJlc3VsdC5zdGVwQ2hhbmdlcz8ubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGNxYS12aC1jb21wYXJlLXNlY3Rpb24taGVhZGVyXCJcbiAgICAgICAgICBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJjb21wYXJlUmVzdWx0LnRlc3RDYXNlQ2hhbmdlcz8ubGVuZ3RoID8gMjAgOiAwXCI+XG4gICAgICAgICAgPHNwYW4+U3RlcCBDaGFuZ2VzPC9zcGFuPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImNvbXBhcmVSZXN1bHQuc3RlcENoYW5nZXMubGVuZ3RoICsgJyBkaWZmcydcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUZGNEZGXCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMzZjQzZWVcIiBib3JkZXJDb2xvcj1cIiNDN0Q3RkVcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcEdyb3VwIG9mIGdyb3VwZWRTdGVwQ2hhbmdlczsgbGV0IHNnaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgPCEtLSBTdGVwIHN1Yi1ncm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWRldGFpbC1zdGVwLWdyb3VwLWhlYWRlclwiIFtzdHlsZS5tYXJnaW4tdG9wLnB4XT1cInNnaSA+IDAgPyAxNCA6IDRcIj5cbiAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImNxYS12aC1kZXRhaWwtc3RlcC1ncm91cC1sYWJlbFwiPnt7IHN0ZXBHcm91cC5sYWJlbCB9fTwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cInN0ZXBHcm91cC5sYWJlbFwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNFREYxRjNcIiB0ZXh0Q29sb3I9XCIjNjM2QTcxXCJcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNEQkRFRTFcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIENoYW5nZXMgd2l0aGluIHRoaXMgc3RlcCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLXJvdy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hhbmdlIG9mIHN0ZXBHcm91cC5jaGFuZ2VzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtcm93IGNxYS12aC1jb21wYXJlLWRpZmYtcm93LS1pbmRlbnRlZFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWZpZWxkLWxhYmVsXCI+e3sgZ2V0RmllbGRMYWJlbEZuKGNoYW5nZS5maWVsZCkgfX08L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXg6IDE7IGdhcDogMTJweDsgbWluLXdpZHRoOiAwOyBmbGV4LWdyb3c6MTtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlICE9IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLXJlbW92ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC10ZXh0XCIgW2lubmVySFRNTF09XCJmb3JtYXRWYWx1ZUh0bWxGbihjaGFuZ2UuZnJvbVZhbHVlLCBjaGFuZ2UuZmllbGQpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbCBjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtLWFkZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtY29tcGFyZS1kaWZmLWNlbGwtdGV4dFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUsIGNoYW5nZS5maWVsZClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlID09IG51bGxcIiBjbGFzcz1cImNxYS12aC1jb21wYXJlLWRpZmYtY2VsbC1lbXB0eVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI25vRGlmZnM+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWNvbXBhcmUtZW1wdHlcIj5cbiAgICAgICAgPGNxYS1lbXB0eS1zdGF0ZSB0aXRsZT1cIk5vIGRpZmZlcmVuY2VzXCIgZGVzY3JpcHRpb249XCJObyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIHZlcnNpb25zLlwiPjwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=
@@ -20,10 +20,10 @@ export class VersionHistoryDetailComponent {
20
20
  }
21
21
  }
22
22
  VersionHistoryDetailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- VersionHistoryDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryDetailComponent, selector: "cqa-version-history-detail", inputs: { selectedVersion: "selectedVersion", selectedIsCurrent: "selectedIsCurrent", selectedVersionGroupedChanges: "selectedVersionGroupedChanges", isRestoring: "isRestoring", getAuthorLabelFn: "getAuthorLabelFn", getOpBadgeFn: "getOpBadgeFn", getChangeHeadlineFn: "getChangeHeadlineFn", formatValueHtmlFn: "formatValueHtmlFn", trackByGroupCategoryFn: "trackByGroupCategoryFn", trackByChangeFn: "trackByChangeFn" }, outputs: { compare: "compare", restore: "restore" }, ngImport: i0, template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <div class=\"d-flex align-items-start justify-content-between cqa-vh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-vh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-vh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.displayDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-vh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-vh-detail-actions\">\n <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button>\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <ng-container *ngFor=\"let group of selectedVersionGroupedChanges; let gi = index; trackBy: trackByGroupCategoryFn\">\n\n <!-- Category header -->\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 10px;\"\n [style.margin-top.px]=\"gi > 0 ? 20 : 0\">\n <span class=\"cqa-vh-detail-group-label\">{{ group.label }}</span>\n <cqa-badge [label]=\"'' + group.changes.length\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <!-- STEP category: second-level grouping by stepId -->\n <ng-container *ngIf=\"group.category === 'STEP' && group.stepGroups?.length; else flatChanges\">\n <ng-container *ngFor=\"let stepGroup of group.stepGroups; let si = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"\" [style.margin-top.px]=\"si > 0 ? 12 : 0\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n <!-- Changes within this step \u2014 no Step badge (step is already in the sub-header) -->\n <div class=\"cqa-vh-detail-change-row-container\">\n <div *ngFor=\"let change of stepGroup.changes; trackBy: trackByChangeFn\"\n class=\"cqa-vh-detail-change-row cqa-vh-detail-change-row--indented\">\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n\n </ng-container>\n </ng-container>\n\n <!-- All other categories: flat list (also fallback for STEP if no stepGroups) -->\n <ng-template #flatChanges>\n <div *ngFor=\"let change of group.changes; trackBy: trackByChangeFn\" class=\"cqa-vh-detail-change-row\">\n <div *ngIf=\"change.stepId != null\" class=\"cqa-vh-detail-change-step-col\">\n <cqa-badge [label]=\"'Step #' + change.stepId\" size=\"small\" [backgroundColor]=\"'#EDF1F3'\"\n [textColor]=\"'#636A71'\" [borderColor]=\"'#DBDEE1'\"></cqa-badge>\n </div>\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></span>\n </div>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n\n <div *ngIf=\"!selectedVersion.changes?.length\" class=\"cqa-vh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-vh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "date": i4.DatePipe } });
23
+ VersionHistoryDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryDetailComponent, selector: "cqa-version-history-detail", inputs: { selectedVersion: "selectedVersion", selectedIsCurrent: "selectedIsCurrent", selectedVersionGroupedChanges: "selectedVersionGroupedChanges", isRestoring: "isRestoring", getAuthorLabelFn: "getAuthorLabelFn", getOpBadgeFn: "getOpBadgeFn", getChangeHeadlineFn: "getChangeHeadlineFn", formatValueHtmlFn: "formatValueHtmlFn", trackByGroupCategoryFn: "trackByGroupCategoryFn", trackByChangeFn: "trackByChangeFn" }, outputs: { compare: "compare", restore: "restore" }, ngImport: i0, template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <div class=\"d-flex align-items-start justify-content-between cqa-vh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-vh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-vh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.displayDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-vh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-vh-detail-actions\">\n <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button>\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <ng-container *ngFor=\"let group of selectedVersionGroupedChanges; let gi = index; trackBy: trackByGroupCategoryFn\">\n\n <!-- Category header -->\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 10px;\"\n [style.margin-top.px]=\"gi > 0 ? 20 : 0\">\n <span class=\"cqa-vh-detail-group-label\">{{ group.label }}</span>\n <cqa-badge [label]=\"'' + group.changes.length\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <!-- STEP category: second-level grouping by stepId -->\n <ng-container *ngIf=\"group.category === 'STEP' && group.stepGroups?.length; else flatChanges\">\n <ng-container *ngFor=\"let stepGroup of group.stepGroups; let si = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"\" [style.margin-top.px]=\"si > 0 ? 12 : 0\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n <!-- Changes within this step \u2014 no Step badge (step is already in the sub-header) -->\n <div class=\"cqa-vh-detail-change-row-container\">\n <div *ngFor=\"let change of stepGroup.changes; trackBy: trackByChangeFn\"\n class=\"cqa-vh-detail-change-row cqa-vh-detail-change-row--indented\">\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n\n </ng-container>\n </ng-container>\n\n <!-- All other categories: flat list (also fallback for STEP if no stepGroups) -->\n <ng-template #flatChanges>\n <div *ngFor=\"let change of group.changes; trackBy: trackByChangeFn\" class=\"cqa-vh-detail-change-row\">\n <div *ngIf=\"change.stepId != null\" class=\"cqa-vh-detail-change-step-col\">\n <cqa-badge [label]=\"'Step #' + change.stepId\" size=\"small\" [backgroundColor]=\"'#EDF1F3'\"\n [textColor]=\"'#636A71'\" [borderColor]=\"'#DBDEE1'\"></cqa-badge>\n </div>\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></span>\n </div>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n\n <div *ngIf=\"!selectedVersion.changes?.length\" class=\"cqa-vh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-vh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "date": i4.DatePipe } });
24
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryDetailComponent, decorators: [{
25
25
  type: Component,
26
- args: [{ selector: 'cqa-version-history-detail', template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <div class=\"d-flex align-items-start justify-content-between cqa-vh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-vh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-vh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.displayDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-vh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-vh-detail-actions\">\n <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button>\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <ng-container *ngFor=\"let group of selectedVersionGroupedChanges; let gi = index; trackBy: trackByGroupCategoryFn\">\n\n <!-- Category header -->\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 10px;\"\n [style.margin-top.px]=\"gi > 0 ? 20 : 0\">\n <span class=\"cqa-vh-detail-group-label\">{{ group.label }}</span>\n <cqa-badge [label]=\"'' + group.changes.length\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <!-- STEP category: second-level grouping by stepId -->\n <ng-container *ngIf=\"group.category === 'STEP' && group.stepGroups?.length; else flatChanges\">\n <ng-container *ngFor=\"let stepGroup of group.stepGroups; let si = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"\" [style.margin-top.px]=\"si > 0 ? 12 : 0\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n <!-- Changes within this step \u2014 no Step badge (step is already in the sub-header) -->\n <div class=\"cqa-vh-detail-change-row-container\">\n <div *ngFor=\"let change of stepGroup.changes; trackBy: trackByChangeFn\"\n class=\"cqa-vh-detail-change-row cqa-vh-detail-change-row--indented\">\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n\n </ng-container>\n </ng-container>\n\n <!-- All other categories: flat list (also fallback for STEP if no stepGroups) -->\n <ng-template #flatChanges>\n <div *ngFor=\"let change of group.changes; trackBy: trackByChangeFn\" class=\"cqa-vh-detail-change-row\">\n <div *ngIf=\"change.stepId != null\" class=\"cqa-vh-detail-change-step-col\">\n <cqa-badge [label]=\"'Step #' + change.stepId\" size=\"small\" [backgroundColor]=\"'#EDF1F3'\"\n [textColor]=\"'#636A71'\" [borderColor]=\"'#DBDEE1'\"></cqa-badge>\n </div>\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue)\"></span>\n </div>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n\n <div *ngIf=\"!selectedVersion.changes?.length\" class=\"cqa-vh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-vh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>", styles: [] }]
26
+ args: [{ selector: 'cqa-version-history-detail', template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <div class=\"d-flex align-items-start justify-content-between cqa-vh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-vh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-vh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.displayDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-vh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-vh-detail-actions\">\n <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button>\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <ng-container *ngFor=\"let group of selectedVersionGroupedChanges; let gi = index; trackBy: trackByGroupCategoryFn\">\n\n <!-- Category header -->\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 10px;\"\n [style.margin-top.px]=\"gi > 0 ? 20 : 0\">\n <span class=\"cqa-vh-detail-group-label\">{{ group.label }}</span>\n <cqa-badge [label]=\"'' + group.changes.length\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <!-- STEP category: second-level grouping by stepId -->\n <ng-container *ngIf=\"group.category === 'STEP' && group.stepGroups?.length; else flatChanges\">\n <ng-container *ngFor=\"let stepGroup of group.stepGroups; let si = index\">\n <div class=\"d-flex gap-2\">\n <!-- Step sub-group header -->\n <div class=\"\" [style.margin-top.px]=\"si > 0 ? 12 : 0\">\n <!-- <span class=\"cqa-vh-detail-step-group-label\">{{ stepGroup.label }}</span> -->\n <cqa-badge [label]=\"stepGroup.label\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n </div>\n <!-- Changes within this step \u2014 no Step badge (step is already in the sub-header) -->\n <div class=\"cqa-vh-detail-change-row-container\">\n <div *ngFor=\"let change of stepGroup.changes; trackBy: trackByChangeFn\"\n class=\"cqa-vh-detail-change-row cqa-vh-detail-change-row--indented\">\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n\n\n\n </ng-container>\n </ng-container>\n\n <!-- All other categories: flat list (also fallback for STEP if no stepGroups) -->\n <ng-template #flatChanges>\n <div *ngFor=\"let change of group.changes; trackBy: trackByChangeFn\" class=\"cqa-vh-detail-change-row\">\n <div *ngIf=\"change.stepId != null\" class=\"cqa-vh-detail-change-step-col\">\n <cqa-badge [label]=\"'Step #' + change.stepId\" size=\"small\" [backgroundColor]=\"'#EDF1F3'\"\n [textColor]=\"'#636A71'\" [borderColor]=\"'#DBDEE1'\"></cqa-badge>\n </div>\n <div>\n <div class=\"d-flex align-items-center my-4\" style=\"gap: 8px; flex-wrap: wrap;\">\n <cqa-badge [label]=\"getOpBadgeFn(change.op).label\" size=\"small\"\n [backgroundColor]=\"getOpBadgeFn(change.op).backgroundColor\"\n [textColor]=\"getOpBadgeFn(change.op).textColor\"\n [borderColor]=\"getOpBadgeFn(change.op).borderColor\"></cqa-badge>\n <span class=\"cqa-vh-detail-change-headline\">{{ getChangeHeadlineFn(change) }}</span>\n </div>\n\n <div *ngIf=\"change.fromValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'Before'\" size=\"small\" [backgroundColor]=\"'#FEF2F2'\" [textColor]=\"'#FB2C36'\"\n [borderColor]=\"'#FFE2E2'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.fromValue, change.field)\"></span>\n </div>\n\n <div *ngIf=\"change.toValue != null\" class=\"cqa-vh-detail-change-value\">\n <cqa-badge [label]=\"'After'\" size=\"small\" [backgroundColor]=\"'#ECFDF5'\" [textColor]=\"'#009966'\"\n [borderColor]=\"'#D0FAE5'\"></cqa-badge>\n <span class=\"pl-4\" [innerHTML]=\"formatValueHtmlFn(change.toValue, change.field)\"></span>\n </div>\n </div>\n </div>\n </ng-template>\n\n </ng-container>\n\n <div *ngIf=\"!selectedVersion.changes?.length\" class=\"cqa-vh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-vh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>", styles: [] }]
27
27
  }], propDecorators: { selectedVersion: [{
28
28
  type: Input
29
29
  }], selectedIsCurrent: [{
@@ -49,4 +49,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
49
49
  }], restore: [{
50
50
  type: Output
51
51
  }] } });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3ZlcnNpb24taGlzdG9yeS92ZXJzaW9uLWhpc3RvcnktZGV0YWlsL3ZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWRldGFpbC92ZXJzaW9uLWhpc3RvcnktZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQU92RSxNQUFNLE9BQU8sNkJBQTZCO0lBTDFDO1FBT1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGtDQUE2QixHQUtqQyxFQUFFLENBQUM7UUFDQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixxQkFBZ0IsR0FBNkIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELGlCQUFZLEdBQ25CLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6Rix3QkFBbUIsR0FBNEIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hELHNCQUFpQixHQUEyQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSwyQkFBc0IsR0FBMkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3RHLG9CQUFlLEdBQTJDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FDOUM7OzBIQXJCWSw2QkFBNkI7OEdBQTdCLDZCQUE2Qix5aEJDUDFDLHkvTUF1SGM7MkZEaEhELDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw0QkFBNEI7OEJBSzdCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXZlcnNpb24taGlzdG9yeS1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgVmVyc2lvbkhpc3RvcnlEZXRhaWxDb21wb25lbnQge1xuICBASW5wdXQoKSBzZWxlY3RlZFZlcnNpb246IGFueTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJc0N1cnJlbnQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWRWZXJzaW9uR3JvdXBlZENoYW5nZXM6IEFycmF5PHtcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY2hhbmdlczogYW55W107XG4gICAgc3RlcEdyb3Vwcz86IEFycmF5PHsgc3RlcElkOiBudW1iZXIgfCBudWxsOyBsYWJlbDogc3RyaW5nOyBjaGFuZ2VzOiBhbnlbXSB9PjtcbiAgfT4gPSBbXTtcbiAgQElucHV0KCkgaXNSZXN0b3JpbmcgPSBmYWxzZTtcblxuICBASW5wdXQoKSBnZXRBdXRob3JMYWJlbEZuOiAodmVyc2lvbjogYW55KSA9PiBzdHJpbmcgPSAoKSA9PiAnJztcbiAgQElucHV0KCkgZ2V0T3BCYWRnZUZuOiAob3A6IHN0cmluZykgPT4geyBsYWJlbDogc3RyaW5nOyBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZzsgdGV4dENvbG9yOiBzdHJpbmc7IGJvcmRlckNvbG9yOiBzdHJpbmcgfSA9XG4gICAgKCkgPT4gKHsgbGFiZWw6ICcnLCBiYWNrZ3JvdW5kQ29sb3I6ICcjRjJGNEY3JywgdGV4dENvbG9yOiAnIzM0NDA1NCcsIGJvcmRlckNvbG9yOiAnI0U0RTdFQycgfSk7XG4gIEBJbnB1dCgpIGdldENoYW5nZUhlYWRsaW5lRm46IChjaGFuZ2U6IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJyc7XG4gIEBJbnB1dCgpIGZvcm1hdFZhbHVlSHRtbEZuOiAodmFsdWU6IGFueSkgPT4gc3RyaW5nID0gKHYpID0+IFN0cmluZyh2ID8/ICcnKTtcbiAgQElucHV0KCkgdHJhY2tCeUdyb3VwQ2F0ZWdvcnlGbjogKGluZGV4OiBudW1iZXIsIGdyb3VwOiB7IGNhdGVnb3J5OiBzdHJpbmcgfSkgPT4gc3RyaW5nID0gKF8sIGcpID0+IGcuY2F0ZWdvcnk7XG4gIEBJbnB1dCgpIHRyYWNrQnlDaGFuZ2VGbjogKGluZGV4OiBudW1iZXIsIGNoYW5nZTogYW55KSA9PiBzdHJpbmcgPSAoaSkgPT4gU3RyaW5nKGkpO1xuXG4gIEBPdXRwdXQoKSBjb21wYXJlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVzdG9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZlcnNpb247IGVsc2Ugbm9TZWxlY3Rpb25cIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBjcWEtdmgtZGV0YWlsLWhlYWRlclwiPlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDZweDtcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwiY3FhLXZoLWRldGFpbC12ZXJzaW9uLW51bWJlclwiPlZlcnNpb24ge3sgc2VsZWN0ZWRWZXJzaW9uLnZlcnNpb25OdW1iZXIgfX08L2gzPlxuICAgICAgICA8Y3FhLWJhZGdlICpuZ0lmPVwic2VsZWN0ZWRJc0N1cnJlbnRcIiBsYWJlbD1cIkN1cnJlbnRcIiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwiaW5mb1wiIGJhY2tncm91bmRDb2xvcj1cIiNFRkY0RkZcIlxuICAgICAgICAgIHRleHRDb2xvcj1cIiMzZjQzZWVcIiBib3JkZXJDb2xvcj1cIiNDN0Q3RkVcIj48L2NxYS1iYWRnZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1kZXRhaWwtbWV0YVwiPlxuICAgICAgICB7eyBnZXRBdXRob3JMYWJlbEZuKHNlbGVjdGVkVmVyc2lvbikgfX0gwrcge3sgc2VsZWN0ZWRWZXJzaW9uLmRpc3BsYXlEYXRlIHwgZGF0ZTonTU1NIGQsIHl5eXkgwrcgaDptbSBhJyB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnlcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtc3VtbWFyeVwiPlxuICAgICAgICB7eyBzZWxlY3RlZFZlcnNpb24uY2hhbmdlU3VtbWFyeSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFzZWxlY3RlZElzQ3VycmVudFwiIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1hY3Rpb25zXCI+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ29tcGFyZSB3aXRoIEN1cnJlbnRcIiAoY2xpY2tlZCk9XCJjb21wYXJlLmVtaXQoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBpY29uPVwicmVmcmVzaFwiIFt0ZXh0XT1cImlzUmVzdG9yaW5nID8gJ1Jlc3RvcmluZy4uLicgOiAnUmVzdG9yZSB0aGlzIFZlcnNpb24nXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVzdG9yaW5nXCIgKGNsaWNrZWQpPVwicmVzdG9yZS5lbWl0KClcIj48L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIHNlbGVjdGVkVmVyc2lvbkdyb3VwZWRDaGFuZ2VzOyBsZXQgZ2kgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUdyb3VwQ2F0ZWdvcnlGblwiPlxuXG4gICAgPCEtLSBDYXRlZ29yeSBoZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiXG4gICAgICBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJnaSA+IDAgPyAyMCA6IDBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1ncm91cC1sYWJlbFwiPnt7IGdyb3VwLmxhYmVsIH19PC9zcGFuPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJycgKyBncm91cC5jaGFuZ2VzLmxlbmd0aFwiIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJpbmZvXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiXG4gICAgICAgIHRleHRDb2xvcj1cIiMzZjQzZWVcIiBib3JkZXJDb2xvcj1cIiNDN0Q3RkVcIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU1RFUCBjYXRlZ29yeTogc2Vjb25kLWxldmVsIGdyb3VwaW5nIGJ5IHN0ZXBJZCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXAuY2F0ZWdvcnkgPT09ICdTVEVQJyAmJiBncm91cC5zdGVwR3JvdXBzPy5sZW5ndGg7IGVsc2UgZmxhdENoYW5nZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0ZXBHcm91cCBvZiBncm91cC5zdGVwR3JvdXBzOyBsZXQgc2kgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgPCEtLSBTdGVwIHN1Yi1ncm91cCBoZWFkZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIFtzdHlsZS5tYXJnaW4tdG9wLnB4XT1cInNpID4gMCA/IDEyIDogMFwiPlxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImNxYS12aC1kZXRhaWwtc3RlcC1ncm91cC1sYWJlbFwiPnt7IHN0ZXBHcm91cC5sYWJlbCB9fTwvc3Bhbj4gLS0+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJzdGVwR3JvdXAubGFiZWxcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRURGMUYzXCJcbiAgICAgICAgICAgICAgdGV4dENvbG9yPVwiIzYzNkE3MVwiIGJvcmRlckNvbG9yPVwiI0RCREVFMVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gQ2hhbmdlcyB3aXRoaW4gdGhpcyBzdGVwIOKAlCBubyBTdGVwIGJhZGdlIChzdGVwIGlzIGFscmVhZHkgaW4gdGhlIHN1Yi1oZWFkZXIpIC0tPlxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2Utcm93LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hhbmdlIG9mIHN0ZXBHcm91cC5jaGFuZ2VzOyB0cmFja0J5OiB0cmFja0J5Q2hhbmdlRm5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXJvdyBjcWEtdmgtZGV0YWlsLWNoYW5nZS1yb3ctLWluZGVudGVkXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXktNFwiIHN0eWxlPVwiZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImdldE9wQmFkZ2VGbihjaGFuZ2Uub3ApLmxhYmVsXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS5iYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dENvbG9yXT1cImdldE9wQmFkZ2VGbihjaGFuZ2Uub3ApLnRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS5ib3JkZXJDb2xvclwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtZGV0YWlsLWNoYW5nZS1oZWFkbGluZVwiPnt7IGdldENoYW5nZUhlYWRsaW5lRm4oY2hhbmdlKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2UuZnJvbVZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInQmVmb3JlJ1wiIHNpemU9XCJzbWFsbFwiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNGRUYyRjInXCIgW3RleHRDb2xvcl09XCInI0ZCMkMzNidcIlxuICAgICAgICAgICAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiJyNGRkUyRTInXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTRcIiBbaW5uZXJIVE1MXT1cImZvcm1hdFZhbHVlSHRtbEZuKGNoYW5nZS5mcm9tVmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInQWZ0ZXInXCIgc2l6ZT1cInNtYWxsXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0VDRkRGNSdcIiBbdGV4dENvbG9yXT1cIicjMDA5OTY2J1wiXG4gICAgICAgICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0QwRkFFNSdcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtNFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuXG5cblxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEFsbCBvdGhlciBjYXRlZ29yaWVzOiBmbGF0IGxpc3QgKGFsc28gZmFsbGJhY2sgZm9yIFNURVAgaWYgbm8gc3RlcEdyb3VwcykgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNmbGF0Q2hhbmdlcz5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoYW5nZSBvZiBncm91cC5jaGFuZ2VzOyB0cmFja0J5OiB0cmFja0J5Q2hhbmdlRm5cIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXJvd1wiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY2hhbmdlLnN0ZXBJZCAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLWNoYW5nZS1zdGVwLWNvbFwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIidTdGVwICMnICsgY2hhbmdlLnN0ZXBJZFwiIHNpemU9XCJzbWFsbFwiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNFREYxRjMnXCJcbiAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiJyM2MzZBNzEnXCIgW2JvcmRlckNvbG9yXT1cIicjREJERUUxJ1wiPjwvY3FhLWJhZGdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBteS00XCIgc3R5bGU9XCJnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkubGFiZWxcIiBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImdldE9wQmFkZ2VGbihjaGFuZ2Uub3ApLmJhY2tncm91bmRDb2xvclwiXG4gICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkudGV4dENvbG9yXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cImdldE9wQmFkZ2VGbihjaGFuZ2Uub3ApLmJvcmRlckNvbG9yXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLWhlYWRsaW5lXCI+e3sgZ2V0Q2hhbmdlSGVhZGxpbmVGbihjaGFuZ2UpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS5mcm9tVmFsdWUgIT0gbnVsbFwiIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2UtdmFsdWVcIj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIidCZWZvcmUnXCIgc2l6ZT1cInNtYWxsXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0ZFRjJGMidcIiBbdGV4dENvbG9yXT1cIicjRkIyQzM2J1wiXG4gICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0ZGRTJFMidcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtNFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLmZyb21WYWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2hhbmdlLnRvVmFsdWUgIT0gbnVsbFwiIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2UtdmFsdWVcIj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIidBZnRlcidcIiBzaXplPVwic21hbGxcIiBbYmFja2dyb3VuZENvbG9yXT1cIicjRUNGREY1J1wiIFt0ZXh0Q29sb3JdPVwiJyMwMDk5NjYnXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjRDBGQUU1J1wiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC00XCIgW2lubmVySFRNTF09XCJmb3JtYXRWYWx1ZUh0bWxGbihjaGFuZ2UudG9WYWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVmVyc2lvbi5jaGFuZ2VzPy5sZW5ndGhcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtZW1wdHlcIj5cbiAgICA8Y3FhLWVtcHR5LXN0YXRlIHRpdGxlPVwiTm8gY2hhbmdlc1wiIGRlc2NyaXB0aW9uPVwiTm8gY2hhbmdlcyByZWNvcmRlZCBmb3IgdGhpcyB2ZXJzaW9uLlwiPjwvY3FhLWVtcHR5LXN0YXRlPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI25vU2VsZWN0aW9uPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWRldGFpbC1uby1zZWxlY3Rpb25cIj5cbiAgICBTZWxlY3QgYSB2ZXJzaW9uIHRvIHZpZXcgZGV0YWlscy5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3ZlcnNpb24taGlzdG9yeS92ZXJzaW9uLWhpc3RvcnktZGV0YWlsL3ZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LWRldGFpbC92ZXJzaW9uLWhpc3RvcnktZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQU92RSxNQUFNLE9BQU8sNkJBQTZCO0lBTDFDO1FBT1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGtDQUE2QixHQUtqQyxFQUFFLENBQUM7UUFDQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixxQkFBZ0IsR0FBNkIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELGlCQUFZLEdBQ25CLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6Rix3QkFBbUIsR0FBNEIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hELHNCQUFpQixHQUEyQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRiwyQkFBc0IsR0FBMkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3RHLG9CQUFlLEdBQTJDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FDOUM7OzBIQXJCWSw2QkFBNkI7OEdBQTdCLDZCQUE2Qix5aEJDUDFDLGlqTkF1SGM7MkZEaEhELDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSw0QkFBNEI7OEJBSzdCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXZlcnNpb24taGlzdG9yeS1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgVmVyc2lvbkhpc3RvcnlEZXRhaWxDb21wb25lbnQge1xuICBASW5wdXQoKSBzZWxlY3RlZFZlcnNpb246IGFueTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJc0N1cnJlbnQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWRWZXJzaW9uR3JvdXBlZENoYW5nZXM6IEFycmF5PHtcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY2hhbmdlczogYW55W107XG4gICAgc3RlcEdyb3Vwcz86IEFycmF5PHsgc3RlcElkOiBudW1iZXIgfCBudWxsOyBsYWJlbDogc3RyaW5nOyBjaGFuZ2VzOiBhbnlbXSB9PjtcbiAgfT4gPSBbXTtcbiAgQElucHV0KCkgaXNSZXN0b3JpbmcgPSBmYWxzZTtcblxuICBASW5wdXQoKSBnZXRBdXRob3JMYWJlbEZuOiAodmVyc2lvbjogYW55KSA9PiBzdHJpbmcgPSAoKSA9PiAnJztcbiAgQElucHV0KCkgZ2V0T3BCYWRnZUZuOiAob3A6IHN0cmluZykgPT4geyBsYWJlbDogc3RyaW5nOyBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZzsgdGV4dENvbG9yOiBzdHJpbmc7IGJvcmRlckNvbG9yOiBzdHJpbmcgfSA9XG4gICAgKCkgPT4gKHsgbGFiZWw6ICcnLCBiYWNrZ3JvdW5kQ29sb3I6ICcjRjJGNEY3JywgdGV4dENvbG9yOiAnIzM0NDA1NCcsIGJvcmRlckNvbG9yOiAnI0U0RTdFQycgfSk7XG4gIEBJbnB1dCgpIGdldENoYW5nZUhlYWRsaW5lRm46IChjaGFuZ2U6IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJyc7XG4gIEBJbnB1dCgpIGZvcm1hdFZhbHVlSHRtbEZuOiAodmFsdWU6IGFueSwgZmllbGQ/OiBzdHJpbmcpID0+IHN0cmluZyA9ICh2KSA9PiBTdHJpbmcodiA/PyAnJyk7XG4gIEBJbnB1dCgpIHRyYWNrQnlHcm91cENhdGVnb3J5Rm46IChpbmRleDogbnVtYmVyLCBncm91cDogeyBjYXRlZ29yeTogc3RyaW5nIH0pID0+IHN0cmluZyA9IChfLCBnKSA9PiBnLmNhdGVnb3J5O1xuICBASW5wdXQoKSB0cmFja0J5Q2hhbmdlRm46IChpbmRleDogbnVtYmVyLCBjaGFuZ2U6IGFueSkgPT4gc3RyaW5nID0gKGkpID0+IFN0cmluZyhpKTtcblxuICBAT3V0cHV0KCkgY29tcGFyZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlc3RvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uOyBlbHNlIG5vU2VsZWN0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gY3FhLXZoLWRldGFpbC1oZWFkZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS12aC1kZXRhaWwtdmVyc2lvbi1udW1iZXJcIj5WZXJzaW9uIHt7IHNlbGVjdGVkVmVyc2lvbi52ZXJzaW9uTnVtYmVyIH19PC9oMz5cbiAgICAgICAgPGNxYS1iYWRnZSAqbmdJZj1cInNlbGVjdGVkSXNDdXJyZW50XCIgbGFiZWw9XCJDdXJyZW50XCIgc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cImluZm9cIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUZGNEZGXCJcbiAgICAgICAgICB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLW1ldGFcIj5cbiAgICAgICAge3sgZ2V0QXV0aG9yTGFiZWxGbihzZWxlY3RlZFZlcnNpb24pIH19IMK3IHt7IHNlbGVjdGVkVmVyc2lvbi5kaXNwbGF5RGF0ZSB8IGRhdGU6J01NTSBkLCB5eXl5IMK3IGg6bW0gYScgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVmVyc2lvbi5jaGFuZ2VTdW1tYXJ5XCIgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLXN1bW1hcnlcIj5cbiAgICAgICAge3sgc2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRJc0N1cnJlbnRcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtYWN0aW9uc1wiPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNvbXBhcmUgd2l0aCBDdXJyZW50XCIgKGNsaWNrZWQpPVwiY29tcGFyZS5lbWl0KClcIj48L2NxYS1idXR0b24+XG4gICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgaWNvbj1cInJlZnJlc2hcIiBbdGV4dF09XCJpc1Jlc3RvcmluZyA/ICdSZXN0b3JpbmcuLi4nIDogJ1Jlc3RvcmUgdGhpcyBWZXJzaW9uJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc1Jlc3RvcmluZ1wiIChjbGlja2VkKT1cInJlc3RvcmUuZW1pdCgpXCI+PC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBzZWxlY3RlZFZlcnNpb25Hcm91cGVkQ2hhbmdlczsgbGV0IGdpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlHcm91cENhdGVnb3J5Rm5cIj5cblxuICAgIDwhLS0gQ2F0ZWdvcnkgaGVhZGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIlxuICAgICAgW3N0eWxlLm1hcmdpbi10b3AucHhdPVwiZ2kgPiAwID8gMjAgOiAwXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1kZXRhaWwtZ3JvdXAtbGFiZWxcIj57eyBncm91cC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIicnICsgZ3JvdXAuY2hhbmdlcy5sZW5ndGhcIiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwiaW5mb1wiIGJhY2tncm91bmRDb2xvcj1cIiNFRkY0RkZcIlxuICAgICAgICB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNURVAgY2F0ZWdvcnk6IHNlY29uZC1sZXZlbCBncm91cGluZyBieSBzdGVwSWQgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwLmNhdGVnb3J5ID09PSAnU1RFUCcgJiYgZ3JvdXAuc3RlcEdyb3Vwcz8ubGVuZ3RoOyBlbHNlIGZsYXRDaGFuZ2VzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGVwR3JvdXAgb2YgZ3JvdXAuc3RlcEdyb3VwczsgbGV0IHNpID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgIDwhLS0gU3RlcCBzdWItZ3JvdXAgaGVhZGVyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJzaSA+IDAgPyAxMiA6IDBcIj5cbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJjcWEtdmgtZGV0YWlsLXN0ZXAtZ3JvdXAtbGFiZWxcIj57eyBzdGVwR3JvdXAubGFiZWwgfX08L3NwYW4+IC0tPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwic3RlcEdyb3VwLmxhYmVsXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VERjFGM1wiXG4gICAgICAgICAgICAgIHRleHRDb2xvcj1cIiM2MzZBNzFcIiBib3JkZXJDb2xvcj1cIiNEQkRFRTFcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIENoYW5nZXMgd2l0aGluIHRoaXMgc3RlcCDigJQgbm8gU3RlcCBiYWRnZSAoc3RlcCBpcyBhbHJlYWR5IGluIHRoZSBzdWItaGVhZGVyKSAtLT5cbiAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXJvdy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoYW5nZSBvZiBzdGVwR3JvdXAuY2hhbmdlczsgdHJhY2tCeTogdHJhY2tCeUNoYW5nZUZuXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLWNoYW5nZS1yb3cgY3FhLXZoLWRldGFpbC1jaGFuZ2Utcm93LS1pbmRlbnRlZFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG15LTRcIiBzdHlsZT1cImdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS5sYWJlbFwiIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkuYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS50ZXh0Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkuYm9yZGVyQ29sb3JcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2UtaGVhZGxpbmVcIj57eyBnZXRDaGFuZ2VIZWFkbGluZUZuKGNoYW5nZSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2hhbmdlLmZyb21WYWx1ZSAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLWNoYW5nZS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJ0JlZm9yZSdcIiBzaXplPVwic21hbGxcIiBbYmFja2dyb3VuZENvbG9yXT1cIicjRkVGMkYyJ1wiIFt0ZXh0Q29sb3JdPVwiJyNGQjJDMzYnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjRkZFMkUyJ1wiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC00XCIgW2lubmVySFRNTF09XCJmb3JtYXRWYWx1ZUh0bWxGbihjaGFuZ2UuZnJvbVZhbHVlLCBjaGFuZ2UuZmllbGQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInQWZ0ZXInXCIgc2l6ZT1cInNtYWxsXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0VDRkRGNSdcIiBbdGV4dENvbG9yXT1cIicjMDA5OTY2J1wiXG4gICAgICAgICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0QwRkFFNSdcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtNFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUsIGNoYW5nZS5maWVsZClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gQWxsIG90aGVyIGNhdGVnb3JpZXM6IGZsYXQgbGlzdCAoYWxzbyBmYWxsYmFjayBmb3IgU1RFUCBpZiBubyBzdGVwR3JvdXBzKSAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2ZsYXRDaGFuZ2VzPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hhbmdlIG9mIGdyb3VwLmNoYW5nZXM7IHRyYWNrQnk6IHRyYWNrQnlDaGFuZ2VGblwiIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2Utcm93XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjaGFuZ2Uuc3RlcElkICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXN0ZXAtY29sXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJ1N0ZXAgIycgKyBjaGFuZ2Uuc3RlcElkXCIgc2l6ZT1cInNtYWxsXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0VERjFGMydcIlxuICAgICAgICAgICAgW3RleHRDb2xvcl09XCInIzYzNkE3MSdcIiBbYm9yZGVyQ29sb3JdPVwiJyNEQkRFRTEnXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG15LTRcIiBzdHlsZT1cImdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS5sYWJlbFwiIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkuYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCJnZXRPcEJhZGdlRm4oY2hhbmdlLm9wKS50ZXh0Q29sb3JcIlxuICAgICAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiZ2V0T3BCYWRnZUZuKGNoYW5nZS5vcCkuYm9yZGVyQ29sb3JcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLWRldGFpbC1jaGFuZ2UtaGVhZGxpbmVcIj57eyBnZXRDaGFuZ2VIZWFkbGluZUZuKGNoYW5nZSkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2hhbmdlLmZyb21WYWx1ZSAhPSBudWxsXCIgY2xhc3M9XCJjcWEtdmgtZGV0YWlsLWNoYW5nZS12YWx1ZVwiPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJ0JlZm9yZSdcIiBzaXplPVwic21hbGxcIiBbYmFja2dyb3VuZENvbG9yXT1cIicjRkVGMkYyJ1wiIFt0ZXh0Q29sb3JdPVwiJyNGQjJDMzYnXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cIicjRkZFMkUyJ1wiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC00XCIgW2lubmVySFRNTF09XCJmb3JtYXRWYWx1ZUh0bWxGbihjaGFuZ2UuZnJvbVZhbHVlLCBjaGFuZ2UuZmllbGQpXCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNoYW5nZS50b1ZhbHVlICE9IG51bGxcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtY2hhbmdlLXZhbHVlXCI+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInQWZ0ZXInXCIgc2l6ZT1cInNtYWxsXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0VDRkRGNSdcIiBbdGV4dENvbG9yXT1cIicjMDA5OTY2J1wiXG4gICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCInI0QwRkFFNSdcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtNFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0VmFsdWVIdG1sRm4oY2hhbmdlLnRvVmFsdWUsIGNoYW5nZS5maWVsZClcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdGVkVmVyc2lvbi5jaGFuZ2VzPy5sZW5ndGhcIiBjbGFzcz1cImNxYS12aC1kZXRhaWwtZW1wdHlcIj5cbiAgICA8Y3FhLWVtcHR5LXN0YXRlIHRpdGxlPVwiTm8gY2hhbmdlc1wiIGRlc2NyaXB0aW9uPVwiTm8gY2hhbmdlcyByZWNvcmRlZCBmb3IgdGhpcyB2ZXJzaW9uLlwiPjwvY3FhLWVtcHR5LXN0YXRlPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI25vU2VsZWN0aW9uPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXZoLWRldGFpbC1uby1zZWxlY3Rpb25cIj5cbiAgICBTZWxlY3QgYSB2ZXJzaW9uIHRvIHZpZXcgZGV0YWlscy5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -7,7 +7,6 @@ export class VersionHistoryRestoreConfirmComponent {
7
7
  this.newVersionNumber = 0;
8
8
  this.authorName = '';
9
9
  this.getChangeHeadlineFn = null;
10
- this.fieldLabelMap = {};
11
10
  }
12
11
  getRestoreToLabel() {
13
12
  if (!this.restoringToVersion) {
@@ -24,58 +23,30 @@ export class VersionHistoryRestoreConfirmComponent {
24
23
  d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });
25
24
  }
26
25
  getChangeInfo(change) {
27
- const rawField = change?.field || 'field';
28
- const field = this.fieldLabelMap[rawField] || rawField;
29
26
  const op = (change?.op || '').toLowerCase();
30
- const step = change?.stepId != null ? `Step #${change.stepId} ` : '';
31
- // Plain text versions used only for building the sentence
32
- const fromText = this.toPlainText(change?.fromValue);
33
- const toText = this.toPlainText(change?.toValue);
34
- // Raw values preserved for innerHTML detail rows (HTML kept, no truncation)
27
+ // Sentence comes entirely from the parent via getChangeHeadlineFn
28
+ const sentence = this.getChangeHeadlineFn
29
+ ? this.getChangeHeadlineFn(change)
30
+ : this.fallbackSentence(change);
35
31
  const fromDisplay = this.toDisplayHtml(change?.fromValue);
36
32
  const toDisplay = this.toDisplayHtml(change?.toValue);
37
- let sentence;
38
- if (op === 'add') {
39
- sentence = `${step}${field} added`;
40
- }
41
- else if (op === 'remove') {
42
- sentence = `${step}${field} removed`;
43
- }
44
- else if (op === 'replace') {
45
- if (fromText && toText) {
46
- sentence = `${step}${field} changed`;
47
- }
48
- else if (toText) {
49
- sentence = `${step}${field} reset to ${toText}`;
50
- }
51
- else if (fromText) {
52
- sentence = `${step}${field} reverted`;
53
- }
54
- else {
55
- sentence = `${step}${field} changed`;
56
- }
57
- }
58
- else {
59
- sentence = `${step}${field} updated`;
60
- }
61
33
  return { sentence, fromDisplay, toDisplay, op };
62
34
  }
63
- // Strip HTML and truncate used only in the sentence string
64
- toPlainText(value) {
65
- if (value == null) {
66
- return '';
67
- }
68
- let text;
69
- if (typeof value === 'string') {
70
- text = value.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
35
+ // Basic fallback if no getChangeHeadlineFn is provided
36
+ fallbackSentence(change) {
37
+ const field = change?.field || 'Step';
38
+ const op = (change?.op || '').toLowerCase();
39
+ const step = change?.stepId != null ? `Step #${change.stepId} ` : '';
40
+ if (op === 'add') {
41
+ return `${step}${field} added`;
71
42
  }
72
- else if (typeof value === 'object') {
73
- text = value.action || value.type || value.name || JSON.stringify(value);
43
+ if (op === 'remove') {
44
+ return `${step}${field} removed`;
74
45
  }
75
- else {
76
- text = String(value);
46
+ if (op === 'replace') {
47
+ return `${step}${field} changed`;
77
48
  }
78
- return text.length > 55 ? text.slice(0, 52) + '…' : text;
49
+ return `${step}${field} updated`;
79
50
  }
80
51
  // Preserve HTML for detail pills — objects resolved to a readable string
81
52
  toDisplayHtml(value) {
@@ -92,7 +63,7 @@ export class VersionHistoryRestoreConfirmComponent {
92
63
  }
93
64
  }
94
65
  VersionHistoryRestoreConfirmComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryRestoreConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
- VersionHistoryRestoreConfirmComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryRestoreConfirmComponent, selector: "cqa-version-history-restore-confirm", inputs: { restoringToVersion: "restoringToVersion", currentVersionNumber: "currentVersionNumber", newVersionNumber: "newVersionNumber", authorName: "authorName", getChangeHeadlineFn: "getChangeHeadlineFn", fieldLabelMap: "fieldLabelMap" }, ngImport: i0, template: "<div class=\"cqa-vh-restore-confirm\">\n\n <!-- Info grid -->\n <div class=\"cqa-vh-restore-info-grid\">\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Restoring to</span>\n <span class=\"cqa-vh-restore-info-value\">{{ getRestoreToLabel() }}</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">New version created</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ newVersionNumber }} (auto-incremented)</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Current version</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ currentVersionNumber }} \u2014 preserved in history</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Author</span>\n <span class=\"cqa-vh-restore-info-value\">{{ authorName }}</span>\n </div>\n </div>\n\n <!-- Changes that will be reverted -->\n <div *ngIf=\"restoringToVersion?.changes?.length\">\n <div class=\"cqa-vh-restore-changes-title\">Changes that will be reverted</div>\n <div class=\"cqa-vh-restore-changes-list\">\n <div *ngFor=\"let change of restoringToVersion.changes; let i = index\"\n class=\"cqa-vh-restore-change-item\">\n\n <div class=\"cqa-vh-restore-change-index\">{{ i + 1 }}</div>\n\n <ng-container *ngIf=\"getChangeInfo(change) as info\">\n <div class=\"cqa-vh-restore-change-body\">\n\n <!-- Primary sentence -->\n <span class=\"cqa-vh-restore-change-sentence\">{{ info.sentence }}</span>\n\n <!-- From \u2192 To detail (replace only) -->\n <div *ngIf=\"info.op === 'replace' && info.fromDisplay && info.toDisplay\"\n class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n <span class=\"cqa-vh-restore-change-detail-arrow\">\u2192</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--to\" [innerHTML]=\"info.toDisplay\"></span>\n </div>\n\n <!-- Was: (remove only) -->\n <div *ngIf=\"info.op === 'remove' && info.fromDisplay\" class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-label\">Was:</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n </div>\n\n </div>\n </ng-container>\n\n </div>\n </div>\n </div>\n\n <!-- Preservation note -->\n <div class=\"cqa-vh-restore-note\">\n <span class=\"material-symbols-outlined cqa-vh-restore-note-icon\">info</span>\n <span class=\"cqa-vh-restore-note-text\">\n All version history will be fully preserved. This restore action will itself appear as a new version entry in the timeline.\n </span>\n </div>\n\n</div>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
66
+ VersionHistoryRestoreConfirmComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: VersionHistoryRestoreConfirmComponent, selector: "cqa-version-history-restore-confirm", inputs: { restoringToVersion: "restoringToVersion", currentVersionNumber: "currentVersionNumber", newVersionNumber: "newVersionNumber", authorName: "authorName", getChangeHeadlineFn: "getChangeHeadlineFn" }, ngImport: i0, template: "<div class=\"cqa-vh-restore-confirm\">\n\n <!-- Info grid -->\n <div class=\"cqa-vh-restore-info-grid\">\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Restoring to</span>\n <span class=\"cqa-vh-restore-info-value\">{{ getRestoreToLabel() }}</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">New version created</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ newVersionNumber }} (auto-incremented)</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Current version</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ currentVersionNumber }} \u2014 preserved in history</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Author</span>\n <span class=\"cqa-vh-restore-info-value\">{{ authorName }}</span>\n </div>\n </div>\n\n <!-- Changes that will be reverted -->\n <div *ngIf=\"restoringToVersion?.changes?.length\">\n <div class=\"cqa-vh-restore-changes-title\">Changes that will be reverted</div>\n <div class=\"cqa-vh-restore-changes-list\">\n <div *ngFor=\"let change of restoringToVersion.changes; let i = index\"\n class=\"cqa-vh-restore-change-item\">\n\n <div class=\"cqa-vh-restore-change-index\">{{ i + 1 }}</div>\n\n <ng-container *ngIf=\"getChangeInfo(change) as info\">\n <div class=\"cqa-vh-restore-change-body\">\n\n <!-- Primary sentence -->\n <span class=\"cqa-vh-restore-change-sentence\">{{ info.sentence }}</span>\n\n <!-- From \u2192 To detail (replace only) -->\n <div *ngIf=\"info.op === 'replace' && info.fromDisplay && info.toDisplay\"\n class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n <span class=\"cqa-vh-restore-change-detail-arrow\">\u2192</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--to\" [innerHTML]=\"info.toDisplay\"></span>\n </div>\n\n <!-- Was: (remove only) -->\n <div *ngIf=\"info.op === 'remove' && info.fromDisplay\" class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-label\">Was:</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n </div>\n\n </div>\n </ng-container>\n\n </div>\n </div>\n </div>\n\n <!-- Preservation note -->\n <div class=\"cqa-vh-restore-note\">\n <span class=\"material-symbols-outlined cqa-vh-restore-note-icon\">info</span>\n <span class=\"cqa-vh-restore-note-text\">\n All version history will be fully preserved. This restore action will itself appear as a new version entry in the timeline.\n </span>\n </div>\n\n</div>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
96
67
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: VersionHistoryRestoreConfirmComponent, decorators: [{
97
68
  type: Component,
98
69
  args: [{ selector: 'cqa-version-history-restore-confirm', template: "<div class=\"cqa-vh-restore-confirm\">\n\n <!-- Info grid -->\n <div class=\"cqa-vh-restore-info-grid\">\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Restoring to</span>\n <span class=\"cqa-vh-restore-info-value\">{{ getRestoreToLabel() }}</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">New version created</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ newVersionNumber }} (auto-incremented)</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Current version</span>\n <span class=\"cqa-vh-restore-info-value\">v{{ currentVersionNumber }} \u2014 preserved in history</span>\n </div>\n <div class=\"cqa-vh-restore-info-row\">\n <span class=\"cqa-vh-restore-info-label\">Author</span>\n <span class=\"cqa-vh-restore-info-value\">{{ authorName }}</span>\n </div>\n </div>\n\n <!-- Changes that will be reverted -->\n <div *ngIf=\"restoringToVersion?.changes?.length\">\n <div class=\"cqa-vh-restore-changes-title\">Changes that will be reverted</div>\n <div class=\"cqa-vh-restore-changes-list\">\n <div *ngFor=\"let change of restoringToVersion.changes; let i = index\"\n class=\"cqa-vh-restore-change-item\">\n\n <div class=\"cqa-vh-restore-change-index\">{{ i + 1 }}</div>\n\n <ng-container *ngIf=\"getChangeInfo(change) as info\">\n <div class=\"cqa-vh-restore-change-body\">\n\n <!-- Primary sentence -->\n <span class=\"cqa-vh-restore-change-sentence\">{{ info.sentence }}</span>\n\n <!-- From \u2192 To detail (replace only) -->\n <div *ngIf=\"info.op === 'replace' && info.fromDisplay && info.toDisplay\"\n class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n <span class=\"cqa-vh-restore-change-detail-arrow\">\u2192</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--to\" [innerHTML]=\"info.toDisplay\"></span>\n </div>\n\n <!-- Was: (remove only) -->\n <div *ngIf=\"info.op === 'remove' && info.fromDisplay\" class=\"cqa-vh-restore-change-detail\">\n <span class=\"cqa-vh-restore-change-detail-label\">Was:</span>\n <span class=\"cqa-vh-restore-change-detail-value cqa-vh-restore-change-detail-value--from\" [innerHTML]=\"info.fromDisplay\"></span>\n </div>\n\n </div>\n </ng-container>\n\n </div>\n </div>\n </div>\n\n <!-- Preservation note -->\n <div class=\"cqa-vh-restore-note\">\n <span class=\"material-symbols-outlined cqa-vh-restore-note-icon\">info</span>\n <span class=\"cqa-vh-restore-note-text\">\n All version history will be fully preserved. This restore action will itself appear as a new version entry in the timeline.\n </span>\n </div>\n\n</div>\n", styles: [] }]
@@ -106,7 +77,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
106
77
  type: Input
107
78
  }], getChangeHeadlineFn: [{
108
79
  type: Input
109
- }], fieldLabelMap: [{
110
- type: Input
111
80
  }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LXJlc3RvcmUtY29uZmlybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3ZlcnNpb24taGlzdG9yeS92ZXJzaW9uLWhpc3RvcnktcmVzdG9yZS1jb25maXJtL3ZlcnNpb24taGlzdG9yeS1yZXN0b3JlLWNvbmZpcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LXJlc3RvcmUtY29uZmlybS92ZXJzaW9uLWhpc3RvcnktcmVzdG9yZS1jb25maXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPakQsTUFBTSxPQUFPLHFDQUFxQztJQUxsRDtRQU9XLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4Qix3QkFBbUIsR0FBcUMsSUFBSSxDQUFDO1FBQzdELGtCQUFhLEdBQTJCLEVBQUUsQ0FBQztLQWlGckQ7SUEvRUMsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVc7WUFDOUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUN0RCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxJQUFJO1lBQzdFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBVztRQU12QixNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQztRQUN2RCxNQUFNLEVBQUUsR0FBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUksTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFdEUsMERBQTBEO1FBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRW5ELDRFQUE0RTtRQUM1RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV4RCxJQUFJLFFBQWdCLENBQUM7UUFFckIsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFO1lBQ2hCLFFBQVEsR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLFFBQVEsQ0FBQztTQUNwQzthQUFNLElBQUksRUFBRSxLQUFLLFFBQVEsRUFBRTtZQUMxQixRQUFRLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxVQUFVLENBQUM7U0FDdEM7YUFBTSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUU7WUFDM0IsSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFO2dCQUN0QixRQUFRLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxVQUFVLENBQUM7YUFDdEM7aUJBQU0sSUFBSSxNQUFNLEVBQUU7Z0JBQ2pCLFFBQVEsR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLGFBQWEsTUFBTSxFQUFFLENBQUM7YUFDakQ7aUJBQU0sSUFBSSxRQUFRLEVBQUU7Z0JBQ25CLFFBQVEsR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLFdBQVcsQ0FBQzthQUN2QztpQkFBTTtnQkFDTCxRQUFRLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxVQUFVLENBQUM7YUFDdEM7U0FDRjthQUFNO1lBQ0wsUUFBUSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssVUFBVSxDQUFDO1NBQ3RDO1FBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCw2REFBNkQ7SUFDckQsV0FBVyxDQUFDLEtBQVU7UUFDNUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUNqQyxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNuRTthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQ3BDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFFO2FBQU07WUFDTCxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUVELHlFQUF5RTtJQUNqRSxhQUFhLENBQUMsS0FBVTtRQUM5QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7U0FBRTtRQUN2RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRjtRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7O2tJQXRGVSxxQ0FBcUM7c0hBQXJDLHFDQUFxQywyVENQbEQsNGlHQW1FQTsyRkQ1RGEscUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLHFDQUFxQzs4QkFLdEMsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXZlcnNpb24taGlzdG9yeS1yZXN0b3JlLWNvbmZpcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdmVyc2lvbi1oaXN0b3J5LXJlc3RvcmUtY29uZmlybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgVmVyc2lvbkhpc3RvcnlSZXN0b3JlQ29uZmlybUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHJlc3RvcmluZ1RvVmVyc2lvbjogYW55O1xuICBASW5wdXQoKSBjdXJyZW50VmVyc2lvbk51bWJlcjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgbmV3VmVyc2lvbk51bWJlcjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgYXV0aG9yTmFtZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGdldENoYW5nZUhlYWRsaW5lRm46ICgoY2hhbmdlOiBhbnkpID0+IHN0cmluZykgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZmllbGRMYWJlbE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGdldFJlc3RvcmVUb0xhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJlc3RvcmluZ1RvVmVyc2lvbikgeyByZXR1cm4gJyc7IH1cbiAgICBjb25zdCBkYXRlID0gdGhpcy5yZXN0b3JpbmdUb1ZlcnNpb24uZGlzcGxheURhdGVcbiAgICAgID8gdGhpcy5mb3JtYXREYXRlKHRoaXMucmVzdG9yaW5nVG9WZXJzaW9uLmRpc3BsYXlEYXRlKVxuICAgICAgOiAnJztcbiAgICByZXR1cm4gJ3YnICsgdGhpcy5yZXN0b3JpbmdUb1ZlcnNpb24udmVyc2lvbk51bWJlciArIChkYXRlID8gJyDigJQgJyArIGRhdGUgOiAnJyk7XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGQgPSBkYXRlIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUgOiBuZXcgRGF0ZShkYXRlKTtcbiAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfSkgKyAnLCAnICtcbiAgICAgIGQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTtcbiAgfVxuXG4gIGdldENoYW5nZUluZm8oY2hhbmdlOiBhbnkpOiB7XG4gICAgc2VudGVuY2U6IHN0cmluZztcbiAgICBmcm9tRGlzcGxheTogc3RyaW5nO1xuICAgIHRvRGlzcGxheTogc3RyaW5nO1xuICAgIG9wOiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHJhd0ZpZWxkID0gY2hhbmdlPy5maWVsZCB8fCAnZmllbGQnO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZExhYmVsTWFwW3Jhd0ZpZWxkXSB8fCByYXdGaWVsZDtcbiAgICBjb25zdCBvcCAgICA9IChjaGFuZ2U/Lm9wIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHN0ZXAgID0gY2hhbmdlPy5zdGVwSWQgIT0gbnVsbCA/IGBTdGVwICMke2NoYW5nZS5zdGVwSWR9IGAgOiAnJztcblxuICAgIC8vIFBsYWluIHRleHQgdmVyc2lvbnMgdXNlZCBvbmx5IGZvciBidWlsZGluZyB0aGUgc2VudGVuY2VcbiAgICBjb25zdCBmcm9tVGV4dCA9IHRoaXMudG9QbGFpblRleHQoY2hhbmdlPy5mcm9tVmFsdWUpO1xuICAgIGNvbnN0IHRvVGV4dCAgID0gdGhpcy50b1BsYWluVGV4dChjaGFuZ2U/LnRvVmFsdWUpO1xuXG4gICAgLy8gUmF3IHZhbHVlcyBwcmVzZXJ2ZWQgZm9yIGlubmVySFRNTCBkZXRhaWwgcm93cyAoSFRNTCBrZXB0LCBubyB0cnVuY2F0aW9uKVxuICAgIGNvbnN0IGZyb21EaXNwbGF5ID0gdGhpcy50b0Rpc3BsYXlIdG1sKGNoYW5nZT8uZnJvbVZhbHVlKTtcbiAgICBjb25zdCB0b0Rpc3BsYXkgICA9IHRoaXMudG9EaXNwbGF5SHRtbChjaGFuZ2U/LnRvVmFsdWUpO1xuXG4gICAgbGV0IHNlbnRlbmNlOiBzdHJpbmc7XG5cbiAgICBpZiAob3AgPT09ICdhZGQnKSB7XG4gICAgICBzZW50ZW5jZSA9IGAke3N0ZXB9JHtmaWVsZH0gYWRkZWRgO1xuICAgIH0gZWxzZSBpZiAob3AgPT09ICdyZW1vdmUnKSB7XG4gICAgICBzZW50ZW5jZSA9IGAke3N0ZXB9JHtmaWVsZH0gcmVtb3ZlZGA7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICBpZiAoZnJvbVRleHQgJiYgdG9UZXh0KSB7XG4gICAgICAgIHNlbnRlbmNlID0gYCR7c3RlcH0ke2ZpZWxkfSBjaGFuZ2VkYDtcbiAgICAgIH0gZWxzZSBpZiAodG9UZXh0KSB7XG4gICAgICAgIHNlbnRlbmNlID0gYCR7c3RlcH0ke2ZpZWxkfSByZXNldCB0byAke3RvVGV4dH1gO1xuICAgICAgfSBlbHNlIGlmIChmcm9tVGV4dCkge1xuICAgICAgICBzZW50ZW5jZSA9IGAke3N0ZXB9JHtmaWVsZH0gcmV2ZXJ0ZWRgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VudGVuY2UgPSBgJHtzdGVwfSR7ZmllbGR9IGNoYW5nZWRgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZW50ZW5jZSA9IGAke3N0ZXB9JHtmaWVsZH0gdXBkYXRlZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VudGVuY2UsIGZyb21EaXNwbGF5LCB0b0Rpc3BsYXksIG9wIH07XG4gIH1cblxuICAvLyBTdHJpcCBIVE1MIGFuZCB0cnVuY2F0ZSDigJQgdXNlZCBvbmx5IGluIHRoZSBzZW50ZW5jZSBzdHJpbmdcbiAgcHJpdmF0ZSB0b1BsYWluVGV4dCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gJyc7IH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0ZXh0ID0gdmFsdWUucmVwbGFjZSgvPFtePl0qPi9nLCAnICcpLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0ZXh0ID0gdmFsdWUuYWN0aW9uIHx8IHZhbHVlLnR5cGUgfHwgdmFsdWUubmFtZSB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHQgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5sZW5ndGggPiA1NSA/IHRleHQuc2xpY2UoMCwgNTIpICsgJ+KApicgOiB0ZXh0O1xuICB9XG5cbiAgLy8gUHJlc2VydmUgSFRNTCBmb3IgZGV0YWlsIHBpbGxzIOKAlCBvYmplY3RzIHJlc29sdmVkIHRvIGEgcmVhZGFibGUgc3RyaW5nXG4gIHByaXZhdGUgdG9EaXNwbGF5SHRtbCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyByZXR1cm4gJyc7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgeyByZXR1cm4gdmFsdWUudHJpbSgpOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5hY3Rpb24gfHwgdmFsdWUudHlwZSB8fCB2YWx1ZS5uYW1lIHx8IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jb25maXJtXCI+XG5cbiAgPCEtLSBJbmZvIGdyaWQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLWdyaWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1sYWJlbFwiPlJlc3RvcmluZyB0bzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby12YWx1ZVwiPnt7IGdldFJlc3RvcmVUb0xhYmVsKCkgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tcm93XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tbGFiZWxcIj5OZXcgdmVyc2lvbiBjcmVhdGVkPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLXZhbHVlXCI+dnt7IG5ld1ZlcnNpb25OdW1iZXIgfX0gKGF1dG8taW5jcmVtZW50ZWQpPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLWxhYmVsXCI+Q3VycmVudCB2ZXJzaW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLXZhbHVlXCI+dnt7IGN1cnJlbnRWZXJzaW9uTnVtYmVyIH19IOKAlCBwcmVzZXJ2ZWQgaW4gaGlzdG9yeTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1sYWJlbFwiPkF1dGhvcjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby12YWx1ZVwiPnt7IGF1dGhvck5hbWUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ2hhbmdlcyB0aGF0IHdpbGwgYmUgcmV2ZXJ0ZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJyZXN0b3JpbmdUb1ZlcnNpb24/LmNoYW5nZXM/Lmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2VzLXRpdGxlXCI+Q2hhbmdlcyB0aGF0IHdpbGwgYmUgcmV2ZXJ0ZWQ8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlcy1saXN0XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGFuZ2Ugb2YgcmVzdG9yaW5nVG9WZXJzaW9uLmNoYW5nZXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1pdGVtXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1pbmRleFwiPnt7IGkgKyAxIH19PC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENoYW5nZUluZm8oY2hhbmdlKSBhcyBpbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1ib2R5XCI+XG5cbiAgICAgICAgICAgIDwhLS0gUHJpbWFyeSBzZW50ZW5jZSAtLT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLXNlbnRlbmNlXCI+e3sgaW5mby5zZW50ZW5jZSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgPCEtLSBGcm9tIOKGkiBUbyBkZXRhaWwgKHJlcGxhY2Ugb25seSkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5mby5vcCA9PT0gJ3JlcGxhY2UnICYmIGluZm8uZnJvbURpc3BsYXkgJiYgaW5mby50b0Rpc3BsYXlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsLXZhbHVlIGNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWwtdmFsdWUtLWZyb21cIiBbaW5uZXJIVE1MXT1cImluZm8uZnJvbURpc3BsYXlcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC1hcnJvd1wiPuKGkjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsLXZhbHVlIGNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWwtdmFsdWUtLXRvXCIgW2lubmVySFRNTF09XCJpbmZvLnRvRGlzcGxheVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFdhczogKHJlbW92ZSBvbmx5KSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbmZvLm9wID09PSAncmVtb3ZlJyAmJiBpbmZvLmZyb21EaXNwbGF5XCIgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC1sYWJlbFwiPldhczo8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC12YWx1ZSBjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsLXZhbHVlLS1mcm9tXCIgW2lubmVySFRNTF09XCJpbmZvLmZyb21EaXNwbGF5XCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFByZXNlcnZhdGlvbiBub3RlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtbm90ZVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjcWEtdmgtcmVzdG9yZS1ub3RlLWljb25cIj5pbmZvPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtbm90ZS10ZXh0XCI+XG4gICAgICBBbGwgdmVyc2lvbiBoaXN0b3J5IHdpbGwgYmUgZnVsbHkgcHJlc2VydmVkLiBUaGlzIHJlc3RvcmUgYWN0aW9uIHdpbGwgaXRzZWxmIGFwcGVhciBhcyBhIG5ldyB2ZXJzaW9uIGVudHJ5IGluIHRoZSB0aW1lbGluZS5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1oaXN0b3J5LXJlc3RvcmUtY29uZmlybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3ZlcnNpb24taGlzdG9yeS92ZXJzaW9uLWhpc3RvcnktcmVzdG9yZS1jb25maXJtL3ZlcnNpb24taGlzdG9yeS1yZXN0b3JlLWNvbmZpcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvdmVyc2lvbi1oaXN0b3J5LXJlc3RvcmUtY29uZmlybS92ZXJzaW9uLWhpc3RvcnktcmVzdG9yZS1jb25maXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPakQsTUFBTSxPQUFPLHFDQUFxQztJQUxsRDtRQU9XLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4Qix3QkFBbUIsR0FBcUMsSUFBSSxDQUFDO0tBdUR2RTtJQXJEQyxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVU7UUFDbkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLElBQUk7WUFDN0UsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFXO1FBTXZCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU1QyxrRUFBa0U7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjtZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sU0FBUyxHQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsdURBQXVEO0lBQy9DLGdCQUFnQixDQUFDLE1BQVc7UUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssSUFBSSxNQUFNLENBQUM7UUFDdEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxRQUFRLENBQUM7U0FBRTtRQUNyRCxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEtBQUssVUFBVSxDQUFDO1NBQUU7UUFDMUQsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO1lBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxLQUFLLFVBQVUsQ0FBQztTQUFFO1FBQzNELE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxVQUFVLENBQUM7SUFDbkMsQ0FBQztJQUVELHlFQUF5RTtJQUNqRSxhQUFhLENBQUMsS0FBVTtRQUM5QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztTQUFFO1FBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7U0FBRTtRQUN2RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuRjtRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7O2tJQTNEVSxxQ0FBcUM7c0hBQXJDLHFDQUFxQywyUkNQbEQsNGlHQW1FQTsyRkQ1RGEscUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLHFDQUFxQzs4QkFLdEMsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS12ZXJzaW9uLWhpc3RvcnktcmVzdG9yZS1jb25maXJtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZlcnNpb24taGlzdG9yeS1yZXN0b3JlLWNvbmZpcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIFZlcnNpb25IaXN0b3J5UmVzdG9yZUNvbmZpcm1Db21wb25lbnQge1xuICBASW5wdXQoKSByZXN0b3JpbmdUb1ZlcnNpb246IGFueTtcbiAgQElucHV0KCkgY3VycmVudFZlcnNpb25OdW1iZXI6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG5ld1ZlcnNpb25OdW1iZXI6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGF1dGhvck5hbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBnZXRDaGFuZ2VIZWFkbGluZUZuOiAoKGNoYW5nZTogYW55KSA9PiBzdHJpbmcpIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2V0UmVzdG9yZVRvTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucmVzdG9yaW5nVG9WZXJzaW9uKSB7IHJldHVybiAnJzsgfVxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnJlc3RvcmluZ1RvVmVyc2lvbi5kaXNwbGF5RGF0ZVxuICAgICAgPyB0aGlzLmZvcm1hdERhdGUodGhpcy5yZXN0b3JpbmdUb1ZlcnNpb24uZGlzcGxheURhdGUpXG4gICAgICA6ICcnO1xuICAgIHJldHVybiAndicgKyB0aGlzLnJlc3RvcmluZ1RvVmVyc2lvbi52ZXJzaW9uTnVtYmVyICsgKGRhdGUgPyAnIOKAlCAnICsgZGF0ZSA6ICcnKTtcbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IGRhdGUgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZSA6IG5ldyBEYXRlKGRhdGUpO1xuICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9KSArICcsICcgK1xuICAgICAgZC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywgeyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xuICB9XG5cbiAgZ2V0Q2hhbmdlSW5mbyhjaGFuZ2U6IGFueSk6IHtcbiAgICBzZW50ZW5jZTogc3RyaW5nO1xuICAgIGZyb21EaXNwbGF5OiBzdHJpbmc7XG4gICAgdG9EaXNwbGF5OiBzdHJpbmc7XG4gICAgb3A6IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3Qgb3AgPSAoY2hhbmdlPy5vcCB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIFNlbnRlbmNlIGNvbWVzIGVudGlyZWx5IGZyb20gdGhlIHBhcmVudCB2aWEgZ2V0Q2hhbmdlSGVhZGxpbmVGblxuICAgIGNvbnN0IHNlbnRlbmNlID0gdGhpcy5nZXRDaGFuZ2VIZWFkbGluZUZuXG4gICAgICA/IHRoaXMuZ2V0Q2hhbmdlSGVhZGxpbmVGbihjaGFuZ2UpXG4gICAgICA6IHRoaXMuZmFsbGJhY2tTZW50ZW5jZShjaGFuZ2UpO1xuXG4gICAgY29uc3QgZnJvbURpc3BsYXkgPSB0aGlzLnRvRGlzcGxheUh0bWwoY2hhbmdlPy5mcm9tVmFsdWUpO1xuICAgIGNvbnN0IHRvRGlzcGxheSAgID0gdGhpcy50b0Rpc3BsYXlIdG1sKGNoYW5nZT8udG9WYWx1ZSk7XG5cbiAgICByZXR1cm4geyBzZW50ZW5jZSwgZnJvbURpc3BsYXksIHRvRGlzcGxheSwgb3AgfTtcbiAgfVxuXG4gIC8vIEJhc2ljIGZhbGxiYWNrIGlmIG5vIGdldENoYW5nZUhlYWRsaW5lRm4gaXMgcHJvdmlkZWRcbiAgcHJpdmF0ZSBmYWxsYmFja1NlbnRlbmNlKGNoYW5nZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBmaWVsZCA9IGNoYW5nZT8uZmllbGQgfHwgJ1N0ZXAnO1xuICAgIGNvbnN0IG9wID0gKGNoYW5nZT8ub3AgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgc3RlcCA9IGNoYW5nZT8uc3RlcElkICE9IG51bGwgPyBgU3RlcCAjJHtjaGFuZ2Uuc3RlcElkfSBgIDogJyc7XG4gICAgaWYgKG9wID09PSAnYWRkJykgeyByZXR1cm4gYCR7c3RlcH0ke2ZpZWxkfSBhZGRlZGA7IH1cbiAgICBpZiAob3AgPT09ICdyZW1vdmUnKSB7IHJldHVybiBgJHtzdGVwfSR7ZmllbGR9IHJlbW92ZWRgOyB9XG4gICAgaWYgKG9wID09PSAncmVwbGFjZScpIHsgcmV0dXJuIGAke3N0ZXB9JHtmaWVsZH0gY2hhbmdlZGA7IH1cbiAgICByZXR1cm4gYCR7c3RlcH0ke2ZpZWxkfSB1cGRhdGVkYDtcbiAgfVxuXG4gIC8vIFByZXNlcnZlIEhUTUwgZm9yIGRldGFpbCBwaWxscyDigJQgb2JqZWN0cyByZXNvbHZlZCB0byBhIHJlYWRhYmxlIHN0cmluZ1xuICBwcml2YXRlIHRvRGlzcGxheUh0bWwodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHsgcmV0dXJuICcnOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIHZhbHVlLnRyaW0oKTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdmFsdWUuYWN0aW9uIHx8IHZhbHVlLnR5cGUgfHwgdmFsdWUubmFtZSB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY29uZmlybVwiPlxuXG4gIDwhLS0gSW5mbyBncmlkIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1ncmlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tcm93XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tbGFiZWxcIj5SZXN0b3JpbmcgdG88L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tdmFsdWVcIj57eyBnZXRSZXN0b3JlVG9MYWJlbCgpIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1pbmZvLWxhYmVsXCI+TmV3IHZlcnNpb24gY3JlYXRlZDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby12YWx1ZVwiPnZ7eyBuZXdWZXJzaW9uTnVtYmVyIH19IChhdXRvLWluY3JlbWVudGVkKTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby1sYWJlbFwiPkN1cnJlbnQgdmVyc2lvbjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtaW5mby12YWx1ZVwiPnZ7eyBjdXJyZW50VmVyc2lvbk51bWJlciB9fSDigJQgcHJlc2VydmVkIGluIGhpc3Rvcnk8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tcm93XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tbGFiZWxcIj5BdXRob3I8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWluZm8tdmFsdWVcIj57eyBhdXRob3JOYW1lIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENoYW5nZXMgdGhhdCB3aWxsIGJlIHJldmVydGVkIC0tPlxuICA8ZGl2ICpuZ0lmPVwicmVzdG9yaW5nVG9WZXJzaW9uPy5jaGFuZ2VzPy5sZW5ndGhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlcy10aXRsZVwiPkNoYW5nZXMgdGhhdCB3aWxsIGJlIHJldmVydGVkPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZXMtbGlzdFwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hhbmdlIG9mIHJlc3RvcmluZ1RvVmVyc2lvbi5jaGFuZ2VzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtaXRlbVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtaW5kZXhcIj57eyBpICsgMSB9fTwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDaGFuZ2VJbmZvKGNoYW5nZSkgYXMgaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtYm9keVwiPlxuXG4gICAgICAgICAgICA8IS0tIFByaW1hcnkgc2VudGVuY2UgLS0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1zZW50ZW5jZVwiPnt7IGluZm8uc2VudGVuY2UgfX08L3NwYW4+XG5cbiAgICAgICAgICAgIDwhLS0gRnJvbSDihpIgVG8gZGV0YWlsIChyZXBsYWNlIG9ubHkpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImluZm8ub3AgPT09ICdyZXBsYWNlJyAmJiBpbmZvLmZyb21EaXNwbGF5ICYmIGluZm8udG9EaXNwbGF5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC12YWx1ZSBjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsLXZhbHVlLS1mcm9tXCIgW2lubmVySFRNTF09XCJpbmZvLmZyb21EaXNwbGF5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWwtYXJyb3dcIj7ihpI8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC12YWx1ZSBjcWEtdmgtcmVzdG9yZS1jaGFuZ2UtZGV0YWlsLXZhbHVlLS10b1wiIFtpbm5lckhUTUxdPVwiaW5mby50b0Rpc3BsYXlcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBXYXM6IChyZW1vdmUgb25seSkgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5mby5vcCA9PT0gJ3JlbW92ZScgJiYgaW5mby5mcm9tRGlzcGxheVwiIGNsYXNzPVwiY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWwtbGFiZWxcIj5XYXM6PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLWNoYW5nZS1kZXRhaWwtdmFsdWUgY3FhLXZoLXJlc3RvcmUtY2hhbmdlLWRldGFpbC12YWx1ZS0tZnJvbVwiIFtpbm5lckhUTUxdPVwiaW5mby5mcm9tRGlzcGxheVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBQcmVzZXJ2YXRpb24gbm90ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLW5vdGVcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY3FhLXZoLXJlc3RvcmUtbm90ZS1pY29uXCI+aW5mbzwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS12aC1yZXN0b3JlLW5vdGUtdGV4dFwiPlxuICAgICAgQWxsIHZlcnNpb24gaGlzdG9yeSB3aWxsIGJlIGZ1bGx5IHByZXNlcnZlZC4gVGhpcyByZXN0b3JlIGFjdGlvbiB3aWxsIGl0c2VsZiBhcHBlYXIgYXMgYSBuZXcgdmVyc2lvbiBlbnRyeSBpbiB0aGUgdGltZWxpbmUuXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=