@cqa-lib/cqa-ui 1.1.500 → 1.1.502

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.
@@ -19,8 +19,10 @@ export class ApiMockingCardComponent {
19
19
  constructor() {
20
20
  this.title = 'API Mocking';
21
21
  this.statusLabel = 'Not configured';
22
- this.captureLabel = 'Capture API responses';
23
- this.renewLabel = 'Renew API responses';
22
+ this.captureLabel = 'Use mock API responses';
23
+ this.captureHint = 'Uses stored responses on next run. Turn on after capture completes.';
24
+ this.renewLabel = 'Renew and store API responses';
25
+ this.renewHint = 'Re-captures fresh responses on next run. Turns off Use mock.';
24
26
  /**
25
27
  * Single source of truth for the card's dual-toggle state.
26
28
  * Defaults to `false` → Capture is ON, Renew is OFF.
@@ -29,7 +31,7 @@ export class ApiMockingCardComponent {
29
31
  this.mockedApisCount = 0;
30
32
  this.totalApisCount = 0;
31
33
  this.progressPercent = 0;
32
- this.configureButtonLabel = 'Configure';
34
+ this.configureButtonLabel = 'Configure Mock APIs';
33
35
  this.editing = false;
34
36
  /**
35
37
  * Controls whether the "Mocked X of Y / progress bar / percent" block is shown.
@@ -37,6 +39,8 @@ export class ApiMockingCardComponent {
37
39
  * edit mode regardless of this flag).
38
40
  */
39
41
  this.showProgress = false;
42
+ /** Hint shown in read-only mode when no mock data exists yet (`showProgress` is false). */
43
+ this.noDataHint = 'Run this test once to capture API responses first.';
40
44
  this.configure = new EventEmitter();
41
45
  /**
42
46
  * Emitted whenever the effective `restoreMock` value changes (either row's toggle was
@@ -91,18 +95,22 @@ export class ApiMockingCardComponent {
91
95
  }
92
96
  }
93
97
  ApiMockingCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
- 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", renewLabel: "renewLabel", restoreMock: "restoreMock", mockedApisCount: "mockedApisCount", totalApisCount: "totalApisCount", progressPercent: "progressPercent", summaryText: "summaryText", percentText: "percentText", configureButtonLabel: "configureButtonLabel", editing: "editing", showProgress: "showProgress" }, 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=\"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 -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\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 <button\n *ngIf=\"!editing\"\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 });
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 });
95
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, decorators: [{
96
100
  type: Component,
97
- 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=\"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 -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\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 <button\n *ngIf=\"!editing\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", styles: [] }]
101
+ 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: [] }]
98
102
  }], propDecorators: { title: [{
99
103
  type: Input
100
104
  }], statusLabel: [{
101
105
  type: Input
102
106
  }], captureLabel: [{
103
107
  type: Input
108
+ }], captureHint: [{
109
+ type: Input
104
110
  }], renewLabel: [{
105
111
  type: Input
112
+ }], renewHint: [{
113
+ type: Input
106
114
  }], restoreMock: [{
107
115
  type: Input
108
116
  }], mockedApisCount: [{
@@ -121,9 +129,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
121
129
  type: Input
122
130
  }], showProgress: [{
123
131
  type: Input
132
+ }], noDataHint: [{
133
+ type: Input
124
134
  }], configure: [{
125
135
  type: Output
126
136
  }], restoreMockChange: [{
127
137
  type: Output
128
138
  }] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBWWhHOzs7Ozs7Ozs7Ozs7R0FZRztBQVVILE1BQU0sT0FBTyx1QkFBdUI7SUFUcEM7UUFVVyxVQUFLLEdBQVcsYUFBYSxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsZ0JBQWdCLENBQUM7UUFFdkMsaUJBQVksR0FBVyx1QkFBdUIsQ0FBQztRQUMvQyxlQUFVLEdBQVcscUJBQXFCLENBQUM7UUFFcEQ7OztXQUdHO1FBQ00sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFLNUIseUJBQW9CLEdBQVcsV0FBVyxDQUFDO1FBQzNDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEM7Ozs7V0FJRztRQUNNLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTdCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DOzs7O1dBSUc7UUFDTyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0tBa0QzRDtJQWhEQywyRkFBMkY7SUFDM0YsSUFBSSxZQUFZLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLGNBQWMsS0FBYyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxnQkFBZ0IsS0FBYSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxRSxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxPQUFPLElBQUksQ0FBQyxjQUFjLG1CQUFtQixDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxvQ0FBb0MsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxLQUFjO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsS0FBYztRQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFhO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O29IQXJGVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qixna0JDbENwQyw4MERBc0RBOzJGRHBCYSx1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0Usc0JBQXNCLFFBSzFCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFPRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogTGVnYWN5IHRvZ2dsZS1jaGFuZ2UgcGF5bG9hZCBrZXB0IGZvciBiYWNrLWNvbXBhdCB3aXRoIGNvbnN1bWVycyB0aGF0IGhhdmVuJ3QgbWlncmF0ZWRcbiAqIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgeWV0LiBga2V5YCBpZGVudGlmaWVzIHdoaWNoIHJvdyB3YXMgdG9nZ2xlZDsgYHZhbHVlYCBpcyB0aGUgbmV3XG4gKiBjaGVja2VkIHN0YXRlIG9mIHRoYXQgcm93LiBOZXcgY29kZSBzaG91bGQgbGlzdGVuIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNb2NraW5nQ2FyZFRvZ2dsZUNoYW5nZSB7XG4gIGtleTogJ2NhcHR1cmVBcGlSZXNwb25zZXMnIHwgJ3JlbmV3QXBpUmVzcG9uc2VzJztcbiAgdmFsdWU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRHVhbC1tb2RlIGNhcmQgc3VtbWFyaXNpbmcgdGhlIEFQSSBtb2NraW5nIGNvbmZpZ3VyYXRpb24gb2YgYSB0ZXN0IGNhc2UuXG4gKlxuICogVGhlIGNhcmQgc3VyZmFjZXMgKipvbmUgYm9vbGVhbiBjaG9pY2UqKiDigJQgYHJlc3RvcmVNb2NrYCDigJQgYXMgdHdvIG11dHVhbGx5LWV4Y2x1c2l2ZSByb3dzXG4gKiBsYWJlbGxlZCBcIkNhcHR1cmUgQVBJIHJlc3BvbnNlc1wiIGFuZCBcIlJlbmV3IEFQSSByZXNwb25zZXNcIjpcbiAqXG4gKiAgIHJlc3RvcmVNb2NrID09PSB0cnVlICAg4oaSICAgUmVuZXcgPSBPTiwgIENhcHR1cmUgPSBPRkZcbiAqICAgcmVzdG9yZU1vY2sgPT09IGZhbHNlICDihpIgICBSZW5ldyA9IE9GRiwgQ2FwdHVyZSA9IE9OXG4gKlxuICogSW4gcmVhZC1vbmx5IG1vZGUgYm90aCByb3dzIHNob3cgYSB2YWx1ZSB0ZXh0IChcIk9uXCIvXCJPZmZcIikgZGVyaXZlZCBmcm9tIGByZXN0b3JlTW9ja2AuXG4gKiBJbiBlZGl0IG1vZGUgYm90aCByb3dzIHJlbmRlciBhIHRvZ2dsZTsgaW50ZXJhY3Rpbmcgd2l0aCBlaXRoZXIgb25lIGZsaXBzIGByZXN0b3JlTW9ja2BcbiAqIGFuZCB0aGUgY2FyZCBlbWl0cyBgcmVzdG9yZU1vY2tDaGFuZ2VgIHNvIHRoZSBwYXJlbnQgY2FuIHBlcnNpc3QgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1tb2NraW5nLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIC8vIFN0eWxlcyBsaXZlIGluIHNyYy9saWIvc3R5bGVzL3RhaWx3aW5kLmNzcyAodGhlIGxpYiBzaGlwcyBhIHNpbmdsZSBjb21waWxlZCBzdHlsZXNoZWV0KTtcbiAgLy8gcGVyLWNvbXBvbmVudCAuc2NzcyBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgbmctcGFja2FnciBidWlsZCBmb3IgdGhpcyBsaWIuXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwaU1vY2tpbmdDYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9ICdBUEkgTW9ja2luZyc7XG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVsOiBzdHJpbmcgPSAnTm90IGNvbmZpZ3VyZWQnO1xuXG4gIEBJbnB1dCgpIGNhcHR1cmVMYWJlbDogc3RyaW5nID0gJ0NhcHR1cmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIHJlbmV3TGFiZWw6IHN0cmluZyA9ICdSZW5ldyBBUEkgcmVzcG9uc2VzJztcblxuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsLXRvZ2dsZSBzdGF0ZS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCDihpIgQ2FwdHVyZSBpcyBPTiwgUmVuZXcgaXMgT0ZGLlxuICAgKi9cbiAgQElucHV0KCkgcmVzdG9yZU1vY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBtb2NrZWRBcGlzQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsQXBpc0NvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQ6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgc3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBlcmNlbnRUZXh0Pzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbmZpZ3VyZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnQ29uZmlndXJlJztcbiAgQElucHV0KCkgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBcIk1vY2tlZCBYIG9mIFkgLyBwcm9ncmVzcyBiYXIgLyBwZXJjZW50XCIgYmxvY2sgaXMgc2hvd24uXG4gICAqIEhpZGRlbiB3aGVuIHRoZSB0ZXN0IGNhc2UgaGFzIG5vIGNhcHR1cmVkIG1vY2sgc3VtbWFyeSB5ZXQgKGFuZCBhbHdheXMgaGlkZGVuIGluXG4gICAqIGVkaXQgbW9kZSByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZykuXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgY29uZmlndXJlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgZWZmZWN0aXZlIGByZXN0b3JlTW9ja2AgdmFsdWUgY2hhbmdlcyAoZWl0aGVyIHJvdydzIHRvZ2dsZSB3YXNcbiAgICogaW50ZXJhY3RlZCB3aXRoIGluIGVkaXQgbW9kZSkuIFBhcmVudCBjb21wb25lbnRzIHNob3VsZCBwZXJzaXN0IHRoaXMgdmFsdWUg4oCUIGUuZy4gdW5kZXJcbiAgICogYHRlc3RDYXNlLm1vY2tBcGlTZXR0aW5ncy5yZXN0b3JlTW9ja2AuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVzdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLy8gRGVyaXZlZCBwZXItcm93IHN0YXRlICh0ZW1wbGF0ZSBiaW5kcyB0aGVzZSBkaXJlY3RseSBzbyB0aGUgdHdvIHJvd3Mgc3RheSBpbiBsb2NrLXN0ZXApLlxuICBnZXQgcmVuZXdFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgY2FwdHVyZUVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgcmVuZXdWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT24nIDogJ09mZic7IH1cbiAgZ2V0IGNhcHR1cmVWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT2ZmJyA6ICdPbic7IH1cblxuICBnZXQgY29tcHV0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN1bW1hcnlUZXh0KSByZXR1cm4gdGhpcy5zdW1tYXJ5VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5tb2NrZWRBcGlzQ291bnR9IG9mICR7dGhpcy50b3RhbEFwaXNDb3VudH0gQVBJcyBzZXQgdG8gbW9ja2A7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRQZXJjZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnBlcmNlbnRUZXh0KSByZXR1cm4gdGhpcy5wZXJjZW50VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5wcm9ncmVzc1BlcmNlbnR9JSBvZiBjYWxscyB3aWxsIHVzZSBtb2NrIHJlc3BvbnNlc2A7XG4gIH1cblxuICBnZXQgcHJvZ3Jlc3NXaWR0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcih0aGlzLnByb2dyZXNzUGVyY2VudCkgfHwgMCkpO1xuICAgIHJldHVybiBgJHtjbGFtcGVkfSVgO1xuICB9XG5cbiAgb25Db25maWd1cmVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZS5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiUmVuZXcgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZSBpbiBlZGl0IG1vZGUuXG4gICAqIFJlbmV3IE9OICDihpIgcmVzdG9yZU1vY2sgPSB0cnVlICAoQ2FwdHVyZSBPRkYpLlxuICAgKiBSZW5ldyBPRkYg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKENhcHR1cmUgT04g4oCUIG11dHVhbCBleGNsdXNpdml0eSkuXG4gICAqL1xuICBvblJlbmV3VG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZXRSZXN0b3JlTW9jayh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiQ2FwdHVyZSBBUEkgcmVzcG9uc2VzXCIgdG9nZ2xlIGluIGVkaXQgbW9kZS5cbiAgICogQ2FwdHVyZSBPTiAg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKFJlbmV3IE9GRikuXG4gICAqIENhcHR1cmUgT0ZGIOKGkiByZXN0b3JlTW9jayA9IHRydWUgIChSZW5ldyBPTiDigJQgbXV0dWFsIGV4Y2x1c2l2aXR5KS5cbiAgICovXG4gIG9uQ2FwdHVyZVRvZ2dsZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0UmVzdG9yZU1vY2soIXZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVzdG9yZU1vY2sobmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc3RvcmVNb2NrID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5yZXN0b3JlTW9jayA9IG5leHQ7XG4gICAgdGhpcy5yZXN0b3JlTW9ja0NoYW5nZS5lbWl0KG5leHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFtYy1jYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy10aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1zdGF0dXNcIiAqbmdJZj1cInN0YXR1c0xhYmVsXCI+e3sgc3RhdHVzTGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUmVhZC1vbmx5IHJvd3MgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgY2FwdHVyZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXZhbHVlXCI+e3sgY2FwdHVyZVZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IHJlbmV3TGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtdmFsdWVcIj57eyByZW5ld1ZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBFZGl0IHJvd3M6IHRvZ2dsZXMgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcm93IGNxYS1hbWMtcm93LS1lZGl0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtbGFiZWxcIj57eyBjYXB0dXJlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgW2NoZWNrZWRdPVwiY2FwdHVyZUVuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cImNhcHR1cmVMYWJlbFwiXG4gICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2FwdHVyZVRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvdyBjcWEtYW1jLXJvdy0tZWRpdFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgcmVuZXdMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICBbY2hlY2tlZF09XCJyZW5ld0VuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cInJlbmV3TGFiZWxcIlxuICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblJlbmV3VG9nZ2xlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJvZ3Jlc3MgJiYgIWVkaXRpbmdcIj5cbiAgICA8cCBjbGFzcz1cImNxYS1hbWMtc3VtbWFyeVwiPnt7IGNvbXB1dGVkU3VtbWFyeVRleHQgfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcHJvZ3Jlc3MtdHJhY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NXaWR0aFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIGNsYXNzPVwiY3FhLWFtYy1wZXJjZW50XCI+e3sgY29tcHV0ZWRQZXJjZW50VGV4dCB9fTwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiY3FhLWFtYy1jb25maWd1cmUtYnRuXCJcbiAgICAoY2xpY2spPVwib25Db25maWd1cmVDbGljaygpXCI+XG4gICAge3sgY29uZmlndXJlQnV0dG9uTGFiZWwgfX1cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
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=