bways-report 0.1.6 → 0.1.7

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 (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +43 -2
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4053 -840
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +4 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -0,0 +1,204 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, effect, inject, input, output, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { ReportStoreService } from '../persistence/services/report-store.service';
5
+ import { RptReportComponent } from '../runtime/rpt-report.component';
6
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * `<bways-report-page>`
10
+ *
11
+ * Drop-in standalone component that loads a saved report by its slug (or ID)
12
+ * and renders the complete interactive live form, data filters, and grid.
13
+ *
14
+ * Usage:
15
+ * ```html
16
+ * <!-- By slug (recommended) -->
17
+ * <bways-report-page slug="sale-report" />
18
+ *
19
+ * <!-- Or pass parameters & overrides -->
20
+ * <bways-report-page
21
+ * [slug]="currentSlug"
22
+ * [parameters]="{ BranchId: 5 }"
23
+ * [showExport]="true"
24
+ * (rowClick)="onRowSelected($event)"
25
+ * />
26
+ * ```
27
+ */
28
+ export class BwaysReportPageComponent {
29
+ store = inject(ReportStoreService);
30
+ destroyRef = inject(DestroyRef);
31
+ /** Report slug (e.g. 'sale-report') or unique ID */
32
+ slug = input(undefined);
33
+ /** Alternative alias for ID or slug */
34
+ id = input(undefined);
35
+ /** Explicit in-memory ReportDefinition if already loaded */
36
+ report = input(null);
37
+ /** Default input parameter values for the report */
38
+ parameters = input({});
39
+ /** Whether to show export controls (Excel, CSV, Print) */
40
+ showExport = input(true);
41
+ /** Whether to enable saved view presets */
42
+ enablePresets = input(true);
43
+ /** Whether to automatically execute the query when the page opens */
44
+ autoExecute = input(true);
45
+ /** Container width */
46
+ width = input('100%');
47
+ /** Container height */
48
+ height = input('100%');
49
+ // Outputs
50
+ rowClick = output();
51
+ dataLoaded = output();
52
+ selectionChange = output();
53
+ selectionChanged = output();
54
+ // Internal states
55
+ loading = signal(false);
56
+ error = signal(null);
57
+ reportDefinition = signal(null);
58
+ constructor() {
59
+ effect(() => {
60
+ // If an explicit report object is passed, use it directly
61
+ const directDef = this.report();
62
+ if (directDef) {
63
+ this.reportDefinition.set(directDef);
64
+ this.loading.set(false);
65
+ this.error.set(null);
66
+ return;
67
+ }
68
+ const identifier = this.slug() || this.id();
69
+ if (identifier) {
70
+ this.fetchReport(identifier);
71
+ }
72
+ else {
73
+ this.reportDefinition.set(null);
74
+ this.loading.set(false);
75
+ }
76
+ }, { allowSignalWrites: true });
77
+ }
78
+ reloadReport() {
79
+ const identifier = this.slug() || this.id();
80
+ if (identifier) {
81
+ this.fetchReport(identifier, true);
82
+ }
83
+ }
84
+ fetchReport(identifier, force = false) {
85
+ this.loading.set(true);
86
+ this.error.set(null);
87
+ this.store
88
+ .loadReportBySlug(identifier, force)
89
+ .pipe(takeUntilDestroyed(this.destroyRef))
90
+ .subscribe({
91
+ next: (def) => {
92
+ this.reportDefinition.set(def);
93
+ this.loading.set(false);
94
+ },
95
+ error: (err) => {
96
+ this.error.set(err?.message || `Could not find report "${identifier}".`);
97
+ this.loading.set(false);
98
+ },
99
+ });
100
+ }
101
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
102
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BwaysReportPageComponent, isStandalone: true, selector: "bways-report-page", inputs: { slug: { classPropertyName: "slug", publicName: "slug", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", selectionChange: "selectionChange", selectionChanged: "selectionChanged" }, ngImport: i0, template: `
103
+ <div
104
+ class="rpt-page-container"
105
+ [style.width]="width()"
106
+ [style.height]="height()"
107
+ >
108
+ @if (loading()) {
109
+ <div class="rpt-page-loading">
110
+ <div class="rpt-spinner"></div>
111
+ <p>Loading report definition...</p>
112
+ </div>
113
+ } @else if (error()) {
114
+ <div class="rpt-page-error">
115
+ <div class="rpt-error-box">
116
+ <rpt-icon name="alert-circle" [size]="24" class="rpt-error-icon" />
117
+ <div class="rpt-error-content">
118
+ <h3>Report Not Available</h3>
119
+ <p>{{ error() }}</p>
120
+ <button
121
+ type="button"
122
+ class="rpt-retry-btn"
123
+ (click)="reloadReport()"
124
+ >
125
+ Retry
126
+ </button>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ } @else if (reportDefinition()) {
131
+ <div class="rpt-page-body">
132
+ <rpt-report
133
+ [report]="reportDefinition()!"
134
+ [parameters]="parameters()"
135
+ [showExport]="showExport()"
136
+ [enablePresets]="enablePresets()"
137
+ [autoExecute]="autoExecute()"
138
+ (rowClick)="rowClick.emit($event)"
139
+ (dataLoaded)="dataLoaded.emit($event)"
140
+ (selectionChange)="selectionChange.emit($event)"
141
+ (selectionChanged)="selectionChanged.emit($event)"
142
+ />
143
+ </div>
144
+ } @else {
145
+ <div class="rpt-page-empty">
146
+ <p>Please provide a valid report slug or ID.</p>
147
+ </div>
148
+ }
149
+ </div>
150
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-page-container{display:flex;flex-direction:column;position:relative;box-sizing:border-box;overflow:auto;background:var(--rpt-page-bg, #ffffff)}.rpt-page-body{display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box}.rpt-page-loading,.rpt-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--rpt-text-muted, #64748b);font-size:.875rem;min-height:200px}.rpt-spinner{width:32px;height:32px;border:3px solid #e2e8f0;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-page-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-page-spin{to{transform:rotate(360deg)}}.rpt-page-error{display:flex;align-items:center;justify-content:center;padding:40px 20px}.rpt-error-box{display:flex;align-items:flex-start;gap:16px;max-width:500px;padding:20px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;color:#991b1b}.rpt-error-icon{color:#ef4444;flex-shrink:0;margin-top:2px}.rpt-error-content h3{margin:0 0 6px;font-size:.95rem;font-weight:600}.rpt-error-content p{margin:0 0 12px;font-size:.835rem;color:#7f1d1d}.rpt-retry-btn{padding:5px 12px;background:#fff;border:1px solid #fca5a5;color:#b91c1c;border-radius:6px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-retry-btn:hover{background:#fee2e2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptReportComponent, selector: "rpt-report, rpt-view", inputs: ["id", "report", "parameters", "showExport", "enablePresets", "autoExecute"], outputs: ["rowClick", "dataLoaded", "gridStateChange", "selectionChange", "selectionChanged", "presetSaved", "presetChange", "exportRequested", "printRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
151
+ }
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportPageComponent, decorators: [{
153
+ type: Component,
154
+ args: [{ selector: 'bways-report-page', standalone: true, imports: [CommonModule, RptReportComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
155
+ <div
156
+ class="rpt-page-container"
157
+ [style.width]="width()"
158
+ [style.height]="height()"
159
+ >
160
+ @if (loading()) {
161
+ <div class="rpt-page-loading">
162
+ <div class="rpt-spinner"></div>
163
+ <p>Loading report definition...</p>
164
+ </div>
165
+ } @else if (error()) {
166
+ <div class="rpt-page-error">
167
+ <div class="rpt-error-box">
168
+ <rpt-icon name="alert-circle" [size]="24" class="rpt-error-icon" />
169
+ <div class="rpt-error-content">
170
+ <h3>Report Not Available</h3>
171
+ <p>{{ error() }}</p>
172
+ <button
173
+ type="button"
174
+ class="rpt-retry-btn"
175
+ (click)="reloadReport()"
176
+ >
177
+ Retry
178
+ </button>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ } @else if (reportDefinition()) {
183
+ <div class="rpt-page-body">
184
+ <rpt-report
185
+ [report]="reportDefinition()!"
186
+ [parameters]="parameters()"
187
+ [showExport]="showExport()"
188
+ [enablePresets]="enablePresets()"
189
+ [autoExecute]="autoExecute()"
190
+ (rowClick)="rowClick.emit($event)"
191
+ (dataLoaded)="dataLoaded.emit($event)"
192
+ (selectionChange)="selectionChange.emit($event)"
193
+ (selectionChanged)="selectionChanged.emit($event)"
194
+ />
195
+ </div>
196
+ } @else {
197
+ <div class="rpt-page-empty">
198
+ <p>Please provide a valid report slug or ID.</p>
199
+ </div>
200
+ }
201
+ </div>
202
+ `, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-page-container{display:flex;flex-direction:column;position:relative;box-sizing:border-box;overflow:auto;background:var(--rpt-page-bg, #ffffff)}.rpt-page-body{display:flex;flex-direction:column;width:100%;height:100%;box-sizing:border-box}.rpt-page-loading,.rpt-page-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;color:var(--rpt-text-muted, #64748b);font-size:.875rem;min-height:200px}.rpt-spinner{width:32px;height:32px;border:3px solid #e2e8f0;border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-page-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-page-spin{to{transform:rotate(360deg)}}.rpt-page-error{display:flex;align-items:center;justify-content:center;padding:40px 20px}.rpt-error-box{display:flex;align-items:flex-start;gap:16px;max-width:500px;padding:20px;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;color:#991b1b}.rpt-error-icon{color:#ef4444;flex-shrink:0;margin-top:2px}.rpt-error-content h3{margin:0 0 6px;font-size:.95rem;font-weight:600}.rpt-error-content p{margin:0 0 12px;font-size:.835rem;color:#7f1d1d}.rpt-retry-btn{padding:5px 12px;background:#fff;border:1px solid #fca5a5;color:#b91c1c;border-radius:6px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-retry-btn:hover{background:#fee2e2}\n"] }]
203
+ }], ctorParameters: () => [] });
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYndheXMtcmVwb3J0LXBhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvYndheXMtcmVwb3J0LXBhZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7QUFHdkY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFnS0gsTUFBTSxPQUFPLHdCQUF3QjtJQUNsQixLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbkMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxvREFBb0Q7SUFDM0MsSUFBSSxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFckQsdUNBQXVDO0lBQzlCLEVBQUUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRW5ELDREQUE0RDtJQUNuRCxNQUFNLEdBQUcsS0FBSyxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUV2RCxvREFBb0Q7SUFDM0MsVUFBVSxHQUFHLEtBQUssQ0FBMEIsRUFBRSxDQUFDLENBQUM7SUFFekQsMERBQTBEO0lBQ2pELFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFFM0MsMkNBQTJDO0lBQ2xDLGFBQWEsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFFOUMscUVBQXFFO0lBQzVELFdBQVcsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFFNUMsc0JBQXNCO0lBQ2IsS0FBSyxHQUFHLEtBQUssQ0FBUyxNQUFNLENBQUMsQ0FBQztJQUV2Qyx1QkFBdUI7SUFDZCxNQUFNLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBRXhDLFVBQVU7SUFDRCxRQUFRLEdBQUcsTUFBTSxFQUl0QixDQUFDO0lBQ0ksVUFBVSxHQUFHLE1BQU0sRUFBYSxDQUFDO0lBQ2pDLGVBQWUsR0FBRyxNQUFNLEVBQVMsQ0FBQztJQUNsQyxnQkFBZ0IsR0FBRyxNQUFNLEVBQVMsQ0FBQztJQUU1QyxrQkFBa0I7SUFDVCxPQUFPLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLEtBQUssR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ3BDLGdCQUFnQixHQUFHLE1BQU0sQ0FBMEIsSUFBSSxDQUFDLENBQUM7SUFFbEU7UUFDRSxNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsMERBQTBEO1lBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzVDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxVQUFrQixFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJCLElBQUksQ0FBQyxLQUFLO2FBQ1AsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQzthQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDWixHQUFHLEVBQUUsT0FBTyxJQUFJLDBCQUEwQixVQUFVLElBQUksQ0FDekQsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0FoR1Usd0JBQXdCOzRGQUF4Qix3QkFBd0IsMDFDQTFKekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVCw4OUNBbERTLFlBQVksK0JBQUUsa0JBQWtCLDBUQUFFLGdCQUFnQjs7NEZBNEpqRCx3QkFBd0I7a0JBL0pwQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzVDLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBScHRSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi9ydW50aW1lL3JwdC1yZXBvcnQuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JpZFJvd0NsaWNrQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuXG4vKipcbiAqIGA8YndheXMtcmVwb3J0LXBhZ2U+YFxuICpcbiAqIERyb3AtaW4gc3RhbmRhbG9uZSBjb21wb25lbnQgdGhhdCBsb2FkcyBhIHNhdmVkIHJlcG9ydCBieSBpdHMgc2x1ZyAob3IgSUQpXG4gKiBhbmQgcmVuZGVycyB0aGUgY29tcGxldGUgaW50ZXJhY3RpdmUgbGl2ZSBmb3JtLCBkYXRhIGZpbHRlcnMsIGFuZCBncmlkLlxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPCEtLSBCeSBzbHVnIChyZWNvbW1lbmRlZCkgLS0+XG4gKiA8YndheXMtcmVwb3J0LXBhZ2Ugc2x1Zz1cInNhbGUtcmVwb3J0XCIgLz5cbiAqXG4gKiA8IS0tIE9yIHBhc3MgcGFyYW1ldGVycyAmIG92ZXJyaWRlcyAtLT5cbiAqIDxid2F5cy1yZXBvcnQtcGFnZVxuICogICBbc2x1Z109XCJjdXJyZW50U2x1Z1wiXG4gKiAgIFtwYXJhbWV0ZXJzXT1cInsgQnJhbmNoSWQ6IDUgfVwiXG4gKiAgIFtzaG93RXhwb3J0XT1cInRydWVcIlxuICogICAocm93Q2xpY2spPVwib25Sb3dTZWxlY3RlZCgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYndheXMtcmVwb3J0LXBhZ2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBScHRSZXBvcnRDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJwdC1wYWdlLWNvbnRhaW5lclwiXG4gICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodCgpXCJcbiAgICA+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXBhZ2UtbG9hZGluZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiPjwvZGl2PlxuICAgICAgICAgIDxwPkxvYWRpbmcgcmVwb3J0IGRlZmluaXRpb24uLi48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAoZXJyb3IoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXBhZ2UtZXJyb3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWJveFwiPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJhbGVydC1jaXJjbGVcIiBbc2l6ZV09XCIyNFwiIGNsYXNzPVwicnB0LWVycm9yLWljb25cIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1lcnJvci1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxoMz5SZXBvcnQgTm90IEF2YWlsYWJsZTwvaDM+XG4gICAgICAgICAgICAgIDxwPnt7IGVycm9yKCkgfX08L3A+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1yZXRyeS1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWRSZXBvcnQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZXRyeVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKHJlcG9ydERlZmluaXRpb24oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXBhZ2UtYm9keVwiPlxuICAgICAgICAgIDxycHQtcmVwb3J0XG4gICAgICAgICAgICBbcmVwb3J0XT1cInJlcG9ydERlZmluaXRpb24oKSFcIlxuICAgICAgICAgICAgW3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCJcbiAgICAgICAgICAgIFtzaG93RXhwb3J0XT1cInNob3dFeHBvcnQoKVwiXG4gICAgICAgICAgICBbZW5hYmxlUHJlc2V0c109XCJlbmFibGVQcmVzZXRzKClcIlxuICAgICAgICAgICAgW2F1dG9FeGVjdXRlXT1cImF1dG9FeGVjdXRlKClcIlxuICAgICAgICAgICAgKHJvd0NsaWNrKT1cInJvd0NsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZGF0YUxvYWRlZCk9XCJkYXRhTG9hZGVkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGlvbkNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZWQpPVwic2VsZWN0aW9uQ2hhbmdlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcGFnZS1lbXB0eVwiPlxuICAgICAgICAgIDxwPlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgcmVwb3J0IHNsdWcgb3IgSUQuPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtcGFnZS1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtcGFnZS1iZywgI2ZmZmZmZik7XG4gICAgfVxuXG4gICAgLnJwdC1wYWdlLWJvZHkge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgLnJwdC1wYWdlLWxvYWRpbmcsXG4gICAgLnJwdC1wYWdlLWVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogNjBweCAyMHB4O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBtaW4taGVpZ2h0OiAyMDBweDtcbiAgICB9XG5cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDMycHg7XG4gICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYW5pbWF0aW9uOiBycHQtcGFnZS1zcGluIDAuOHMgbGluZWFyIGluZmluaXRlO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1wYWdlLXNwaW4ge1xuICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gICAgfVxuXG4gICAgLnJwdC1wYWdlLWVycm9yIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1lcnJvci1ib3gge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgZ2FwOiAxNnB4O1xuICAgICAgbWF4LXdpZHRoOiA1MDBweDtcbiAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmMmYyO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGNvbG9yOiAjOTkxYjFiO1xuICAgIH1cblxuICAgIC5ycHQtZXJyb3ItaWNvbiB7XG4gICAgICBjb2xvcjogI2VmNDQ0NDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgIH1cblxuICAgIC5ycHQtZXJyb3ItY29udGVudCBoMyB7XG4gICAgICBtYXJnaW46IDAgMCA2cHggMDtcbiAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuXG4gICAgLnJwdC1lcnJvci1jb250ZW50IHAge1xuICAgICAgbWFyZ2luOiAwIDAgMTJweCAwO1xuICAgICAgZm9udC1zaXplOiAwLjgzNXJlbTtcbiAgICAgIGNvbG9yOiAjN2YxZDFkO1xuICAgIH1cblxuICAgIC5ycHQtcmV0cnktYnRuIHtcbiAgICAgIHBhZGRpbmc6IDVweCAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmY2E1YTU7XG4gICAgICBjb2xvcjogI2I5MWMxYztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1yZXRyeS1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBCd2F5c1JlcG9ydFBhZ2VDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFJlcG9ydFN0b3JlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvKiogUmVwb3J0IHNsdWcgKGUuZy4gJ3NhbGUtcmVwb3J0Jykgb3IgdW5pcXVlIElEICovXG4gIHJlYWRvbmx5IHNsdWcgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLyoqIEFsdGVybmF0aXZlIGFsaWFzIGZvciBJRCBvciBzbHVnICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKiBFeHBsaWNpdCBpbi1tZW1vcnkgUmVwb3J0RGVmaW5pdGlvbiBpZiBhbHJlYWR5IGxvYWRlZCAqL1xuICByZWFkb25seSByZXBvcnQgPSBpbnB1dDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIERlZmF1bHQgaW5wdXQgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHJlcG9ydCAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzID0gaW5wdXQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcblxuICAvKiogV2hldGhlciB0byBzaG93IGV4cG9ydCBjb250cm9scyAoRXhjZWwsIENTViwgUHJpbnQpICovXG4gIHJlYWRvbmx5IHNob3dFeHBvcnQgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvKiogV2hldGhlciB0byBlbmFibGUgc2F2ZWQgdmlldyBwcmVzZXRzICovXG4gIHJlYWRvbmx5IGVuYWJsZVByZXNldHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvKiogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgdGhlIHF1ZXJ5IHdoZW4gdGhlIHBhZ2Ugb3BlbnMgKi9cbiAgcmVhZG9ubHkgYXV0b0V4ZWN1dGUgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAvKiogQ29udGFpbmVyIHdpZHRoICovXG4gIHJlYWRvbmx5IHdpZHRoID0gaW5wdXQ8c3RyaW5nPignMTAwJScpO1xuXG4gIC8qKiBDb250YWluZXIgaGVpZ2h0ICovXG4gIHJlYWRvbmx5IGhlaWdodCA9IGlucHV0PHN0cmluZz4oJzEwMCUnKTtcblxuICAvLyBPdXRwdXRzXG4gIHJlYWRvbmx5IHJvd0NsaWNrID0gb3V0cHV0PHtcbiAgICByb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGFjdGlvbj86IEdyaWRSb3dDbGlja0FjdGlvbjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgZGF0YUxvYWRlZCA9IG91dHB1dDx1bmtub3duW10+KCk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZSA9IG91dHB1dDxhbnlbXT4oKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlZCA9IG91dHB1dDxhbnlbXT4oKTtcblxuICAvLyBJbnRlcm5hbCBzdGF0ZXNcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSByZXBvcnREZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIElmIGFuIGV4cGxpY2l0IHJlcG9ydCBvYmplY3QgaXMgcGFzc2VkLCB1c2UgaXQgZGlyZWN0bHlcbiAgICAgICAgY29uc3QgZGlyZWN0RGVmID0gdGhpcy5yZXBvcnQoKTtcbiAgICAgICAgaWYgKGRpcmVjdERlZikge1xuICAgICAgICAgIHRoaXMucmVwb3J0RGVmaW5pdGlvbi5zZXQoZGlyZWN0RGVmKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldChudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5zbHVnKCkgfHwgdGhpcy5pZCgpO1xuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIHRoaXMuZmV0Y2hSZXBvcnQoaWRlbnRpZmllcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXBvcnREZWZpbml0aW9uLnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICByZWxvYWRSZXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuc2x1ZygpIHx8IHRoaXMuaWQoKTtcbiAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5mZXRjaFJlcG9ydChpZGVudGlmaWVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVwb3J0KGlkZW50aWZpZXI6IHN0cmluZywgZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG5cbiAgICB0aGlzLnN0b3JlXG4gICAgICAubG9hZFJlcG9ydEJ5U2x1ZyhpZGVudGlmaWVyLCBmb3JjZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkZWYpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydERlZmluaXRpb24uc2V0KGRlZik7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoXG4gICAgICAgICAgICBlcnI/Lm1lc3NhZ2UgfHwgYENvdWxkIG5vdCBmaW5kIHJlcG9ydCBcIiR7aWRlbnRpZmllcn1cIi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export { BwaysReportBuilderComponent } from './bways-report-builder.component';
2
+ export { BwaysReportPageComponent } from './bways-report-page.component';
3
+ export { BwaysReportMenuComponent } from './bways-report-menu.component';
4
+ export { injectReportMenu, injectReportMenuGroups, } from './inject-report-menu';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9lbWJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsd0JBQXdCLEVBQTBCLE1BQU0sK0JBQStCLENBQUM7QUFDakcsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixzQkFBc0IsR0FFdkIsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEJ3YXlzUmVwb3J0QnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4vYndheXMtcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50JztcbmV4cG9ydCB7IEJ3YXlzUmVwb3J0UGFnZUNvbXBvbmVudCB9IGZyb20gJy4vYndheXMtcmVwb3J0LXBhZ2UuY29tcG9uZW50JztcbmV4cG9ydCB7IEJ3YXlzUmVwb3J0TWVudUNvbXBvbmVudCwgdHlwZSBSZXBvcnRNZW51VmFyaWFudCB9IGZyb20gJy4vYndheXMtcmVwb3J0LW1lbnUuY29tcG9uZW50JztcbmV4cG9ydCB7XG4gIGluamVjdFJlcG9ydE1lbnUsXG4gIGluamVjdFJlcG9ydE1lbnVHcm91cHMsXG4gIHR5cGUgSW5qZWN0UmVwb3J0TWVudU9wdGlvbnMsXG59IGZyb20gJy4vaW5qZWN0LXJlcG9ydC1tZW51JztcbiJdfQ==
@@ -0,0 +1,99 @@
1
+ import { computed, inject } from '@angular/core';
2
+ import { REPORTING_CONFIG } from '../../core/tokens/reporting-config.token';
3
+ import { ReportStoreService } from '../persistence/services/report-store.service';
4
+ import { groupReportsByCategory } from '../routing/services/report-menu.service';
5
+ /**
6
+ * Injects a reactive signal of published report menu items.
7
+ *
8
+ * Automatically triggers loading of report metadata from the persistence store/endpoint
9
+ * if not already loaded.
10
+ *
11
+ * Usage in component:
12
+ * ```typescript
13
+ * @Component({ ... })
14
+ * export class AppSidebarComponent {
15
+ * readonly reportMenu = injectReportMenu();
16
+ * }
17
+ * ```
18
+ * Usage in template:
19
+ * ```html
20
+ * @for (item of reportMenu(); track item.slug) {
21
+ * <a [routerLink]="item.route">{{ item.name }}</a>
22
+ * }
23
+ * ```
24
+ */
25
+ export function injectReportMenu(options) {
26
+ const store = inject(ReportStoreService);
27
+ const reportingConfig = inject(REPORTING_CONFIG, { optional: true });
28
+ const rawBase = options?.basePath ?? reportingConfig?.routeBase ?? '/reports';
29
+ const cleanBase = rawBase.startsWith('/') ? rawBase : `/${rawBase}`;
30
+ const normalizedBase = cleanBase.endsWith('/') ? cleanBase.slice(0, -1) : cleanBase;
31
+ // Trigger initial fetch if store has not loaded summaries yet
32
+ if (store.summaries().length === 0 && !store.isLoading()) {
33
+ store.loadSummaries().subscribe({
34
+ error: (err) => console.warn('[bways-report] Failed to load menu reports:', err)
35
+ });
36
+ }
37
+ return computed(() => {
38
+ const allSummaries = store.summaries();
39
+ const includeDrafts = options?.includeDrafts === true;
40
+ const visible = includeDrafts
41
+ ? allSummaries
42
+ : allSummaries.filter((s) => s.isPublished !== false);
43
+ const items = visible.map((report) => {
44
+ const category = report.menuGroup || report.category || 'General';
45
+ const slug = report.slug || report.id;
46
+ return {
47
+ id: report.id,
48
+ code: report.id,
49
+ name: report.name,
50
+ category,
51
+ slug,
52
+ menuGroup: report.menuGroup,
53
+ menuOrder: report.menuOrder,
54
+ icon: report.icon,
55
+ route: `${normalizedBase}/${slug}`,
56
+ isDraft: !report.isPublished,
57
+ version: report.version,
58
+ };
59
+ });
60
+ // Sort by menuGroup/category, then by menuOrder, then by name
61
+ return items.sort((a, b) => {
62
+ const groupCompare = (a.menuGroup || a.category).localeCompare(b.menuGroup || b.category);
63
+ if (groupCompare !== 0)
64
+ return groupCompare;
65
+ if (a.menuOrder !== undefined && b.menuOrder !== undefined) {
66
+ return a.menuOrder - b.menuOrder;
67
+ }
68
+ if (a.menuOrder !== undefined)
69
+ return -1;
70
+ if (b.menuOrder !== undefined)
71
+ return 1;
72
+ return a.name.localeCompare(b.name);
73
+ });
74
+ });
75
+ }
76
+ /**
77
+ * Injects a reactive signal of published report menu groups (hierarchical).
78
+ *
79
+ * Useful for sidebars that organize reports under collapsible group headings.
80
+ */
81
+ export function injectReportMenuGroups(options) {
82
+ const store = inject(ReportStoreService);
83
+ const reportingConfig = inject(REPORTING_CONFIG, { optional: true });
84
+ const rawBase = options?.basePath ?? reportingConfig?.routeBase ?? '/reports';
85
+ const cleanBase = rawBase.startsWith('/') ? rawBase : `/${rawBase}`;
86
+ if (store.summaries().length === 0 && !store.isLoading()) {
87
+ store.loadSummaries().subscribe({
88
+ error: (err) => console.warn('[bways-report] Failed to load menu reports:', err)
89
+ });
90
+ }
91
+ return computed(() => {
92
+ const allSummaries = store.summaries();
93
+ const visible = options?.includeDrafts
94
+ ? allSummaries
95
+ : allSummaries.filter((s) => s.isPublished !== false);
96
+ return groupReportsByCategory(visible, cleanBase);
97
+ });
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LXJlcG9ydC1tZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvaW5qZWN0LXJlcG9ydC1tZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRWxGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBbUJqRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFpQztJQUNoRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN6QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVyRSxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLGVBQWUsRUFBRSxTQUFTLElBQUksVUFBVSxDQUFDO0lBQzlFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNwRSxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFcEYsOERBQThEO0lBQzlELElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztRQUN6RCxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzlCLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxHQUFHLENBQUM7U0FDakYsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFtQixHQUFHLEVBQUU7UUFDckMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLE9BQU8sRUFBRSxhQUFhLEtBQUssSUFBSSxDQUFDO1FBRXRELE1BQU0sT0FBTyxHQUFHLGFBQWE7WUFDM0IsQ0FBQyxDQUFDLFlBQVk7WUFDZCxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUV4RCxNQUFNLEtBQUssR0FBcUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3JELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7WUFDbEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNiLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDZixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFFBQVE7Z0JBQ1IsSUFBSTtnQkFDSixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixLQUFLLEVBQUUsR0FBRyxjQUFjLElBQUksSUFBSSxFQUFFO2dCQUNsQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDNUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2FBQ3hCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILDhEQUE4RDtRQUM5RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUYsSUFBSSxZQUFZLEtBQUssQ0FBQztnQkFBRSxPQUFPLFlBQVksQ0FBQztZQUU1QyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25DLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRXhDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFpQztJQUN0RSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN6QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVyRSxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLGVBQWUsRUFBRSxTQUFTLElBQUksVUFBVSxDQUFDO0lBQzlFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVwRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDekQsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUM5QixLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxDQUFDO1NBQ2pGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBb0IsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsYUFBYTtZQUNwQyxDQUFDLENBQUMsWUFBWTtZQUNkLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBRXhELE9BQU8sc0JBQXNCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvcmUvdG9rZW5zL3JlcG9ydGluZy1jb25maWcudG9rZW4nO1xuaW1wb3J0IHsgUmVwb3J0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvcmVwb3J0LXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWVudUdyb3VwLCBSZXBvcnRNZW51SXRlbSB9IGZyb20gJy4uL3JvdXRpbmcvbW9kZWxzL3JlcG9ydC1yb3V0ZS5tb2RlbHMnO1xuaW1wb3J0IHsgZ3JvdXBSZXBvcnRzQnlDYXRlZ29yeSB9IGZyb20gJy4uL3JvdXRpbmcvc2VydmljZXMvcmVwb3J0LW1lbnUuc2VydmljZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYGluamVjdFJlcG9ydE1lbnVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdFJlcG9ydE1lbnVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJhc2Ugcm91dGUgcGF0aCBmb3IgZ2VuZXJhdGVkIGxpbmtzLlxuICAgKiBEZWZhdWx0cyB0byBjb25maWd1cmVkIGByb3V0ZUJhc2VgIChlLmcuICdyZXBvcnRzJykgb3IgJy9yZXBvcnRzJy5cbiAgICovXG4gIGJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZHJhZnQvdW5wdWJsaXNoZWQgcmVwb3J0cy5cbiAgICogRGVmYXVsdDogZmFsc2UgKG9ubHkgcHVibGlzaGVkIHJlcG9ydHMgYXBwZWFyIGluIG1lbnVzKS5cbiAgICovXG4gIGluY2x1ZGVEcmFmdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdHMgYSByZWFjdGl2ZSBzaWduYWwgb2YgcHVibGlzaGVkIHJlcG9ydCBtZW51IGl0ZW1zLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgdHJpZ2dlcnMgbG9hZGluZyBvZiByZXBvcnQgbWV0YWRhdGEgZnJvbSB0aGUgcGVyc2lzdGVuY2Ugc3RvcmUvZW5kcG9pbnRcbiAqIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC5cbiAqXG4gKiBVc2FnZSBpbiBjb21wb25lbnQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsgLi4uIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwU2lkZWJhckNvbXBvbmVudCB7XG4gKiAgIHJlYWRvbmx5IHJlcG9ydE1lbnUgPSBpbmplY3RSZXBvcnRNZW51KCk7XG4gKiB9XG4gKiBgYGBcbiAqIFVzYWdlIGluIHRlbXBsYXRlOlxuICogYGBgaHRtbFxuICogQGZvciAoaXRlbSBvZiByZXBvcnRNZW51KCk7IHRyYWNrIGl0ZW0uc2x1Zykge1xuICogICA8YSBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlXCI+e3sgaXRlbS5uYW1lIH19PC9hPlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RSZXBvcnRNZW51KG9wdGlvbnM/OiBJbmplY3RSZXBvcnRNZW51T3B0aW9ucyk6IFNpZ25hbDxSZXBvcnRNZW51SXRlbVtdPiB7XG4gIGNvbnN0IHN0b3JlID0gaW5qZWN0KFJlcG9ydFN0b3JlU2VydmljZSk7XG4gIGNvbnN0IHJlcG9ydGluZ0NvbmZpZyA9IGluamVjdChSRVBPUlRJTkdfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHJhd0Jhc2UgPSBvcHRpb25zPy5iYXNlUGF0aCA/PyByZXBvcnRpbmdDb25maWc/LnJvdXRlQmFzZSA/PyAnL3JlcG9ydHMnO1xuICBjb25zdCBjbGVhbkJhc2UgPSByYXdCYXNlLnN0YXJ0c1dpdGgoJy8nKSA/IHJhd0Jhc2UgOiBgLyR7cmF3QmFzZX1gO1xuICBjb25zdCBub3JtYWxpemVkQmFzZSA9IGNsZWFuQmFzZS5lbmRzV2l0aCgnLycpID8gY2xlYW5CYXNlLnNsaWNlKDAsIC0xKSA6IGNsZWFuQmFzZTtcblxuICAvLyBUcmlnZ2VyIGluaXRpYWwgZmV0Y2ggaWYgc3RvcmUgaGFzIG5vdCBsb2FkZWQgc3VtbWFyaWVzIHlldFxuICBpZiAoc3RvcmUuc3VtbWFyaWVzKCkubGVuZ3RoID09PSAwICYmICFzdG9yZS5pc0xvYWRpbmcoKSkge1xuICAgIHN0b3JlLmxvYWRTdW1tYXJpZXMoKS5zdWJzY3JpYmUoe1xuICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUud2FybignW2J3YXlzLXJlcG9ydF0gRmFpbGVkIHRvIGxvYWQgbWVudSByZXBvcnRzOicsIGVycilcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZDxSZXBvcnRNZW51SXRlbVtdPigoKSA9PiB7XG4gICAgY29uc3QgYWxsU3VtbWFyaWVzID0gc3RvcmUuc3VtbWFyaWVzKCk7XG4gICAgY29uc3QgaW5jbHVkZURyYWZ0cyA9IG9wdGlvbnM/LmluY2x1ZGVEcmFmdHMgPT09IHRydWU7XG5cbiAgICBjb25zdCB2aXNpYmxlID0gaW5jbHVkZURyYWZ0c1xuICAgICAgPyBhbGxTdW1tYXJpZXNcbiAgICAgIDogYWxsU3VtbWFyaWVzLmZpbHRlcigocykgPT4gcy5pc1B1Ymxpc2hlZCAhPT0gZmFsc2UpO1xuXG4gICAgY29uc3QgaXRlbXM6IFJlcG9ydE1lbnVJdGVtW10gPSB2aXNpYmxlLm1hcCgocmVwb3J0KSA9PiB7XG4gICAgICBjb25zdCBjYXRlZ29yeSA9IHJlcG9ydC5tZW51R3JvdXAgfHwgcmVwb3J0LmNhdGVnb3J5IHx8ICdHZW5lcmFsJztcbiAgICAgIGNvbnN0IHNsdWcgPSByZXBvcnQuc2x1ZyB8fCByZXBvcnQuaWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogcmVwb3J0LmlkLFxuICAgICAgICBjb2RlOiByZXBvcnQuaWQsXG4gICAgICAgIG5hbWU6IHJlcG9ydC5uYW1lLFxuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgbWVudUdyb3VwOiByZXBvcnQubWVudUdyb3VwLFxuICAgICAgICBtZW51T3JkZXI6IHJlcG9ydC5tZW51T3JkZXIsXG4gICAgICAgIGljb246IHJlcG9ydC5pY29uLFxuICAgICAgICByb3V0ZTogYCR7bm9ybWFsaXplZEJhc2V9LyR7c2x1Z31gLFxuICAgICAgICBpc0RyYWZ0OiAhcmVwb3J0LmlzUHVibGlzaGVkLFxuICAgICAgICB2ZXJzaW9uOiByZXBvcnQudmVyc2lvbixcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTb3J0IGJ5IG1lbnVHcm91cC9jYXRlZ29yeSwgdGhlbiBieSBtZW51T3JkZXIsIHRoZW4gYnkgbmFtZVxuICAgIHJldHVybiBpdGVtcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBncm91cENvbXBhcmUgPSAoYS5tZW51R3JvdXAgfHwgYS5jYXRlZ29yeSkubG9jYWxlQ29tcGFyZShiLm1lbnVHcm91cCB8fCBiLmNhdGVnb3J5KTtcbiAgICAgIGlmIChncm91cENvbXBhcmUgIT09IDApIHJldHVybiBncm91cENvbXBhcmU7XG5cbiAgICAgIGlmIChhLm1lbnVPcmRlciAhPT0gdW5kZWZpbmVkICYmIGIubWVudU9yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGEubWVudU9yZGVyIC0gYi5tZW51T3JkZXI7XG4gICAgICB9XG4gICAgICBpZiAoYS5tZW51T3JkZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgICAgaWYgKGIubWVudU9yZGVyICE9PSB1bmRlZmluZWQpIHJldHVybiAxO1xuXG4gICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5qZWN0cyBhIHJlYWN0aXZlIHNpZ25hbCBvZiBwdWJsaXNoZWQgcmVwb3J0IG1lbnUgZ3JvdXBzIChoaWVyYXJjaGljYWwpLlxuICpcbiAqIFVzZWZ1bCBmb3Igc2lkZWJhcnMgdGhhdCBvcmdhbml6ZSByZXBvcnRzIHVuZGVyIGNvbGxhcHNpYmxlIGdyb3VwIGhlYWRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UmVwb3J0TWVudUdyb3VwcyhvcHRpb25zPzogSW5qZWN0UmVwb3J0TWVudU9wdGlvbnMpOiBTaWduYWw8UmVwb3J0TWVudUdyb3VwW10+IHtcbiAgY29uc3Qgc3RvcmUgPSBpbmplY3QoUmVwb3J0U3RvcmVTZXJ2aWNlKTtcbiAgY29uc3QgcmVwb3J0aW5nQ29uZmlnID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3QgcmF3QmFzZSA9IG9wdGlvbnM/LmJhc2VQYXRoID8/IHJlcG9ydGluZ0NvbmZpZz8ucm91dGVCYXNlID8/ICcvcmVwb3J0cyc7XG4gIGNvbnN0IGNsZWFuQmFzZSA9IHJhd0Jhc2Uuc3RhcnRzV2l0aCgnLycpID8gcmF3QmFzZSA6IGAvJHtyYXdCYXNlfWA7XG5cbiAgaWYgKHN0b3JlLnN1bW1hcmllcygpLmxlbmd0aCA9PT0gMCAmJiAhc3RvcmUuaXNMb2FkaW5nKCkpIHtcbiAgICBzdG9yZS5sb2FkU3VtbWFyaWVzKCkuc3Vic2NyaWJlKHtcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tid2F5cy1yZXBvcnRdIEZhaWxlZCB0byBsb2FkIG1lbnUgcmVwb3J0czonLCBlcnIpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29tcHV0ZWQ8UmVwb3J0TWVudUdyb3VwW10+KCgpID0+IHtcbiAgICBjb25zdCBhbGxTdW1tYXJpZXMgPSBzdG9yZS5zdW1tYXJpZXMoKTtcbiAgICBjb25zdCB2aXNpYmxlID0gb3B0aW9ucz8uaW5jbHVkZURyYWZ0c1xuICAgICAgPyBhbGxTdW1tYXJpZXNcbiAgICAgIDogYWxsU3VtbWFyaWVzLmZpbHRlcigocykgPT4gcy5pc1B1Ymxpc2hlZCAhPT0gZmFsc2UpO1xuXG4gICAgcmV0dXJuIGdyb3VwUmVwb3J0c0J5Q2F0ZWdvcnkodmlzaWJsZSwgY2xlYW5CYXNlKTtcbiAgfSk7XG59XG4iXX0=
@@ -3,4 +3,5 @@ export * from './designer';
3
3
  export * from './persistence';
4
4
  export * from './routing';
5
5
  export * from './export';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcnVudGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc2lnbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9yb3V0aW5nJztcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0JztcbiJdfQ==
6
+ export * from './embed';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcnVudGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc2lnbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9yb3V0aW5nJztcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vZW1iZWQnO1xuIl19
@@ -1,5 +1,5 @@
1
1
  import { computed, inject, Injectable, signal, } from '@angular/core';
2
- import { of, tap, throwError } from 'rxjs';
2
+ import { of, tap, throwError, switchMap, catchError } from 'rxjs';
3
3
  import { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';
4
4
  import { SchemaValidatorService } from './schema-validator.service';
5
5
  import * as i0 from "@angular/core";
@@ -34,11 +34,15 @@ export class ReportStoreService {
34
34
  if (!this.adapter) {
35
35
  return of(this.summaries());
36
36
  }
37
+ const list$ = this.adapter.list();
38
+ if (!list$ || typeof list$.pipe !== 'function') {
39
+ return of(this.summaries());
40
+ }
37
41
  this.isLoading.set(true);
38
42
  this.error.set(null);
39
- return this.adapter.list().pipe(tap({
43
+ return list$.pipe(tap({
40
44
  next: (list) => {
41
- this.summaries.set(list);
45
+ this.summaries.set(list || []);
42
46
  this.isLoading.set(false);
43
47
  },
44
48
  error: (err) => {
@@ -81,6 +85,35 @@ export class ReportStoreService {
81
85
  },
82
86
  }));
83
87
  }
88
+ /**
89
+ * Loads a report definition by slug or ID.
90
+ * Resolves from cache, loaded summaries, or adapter.
91
+ */
92
+ loadReportBySlug(slugOrId, forceRefresh = false) {
93
+ const slugLower = slugOrId.toLowerCase().trim();
94
+ // 1. Check in-memory cache if not forcing refresh
95
+ if (!forceRefresh) {
96
+ for (const def of this.cache().values()) {
97
+ if (def.id.toLowerCase() === slugLower ||
98
+ (def.slug && def.slug.toLowerCase() === slugLower)) {
99
+ this.activeReportId.set(def.id);
100
+ return of(def);
101
+ }
102
+ }
103
+ }
104
+ // 2. Check existing summaries
105
+ const matchedSummary = this.summaries().find((s) => s.id.toLowerCase() === slugLower ||
106
+ (s.slug && s.slug.toLowerCase() === slugLower));
107
+ if (matchedSummary) {
108
+ return this.loadReport(matchedSummary.id, forceRefresh);
109
+ }
110
+ // 3. If not found in summaries, refresh summaries first or fallback to loadReport directly
111
+ return this.loadSummaries().pipe(switchMap((list) => {
112
+ const found = list.find((s) => s.id.toLowerCase() === slugLower ||
113
+ (s.slug && s.slug.toLowerCase() === slugLower));
114
+ return this.loadReport(found ? found.id : slugOrId, forceRefresh);
115
+ }), catchError(() => this.loadReport(slugOrId, forceRefresh)));
116
+ }
84
117
  /**
85
118
  * Saves a report definition, validates it, and updates local cache.
86
119
  */
@@ -161,8 +194,13 @@ export class ReportStoreService {
161
194
  id: def.id,
162
195
  name: def.name,
163
196
  description: def.description,
197
+ category: def.category,
198
+ slug: def.slug ?? def.id,
199
+ menuGroup: def.menuGroup,
200
+ menuOrder: def.menuOrder,
201
+ icon: def.icon,
164
202
  version: def.version,
165
- isPublished: !def.metadata?.['isDraft'],
203
+ isPublished: def.isPublished ?? !def.metadata?.['isDraft'],
166
204
  lastModified: new Date().toISOString(),
167
205
  };
168
206
  if (idx >= 0) {
@@ -180,4 +218,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
180
218
  type: Injectable,
181
219
  args: [{ providedIn: 'root' }]
182
220
  }] });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUt2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFFcEU7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNaLE9BQU8sR0FBRyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRCxTQUFTLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFNUQseUNBQXlDO0lBQ2hDLFNBQVMsR0FBRyxNQUFNLENBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRWpELDhEQUE4RDtJQUM3QyxLQUFLLEdBQUcsTUFBTSxDQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFMUUsbUNBQW1DO0lBQzFCLGNBQWMsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXRELDhCQUE4QjtJQUNyQixTQUFTLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTVDLDRCQUE0QjtJQUNuQixLQUFLLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUU3QyxtREFBbUQ7SUFDMUMsWUFBWSxHQUFHLFFBQVEsQ0FBMEIs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QjtrQkFEOUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRhcCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgUmVwb3J0RGVmaW5pdGlvbixcbiAgUmVwb3J0U3VtbWFyeSxcbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3JlcG9ydC1wZXJzaXN0ZW5jZS5jb250cmFjdCc7XG5pbXBvcnQgeyBTY2hlbWFWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi9zY2hlbWEtdmFsaWRhdG9yLnNlcnZpY2UnO1xuXG4vKipcbiAqIFJlcG9ydFN0b3JlU2VydmljZSBtYW5hZ2VzIGFwcGxpY2F0aW9uLXdpZGUgY2FjaGVkIHJlcG9ydCBzdGF0ZXMsXG4gKiBsaXN0aW5nLCBhbmQgcmVhY3RpdmUgYWNjZXNzIHZpYSBBbmd1bGFyIHNpZ25hbHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U3RvcmVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGFwdGVyID0gaW5qZWN0KFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3IgPSBpbmplY3QoU2NoZW1hVmFsaWRhdG9yU2VydmljZSk7XG5cbiAgLyoqIExpc3Qgb2YgYWxsIGtub3duIHJlcG9ydCBzdW1tYXJpZXMgKi9cbiAgcmVhZG9ubHkgc3VtbWFyaWVzID0gc2lnbmFsPFJlcG9ydFN1bW1hcnlbXT4oW10pO1xuXG4gIC8qKiBJbi1tZW1vcnkgY2FjaGUgb2YgbG9hZGVkIGZ1bGwgcmVwb3J0IGRlZmluaXRpb25zIGJ5IElEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBzaWduYWw8TWFwPHN0cmluZywgUmVwb3J0RGVmaW5pdGlvbj4+KG5ldyBNYXAoKSk7XG5cbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCByZXBvcnQgSUQgKi9cbiAgcmVhZG9ubHkgYWN0aXZlUmVwb3J0SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIExvYWRpbmcgc3RhdGUgaW5kaWNhdG9yICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyoqIEN1cnJlbnQgZXJyb3IgbWVzc2FnZSAqL1xuICByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogQWN0aXZlIHJlcG9ydCBkZWZpbml0aW9uIGNvbXB1dGVkIGZyb20gY2FjaGUgKi9cbiAgcmVhZG9ubHkgYWN0aXZlUmVwb3J0ID0gY29tcHV0ZWQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYWN0aXZlUmVwb3J0SWQoKTtcbiAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZSgpLmdldChpZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSByZXBvcnRzLlxuICAgKi9cbiAgbG9hZFN1bW1hcmllcygpOiBPYnNlcnZhYmxlPFJlcG9ydFN1bW1hcnlbXT4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5zdW1tYXJpZXMoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5saXN0KCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6IChsaXN0KSA9PiB7XG4gICAgICAgICAgdGhpcy5zdW1tYXJpZXMuc2V0KGxpc3QpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/ICdGYWlsZWQgdG8gbG9hZCByZXBvcnQgbGlzdC4nKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcmVwb3J0IGRlZmluaXRpb24gYnkgSUQsIHVzaW5nIGNhY2hlZCBpbnN0YW5jZSBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSByZXBvcnRJZCAtIElEIG9mIHRoZSByZXBvcnQgdG8gbG9hZC5cbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIElmIHRydWUsIGJ5cGFzc2VzIHRoZSBpbi1tZW1vcnkgY2FjaGUuXG4gICAqL1xuICBsb2FkUmVwb3J0KHJlcG9ydElkOiBzdHJpbmcsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxSZXBvcnREZWZpbml0aW9uPiB7XG4gICAgaWYgKCFmb3JjZVJlZnJlc2gpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuY2FjaGUoKS5nZXQocmVwb3J0SWQpO1xuICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChyZXBvcnRJZCk7XG4gICAgICAgIHJldHVybiBvZihjYWNoZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ1JlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciBub3QgY29uZmlndXJlZC4nKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5sb2FkKHJlcG9ydElkKS5waXBlKFxuICAgICAgdGFwKHtcbiAgICAgICAgbmV4dDogKGRlZikgPT4ge1xuICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmFzc2VydFZhbGlkKGRlZik7XG4gICAgICAgICAgY29uc3QgbmV4dENhY2hlID0gbmV3IE1hcCh0aGlzLmNhY2hlKCkpO1xuICAgICAgICAgIG5leHRDYWNoZS5zZXQocmVwb3J0SWQsIGRlZik7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChyZXBvcnRJZCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBsb2FkIHJlcG9ydCBcIiR7cmVwb3J0SWR9XCIuYCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHJlcG9ydCBkZWZpbml0aW9uLCB2YWxpZGF0ZXMgaXQsIGFuZCB1cGRhdGVzIGxvY2FsIGNhY2hlLlxuICAgKi9cbiAgc2F2ZVJlcG9ydChyZXBvcnQ6IFJlcG9ydERlZmluaXRpb24pOiBPYnNlcnZhYmxlPFJlcG9ydERlZmluaXRpb24+IHtcbiAgICB0aGlzLnZhbGlkYXRvci5hc3NlcnRWYWxpZChyZXBvcnQpO1xuXG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIC8vIEluLW1lbW9yeSB1cGRhdGUgaWYgbm8gYWRhcHRlciBjb25maWd1cmVkXG4gICAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgICBuZXh0Q2FjaGUuc2V0KHJlcG9ydC5pZCwgcmVwb3J0KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICB0aGlzLnVwZGF0ZVN1bW1hcnlJbkxpc3QocmVwb3J0KTtcbiAgICAgIHJldHVybiBvZihyZXBvcnQpO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuc2F2ZShyZXBvcnQpLnBpcGUoXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAoc2F2ZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgICAgICAgbmV4dENhY2hlLnNldChzYXZlZC5pZCwgc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5SW5MaXN0KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIHNhdmUgcmVwb3J0IFwiJHtyZXBvcnQuaWR9XCIuYCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVwb3J0IGRlZmluaXRpb24gYnkgSUQuXG4gICAqL1xuICBkZWxldGVSZXBvcnQocmVwb3J0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgICBuZXh0Q2FjaGUuZGVsZXRlKHJlcG9ydElkKTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICB0aGlzLnN1bW1hcmllcy5zZXQodGhpcy5zdW1tYXJpZXMoKS5maWx0ZXIoKHMpID0+IHMuaWQgIT09IHJlcG9ydElkKSk7XG4gICAgICBpZiAodGhpcy5hY3RpdmVSZXBvcnRJZCgpID09PSByZXBvcnRJZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZih2b2lkIDApO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmRlbGV0ZShyZXBvcnRJZCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2FjaGUgPSBuZXcgTWFwKHRoaXMuY2FjaGUoKSk7XG4gICAgICAgICAgbmV4dENhY2hlLmRlbGV0ZShyZXBvcnRJZCk7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgICAgICB0aGlzLnN1bW1hcmllcy5zZXQodGhpcy5zdW1tYXJpZXMoKS5maWx0ZXIoKHMpID0+IHMuaWQgIT09IHJlcG9ydElkKSk7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmVwb3J0SWQoKSA9PT0gcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycj8ubWVzc2FnZSA/PyBgRmFpbGVkIHRvIGRlbGV0ZSByZXBvcnQgXCIke3JlcG9ydElkfVwiLmApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIHJlcG9ydCBJRC5cbiAgICovXG4gIHNldEFjdGl2ZVJlcG9ydChpZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGluLW1lbW9yeSBjYWNoZS5cbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5zZXQobmV3IE1hcCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3VtbWFyeUluTGlzdChkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gWy4uLnRoaXMuc3VtbWFyaWVzKCldO1xuICAgIGNvbnN0IGlkeCA9IGxpc3QuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBkZWYuaWQpO1xuICAgIGNvbnN0IHN1bW1hcnk6IFJlcG9ydFN1bW1hcnkgPSB7XG4gICAgICBpZDogZGVmLmlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogZGVmLnZlcnNpb24sXG4gICAgICBpc1B1Ymxpc2hlZDogIWRlZi5tZXRhZGF0YT8uWydpc0RyYWZ0J10sXG4gICAgICBsYXN0TW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBsaXN0W2lkeF0gPSBzdW1tYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2goc3VtbWFyeSk7XG4gICAgfVxuICAgIHRoaXMuc3VtbWFyaWVzLnNldChsaXN0KTtcbiAgfVxufVxuIl19
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzlFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osT0FBTyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELFNBQVMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU1RCx5Q0FBeUM7SUFDaEMsU0FBUyxHQUFHLE1BQU0sQ0FBa0IsRUFBRSxDQUFDLENBQUM7SUFFakQsOERBQThEO0lBQzdDLEtBQUssR0FBRyxNQUFNLENBQWdDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUUxRSxtQ0FBbUM7SUFDMUIsY0FBYyxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7SUFFdEQsOEJBQThCO0lBQ3JCLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUMsNEJBQTRCO0lBQ25CLEtBQUssR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTdDLG1EQUFtRDtJQUMxQyxZ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Y3QsXG4gIEluamVjdGFibGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGFwLCB0aHJvd0Vycm9yLCBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFJlcG9ydERlZmluaXRpb24sXG4gIFJlcG9ydFN1bW1hcnksXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4vc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlJztcblxuLyoqXG4gKiBSZXBvcnRTdG9yZVNlcnZpY2UgbWFuYWdlcyBhcHBsaWNhdGlvbi13aWRlIGNhY2hlZCByZXBvcnQgc3RhdGVzLFxuICogbGlzdGluZywgYW5kIHJlYWN0aXZlIGFjY2VzcyB2aWEgQW5ndWxhciBzaWduYWxzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJlcG9ydFN0b3JlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlciA9IGluamVjdChSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yID0gaW5qZWN0KFNjaGVtYVZhbGlkYXRvclNlcnZpY2UpO1xuXG4gIC8qKiBMaXN0IG9mIGFsbCBrbm93biByZXBvcnQgc3VtbWFyaWVzICovXG4gIHJlYWRvbmx5IHN1bW1hcmllcyA9IHNpZ25hbDxSZXBvcnRTdW1tYXJ5W10+KFtdKTtcblxuICAvKiogSW4tbWVtb3J5IGNhY2hlIG9mIGxvYWRlZCBmdWxsIHJlcG9ydCBkZWZpbml0aW9ucyBieSBJRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gc2lnbmFsPE1hcDxzdHJpbmcsIFJlcG9ydERlZmluaXRpb24+PihuZXcgTWFwKCkpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgcmVwb3J0IElEICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBMb2FkaW5nIHN0YXRlIGluZGljYXRvciAqL1xuICByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBDdXJyZW50IGVycm9yIG1lc3NhZ2UgKi9cbiAgcmVhZG9ubHkgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiBjb21wdXRlZCBmcm9tIGNhY2hlICovXG4gIHJlYWRvbmx5IGFjdGl2ZVJlcG9ydCA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZVJlcG9ydElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoKS5nZXQoaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgcmVwb3J0cy5cbiAgICovXG4gIGxvYWRTdW1tYXJpZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRTdW1tYXJ5W10+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuc3VtbWFyaWVzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3QkID0gdGhpcy5hZGFwdGVyLmxpc3QoKTtcbiAgICBpZiAoIWxpc3QkIHx8IHR5cGVvZiBsaXN0JC5waXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5zdW1tYXJpZXMoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIGxpc3QkLnBpcGUoXG4gICAgICB0YXAoe1xuICAgICAgICBuZXh0OiAobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3VtbWFyaWVzLnNldChsaXN0IHx8IFtdKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycj8ubWVzc2FnZSA/PyAnRmFpbGVkIHRvIGxvYWQgcmVwb3J0IGxpc3QuJyk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHJlcG9ydCBkZWZpbml0aW9uIGJ5IElELCB1c2luZyBjYWNoZWQgaW5zdGFuY2UgaWYgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVwb3J0SWQgLSBJRCBvZiB0aGUgcmVwb3J0IHRvIGxvYWQuXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBJZiB0cnVlLCBieXBhc3NlcyB0aGUgaW4tbWVtb3J5IGNhY2hlLlxuICAgKi9cbiAgbG9hZFJlcG9ydChyZXBvcnRJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGlmICghZm9yY2VSZWZyZXNoKSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlKCkuZ2V0KHJlcG9ydElkKTtcbiAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICByZXR1cm4gb2YoY2FjaGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgbm90IGNvbmZpZ3VyZWQuJykpO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIubG9hZChyZXBvcnRJZCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6IChkZWYpID0+IHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRvci5hc3NlcnRWYWxpZChkZWYpO1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuc2V0KHJlcG9ydElkLCBkZWYpO1xuICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5leHRDYWNoZSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQocmVwb3J0SWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gbG9hZCByZXBvcnQgXCIke3JlcG9ydElkfVwiLmApO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSByZXBvcnQgZGVmaW5pdGlvbiBieSBzbHVnIG9yIElELlxuICAgKiBSZXNvbHZlcyBmcm9tIGNhY2hlLCBsb2FkZWQgc3VtbWFyaWVzLCBvciBhZGFwdGVyLlxuICAgKi9cbiAgbG9hZFJlcG9ydEJ5U2x1ZyhzbHVnT3JJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHNsdWdMb3dlciA9IHNsdWdPcklkLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgLy8gMS4gQ2hlY2sgaW4tbWVtb3J5IGNhY2hlIGlmIG5vdCBmb3JjaW5nIHJlZnJlc2hcbiAgICBpZiAoIWZvcmNlUmVmcmVzaCkge1xuICAgICAgZm9yIChjb25zdCBkZWYgb2YgdGhpcy5jYWNoZSgpLnZhbHVlcygpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWYuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgICAgKGRlZi5zbHVnICYmIGRlZi5zbHVnLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQoZGVmLmlkKTtcbiAgICAgICAgICByZXR1cm4gb2YoZGVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIENoZWNrIGV4aXN0aW5nIHN1bW1hcmllc1xuICAgIGNvbnN0IG1hdGNoZWRTdW1tYXJ5ID0gdGhpcy5zdW1tYXJpZXMoKS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgIChzLnNsdWcgJiYgcy5zbHVnLnRvTG93ZXJDYXNlKCkgPT09IHNsdWdMb3dlcilcbiAgICApO1xuXG4gICAgaWYgKG1hdGNoZWRTdW1tYXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkUmVwb3J0KG1hdGNoZWRTdW1tYXJ5LmlkLCBmb3JjZVJlZnJlc2gpO1xuICAgIH1cblxuICAgIC8vIDMuIElmIG5vdCBmb3VuZCBpbiBzdW1tYXJpZXMsIHJlZnJlc2ggc3VtbWFyaWVzIGZpcnN0IG9yIGZhbGxiYWNrIHRvIGxvYWRSZXBvcnQgZGlyZWN0bHlcbiAgICByZXR1cm4gdGhpcy5sb2FkU3VtbWFyaWVzKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobGlzdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGxpc3QuZmluZChcbiAgICAgICAgICAocykgPT5cbiAgICAgICAgICAgIHMuaWQudG9Mb3dlckNhc2UoKSA9PT0gc2x1Z0xvd2VyIHx8XG4gICAgICAgICAgICAocy5zbHVnICYmIHMuc2x1Zy50b0xvd2VyQ2FzZSgpID09PSBzbHVnTG93ZXIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRSZXBvcnQoZm91bmQgPyBmb3VuZC5pZCA6IHNsdWdPcklkLCBmb3JjZVJlZnJlc2gpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHRoaXMubG9hZFJlcG9ydChzbHVnT3JJZCwgZm9yY2VSZWZyZXNoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcmVwb3J0IGRlZmluaXRpb24sIHZhbGlkYXRlcyBpdCwgYW5kIHVwZGF0ZXMgbG9jYWwgY2FjaGUuXG4gICAqL1xuICBzYXZlUmVwb3J0KHJlcG9ydDogUmVwb3J0RGVmaW5pdGlvbik6IE9ic2VydmFibGU8UmVwb3J0RGVmaW5pdGlvbj4ge1xuICAgIHRoaXMudmFsaWRhdG9yLmFzc2VydFZhbGlkKHJlcG9ydCk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgLy8gSW4tbWVtb3J5IHVwZGF0ZSBpZiBubyBhZGFwdGVyIGNvbmZpZ3VyZWRcbiAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgIG5leHRDYWNoZS5zZXQocmVwb3J0LmlkLCByZXBvcnQpO1xuICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlU3VtbWFyeUluTGlzdChyZXBvcnQpO1xuICAgICAgcmV0dXJuIG9mKHJlcG9ydCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5zYXZlKHJlcG9ydCkucGlwZShcbiAgICAgIHRhcCh7XG4gICAgICAgIG5leHQ6IChzYXZlZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuc2V0KHNhdmVkLmlkLCBzYXZlZCk7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnlJbkxpc3Qoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gc2F2ZSByZXBvcnQgXCIke3JlcG9ydC5pZH1cIi5gKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZXBvcnQgZGVmaW5pdGlvbiBieSBJRC5cbiAgICovXG4gIGRlbGV0ZVJlcG9ydChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXIpIHtcbiAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgIG5leHRDYWNoZS5kZWxldGUocmVwb3J0SWQpO1xuICAgICAgdGhpcy5jYWNoZS5zZXQobmV4dENhY2hlKTtcbiAgICAgIHRoaXMuc3VtbWFyaWVzLnNldCh0aGlzLnN1bW1hcmllcygpLmZpbHRlcigocykgPT4gcy5pZCAhPT0gcmVwb3J0SWQpKTtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVJlcG9ydElkKCkgPT09IHJlcG9ydElkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KG51bGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9mKHZvaWQgMCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZGVsZXRlKHJlcG9ydElkKS5waXBlKFxuICAgICAgdGFwKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHRDYWNoZSA9IG5ldyBNYXAodGhpcy5jYWNoZSgpKTtcbiAgICAgICAgICBuZXh0Q2FjaGUuZGVsZXRlKHJlcG9ydElkKTtcbiAgICAgICAgICB0aGlzLmNhY2hlLnNldChuZXh0Q2FjaGUpO1xuICAgICAgICAgIHRoaXMuc3VtbWFyaWVzLnNldCh0aGlzLnN1bW1hcmllcygpLmZpbHRlcigocykgPT4gcy5pZCAhPT0gcmVwb3J0SWQpKTtcbiAgICAgICAgICBpZiAodGhpcy5hY3RpdmVSZXBvcnRJZCgpID09PSByZXBvcnRJZCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvci5zZXQoZXJyPy5tZXNzYWdlID8/IGBGYWlsZWQgdG8gZGVsZXRlIHJlcG9ydCBcIiR7cmVwb3J0SWR9XCIuYCk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgcmVwb3J0IElELlxuICAgKi9cbiAgc2V0QWN0aXZlUmVwb3J0KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVSZXBvcnRJZC5zZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgaW4tbWVtb3J5IGNhY2hlLlxuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5SW5MaXN0KGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGxpc3QgPSBbLi4udGhpcy5zdW1tYXJpZXMoKV07XG4gICAgY29uc3QgaWR4ID0gbGlzdC5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGRlZi5pZCk7XG4gICAgY29uc3Qgc3VtbWFyeTogUmVwb3J0U3VtbWFyeSA9IHtcbiAgICAgIGlkOiBkZWYuaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24sXG4gICAgICBjYXRlZ29yeTogZGVmLmNhdGVnb3J5LFxuICAgICAgc2x1ZzogZGVmLnNsdWcgPz8gZGVmLmlkLFxuICAgICAgbWVudUdyb3VwOiBkZWYubWVudUdyb3VwLFxuICAgICAgbWVudU9yZGVyOiBkZWYubWVudU9yZGVyLFxuICAgICAgaWNvbjogZGVmLmljb24sXG4gICAgICB2ZXJzaW9uOiBkZWYudmVyc2lvbixcbiAgICAgIGlzUHVibGlzaGVkOiBkZWYuaXNQdWJsaXNoZWQgPz8gIWRlZi5tZXRhZGF0YT8uWydpc0RyYWZ0J10sXG4gICAgICBsYXN0TW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBsaXN0W2lkeF0gPSBzdW1tYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2goc3VtbWFyeSk7XG4gICAgfVxuICAgIHRoaXMuc3VtbWFyaWVzLnNldChsaXN0KTtcbiAgfVxufVxuIl19
@@ -25,9 +25,9 @@ export class RoutedReportRuntimeComponent {
25
25
  return;
26
26
  }
27
27
  // Otherwise fallback to resolving via paramMap
28
- const reportId = this.route.snapshot.paramMap.get('reportId');
29
- if (reportId) {
30
- this.store.loadReport(reportId)
28
+ const identifier = this.route.snapshot.paramMap.get('slug') ?? this.route.snapshot.paramMap.get('reportId');
29
+ if (identifier) {
30
+ this.store.loadReportBySlug(identifier)
31
31
  .pipe(takeUntilDestroyed(this.destroyRef))
32
32
  .subscribe({
33
33
  next: (rep) => {
@@ -160,4 +160,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
160
160
  </div>
161
161
  `, styles: [".rpt-routed-container{display:flex;flex-direction:column;gap:var(--rpt-space-md, 16px);width:100%;min-height:100%;box-sizing:border-box;padding:var(--rpt-space-md, 16px)}.rpt-routed-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--rpt-space-sm, 8px);border-bottom:1px solid var(--rpt-border-color, #e2e8f0)}.rpt-routed-title-row{display:flex;align-items:center;gap:12px}.rpt-routed-title{font-size:1.25rem;font-weight:700;color:var(--rpt-text-color, #0f172a);margin:0}.rpt-routed-version{font-size:.75rem;font-weight:600;padding:2px 8px;border-radius:9999px;background:var(--rpt-bg-subtle, #f1f5f9);color:var(--rpt-text-muted, #64748b)}.rpt-routed-loading,.rpt-routed-error{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;color:var(--rpt-text-muted, #64748b)}.rpt-error-card{background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-md, 8px);padding:32px 40px;box-shadow:var(--rpt-shadow-sm, 0 1px 3px rgba(0,0,0,.05))}.rpt-error-card h3{color:var(--rpt-error-color, #ef4444);margin-top:0}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-border-color, #e2e8f0);border-top-color:var(--rpt-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite;margin-bottom:12px}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px;font-size:.875rem;font-weight:500;border-radius:var(--rpt-radius-md, 6px);cursor:pointer;border:1px solid transparent;transition:all .15s ease}.rpt-btn-sm{padding:5px 10px;font-size:.8125rem}.rpt-btn-primary{background:var(--rpt-primary, #2563eb);color:#fff}.rpt-btn-primary:hover{background:var(--rpt-primary-hover, #1d4ed8)}.rpt-btn-secondary{background:var(--rpt-surface-bg, #ffffff);color:var(--rpt-text-color, #1e293b);border-color:var(--rpt-border-color, #cbd5e1)}.rpt-btn-secondary:hover{background:var(--rpt-bg-subtle, #f8fafc)}.rpt-btn-ghost{background:transparent;color:var(--rpt-text-muted, #64748b)}.rpt-btn-ghost:hover{color:var(--rpt-text-color, #1e293b);background:var(--rpt-bg-subtle, #f1f5f9)}\n"] }]
162
162
  }] });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXJlcG9ydC1ydW50aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL3JvdXRpbmcvY29tcG9uZW50cy9yb3V0ZWQtcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFHVixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7QUFxTDFGLE1BQU0sT0FBTyw0QkFBNEI7SUFDdEIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUV6QyxRQUFRO1FBQ04scUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTthQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEIsT0FBTztZQUNULENBQUM7WUFFRCwrQ0FBK0M7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5RCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztxQkFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDekMsU0FBUyxDQUFDO29CQUNULElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO3dCQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQTRCO1FBQzNDLGtEQUFrRDtJQUNwRCxDQUFDO0lBRUQsVUFBVTtRQUNSLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7d0dBdkRVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLDhFQTlLN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVCx5dkVBbERTLFlBQVksOEJBQUUsWUFBWSwrQkFBRSxzQkFBc0IsaVVBQUUsZ0JBQWdCOzs0RkFnTG5FLDRCQUE0QjtrQkFuTHhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzlELHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIE9uSW5pdCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMnO1xuaW1wb3J0IHsgUmVwb3J0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvcmVwb3J0LXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UnVudGltZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3J1bnRpbWUvcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcm91dGVkLXJ1bnRpbWUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSb3V0ZXJNb2R1bGUsIFJlcG9ydFJ1bnRpbWVDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC1jb250YWluZXJcIj5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWxvYWRpbmdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXNwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICA8cD5Mb2FkaW5nIHJlcG9ydCBkZWZpbml0aW9uLi4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKHJlcG9ydCgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLXRpdGxlLXJvd1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tZ2hvc3QgcnB0LWJ0bi1zbVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiR28gYmFja1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYXJyb3ctbGVmdFwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+QmFjazwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwicnB0LXJvdXRlZC10aXRsZVwiPnt7IHJlcG9ydCgpPy5uYW1lIH19PC9oMT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXJvdXRlZC12ZXJzaW9uXCI+dnt7IHJlcG9ydCgpPy52ZXJzaW9uID8/IDEgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKGNhbkVkaXQoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tc2Vjb25kYXJ5IHJwdC1idG4tc21cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFJlcG9ydCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZXR0aW5nc1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+RWRpdCBSZXBvcnQ8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxycHQtcnVudGltZSBbcmVwb3J0XT1cInJlcG9ydCgpIVwiIChleGVjdXRlKT1cIm9uUmVwb3J0RXhlY3V0ZWQoJGV2ZW50KVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1yb3V0ZWQtZXJyb3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWNhcmRcIj5cbiAgICAgICAgICAgIDxoMz5SZXBvcnQgTm90IEZvdW5kPC9oMz5cbiAgICAgICAgICAgIDxwPlRoZSByZXF1ZXN0ZWQgcmVwb3J0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBoYXMgbm90IGJlZW4gcHVibGlzaGVkIHlldC48L3A+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwdC1idG4gcnB0LWJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XG4gICAgICAgICAgICAgIFJldHVybiB0byBQcmV2aW91cyBQYWdlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAucnB0LXJvdXRlZC1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IHZhcigtLXJwdC1zcGFjZS1tZCwgMTZweCk7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogdmFyKC0tcnB0LXNwYWNlLW1kLCAxNnB4KTtcbiAgICB9XG5cbiAgICAucnB0LXJvdXRlZC1oZWFkZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0tcnB0LXNwYWNlLXNtLCA4cHgpO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1ib3JkZXItY29sb3IsICNlMmU4ZjApO1xuICAgIH1cblxuICAgIC5ycHQtcm91dGVkLXRpdGxlLXJvdyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTJweDtcbiAgICB9XG5cbiAgICAucnB0LXJvdXRlZC10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMGYxNzJhKTtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG5cbiAgICAucnB0LXJvdXRlZC12ZXJzaW9uIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWJnLXN1YnRsZSwgI2YxZjVmOSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgIH1cblxuICAgIC5ycHQtcm91dGVkLWxvYWRpbmcsXG4gICAgLnJwdC1yb3V0ZWQtZXJyb3Ige1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA2MHB4IDIwcHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgIH1cblxuICAgIC5ycHQtZXJyb3ItY2FyZCB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtc3VyZmFjZS1iZywgI2ZmZmZmZik7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1yYWRpdXMtbWQsIDhweCk7XG4gICAgICBwYWRkaW5nOiAzMnB4IDQwcHg7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtc2hhZG93LXNtLCAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjA1KSk7XG4gICAgfVxuXG4gICAgLnJwdC1lcnJvci1jYXJkIGgzIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtZXJyb3ItY29sb3IsICNlZjQ0NDQpO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG5cbiAgICAucnB0LXNwaW5uZXIge1xuICAgICAgd2lkdGg6IDM2cHg7XG4gICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICBib3JkZXI6IDNweCBzb2xpZCB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGFuaW1hdGlvbjogcnB0LXNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXNwaW4ge1xuICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gICAgfVxuXG4gICAgLnJwdC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtcmFkaXVzLW1kLCA2cHgpO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zbSB7XG4gICAgICBwYWRkaW5nOiA1cHggMTBweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXByaW1hcnkge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5ycHQtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LXByaW1hcnktaG92ZXIsICMxZDRlZDgpO1xuICAgIH1cblxuICAgIC5ycHQtYnRuLXNlY29uZGFyeSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtc3VyZmFjZS1iZywgI2ZmZmZmZik7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtY29sb3IsICMxZTI5M2IpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjY2JkNWUxKTtcbiAgICB9XG4gICAgLnJwdC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmOGZhZmMpO1xuICAgIH1cblxuICAgIC5ycHQtYnRuLWdob3N0IHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG4gICAgLnJwdC1idG4tZ2hvc3Q6aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMWUyOTNiKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgUm91dGVkUmVwb3J0UnVudGltZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFJlcG9ydFN0b3JlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICByZWFkb25seSByZXBvcnQgPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjYW5FZGl0ID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHJvdXRlIHJlc29sdmVkIHRoZSByZXBvcnRcbiAgICB0aGlzLnJvdXRlLmRhdGFcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhWydyZXBvcnQnXSkge1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldChkYXRhWydyZXBvcnQnXSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGZhbGxiYWNrIHRvIHJlc29sdmluZyB2aWEgcGFyYW1NYXBcbiAgICAgICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgncmVwb3J0SWQnKTtcbiAgICAgICAgaWYgKHJlcG9ydElkKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5sb2FkUmVwb3J0KHJlcG9ydElkKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0LnNldChyZXApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25SZXBvcnRFeGVjdXRlZChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgLy8gSG9zdCBjYW4gb2JzZXJ2ZSBvciBoYW5kbGUgZXhlY3V0aW9ucyBpZiBuZWVkZWRcbiAgfVxuXG4gIGVkaXRSZXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2VkaXQnXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdvQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLyddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gIH1cbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXJlcG9ydC1ydW50aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL3JvdXRpbmcvY29tcG9uZW50cy9yb3V0ZWQtcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFHVixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7QUFxTDFGLE1BQU0sT0FBTyw0QkFBNEI7SUFDdEIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQy9DLE9BQU8sR0FBRyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENB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ICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBPbkluaXQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzJztcbmltcG9ydCB7IFJlcG9ydFN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3BlcnNpc3RlbmNlL3NlcnZpY2VzL3JlcG9ydC1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFJ1bnRpbWVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ydW50aW1lL3JlcG9ydC1ydW50aW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJvdXRlZC1ydW50aW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUm91dGVyTW9kdWxlLCBSZXBvcnRSdW50aW1lQ29tcG9uZW50LCBScHRJY29uQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1yb3V0ZWQtY29udGFpbmVyXCI+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC1sb2FkaW5nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zcGlubmVyXCI+PC9kaXY+XG4gICAgICAgICAgPHA+TG9hZGluZyByZXBvcnQgZGVmaW5pdGlvbi4uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChyZXBvcnQoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXJvdXRlZC10aXRsZS1yb3dcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLWdob3N0IHJwdC1idG4tc21cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkdvIGJhY2tcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImFycm93LWxlZnRcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkJhY2s8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxoMSBjbGFzcz1cInJwdC1yb3V0ZWQtdGl0bGVcIj57eyByZXBvcnQoKT8ubmFtZSB9fTwvaDE+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1yb3V0ZWQtdmVyc2lvblwiPnZ7eyByZXBvcnQoKT8udmVyc2lvbiA/PyAxIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmIChjYW5FZGl0KCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0biBycHQtYnRuLXNlY29uZGFyeSBycHQtYnRuLXNtXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRSZXBvcnQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2V0dGluZ3NcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkVkaXQgUmVwb3J0PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cnB0LXJ1bnRpbWUgW3JlcG9ydF09XCJyZXBvcnQoKSFcIiAoZXhlY3V0ZSk9XCJvblJlcG9ydEV4ZWN1dGVkKCRldmVudClcIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcm91dGVkLWVycm9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1lcnJvci1jYXJkXCI+XG4gICAgICAgICAgICA8aDM+UmVwb3J0IE5vdCBGb3VuZDwvaDM+XG4gICAgICAgICAgICA8cD5UaGUgcmVxdWVzdGVkIHJlcG9ydCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaGFzIG5vdCBiZWVuIHB1Ymxpc2hlZCB5ZXQuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuIHJwdC1idG4tcHJpbWFyeVwiIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgICBSZXR1cm4gdG8gUHJldmlvdXMgUGFnZVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnJwdC1yb3V0ZWQtY29udGFpbmVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiB2YXIoLS1ycHQtc3BhY2UtbWQsIDE2cHgpO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHBhZGRpbmc6IHZhcigtLXJwdC1zcGFjZS1tZCwgMTZweCk7XG4gICAgfVxuXG4gICAgLnJwdC1yb3V0ZWQtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgcGFkZGluZy1ib3R0b206IHZhcigtLXJwdC1zcGFjZS1zbSwgOHB4KTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtYm9yZGVyLWNvbG9yLCAjZTJlOGYwKTtcbiAgICB9XG5cbiAgICAucnB0LXJvdXRlZC10aXRsZS1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgfVxuXG4gICAgLnJwdC1yb3V0ZWQtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzBmMTcyYSk7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuXG4gICAgLnJwdC1yb3V0ZWQtdmVyc2lvbiB7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1iZy1zdWJ0bGUsICNmMWY1ZjkpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG5cbiAgICAucnB0LXJvdXRlZC1sb2FkaW5nLFxuICAgIC5ycHQtcm91dGVkLWVycm9yIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogNjBweCAyMHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG5cbiAgICAucnB0LWVycm9yLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LXN1cmZhY2UtYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtcmFkaXVzLW1kLCA4cHgpO1xuICAgICAgcGFkZGluZzogMzJweCA0MHB4O1xuICAgICAgYm94LXNoYWRvdzogdmFyKC0tcnB0LXNoYWRvdy1zbSwgMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4wNSkpO1xuICAgIH1cblxuICAgIC5ycHQtZXJyb3ItY2FyZCBoMyB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWVycm9yLWNvbG9yLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuXG4gICAgLnJwdC1zcGlubmVyIHtcbiAgICAgIHdpZHRoOiAzNnB4O1xuICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgYm9yZGVyOiAzcHggc29saWQgdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2UyZThmMCk7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1ycHQtcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBhbmltYXRpb246IHJwdC1zcGluIDAuOHMgbGluZWFyIGluZmluaXRlO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJwdC1zcGluIHtcbiAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxuICAgIH1cblxuICAgIC5ycHQtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA4cHggMTRweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LXJhZGl1cy1tZCwgNnB4KTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tc20ge1xuICAgICAgcGFkZGluZzogNXB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1wcmltYXJ5IHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgIH1cbiAgICAucnB0LWJ0bi1wcmltYXJ5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1wcmltYXJ5LWhvdmVyLCAjMWQ0ZWQ4KTtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1zZWNvbmRhcnkge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LXN1cmZhY2UtYmcsICNmZmZmZmYpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMWUyOTNiKTtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2NiZDVlMSk7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtYmctc3VidGxlLCAjZjhmYWZjKTtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1naG9zdCB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgfVxuICAgIC5ycHQtYnRuLWdob3N0OmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzFlMjkzYik7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtYmctc3VidGxlLCAjZjFmNWY5KTtcbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIFJvdXRlZFJlcG9ydFJ1bnRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChSZXBvcnRTdG9yZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgY2FuRWRpdCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiByb3V0ZSByZXNvbHZlZCB0aGUgcmVwb3J0XG4gICAgdGhpcy5yb3V0ZS5kYXRhXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YVsncmVwb3J0J10pIHtcbiAgICAgICAgICB0aGlzLnJlcG9ydC5zZXQoZGF0YVsncmVwb3J0J10pO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSBmYWxsYmFjayB0byByZXNvbHZpbmcgdmlhIHBhcmFtTWFwXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnc2x1ZycpID8/IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdyZXBvcnRJZCcpO1xuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIHRoaXMuc3RvcmUubG9hZFJlcG9ydEJ5U2x1ZyhpZGVudGlmaWVyKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0LnNldChyZXApO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgb25SZXBvcnRFeGVjdXRlZChmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgLy8gSG9zdCBjYW4gb2JzZXJ2ZSBvciBoYW5kbGUgZXhlY3V0aW9ucyBpZiBuZWVkZWRcbiAgfVxuXG4gIGVkaXRSZXBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2VkaXQnXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdvQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uLyddLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gIH1cbn1cbiJdfQ==