@cqa-lib/cqa-ui 1.1.508 → 1.1.510

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.
@@ -1,4 +1,4 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/material/icon";
4
4
  import * as i2 from "@angular/material/radio";
@@ -6,31 +6,80 @@ import * as i3 from "../button/button.component";
6
6
  import * as i4 from "@angular/common";
7
7
  /**
8
8
  * Confirmation dialog shown before editing an AI-Agent step whose execution has
9
- * already generated sub-steps (CON-926). The caller supplies the option list
10
- * and copy; this component only renders the UI and emits the user's choice.
9
+ * already generated sub-steps (CON-926). Also used by CON-1166 to review
10
+ * AI-generated steps before persisting.
11
+ *
12
+ * The caller supplies the whole payload via the `config` input (one object, one
13
+ * reference change = one re-render). `isOpen` stays separate so open/close
14
+ * transitions don't force callers to rebuild the payload.
11
15
  */
12
16
  export class SubStepsConfirmationDialogComponent {
13
- constructor() {
17
+ constructor(cdr) {
18
+ this.cdr = cdr;
14
19
  this.isOpen = false;
15
- this.title = 'This step has generated sub-steps';
16
- this.description = '';
17
- this.options = [];
18
- this.cancelLabel = 'Cancel';
19
- this.disableBackdropClose = false;
20
+ this.config = { options: [] };
20
21
  this.selectionChange = new EventEmitter();
21
22
  this.confirm = new EventEmitter();
22
23
  this.closeModal = new EventEmitter();
24
+ this.timeoutExpired = new EventEmitter();
25
+ this.remainingSeconds = 0;
26
+ this._tickIntervalId = null;
27
+ this._timeoutEmitted = false;
23
28
  }
24
29
  ngOnChanges(changes) {
25
- if (changes['options'] || changes['selectedValue'] || changes['isOpen']) {
26
- const valid = this.options?.some(o => o.value === this.selectedValue);
27
- if (!valid && this.options?.length) {
28
- this.selectedValue = this.options[0].value;
30
+ if (changes['config'] || changes['isOpen']) {
31
+ const options = this.config?.options ?? [];
32
+ const incoming = this.config?.selectedValue;
33
+ const stillValid = options.some(o => o.value === this.selectedValue);
34
+ if (incoming != null && options.some(o => o.value === incoming)) {
35
+ this.selectedValue = incoming;
36
+ }
37
+ else if (!stillValid) {
38
+ this.selectedValue = options.length ? options[0].value : undefined;
29
39
  }
30
40
  }
41
+ if (changes['isOpen'] || changes['config']) {
42
+ const timeoutSeconds = this.config?.timeoutSeconds;
43
+ if (this.isOpen && typeof timeoutSeconds === 'number' && timeoutSeconds > 0) {
44
+ const prevTimeout = changes['config']
45
+ ? changes['config'].previousValue?.timeoutSeconds
46
+ : undefined;
47
+ const opening = !!changes['isOpen'] && this.isOpen;
48
+ if (opening || timeoutSeconds !== prevTimeout || this._tickIntervalId == null) {
49
+ this._startCountdown(timeoutSeconds);
50
+ }
51
+ }
52
+ else {
53
+ this._stopCountdown();
54
+ }
55
+ }
56
+ }
57
+ ngOnDestroy() {
58
+ this._stopCountdown();
31
59
  }
60
+ get title() { return this.config?.title ?? 'This step has generated sub-steps'; }
61
+ get description() { return this.config?.description ?? ''; }
62
+ get subtitle() { return this.config?.subtitle; }
63
+ get options() { return this.config?.options ?? []; }
64
+ get cancelLabel() { return this.config?.cancelLabel ?? 'Cancel'; }
65
+ get disableBackdropClose() { return !!this.config?.disableBackdropClose; }
66
+ get hideCloseButton() { return !!this.config?.hideCloseButton; }
67
+ get hideCancel() { return !!this.config?.hideCancel; }
68
+ get warnings() { return this.config?.warnings ?? []; }
69
+ get previewItems() { return this.config?.previewItems ?? []; }
70
+ get previewOverflowCount() { return this.config?.previewOverflowCount ?? 0; }
32
71
  get currentOption() {
33
- return this.options?.find(o => o.value === this.selectedValue);
72
+ return this.options.find(o => o.value === this.selectedValue);
73
+ }
74
+ get showCountdown() {
75
+ const t = this.config?.timeoutSeconds;
76
+ return typeof t === 'number' && t > 0;
77
+ }
78
+ get countdownLabel() {
79
+ const total = Math.max(0, this.remainingSeconds);
80
+ const m = Math.floor(total / 60);
81
+ const s = total % 60;
82
+ return `${m}:${s.toString().padStart(2, '0')}`;
34
83
  }
35
84
  isSelected(option) {
36
85
  return option.value === this.selectedValue;
@@ -42,7 +91,7 @@ export class SubStepsConfirmationDialogComponent {
42
91
  this.selectionChange.emit(option.value);
43
92
  }
44
93
  onRadioChange(event) {
45
- const option = this.options?.find(o => o.value === event.value);
94
+ const option = this.options.find(o => o.value === event.value);
46
95
  if (option)
47
96
  this.onSelect(option);
48
97
  }
@@ -63,25 +112,37 @@ export class SubStepsConfirmationDialogComponent {
63
112
  return;
64
113
  this.confirm.emit(this.selectedValue);
65
114
  }
115
+ _startCountdown(seconds) {
116
+ this._stopCountdown();
117
+ this.remainingSeconds = seconds;
118
+ this._timeoutEmitted = false;
119
+ this._tickIntervalId = setInterval(() => {
120
+ if (this.remainingSeconds > 0) {
121
+ this.remainingSeconds--;
122
+ this.cdr.markForCheck();
123
+ if (this.remainingSeconds === 0 && !this._timeoutEmitted) {
124
+ this._timeoutEmitted = true;
125
+ this.timeoutExpired.emit();
126
+ this._stopCountdown();
127
+ }
128
+ }
129
+ }, 1000);
130
+ }
131
+ _stopCountdown() {
132
+ if (this._tickIntervalId) {
133
+ clearInterval(this._tickIntervalId);
134
+ this._tickIntervalId = null;
135
+ }
136
+ }
66
137
  }
67
- SubStepsConfirmationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SubStepsConfirmationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
68
- SubStepsConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SubStepsConfirmationDialogComponent, selector: "cqa-sub-steps-confirmation-dialog", inputs: { isOpen: "isOpen", title: "title", description: "description", options: "options", selectedValue: "selectedValue", cancelLabel: "cancelLabel", disableBackdropClose: "disableBackdropClose" }, outputs: { selectionChange: "selectionChange", confirm: "confirm", closeModal: "closeModal" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\" class=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 9999;\">\n <div\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-[12px] cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[560px] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-max-h-[85vh] cqa-font-inter\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-px-6 cqa-py-4\" style=\"border-bottom: 1px solid #E5E5E5;\">\n <h2 class=\"cqa-text-[16px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n {{ title }}\n </h2>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-text-[#4A5565] hover:cqa-text-[#111827] cqa-bg-transparent cqa-border-0 cqa-cursor-pointer\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-h-5 cqa-w-5 cqa-text-[20px] cqa-leading-5\">close</mat-icon>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-px-6 cqa-py-3 cqa-overflow-y-auto\">\n <p *ngIf=\"description\"\n class=\"cqa-text-[12px] cqa-text-[#101828] cqa-m-0\">\n {{ description }}\n </p>\n\n <mat-radio-group\n class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-radio-group\"\n [value]=\"selectedValue\"\n (change)=\"onRadioChange($event)\">\n <label\n *ngFor=\"let option of options\"\n class=\"cqa-radio-card-option qqa-m-0 cqa-flex cqa-items-start cqa-gap-1 cqa-cursor-pointer cqa-rounded-[10px] cqa-border cqa-border-solid cqa-p-4 cqa-transition-colors\"\n [ngClass]=\"isSelected(option)\n ? 'cqa-border-[#B1B2F8] cqa-bg-[#D8D9FC4D]'\n : 'cqa-border-[#E5E7EB] cqa-bg-white hover:cqa-border-[#6366f1]'\">\n <mat-radio-button [value]=\"option.value\" class=\"!cqa-pr-0 cqa-mt-[-2px]\"></mat-radio-button>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span\n class=\"cqa-text-[12px] cqa-font-bold\"\n [ngClass]=\"option.variant === 'danger' ? 'cqa-text-[#EE3F3F]' : 'cqa-text-[#364153]'\">\n {{ option.title }}\n </span>\n <span class=\"cqa-text-[12px] cqa-text-[#101828]\">\n {{ option.description }}\n </span>\n </div>\n </label>\n </mat-radio-group>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-px-6 cqa-py-4 cqa-bg-white\" style=\"gap: 24px;\">\n <div class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"cancelLabel\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n *ngIf=\"currentOption\"\n [variant]=\"currentOption.buttonVariant || 'filled'\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"currentOption.buttonLabel\"\n (clicked)=\"onConfirm()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
138
+ SubStepsConfirmationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SubStepsConfirmationDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
139
+ SubStepsConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SubStepsConfirmationDialogComponent, selector: "cqa-sub-steps-confirmation-dialog", inputs: { isOpen: "isOpen", config: "config" }, outputs: { selectionChange: "selectionChange", confirm: "confirm", closeModal: "closeModal", timeoutExpired: "timeoutExpired" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\" class=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 9999;\">\n <div\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-[12px] cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[560px] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-max-h-[85vh] cqa-font-inter\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-px-6 cqa-py-4\" style=\"border-bottom: 1px solid #E5E5E5;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-text-[16px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n {{ title }}\n </h2>\n <span *ngIf=\"subtitle\"\n class=\"cqa-text-[12px] cqa-text-[#4A5565] cqa-m-0\">\n {{ subtitle }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\n <span *ngIf=\"showCountdown\"\n class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#4A5565] cqa-rounded cqa-px-2 cqa-py-0.5\"\n style=\"background: #F3F4F6;\"\n [title]=\"'Auto-discards when timer reaches 0'\">\n {{ countdownLabel }}\n </span>\n <button *ngIf=\"!hideCloseButton\" type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-text-[#4A5565] hover:cqa-text-[#111827] cqa-bg-transparent cqa-border-0 cqa-cursor-pointer\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-h-5 cqa-w-5 cqa-text-[20px] cqa-leading-5\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-px-6 cqa-py-3 cqa-overflow-y-auto\">\n <p *ngIf=\"description\"\n class=\"cqa-text-[12px] cqa-text-[#101828] cqa-m-0\">\n {{ description }}\n </p>\n\n <!-- Warnings (amber) -->\n <div *ngIf=\"warnings?.length\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-rounded-[8px] cqa-px-3 cqa-py-2\"\n style=\"background: #FEF3C7; border: 1px solid #FDE68A;\">\n <div *ngFor=\"let warn of warnings\"\n class=\"cqa-flex cqa-items-start cqa-gap-2 cqa-text-[12px] cqa-text-[#92400E]\">\n <span aria-hidden=\"true\">\u26A0</span>\n <span>{{ warn }}</span>\n </div>\n </div>\n\n <!-- Preview list (optional) -->\n <div *ngIf=\"previewItems?.length\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-rounded-[8px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-px-3 cqa-py-2 cqa-max-h-[100px] cqa-overflow-y-auto\">\n <div *ngFor=\"let item of previewItems; let i = index\"\n class=\"cqa-flex cqa-items-baseline cqa-gap-2 cqa-text-[12px] cqa-text-[#101828]\">\n <span class=\"cqa-text-[#4A5565] cqa-flex-shrink-0\">{{ i + 1 }}.</span>\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ item.primary }}</span>\n <span *ngIf=\"item.secondary\" class=\"cqa-text-[#4A5565]\">\u2014&nbsp;&nbsp;{{ item.secondary }}</span>\n </div>\n <div *ngIf=\"previewOverflowCount > 0\"\n class=\"cqa-text-[12px] cqa-text-[#4A5565] cqa-italic cqa-mt-1\">\n + {{ previewOverflowCount }} more step<span *ngIf=\"previewOverflowCount !== 1\">s</span>\n </div>\n </div>\n\n <mat-radio-group\n class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-radio-group\"\n [value]=\"selectedValue\"\n (change)=\"onRadioChange($event)\">\n <label\n *ngFor=\"let option of options\"\n class=\"cqa-radio-card-option qqa-m-0 cqa-flex cqa-items-start cqa-gap-1 cqa-cursor-pointer cqa-rounded-[10px] cqa-border cqa-border-solid cqa-p-4 cqa-transition-colors\"\n [ngClass]=\"isSelected(option)\n ? 'cqa-border-[#B1B2F8] cqa-bg-[#D8D9FC4D]'\n : 'cqa-border-[#E5E7EB] cqa-bg-white hover:cqa-border-[#6366f1]'\">\n <mat-radio-button [value]=\"option.value\" class=\"!cqa-pr-0 cqa-mt-[-2px]\"></mat-radio-button>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span\n class=\"cqa-text-[12px] cqa-font-bold\"\n [ngClass]=\"option.variant === 'danger' ? 'cqa-text-[#EE3F3F]' : 'cqa-text-[#364153]'\">\n {{ option.title }}\n </span>\n <span class=\"cqa-text-[12px] cqa-text-[#101828]\">\n {{ option.description }}\n </span>\n </div>\n </label>\n </mat-radio-group>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-px-6 cqa-py-4 cqa-bg-white\" style=\"gap: 24px;\">\n <div *ngIf=\"!hideCancel\" class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"cancelLabel\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1\" [style.width]=\"hideCancel ? '100%' : '50%'\">\n <cqa-button\n *ngIf=\"currentOption\"\n [variant]=\"currentOption.buttonVariant || 'filled'\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"currentOption.buttonLabel\"\n (clicked)=\"onConfirm()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69
140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SubStepsConfirmationDialogComponent, decorators: [{
70
141
  type: Component,
71
- args: [{ selector: 'cqa-sub-steps-confirmation-dialog', template: "<div *ngIf=\"isOpen\" class=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 9999;\">\n <div\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-[12px] cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[560px] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-max-h-[85vh] cqa-font-inter\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-px-6 cqa-py-4\" style=\"border-bottom: 1px solid #E5E5E5;\">\n <h2 class=\"cqa-text-[16px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n {{ title }}\n </h2>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-text-[#4A5565] hover:cqa-text-[#111827] cqa-bg-transparent cqa-border-0 cqa-cursor-pointer\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-h-5 cqa-w-5 cqa-text-[20px] cqa-leading-5\">close</mat-icon>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-px-6 cqa-py-3 cqa-overflow-y-auto\">\n <p *ngIf=\"description\"\n class=\"cqa-text-[12px] cqa-text-[#101828] cqa-m-0\">\n {{ description }}\n </p>\n\n <mat-radio-group\n class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-radio-group\"\n [value]=\"selectedValue\"\n (change)=\"onRadioChange($event)\">\n <label\n *ngFor=\"let option of options\"\n class=\"cqa-radio-card-option qqa-m-0 cqa-flex cqa-items-start cqa-gap-1 cqa-cursor-pointer cqa-rounded-[10px] cqa-border cqa-border-solid cqa-p-4 cqa-transition-colors\"\n [ngClass]=\"isSelected(option)\n ? 'cqa-border-[#B1B2F8] cqa-bg-[#D8D9FC4D]'\n : 'cqa-border-[#E5E7EB] cqa-bg-white hover:cqa-border-[#6366f1]'\">\n <mat-radio-button [value]=\"option.value\" class=\"!cqa-pr-0 cqa-mt-[-2px]\"></mat-radio-button>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span\n class=\"cqa-text-[12px] cqa-font-bold\"\n [ngClass]=\"option.variant === 'danger' ? 'cqa-text-[#EE3F3F]' : 'cqa-text-[#364153]'\">\n {{ option.title }}\n </span>\n <span class=\"cqa-text-[12px] cqa-text-[#101828]\">\n {{ option.description }}\n </span>\n </div>\n </label>\n </mat-radio-group>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-px-6 cqa-py-4 cqa-bg-white\" style=\"gap: 24px;\">\n <div class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"cancelLabel\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n *ngIf=\"currentOption\"\n [variant]=\"currentOption.buttonVariant || 'filled'\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"currentOption.buttonLabel\"\n (clicked)=\"onConfirm()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
72
- }], propDecorators: { isOpen: [{
73
- type: Input
74
- }], title: [{
75
- type: Input
76
- }], description: [{
142
+ args: [{ selector: 'cqa-sub-steps-confirmation-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"isOpen\" class=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 9999;\">\n <div\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-[9999] cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-[12px] cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[560px] cqa-overflow-hidden cqa-flex cqa-flex-col cqa-max-h-[85vh] cqa-font-inter\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-px-6 cqa-py-4\" style=\"border-bottom: 1px solid #E5E5E5;\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-w-0\">\n <h2 class=\"cqa-text-[16px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n {{ title }}\n </h2>\n <span *ngIf=\"subtitle\"\n class=\"cqa-text-[12px] cqa-text-[#4A5565] cqa-m-0\">\n {{ subtitle }}\n </span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-shrink-0\">\n <span *ngIf=\"showCountdown\"\n class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#4A5565] cqa-rounded cqa-px-2 cqa-py-0.5\"\n style=\"background: #F3F4F6;\"\n [title]=\"'Auto-discards when timer reaches 0'\">\n {{ countdownLabel }}\n </span>\n <button *ngIf=\"!hideCloseButton\" type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-text-[#4A5565] hover:cqa-text-[#111827] cqa-bg-transparent cqa-border-0 cqa-cursor-pointer\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-h-5 cqa-w-5 cqa-text-[20px] cqa-leading-5\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Body -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-px-6 cqa-py-3 cqa-overflow-y-auto\">\n <p *ngIf=\"description\"\n class=\"cqa-text-[12px] cqa-text-[#101828] cqa-m-0\">\n {{ description }}\n </p>\n\n <!-- Warnings (amber) -->\n <div *ngIf=\"warnings?.length\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-rounded-[8px] cqa-px-3 cqa-py-2\"\n style=\"background: #FEF3C7; border: 1px solid #FDE68A;\">\n <div *ngFor=\"let warn of warnings\"\n class=\"cqa-flex cqa-items-start cqa-gap-2 cqa-text-[12px] cqa-text-[#92400E]\">\n <span aria-hidden=\"true\">\u26A0</span>\n <span>{{ warn }}</span>\n </div>\n </div>\n\n <!-- Preview list (optional) -->\n <div *ngIf=\"previewItems?.length\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-rounded-[8px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-px-3 cqa-py-2 cqa-max-h-[100px] cqa-overflow-y-auto\">\n <div *ngFor=\"let item of previewItems; let i = index\"\n class=\"cqa-flex cqa-items-baseline cqa-gap-2 cqa-text-[12px] cqa-text-[#101828]\">\n <span class=\"cqa-text-[#4A5565] cqa-flex-shrink-0\">{{ i + 1 }}.</span>\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ item.primary }}</span>\n <span *ngIf=\"item.secondary\" class=\"cqa-text-[#4A5565]\">\u2014&nbsp;&nbsp;{{ item.secondary }}</span>\n </div>\n <div *ngIf=\"previewOverflowCount > 0\"\n class=\"cqa-text-[12px] cqa-text-[#4A5565] cqa-italic cqa-mt-1\">\n + {{ previewOverflowCount }} more step<span *ngIf=\"previewOverflowCount !== 1\">s</span>\n </div>\n </div>\n\n <mat-radio-group\n class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-radio-group\"\n [value]=\"selectedValue\"\n (change)=\"onRadioChange($event)\">\n <label\n *ngFor=\"let option of options\"\n class=\"cqa-radio-card-option qqa-m-0 cqa-flex cqa-items-start cqa-gap-1 cqa-cursor-pointer cqa-rounded-[10px] cqa-border cqa-border-solid cqa-p-4 cqa-transition-colors\"\n [ngClass]=\"isSelected(option)\n ? 'cqa-border-[#B1B2F8] cqa-bg-[#D8D9FC4D]'\n : 'cqa-border-[#E5E7EB] cqa-bg-white hover:cqa-border-[#6366f1]'\">\n <mat-radio-button [value]=\"option.value\" class=\"!cqa-pr-0 cqa-mt-[-2px]\"></mat-radio-button>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <span\n class=\"cqa-text-[12px] cqa-font-bold\"\n [ngClass]=\"option.variant === 'danger' ? 'cqa-text-[#EE3F3F]' : 'cqa-text-[#364153]'\">\n {{ option.title }}\n </span>\n <span class=\"cqa-text-[12px] cqa-text-[#101828]\">\n {{ option.description }}\n </span>\n </div>\n </label>\n </mat-radio-group>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-px-6 cqa-py-4 cqa-bg-white\" style=\"gap: 24px;\">\n <div *ngIf=\"!hideCancel\" class=\"cqa-flex-1\" style=\"width: 50%;\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"cancelLabel\"\n (clicked)=\"onClose()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1\" [style.width]=\"hideCancel ? '100%' : '50%'\">\n <cqa-button\n *ngIf=\"currentOption\"\n [variant]=\"currentOption.buttonVariant || 'filled'\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [text]=\"currentOption.buttonLabel\"\n (clicked)=\"onConfirm()\">\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [] }]
143
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { isOpen: [{
77
144
  type: Input
78
- }], options: [{
79
- type: Input
80
- }], selectedValue: [{
81
- type: Input
82
- }], cancelLabel: [{
83
- type: Input
84
- }], disableBackdropClose: [{
145
+ }], config: [{
85
146
  type: Input
86
147
  }], selectionChange: [{
87
148
  type: Output
@@ -89,5 +150,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
89
150
  type: Output
90
151
  }], closeModal: [{
91
152
  type: Output
153
+ }], timeoutExpired: [{
154
+ type: Output
92
155
  }] } });
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLXN0ZXBzLWNvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdWItc3RlcHMtY29uZmlybWF0aW9uLWRpYWxvZy9zdWItc3RlcHMtY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nL3N1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFxQmpHOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sbUNBQW1DO0lBTGhEO1FBTVcsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFVBQUssR0FBRyxtQ0FBbUMsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixZQUFPLEdBQWlDLEVBQUUsQ0FBQztRQUUzQyxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUN2Qix5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFNUIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBK0NqRDtJQTdDQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN2RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDNUM7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFrQztRQUMzQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM3QyxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQWtDO1FBQ3pDLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQXFCO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDdEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQTRCLENBQUM7UUFDekQsSUFBSSxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU87UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7O2dJQXpEVSxtQ0FBbUM7b0hBQW5DLG1DQUFtQyxxWUMvQmhELHU1R0ErRUE7MkZEaERhLG1DQUFtQztrQkFML0MsU0FBUzsrQkFDRSxtQ0FBbUM7OEJBS3BDLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFJhZGlvQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgU3ViU3RlcHNPcHRpb25WYXJpYW50ID0gJ2RlZmF1bHQnIHwgJ2Rhbmdlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViU3RlcHNDb25maXJtYXRpb25PcHRpb24ge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcHRpb24gKGVtaXR0ZWQgdmlhIGBzZWxlY3Rpb25DaGFuZ2VgIC8gYGNvbmZpcm1gKS4gKi9cbiAgdmFsdWU6IHN0cmluZztcbiAgLyoqIEJvbGQgdGl0bGUgc2hvd24gb24gdGhlIGNhcmQuICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBQYXJhZ3JhcGggc2hvd24gdW5kZXIgdGhlIHRpdGxlLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogYGRhbmdlcmAgcmVuZGVycyB0aGUgdGl0bGUgaW4gcmVkIHRvIGluZGljYXRlIGEgZGVzdHJ1Y3RpdmUgY2hvaWNlLiAqL1xuICB2YXJpYW50PzogU3ViU3RlcHNPcHRpb25WYXJpYW50O1xuICAvKiogTGFiZWwgZm9yIHRoZSBwcmltYXJ5IENUQSB3aGVuIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkLiAqL1xuICBidXR0b25MYWJlbDogc3RyaW5nO1xuICAvKiogVmFyaWFudCBmb3IgdGhlIHByaW1hcnkgQ1RBIHdoZW4gdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuIERlZmF1bHRzIHRvIGBmaWxsZWRgLiAqL1xuICBidXR0b25WYXJpYW50PzogQnV0dG9uVmFyaWFudDtcbn1cblxuLyoqXG4gKiBDb25maXJtYXRpb24gZGlhbG9nIHNob3duIGJlZm9yZSBlZGl0aW5nIGFuIEFJLUFnZW50IHN0ZXAgd2hvc2UgZXhlY3V0aW9uIGhhc1xuICogYWxyZWFkeSBnZW5lcmF0ZWQgc3ViLXN0ZXBzIChDT04tOTI2KS4gVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgb3B0aW9uIGxpc3RcbiAqIGFuZCBjb3B5OyB0aGlzIGNvbXBvbmVudCBvbmx5IHJlbmRlcnMgdGhlIFVJIGFuZCBlbWl0cyB0aGUgdXNlcidzIGNob2ljZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJTdGVwc0NvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlzT3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZSA9ICdUaGlzIHN0ZXAgaGFzIGdlbmVyYXRlZCBzdWItc3RlcHMnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuICBASW5wdXQoKSBvcHRpb25zOiBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGRpc2FibGVCYWNrZHJvcENsb3NlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29uZmlybSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ29wdGlvbnMnXSB8fCBjaGFuZ2VzWydzZWxlY3RlZFZhbHVlJ10gfHwgY2hhbmdlc1snaXNPcGVuJ10pIHtcbiAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy5vcHRpb25zPy5zb21lKG8gPT4gby52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFZhbHVlKTtcbiAgICAgIGlmICghdmFsaWQgJiYgdGhpcy5vcHRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5vcHRpb25zWzBdLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50T3B0aW9uKCk6IFN1YlN0ZXBzQ29uZmlybWF0aW9uT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zPy5maW5kKG8gPT4gby52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFZhbHVlKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQob3B0aW9uOiBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcbiAgfVxuXG4gIG9uU2VsZWN0KG9wdGlvbjogU3ViU3RlcHNDb25maXJtYXRpb25PcHRpb24pOiB2b2lkIHtcbiAgICBpZiAob3B0aW9uLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChvcHRpb24udmFsdWUpO1xuICB9XG5cbiAgb25SYWRpb0NoYW5nZShldmVudDogTWF0UmFkaW9DaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnM/LmZpbmQobyA9PiBvLnZhbHVlID09PSBldmVudC52YWx1ZSk7XG4gICAgaWYgKG9wdGlvbikgdGhpcy5vblNlbGVjdChvcHRpb24pO1xuICB9XG5cbiAgb25CYWNrZHJvcENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZUJhY2tkcm9wQ2xvc2UpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsLmVtaXQoKTtcbiAgfVxuXG4gIG9uQ29uZmlybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlybS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImNxYS11aS1yb290XCJcbiAgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IGluc2V0OiAwOyB6LWluZGV4OiA5OTk5O1wiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LVs5OTk5XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCJcbiAgICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKCRldmVudClcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNxYS1yb3VuZGVkLVsxMnB4XSBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy14bCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTYwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1tYXgtaC1bODV2aF0gY3FhLWZvbnQtaW50ZXJcIlxuICAgICAgc3R5bGU9XCJib3gtc2hhZG93OiAwcHggOHB4IDhweCAtNHB4ICMxMDE4MjgwODtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICA8IS0tIEhlYWRlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB4LTYgY3FhLXB5LTRcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTVFNUU1O1wiPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wXCI+XG4gICAgICAgIHt7IHRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaC02IGNxYS13LTYgY3FhLXJvdW5kZWQgY3FhLXRleHQtWyM0QTU1NjVdIGhvdmVyOmNxYS10ZXh0LVsjMTExODI3XSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLWgtNSBjcWEtdy01IGNxYS10ZXh0LVsyMHB4XSBjcWEtbGVhZGluZy01XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB4LTYgY3FhLXB5LTMgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgPHAgKm5nSWY9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMTAxODI4XSBjcWEtbS0wXCI+XG4gICAgICAgIHt7IGRlc2NyaXB0aW9uIH19XG4gICAgICA8L3A+XG5cbiAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1yYWRpby1ncm91cFwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1yYWRpby1jYXJkLW9wdGlvbiBxcWEtbS0wIGNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLXAtNCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzU2VsZWN0ZWQob3B0aW9uKVxuICAgICAgICAgICAgPyAnY3FhLWJvcmRlci1bI0IxQjJGOF0gY3FhLWJnLVsjRDhEOUZDNERdJ1xuICAgICAgICAgICAgOiAnY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1ib3JkZXItWyM2MzY2ZjFdJ1wiPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIiBjbGFzcz1cIiFjcWEtcHItMCBjcWEtbXQtWy0ycHhdXCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0aW9uLnZhcmlhbnQgPT09ICdkYW5nZXInID8gJ2NxYS10ZXh0LVsjRUUzRjNGXScgOiAnY3FhLXRleHQtWyMzNjQxNTNdJ1wiPlxuICAgICAgICAgICAgICB7eyBvcHRpb24udGl0bGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAgICB7eyBvcHRpb24uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb290ZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJnYXA6IDI0cHg7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMVwiIHN0eWxlPVwid2lkdGg6IDUwJTtcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbdGV4dF09XCJjYW5jZWxMYWJlbFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25DbG9zZSgpXCI+XG4gICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTFcIiBzdHlsZT1cIndpZHRoOiA1MCU7XCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJjdXJyZW50T3B0aW9uXCJcbiAgICAgICAgICBbdmFyaWFudF09XCJjdXJyZW50T3B0aW9uLmJ1dHRvblZhcmlhbnQgfHwgJ2ZpbGxlZCdcIlxuICAgICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICBbdGV4dF09XCJjdXJyZW50T3B0aW9uLmJ1dHRvbkxhYmVsXCJcbiAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNvbmZpcm0oKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLXN0ZXBzLWNvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdWItc3RlcHMtY29uZmlybWF0aW9uLWRpYWxvZy9zdWItc3RlcHMtY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nL3N1Yi1zdGVwcy1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUE2RHZCOzs7Ozs7OztHQVFHO0FBT0gsTUFBTSxPQUFPLG1DQUFtQztJQWdCOUMsWUFBNkIsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFmMUMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFdBQU0sR0FBcUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFMUQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3RDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUlwRCxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFFYixvQkFBZSxHQUEwQyxJQUFJLENBQUM7UUFDOUQsb0JBQWUsR0FBRyxLQUFLLENBQUM7SUFFc0IsQ0FBQztJQUV2RCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDLE1BQU0sT0FBTyxH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QixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDdkI7YUFDRjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQzs7Z0lBcklVLG1DQUFtQztvSEFBbkMsbUNBQW1DLCtRQ3RGaEQsK2dMQXVIQTsyRkRqQ2EsbUNBQW1DO2tCQU4vQyxTQUFTOytCQUNFLG1DQUFtQyxtQkFHNUIsdUJBQXVCLENBQUMsTUFBTTt3R0FHdEMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0UmFkaW9DaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBCdXR0b25WYXJpYW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBTdWJTdGVwc09wdGlvblZhcmlhbnQgPSAnZGVmYXVsdCcgfCAnZGFuZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbiB7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9wdGlvbiAoZW1pdHRlZCB2aWEgYHNlbGVjdGlvbkNoYW5nZWAgLyBgY29uZmlybWApLiAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiogQm9sZCB0aXRsZSBzaG93biBvbiB0aGUgY2FyZC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIFBhcmFncmFwaCBzaG93biB1bmRlciB0aGUgdGl0bGUuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBgZGFuZ2VyYCByZW5kZXJzIHRoZSB0aXRsZSBpbiByZWQgdG8gaW5kaWNhdGUgYSBkZXN0cnVjdGl2ZSBjaG9pY2UuICovXG4gIHZhcmlhbnQ/OiBTdWJTdGVwc09wdGlvblZhcmlhbnQ7XG4gIC8qKiBMYWJlbCBmb3IgdGhlIHByaW1hcnkgQ1RBIHdoZW4gdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuICovXG4gIGJ1dHRvbkxhYmVsOiBzdHJpbmc7XG4gIC8qKiBWYXJpYW50IGZvciB0aGUgcHJpbWFyeSBDVEEgd2hlbiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZC4gRGVmYXVsdHMgdG8gYGZpbGxlZGAuICovXG4gIGJ1dHRvblZhcmlhbnQ/OiBCdXR0b25WYXJpYW50O1xufVxuXG4vKiogU2luZ2xlIHJvdyByZW5kZXJlZCBpbiB0aGUgb3B0aW9uYWwgcHJldmlldyBsaXN0IGFib3ZlIHRoZSByYWRpbyBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ViU3RlcHNDb25maXJtYXRpb25QcmV2aWV3SXRlbSB7XG4gIC8qKiBCb2xkIHByaW1hcnkgdGV4dCAoZS5nLiBhY3Rpb24gbmFtZSkuICovXG4gIHByaW1hcnk6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIHNlY29uZGFyeSB0ZXh0IGFwcGVuZGVkIGFmdGVyIGFuIGVtLWRhc2ggKGUuZy4gZWxlbWVudCBsYWJlbCkuICovXG4gIHNlY29uZGFyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGdWxsIGNvbmZpZ3VyYXRpb24gcGF5bG9hZCBmb3IgdGhlIHN1Yi1zdGVwcyBjb25maXJtYXRpb24gZGlhbG9nLiBQYXNzIGEgbmV3XG4gKiBvYmplY3QgcmVmZXJlbmNlIHdoZW5ldmVyIHRoZSBjb250ZW50IHNob3VsZCBjaGFuZ2Ug4oCUIHRoZSBjb21wb25lbnQgdXNlc1xuICogYE9uUHVzaGAgY2hhbmdlIGRldGVjdGlvbiBhbmQgb25seSByZWFjdHMgdG8gcmVmZXJlbmNlIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ViU3RlcHNDb25maXJtYXRpb25EaWFsb2dDb25maWcge1xuICB0aXRsZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBzdWJ0aXRsZSBzaG93biB1bmRlciB0aGUgdGl0bGUgKGUuZy4gYWN0aW9uIHR5cGUgLyBwYXJlbnQgY29udGV4dCkuICovXG4gIHN1YnRpdGxlPzogc3RyaW5nO1xuICBvcHRpb25zOiBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbltdO1xuICBzZWxlY3RlZFZhbHVlPzogc3RyaW5nO1xuICBjYW5jZWxMYWJlbD86IHN0cmluZztcbiAgZGlzYWJsZUJhY2tkcm9wQ2xvc2U/OiBib29sZWFuO1xuICAvKiogSGlkZSB0aGUgdG9wLXJpZ2h0IGNsb3NlIChYKSBidXR0b24uICovXG4gIGhpZGVDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKiBIaWRlIHRoZSBDYW5jZWwgYnV0dG9uIGluIHRoZSBmb290ZXIuIENUQSBleHBhbmRzIHRvIGZ1bGwgd2lkdGggd2hlbiB0cnVlLiAqL1xuICBoaWRlQ2FuY2VsPzogYm9vbGVhbjtcbiAgLyoqIEFtYmVyIHdhcm5pbmdzIGxpc3QgcmVuZGVyZWQgYWJvdmUgdGhlIHJhZGlvIGdyb3VwLiAqL1xuICB3YXJuaW5ncz86IHN0cmluZ1tdO1xuICAvKiogT3B0aW9uYWwgbnVtYmVyZWQgcHJldmlldyBsaXN0IHJlbmRlcmVkIGJldHdlZW4gZGVzY3JpcHRpb24gYW5kIHJhZGlvIGdyb3VwLiAqL1xuICBwcmV2aWV3SXRlbXM/OiBTdWJTdGVwc0NvbmZpcm1hdGlvblByZXZpZXdJdGVtW107XG4gIC8qKiBJZiA+MCwgcmVuZGVyIGEgXCIrIE4gbW9yZVwiIHJvdyBhZnRlciB0aGUgcHJldmlldyBsaXN0LiAqL1xuICBwcmV2aWV3T3ZlcmZsb3dDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmID4wLCBzaG93IGFuIGBNOlNTYCBjb3VudGRvd24gaW4gdGhlIGhlYWRlci4gYHRpbWVvdXRFeHBpcmVkYCBmaXJlcyBvbmNlXG4gICAqIHdoZW4gdGhlIGNvdW50ZG93biByZWFjaGVzIDAuIENvdW50ZG93biByZXN0YXJ0cyB3aGVuZXZlciBgaXNPcGVuYCBmbGlwc1xuICAgKiB0byB0cnVlIG9yIGEgbmV3IGNvbmZpZyByZWZlcmVuY2UgaXMgcGFzc2VkIHdpdGggYSBkaWZmZXJlbnQgYHRpbWVvdXRTZWNvbmRzYC5cbiAgICovXG4gIHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpcm1hdGlvbiBkaWFsb2cgc2hvd24gYmVmb3JlIGVkaXRpbmcgYW4gQUktQWdlbnQgc3RlcCB3aG9zZSBleGVjdXRpb24gaGFzXG4gKiBhbHJlYWR5IGdlbmVyYXRlZCBzdWItc3RlcHMgKENPTi05MjYpLiBBbHNvIHVzZWQgYnkgQ09OLTExNjYgdG8gcmV2aWV3XG4gKiBBSS1nZW5lcmF0ZWQgc3RlcHMgYmVmb3JlIHBlcnNpc3RpbmcuXG4gKlxuICogVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgd2hvbGUgcGF5bG9hZCB2aWEgdGhlIGBjb25maWdgIGlucHV0IChvbmUgb2JqZWN0LCBvbmVcbiAqIHJlZmVyZW5jZSBjaGFuZ2UgPSBvbmUgcmUtcmVuZGVyKS4gYGlzT3BlbmAgc3RheXMgc2VwYXJhdGUgc28gb3Blbi9jbG9zZVxuICogdHJhbnNpdGlvbnMgZG9uJ3QgZm9yY2UgY2FsbGVycyB0byByZWJ1aWxkIHRoZSBwYXlsb2FkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc3ViLXN0ZXBzLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3ViLXN0ZXBzLWNvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3ViU3RlcHNDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGlzT3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb25maWc6IFN1YlN0ZXBzQ29uZmlybWF0aW9uRGlhbG9nQ29uZmlnID0geyBvcHRpb25zOiBbXSB9O1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNvbmZpcm0gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNsb3NlTW9kYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB0aW1lb3V0RXhwaXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogTG9jYWwgc2VsZWN0aW9uIHN0YXRlLiBTZWVkZWQgZnJvbSBgY29uZmlnLnNlbGVjdGVkVmFsdWVgIGFuZCB1c2VyLWRyaXZlbiB0aGVyZWFmdGVyLiAqL1xuICBzZWxlY3RlZFZhbHVlPzogc3RyaW5nO1xuICByZW1haW5pbmdTZWNvbmRzID0gMDtcblxuICBwcml2YXRlIF90aWNrSW50ZXJ2YWxJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3RpbWVvdXRFbWl0dGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10gfHwgY2hhbmdlc1snaXNPcGVuJ10pIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZz8ub3B0aW9ucyA/PyBbXTtcbiAgICAgIGNvbnN0IGluY29taW5nID0gdGhpcy5jb25maWc/LnNlbGVjdGVkVmFsdWU7XG4gICAgICBjb25zdCBzdGlsbFZhbGlkID0gb3B0aW9ucy5zb21lKG8gPT4gby52YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFZhbHVlKTtcbiAgICAgIGlmIChpbmNvbWluZyAhPSBudWxsICYmIG9wdGlvbnMuc29tZShvID0+IG8udmFsdWUgPT09IGluY29taW5nKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBpbmNvbWluZztcbiAgICAgIH0gZWxzZSBpZiAoIXN0aWxsVmFsaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gb3B0aW9ucy5sZW5ndGggPyBvcHRpb25zWzBdLnZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydpc09wZW4nXSB8fCBjaGFuZ2VzWydjb25maWcnXSkge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSB0aGlzLmNvbmZpZz8udGltZW91dFNlY29uZHM7XG4gICAgICBpZiAodGhpcy5pc09wZW4gJiYgdHlwZW9mIHRpbWVvdXRTZWNvbmRzID09PSAnbnVtYmVyJyAmJiB0aW1lb3V0U2Vjb25kcyA+IDApIHtcbiAgICAgICAgY29uc3QgcHJldlRpbWVvdXQgPSBjaGFuZ2VzWydjb25maWcnXVxuICAgICAgICAgID8gKGNoYW5nZXNbJ2NvbmZpZyddLnByZXZpb3VzVmFsdWUgYXMgU3ViU3RlcHNDb25maXJtYXRpb25EaWFsb2dDb25maWcgfCB1bmRlZmluZWQpPy50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBvcGVuaW5nID0gISFjaGFuZ2VzWydpc09wZW4nXSAmJiB0aGlzLmlzT3BlbjtcbiAgICAgICAgaWYgKG9wZW5pbmcgfHwgdGltZW91dFNlY29uZHMgIT09IHByZXZUaW1lb3V0IHx8IHRoaXMuX3RpY2tJbnRlcnZhbElkID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9zdGFydENvdW50ZG93bih0aW1lb3V0U2Vjb25kcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0b3BDb3VudGRvd24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdG9wQ291bnRkb3duKCk7XG4gIH1cblxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29uZmlnPy50aXRsZSA/PyAnVGhpcyBzdGVwIGhhcyBnZW5lcmF0ZWQgc3ViLXN0ZXBzJzsgfVxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29uZmlnPy5kZXNjcmlwdGlvbiA/PyAnJzsgfVxuICBnZXQgc3VidGl0bGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuY29uZmlnPy5zdWJ0aXRsZTsgfVxuICBnZXQgb3B0aW9ucygpOiBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbltdIHsgcmV0dXJuIHRoaXMuY29uZmlnPy5vcHRpb25zID8/IFtdOyB9XG4gIGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25maWc/LmNhbmNlbExhYmVsID8/ICdDYW5jZWwnOyB9XG4gIGdldCBkaXNhYmxlQmFja2Ryb3BDbG9zZSgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5jb25maWc/LmRpc2FibGVCYWNrZHJvcENsb3NlOyB9XG4gIGdldCBoaWRlQ2xvc2VCdXR0b24oKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuY29uZmlnPy5oaWRlQ2xvc2VCdXR0b247IH1cbiAgZ2V0IGhpZGVDYW5jZWwoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuY29uZmlnPy5oaWRlQ2FuY2VsOyB9XG4gIGdldCB3YXJuaW5ncygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNvbmZpZz8ud2FybmluZ3MgPz8gW107IH1cbiAgZ2V0IHByZXZpZXdJdGVtcygpOiBTdWJTdGVwc0NvbmZpcm1hdGlvblByZXZpZXdJdGVtW10geyByZXR1cm4gdGhpcy5jb25maWc/LnByZXZpZXdJdGVtcyA/PyBbXTsgfVxuICBnZXQgcHJldmlld092ZXJmbG93Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY29uZmlnPy5wcmV2aWV3T3ZlcmZsb3dDb3VudCA/PyAwOyB9XG5cbiAgZ2V0IGN1cnJlbnRPcHRpb24oKTogU3ViU3RlcHNDb25maXJtYXRpb25PcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd0NvdW50ZG93bigpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jb25maWc/LnRpbWVvdXRTZWNvbmRzO1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgdCA+IDA7XG4gIH1cblxuICBnZXQgY291bnRkb3duTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbCA9IE1hdGgubWF4KDAsIHRoaXMucmVtYWluaW5nU2Vjb25kcyk7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IodG90YWwgLyA2MCk7XG4gICAgY29uc3QgcyA9IHRvdGFsICUgNjA7XG4gICAgcmV0dXJuIGAke219OiR7cy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQob3B0aW9uOiBTdWJTdGVwc0NvbmZpcm1hdGlvbk9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZTtcbiAgfVxuXG4gIG9uU2VsZWN0KG9wdGlvbjogU3ViU3RlcHNDb25maXJtYXRpb25PcHRpb24pOiB2b2lkIHtcbiAgICBpZiAob3B0aW9uLnZhbHVlID09PSB0aGlzLnNlbGVjdGVkVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChvcHRpb24udmFsdWUpO1xuICB9XG5cbiAgb25SYWRpb0NoYW5nZShldmVudDogTWF0UmFkaW9DaGFuZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IGV2ZW50LnZhbHVlKTtcbiAgICBpZiAob3B0aW9uKSB0aGlzLm9uU2VsZWN0KG9wdGlvbik7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlQmFja2Ryb3BDbG9zZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpIHtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTW9kYWwuZW1pdCgpO1xuICB9XG5cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5jb25maXJtLmVtaXQodGhpcy5zZWxlY3RlZFZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXJ0Q291bnRkb3duKHNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3N0b3BDb3VudGRvd24oKTtcbiAgICB0aGlzLnJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzO1xuICAgIHRoaXMuX3RpbWVvdXRFbWl0dGVkID0gZmFsc2U7XG4gICAgdGhpcy5fdGlja0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZW1haW5pbmdTZWNvbmRzID4gMCkge1xuICAgICAgICB0aGlzLnJlbWFpbmluZ1NlY29uZHMtLTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZ1NlY29uZHMgPT09IDAgJiYgIXRoaXMuX3RpbWVvdXRFbWl0dGVkKSB7XG4gICAgICAgICAgdGhpcy5fdGltZW91dEVtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMudGltZW91dEV4cGlyZWQuZW1pdCgpO1xuICAgICAgICAgIHRoaXMuX3N0b3BDb3VudGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RvcENvdW50ZG93bigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdGlja0ludGVydmFsSWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fdGlja0ludGVydmFsSWQpO1xuICAgICAgdGhpcy5fdGlja0ludGVydmFsSWQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImlzT3BlblwiIGNsYXNzPVwiY3FhLXVpLXJvb3RcIlxuICBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZDsgaW5zZXQ6IDA7IHotaW5kZXg6IDk5OTk7XCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wIGNxYS1maXhlZCBjcWEtaW5zZXQtMCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLXotWzk5OTldIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIlxuICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQtWzEycHhdIGNxYS1iZy13aGl0ZSBjcWEtc2hhZG93LXhsIGNxYS13LWZ1bGwgY3FhLW1heC13LVs1NjBweF0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLW1heC1oLVs4NXZoXSBjcWEtZm9udC1pbnRlclwiXG4gICAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4O1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDwhLS0gSGVhZGVyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNiBjcWEtcHktNFwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNFNUU1RTU7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1bMTZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICB7eyB0aXRsZSB9fVxuICAgICAgICA8L2gyPlxuICAgICAgICA8c3BhbiAqbmdJZj1cInN1YnRpdGxlXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW0tMFwiPlxuICAgICAgICAgIHt7IHN1YnRpdGxlIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50ZG93blwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtcm91bmRlZCBjcWEtcHgtMiBjcWEtcHktMC41XCJcbiAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICNGM0Y0RjY7XCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ0F1dG8tZGlzY2FyZHMgd2hlbiB0aW1lciByZWFjaGVzIDAnXCI+XG4gICAgICAgICAge3sgY291bnRkb3duTGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGVDbG9zZUJ1dHRvblwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWgtNiBjcWEtdy02IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNEE1NTY1XSBob3ZlcjpjcWEtdGV4dC1bIzExMTgyN10gY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1oLTUgY3FhLXctNSBjcWEtdGV4dC1bMjBweF0gY3FhLWxlYWRpbmctNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQm9keSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtcHgtNiBjcWEtcHktMyBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICA8cCAqbmdJZj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyMxMDE4MjhdIGNxYS1tLTBcIj5cbiAgICAgICAge3sgZGVzY3JpcHRpb24gfX1cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBXYXJuaW5ncyAoYW1iZXIpIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIndhcm5pbmdzPy5sZW5ndGhcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLXJvdW5kZWQtWzhweF0gY3FhLXB4LTMgY3FhLXB5LTJcIlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICNGRUYzQzc7IGJvcmRlcjogMXB4IHNvbGlkICNGREU2OEE7XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdhcm4gb2Ygd2FybmluZ3NcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1nYXAtMiBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM5MjQwMEVdXCI+XG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+4pqgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IHdhcm4gfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUHJldmlldyBsaXN0IChvcHRpb25hbCkgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwicHJldmlld0l0ZW1zPy5sZW5ndGhcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEgY3FhLXJvdW5kZWQtWzhweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1weC0zIGNxYS1weS0yIGNxYS1tYXgtaC1bMTAwcHhdIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcmV2aWV3SXRlbXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWJhc2VsaW5lIGNxYS1nYXAtMiBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLWZsZXgtc2hyaW5rLTBcIj57eyBpICsgMSB9fS48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj57eyBpdGVtLnByaW1hcnkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnNlY29uZGFyeVwiIGNsYXNzPVwiY3FhLXRleHQtWyM0QTU1NjVdXCI+4oCUJm5ic3A7Jm5ic3A7e3sgaXRlbS5zZWNvbmRhcnkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwicHJldmlld092ZXJmbG93Q291bnQgPiAwXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLWl0YWxpYyBjcWEtbXQtMVwiPlxuICAgICAgICAgICsge3sgcHJldmlld092ZXJmbG93Q291bnQgfX0gbW9yZSBzdGVwPHNwYW4gKm5nSWY9XCJwcmV2aWV3T3ZlcmZsb3dDb3VudCAhPT0gMVwiPnM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1yYWRpby1ncm91cFwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1yYWRpby1jYXJkLW9wdGlvbiBxcWEtbS0wIGNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtZ2FwLTEgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLXAtNCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzU2VsZWN0ZWQob3B0aW9uKVxuICAgICAgICAgICAgPyAnY3FhLWJvcmRlci1bI0IxQjJGOF0gY3FhLWJnLVsjRDhEOUZDNERdJ1xuICAgICAgICAgICAgOiAnY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1ib3JkZXItWyM2MzY2ZjFdJ1wiPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIiBjbGFzcz1cIiFjcWEtcHItMCBjcWEtbXQtWy0ycHhdXCI+PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0aW9uLnZhcmlhbnQgPT09ICdkYW5nZXInID8gJ2NxYS10ZXh0LVsjRUUzRjNGXScgOiAnY3FhLXRleHQtWyMzNjQxNTNdJ1wiPlxuICAgICAgICAgICAgICB7eyBvcHRpb24udGl0bGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAgICB7eyBvcHRpb24uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb290ZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWJnLXdoaXRlXCIgc3R5bGU9XCJnYXA6IDI0cHg7XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVDYW5jZWxcIiBjbGFzcz1cImNxYS1mbGV4LTFcIiBzdHlsZT1cIndpZHRoOiA1MCU7XCI+XG4gICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICBidG5TaXplPVwibGdcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW3RleHRdPVwiY2FuY2VsTGFiZWxcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xXCIgW3N0eWxlLndpZHRoXT1cImhpZGVDYW5jZWwgPyAnMTAwJScgOiAnNTAlJ1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiY3VycmVudE9wdGlvblwiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiY3VycmVudE9wdGlvbi5idXR0b25WYXJpYW50IHx8ICdmaWxsZWQnXCJcbiAgICAgICAgICBidG5TaXplPVwibGdcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW3RleHRdPVwiY3VycmVudE9wdGlvbi5idXR0b25MYWJlbFwiXG4gICAgICAgICAgKGNsaWNrZWQpPVwib25Db25maXJtKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=