@cqa-lib/cqa-ui 1.1.503 → 1.1.504

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.
@@ -5,15 +5,14 @@ import * as i2 from "@angular/common";
5
5
  /**
6
6
  * Dual-mode card summarising the API mocking configuration of a test case.
7
7
  *
8
- * The card surfaces **one boolean choice** — `restoreMock` as two mutually-exclusive rows
9
- * labelled "Capture API responses" and "Renew API responses":
8
+ * The card surfaces TWO independent flags — `restoreMock` (the "Use mock API responses" row)
9
+ * and `storeMock` (the "Renew and store API responses" row). Both can be off simultaneously
10
+ * (no mocking on the next run); turning either one on forces the other off (they're mutually
11
+ * exclusive in the on-state). Both can never be on at the same time.
10
12
  *
11
- * restoreMock === true → Renew = ON, Capture = OFF
12
- * restoreMock === false → Renew = OFF, Capture = ON
13
- *
14
- * In read-only mode both rows show a value text ("On"/"Off") derived from `restoreMock`.
15
- * In edit mode both rows render a toggle; interacting with either one flips `restoreMock`
16
- * and the card emits `restoreMockChange` so the parent can persist the new value.
13
+ * In read-only mode each row shows On/Off derived from its own flag. In edit mode each row
14
+ * renders a toggle; the card emits `restoreMockChange` and `storeMockChange` whenever a value
15
+ * actually changes so the parent can persist them.
17
16
  */
18
17
  export class ApiMockingCardComponent {
19
18
  constructor() {
@@ -23,11 +22,10 @@ export class ApiMockingCardComponent {
23
22
  this.captureHint = 'Uses stored responses on next run. Turn on after capture completes.';
24
23
  this.renewLabel = 'Renew and store API responses';
25
24
  this.renewHint = 'Re-captures fresh responses on next run. Turns off Use mock.';
26
- /**
27
- * Single source of truth for the card's dual-toggle state.
28
- * Defaults to `false` → Capture is ON, Renew is OFF.
29
- */
25
+ /** "Use mock API responses" row state. Mutually exclusive with `storeMock` when true. */
30
26
  this.restoreMock = false;
27
+ /** "Renew and store API responses" row state. Mutually exclusive with `restoreMock` when true. */
28
+ this.storeMock = false;
31
29
  this.mockedApisCount = 0;
32
30
  this.totalApisCount = 0;
33
31
  this.progressPercent = 0;
@@ -42,18 +40,16 @@ export class ApiMockingCardComponent {
42
40
  /** Hint shown in read-only mode when no mock data exists yet (`showProgress` is false). */
43
41
  this.noDataHint = 'Run this test once to capture API responses first.';
44
42
  this.configure = new EventEmitter();
45
- /**
46
- * Emitted whenever the effective `restoreMock` value changes (either row's toggle was
47
- * interacted with in edit mode). Parent components should persist this value — e.g. under
48
- * `testCase.mockApiSettings.restoreMock`.
49
- */
43
+ /** Emitted whenever `restoreMock` changes (Use-mock row toggled). */
50
44
  this.restoreMockChange = new EventEmitter();
45
+ /** Emitted whenever `storeMock` changes (Renew-and-store row toggled). */
46
+ this.storeMockChange = new EventEmitter();
51
47
  }
52
- // Derived per-row state (template binds these directly so the two rows stay in lock-step).
53
- get renewEnabled() { return this.restoreMock; }
54
- get captureEnabled() { return !this.restoreMock; }
55
- get renewValueText() { return this.restoreMock ? 'On' : 'Off'; }
56
- get captureValueText() { return this.restoreMock ? 'Off' : 'On'; }
48
+ // Per-row derived display state each row reflects its own flag now.
49
+ get captureEnabled() { return this.restoreMock; }
50
+ get renewEnabled() { return this.storeMock; }
51
+ get captureValueText() { return this.restoreMock ? 'On' : 'Off'; }
52
+ get renewValueText() { return this.storeMock ? 'On' : 'Off'; }
57
53
  get computedSummaryText() {
58
54
  if (this.summaryText)
59
55
  return this.summaryText;
@@ -72,20 +68,22 @@ export class ApiMockingCardComponent {
72
68
  this.configure.emit();
73
69
  }
74
70
  /**
75
- * User interacted with the "Renew API responses" toggle in edit mode.
76
- * Renew ON → restoreMock = true (Capture OFF).
77
- * Renew OFF → restoreMock = false (Capture ON — mutual exclusivity).
71
+ * "Use mock API responses" toggle. Turning it on forces `storeMock` off (mutual exclusivity);
72
+ * turning it off leaves the other row alone.
78
73
  */
79
- onRenewToggle(value) {
74
+ onCaptureToggle(value) {
75
+ if (value && this.storeMock)
76
+ this.setStoreMock(false);
80
77
  this.setRestoreMock(value);
81
78
  }
82
79
  /**
83
- * User interacted with the "Capture API responses" toggle in edit mode.
84
- * Capture ON → restoreMock = false (Renew OFF).
85
- * Capture OFF → restoreMock = true (Renew ON — mutual exclusivity).
80
+ * "Renew and store API responses" toggle. Turning it on forces `restoreMock` off; turning
81
+ * it off leaves the other row alone.
86
82
  */
87
- onCaptureToggle(value) {
88
- this.setRestoreMock(!value);
83
+ onRenewToggle(value) {
84
+ if (value && this.restoreMock)
85
+ this.setRestoreMock(false);
86
+ this.setStoreMock(value);
89
87
  }
90
88
  setRestoreMock(next) {
91
89
  if (this.restoreMock === next)
@@ -93,9 +91,15 @@ export class ApiMockingCardComponent {
93
91
  this.restoreMock = next;
94
92
  this.restoreMockChange.emit(next);
95
93
  }
94
+ setStoreMock(next) {
95
+ if (this.storeMock === next)
96
+ return;
97
+ this.storeMock = next;
98
+ this.storeMockChange.emit(next);
99
+ }
96
100
  }
97
101
  ApiMockingCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
98
- ApiMockingCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: { title: "title", statusLabel: "statusLabel", captureLabel: "captureLabel", captureHint: "captureHint", renewLabel: "renewLabel", renewHint: "renewHint", restoreMock: "restoreMock", mockedApisCount: "mockedApisCount", totalApisCount: "totalApisCount", progressPercent: "progressPercent", summaryText: "summaryText", percentText: "percentText", configureButtonLabel: "configureButtonLabel", editing: "editing", showProgress: "showProgress", noDataHint: "noDataHint" }, outputs: { configure: "configure", restoreMockChange: "restoreMockChange" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"!showProgress &&statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles with hint text -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n </div>\n <p *ngIf=\"captureHint\" class=\"cqa-amc-edit-hint\">{{ captureHint }}</p>\n </div>\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n </div>\n <p *ngIf=\"renewHint\" class=\"cqa-amc-edit-hint\">{{ renewHint }}</p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <!-- Hint: no mock data yet \u2014 nudge the user to run the test first -->\n <p *ngIf=\"!showProgress && !editing\" class=\"cqa-amc-no-data-hint\">{{ noDataHint }}</p>\n\n <button\n *ngIf=\"!editing\"\n [disabled]=\"!showProgress\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", components: [{ type: i1.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
102
+ ApiMockingCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: { title: "title", statusLabel: "statusLabel", captureLabel: "captureLabel", captureHint: "captureHint", renewLabel: "renewLabel", renewHint: "renewHint", restoreMock: "restoreMock", storeMock: "storeMock", mockedApisCount: "mockedApisCount", totalApisCount: "totalApisCount", progressPercent: "progressPercent", summaryText: "summaryText", percentText: "percentText", configureButtonLabel: "configureButtonLabel", editing: "editing", showProgress: "showProgress", noDataHint: "noDataHint" }, outputs: { configure: "configure", restoreMockChange: "restoreMockChange", storeMockChange: "storeMockChange" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"!showProgress &&statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles with hint text -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n </div>\n <p *ngIf=\"captureHint\" class=\"cqa-amc-edit-hint\">{{ captureHint }}</p>\n </div>\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n </div>\n <p *ngIf=\"renewHint\" class=\"cqa-amc-edit-hint\">{{ renewHint }}</p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <!-- Hint: no mock data yet \u2014 nudge the user to run the test first -->\n <p *ngIf=\"!showProgress && !editing\" class=\"cqa-amc-no-data-hint\">{{ noDataHint }}</p>\n\n <button\n *ngIf=\"!editing\"\n [disabled]=\"!showProgress\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", components: [{ type: i1.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
99
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, decorators: [{
100
104
  type: Component,
101
105
  args: [{ selector: 'cqa-api-mocking-card', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"!showProgress &&statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles with hint text -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n </div>\n <p *ngIf=\"captureHint\" class=\"cqa-amc-edit-hint\">{{ captureHint }}</p>\n </div>\n <div class=\"cqa-amc-edit-block\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n </div>\n <p *ngIf=\"renewHint\" class=\"cqa-amc-edit-hint\">{{ renewHint }}</p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <!-- Hint: no mock data yet \u2014 nudge the user to run the test first -->\n <p *ngIf=\"!showProgress && !editing\" class=\"cqa-amc-no-data-hint\">{{ noDataHint }}</p>\n\n <button\n *ngIf=\"!editing\"\n [disabled]=\"!showProgress\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", styles: [] }]
@@ -113,6 +117,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
113
117
  type: Input
114
118
  }], restoreMock: [{
115
119
  type: Input
120
+ }], storeMock: [{
121
+ type: Input
116
122
  }], mockedApisCount: [{
117
123
  type: Input
118
124
  }], totalApisCount: [{
@@ -135,5 +141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
135
141
  type: Output
136
142
  }], restoreMockChange: [{
137
143
  type: Output
144
+ }], storeMockChange: [{
145
+ type: Output
138
146
  }] } });
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBWWhHOzs7Ozs7Ozs7Ozs7R0FZRztBQVVILE1BQU0sT0FBTyx1QkFBdUI7SUFUcEM7UUFVVyxVQUFLLEdBQVcsYUFBYSxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsZ0JBQWdCLENBQUM7UUFFdkMsaUJBQVksR0FBVyx3QkFBd0IsQ0FBQztRQUNoRCxnQkFBVyxHQUFXLHFFQUFxRSxDQUFDO1FBQzVGLGVBQVUsR0FBVywrQkFBK0IsQ0FBQztRQUNyRCxjQUFTLEdBQVcsOERBQThELENBQUM7UUFFNUY7OztXQUdHO1FBQ00sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFLNUIseUJBQW9CLEdBQVcscUJBQXFCLENBQUM7UUFDckQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVsQzs7OztXQUlHO1FBQ00saUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkMsMkZBQTJGO1FBQ2xGLGVBQVUsR0FBVyxvREFBb0QsQ0FBQztRQUV6RSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMvQzs7OztXQUlH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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIExlZ2FjeSB0b2dnbGUtY2hhbmdlIHBheWxvYWQga2VwdCBmb3IgYmFjay1jb21wYXQgd2l0aCBjb25zdW1lcnMgdGhhdCBoYXZlbid0IG1pZ3JhdGVkXG4gKiB0byBgcmVzdG9yZU1vY2tDaGFuZ2VgIHlldC4gYGtleWAgaWRlbnRpZmllcyB3aGljaCByb3cgd2FzIHRvZ2dsZWQ7IGB2YWx1ZWAgaXMgdGhlIG5ld1xuICogY2hlY2tlZCBzdGF0ZSBvZiB0aGF0IHJvdy4gTmV3IGNvZGUgc2hvdWxkIGxpc3RlbiB0byBgcmVzdG9yZU1vY2tDaGFuZ2VgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpTW9ja2luZ0NhcmRUb2dnbGVDaGFuZ2Uge1xuICBrZXk6ICdjYXB0dXJlQXBpUmVzcG9uc2VzJyB8ICdyZW5ld0FwaVJlc3BvbnNlcyc7XG4gIHZhbHVlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIER1YWwtbW9kZSBjYXJkIHN1bW1hcmlzaW5nIHRoZSBBUEkgbW9ja2luZyBjb25maWd1cmF0aW9uIG9mIGEgdGVzdCBjYXNlLlxuICpcbiAqIFRoZSBjYXJkIHN1cmZhY2VzICoqb25lIGJvb2xlYW4gY2hvaWNlKiog4oCUIGByZXN0b3JlTW9ja2Ag4oCUIGFzIHR3byBtdXR1YWxseS1leGNsdXNpdmUgcm93c1xuICogbGFiZWxsZWQgXCJDYXB0dXJlIEFQSSByZXNwb25zZXNcIiBhbmQgXCJSZW5ldyBBUEkgcmVzcG9uc2VzXCI6XG4gKlxuICogICByZXN0b3JlTW9jayA9PT0gdHJ1ZSAgIOKGkiAgIFJlbmV3ID0gT04sICBDYXB0dXJlID0gT0ZGXG4gKiAgIHJlc3RvcmVNb2NrID09PSBmYWxzZSAg4oaSICAgUmVuZXcgPSBPRkYsIENhcHR1cmUgPSBPTlxuICpcbiAqIEluIHJlYWQtb25seSBtb2RlIGJvdGggcm93cyBzaG93IGEgdmFsdWUgdGV4dCAoXCJPblwiL1wiT2ZmXCIpIGRlcml2ZWQgZnJvbSBgcmVzdG9yZU1vY2tgLlxuICogSW4gZWRpdCBtb2RlIGJvdGggcm93cyByZW5kZXIgYSB0b2dnbGU7IGludGVyYWN0aW5nIHdpdGggZWl0aGVyIG9uZSBmbGlwcyBgcmVzdG9yZU1vY2tgXG4gKiBhbmQgdGhlIGNhcmQgZW1pdHMgYHJlc3RvcmVNb2NrQ2hhbmdlYCBzbyB0aGUgcGFyZW50IGNhbiBwZXJzaXN0IHRoZSBuZXcgdmFsdWUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1hcGktbW9ja2luZy1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwaS1tb2NraW5nLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICAvLyBTdHlsZXMgbGl2ZSBpbiBzcmMvbGliL3N0eWxlcy90YWlsd2luZC5jc3MgKHRoZSBsaWIgc2hpcHMgYSBzaW5nbGUgY29tcGlsZWQgc3R5bGVzaGVldCk7XG4gIC8vIHBlci1jb21wb25lbnQgLnNjc3MgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIG5nLXBhY2thZ3IgYnVpbGQgZm9yIHRoaXMgbGliLlxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcGlNb2NraW5nQ2FyZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSAnQVBJIE1vY2tpbmcnO1xuICBASW5wdXQoKSBzdGF0dXNMYWJlbDogc3RyaW5nID0gJ05vdCBjb25maWd1cmVkJztcblxuICBASW5wdXQoKSBjYXB0dXJlTGFiZWw6IHN0cmluZyA9ICdVc2UgbW9jayBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgY2FwdHVyZUhpbnQ6IHN0cmluZyA9ICdVc2VzIHN0b3JlZCByZXNwb25zZXMgb24gbmV4dCBydW4uIFR1cm4gb24gYWZ0ZXIgY2FwdHVyZSBjb21wbGV0ZXMuJztcbiAgQElucHV0KCkgcmVuZXdMYWJlbDogc3RyaW5nID0gJ1JlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgcmVuZXdIaW50OiBzdHJpbmcgPSAnUmUtY2FwdHVyZXMgZnJlc2ggcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJucyBvZmYgVXNlIG1vY2suJztcblxuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsLXRvZ2dsZSBzdGF0ZS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCDihpIgQ2FwdHVyZSBpcyBPTiwgUmVuZXcgaXMgT0ZGLlxuICAgKi9cbiAgQElucHV0KCkgcmVzdG9yZU1vY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBtb2NrZWRBcGlzQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsQXBpc0NvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQ6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgc3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBlcmNlbnRUZXh0Pzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbmZpZ3VyZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnQ29uZmlndXJlIE1vY2sgQVBJcyc7XG4gIEBJbnB1dCgpIGVkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgXCJNb2NrZWQgWCBvZiBZIC8gcHJvZ3Jlc3MgYmFyIC8gcGVyY2VudFwiIGJsb2NrIGlzIHNob3duLlxuICAgKiBIaWRkZW4gd2hlbiB0aGUgdGVzdCBjYXNlIGhhcyBubyBjYXB0dXJlZCBtb2NrIHN1bW1hcnkgeWV0IChhbmQgYWx3YXlzIGhpZGRlbiBpblxuICAgKiBlZGl0IG1vZGUgcmVnYXJkbGVzcyBvZiB0aGlzIGZsYWcpLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1Byb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEhpbnQgc2hvd24gaW4gcmVhZC1vbmx5IG1vZGUgd2hlbiBubyBtb2NrIGRhdGEgZXhpc3RzIHlldCAoYHNob3dQcm9ncmVzc2AgaXMgZmFsc2UpLiAqL1xuICBASW5wdXQoKSBub0RhdGFIaW50OiBzdHJpbmcgPSAnUnVuIHRoaXMgdGVzdCBvbmNlIHRvIGNhcHR1cmUgQVBJIHJlc3BvbnNlcyBmaXJzdC4nO1xuXG4gIEBPdXRwdXQoKSBjb25maWd1cmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgYHJlc3RvcmVNb2NrYCB2YWx1ZSBjaGFuZ2VzIChlaXRoZXIgcm93J3MgdG9nZ2xlIHdhc1xuICAgKiBpbnRlcmFjdGVkIHdpdGggaW4gZWRpdCBtb2RlKS4gUGFyZW50IGNvbXBvbmVudHMgc2hvdWxkIHBlcnNpc3QgdGhpcyB2YWx1ZSDigJQgZS5nLiB1bmRlclxuICAgKiBgdGVzdENhc2UubW9ja0FwaVNldHRpbmdzLnJlc3RvcmVNb2NrYC5cbiAgICovXG4gIEBPdXRwdXQoKSByZXN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyBEZXJpdmVkIHBlci1yb3cgc3RhdGUgKHRlbXBsYXRlIGJpbmRzIHRoZXNlIGRpcmVjdGx5IHNvIHRoZSB0d28gcm93cyBzdGF5IGluIGxvY2stc3RlcCkuXG4gIGdldCByZW5ld0VuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlc3RvcmVNb2NrOyB9XG4gIGdldCBjYXB0dXJlRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLnJlc3RvcmVNb2NrOyB9XG4gIGdldCByZW5ld1ZhbHVlVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jayA/ICdPbicgOiAnT2ZmJzsgfVxuICBnZXQgY2FwdHVyZVZhbHVlVGV4dCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jayA/ICdPZmYnIDogJ09uJzsgfVxuXG4gIGdldCBjb21wdXRlZFN1bW1hcnlUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3VtbWFyeVRleHQpIHJldHVybiB0aGlzLnN1bW1hcnlUZXh0O1xuICAgIHJldHVybiBgJHt0aGlzLm1vY2tlZEFwaXNDb3VudH0gb2YgJHt0aGlzLnRvdGFsQXBpc0NvdW50fSBBUElzIHNldCB0byBtb2NrYDtcbiAgfVxuXG4gIGdldCBjb21wdXRlZFBlcmNlbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucGVyY2VudFRleHQpIHJldHVybiB0aGlzLnBlcmNlbnRUZXh0O1xuICAgIHJldHVybiBgJHt0aGlzLnByb2dyZXNzUGVyY2VudH0lIG9mIGNhbGxzIHdpbGwgdXNlIG1vY2sgcmVzcG9uc2VzYDtcbiAgfVxuXG4gIGdldCBwcm9ncmVzc1dpZHRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgTnVtYmVyKHRoaXMucHJvZ3Jlc3NQZXJjZW50KSB8fCAwKSk7XG4gICAgcmV0dXJuIGAke2NsYW1wZWR9JWA7XG4gIH1cblxuICBvbkNvbmZpZ3VyZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyIGludGVyYWN0ZWQgd2l0aCB0aGUgXCJSZW5ldyBBUEkgcmVzcG9uc2VzXCIgdG9nZ2xlIGluIGVkaXQgbW9kZS5cbiAgICogUmVuZXcgT04gIOKGkiByZXN0b3JlTW9jayA9IHRydWUgIChDYXB0dXJlIE9GRikuXG4gICAqIFJlbmV3IE9GRiDihpIgcmVzdG9yZU1vY2sgPSBmYWxzZSAoQ2FwdHVyZSBPTiDigJQgbXV0dWFsIGV4Y2x1c2l2aXR5KS5cbiAgICovXG4gIG9uUmVuZXdUb2dnbGUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldFJlc3RvcmVNb2NrKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VyIGludGVyYWN0ZWQgd2l0aCB0aGUgXCJDYXB0dXJlIEFQSSByZXNwb25zZXNcIiB0b2dnbGUgaW4gZWRpdCBtb2RlLlxuICAgKiBDYXB0dXJlIE9OICDihpIgcmVzdG9yZU1vY2sgPSBmYWxzZSAoUmVuZXcgT0ZGKS5cbiAgICogQ2FwdHVyZSBPRkYg4oaSIHJlc3RvcmVNb2NrID0gdHJ1ZSAgKFJlbmV3IE9OIOKAlCBtdXR1YWwgZXhjbHVzaXZpdHkpLlxuICAgKi9cbiAgb25DYXB0dXJlVG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZXRSZXN0b3JlTW9jayghdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXN0b3JlTW9jayhuZXh0OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzdG9yZU1vY2sgPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLnJlc3RvcmVNb2NrID0gbmV4dDtcbiAgICB0aGlzLnJlc3RvcmVNb2NrQ2hhbmdlLmVtaXQobmV4dCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtYW1jLWNhcmRcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1hbWMtaGVhZGVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXRpdGxlXCI+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXN0YXR1c1wiICpuZ0lmPVwiIXNob3dQcm9ncmVzcyAmJnN0YXR1c0xhYmVsXCI+e3sgc3RhdHVzTGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUmVhZC1vbmx5IHJvd3MgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgY2FwdHVyZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXZhbHVlXCI+e3sgY2FwdHVyZVZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IHJlbmV3TGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtdmFsdWVcIj57eyByZW5ld1ZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBFZGl0IHJvd3M6IHRvZ2dsZXMgd2l0aCBoaW50IHRleHQgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtZWRpdC1ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcm93IGNxYS1hbWMtcm93LS1lZGl0XCI+XG4gICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICAgIFtjaGVja2VkXT1cImNhcHR1cmVFbmFibGVkXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cImNhcHR1cmVMYWJlbFwiXG4gICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25DYXB0dXJlVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgY2FwdHVyZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCAqbmdJZj1cImNhcHR1cmVIaW50XCIgY2xhc3M9XCJjcWEtYW1jLWVkaXQtaGludFwiPnt7IGNhcHR1cmVIaW50IH19PC9wPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWVkaXQtYmxvY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvdyBjcWEtYW1jLXJvdy0tZWRpdFwiPlxuICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICBbY2hlY2tlZF09XCJyZW5ld0VuYWJsZWRcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwicmVuZXdMYWJlbFwiXG4gICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25SZW5ld1RvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IHJlbmV3TGFiZWwgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwICpuZ0lmPVwicmVuZXdIaW50XCIgY2xhc3M9XCJjcWEtYW1jLWVkaXQtaGludFwiPnt7IHJlbmV3SGludCB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dQcm9ncmVzcyAmJiAhZWRpdGluZ1wiPlxuICAgIDxwIGNsYXNzPVwiY3FhLWFtYy1zdW1tYXJ5XCI+e3sgY29tcHV0ZWRTdW1tYXJ5VGV4dCB9fTwvcD5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1wcm9ncmVzcy10cmFja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aF09XCJwcm9ncmVzc1dpZHRoXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHAgY2xhc3M9XCJjcWEtYW1jLXBlcmNlbnRcIj57eyBjb21wdXRlZFBlcmNlbnRUZXh0IH19PC9wPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEhpbnQ6IG5vIG1vY2sgZGF0YSB5ZXQg4oCUIG51ZGdlIHRoZSB1c2VyIHRvIHJ1biB0aGUgdGVzdCBmaXJzdCAtLT5cbiAgPHAgKm5nSWY9XCIhc2hvd1Byb2dyZXNzICYmICFlZGl0aW5nXCIgY2xhc3M9XCJjcWEtYW1jLW5vLWRhdGEtaGludFwiPnt7IG5vRGF0YUhpbnQgfX08L3A+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgIFtkaXNhYmxlZF09XCIhc2hvd1Byb2dyZXNzXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImNxYS1hbWMtY29uZmlndXJlLWJ0blwiXG4gICAgKGNsaWNrKT1cIm9uQ29uZmlndXJlQ2xpY2soKVwiPlxuICAgIHt7IGNvbmZpZ3VyZUJ1dHRvbkxhYmVsIH19XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBWWhHOzs7Ozs7Ozs7OztHQVdHO0FBVUgsTUFBTSxPQUFPLHVCQUF1QjtJQVRwQztRQVVXLFVBQUssR0FBVyxhQUFhLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxnQkFBZ0IsQ0FBQztRQUV2QyxpQkFBWSxHQUFXLHdCQUF3QixDQUFDO1FBQ2hELGdCQUFXLEdBQVcscUVBQXFFLENBQUM7UUFDNUYsZUFBVSxHQUFXLCtCQUErQixDQUFDO1FBQ3JELGNBQVMsR0FBVyw4REFBOEQsQ0FBQztRQUU1Rix5RkFBeUY7UUFDaEYsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDdEMsa0dBQWtHO1FBQ3pGLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFLNUIseUJBQW9CLEdBQVcscUJBQXFCLENBQUM7UUFDckQsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVsQzs7OztXQUlHO1FBQ00saUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkMsMkZBQTJGO1FBQ2xGLGVBQVUsR0FBVyxvREFBb0QsQ0FBQztRQUV6RSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMvQyxxRUFBcUU7UUFDM0Qsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUMxRCwwRUFBMEU7UUFDaEUsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0tBd0R6RDtJQXREQyxzRUFBc0U7SUFDdEUsSUFBSSxjQUFjLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMxRCxJQUFJLFlBQVksS0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3RELElBQUksZ0JBQWdCLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFdEUsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsT0FBTyxJQUFJLENBQUMsY0FBYyxtQkFBbUIsQ0FBQztJQUM5RSxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsb0NBQW9DLENBQUM7SUFDckUsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxLQUFjO1FBQzVCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsS0FBYztRQUMxQixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQWE7UUFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUk7WUFBRSxPQUFPO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFhO1FBQ2hDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDOztvSEE3RlUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsMHNCQ2pDcEMsczJFQWdFQTsyRkQvQmEsdUJBQXVCO2tCQVRuQyxTQUFTOytCQUNFLHNCQUFzQixRQUsxQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBT0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBMZWdhY3kgdG9nZ2xlLWNoYW5nZSBwYXlsb2FkIGtlcHQgZm9yIGJhY2stY29tcGF0IHdpdGggY29uc3VtZXJzIHRoYXQgaGF2ZW4ndCBtaWdyYXRlZFxuICogdG8gYHJlc3RvcmVNb2NrQ2hhbmdlYCB5ZXQuIGBrZXlgIGlkZW50aWZpZXMgd2hpY2ggcm93IHdhcyB0b2dnbGVkOyBgdmFsdWVgIGlzIHRoZSBuZXdcbiAqIGNoZWNrZWQgc3RhdGUgb2YgdGhhdCByb3cuIE5ldyBjb2RlIHNob3VsZCBsaXN0ZW4gdG8gYHJlc3RvcmVNb2NrQ2hhbmdlYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1vY2tpbmdDYXJkVG9nZ2xlQ2hhbmdlIHtcbiAga2V5OiAnY2FwdHVyZUFwaVJlc3BvbnNlcycgfCAncmVuZXdBcGlSZXNwb25zZXMnO1xuICB2YWx1ZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEdWFsLW1vZGUgY2FyZCBzdW1tYXJpc2luZyB0aGUgQVBJIG1vY2tpbmcgY29uZmlndXJhdGlvbiBvZiBhIHRlc3QgY2FzZS5cbiAqXG4gKiBUaGUgY2FyZCBzdXJmYWNlcyBUV08gaW5kZXBlbmRlbnQgZmxhZ3Mg4oCUIGByZXN0b3JlTW9ja2AgKHRoZSBcIlVzZSBtb2NrIEFQSSByZXNwb25zZXNcIiByb3cpXG4gKiBhbmQgYHN0b3JlTW9ja2AgKHRoZSBcIlJlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzXCIgcm93KS4gQm90aCBjYW4gYmUgb2ZmIHNpbXVsdGFuZW91c2x5XG4gKiAobm8gbW9ja2luZyBvbiB0aGUgbmV4dCBydW4pOyB0dXJuaW5nIGVpdGhlciBvbmUgb24gZm9yY2VzIHRoZSBvdGhlciBvZmYgKHRoZXkncmUgbXV0dWFsbHlcbiAqIGV4Y2x1c2l2ZSBpbiB0aGUgb24tc3RhdGUpLiBCb3RoIGNhbiBuZXZlciBiZSBvbiBhdCB0aGUgc2FtZSB0aW1lLlxuICpcbiAqIEluIHJlYWQtb25seSBtb2RlIGVhY2ggcm93IHNob3dzIE9uL09mZiBkZXJpdmVkIGZyb20gaXRzIG93biBmbGFnLiBJbiBlZGl0IG1vZGUgZWFjaCByb3dcbiAqIHJlbmRlcnMgYSB0b2dnbGU7IHRoZSBjYXJkIGVtaXRzIGByZXN0b3JlTW9ja0NoYW5nZWAgYW5kIGBzdG9yZU1vY2tDaGFuZ2VgIHdoZW5ldmVyIGEgdmFsdWVcbiAqIGFjdHVhbGx5IGNoYW5nZXMgc28gdGhlIHBhcmVudCBjYW4gcGVyc2lzdCB0aGVtLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtYXBpLW1vY2tpbmctY2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcGktbW9ja2luZy1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgLy8gU3R5bGVzIGxpdmUgaW4gc3JjL2xpYi9zdHlsZXMvdGFpbHdpbmQuY3NzICh0aGUgbGliIHNoaXBzIGEgc2luZ2xlIGNvbXBpbGVkIHN0eWxlc2hlZXQpO1xuICAvLyBwZXItY29tcG9uZW50IC5zY3NzIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoZSBuZy1wYWNrYWdyIGJ1aWxkIGZvciB0aGlzIGxpYi5cbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBpTW9ja2luZ0NhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0FQSSBNb2NraW5nJztcbiAgQElucHV0KCkgc3RhdHVzTGFiZWw6IHN0cmluZyA9ICdOb3QgY29uZmlndXJlZCc7XG5cbiAgQElucHV0KCkgY2FwdHVyZUxhYmVsOiBzdHJpbmcgPSAnVXNlIG1vY2sgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIGNhcHR1cmVIaW50OiBzdHJpbmcgPSAnVXNlcyBzdG9yZWQgcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJuIG9uIGFmdGVyIGNhcHR1cmUgY29tcGxldGVzLic7XG4gIEBJbnB1dCgpIHJlbmV3TGFiZWw6IHN0cmluZyA9ICdSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIHJlbmV3SGludDogc3RyaW5nID0gJ1JlLWNhcHR1cmVzIGZyZXNoIHJlc3BvbnNlcyBvbiBuZXh0IHJ1bi4gVHVybnMgb2ZmIFVzZSBtb2NrLic7XG5cbiAgLyoqIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYHN0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBASW5wdXQoKSByZXN0b3JlTW9jazogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYHJlc3RvcmVNb2NrYCB3aGVuIHRydWUuICovXG4gIEBJbnB1dCgpIHN0b3JlTW9jazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG1vY2tlZEFwaXNDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgdG90YWxBcGlzQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHByb2dyZXNzUGVyY2VudDogbnVtYmVyID0gMDtcblxuICBASW5wdXQoKSBzdW1tYXJ5VGV4dD86IHN0cmluZztcbiAgQElucHV0KCkgcGVyY2VudFRleHQ/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY29uZmlndXJlQnV0dG9uTGFiZWw6IHN0cmluZyA9ICdDb25maWd1cmUgTW9jayBBUElzJztcbiAgQElucHV0KCkgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBcIk1vY2tlZCBYIG9mIFkgLyBwcm9ncmVzcyBiYXIgLyBwZXJjZW50XCIgYmxvY2sgaXMgc2hvd24uXG4gICAqIEhpZGRlbiB3aGVuIHRoZSB0ZXN0IGNhc2UgaGFzIG5vIGNhcHR1cmVkIG1vY2sgc3VtbWFyeSB5ZXQgKGFuZCBhbHdheXMgaGlkZGVuIGluXG4gICAqIGVkaXQgbW9kZSByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZykuXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogSGludCBzaG93biBpbiByZWFkLW9ubHkgbW9kZSB3aGVuIG5vIG1vY2sgZGF0YSBleGlzdHMgeWV0IChgc2hvd1Byb2dyZXNzYCBpcyBmYWxzZSkuICovXG4gIEBJbnB1dCgpIG5vRGF0YUhpbnQ6IHN0cmluZyA9ICdSdW4gdGhpcyB0ZXN0IG9uY2UgdG8gY2FwdHVyZSBBUEkgcmVzcG9uc2VzIGZpcnN0Lic7XG5cbiAgQE91dHB1dCgpIGNvbmZpZ3VyZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgYHJlc3RvcmVNb2NrYCBjaGFuZ2VzIChVc2UtbW9jayByb3cgdG9nZ2xlZCkuICovXG4gIEBPdXRwdXQoKSByZXN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgYHN0b3JlTW9ja2AgY2hhbmdlcyAoUmVuZXctYW5kLXN0b3JlIHJvdyB0b2dnbGVkKS4gKi9cbiAgQE91dHB1dCgpIHN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvLyBQZXItcm93IGRlcml2ZWQgZGlzcGxheSBzdGF0ZSDigJQgZWFjaCByb3cgcmVmbGVjdHMgaXRzIG93biBmbGFnIG5vdy5cbiAgZ2V0IGNhcHR1cmVFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgcmVuZXdFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdG9yZU1vY2s7IH1cbiAgZ2V0IGNhcHR1cmVWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT24nIDogJ09mZic7IH1cbiAgZ2V0IHJlbmV3VmFsdWVUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN0b3JlTW9jayA/ICdPbicgOiAnT2ZmJzsgfVxuXG4gIGdldCBjb21wdXRlZFN1bW1hcnlUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3VtbWFyeVRleHQpIHJldHVybiB0aGlzLnN1bW1hcnlUZXh0O1xuICAgIHJldHVybiBgJHt0aGlzLm1vY2tlZEFwaXNDb3VudH0gb2YgJHt0aGlzLnRvdGFsQXBpc0NvdW50fSBBUElzIHNldCB0byBtb2NrYDtcbiAgfVxuXG4gIGdldCBjb21wdXRlZFBlcmNlbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucGVyY2VudFRleHQpIHJldHVybiB0aGlzLnBlcmNlbnRUZXh0O1xuICAgIHJldHVybiBgJHt0aGlzLnByb2dyZXNzUGVyY2VudH0lIG9mIGNhbGxzIHdpbGwgdXNlIG1vY2sgcmVzcG9uc2VzYDtcbiAgfVxuXG4gIGdldCBwcm9ncmVzc1dpZHRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgTnVtYmVyKHRoaXMucHJvZ3Jlc3NQZXJjZW50KSB8fCAwKSk7XG4gICAgcmV0dXJuIGAke2NsYW1wZWR9JWA7XG4gIH1cblxuICBvbkNvbmZpZ3VyZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlVzZSBtb2NrIEFQSSByZXNwb25zZXNcIiB0b2dnbGUuIFR1cm5pbmcgaXQgb24gZm9yY2VzIGBzdG9yZU1vY2tgIG9mZiAobXV0dWFsIGV4Y2x1c2l2aXR5KTtcbiAgICogdHVybmluZyBpdCBvZmYgbGVhdmVzIHRoZSBvdGhlciByb3cgYWxvbmUuXG4gICAqL1xuICBvbkNhcHR1cmVUb2dnbGUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5zdG9yZU1vY2spIHRoaXMuc2V0U3RvcmVNb2NrKGZhbHNlKTtcbiAgICB0aGlzLnNldFJlc3RvcmVNb2NrKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlJlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzXCIgdG9nZ2xlLiBUdXJuaW5nIGl0IG9uIGZvcmNlcyBgcmVzdG9yZU1vY2tgIG9mZjsgdHVybmluZ1xuICAgKiBpdCBvZmYgbGVhdmVzIHRoZSBvdGhlciByb3cgYWxvbmUuXG4gICAqL1xuICBvblJlbmV3VG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMucmVzdG9yZU1vY2spIHRoaXMuc2V0UmVzdG9yZU1vY2soZmFsc2UpO1xuICAgIHRoaXMuc2V0U3RvcmVNb2NrKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVzdG9yZU1vY2sobmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc3RvcmVNb2NrID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5yZXN0b3JlTW9jayA9IG5leHQ7XG4gICAgdGhpcy5yZXN0b3JlTW9ja0NoYW5nZS5lbWl0KG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdG9yZU1vY2sobmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0b3JlTW9jayA9PT0gbmV4dCkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcmVNb2NrID0gbmV4dDtcbiAgICB0aGlzLnN0b3JlTW9ja0NoYW5nZS5lbWl0KG5leHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFtYy1jYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy10aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1zdGF0dXNcIiAqbmdJZj1cIiFzaG93UHJvZ3Jlc3MgJiZzdGF0dXNMYWJlbFwiPnt7IHN0YXR1c0xhYmVsIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIFJlYWQtb25seSByb3dzIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IGNhcHR1cmVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy12YWx1ZVwiPnt7IGNhcHR1cmVWYWx1ZVRleHQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcm93XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtbGFiZWxcIj57eyByZW5ld0xhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXZhbHVlXCI+e3sgcmVuZXdWYWx1ZVRleHQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gRWRpdCByb3dzOiB0b2dnbGVzIHdpdGggaGludCB0ZXh0IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWVkaXQtYmxvY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvdyBjcWEtYW1jLXJvdy0tZWRpdFwiPlxuICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICBbY2hlY2tlZF09XCJjYXB0dXJlRW5hYmxlZFwiXG4gICAgICAgICAgW2FyaWFMYWJlbF09XCJjYXB0dXJlTGFiZWxcIlxuICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2FwdHVyZVRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IGNhcHR1cmVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgKm5nSWY9XCJjYXB0dXJlSGludFwiIGNsYXNzPVwiY3FhLWFtYy1lZGl0LWhpbnRcIj57eyBjYXB0dXJlSGludCB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1lZGl0LWJsb2NrXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3cgY3FhLWFtYy1yb3ctLWVkaXRcIj5cbiAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgW2NoZWNrZWRdPVwicmVuZXdFbmFibGVkXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cInJlbmV3TGFiZWxcIlxuICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uUmVuZXdUb2dnbGUoJGV2ZW50KVwiPlxuICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtbGFiZWxcIj57eyByZW5ld0xhYmVsIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCAqbmdJZj1cInJlbmV3SGludFwiIGNsYXNzPVwiY3FhLWFtYy1lZGl0LWhpbnRcIj57eyByZW5ld0hpbnQgfX08L3A+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJvZ3Jlc3MgJiYgIWVkaXRpbmdcIj5cbiAgICA8cCBjbGFzcz1cImNxYS1hbWMtc3VtbWFyeVwiPnt7IGNvbXB1dGVkU3VtbWFyeVRleHQgfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcHJvZ3Jlc3MtdHJhY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NXaWR0aFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIGNsYXNzPVwiY3FhLWFtYy1wZXJjZW50XCI+e3sgY29tcHV0ZWRQZXJjZW50VGV4dCB9fTwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBIaW50OiBubyBtb2NrIGRhdGEgeWV0IOKAlCBudWRnZSB0aGUgdXNlciB0byBydW4gdGhlIHRlc3QgZmlyc3QgLS0+XG4gIDxwICpuZ0lmPVwiIXNob3dQcm9ncmVzcyAmJiAhZWRpdGluZ1wiIGNsYXNzPVwiY3FhLWFtYy1uby1kYXRhLWhpbnRcIj57eyBub0RhdGFIaW50IH19PC9wPlxuXG4gIDxidXR0b25cbiAgICAqbmdJZj1cIiFlZGl0aW5nXCJcbiAgICBbZGlzYWJsZWRdPVwiIXNob3dQcm9ncmVzc1wiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJjcWEtYW1jLWNvbmZpZ3VyZS1idG5cIlxuICAgIChjbGljayk9XCJvbkNvbmZpZ3VyZUNsaWNrKClcIj5cbiAgICB7eyBjb25maWd1cmVCdXR0b25MYWJlbCB9fVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19