bways-report 0.1.1 → 0.1.3
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.
- package/README.md +153 -51
- package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
- package/esm2022/lib/core/index.mjs +3 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
- package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
- package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
- package/esm2022/lib/data-access/adapters/index.mjs +8 -3
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
- package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
- package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
- package/esm2022/lib/data-access/contracts/index.mjs +2 -1
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +665 -90
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +458 -14
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +173 -2
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +182 -6
- package/esm2022/lib/features/designer/designer.component.mjs +101 -12
- package/esm2022/lib/features/designer/index.mjs +4 -1
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
- package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
- package/esm2022/lib/features/export/index.mjs +2 -2
- package/esm2022/lib/features/export/models/export.models.mjs +1 -1
- package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
- package/esm2022/lib/features/runtime/index.mjs +2 -1
- package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +26 -9
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +145 -24
- package/fesm2022/bways-report.mjs +8051 -1672
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/index.d.ts +2 -0
- package/lib/core/models/report-datasource.model.d.ts +9 -0
- package/lib/core/models/report-definition.model.d.ts +2 -0
- package/lib/core/models/report-grid.model.d.ts +44 -0
- package/lib/core/services/report-session-context.service.d.ts +6 -1
- package/lib/core/utils/data-normalization.util.d.ts +15 -0
- package/lib/core/utils/report-parameter.util.d.ts +35 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
- package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
- package/lib/data-access/adapters/index.d.ts +7 -2
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
- package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
- package/lib/data-access/contracts/api-dtos.d.ts +67 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +24 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +18 -2
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +7 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +9 -0
- package/lib/features/designer/designer.component.d.ts +5 -0
- package/lib/features/designer/index.d.ts +4 -0
- package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
- package/lib/features/designer/services/designer-state.service.d.ts +1 -1
- package/lib/features/designer/services/report-template.service.d.ts +32 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
- package/lib/features/export/index.d.ts +2 -2
- package/lib/features/export/models/export.models.d.ts +23 -0
- package/lib/features/export/services/report-export.service.d.ts +31 -2
- package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
- package/lib/features/runtime/index.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +16 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
- package/lib/features/runtime/report-runtime.component.d.ts +83 -1
- package/lib/features/runtime/rpt-report.component.d.ts +66 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
- package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/provide-reporting.d.ts +79 -26
- package/package.json +2 -1
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.js +45 -0
- package/schematics/ng-add/schema.json +17 -0
|
@@ -1,24 +1,49 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, effect, HostListener, inject, input, output, signal, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
|
|
4
4
|
import { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';
|
|
5
5
|
import { ReportSessionContextService } from '../../core/services/report-session-context.service';
|
|
6
6
|
import { DynamicRendererComponent } from './dynamic-renderer.component';
|
|
7
7
|
import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
|
|
8
|
+
import { ReportExecutionService } from './report-execution.service';
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
export class ReportRuntimeComponent {
|
|
10
11
|
persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });
|
|
11
12
|
dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });
|
|
12
13
|
sessionService = inject(ReportSessionContextService, { optional: true });
|
|
14
|
+
executionService = inject(ReportExecutionService, { optional: true });
|
|
13
15
|
/** Report ID to load via persistence adapter */
|
|
14
16
|
reportId = input();
|
|
15
17
|
/** Directly passed report definition (skips persistence adapter) */
|
|
16
18
|
definition = input(null, { alias: 'report' });
|
|
19
|
+
resetRequested = output();
|
|
20
|
+
exportRequested = output();
|
|
21
|
+
printRequested = output();
|
|
22
|
+
customActionTriggered = output();
|
|
23
|
+
gridStateChange = output();
|
|
24
|
+
columnDefsChange = output();
|
|
25
|
+
rowActionTriggered = output();
|
|
26
|
+
drilldownRequested = output();
|
|
17
27
|
internalDefinition = signal(null);
|
|
18
28
|
resultData = signal(null);
|
|
19
29
|
isLoading = signal(false);
|
|
20
30
|
loadingMessage = signal('Loading report...');
|
|
21
31
|
errorMessage = signal(null);
|
|
32
|
+
// Slide-over Drawer Signals
|
|
33
|
+
isDrawerOpen = signal(false);
|
|
34
|
+
drawerTitle = signal('Report Details');
|
|
35
|
+
drawerWidth = signal('760px');
|
|
36
|
+
drawerDefinition = signal(null);
|
|
37
|
+
drawerParameters = signal({});
|
|
38
|
+
drawerResultData = signal(null);
|
|
39
|
+
drawerContextBadge = signal(null);
|
|
40
|
+
isDrawerLoading = signal(false);
|
|
41
|
+
drawerLoadingMessage = signal('Loading drill-down details...');
|
|
42
|
+
drawerError = signal(null);
|
|
43
|
+
// Private trackers for drawer retry
|
|
44
|
+
activeDrawerTargetId = null;
|
|
45
|
+
activeDrawerRow = {};
|
|
46
|
+
activeDrawerAction;
|
|
22
47
|
currentDefinition = computed(() => {
|
|
23
48
|
return this.definition() ?? this.internalDefinition();
|
|
24
49
|
});
|
|
@@ -30,6 +55,11 @@ export class ReportRuntimeComponent {
|
|
|
30
55
|
}
|
|
31
56
|
}, { allowSignalWrites: true });
|
|
32
57
|
}
|
|
58
|
+
onEscape() {
|
|
59
|
+
if (this.isDrawerOpen()) {
|
|
60
|
+
this.closeDrawer();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
33
63
|
loadReport(id) {
|
|
34
64
|
if (!this.persistenceAdapter) {
|
|
35
65
|
this.errorMessage.set(`Report persistence adapter not provided to load report "${id}".`);
|
|
@@ -54,7 +84,28 @@ export class ReportRuntimeComponent {
|
|
|
54
84
|
if (!grid) {
|
|
55
85
|
return;
|
|
56
86
|
}
|
|
57
|
-
|
|
87
|
+
if (this.executionService) {
|
|
88
|
+
const missing = this.executionService.getMissingFields(event.definition, event.parameters);
|
|
89
|
+
if (missing.length > 0) {
|
|
90
|
+
this.errorMessage.set(`Missing required filter values: ${missing.join(', ')}. Please enter values to run.`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.isLoading.set(true);
|
|
94
|
+
this.loadingMessage.set('Executing report query...');
|
|
95
|
+
this.errorMessage.set(null);
|
|
96
|
+
this.executionService.execute(event.definition, event.parameters).subscribe({
|
|
97
|
+
next: (data) => {
|
|
98
|
+
this.resultData.set(data);
|
|
99
|
+
this.isLoading.set(false);
|
|
100
|
+
},
|
|
101
|
+
error: (err) => {
|
|
102
|
+
this.errorMessage.set(err instanceof Error ? err.message : String(err));
|
|
103
|
+
this.isLoading.set(false);
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const ds = event.definition.dataSources.find((d) => d.id === grid.dataSourceId || d.name === grid.dataSourceId) || event.definition.dataSources[0];
|
|
58
109
|
if (!ds) {
|
|
59
110
|
this.errorMessage.set(`Data source "${grid.dataSourceId}" referenced by grid not found in report definition.`);
|
|
60
111
|
return;
|
|
@@ -79,6 +130,133 @@ export class ReportRuntimeComponent {
|
|
|
79
130
|
},
|
|
80
131
|
});
|
|
81
132
|
}
|
|
133
|
+
onResetReport(event) {
|
|
134
|
+
this.resultData.set(null);
|
|
135
|
+
this.errorMessage.set(null);
|
|
136
|
+
this.resetRequested.emit(event);
|
|
137
|
+
}
|
|
138
|
+
onExportRequested(event) {
|
|
139
|
+
this.exportRequested.emit(event);
|
|
140
|
+
}
|
|
141
|
+
onPrintRequested(event) {
|
|
142
|
+
this.printRequested.emit(event);
|
|
143
|
+
}
|
|
144
|
+
onCustomAction(event) {
|
|
145
|
+
this.customActionTriggered.emit(event);
|
|
146
|
+
}
|
|
147
|
+
onRowActionTriggered(event) {
|
|
148
|
+
this.rowActionTriggered.emit(event);
|
|
149
|
+
if (event.action.targetReportId) {
|
|
150
|
+
this.drilldownRequested.emit({
|
|
151
|
+
targetReportId: event.action.targetReportId,
|
|
152
|
+
parameters: event.parameters,
|
|
153
|
+
row: event.row,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (event.action.type === 'open-drawer' || event.action.type === 'drilldown-report') {
|
|
157
|
+
if (event.action.targetReportId) {
|
|
158
|
+
this.openDrilldownDrawer(event.action.targetReportId, event.parameters, event.row, event.action);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
openDrilldownDrawer(targetReportId, parameters, row, action) {
|
|
163
|
+
this.activeDrawerTargetId = targetReportId;
|
|
164
|
+
this.activeDrawerRow = row;
|
|
165
|
+
this.activeDrawerAction = action;
|
|
166
|
+
this.drawerParameters.set(parameters);
|
|
167
|
+
this.drawerWidth.set(action?.drawerWidth || '760px');
|
|
168
|
+
this.drawerTitle.set(action?.drawerTitle || 'Report Details');
|
|
169
|
+
this.drawerResultData.set(null);
|
|
170
|
+
this.drawerDefinition.set(null);
|
|
171
|
+
this.drawerError.set(null);
|
|
172
|
+
this.isDrawerLoading.set(true);
|
|
173
|
+
this.drawerLoadingMessage.set('Loading drill-down details...');
|
|
174
|
+
this.isDrawerOpen.set(true);
|
|
175
|
+
// Compute friendly context badge
|
|
176
|
+
const entries = Object.entries(parameters).filter(([_, v]) => v !== undefined && v !== null && v !== '');
|
|
177
|
+
if (entries.length > 0) {
|
|
178
|
+
const badgeText = entries.slice(0, 2).map(([k, v]) => `${k}: ${v}`).join(' | ');
|
|
179
|
+
this.drawerContextBadge.set(badgeText);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.drawerContextBadge.set(null);
|
|
183
|
+
}
|
|
184
|
+
if (!this.persistenceAdapter) {
|
|
185
|
+
this.drawerError.set(`Report persistence adapter not provided to load drill-down report "${targetReportId}".`);
|
|
186
|
+
this.isDrawerLoading.set(false);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.persistenceAdapter.load(targetReportId).subscribe({
|
|
190
|
+
next: (def) => {
|
|
191
|
+
this.drawerDefinition.set(def);
|
|
192
|
+
if (!action?.drawerTitle) {
|
|
193
|
+
this.drawerTitle.set(def.name);
|
|
194
|
+
}
|
|
195
|
+
// Auto-execute target child report
|
|
196
|
+
this.executeDrawerReport(def, parameters);
|
|
197
|
+
},
|
|
198
|
+
error: (err) => {
|
|
199
|
+
this.drawerError.set(err?.message ?? `Failed to load drilldown report "${targetReportId}"`);
|
|
200
|
+
this.isDrawerLoading.set(false);
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
executeDrawerReport(def, parameters) {
|
|
205
|
+
if (!def.grid) {
|
|
206
|
+
this.isDrawerLoading.set(false);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (this.executionService) {
|
|
210
|
+
this.drawerLoadingMessage.set('Fetching drill-down data...');
|
|
211
|
+
this.executionService.execute(def, parameters).subscribe({
|
|
212
|
+
next: (data) => {
|
|
213
|
+
this.drawerResultData.set(data);
|
|
214
|
+
this.isDrawerLoading.set(false);
|
|
215
|
+
},
|
|
216
|
+
error: (err) => {
|
|
217
|
+
this.drawerError.set(err instanceof Error ? err.message : String(err));
|
|
218
|
+
this.isDrawerLoading.set(false);
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const ds = def.dataSources.find((d) => d.id === def.grid?.dataSourceId || d.name === def.grid?.dataSourceId) || def.dataSources[0];
|
|
224
|
+
if (!ds || !this.dataSourceAdapter) {
|
|
225
|
+
this.isDrawerLoading.set(false);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const session = this.sessionService?.getCurrentSessionContext() ?? {};
|
|
229
|
+
const executionParams = { ...session, ...parameters };
|
|
230
|
+
this.dataSourceAdapter.execute(ds, executionParams).subscribe({
|
|
231
|
+
next: (data) => {
|
|
232
|
+
this.drawerResultData.set(data);
|
|
233
|
+
this.isDrawerLoading.set(false);
|
|
234
|
+
},
|
|
235
|
+
error: (err) => {
|
|
236
|
+
this.drawerError.set(err?.message ?? 'Failed to execute drill-down data source.');
|
|
237
|
+
this.isDrawerLoading.set(false);
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
onDrawerExecute(event) {
|
|
242
|
+
this.executeDrawerReport(event.definition, event.parameters);
|
|
243
|
+
}
|
|
244
|
+
onEscapePressed() {
|
|
245
|
+
if (this.isDrawerOpen()) {
|
|
246
|
+
this.closeDrawer();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
closeDrawer() {
|
|
250
|
+
this.isDrawerOpen.set(false);
|
|
251
|
+
this.drawerDefinition.set(null);
|
|
252
|
+
this.drawerResultData.set(null);
|
|
253
|
+
this.drawerError.set(null);
|
|
254
|
+
}
|
|
255
|
+
retryDrawer() {
|
|
256
|
+
if (this.activeDrawerTargetId) {
|
|
257
|
+
this.openDrilldownDrawer(this.activeDrawerTargetId, this.drawerParameters(), this.activeDrawerRow, this.activeDrawerAction);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
82
260
|
retry() {
|
|
83
261
|
const id = this.reportId();
|
|
84
262
|
if (id) {
|
|
@@ -86,7 +264,7 @@ export class ReportRuntimeComponent {
|
|
|
86
264
|
}
|
|
87
265
|
}
|
|
88
266
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
89
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportRuntimeComponent, isStandalone: true, selector: "rpt-report-runtime, rpt-runtime", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "report", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
267
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportRuntimeComponent, isStandalone: true, selector: "rpt-report-runtime, rpt-runtime", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "report", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetRequested: "resetRequested", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", rowActionTriggered: "rowActionTriggered", drilldownRequested: "drilldownRequested" }, host: { listeners: { "window:keydown.escape": "onEscapePressed()" } }, ngImport: i0, template: `
|
|
90
268
|
<div class="rpt-runtime-container">
|
|
91
269
|
@if (isLoading()) {
|
|
92
270
|
<div class="rpt-state-card rpt-loading-state">
|
|
@@ -105,14 +283,89 @@ export class ReportRuntimeComponent {
|
|
|
105
283
|
[definition]="currentDefinition()!"
|
|
106
284
|
[resultData]="resultData()"
|
|
107
285
|
(executeRequested)="onExecuteReport($event)"
|
|
286
|
+
(resetRequested)="onResetReport($event)"
|
|
287
|
+
(exportRequested)="onExportRequested($event)"
|
|
288
|
+
(printRequested)="onPrintRequested($event)"
|
|
289
|
+
(customActionTriggered)="onCustomAction($event)"
|
|
290
|
+
(gridStateChanged)="gridStateChange.emit($event)"
|
|
291
|
+
(columnDefsChanged)="columnDefsChange.emit($event)"
|
|
292
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
108
293
|
/>
|
|
109
294
|
} @else {
|
|
110
295
|
<div class="rpt-state-card rpt-empty-state">
|
|
111
296
|
<p class="rpt-state-text">No report definition available.</p>
|
|
112
297
|
</div>
|
|
113
298
|
}
|
|
299
|
+
|
|
300
|
+
<!-- Master-Detail Slide-Over Drawer -->
|
|
301
|
+
@if (isDrawerOpen()) {
|
|
302
|
+
<div
|
|
303
|
+
class="rpt-drawer-backdrop"
|
|
304
|
+
(click)="closeDrawer()"
|
|
305
|
+
aria-hidden="true"
|
|
306
|
+
></div>
|
|
307
|
+
<aside
|
|
308
|
+
class="rpt-drawer-panel"
|
|
309
|
+
role="dialog"
|
|
310
|
+
aria-modal="true"
|
|
311
|
+
[attr.aria-label]="drawerTitle()"
|
|
312
|
+
[style.width]="drawerWidth()"
|
|
313
|
+
>
|
|
314
|
+
<!-- Drawer Header -->
|
|
315
|
+
<div class="rpt-drawer-header">
|
|
316
|
+
<div class="rpt-drawer-header-left">
|
|
317
|
+
<div class="rpt-drawer-title-row">
|
|
318
|
+
<h3 class="rpt-drawer-title">{{ drawerTitle() }}</h3>
|
|
319
|
+
@if (drawerContextBadge()) {
|
|
320
|
+
<span class="rpt-drawer-badge" [title]="drawerContextBadge()!">{{ drawerContextBadge() }}</span>
|
|
321
|
+
}
|
|
322
|
+
</div>
|
|
323
|
+
@if (drawerDefinition()?.description) {
|
|
324
|
+
<p class="rpt-drawer-desc">{{ drawerDefinition()?.description }}</p>
|
|
325
|
+
}
|
|
326
|
+
</div>
|
|
327
|
+
<button
|
|
328
|
+
type="button"
|
|
329
|
+
class="rpt-drawer-close-btn"
|
|
330
|
+
(click)="closeDrawer()"
|
|
331
|
+
aria-label="Close details"
|
|
332
|
+
title="Close drawer (Esc)"
|
|
333
|
+
>
|
|
334
|
+
✕
|
|
335
|
+
</button>
|
|
336
|
+
</div>
|
|
337
|
+
|
|
338
|
+
<!-- Drawer Body -->
|
|
339
|
+
<div class="rpt-drawer-body">
|
|
340
|
+
@if (isDrawerLoading()) {
|
|
341
|
+
<div class="rpt-state-card rpt-drawer-loading">
|
|
342
|
+
<div class="rpt-spinner" aria-hidden="true"></div>
|
|
343
|
+
<p class="rpt-state-text">{{ drawerLoadingMessage() }}</p>
|
|
344
|
+
</div>
|
|
345
|
+
} @else if (drawerError()) {
|
|
346
|
+
<div class="rpt-state-card rpt-error-state">
|
|
347
|
+
<div class="rpt-error-icon"><rpt-icon name="alert-triangle" [size]="28" color="#ef4444" /></div>
|
|
348
|
+
<p class="rpt-error-title">Unable to load details</p>
|
|
349
|
+
<p class="rpt-state-text">{{ drawerError() }}</p>
|
|
350
|
+
<button type="button" class="rpt-retry-btn" (click)="retryDrawer()">Retry</button>
|
|
351
|
+
</div>
|
|
352
|
+
} @else if (drawerDefinition()) {
|
|
353
|
+
<rpt-dynamic-renderer
|
|
354
|
+
[definition]="drawerDefinition()!"
|
|
355
|
+
[initialValues]="drawerParameters()"
|
|
356
|
+
[resultData]="drawerResultData()"
|
|
357
|
+
(executeRequested)="onDrawerExecute($event)"
|
|
358
|
+
(exportRequested)="onExportRequested($event)"
|
|
359
|
+
(printRequested)="onPrintRequested($event)"
|
|
360
|
+
(customActionTriggered)="onCustomAction($event)"
|
|
361
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
362
|
+
/>
|
|
363
|
+
}
|
|
364
|
+
</div>
|
|
365
|
+
</aside>
|
|
366
|
+
}
|
|
114
367
|
</div>
|
|
115
|
-
`, isInline: true, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
368
|
+
`, isInline: true, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box;position:relative}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;font-weight:500;transition:background .12s ease}.rpt-retry-btn:hover{background-color:#1d4ed8}.rpt-drawer-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:1000;animation:rpt-fade-in .18s ease-out forwards}.rpt-drawer-panel{position:fixed;top:0;right:0;bottom:0;max-width:95vw;background:var(--rpt-color-surface, #ffffff);box-shadow:-12px 0 40px #0f172a29;z-index:1001;display:flex;flex-direction:column;animation:rpt-slide-in-right .24s cubic-bezier(.16,1,.3,1) forwards;overflow:hidden;border-left:1px solid var(--rpt-color-border-subtle, #e2e8f0)}:host-context([dir=\"rtl\"]) .rpt-drawer-panel{right:auto;left:0;box-shadow:8px 0 32px #0f172a33;animation-name:rpt-slide-in-left;border-left:none;border-right:1px solid var(--rpt-color-border, #cbd5e1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rpt-slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.rpt-drawer-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background:#f8fafc;flex-shrink:0}.rpt-drawer-header-left{min-width:0;flex:1}.rpt-drawer-title-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-drawer-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;line-height:1.3}.rpt-drawer-badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:.725rem;font-weight:600;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe;border-radius:9999px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}.rpt-drawer-desc{font-size:.8rem;color:#64748b;margin:4px 0 0}.rpt-drawer-close-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid transparent;border-radius:6px;background:transparent;color:#64748b;font-size:1.125rem;cursor:pointer;transition:all .12s ease;flex-shrink:0}.rpt-drawer-close-btn:hover{background:#e2e8f0;color:#0f172a}.rpt-drawer-body{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 12px}.rpt-drawer-loading{margin:48px auto;max-width:400px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested", "resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChanged", "columnDefsChanged", "rowActionTriggered"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
116
369
|
}
|
|
117
370
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, decorators: [{
|
|
118
371
|
type: Component,
|
|
@@ -135,13 +388,94 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
135
388
|
[definition]="currentDefinition()!"
|
|
136
389
|
[resultData]="resultData()"
|
|
137
390
|
(executeRequested)="onExecuteReport($event)"
|
|
391
|
+
(resetRequested)="onResetReport($event)"
|
|
392
|
+
(exportRequested)="onExportRequested($event)"
|
|
393
|
+
(printRequested)="onPrintRequested($event)"
|
|
394
|
+
(customActionTriggered)="onCustomAction($event)"
|
|
395
|
+
(gridStateChanged)="gridStateChange.emit($event)"
|
|
396
|
+
(columnDefsChanged)="columnDefsChange.emit($event)"
|
|
397
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
138
398
|
/>
|
|
139
399
|
} @else {
|
|
140
400
|
<div class="rpt-state-card rpt-empty-state">
|
|
141
401
|
<p class="rpt-state-text">No report definition available.</p>
|
|
142
402
|
</div>
|
|
143
403
|
}
|
|
404
|
+
|
|
405
|
+
<!-- Master-Detail Slide-Over Drawer -->
|
|
406
|
+
@if (isDrawerOpen()) {
|
|
407
|
+
<div
|
|
408
|
+
class="rpt-drawer-backdrop"
|
|
409
|
+
(click)="closeDrawer()"
|
|
410
|
+
aria-hidden="true"
|
|
411
|
+
></div>
|
|
412
|
+
<aside
|
|
413
|
+
class="rpt-drawer-panel"
|
|
414
|
+
role="dialog"
|
|
415
|
+
aria-modal="true"
|
|
416
|
+
[attr.aria-label]="drawerTitle()"
|
|
417
|
+
[style.width]="drawerWidth()"
|
|
418
|
+
>
|
|
419
|
+
<!-- Drawer Header -->
|
|
420
|
+
<div class="rpt-drawer-header">
|
|
421
|
+
<div class="rpt-drawer-header-left">
|
|
422
|
+
<div class="rpt-drawer-title-row">
|
|
423
|
+
<h3 class="rpt-drawer-title">{{ drawerTitle() }}</h3>
|
|
424
|
+
@if (drawerContextBadge()) {
|
|
425
|
+
<span class="rpt-drawer-badge" [title]="drawerContextBadge()!">{{ drawerContextBadge() }}</span>
|
|
426
|
+
}
|
|
427
|
+
</div>
|
|
428
|
+
@if (drawerDefinition()?.description) {
|
|
429
|
+
<p class="rpt-drawer-desc">{{ drawerDefinition()?.description }}</p>
|
|
430
|
+
}
|
|
431
|
+
</div>
|
|
432
|
+
<button
|
|
433
|
+
type="button"
|
|
434
|
+
class="rpt-drawer-close-btn"
|
|
435
|
+
(click)="closeDrawer()"
|
|
436
|
+
aria-label="Close details"
|
|
437
|
+
title="Close drawer (Esc)"
|
|
438
|
+
>
|
|
439
|
+
✕
|
|
440
|
+
</button>
|
|
441
|
+
</div>
|
|
442
|
+
|
|
443
|
+
<!-- Drawer Body -->
|
|
444
|
+
<div class="rpt-drawer-body">
|
|
445
|
+
@if (isDrawerLoading()) {
|
|
446
|
+
<div class="rpt-state-card rpt-drawer-loading">
|
|
447
|
+
<div class="rpt-spinner" aria-hidden="true"></div>
|
|
448
|
+
<p class="rpt-state-text">{{ drawerLoadingMessage() }}</p>
|
|
449
|
+
</div>
|
|
450
|
+
} @else if (drawerError()) {
|
|
451
|
+
<div class="rpt-state-card rpt-error-state">
|
|
452
|
+
<div class="rpt-error-icon"><rpt-icon name="alert-triangle" [size]="28" color="#ef4444" /></div>
|
|
453
|
+
<p class="rpt-error-title">Unable to load details</p>
|
|
454
|
+
<p class="rpt-state-text">{{ drawerError() }}</p>
|
|
455
|
+
<button type="button" class="rpt-retry-btn" (click)="retryDrawer()">Retry</button>
|
|
456
|
+
</div>
|
|
457
|
+
} @else if (drawerDefinition()) {
|
|
458
|
+
<rpt-dynamic-renderer
|
|
459
|
+
[definition]="drawerDefinition()!"
|
|
460
|
+
[initialValues]="drawerParameters()"
|
|
461
|
+
[resultData]="drawerResultData()"
|
|
462
|
+
(executeRequested)="onDrawerExecute($event)"
|
|
463
|
+
(exportRequested)="onExportRequested($event)"
|
|
464
|
+
(printRequested)="onPrintRequested($event)"
|
|
465
|
+
(customActionTriggered)="onCustomAction($event)"
|
|
466
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
467
|
+
/>
|
|
468
|
+
}
|
|
469
|
+
</div>
|
|
470
|
+
</aside>
|
|
471
|
+
}
|
|
144
472
|
</div>
|
|
145
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer}\n"] }]
|
|
146
|
-
}], ctorParameters: () => []
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7O0FBMkZ2RixNQUFNLE9BQU8sc0JBQXNCO0lBQ2hCLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxRixnREFBZ0Q7SUFDdkMsUUFBUSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRXBDLG9FQUFvRTtJQUMzRCxVQUFVLEdBQUcsS0FBSyxDQUEwQixJ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O3dHQWxIVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwyV0FwRnZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCxxdENBNUJTLFlBQVksK0JBQUUsd0JBQXdCLHVKQUFFLGdCQUFnQjs7NEZBc0Z2RCxzQkFBc0I7a0JBekZsQyxTQUFTOytCQUNFLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsWUFFekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJULG1CQXdEZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvZGF0YS1zb3VyY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY1JlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydC1ydW50aW1lLCBycHQtcnVudGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIER5bmFtaWNSZW5kZXJlckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG5cbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJ1bnRpbWUtY29udGFpbmVyXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtbG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMzJcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIHJ1biByZXBvcnQ8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeSgpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChjdXJyZW50RGVmaW5pdGlvbigpKSB7XG4gICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgIFtkZWZpbml0aW9uXT1cImN1cnJlbnREZWZpbml0aW9uKCkhXCJcbiAgICAgICAgICBbcmVzdWx0RGF0YV09XCJyZXN1bHREYXRhKClcIlxuICAgICAgICAgIChleGVjdXRlUmVxdWVzdGVkKT1cIm9uRXhlY3V0ZVJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXRlLWNhcmQgcnB0LWVtcHR5LXN0YXRlXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPk5vIHJlcG9ydCBkZWZpbml0aW9uIGF2YWlsYWJsZS48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgIH1cbiAgICAucnB0LXJ1bnRpbWUtY29udGFpbmVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLnJwdC1zdGF0ZS1jYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogNDhweCAyNHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLWJnLCAjZmZmZmZmKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBtYXJnaW46IDI0cHggMDtcbiAgICB9XG4gICAgLnJwdC1zdGF0ZS10ZXh0IHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgICAgbWFyZ2luOiA4cHggMCAwIDA7XG4gICAgfVxuICAgIC5ycHQtZXJyb3ItdGl0bGUge1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbjogOHB4IDAgMCAwO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLWJhc2UsIDAuODc1cmVtKTtcbiAgICB9XG4gICAgLnJwdC1zcGlubmVyIHtcbiAgICAgIHdpZHRoOiAzNnB4O1xuICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgYm9yZGVyOiAzcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBhbmltYXRpb246IHJwdC1zcGluIDgwMG1zIGxpbmVhciBpbmZpbml0ZTtcbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtc3BpbiB7XG4gICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbiAgICB9XG4gICAgLnJwdC1yZXRyeS1idG4ge1xuICAgICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxNnB4O1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1pbnZlcnNlLCAjZmZmZmZmKTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0ZW5jZUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VBZGFwdGVyID0gaW5qZWN0KFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKiogUmVwb3J0IElEIHRvIGxvYWQgdmlhIHBlcnNpc3RlbmNlIGFkYXB0ZXIgKi9cbiAgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqIERpcmVjdGx5IHBhc3NlZCByZXBvcnQgZGVmaW5pdGlvbiAoc2tpcHMgcGVyc2lzdGVuY2UgYWRhcHRlcikgKi9cbiAgcmVhZG9ubHkgZGVmaW5pdGlvbiA9IGlucHV0PFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsLCB7IGFsaWFzOiAncmVwb3J0JyB9KTtcblxuXG4gIHJlYWRvbmx5IGludGVybmFsRGVmaW5pdGlvbiA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlc3VsdERhdGEgPSBzaWduYWw8dW5rbm93bltdIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmdNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJ0xvYWRpbmcgcmVwb3J0Li4uJyk7XG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpID8/IHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uKCk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgICAgIGlmIChpZCAmJiAhdGhpcy5kZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG5cbiAgbG9hZFJlcG9ydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgcmVwb3J0IFwiJHtpZH1cIi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnTG9hZGluZyByZXBvcnQgZGVmaW5pdGlvbi4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQoaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uLnNldChkZWYpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgICBlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBsb2FkIHJlcG9ydCBkZWZpbml0aW9uIHdpdGggSUQ6ICR7aWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhlY3V0ZVJlcG9ydChldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBncmlkID0gZXZlbnQuZGVmaW5pdGlvbi5ncmlkO1xuICAgIGlmICghZ3JpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRzID0gZXZlbnQuZGVmaW5pdGlvbi5kYXRhU291cmNlcy5maW5kKFxuICAgICAgKGQpID0+IGQuaWQgPT09IGdyaWQuZGF0YVNvdXJjZUlkXG4gICAgKTtcblxuICAgIGlmICghZHMpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYERhdGEgc291cmNlIFwiJHtncmlkLmRhdGFTb3VyY2VJZH1cIiByZWZlcmVuY2VkIGJ5IGdyaWQgbm90IGZvdW5kIGluIHJlcG9ydCBkZWZpbml0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLmV2ZW50LnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZUFkYXB0ZXIuZXhlY3V0ZShkcywgZXhlY3V0aW9uUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHREYXRhLnNldChkYXRhKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICAgZXJyPy5tZXNzYWdlID8/ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgcmVwb3J0IGRhdGEgc291cmNlLidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXRyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMubG9hZFJlcG9ydChpZCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
473
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box;position:relative}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;font-weight:500;transition:background .12s ease}.rpt-retry-btn:hover{background-color:#1d4ed8}.rpt-drawer-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:1000;animation:rpt-fade-in .18s ease-out forwards}.rpt-drawer-panel{position:fixed;top:0;right:0;bottom:0;max-width:95vw;background:var(--rpt-color-surface, #ffffff);box-shadow:-12px 0 40px #0f172a29;z-index:1001;display:flex;flex-direction:column;animation:rpt-slide-in-right .24s cubic-bezier(.16,1,.3,1) forwards;overflow:hidden;border-left:1px solid var(--rpt-color-border-subtle, #e2e8f0)}:host-context([dir=\"rtl\"]) .rpt-drawer-panel{right:auto;left:0;box-shadow:8px 0 32px #0f172a33;animation-name:rpt-slide-in-left;border-left:none;border-right:1px solid var(--rpt-color-border, #cbd5e1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes rpt-slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.rpt-drawer-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);background:#f8fafc;flex-shrink:0}.rpt-drawer-header-left{min-width:0;flex:1}.rpt-drawer-title-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-drawer-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;line-height:1.3}.rpt-drawer-badge{display:inline-flex;align-items:center;padding:2px 8px;font-size:.725rem;font-weight:600;background:#eff6ff;color:#2563eb;border:1px solid #bfdbfe;border-radius:9999px;white-space:nowrap;max-width:300px;overflow:hidden;text-overflow:ellipsis}.rpt-drawer-desc{font-size:.8rem;color:#64748b;margin:4px 0 0}.rpt-drawer-close-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid transparent;border-radius:6px;background:transparent;color:#64748b;font-size:1.125rem;cursor:pointer;transition:all .12s ease;flex-shrink:0}.rpt-drawer-close-btn:hover{background:#e2e8f0;color:#0f172a}.rpt-drawer-body{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 12px}.rpt-drawer-loading{margin:48px auto;max-width:400px}\n"] }]
|
|
474
|
+
}], ctorParameters: () => [], propDecorators: { onEscape: [{
|
|
475
|
+
type: HostListener,
|
|
476
|
+
args: ['window:keydown.escape']
|
|
477
|
+
}], onEscapePressed: [{
|
|
478
|
+
type: HostListener,
|
|
479
|
+
args: ['window:keydown.escape']
|
|
480
|
+
}] } });
|
|
481
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFvVHBFLE1BQU0sT0FBTyxzQkFBc0I7SUFDaEIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUUsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLGdCQUFnQixHQUFHLE1B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LEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3dHQWxZVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixxdkJBOVN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxR1QsbTZHQXRHUyxZQUFZLCtCQUFFLHdCQUF3QixzU0FBRSxnQkFBZ0I7OzRGQStTdkQsc0JBQXNCO2tCQWxUbEMsU0FBUzsrQkFDRSxpQ0FBaUMsY0FDL0IsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLFlBQ3pEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFHVCxtQkF1TWdCLHVCQUF1QixDQUFDLE1BQU07d0RBb0YvQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsdUJBQXVCO2dCQW9SckMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudEFjdGlvbkRlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9jb21wb25lbnQtZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgR3JpZFJvd0NsaWNrQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3JlcG9ydC1wZXJzaXN0ZW5jZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9kYXRhLXNvdXJjZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBEeW5hbWljUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhlY3V0aW9uU2VydmljZSB9IGZyb20gJy4vcmVwb3J0LWV4ZWN1dGlvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydC1ydW50aW1lLCBycHQtcnVudGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIER5bmFtaWNSZW5kZXJlckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1ydW50aW1lLWNvbnRhaW5lclwiPlxuICAgICAgQGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXRlLWNhcmQgcnB0LWxvYWRpbmctc3RhdGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInJwdC1zdGF0ZS10ZXh0XCI+e3sgbG9hZGluZ01lc3NhZ2UoKSB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChlcnJvck1lc3NhZ2UoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXRlLWNhcmQgcnB0LWVycm9yLXN0YXRlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1lcnJvci1pY29uXCI+PHJwdC1pY29uIG5hbWU9XCJhbGVydC10cmlhbmdsZVwiIFtzaXplXT1cIjMyXCIgY29sb3I9XCIjZWY0NDQ0XCIgLz48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cInJwdC1lcnJvci10aXRsZVwiPlVuYWJsZSB0byBydW4gcmVwb3J0PC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBlcnJvck1lc3NhZ2UoKSB9fTwvcD5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnkoKVwiPlJldHJ5PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAoY3VycmVudERlZmluaXRpb24oKSkge1xuICAgICAgICA8cnB0LWR5bmFtaWMtcmVuZGVyZXJcbiAgICAgICAgICBbZGVmaW5pdGlvbl09XCJjdXJyZW50RGVmaW5pdGlvbigpIVwiXG4gICAgICAgICAgW3Jlc3VsdERhdGFdPVwicmVzdWx0RGF0YSgpXCJcbiAgICAgICAgICAoZXhlY3V0ZVJlcXVlc3RlZCk9XCJvbkV4ZWN1dGVSZXBvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgKHJlc2V0UmVxdWVzdGVkKT1cIm9uUmVzZXRSZXBvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgKGV4cG9ydFJlcXVlc3RlZCk9XCJvbkV4cG9ydFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAocHJpbnRSZXF1ZXN0ZWQpPVwib25QcmludFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAoY3VzdG9tQWN0aW9uVHJpZ2dlcmVkKT1cIm9uQ3VzdG9tQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgIChncmlkU3RhdGVDaGFuZ2VkKT1cImdyaWRTdGF0ZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChjb2x1bW5EZWZzQ2hhbmdlZCk9XCJjb2x1bW5EZWZzQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHJvd0FjdGlvblRyaWdnZXJlZCk9XCJvblJvd0FjdGlvblRyaWdnZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXRlLWNhcmQgcnB0LWVtcHR5LXN0YXRlXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPk5vIHJlcG9ydCBkZWZpbml0aW9uIGF2YWlsYWJsZS48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIE1hc3Rlci1EZXRhaWwgU2xpZGUtT3ZlciBEcmF3ZXIgLS0+XG4gICAgICBAaWYgKGlzRHJhd2VyT3BlbigpKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInJwdC1kcmF3ZXItYmFja2Ryb3BcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZURyYXdlcigpXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICAgIDxhc2lkZVxuICAgICAgICAgIGNsYXNzPVwicnB0LWRyYXdlci1wYW5lbFwiXG4gICAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZHJhd2VyVGl0bGUoKVwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoXT1cImRyYXdlcldpZHRoKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBEcmF3ZXIgSGVhZGVyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcmF3ZXItaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1kcmF3ZXItdGl0bGUtcm93XCI+XG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicnB0LWRyYXdlci10aXRsZVwiPnt7IGRyYXdlclRpdGxlKCkgfX08L2gzPlxuICAgICAgICAgICAgICAgIEBpZiAoZHJhd2VyQ29udGV4dEJhZGdlKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWRyYXdlci1iYWRnZVwiIFt0aXRsZV09XCJkcmF3ZXJDb250ZXh0QmFkZ2UoKSFcIj57eyBkcmF3ZXJDb250ZXh0QmFkZ2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGRyYXdlckRlZmluaXRpb24oKT8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1kcmF3ZXItZGVzY1wiPnt7IGRyYXdlckRlZmluaXRpb24oKT8uZGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJycHQtZHJhd2VyLWNsb3NlLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbG9zZURyYXdlcigpXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIGRldGFpbHNcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNsb3NlIGRyYXdlciAoRXNjKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIOKclVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERyYXdlciBCb2R5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLWJvZHlcIj5cbiAgICAgICAgICAgIEBpZiAoaXNEcmF3ZXJMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zdGF0ZS1jYXJkIHJwdC1kcmF3ZXItbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBkcmF3ZXJMb2FkaW5nTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGRyYXdlckVycm9yKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zdGF0ZS1jYXJkIHJwdC1lcnJvci1zdGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZXJyb3ItaWNvblwiPjxycHQtaWNvbiBuYW1lPVwiYWxlcnQtdHJpYW5nbGVcIiBbc2l6ZV09XCIyOFwiIGNvbG9yPVwiI2VmNDQ0NFwiIC8+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtZXJyb3ItdGl0bGVcIj5VbmFibGUgdG8gbG9hZCBkZXRhaWxzPC9wPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBkcmF3ZXJFcnJvcigpIH19PC9wPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeURyYXdlcigpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChkcmF3ZXJEZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICAgICAgPHJwdC1keW5hbWljLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZHJhd2VyRGVmaW5pdGlvbigpIVwiXG4gICAgICAgICAgICAgICAgW2luaXRpYWxWYWx1ZXNdPVwiZHJhd2VyUGFyYW1ldGVycygpXCJcbiAgICAgICAgICAgICAgICBbcmVzdWx0RGF0YV09XCJkcmF3ZXJSZXN1bHREYXRhKClcIlxuICAgICAgICAgICAgICAgIChleGVjdXRlUmVxdWVzdGVkKT1cIm9uRHJhd2VyRXhlY3V0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZXhwb3J0UmVxdWVzdGVkKT1cIm9uRXhwb3J0UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwcmludFJlcXVlc3RlZCk9XCJvblByaW50UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjdXN0b21BY3Rpb25UcmlnZ2VyZWQpPVwib25DdXN0b21BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHJvd0FjdGlvblRyaWdnZXJlZCk9XCJvblJvd0FjdGlvblRyaWdnZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9hc2lkZT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBpbmhlcml0KTtcbiAgICB9XG4gICAgLnJwdC1ydW50aW1lLWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC5ycHQtc3RhdGUtY2FyZCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDQ4cHggMjRweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1iZywgI2ZmZmZmZik7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWxnLCA4cHgpO1xuICAgICAgbWFyZ2luOiAyNHB4IDA7XG4gICAgfVxuICAgIC5ycHQtc3RhdGUtdGV4dCB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLWJhc2UsIDAuODc1cmVtKTtcbiAgICAgIG1hcmdpbjogOHB4IDAgMCAwO1xuICAgIH1cbiAgICAucnB0LWVycm9yLXRpdGxlIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgICBtYXJnaW46IDhweCAwIDAgMDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1iYXNlLCAwLjg3NXJlbSk7XG4gICAgfVxuICAgIC5ycHQtc3Bpbm5lciB7XG4gICAgICB3aWR0aDogMzZweDtcbiAgICAgIGhlaWdodDogMzZweDtcbiAgICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYW5pbWF0aW9uOiBycHQtc3BpbiA4MDBtcyBsaW5lYXIgaW5maW5pdGU7XG4gICAgfVxuICAgIEBrZXlmcmFtZXMgcnB0LXNwaW4ge1xuICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gICAgfVxuICAgIC5ycHQtcmV0cnktYnRuIHtcbiAgICAgIG1hcmdpbi10b3A6IDE2cHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTZweDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtaW52ZXJzZSwgI2ZmZmZmZik7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtcmV0cnktYnRuOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxZDRlZDg7XG4gICAgfVxuXG4gICAgLyogU2xpZGUtb3ZlciBEZXRhaWwgRHJhd2VyICovXG4gICAgLnJwdC1kcmF3ZXItYmFja2Ryb3Age1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuNDUpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7XG4gICAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xuICAgICAgei1pbmRleDogMTAwMDtcbiAgICAgIGFuaW1hdGlvbjogcnB0LWZhZGUtaW4gMTgwbXMgZWFzZS1vdXQgZm9yd2FyZHM7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItcGFuZWwge1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBib3R0b206IDA7XG4gICAgICBtYXgtd2lkdGg6IDk1dnc7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2ZmZmZmZik7XG4gICAgICBib3gtc2hhZG93OiAtMTJweCAwIDQwcHggcmdiYSgxNSwgMjMsIDQyLCAwLjE2KTtcbiAgICAgIHotaW5kZXg6IDEwMDE7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNsaWRlLWluLXJpZ2h0IDI0MG1zIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpIGZvcndhcmRzO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1zdWJ0bGUsICNlMmU4ZjApO1xuICAgIH1cblxuICAgIDpob3N0LWNvbnRleHQoW2Rpcj1cInJ0bFwiXSkgLnJwdC1kcmF3ZXItcGFuZWwge1xuICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICBsZWZ0OiAwO1xuICAgICAgYm94LXNoYWRvdzogOHB4IDAgMzJweCByZ2JhKDE1LCAyMywgNDIsIDAuMik7XG4gICAgICBhbmltYXRpb24tbmFtZTogcnB0LXNsaWRlLWluLWxlZnQ7XG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LWZhZGUtaW4ge1xuICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH1cbiAgICAgIHRvIHsgb3BhY2l0eTogMTsgfVxuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNsaWRlLWluLXJpZ2h0IHtcbiAgICAgIGZyb20geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7IH1cbiAgICAgIHRvIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9XG4gICAgfVxuXG4gICAgQGtleWZyYW1lcyBycHQtc2xpZGUtaW4tbGVmdCB7XG4gICAgICBmcm9tIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsgfVxuICAgICAgdG8geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IH1cbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWhlYWRlci1sZWZ0IHtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItdGl0bGUtcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWJhZGdlIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDJweCA4cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBjb2xvcjogIzI1NjNlYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgbWF4LXdpZHRoOiAzMDBweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1kZXNjIHtcbiAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBtYXJnaW46IDRweCAwIDAgMDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1jbG9zZS1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWNsb3NlLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItYm9keSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWxvYWRpbmcge1xuICAgICAgbWFyZ2luOiA0OHB4IGF1dG87XG4gICAgICBtYXgtd2lkdGg6IDQwMHB4O1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0ZW5jZUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VBZGFwdGVyID0gaW5qZWN0KFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4ZWN1dGlvblNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqIFJlcG9ydCBJRCB0byBsb2FkIHZpYSBwZXJzaXN0ZW5jZSBhZGFwdGVyICovXG4gIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBEaXJlY3RseSBwYXNzZWQgcmVwb3J0IGRlZmluaXRpb24gKHNraXBzIHBlcnNpc3RlbmNlIGFkYXB0ZXIpICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSBpbnB1dDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCwgeyBhbGlhczogJ3JlcG9ydCcgfSk7XG5cbiAgcmVhZG9ubHkgcmVzZXRSZXF1ZXN0ZWQgPSBvdXRwdXQ8eyBkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uIH0+KCk7XG4gIHJlYWRvbmx5IGV4cG9ydFJlcXVlc3RlZCA9IG91dHB1dDx7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgZmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZGF0YTogdW5rbm93bltdIHwgbnVsbDtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgcHJpbnRSZXF1ZXN0ZWQgPSBvdXRwdXQ8e1xuICAgIHJwdEZpbGVOYW1lPzogc3RyaW5nO1xuICAgIGV4cG9ydFR5cGU/OiBzdHJpbmc7XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGN1c3RvbUFjdGlvblRyaWdnZXJlZCA9IG91dHB1dDx7XG4gICAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb25EZWZpbml0aW9uO1xuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgY29sdW1uRGVmc0NoYW5nZSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IHJvd0FjdGlvblRyaWdnZXJlZCA9IG91dHB1dDx7XG4gICAgYWN0aW9uOiBHcmlkUm93Q2xpY2tBY3Rpb247XG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZHJpbGxkb3duUmVxdWVzdGVkID0gb3V0cHV0PHtcbiAgICB0YXJnZXRSZXBvcnRJZDogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+KCk7XG5cbiAgcmVhZG9ubHkgaW50ZXJuYWxEZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgcmVzdWx0RGF0YSA9IHNpZ25hbDx1bmtub3duW10gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ01lc3NhZ2UgPSBzaWduYWw8c3RyaW5nPignTG9hZGluZyByZXBvcnQuLi4nKTtcbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFNsaWRlLW92ZXIgRHJhd2VyIFNpZ25hbHNcbiAgcmVhZG9ubHkgaXNEcmF3ZXJPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgZHJhd2VyVGl0bGUgPSBzaWduYWw8c3RyaW5nPignUmVwb3J0IERldGFpbHMnKTtcbiAgcmVhZG9ubHkgZHJhd2VyV2lkdGggPSBzaWduYWw8c3RyaW5nPignNzYwcHgnKTtcbiAgcmVhZG9ubHkgZHJhd2VyRGVmaW5pdGlvbiA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRyYXdlclBhcmFtZXRlcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcbiAgcmVhZG9ubHkgZHJhd2VyUmVzdWx0RGF0YSA9IHNpZ25hbDx1bmtub3duW10gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZHJhd2VyQ29udGV4dEJhZGdlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpc0RyYXdlckxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkcmF3ZXJMb2FkaW5nTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmc+KCdMb2FkaW5nIGRyaWxsLWRvd24gZGV0YWlscy4uLicpO1xuICByZWFkb25seSBkcmF3ZXJFcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBQcml2YXRlIHRyYWNrZXJzIGZvciBkcmF3ZXIgcmV0cnlcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3ZXJUYXJnZXRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlRHJhd2VyUm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIGFjdGl2ZURyYXdlckFjdGlvbj86IEdyaWRSb3dDbGlja0FjdGlvbjtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpID8/IHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uKCk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgICAgIGlmIChpZCAmJiAhdGhpcy5kZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJhd2VyT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJhd2VyKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFJlcG9ydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgcmVwb3J0IFwiJHtpZH1cIi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnTG9hZGluZyByZXBvcnQgZGVmaW5pdGlvbi4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQoaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uLnNldChkZWYpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgICBlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBsb2FkIHJlcG9ydCBkZWZpbml0aW9uIHdpdGggSUQ6ICR7aWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhlY3V0ZVJlcG9ydChldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBncmlkID0gZXZlbnQuZGVmaW5pdGlvbi5ncmlkO1xuICAgIGlmICghZ3JpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSB0aGlzLmV4ZWN1dGlvblNlcnZpY2UuZ2V0TWlzc2luZ0ZpZWxkcyhldmVudC5kZWZpbml0aW9uLCBldmVudC5wYXJhbWV0ZXJzKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KGBNaXNzaW5nIHJlcXVpcmVkIGZpbHRlciB2YWx1ZXM6ICR7bWlzc2luZy5qb2luKCcsICcpfS4gUGxlYXNlIGVudGVyIHZhbHVlcyB0byBydW4uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZS5zZXQoJ0V4ZWN1dGluZyByZXBvcnQgcXVlcnkuLi4nKTtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgICAgdGhpcy5leGVjdXRpb25TZXJ2aWNlLmV4ZWN1dGUoZXZlbnQuZGVmaW5pdGlvbiwgZXZlbnQucGFyYW1ldGVycykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSBldmVudC5kZWZpbml0aW9uLmRhdGFTb3VyY2VzLmZpbmQoXG4gICAgICAoZCkgPT4gZC5pZCA9PT0gZ3JpZC5kYXRhU291cmNlSWQgfHwgZC5uYW1lID09PSBncmlkLmRhdGFTb3VyY2VJZFxuICAgICkgfHwgZXZlbnQuZGVmaW5pdGlvbi5kYXRhU291cmNlc1swXTtcblxuICAgIGlmICghZHMpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYERhdGEgc291cmNlIFwiJHtncmlkLmRhdGFTb3VyY2VJZH1cIiByZWZlcmVuY2VkIGJ5IGdyaWQgbm90IGZvdW5kIGluIHJlcG9ydCBkZWZpbml0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLmV2ZW50LnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZUFkYXB0ZXIuZXhlY3V0ZShkcywgZXhlY3V0aW9uUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHREYXRhLnNldChkYXRhKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICAgZXJyPy5tZXNzYWdlID8/ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgcmVwb3J0IGRhdGEgc291cmNlLidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblJlc2V0UmVwb3J0KGV2ZW50OiB7IGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24gfSk6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0RGF0YS5zZXQobnVsbCk7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KG51bGwpO1xuICAgIHRoaXMucmVzZXRSZXF1ZXN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkV4cG9ydFJlcXVlc3RlZChldmVudDoge1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGRhdGE6IHVua25vd25bXSB8IG51bGw7XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmV4cG9ydFJlcXVlc3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uUHJpbnRSZXF1ZXN0ZWQoZXZlbnQ6IHtcbiAgICBycHRGaWxlTmFtZT86IHN0cmluZztcbiAgICBleHBvcnRUeXBlPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5wcmludFJlcXVlc3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ3VzdG9tQWN0aW9uKGV2ZW50OiB7XG4gICAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb25EZWZpbml0aW9uO1xuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuY3VzdG9tQWN0aW9uVHJpZ2dlcmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Sb3dBY3Rpb25UcmlnZ2VyZWQoZXZlbnQ6IHtcbiAgICBhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbjtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dBY3Rpb25UcmlnZ2VyZWQuZW1pdChldmVudCk7XG5cbiAgICBpZiAoZXZlbnQuYWN0aW9uLnRhcmdldFJlcG9ydElkKSB7XG4gICAgICB0aGlzLmRyaWxsZG93blJlcXVlc3RlZC5lbWl0KHtcbiAgICAgICAgdGFyZ2V0UmVwb3J0SWQ6IGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCxcbiAgICAgICAgcGFyYW1ldGVyczogZXZlbnQucGFyYW1ldGVycyxcbiAgICAgICAgcm93OiBldmVudC5yb3csXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuYWN0aW9uLnR5cGUgPT09ICdvcGVuLWRyYXdlcicgfHwgZXZlbnQuYWN0aW9uLnR5cGUgPT09ICdkcmlsbGRvd24tcmVwb3J0Jykge1xuICAgICAgaWYgKGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCkge1xuICAgICAgICB0aGlzLm9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgICAgICAgZXZlbnQuYWN0aW9uLnRhcmdldFJlcG9ydElkLFxuICAgICAgICAgIGV2ZW50LnBhcmFtZXRlcnMsXG4gICAgICAgICAgZXZlbnQucm93LFxuICAgICAgICAgIGV2ZW50LmFjdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgdGFyZ2V0UmVwb3J0SWQ6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGFjdGlvbj86IEdyaWRSb3dDbGlja0FjdGlvblxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZURyYXdlclRhcmdldElkID0gdGFyZ2V0UmVwb3J0SWQ7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXJSb3cgPSByb3c7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXJBY3Rpb24gPSBhY3Rpb247XG5cbiAgICB0aGlzLmRyYXdlclBhcmFtZXRlcnMuc2V0KHBhcmFtZXRlcnMpO1xuICAgIHRoaXMuZHJhd2VyV2lkdGguc2V0KGFjdGlvbj8uZHJhd2VyV2lkdGggfHwgJzc2MHB4Jyk7XG4gICAgdGhpcy5kcmF3ZXJUaXRsZS5zZXQoYWN0aW9uPy5kcmF3ZXJUaXRsZSB8fCAnUmVwb3J0IERldGFpbHMnKTtcbiAgICB0aGlzLmRyYXdlclJlc3VsdERhdGEuc2V0KG51bGwpO1xuICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZHJhd2VyTG9hZGluZ01lc3NhZ2Uuc2V0KCdMb2FkaW5nIGRyaWxsLWRvd24gZGV0YWlscy4uLicpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuLnNldCh0cnVlKTtcblxuICAgIC8vIENvbXB1dGUgZnJpZW5kbHkgY29udGV4dCBiYWRnZVxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwgJiYgdiAhPT0gJycpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhZGdlVGV4dCA9IGVudHJpZXMuc2xpY2UoMCwgMikubWFwKChbaywgdl0pID0+IGAke2t9OiAke3Z9YCkuam9pbignIHwgJyk7XG4gICAgICB0aGlzLmRyYXdlckNvbnRleHRCYWRnZS5zZXQoYmFkZ2VUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3ZXJDb250ZXh0QmFkZ2Uuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZUFkYXB0ZXIpIHtcbiAgICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgZHJpbGwtZG93biByZXBvcnQgXCIke3RhcmdldFJlcG9ydElkfVwiLmBcbiAgICAgICk7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQodGFyZ2V0UmVwb3J0SWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQoZGVmKTtcbiAgICAgICAgaWYgKCFhY3Rpb24/LmRyYXdlclRpdGxlKSB7XG4gICAgICAgICAgdGhpcy5kcmF3ZXJUaXRsZS5zZXQoZGVmLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF1dG8tZXhlY3V0ZSB0YXJnZXQgY2hpbGQgcmVwb3J0XG4gICAgICAgIHRoaXMuZXhlY3V0ZURyYXdlclJlcG9ydChkZWYsIHBhcmFtZXRlcnMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KFxuICAgICAgICAgIGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIGxvYWQgZHJpbGxkb3duIHJlcG9ydCBcIiR7dGFyZ2V0UmVwb3J0SWR9XCJgXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlRHJhd2VyUmVwb3J0KFxuICAgIGRlZjogUmVwb3J0RGVmaW5pdGlvbixcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlZi5ncmlkKSB7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuZHJhd2VyTG9hZGluZ01lc3NhZ2Uuc2V0KCdGZXRjaGluZyBkcmlsbC1kb3duIGRhdGEuLi4nKTtcbiAgICAgIHRoaXMuZXhlY3V0aW9uU2VydmljZS5leGVjdXRlKGRlZiwgcGFyYW1ldGVycykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmRyYXdlclJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgICAgICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSBkZWYuZGF0YVNvdXJjZXMuZmluZChcbiAgICAgIChkKSA9PiBkLmlkID09PSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkIHx8IGQubmFtZSA9PT0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZFxuICAgICkgfHwgZGVmLmRhdGFTb3VyY2VzWzBdO1xuXG4gICAgaWYgKCFkcyB8fCAhdGhpcy5kYXRhU291cmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uZ2V0Q3VycmVudFNlc3Npb25Db250ZXh0KCkgPz8ge307XG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0geyAuLi5zZXNzaW9uLCAuLi5wYXJhbWV0ZXJzIH07XG5cbiAgICB0aGlzLmRhdGFTb3VyY2VBZGFwdGVyLmV4ZWN1dGUoZHMsIGV4ZWN1dGlvblBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyUmVzdWx0RGF0YS5zZXQoZGF0YSk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/ICdGYWlsZWQgdG8gZXhlY3V0ZSBkcmlsbC1kb3duIGRhdGEgc291cmNlLicpO1xuICAgICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRHJhd2VyRXhlY3V0ZShldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGVEcmF3ZXJSZXBvcnQoZXZlbnQuZGVmaW5pdGlvbiwgZXZlbnQucGFyYW1ldGVycyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZVByZXNzZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEcmF3ZXJPcGVuKCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcmF3ZXIoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZURyYXdlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJhd2VyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmF3ZXJSZXN1bHREYXRhLnNldChudWxsKTtcbiAgICB0aGlzLmRyYXdlckVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHJldHJ5RHJhd2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZURyYXdlclRhcmdldElkKSB7XG4gICAgICB0aGlzLm9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgICAgIHRoaXMuYWN0aXZlRHJhd2VyVGFyZ2V0SWQsXG4gICAgICAgIHRoaXMuZHJhd2VyUGFyYW1ldGVycygpLFxuICAgICAgICB0aGlzLmFjdGl2ZURyYXdlclJvdyxcbiAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXJBY3Rpb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0cnkoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
|