bways-report 0.1.8 → 0.2.0

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.
Files changed (124) hide show
  1. package/README.md +463 -316
  2. package/esm2022/lib/core/config/bways-report-config.mjs +31 -32
  3. package/esm2022/lib/core/models/index.mjs +1 -1
  4. package/esm2022/lib/core/models/report-api-endpoint.model.mjs +8 -0
  5. package/esm2022/lib/core/models/report-component.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  7. package/esm2022/lib/core/services/index.mjs +2 -1
  8. package/esm2022/lib/core/services/report-api-execution.service.mjs +210 -0
  9. package/esm2022/lib/core/services/report-data-discovery.service.mjs +76 -4
  10. package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
  11. package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
  12. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  13. package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
  14. package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +31 -1
  16. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +27 -2
  17. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
  18. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
  19. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
  20. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
  21. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
  22. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +28 -51
  23. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
  24. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
  25. package/esm2022/lib/data-access/adapters/index.mjs +1 -1
  26. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
  27. package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
  28. package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
  29. package/esm2022/lib/data-access/contracts/index.mjs +1 -1
  30. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  31. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
  32. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +536 -6
  33. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +55 -17
  34. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
  35. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +3 -3
  36. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  37. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -8
  38. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  39. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +129 -28
  40. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +3 -3
  41. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  42. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +3 -3
  43. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +27 -13
  44. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
  45. package/esm2022/lib/features/designer/designer.component.mjs +109 -75
  46. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
  47. package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
  48. package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
  49. package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
  50. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +2 -1
  51. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
  52. package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
  53. package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
  54. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
  55. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
  56. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +6 -4
  57. package/esm2022/lib/features/routing/report-routes.mjs +6 -6
  58. package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
  59. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
  60. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +23 -4
  61. package/esm2022/lib/features/runtime/report-execution.service.mjs +36 -6
  62. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +54 -11
  63. package/esm2022/lib/features/runtime/report-runtime.component.mjs +105 -68
  64. package/esm2022/lib/features/runtime/rpt-report.component.mjs +50 -42
  65. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
  66. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +16 -7
  67. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +53 -1
  68. package/esm2022/lib/primitives/components/index.mjs +2 -1
  69. package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +428 -0
  70. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  71. package/esm2022/lib/provide-reporting.mjs +11 -29
  72. package/fesm2022/bways-report.mjs +3745 -1281
  73. package/fesm2022/bways-report.mjs.map +1 -1
  74. package/lib/core/config/bways-report-config.d.ts +27 -5
  75. package/lib/core/models/index.d.ts +2 -1
  76. package/lib/core/models/report-api-endpoint.model.d.ts +30 -0
  77. package/lib/core/models/report-component.model.d.ts +16 -4
  78. package/lib/core/models/report-datasource.model.d.ts +21 -2
  79. package/lib/core/services/index.d.ts +1 -0
  80. package/lib/core/services/report-api-execution.service.d.ts +41 -0
  81. package/lib/core/services/report-data-discovery.service.d.ts +23 -1
  82. package/lib/core/services/report-session-context.service.d.ts +9 -0
  83. package/lib/core/tokens/designer-config.token.d.ts +4 -0
  84. package/lib/core/tokens/reporting-config.token.d.ts +4 -0
  85. package/lib/core/utils/report-endpoint.util.d.ts +12 -0
  86. package/lib/core/utils/report-request-scope.d.ts +14 -0
  87. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +2 -0
  88. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +1 -0
  89. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
  90. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
  91. package/lib/data-access/adapters/endpoint-tokens.d.ts +7 -0
  92. package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
  93. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -4
  94. package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
  95. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
  96. package/lib/data-access/adapters/index.d.ts +1 -1
  97. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
  98. package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
  99. package/lib/data-access/adapters/session-headers.d.ts +3 -0
  100. package/lib/data-access/contracts/index.d.ts +1 -0
  101. package/lib/data-access/contracts/lookup.contract.d.ts +3 -0
  102. package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
  103. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +16 -0
  104. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
  105. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
  106. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +21 -3
  107. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -7
  108. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +2 -1
  109. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
  110. package/lib/features/designer/designer.component.d.ts +16 -2
  111. package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
  112. package/lib/features/designer/services/designer-config.service.d.ts +13 -0
  113. package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
  114. package/lib/features/persistence/services/report-store.service.d.ts +15 -1
  115. package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
  116. package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
  117. package/lib/features/runtime/report-execution.service.d.ts +4 -0
  118. package/lib/features/runtime/report-grid-bridge.component.d.ts +4 -1
  119. package/lib/features/runtime/report-runtime.component.d.ts +14 -1
  120. package/lib/features/runtime/rpt-report.component.d.ts +5 -0
  121. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
  122. package/lib/primitives/components/index.d.ts +2 -0
  123. package/lib/primitives/components/radio/rpt-radio.component.d.ts +77 -0
  124. package/package.json +2 -1
@@ -1,4 +1,7 @@
1
- import { ChangeDetectionStrategy, Component, computed, effect, HostListener, inject, input, output, signal, } from '@angular/core';
1
+ import { ReportRequestScope } from '../../core/utils/report-request-scope';
2
+ import { normalizeReportDefinition } from '../persistence/services/schema-validator.service';
3
+ import { map } from 'rxjs';
4
+ import { ChangeDetectionStrategy, Component, computed, effect, HostListener, inject, input, output, signal, untracked, } from '@angular/core';
2
5
  import { CommonModule } from '@angular/common';
3
6
  import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
4
7
  import { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';
@@ -8,6 +11,7 @@ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.comp
8
11
  import { ReportExecutionService } from './report-execution.service';
9
12
  import * as i0 from "@angular/core";
10
13
  export class ReportRuntimeComponent {
14
+ requests = new ReportRequestScope();
11
15
  persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });
12
16
  dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });
13
17
  sessionService = inject(ReportSessionContextService, { optional: true });
@@ -16,7 +20,11 @@ export class ReportRuntimeComponent {
16
20
  reportId = input();
17
21
  /** Directly passed report definition (skips persistence adapter) */
18
22
  definition = input(null, { alias: 'report' });
23
+ /** Optional pre-loaded or canvas-shared result data */
24
+ initialData = input(null, { alias: 'resultData' });
19
25
  resetRequested = output();
26
+ execute = output();
27
+ executed = output();
20
28
  exportRequested = output();
21
29
  printRequested = output();
22
30
  customActionTriggered = output();
@@ -47,15 +55,45 @@ export class ReportRuntimeComponent {
47
55
  activeDrawerRow = {};
48
56
  activeDrawerAction;
49
57
  currentDefinition = computed(() => {
50
- return this.definition() ?? this.internalDefinition();
58
+ const value = this.definition() ?? this.internalDefinition();
59
+ if (!value)
60
+ return null;
61
+ try {
62
+ return normalizeReportDefinition(value);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
51
67
  });
52
68
  constructor() {
69
+ effect(() => {
70
+ this.requests.context();
71
+ this.definition();
72
+ this.reportId();
73
+ untracked(() => { this.requests.cancelAll(); this.resultData.set(null); this.internalDefinition.set(null); this.closeDrawer(); });
74
+ const value = this.definition();
75
+ if (value) {
76
+ try {
77
+ normalizeReportDefinition(value);
78
+ this.errorMessage.set(null);
79
+ }
80
+ catch (error) {
81
+ this.errorMessage.set(error instanceof Error ? error.message : String(error));
82
+ }
83
+ }
84
+ }, { allowSignalWrites: true });
53
85
  effect(() => {
54
86
  const id = this.reportId();
55
87
  if (id && !this.definition()) {
56
88
  this.loadReport(id);
57
89
  }
58
90
  }, { allowSignalWrites: true });
91
+ effect(() => {
92
+ const data = this.initialData();
93
+ if (data !== undefined && data !== null) {
94
+ this.resultData.set(data);
95
+ }
96
+ }, { allowSignalWrites: true });
59
97
  }
60
98
  onEscape() {
61
99
  if (this.isDrawerOpen()) {
@@ -63,6 +101,8 @@ export class ReportRuntimeComponent {
63
101
  }
64
102
  }
65
103
  loadReport(id) {
104
+ this.requests.cancel('execution');
105
+ this.resultData.set(null);
66
106
  if (!this.persistenceAdapter) {
67
107
  this.errorMessage.set(`Report persistence adapter not provided to load report "${id}".`);
68
108
  return;
@@ -70,18 +110,16 @@ export class ReportRuntimeComponent {
70
110
  this.isLoading.set(true);
71
111
  this.loadingMessage.set('Loading report definition...');
72
112
  this.errorMessage.set(null);
73
- this.persistenceAdapter.load(id).subscribe({
74
- next: (def) => {
75
- this.internalDefinition.set(def);
76
- this.isLoading.set(false);
77
- },
78
- error: (err) => {
79
- this.errorMessage.set(err?.message ?? `Failed to load report definition with ID: ${id}`);
80
- this.isLoading.set(false);
81
- },
82
- });
113
+ this.requests.run('definition', () => this.persistenceAdapter.load(id).pipe(map(normalizeReportDefinition)), (def) => {
114
+ this.internalDefinition.set(def);
115
+ this.isLoading.set(false);
116
+ }, (err) => {
117
+ this.errorMessage.set(err?.message ?? `Failed to load report definition with ID: ${id}`);
118
+ this.isLoading.set(false);
119
+ }, () => this.isLoading.set(false));
83
120
  }
84
121
  onExecuteReport(event) {
122
+ this.requests.cancel('execution');
85
123
  const grid = event.definition.grid;
86
124
  if (!grid) {
87
125
  return;
@@ -95,16 +133,15 @@ export class ReportRuntimeComponent {
95
133
  this.isLoading.set(true);
96
134
  this.loadingMessage.set('Executing report query...');
97
135
  this.errorMessage.set(null);
98
- this.executionService.execute(event.definition, event.parameters).subscribe({
99
- next: (data) => {
100
- this.resultData.set(data);
101
- this.isLoading.set(false);
102
- },
103
- error: (err) => {
104
- this.errorMessage.set(err instanceof Error ? err.message : String(err));
105
- this.isLoading.set(false);
106
- },
107
- });
136
+ this.requests.run('execution', () => this.executionService.execute(event.definition, event.parameters), (data) => {
137
+ this.resultData.set(data);
138
+ this.isLoading.set(false);
139
+ this.execute.emit({ definition: event.definition, parameters: event.parameters, data });
140
+ this.executed.emit({ definition: event.definition, parameters: event.parameters, data });
141
+ }, (err) => {
142
+ this.errorMessage.set(err instanceof Error ? err.message : String(err));
143
+ this.isLoading.set(false);
144
+ }, () => this.isLoading.set(false));
108
145
  return;
109
146
  }
110
147
  const ds = event.definition.dataSources.find((d) => d.id === grid.dataSourceId || d.name === grid.dataSourceId) || event.definition.dataSources[0];
@@ -121,18 +158,18 @@ export class ReportRuntimeComponent {
121
158
  this.errorMessage.set(null);
122
159
  const session = this.sessionService?.getCurrentSessionContext() ?? {};
123
160
  const executionParams = { ...session, ...event.parameters };
124
- this.dataSourceAdapter.execute(ds, executionParams).subscribe({
125
- next: (data) => {
126
- this.resultData.set(data);
127
- this.isLoading.set(false);
128
- },
129
- error: (err) => {
130
- this.errorMessage.set(err?.message ?? 'An error occurred while executing report data source.');
131
- this.isLoading.set(false);
132
- },
133
- });
161
+ this.requests.run('execution', () => this.dataSourceAdapter.execute(ds, executionParams), (data) => {
162
+ this.resultData.set(data);
163
+ this.isLoading.set(false);
164
+ this.execute.emit({ definition: event.definition, parameters: event.parameters, data });
165
+ this.executed.emit({ definition: event.definition, parameters: event.parameters, data });
166
+ }, (err) => {
167
+ this.errorMessage.set(err?.message ?? 'An error occurred while executing report data source.');
168
+ this.isLoading.set(false);
169
+ }, () => this.isLoading.set(false));
134
170
  }
135
171
  onResetReport(event) {
172
+ this.requests.cancel('execution');
136
173
  this.resultData.set(null);
137
174
  this.errorMessage.set(null);
138
175
  this.resetRequested.emit(event);
@@ -166,6 +203,8 @@ export class ReportRuntimeComponent {
166
203
  }
167
204
  }
168
205
  openDrilldownDrawer(targetReportId, parameters, row, action) {
206
+ this.requests.cancel('drawer-load');
207
+ this.requests.cancel('drawer-execution');
169
208
  this.activeDrawerTargetId = targetReportId;
170
209
  this.activeDrawerRow = row;
171
210
  this.activeDrawerAction = action;
@@ -192,38 +231,36 @@ export class ReportRuntimeComponent {
192
231
  this.isDrawerLoading.set(false);
193
232
  return;
194
233
  }
195
- this.persistenceAdapter.load(targetReportId).subscribe({
196
- next: (def) => {
197
- this.drawerDefinition.set(def);
198
- if (!action?.drawerTitle) {
199
- this.drawerTitle.set(def.name);
200
- }
201
- // Auto-execute target child report
202
- this.executeDrawerReport(def, parameters);
203
- },
204
- error: (err) => {
205
- this.drawerError.set(err?.message ?? `Failed to load drilldown report "${targetReportId}"`);
206
- this.isDrawerLoading.set(false);
207
- },
208
- });
234
+ this.requests.run('drawer-load', () => this.persistenceAdapter.load(targetReportId).pipe(map(normalizeReportDefinition)), (def) => {
235
+ this.drawerDefinition.set(def);
236
+ if (!action?.drawerTitle) {
237
+ this.drawerTitle.set(def.name);
238
+ }
239
+ // Auto-execute target child report
240
+ this.executeDrawerReport(def, parameters);
241
+ }, (err) => {
242
+ this.drawerError.set(err?.message ?? `Failed to load drilldown report "${targetReportId}"`);
243
+ this.isDrawerLoading.set(false);
244
+ }, () => { if (!this.requests.isActive('drawer-execution'))
245
+ this.isDrawerLoading.set(false); });
209
246
  }
210
247
  executeDrawerReport(def, parameters) {
248
+ this.requests.cancel('drawer-execution');
249
+ this.isDrawerLoading.set(true);
250
+ this.drawerError.set(null);
211
251
  if (!def.grid) {
212
252
  this.isDrawerLoading.set(false);
213
253
  return;
214
254
  }
215
255
  if (this.executionService) {
216
256
  this.drawerLoadingMessage.set('Fetching drill-down data...');
217
- this.executionService.execute(def, parameters).subscribe({
218
- next: (data) => {
219
- this.drawerResultData.set(data);
220
- this.isDrawerLoading.set(false);
221
- },
222
- error: (err) => {
223
- this.drawerError.set(err instanceof Error ? err.message : String(err));
224
- this.isDrawerLoading.set(false);
225
- },
226
- });
257
+ this.requests.run('drawer-execution', () => this.executionService.execute(def, parameters), (data) => {
258
+ this.drawerResultData.set(data);
259
+ this.isDrawerLoading.set(false);
260
+ }, (err) => {
261
+ this.drawerError.set(err instanceof Error ? err.message : String(err));
262
+ this.isDrawerLoading.set(false);
263
+ }, () => this.isDrawerLoading.set(false));
227
264
  return;
228
265
  }
229
266
  const ds = def.dataSources.find((d) => d.id === def.grid?.dataSourceId || d.name === def.grid?.dataSourceId) || def.dataSources[0];
@@ -233,16 +270,13 @@ export class ReportRuntimeComponent {
233
270
  }
234
271
  const session = this.sessionService?.getCurrentSessionContext() ?? {};
235
272
  const executionParams = { ...session, ...parameters };
236
- this.dataSourceAdapter.execute(ds, executionParams).subscribe({
237
- next: (data) => {
238
- this.drawerResultData.set(data);
239
- this.isDrawerLoading.set(false);
240
- },
241
- error: (err) => {
242
- this.drawerError.set(err?.message ?? 'Failed to execute drill-down data source.');
243
- this.isDrawerLoading.set(false);
244
- },
245
- });
273
+ this.requests.run('drawer-execution', () => this.dataSourceAdapter.execute(ds, executionParams), (data) => {
274
+ this.drawerResultData.set(data);
275
+ this.isDrawerLoading.set(false);
276
+ }, (err) => {
277
+ this.drawerError.set(err?.message ?? 'Failed to execute drill-down data source.');
278
+ this.isDrawerLoading.set(false);
279
+ }, () => this.isDrawerLoading.set(false));
246
280
  }
247
281
  onDrawerExecute(event) {
248
282
  this.executeDrawerReport(event.definition, event.parameters);
@@ -253,6 +287,9 @@ export class ReportRuntimeComponent {
253
287
  }
254
288
  }
255
289
  closeDrawer() {
290
+ this.requests.cancel('drawer-load');
291
+ this.requests.cancel('drawer-execution');
292
+ this.isDrawerLoading.set(false);
256
293
  this.isDrawerOpen.set(false);
257
294
  this.drawerDefinition.set(null);
258
295
  this.drawerResultData.set(null);
@@ -270,7 +307,7 @@ export class ReportRuntimeComponent {
270
307
  }
271
308
  }
272
309
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
273
- 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", selectionChange: "selectionChange", selectionChanged: "selectionChanged", rowActionTriggered: "rowActionTriggered", drilldownRequested: "drilldownRequested" }, host: { listeners: { "window:keydown.escape": "onEscapePressed()" } }, ngImport: i0, template: `
310
+ 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 }, initialData: { classPropertyName: "initialData", publicName: "resultData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetRequested: "resetRequested", execute: "execute", executed: "executed", exportRequested: "exportRequested", printRequested: "printRequested", customActionTriggered: "customActionTriggered", gridStateChange: "gridStateChange", columnDefsChange: "columnDefsChange", selectionChange: "selectionChange", selectionChanged: "selectionChanged", rowActionTriggered: "rowActionTriggered", drilldownRequested: "drilldownRequested" }, host: { listeners: { "window:keydown.escape": "onEscapePressed()" } }, ngImport: i0, template: `
274
311
  <div class="rpt-runtime-container">
275
312
  @if (isLoading()) {
276
313
  <div class="rpt-state-card rpt-loading-state">
@@ -486,4 +523,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
486
523
  type: HostListener,
487
524
  args: ['window:keydown.escape']
488
525
  }] } });
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFxVHBFLE1BQU0sT0FBTyxzQkFBc0I7SUFDaEIsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUUsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLGdCQUFnQixHQUFHLE1B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LElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFDdkIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLO1FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3dHQXpZVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwrekJBL1N2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0dULG02R0F2R1MsWUFBWSwrQkFBRSx3QkFBd0IsNlVBQUUsZ0JBQWdCOzs0RkFnVHZELHNCQUFzQjtrQkFuVGxDLFNBQVM7K0JBQ0UsaUNBQWlDLGNBQy9CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQyxZQUN6RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0dULG1CQXVNZ0IsdUJBQXVCLENBQUMsTUFBTTt3REFzRi9DLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBeVJyQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50QWN0aW9uRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2NvbXBvbmVudC1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkUm93Q2xpY2tBY3Rpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL2RhdGEtc291cmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRFeGVjdXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZXhlY3V0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcmVwb3J0LXJ1bnRpbWUsIHJwdC1ydW50aW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHluYW1pY1JlbmRlcmVyQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJ1bnRpbWUtY29udGFpbmVyXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtbG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMzJcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIHJ1biByZXBvcnQ8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeSgpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChjdXJyZW50RGVmaW5pdGlvbigpKSB7XG4gICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgIFtkZWZpbml0aW9uXT1cImN1cnJlbnREZWZpbml0aW9uKCkhXCJcbiAgICAgICAgICBbcmVzdWx0RGF0YV09XCJyZXN1bHREYXRhKClcIlxuICAgICAgICAgIChleGVjdXRlUmVxdWVzdGVkKT1cIm9uRXhlY3V0ZVJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAocmVzZXRSZXF1ZXN0ZWQpPVwib25SZXNldFJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAoZXhwb3J0UmVxdWVzdGVkKT1cIm9uRXhwb3J0UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgIChwcmludFJlcXVlc3RlZCk9XCJvblByaW50UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgIChjdXN0b21BY3Rpb25UcmlnZ2VyZWQpPVwib25DdXN0b21BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgKGdyaWRTdGF0ZUNoYW5nZWQpPVwiZ3JpZFN0YXRlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbHVtbkRlZnNDaGFuZ2VkKT1cImNvbHVtbkRlZnNDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAocm93QWN0aW9uVHJpZ2dlcmVkKT1cIm9uUm93QWN0aW9uVHJpZ2dlcmVkKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zdGF0ZS1jYXJkIHJwdC1lbXB0eS1zdGF0ZVwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj5ObyByZXBvcnQgZGVmaW5pdGlvbiBhdmFpbGFibGUuPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBNYXN0ZXItRGV0YWlsIFNsaWRlLU92ZXIgRHJhd2VyIC0tPlxuICAgICAgQGlmIChpc0RyYXdlck9wZW4oKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJycHQtZHJhd2VyLWJhY2tkcm9wXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VEcmF3ZXIoKVwiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8YXNpZGVcbiAgICAgICAgICBjbGFzcz1cInJwdC1kcmF3ZXItcGFuZWxcIlxuICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRyYXdlclRpdGxlKClcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJkcmF3ZXJXaWR0aCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gRHJhd2VyIEhlYWRlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyYXdlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInJwdC1kcmF3ZXItdGl0bGVcIj57eyBkcmF3ZXJUaXRsZSgpIH19PC9oMz5cbiAgICAgICAgICAgICAgICBAaWYgKGRyYXdlckNvbnRleHRCYWRnZSgpKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1kcmF3ZXItYmFkZ2VcIiBbdGl0bGVdPVwiZHJhd2VyQ29udGV4dEJhZGdlKCkhXCI+e3sgZHJhd2VyQ29udGV4dEJhZGdlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChkcmF3ZXJEZWZpbml0aW9uKCk/LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtZHJhd2VyLWRlc2NcIj57eyBkcmF3ZXJEZWZpbml0aW9uKCk/LmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyYXdlci1jbG9zZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VEcmF3ZXIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBkZXRhaWxzXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBkcmF3ZXIgKEVzYylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEcmF3ZXIgQm9keSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyYXdlci1ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKGlzRHJhd2VyTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZHJhd2VyLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1zdGF0ZS10ZXh0XCI+e3sgZHJhd2VyTG9hZGluZ01lc3NhZ2UoKSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChkcmF3ZXJFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMjhcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIGxvYWQgZGV0YWlsczwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1zdGF0ZS10ZXh0XCI+e3sgZHJhd2VyRXJyb3IoKSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnlEcmF3ZXIoKVwiPlJldHJ5PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoZHJhd2VyRGVmaW5pdGlvbigpKSB7XG4gICAgICAgICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRyYXdlckRlZmluaXRpb24oKSFcIlxuICAgICAgICAgICAgICAgIFtpbml0aWFsVmFsdWVzXT1cImRyYXdlclBhcmFtZXRlcnMoKVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VsdERhdGFdPVwiZHJhd2VyUmVzdWx0RGF0YSgpXCJcbiAgICAgICAgICAgICAgICAoZXhlY3V0ZVJlcXVlc3RlZCk9XCJvbkRyYXdlckV4ZWN1dGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGV4cG9ydFJlcXVlc3RlZCk9XCJvbkV4cG9ydFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocHJpbnRSZXF1ZXN0ZWQpPVwib25QcmludFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY3VzdG9tQWN0aW9uVHJpZ2dlcmVkKT1cIm9uQ3VzdG9tQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChyb3dBY3Rpb25UcmlnZ2VyZWQpPVwib25Sb3dBY3Rpb25UcmlnZ2VyZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYXNpZGU+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtcnVudGltZS1jb250YWluZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICAucnB0LXN0YXRlLWNhcmQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIG1hcmdpbjogMjRweCAwO1xuICAgIH1cbiAgICAucnB0LXN0YXRlLXRleHQge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1iYXNlLCAwLjg3NXJlbSk7XG4gICAgICBtYXJnaW46IDhweCAwIDAgMDtcbiAgICB9XG4gICAgLnJwdC1lcnJvci10aXRsZSB7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgICAgbWFyZ2luOiA4cHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgIH1cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDM2cHg7XG4gICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNwaW4gODAwbXMgbGluZWFyIGluZmluaXRlO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHJwdC1zcGluIHtcbiAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxuICAgIH1cbiAgICAucnB0LXJldHJ5LWJ0biB7XG4gICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LWludmVyc2UsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LXJldHJ5LWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ0ZWQ4O1xuICAgIH1cblxuICAgIC8qIFNsaWRlLW92ZXIgRGV0YWlsIERyYXdlciAqL1xuICAgIC5ycHQtZHJhd2VyLWJhY2tkcm9wIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjQ1KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xuICAgICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcbiAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICBhbmltYXRpb246IHJwdC1mYWRlLWluIDE4MG1zIGVhc2Utb3V0IGZvcndhcmRzO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgbWF4LXdpZHRoOiA5NXZ3O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmZmZmZmYpO1xuICAgICAgYm94LXNoYWRvdzogLTEycHggMCA0MHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xNik7XG4gICAgICB6LWluZGV4OiAxMDAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbmltYXRpb246IHJwdC1zbGlkZS1pbi1yaWdodCAyNDBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkcztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXItc3VidGxlLCAjZTJlOGYwKTtcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KFtkaXI9XCJydGxcIl0pIC5ycHQtZHJhd2VyLXBhbmVsIHtcbiAgICAgIHJpZ2h0OiBhdXRvO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGJveC1zaGFkb3c6IDhweCAwIDMycHggcmdiYSgxNSwgMjMsIDQyLCAwLjIpO1xuICAgICAgYW5pbWF0aW9uLW5hbWU6IHJwdC1zbGlkZS1pbi1sZWZ0O1xuICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1mYWRlLWluIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1zbGlkZS1pbi1yaWdodCB7XG4gICAgICBmcm9tIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOyB9XG4gICAgICB0byB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfVxuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNsaWRlLWluLWxlZnQge1xuICAgICAgZnJvbSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7IH1cbiAgICAgIHRvIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmc6IDE2cHggMjBweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1oZWFkZXItbGVmdCB7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLXRpdGxlLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1iYWRnZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItZGVzYyB7XG4gICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiA0cHggMCAwIDA7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItY2xvc2UtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDMycHg7XG4gICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1jbG9zZS1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1sb2FkaW5nIHtcbiAgICAgIG1hcmdpbjogNDhweCBhdXRvO1xuICAgICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0UnVudGltZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2VBZGFwdGVyID0gaW5qZWN0KFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlQWRhcHRlciA9IGluamVjdChSZXBvcnREYXRhU291cmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uU2VydmljZSA9IGluamVjdChSZXBvcnRFeGVjdXRpb25TZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKiBSZXBvcnQgSUQgdG8gbG9hZCB2aWEgcGVyc2lzdGVuY2UgYWRhcHRlciAqL1xuICByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvKiogRGlyZWN0bHkgcGFzc2VkIHJlcG9ydCBkZWZpbml0aW9uIChza2lwcyBwZXJzaXN0ZW5jZSBhZGFwdGVyKSAqL1xuICByZWFkb25seSBkZWZpbml0aW9uID0gaW5wdXQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwsIHsgYWxpYXM6ICdyZXBvcnQnIH0pO1xuXG4gIHJlYWRvbmx5IHJlc2V0UmVxdWVzdGVkID0gb3V0cHV0PHsgZGVmaW5pdGlvbjogUmVwb3J0RGVmaW5pdGlvbiB9PigpO1xuICByZWFkb25seSBleHBvcnRSZXF1ZXN0ZWQgPSBvdXRwdXQ8e1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGRhdGE6IHVua25vd25bXSB8IG51bGw7XG4gIH0+KCk7XG4gIHJlYWRvbmx5IHByaW50UmVxdWVzdGVkID0gb3V0cHV0PHtcbiAgICBycHRGaWxlTmFtZT86IHN0cmluZztcbiAgICBleHBvcnRUeXBlPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PigpO1xuICByZWFkb25seSBjdXN0b21BY3Rpb25UcmlnZ2VyZWQgPSBvdXRwdXQ8e1xuICAgIGFjdGlvbjogQ29tcG9uZW50QWN0aW9uRGVmaW5pdGlvbjtcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGdyaWRTdGF0ZUNoYW5nZSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IGNvbHVtbkRlZnNDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZWQgPSBvdXRwdXQ8YW55W10+KCk7XG4gIHJlYWRvbmx5IHJvd0FjdGlvblRyaWdnZXJlZCA9IG91dHB1dDx7XG4gICAgYWN0aW9uOiBHcmlkUm93Q2xpY2tBY3Rpb247XG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZHJpbGxkb3duUmVxdWVzdGVkID0gb3V0cHV0PHtcbiAgICB0YXJnZXRSZXBvcnRJZDogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+KCk7XG5cbiAgcmVhZG9ubHkgaW50ZXJuYWxEZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgcmVzdWx0RGF0YSA9IHNpZ25hbDx1bmtub3duW10gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ01lc3NhZ2UgPSBzaWduYWw8c3RyaW5nPignTG9hZGluZyByZXBvcnQuLi4nKTtcbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFNsaWRlLW92ZXIgRHJhd2VyIFNpZ25hbHNcbiAgcmVhZG9ubHkgaXNEcmF3ZXJPcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgZHJhd2VyVGl0bGUgPSBzaWduYWw8c3RyaW5nPignUmVwb3J0IERldGFpbHMnKTtcbiAgcmVhZG9ubHkgZHJhd2VyV2lkdGggPSBzaWduYWw8c3RyaW5nPignNzYwcHgnKTtcbiAgcmVhZG9ubHkgZHJhd2VyRGVmaW5pdGlvbiA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRyYXdlclBhcmFtZXRlcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcbiAgcmVhZG9ubHkgZHJhd2VyUmVzdWx0RGF0YSA9IHNpZ25hbDx1bmtub3duW10gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZHJhd2VyQ29udGV4dEJhZGdlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBpc0RyYXdlckxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkcmF3ZXJMb2FkaW5nTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmc+KCdMb2FkaW5nIGRyaWxsLWRvd24gZGV0YWlscy4uLicpO1xuICByZWFkb25seSBkcmF3ZXJFcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBQcml2YXRlIHRyYWNrZXJzIGZvciBkcmF3ZXIgcmV0cnlcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3ZXJUYXJnZXRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aXZlRHJhd2VyUm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIGFjdGl2ZURyYXdlckFjdGlvbj86IEdyaWRSb3dDbGlja0FjdGlvbjtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpID8/IHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uKCk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgICAgIGlmIChpZCAmJiAhdGhpcy5kZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJhd2VyT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJhd2VyKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFJlcG9ydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgcmVwb3J0IFwiJHtpZH1cIi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnTG9hZGluZyByZXBvcnQgZGVmaW5pdGlvbi4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQoaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uLnNldChkZWYpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgICBlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBsb2FkIHJlcG9ydCBkZWZpbml0aW9uIHdpdGggSUQ6ICR7aWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhlY3V0ZVJlcG9ydChldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBncmlkID0gZXZlbnQuZGVmaW5pdGlvbi5ncmlkO1xuICAgIGlmICghZ3JpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSB0aGlzLmV4ZWN1dGlvblNlcnZpY2UuZ2V0TWlzc2luZ0ZpZWxkcyhldmVudC5kZWZpbml0aW9uLCBldmVudC5wYXJhbWV0ZXJzKTtcbiAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KGBNaXNzaW5nIHJlcXVpcmVkIGZpbHRlciB2YWx1ZXM6ICR7bWlzc2luZy5qb2luKCcsICcpfS4gUGxlYXNlIGVudGVyIHZhbHVlcyB0byBydW4uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZS5zZXQoJ0V4ZWN1dGluZyByZXBvcnQgcXVlcnkuLi4nKTtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgICAgdGhpcy5leGVjdXRpb25TZXJ2aWNlLmV4ZWN1dGUoZXZlbnQuZGVmaW5pdGlvbiwgZXZlbnQucGFyYW1ldGVycykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSBldmVudC5kZWZpbml0aW9uLmRhdGFTb3VyY2VzLmZpbmQoXG4gICAgICAoZCkgPT4gZC5pZCA9PT0gZ3JpZC5kYXRhU291cmNlSWQgfHwgZC5uYW1lID09PSBncmlkLmRhdGFTb3VyY2VJZFxuICAgICkgfHwgZXZlbnQuZGVmaW5pdGlvbi5kYXRhU291cmNlc1swXTtcblxuICAgIGlmICghZHMpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYERhdGEgc291cmNlIFwiJHtncmlkLmRhdGFTb3VyY2VJZH1cIiByZWZlcmVuY2VkIGJ5IGdyaWQgbm90IGZvdW5kIGluIHJlcG9ydCBkZWZpbml0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLmV2ZW50LnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZUFkYXB0ZXIuZXhlY3V0ZShkcywgZXhlY3V0aW9uUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHREYXRhLnNldChkYXRhKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICAgZXJyPy5tZXNzYWdlID8/ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgcmVwb3J0IGRhdGEgc291cmNlLidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblJlc2V0UmVwb3J0KGV2ZW50OiB7IGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24gfSk6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0RGF0YS5zZXQobnVsbCk7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KG51bGwpO1xuICAgIHRoaXMucmVzZXRSZXF1ZXN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkV4cG9ydFJlcXVlc3RlZChldmVudDoge1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIGZpbGVOYW1lPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGRhdGE6IHVua25vd25bXSB8IG51bGw7XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmV4cG9ydFJlcXVlc3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uUHJpbnRSZXF1ZXN0ZWQoZXZlbnQ6IHtcbiAgICBycHRGaWxlTmFtZT86IHN0cmluZztcbiAgICBleHBvcnRUeXBlPzogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5wcmludFJlcXVlc3RlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ3VzdG9tQWN0aW9uKGV2ZW50OiB7XG4gICAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb25EZWZpbml0aW9uO1xuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuY3VzdG9tQWN0aW9uVHJpZ2dlcmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2Uocm93czogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHJvd3MpO1xuICB9XG5cbiAgb25Sb3dBY3Rpb25UcmlnZ2VyZWQoZXZlbnQ6IHtcbiAgICBhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbjtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dBY3Rpb25UcmlnZ2VyZWQuZW1pdChldmVudCk7XG5cbiAgICBpZiAoZXZlbnQuYWN0aW9uLnRhcmdldFJlcG9ydElkKSB7XG4gICAgICB0aGlzLmRyaWxsZG93blJlcXVlc3RlZC5lbWl0KHtcbiAgICAgICAgdGFyZ2V0UmVwb3J0SWQ6IGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCxcbiAgICAgICAgcGFyYW1ldGVyczogZXZlbnQucGFyYW1ldGVycyxcbiAgICAgICAgcm93OiBldmVudC5yb3csXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuYWN0aW9uLnR5cGUgPT09ICdvcGVuLWRyYXdlcicgfHwgZXZlbnQuYWN0aW9uLnR5cGUgPT09ICdkcmlsbGRvd24tcmVwb3J0Jykge1xuICAgICAgaWYgKGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCkge1xuICAgICAgICB0aGlzLm9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgICAgICAgZXZlbnQuYWN0aW9uLnRhcmdldFJlcG9ydElkLFxuICAgICAgICAgIGV2ZW50LnBhcmFtZXRlcnMsXG4gICAgICAgICAgZXZlbnQucm93LFxuICAgICAgICAgIGV2ZW50LmFjdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgdGFyZ2V0UmVwb3J0SWQ6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGFjdGlvbj86IEdyaWRSb3dDbGlja0FjdGlvblxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZURyYXdlclRhcmdldElkID0gdGFyZ2V0UmVwb3J0SWQ7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXJSb3cgPSByb3c7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXJBY3Rpb24gPSBhY3Rpb247XG5cbiAgICB0aGlzLmRyYXdlclBhcmFtZXRlcnMuc2V0KHBhcmFtZXRlcnMpO1xuICAgIHRoaXMuZHJhd2VyV2lkdGguc2V0KGFjdGlvbj8uZHJhd2VyV2lkdGggfHwgJzc2MHB4Jyk7XG4gICAgdGhpcy5kcmF3ZXJUaXRsZS5zZXQoYWN0aW9uPy5kcmF3ZXJUaXRsZSB8fCAnUmVwb3J0IERldGFpbHMnKTtcbiAgICB0aGlzLmRyYXdlclJlc3VsdERhdGEuc2V0KG51bGwpO1xuICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQobnVsbCk7XG4gICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZHJhd2VyTG9hZGluZ01lc3NhZ2Uuc2V0KCdMb2FkaW5nIGRyaWxsLWRvd24gZGV0YWlscy4uLicpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuLnNldCh0cnVlKTtcblxuICAgIC8vIENvbXB1dGUgZnJpZW5kbHkgY29udGV4dCBiYWRnZVxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwgJiYgdiAhPT0gJycpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhZGdlVGV4dCA9IGVudHJpZXMuc2xpY2UoMCwgMikubWFwKChbaywgdl0pID0+IGAke2t9OiAke3Z9YCkuam9pbignIHwgJyk7XG4gICAgICB0aGlzLmRyYXdlckNvbnRleHRCYWRnZS5zZXQoYmFkZ2VUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kcmF3ZXJDb250ZXh0QmFkZ2Uuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZUFkYXB0ZXIpIHtcbiAgICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgZHJpbGwtZG93biByZXBvcnQgXCIke3RhcmdldFJlcG9ydElkfVwiLmBcbiAgICAgICk7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQodGFyZ2V0UmVwb3J0SWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQoZGVmKTtcbiAgICAgICAgaWYgKCFhY3Rpb24/LmRyYXdlclRpdGxlKSB7XG4gICAgICAgICAgdGhpcy5kcmF3ZXJUaXRsZS5zZXQoZGVmLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF1dG8tZXhlY3V0ZSB0YXJnZXQgY2hpbGQgcmVwb3J0XG4gICAgICAgIHRoaXMuZXhlY3V0ZURyYXdlclJlcG9ydChkZWYsIHBhcmFtZXRlcnMpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KFxuICAgICAgICAgIGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIGxvYWQgZHJpbGxkb3duIHJlcG9ydCBcIiR7dGFyZ2V0UmVwb3J0SWR9XCJgXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlRHJhd2VyUmVwb3J0KFxuICAgIGRlZjogUmVwb3J0RGVmaW5pdGlvbixcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlZi5ncmlkKSB7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuZHJhd2VyTG9hZGluZ01lc3NhZ2Uuc2V0KCdGZXRjaGluZyBkcmlsbC1kb3duIGRhdGEuLi4nKTtcbiAgICAgIHRoaXMuZXhlY3V0aW9uU2VydmljZS5leGVjdXRlKGRlZiwgcGFyYW1ldGVycykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmRyYXdlclJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcbiAgICAgICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSBkZWYuZGF0YVNvdXJjZXMuZmluZChcbiAgICAgIChkKSA9PiBkLmlkID09PSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkIHx8IGQubmFtZSA9PT0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZFxuICAgICkgfHwgZGVmLmRhdGFTb3VyY2VzWzBdO1xuXG4gICAgaWYgKCFkcyB8fCAhdGhpcy5kYXRhU291cmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uZ2V0Q3VycmVudFNlc3Npb25Db250ZXh0KCkgPz8ge307XG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0geyAuLi5zZXNzaW9uLCAuLi5wYXJhbWV0ZXJzIH07XG5cbiAgICB0aGlzLmRhdGFTb3VyY2VBZGFwdGVyLmV4ZWN1dGUoZHMsIGV4ZWN1dGlvblBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyUmVzdWx0RGF0YS5zZXQoZGF0YSk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3ZXJFcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/ICdGYWlsZWQgdG8gZXhlY3V0ZSBkcmlsbC1kb3duIGRhdGEgc291cmNlLicpO1xuICAgICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRHJhd2VyRXhlY3V0ZShldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWN1dGVEcmF3ZXJSZXBvcnQoZXZlbnQuZGVmaW5pdGlvbiwgZXZlbnQucGFyYW1ldGVycyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZVByZXNzZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEcmF3ZXJPcGVuKCkpIHtcbiAgICAgIHRoaXMuY2xvc2VEcmF3ZXIoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZURyYXdlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJhd2VyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmF3ZXJSZXN1bHREYXRhLnNldChudWxsKTtcbiAgICB0aGlzLmRyYXdlckVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHJldHJ5RHJhd2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZURyYXdlclRhcmdldElkKSB7XG4gICAgICB0aGlzLm9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgICAgIHRoaXMuYWN0aXZlRHJhd2VyVGFyZ2V0SWQsXG4gICAgICAgIHRoaXMuZHJhd2VyUGFyYW1ldGVycygpLFxuICAgICAgICB0aGlzLmFjdGl2ZURyYXdlclJvdyxcbiAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXJBY3Rpb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0cnkoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
526
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFxVHBFLE1BQU0sT0FBTyxzQkFBc0I7SUFDaEIsUUFBUSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztJQUNwQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFF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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0dULG02R0F2R1MsWUFBWSwrQkFBRSx3QkFBd0IsNlVBQUUsZ0JBQWdCOzs0RkFnVHZELHNCQUFzQjtrQkFuVGxDLFNBQVM7K0JBQ0UsaUNBQWlDLGNBQy9CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQyxZQUN6RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0dULG1CQXVNZ0IsdUJBQXVCLENBQUMsTUFBTTt3REEwSC9DLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBbVNyQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwb3J0UmVxdWVzdFNjb3BlIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9yZXBvcnQtcmVxdWVzdC1zY29wZSc7XG5pbXBvcnQgeyBub3JtYWxpemVSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50QWN0aW9uRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2NvbXBvbmVudC1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkUm93Q2xpY2tBY3Rpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL2RhdGEtc291cmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1yZW5kZXJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRFeGVjdXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9yZXBvcnQtZXhlY3V0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcmVwb3J0LXJ1bnRpbWUsIHJwdC1ydW50aW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHluYW1pY1JlbmRlcmVyQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJ1bnRpbWUtY29udGFpbmVyXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtbG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMzJcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIHJ1biByZXBvcnQ8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeSgpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChjdXJyZW50RGVmaW5pdGlvbigpKSB7XG4gICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgIFtkZWZpbml0aW9uXT1cImN1cnJlbnREZWZpbml0aW9uKCkhXCJcbiAgICAgICAgICBbcmVzdWx0RGF0YV09XCJyZXN1bHREYXRhKClcIlxuICAgICAgICAgIChleGVjdXRlUmVxdWVzdGVkKT1cIm9uRXhlY3V0ZVJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAocmVzZXRSZXF1ZXN0ZWQpPVwib25SZXNldFJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAoZXhwb3J0UmVxdWVzdGVkKT1cIm9uRXhwb3J0UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgIChwcmludFJlcXVlc3RlZCk9XCJvblByaW50UmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgIChjdXN0b21BY3Rpb25UcmlnZ2VyZWQpPVwib25DdXN0b21BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgKGdyaWRTdGF0ZUNoYW5nZWQpPVwiZ3JpZFN0YXRlQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbHVtbkRlZnNDaGFuZ2VkKT1cImNvbHVtbkRlZnNDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAocm93QWN0aW9uVHJpZ2dlcmVkKT1cIm9uUm93QWN0aW9uVHJpZ2dlcmVkKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zdGF0ZS1jYXJkIHJwdC1lbXB0eS1zdGF0ZVwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj5ObyByZXBvcnQgZGVmaW5pdGlvbiBhdmFpbGFibGUuPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBNYXN0ZXItRGV0YWlsIFNsaWRlLU92ZXIgRHJhd2VyIC0tPlxuICAgICAgQGlmIChpc0RyYXdlck9wZW4oKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJycHQtZHJhd2VyLWJhY2tkcm9wXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VEcmF3ZXIoKVwiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgICA8YXNpZGVcbiAgICAgICAgICBjbGFzcz1cInJwdC1kcmF3ZXItcGFuZWxcIlxuICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRyYXdlclRpdGxlKClcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJkcmF3ZXJXaWR0aCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gRHJhd2VyIEhlYWRlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyYXdlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZHJhd2VyLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInJwdC1kcmF3ZXItdGl0bGVcIj57eyBkcmF3ZXJUaXRsZSgpIH19PC9oMz5cbiAgICAgICAgICAgICAgICBAaWYgKGRyYXdlckNvbnRleHRCYWRnZSgpKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1kcmF3ZXItYmFkZ2VcIiBbdGl0bGVdPVwiZHJhd2VyQ29udGV4dEJhZGdlKCkhXCI+e3sgZHJhd2VyQ29udGV4dEJhZGdlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChkcmF3ZXJEZWZpbml0aW9uKCk/LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJycHQtZHJhd2VyLWRlc2NcIj57eyBkcmF3ZXJEZWZpbml0aW9uKCk/LmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWRyYXdlci1jbG9zZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VEcmF3ZXIoKVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBkZXRhaWxzXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBkcmF3ZXIgKEVzYylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEcmF3ZXIgQm9keSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWRyYXdlci1ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKGlzRHJhd2VyTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZHJhd2VyLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1zdGF0ZS10ZXh0XCI+e3sgZHJhd2VyTG9hZGluZ01lc3NhZ2UoKSB9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChkcmF3ZXJFcnJvcigpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMjhcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIGxvYWQgZGV0YWlsczwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInJwdC1zdGF0ZS10ZXh0XCI+e3sgZHJhd2VyRXJyb3IoKSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1yZXRyeS1idG5cIiAoY2xpY2spPVwicmV0cnlEcmF3ZXIoKVwiPlJldHJ5PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoZHJhd2VyRGVmaW5pdGlvbigpKSB7XG4gICAgICAgICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRyYXdlckRlZmluaXRpb24oKSFcIlxuICAgICAgICAgICAgICAgIFtpbml0aWFsVmFsdWVzXT1cImRyYXdlclBhcmFtZXRlcnMoKVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VsdERhdGFdPVwiZHJhd2VyUmVzdWx0RGF0YSgpXCJcbiAgICAgICAgICAgICAgICAoZXhlY3V0ZVJlcXVlc3RlZCk9XCJvbkRyYXdlckV4ZWN1dGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGV4cG9ydFJlcXVlc3RlZCk9XCJvbkV4cG9ydFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocHJpbnRSZXF1ZXN0ZWQpPVwib25QcmludFJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY3VzdG9tQWN0aW9uVHJpZ2dlcmVkKT1cIm9uQ3VzdG9tQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChyb3dBY3Rpb25UcmlnZ2VyZWQpPVwib25Sb3dBY3Rpb25UcmlnZ2VyZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYXNpZGU+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtcnVudGltZS1jb250YWluZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICAucnB0LXN0YXRlLWNhcmQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA0OHB4IDI0cHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIG1hcmdpbjogMjRweCAwO1xuICAgIH1cbiAgICAucnB0LXN0YXRlLXRleHQge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1iYXNlLCAwLjg3NXJlbSk7XG4gICAgICBtYXJnaW46IDhweCAwIDAgMDtcbiAgICB9XG4gICAgLnJwdC1lcnJvci10aXRsZSB7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgICAgbWFyZ2luOiA4cHggMCAwIDA7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgIH1cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDM2cHg7XG4gICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNwaW4gODAwbXMgbGluZWFyIGluZmluaXRlO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHJwdC1zcGluIHtcbiAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxuICAgIH1cbiAgICAucnB0LXJldHJ5LWJ0biB7XG4gICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDE2cHg7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LWludmVyc2UsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAucnB0LXJldHJ5LWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ0ZWQ4O1xuICAgIH1cblxuICAgIC8qIFNsaWRlLW92ZXIgRGV0YWlsIERyYXdlciAqL1xuICAgIC5ycHQtZHJhd2VyLWJhY2tkcm9wIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMjMsIDQyLCAwLjQ1KTtcbiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xuICAgICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcbiAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICBhbmltYXRpb246IHJwdC1mYWRlLWluIDE4MG1zIGVhc2Utb3V0IGZvcndhcmRzO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgbWF4LXdpZHRoOiA5NXZ3O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmZmZmZmYpO1xuICAgICAgYm94LXNoYWRvdzogLTEycHggMCA0MHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xNik7XG4gICAgICB6LWluZGV4OiAxMDAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbmltYXRpb246IHJwdC1zbGlkZS1pbi1yaWdodCAyNDBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkcztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXItc3VidGxlLCAjZTJlOGYwKTtcbiAgICB9XG5cbiAgICA6aG9zdC1jb250ZXh0KFtkaXI9XCJydGxcIl0pIC5ycHQtZHJhd2VyLXBhbmVsIHtcbiAgICAgIHJpZ2h0OiBhdXRvO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGJveC1zaGFkb3c6IDhweCAwIDMycHggcmdiYSgxNSwgMjMsIDQyLCAwLjIpO1xuICAgICAgYW5pbWF0aW9uLW5hbWU6IHJwdC1zbGlkZS1pbi1sZWZ0O1xuICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1mYWRlLWluIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB9XG4gICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1zbGlkZS1pbi1yaWdodCB7XG4gICAgICBmcm9tIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOyB9XG4gICAgICB0byB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfVxuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNsaWRlLWluLWxlZnQge1xuICAgICAgZnJvbSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7IH1cbiAgICAgIHRvIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmc6IDE2cHggMjBweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1oZWFkZXItbGVmdCB7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLXRpdGxlLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1iYWRnZSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItZGVzYyB7XG4gICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiA0cHggMCAwIDA7XG4gICAgfVxuXG4gICAgLnJwdC1kcmF3ZXItY2xvc2UtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDMycHg7XG4gICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1jbG9zZS1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cblxuICAgIC5ycHQtZHJhd2VyLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICB9XG5cbiAgICAucnB0LWRyYXdlci1sb2FkaW5nIHtcbiAgICAgIG1hcmdpbjogNDhweCBhdXRvO1xuICAgICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0UnVudGltZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdHMgPSBuZXcgUmVwb3J0UmVxdWVzdFNjb3BlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc2lzdGVuY2VBZGFwdGVyID0gaW5qZWN0KFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlQWRhcHRlciA9IGluamVjdChSZXBvcnREYXRhU291cmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uU2VydmljZSA9IGluamVjdChSZXBvcnRFeGVjdXRpb25TZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIC8qKiBSZXBvcnQgSUQgdG8gbG9hZCB2aWEgcGVyc2lzdGVuY2UgYWRhcHRlciAqL1xuICByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvKiogRGlyZWN0bHkgcGFzc2VkIHJlcG9ydCBkZWZpbml0aW9uIChza2lwcyBwZXJzaXN0ZW5jZSBhZGFwdGVyKSAqL1xuICByZWFkb25seSBkZWZpbml0aW9uID0gaW5wdXQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwsIHsgYWxpYXM6ICdyZXBvcnQnIH0pO1xuXG4gIC8qKiBPcHRpb25hbCBwcmUtbG9hZGVkIG9yIGNhbnZhcy1zaGFyZWQgcmVzdWx0IGRhdGEgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbERhdGEgPSBpbnB1dDx1bmtub3duW10gfCBudWxsPihudWxsLCB7IGFsaWFzOiAncmVzdWx0RGF0YScgfSk7XG5cbiAgcmVhZG9ubHkgcmVzZXRSZXF1ZXN0ZWQgPSBvdXRwdXQ8eyBkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uIH0+KCk7XG4gIHJlYWRvbmx5IGV4ZWN1dGUgPSBvdXRwdXQ8e1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZGF0YTogdW5rbm93bltdIHwgbnVsbDtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZXhlY3V0ZWQgPSBvdXRwdXQ8e1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZGF0YTogdW5rbm93bltdIHwgbnVsbDtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZXhwb3J0UmVxdWVzdGVkID0gb3V0cHV0PHtcbiAgICBmb3JtYXQ6IHN0cmluZztcbiAgICBmaWxlTmFtZT86IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBkYXRhOiB1bmtub3duW10gfCBudWxsO1xuICB9PigpO1xuICByZWFkb25seSBwcmludFJlcXVlc3RlZCA9IG91dHB1dDx7XG4gICAgcnB0RmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgZXhwb3J0VHlwZT86IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgY3VzdG9tQWN0aW9uVHJpZ2dlcmVkID0gb3V0cHV0PHtcbiAgICBhY3Rpb246IENvbXBvbmVudEFjdGlvbkRlZmluaXRpb247XG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PigpO1xuICByZWFkb25seSBncmlkU3RhdGVDaGFuZ2UgPSBvdXRwdXQ8YW55PigpO1xuICByZWFkb25seSBjb2x1bW5EZWZzQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PGFueVtdPigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2VkID0gb3V0cHV0PGFueVtdPigpO1xuICByZWFkb25seSByb3dBY3Rpb25UcmlnZ2VyZWQgPSBvdXRwdXQ8e1xuICAgIGFjdGlvbjogR3JpZFJvd0NsaWNrQWN0aW9uO1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+KCk7XG4gIHJlYWRvbmx5IGRyaWxsZG93blJlcXVlc3RlZCA9IG91dHB1dDx7XG4gICAgdGFyZ2V0UmVwb3J0SWQ6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PigpO1xuXG4gIHJlYWRvbmx5IGludGVybmFsRGVmaW5pdGlvbiA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlc3VsdERhdGEgPSBzaWduYWw8dW5rbm93bltdIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmdNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJ0xvYWRpbmcgcmVwb3J0Li4uJyk7XG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBTbGlkZS1vdmVyIERyYXdlciBTaWduYWxzXG4gIHJlYWRvbmx5IGlzRHJhd2VyT3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRyYXdlclRpdGxlID0gc2lnbmFsPHN0cmluZz4oJ1JlcG9ydCBEZXRhaWxzJyk7XG4gIHJlYWRvbmx5IGRyYXdlcldpZHRoID0gc2lnbmFsPHN0cmluZz4oJzc2MHB4Jyk7XG4gIHJlYWRvbmx5IGRyYXdlckRlZmluaXRpb24gPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkcmF3ZXJQYXJhbWV0ZXJzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG4gIHJlYWRvbmx5IGRyYXdlclJlc3VsdERhdGEgPSBzaWduYWw8dW5rbm93bltdIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRyYXdlckNvbnRleHRCYWRnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgaXNEcmF3ZXJMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgZHJhd2VyTG9hZGluZ01lc3NhZ2UgPSBzaWduYWw8c3RyaW5nPignTG9hZGluZyBkcmlsbC1kb3duIGRldGFpbHMuLi4nKTtcbiAgcmVhZG9ubHkgZHJhd2VyRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gUHJpdmF0ZSB0cmFja2VycyBmb3IgZHJhd2VyIHJldHJ5XG4gIHByaXZhdGUgYWN0aXZlRHJhd2VyVGFyZ2V0SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFjdGl2ZURyYXdlclJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3ZXJBY3Rpb24/OiBHcmlkUm93Q2xpY2tBY3Rpb247XG5cbiAgcmVhZG9ubHkgY3VycmVudERlZmluaXRpb24gPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZWZpbml0aW9uKCkgPz8gdGhpcy5pbnRlcm5hbERlZmluaXRpb24oKTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICB0cnkgeyByZXR1cm4gbm9ybWFsaXplUmVwb3J0RGVmaW5pdGlvbih2YWx1ZSk7IH0gY2F0Y2ggeyByZXR1cm4gbnVsbDsgfVxuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0cy5jb250ZXh0KCk7XG4gICAgICB0aGlzLmRlZmluaXRpb24oKTsgdGhpcy5yZXBvcnRJZCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHsgdGhpcy5yZXF1ZXN0cy5jYW5jZWxBbGwoKTsgdGhpcy5yZXN1bHREYXRhLnNldChudWxsKTsgdGhpcy5pbnRlcm5hbERlZmluaXRpb24uc2V0KG51bGwpOyB0aGlzLmNsb3NlRHJhd2VyKCk7IH0pO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRlZmluaXRpb24oKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0cnkgeyBub3JtYWxpemVSZXBvcnREZWZpbml0aW9uKHZhbHVlKTsgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KG51bGwpOyB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB0aGlzLmVycm9yTWVzc2FnZS5zZXQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTsgfVxuICAgICAgfVxuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICAgICAgaWYgKGlkICYmICF0aGlzLmRlZmluaXRpb24oKSkge1xuICAgICAgICAgIHRoaXMubG9hZFJlcG9ydChpZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5pbml0aWFsRGF0YSgpO1xuICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJhd2VyT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJhd2VyKCk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFJlcG9ydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0cy5jYW5jZWwoJ2V4ZWN1dGlvbicpOyB0aGlzLnJlc3VsdERhdGEuc2V0KG51bGwpO1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZUFkYXB0ZXIpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYFJlcG9ydCBwZXJzaXN0ZW5jZSBhZGFwdGVyIG5vdCBwcm92aWRlZCB0byBsb2FkIHJlcG9ydCBcIiR7aWR9XCIuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5sb2FkaW5nTWVzc2FnZS5zZXQoJ0xvYWRpbmcgcmVwb3J0IGRlZmluaXRpb24uLi4nKTtcbiAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQobnVsbCk7XG5cbiAgICB0aGlzLnJlcXVlc3RzLnJ1bignZGVmaW5pdGlvbicsICgpID0+IHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyIS5sb2FkKGlkKS5waXBlKG1hcChub3JtYWxpemVSZXBvcnREZWZpbml0aW9uKSksXG4gICAgICAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uLnNldChkZWYpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICAgIGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIGxvYWQgcmVwb3J0IGRlZmluaXRpb24gd2l0aCBJRDogJHtpZH1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSk7XG4gIH1cblxuICBvbkV4ZWN1dGVSZXBvcnQoZXZlbnQ6IHtcbiAgICBkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0cy5jYW5jZWwoJ2V4ZWN1dGlvbicpO1xuICAgIGNvbnN0IGdyaWQgPSBldmVudC5kZWZpbml0aW9uLmdyaWQ7XG4gICAgaWYgKCFncmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXhlY3V0aW9uU2VydmljZSkge1xuICAgICAgY29uc3QgbWlzc2luZyA9IHRoaXMuZXhlY3V0aW9uU2VydmljZS5nZXRNaXNzaW5nRmllbGRzKGV2ZW50LmRlZmluaXRpb24sIGV2ZW50LnBhcmFtZXRlcnMpO1xuICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoYE1pc3NpbmcgcmVxdWlyZWQgZmlsdGVyIHZhbHVlczogJHttaXNzaW5nLmpvaW4oJywgJyl9LiBQbGVhc2UgZW50ZXIgdmFsdWVzIHRvIHJ1bi5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KG51bGwpO1xuXG4gICAgICB0aGlzLnJlcXVlc3RzLnJ1bignZXhlY3V0aW9uJywgKCkgPT4gdGhpcy5leGVjdXRpb25TZXJ2aWNlIS5leGVjdXRlKGV2ZW50LmRlZmluaXRpb24sIGV2ZW50LnBhcmFtZXRlcnMpLFxuICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc3VsdERhdGEuc2V0KGRhdGEpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5leGVjdXRlLmVtaXQoeyBkZWZpbml0aW9uOiBldmVudC5kZWZpbml0aW9uLCBwYXJhbWV0ZXJzOiBldmVudC5wYXJhbWV0ZXJzLCBkYXRhIH0pO1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZWQuZW1pdCh7IGRlZmluaXRpb246IGV2ZW50LmRlZmluaXRpb24sIHBhcmFtZXRlcnM6IGV2ZW50LnBhcmFtZXRlcnMsIGRhdGEgfSk7XG4gICAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHMgPSBldmVudC5kZWZpbml0aW9uLmRhdGFTb3VyY2VzLmZpbmQoXG4gICAgICAoZCkgPT4gZC5pZCA9PT0gZ3JpZC5kYXRhU291cmNlSWQgfHwgZC5uYW1lID09PSBncmlkLmRhdGFTb3VyY2VJZFxuICAgICkgfHwgZXZlbnQuZGVmaW5pdGlvbi5kYXRhU291cmNlc1swXTtcblxuICAgIGlmICghZHMpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYERhdGEgc291cmNlIFwiJHtncmlkLmRhdGFTb3VyY2VJZH1cIiByZWZlcmVuY2VkIGJ5IGdyaWQgbm90IGZvdW5kIGluIHJlcG9ydCBkZWZpbml0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLmV2ZW50LnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMucmVxdWVzdHMucnVuKCdleGVjdXRpb24nLCAoKSA9PiB0aGlzLmRhdGFTb3VyY2VBZGFwdGVyIS5leGVjdXRlKGRzLCBleGVjdXRpb25QYXJhbXMpLFxuICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHREYXRhLnNldChkYXRhKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5leGVjdXRlLmVtaXQoeyBkZWZpbml0aW9uOiBldmVudC5kZWZpbml0aW9uLCBwYXJhbWV0ZXJzOiBldmVudC5wYXJhbWV0ZXJzLCBkYXRhIH0pO1xuICAgICAgICB0aGlzLmV4ZWN1dGVkLmVtaXQoeyBkZWZpbml0aW9uOiBldmVudC5kZWZpbml0aW9uLCBwYXJhbWV0ZXJzOiBldmVudC5wYXJhbWV0ZXJzLCBkYXRhIH0pO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICAgIGVycj8ubWVzc2FnZSA/PyAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHJlcG9ydCBkYXRhIHNvdXJjZS4nXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKSk7XG4gIH1cblxuICBvblJlc2V0UmVwb3J0KGV2ZW50OiB7IGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24gfSk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdHMuY2FuY2VsKCdleGVjdXRpb24nKTtcbiAgICB0aGlzLnJlc3VsdERhdGEuc2V0KG51bGwpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcbiAgICB0aGlzLnJlc2V0UmVxdWVzdGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25FeHBvcnRSZXF1ZXN0ZWQoZXZlbnQ6IHtcbiAgICBmb3JtYXQ6IHN0cmluZztcbiAgICBmaWxlTmFtZT86IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBkYXRhOiB1bmtub3duW10gfCBudWxsO1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5leHBvcnRSZXF1ZXN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvblByaW50UmVxdWVzdGVkKGV2ZW50OiB7XG4gICAgcnB0RmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgZXhwb3J0VHlwZT86IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMucHJpbnRSZXF1ZXN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkN1c3RvbUFjdGlvbihldmVudDoge1xuICAgIGFjdGlvbjogQ29tcG9uZW50QWN0aW9uRGVmaW5pdGlvbjtcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLmN1c3RvbUFjdGlvblRyaWdnZXJlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHJvd3M6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChyb3dzKTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdChyb3dzKTtcbiAgfVxuXG4gIG9uUm93QWN0aW9uVHJpZ2dlcmVkKGV2ZW50OiB7XG4gICAgYWN0aW9uOiBHcmlkUm93Q2xpY2tBY3Rpb247XG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMucm93QWN0aW9uVHJpZ2dlcmVkLmVtaXQoZXZlbnQpO1xuXG4gICAgaWYgKGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCkge1xuICAgICAgdGhpcy5kcmlsbGRvd25SZXF1ZXN0ZWQuZW1pdCh7XG4gICAgICAgIHRhcmdldFJlcG9ydElkOiBldmVudC5hY3Rpb24udGFyZ2V0UmVwb3J0SWQsXG4gICAgICAgIHBhcmFtZXRlcnM6IGV2ZW50LnBhcmFtZXRlcnMsXG4gICAgICAgIHJvdzogZXZlbnQucm93LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmFjdGlvbi50eXBlID09PSAnb3Blbi1kcmF3ZXInIHx8IGV2ZW50LmFjdGlvbi50eXBlID09PSAnZHJpbGxkb3duLXJlcG9ydCcpIHtcbiAgICAgIGlmIChldmVudC5hY3Rpb24udGFyZ2V0UmVwb3J0SWQpIHtcbiAgICAgICAgdGhpcy5vcGVuRHJpbGxkb3duRHJhd2VyKFxuICAgICAgICAgIGV2ZW50LmFjdGlvbi50YXJnZXRSZXBvcnRJZCxcbiAgICAgICAgICBldmVudC5wYXJhbWV0ZXJzLFxuICAgICAgICAgIGV2ZW50LnJvdyxcbiAgICAgICAgICBldmVudC5hY3Rpb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvcGVuRHJpbGxkb3duRHJhd2VyKFxuICAgIHRhcmdldFJlcG9ydElkOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBhY3Rpb24/OiBHcmlkUm93Q2xpY2tBY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0cy5jYW5jZWwoJ2RyYXdlci1sb2FkJyk7IHRoaXMucmVxdWVzdHMuY2FuY2VsKCdkcmF3ZXItZXhlY3V0aW9uJyk7XG4gICAgdGhpcy5hY3RpdmVEcmF3ZXJUYXJnZXRJZCA9IHRhcmdldFJlcG9ydElkO1xuICAgIHRoaXMuYWN0aXZlRHJhd2VyUm93ID0gcm93O1xuICAgIHRoaXMuYWN0aXZlRHJhd2VyQWN0aW9uID0gYWN0aW9uO1xuXG4gICAgdGhpcy5kcmF3ZXJQYXJhbWV0ZXJzLnNldChwYXJhbWV0ZXJzKTtcbiAgICB0aGlzLmRyYXdlcldpZHRoLnNldChhY3Rpb24/LmRyYXdlcldpZHRoIHx8ICc3NjBweCcpO1xuICAgIHRoaXMuZHJhd2VyVGl0bGUuc2V0KGFjdGlvbj8uZHJhd2VyVGl0bGUgfHwgJ1JlcG9ydCBEZXRhaWxzJyk7XG4gICAgdGhpcy5kcmF3ZXJSZXN1bHREYXRhLnNldChudWxsKTtcbiAgICB0aGlzLmRyYXdlckRlZmluaXRpb24uc2V0KG51bGwpO1xuICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmRyYXdlckxvYWRpbmdNZXNzYWdlLnNldCgnTG9hZGluZyBkcmlsbC1kb3duIGRldGFpbHMuLi4nKTtcbiAgICB0aGlzLmlzRHJhd2VyT3Blbi5zZXQodHJ1ZSk7XG5cbiAgICAvLyBDb21wdXRlIGZyaWVuZGx5IGNvbnRleHQgYmFkZ2VcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykuZmlsdGVyKChbXywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsICYmIHYgIT09ICcnKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYWRnZVRleHQgPSBlbnRyaWVzLnNsaWNlKDAsIDIpLm1hcCgoW2ssIHZdKSA9PiBgJHtrfTogJHt2fWApLmpvaW4oJyB8ICcpO1xuICAgICAgdGhpcy5kcmF3ZXJDb250ZXh0QmFkZ2Uuc2V0KGJhZGdlVGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJhd2VyQ29udGV4dEJhZGdlLnNldChudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmRyYXdlckVycm9yLnNldChcbiAgICAgICAgYFJlcG9ydCBwZXJzaXN0ZW5jZSBhZGFwdGVyIG5vdCBwcm92aWRlZCB0byBsb2FkIGRyaWxsLWRvd24gcmVwb3J0IFwiJHt0YXJnZXRSZXBvcnRJZH1cIi5gXG4gICAgICApO1xuICAgICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3RzLnJ1bignZHJhd2VyLWxvYWQnLCAoKSA9PiB0aGlzLnBlcnNpc3RlbmNlQWRhcHRlciEubG9hZCh0YXJnZXRSZXBvcnRJZCkucGlwZShtYXAobm9ybWFsaXplUmVwb3J0RGVmaW5pdGlvbikpLFxuICAgICAgKGRlZikgPT4ge1xuICAgICAgICB0aGlzLmRyYXdlckRlZmluaXRpb24uc2V0KGRlZik7XG4gICAgICAgIGlmICghYWN0aW9uPy5kcmF3ZXJUaXRsZSkge1xuICAgICAgICAgIHRoaXMuZHJhd2VyVGl0bGUuc2V0KGRlZi5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdXRvLWV4ZWN1dGUgdGFyZ2V0IGNoaWxkIHJlcG9ydFxuICAgICAgICB0aGlzLmV4ZWN1dGVEcmF3ZXJSZXBvcnQoZGVmLCBwYXJhbWV0ZXJzKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyRXJyb3Iuc2V0KFxuICAgICAgICAgIGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIGxvYWQgZHJpbGxkb3duIHJlcG9ydCBcIiR7dGFyZ2V0UmVwb3J0SWR9XCJgXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4geyBpZiAoIXRoaXMucmVxdWVzdHMuaXNBY3RpdmUoJ2RyYXdlci1leGVjdXRpb24nKSkgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTsgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVEcmF3ZXJSZXBvcnQoXG4gICAgZGVmOiBSZXBvcnREZWZpbml0aW9uLFxuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdHMuY2FuY2VsKCdkcmF3ZXItZXhlY3V0aW9uJyk7XG4gICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KHRydWUpOyB0aGlzLmRyYXdlckVycm9yLnNldChudWxsKTtcbiAgICBpZiAoIWRlZi5ncmlkKSB7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMuZHJhd2VyTG9hZGluZ01lc3NhZ2Uuc2V0KCdGZXRjaGluZyBkcmlsbC1kb3duIGRhdGEuLi4nKTtcbiAgICAgIHRoaXMucmVxdWVzdHMucnVuKCdkcmF3ZXItZXhlY3V0aW9uJywgKCkgPT4gdGhpcy5leGVjdXRpb25TZXJ2aWNlIS5leGVjdXRlKGRlZiwgcGFyYW1ldGVycyksXG4gICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgIHRoaXMuZHJhd2VyUmVzdWx0RGF0YS5zZXQoZGF0YSk7XG4gICAgICAgICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmRyYXdlckVycm9yLnNldChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuICAgICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAoKSA9PiB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkcyA9IGRlZi5kYXRhU291cmNlcy5maW5kKFxuICAgICAgKGQpID0+IGQuaWQgPT09IGRlZi5ncmlkPy5kYXRhU291cmNlSWQgfHwgZC5uYW1lID09PSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkXG4gICAgKSB8fCBkZWYuZGF0YVNvdXJjZXNbMF07XG5cbiAgICBpZiAoIWRzIHx8ICF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmlzRHJhd2VyTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMucmVxdWVzdHMucnVuKCdkcmF3ZXItZXhlY3V0aW9uJywgKCkgPT4gdGhpcy5kYXRhU291cmNlQWRhcHRlciEuZXhlY3V0ZShkcywgZXhlY3V0aW9uUGFyYW1zKSxcbiAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd2VyUmVzdWx0RGF0YS5zZXQoZGF0YSk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICB0aGlzLmRyYXdlckVycm9yLnNldChlcnI/Lm1lc3NhZ2UgPz8gJ0ZhaWxlZCB0byBleGVjdXRlIGRyaWxsLWRvd24gZGF0YSBzb3VyY2UuJyk7XG4gICAgICAgIHRoaXMuaXNEcmF3ZXJMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKSk7XG4gIH1cblxuICBvbkRyYXdlckV4ZWN1dGUoZXZlbnQ6IHtcbiAgICBkZWZpbml0aW9uOiBSZXBvcnREZWZpbml0aW9uO1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogdm9pZCB7XG4gICAgdGhpcy5leGVjdXRlRHJhd2VyUmVwb3J0KGV2ZW50LmRlZmluaXRpb24sIGV2ZW50LnBhcmFtZXRlcnMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGVQcmVzc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRHJhd2VyT3BlbigpKSB7XG4gICAgICB0aGlzLmNsb3NlRHJhd2VyKCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VEcmF3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZXF1ZXN0cy5jYW5jZWwoJ2RyYXdlci1sb2FkJyk7IHRoaXMucmVxdWVzdHMuY2FuY2VsKCdkcmF3ZXItZXhlY3V0aW9uJyk7XG4gICAgdGhpcy5pc0RyYXdlckxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmlzRHJhd2VyT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZHJhd2VyRGVmaW5pdGlvbi5zZXQobnVsbCk7XG4gICAgdGhpcy5kcmF3ZXJSZXN1bHREYXRhLnNldChudWxsKTtcbiAgICB0aGlzLmRyYXdlckVycm9yLnNldChudWxsKTtcbiAgfVxuXG4gIHJldHJ5RHJhd2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZURyYXdlclRhcmdldElkKSB7XG4gICAgICB0aGlzLm9wZW5EcmlsbGRvd25EcmF3ZXIoXG4gICAgICAgIHRoaXMuYWN0aXZlRHJhd2VyVGFyZ2V0SWQsXG4gICAgICAgIHRoaXMuZHJhd2VyUGFyYW1ldGVycygpLFxuICAgICAgICB0aGlzLmFjdGl2ZURyYXdlclJvdyxcbiAgICAgICAgdGhpcy5hY3RpdmVEcmF3ZXJBY3Rpb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0cnkoKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=