bways-report 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +477 -0
  3. package/esm2022/bways-report.mjs +5 -0
  4. package/esm2022/lib/core/errors/index.mjs +2 -0
  5. package/esm2022/lib/core/errors/reporting-errors.mjs +65 -0
  6. package/esm2022/lib/core/index.mjs +8 -0
  7. package/esm2022/lib/core/models/component-event.model.mjs +8 -0
  8. package/esm2022/lib/core/models/index.mjs +5 -0
  9. package/esm2022/lib/core/models/report-component.model.mjs +10 -0
  10. package/esm2022/lib/core/models/report-datasource.model.mjs +9 -0
  11. package/esm2022/lib/core/models/report-definition.model.mjs +13 -0
  12. package/esm2022/lib/core/models/report-grid.model.mjs +10 -0
  13. package/esm2022/lib/core/models/report-layout.model.mjs +9 -0
  14. package/esm2022/lib/core/models/report-parameter.model.mjs +9 -0
  15. package/esm2022/lib/core/models/validation.model.mjs +8 -0
  16. package/esm2022/lib/core/registry/component-category.mjs +8 -0
  17. package/esm2022/lib/core/registry/component-registry.mjs +90 -0
  18. package/esm2022/lib/core/registry/index.mjs +2 -0
  19. package/esm2022/lib/core/registry/property-definition.model.mjs +10 -0
  20. package/esm2022/lib/core/services/dynamic-form-builder.service.mjs +55 -0
  21. package/esm2022/lib/core/services/index.mjs +3 -0
  22. package/esm2022/lib/core/services/report-session-context.service.mjs +314 -0
  23. package/esm2022/lib/core/tokens/index.mjs +3 -0
  24. package/esm2022/lib/core/tokens/reporting-config.token.mjs +26 -0
  25. package/esm2022/lib/core/tokens/session-context.token.mjs +18 -0
  26. package/esm2022/lib/core/utilities/id-generator.mjs +17 -0
  27. package/esm2022/lib/core/utilities/index.mjs +3 -0
  28. package/esm2022/lib/core/utilities/schema-migration.mjs +38 -0
  29. package/esm2022/lib/core/utils/identifier-humanizer.mjs +88 -0
  30. package/esm2022/lib/core/validation/index.mjs +2 -0
  31. package/esm2022/lib/core/validation/validation-factory.mjs +70 -0
  32. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +107 -0
  33. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +119 -0
  34. package/esm2022/lib/data-access/adapters/index.mjs +3 -0
  35. package/esm2022/lib/data-access/contracts/data-source.contract.mjs +28 -0
  36. package/esm2022/lib/data-access/contracts/index.mjs +7 -0
  37. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +6 -0
  38. package/esm2022/lib/data-access/contracts/master-data.provider.mjs +24 -0
  39. package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +25 -0
  40. package/esm2022/lib/data-access/contracts/schema-discovery.contract.mjs +7 -0
  41. package/esm2022/lib/data-access/contracts/translation.contract.mjs +9 -0
  42. package/esm2022/lib/data-access/index.mjs +3 -0
  43. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +542 -0
  44. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +843 -0
  45. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +556 -0
  46. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +845 -0
  47. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +185 -0
  48. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +452 -0
  49. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +350 -0
  50. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +175 -0
  51. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +137 -0
  52. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +608 -0
  53. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +225 -0
  54. package/esm2022/lib/features/designer/designer.component.mjs +285 -0
  55. package/esm2022/lib/features/designer/index.mjs +7 -0
  56. package/esm2022/lib/features/designer/services/designer-state.service.mjs +310 -0
  57. package/esm2022/lib/features/designer/services/index.mjs +2 -0
  58. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +124 -0
  59. package/esm2022/lib/features/export/index.mjs +2 -0
  60. package/esm2022/lib/features/export/models/export.models.mjs +2 -0
  61. package/esm2022/lib/features/export/services/report-export.service.mjs +107 -0
  62. package/esm2022/lib/features/index.mjs +6 -0
  63. package/esm2022/lib/features/persistence/index.mjs +2 -0
  64. package/esm2022/lib/features/persistence/services/index.mjs +4 -0
  65. package/esm2022/lib/features/persistence/services/report-store.service.mjs +183 -0
  66. package/esm2022/lib/features/persistence/services/report-versioning.service.mjs +81 -0
  67. package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +102 -0
  68. package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +156 -0
  69. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +163 -0
  70. package/esm2022/lib/features/routing/index.mjs +6 -0
  71. package/esm2022/lib/features/routing/models/report-route.models.mjs +2 -0
  72. package/esm2022/lib/features/routing/report-routes.mjs +49 -0
  73. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +22 -0
  74. package/esm2022/lib/features/routing/services/report-menu.service.mjs +77 -0
  75. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +222 -0
  76. package/esm2022/lib/features/runtime/index.mjs +4 -0
  77. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +409 -0
  78. package/esm2022/lib/features/runtime/report-runtime.component.mjs +147 -0
  79. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +88 -0
  80. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +361 -0
  81. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +86 -0
  82. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +91 -0
  83. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +204 -0
  84. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +476 -0
  85. package/esm2022/lib/primitives/components/index.mjs +10 -0
  86. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +88 -0
  87. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +197 -0
  88. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +110 -0
  89. package/esm2022/lib/primitives/index.mjs +3 -0
  90. package/esm2022/lib/primitives/register-builtins.mjs +328 -0
  91. package/esm2022/lib/provide-reporting.mjs +92 -0
  92. package/esm2022/public-api.mjs +9 -0
  93. package/fesm2022/bways-report.mjs +10360 -0
  94. package/fesm2022/bways-report.mjs.map +1 -0
  95. package/index.d.ts +5 -0
  96. package/lib/core/errors/index.d.ts +1 -0
  97. package/lib/core/errors/reporting-errors.d.ts +42 -0
  98. package/lib/core/index.d.ts +7 -0
  99. package/lib/core/models/component-event.model.d.ts +37 -0
  100. package/lib/core/models/index.d.ts +11 -0
  101. package/lib/core/models/report-component.model.d.ts +95 -0
  102. package/lib/core/models/report-datasource.model.d.ts +39 -0
  103. package/lib/core/models/report-definition.model.d.ts +100 -0
  104. package/lib/core/models/report-grid.model.d.ts +73 -0
  105. package/lib/core/models/report-layout.model.d.ts +43 -0
  106. package/lib/core/models/report-parameter.model.d.ts +22 -0
  107. package/lib/core/models/validation.model.d.ts +30 -0
  108. package/lib/core/registry/component-category.d.ts +16 -0
  109. package/lib/core/registry/component-registry.d.ts +101 -0
  110. package/lib/core/registry/index.d.ts +4 -0
  111. package/lib/core/registry/property-definition.model.d.ts +38 -0
  112. package/lib/core/services/dynamic-form-builder.service.d.ts +30 -0
  113. package/lib/core/services/index.d.ts +3 -0
  114. package/lib/core/services/report-session-context.service.d.ts +87 -0
  115. package/lib/core/tokens/index.d.ts +4 -0
  116. package/lib/core/tokens/reporting-config.token.d.ts +42 -0
  117. package/lib/core/tokens/session-context.token.d.ts +36 -0
  118. package/lib/core/utilities/id-generator.d.ts +9 -0
  119. package/lib/core/utilities/index.d.ts +3 -0
  120. package/lib/core/utilities/schema-migration.d.ts +10 -0
  121. package/lib/core/utils/identifier-humanizer.d.ts +22 -0
  122. package/lib/core/validation/index.d.ts +1 -0
  123. package/lib/core/validation/validation-factory.d.ts +31 -0
  124. package/lib/data-access/adapters/http-lookup.adapter.d.ts +19 -0
  125. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +20 -0
  126. package/lib/data-access/adapters/index.d.ts +2 -0
  127. package/lib/data-access/contracts/data-source.contract.d.ts +37 -0
  128. package/lib/data-access/contracts/index.d.ts +9 -0
  129. package/lib/data-access/contracts/lookup.contract.d.ts +32 -0
  130. package/lib/data-access/contracts/master-data.provider.d.ts +54 -0
  131. package/lib/data-access/contracts/report-persistence.contract.d.ts +36 -0
  132. package/lib/data-access/contracts/schema-discovery.contract.d.ts +52 -0
  133. package/lib/data-access/contracts/translation.contract.d.ts +16 -0
  134. package/lib/data-access/index.d.ts +2 -0
  135. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +39 -0
  136. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +42 -0
  137. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +36 -0
  138. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +68 -0
  139. package/lib/features/designer/components/property-editor/property-editor-general.component.d.ts +20 -0
  140. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -0
  141. package/lib/features/designer/components/property-editor/property-editor-layout.component.d.ts +18 -0
  142. package/lib/features/designer/components/property-editor/property-editor-report.component.d.ts +15 -0
  143. package/lib/features/designer/components/property-editor/property-editor-validation.component.d.ts +12 -0
  144. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +44 -0
  145. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +18 -0
  146. package/lib/features/designer/designer.component.d.ts +36 -0
  147. package/lib/features/designer/index.d.ts +7 -0
  148. package/lib/features/designer/services/designer-state.service.d.ts +103 -0
  149. package/lib/features/designer/services/index.d.ts +2 -0
  150. package/lib/features/designer/utilities/canvas-layout.util.d.ts +55 -0
  151. package/lib/features/export/index.d.ts +2 -0
  152. package/lib/features/export/models/export.models.d.ts +16 -0
  153. package/lib/features/export/services/report-export.service.d.ts +27 -0
  154. package/lib/features/index.d.ts +5 -0
  155. package/lib/features/persistence/index.d.ts +1 -0
  156. package/lib/features/persistence/services/index.d.ts +5 -0
  157. package/lib/features/persistence/services/report-store.service.d.ts +53 -0
  158. package/lib/features/persistence/services/report-versioning.service.d.ts +29 -0
  159. package/lib/features/persistence/services/schema-validator.service.d.ts +34 -0
  160. package/lib/features/routing/components/routed-report-designer.component.d.ts +18 -0
  161. package/lib/features/routing/components/routed-report-runtime.component.d.ts +18 -0
  162. package/lib/features/routing/index.d.ts +6 -0
  163. package/lib/features/routing/models/report-route.models.d.ts +41 -0
  164. package/lib/features/routing/report-routes.d.ts +16 -0
  165. package/lib/features/routing/resolvers/report.resolver.d.ts +7 -0
  166. package/lib/features/routing/services/report-menu.service.d.ts +30 -0
  167. package/lib/features/runtime/dynamic-renderer.component.d.ts +30 -0
  168. package/lib/features/runtime/index.d.ts +3 -0
  169. package/lib/features/runtime/report-grid-bridge.component.d.ts +94 -0
  170. package/lib/features/runtime/report-runtime.component.d.ts +26 -0
  171. package/lib/primitives/components/button/rpt-button.component.d.ts +19 -0
  172. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +45 -0
  173. package/lib/primitives/components/checkbox/rpt-checkbox.component.d.ts +14 -0
  174. package/lib/primitives/components/date/rpt-date.component.d.ts +17 -0
  175. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +32 -0
  176. package/lib/primitives/components/icon/rpt-icon.component.d.ts +41 -0
  177. package/lib/primitives/components/index.d.ts +12 -0
  178. package/lib/primitives/components/input/rpt-input.component.d.ts +16 -0
  179. package/lib/primitives/components/kpi-card/rpt-kpi-card.component.d.ts +43 -0
  180. package/lib/primitives/components/number/rpt-number.component.d.ts +20 -0
  181. package/lib/primitives/index.d.ts +2 -0
  182. package/lib/primitives/register-builtins.d.ts +11 -0
  183. package/lib/provide-reporting.d.ts +75 -0
  184. package/package.json +55 -0
  185. package/public-api.d.ts +5 -0
@@ -0,0 +1,147 @@
1
+ import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
4
+ import { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';
5
+ import { ReportSessionContextService } from '../../core/services/report-session-context.service';
6
+ import { DynamicRendererComponent } from './dynamic-renderer.component';
7
+ import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
8
+ import * as i0 from "@angular/core";
9
+ export class ReportRuntimeComponent {
10
+ persistenceAdapter = inject(ReportPersistenceAdapter, { optional: true });
11
+ dataSourceAdapter = inject(ReportDataSourceAdapter, { optional: true });
12
+ sessionService = inject(ReportSessionContextService, { optional: true });
13
+ /** Report ID to load via persistence adapter */
14
+ reportId = input();
15
+ /** Directly passed report definition (skips persistence adapter) */
16
+ definition = input(null, { alias: 'report' });
17
+ internalDefinition = signal(null);
18
+ resultData = signal(null);
19
+ isLoading = signal(false);
20
+ loadingMessage = signal('Loading report...');
21
+ errorMessage = signal(null);
22
+ currentDefinition = computed(() => {
23
+ return this.definition() ?? this.internalDefinition();
24
+ });
25
+ constructor() {
26
+ effect(() => {
27
+ const id = this.reportId();
28
+ if (id && !this.definition()) {
29
+ this.loadReport(id);
30
+ }
31
+ }, { allowSignalWrites: true });
32
+ }
33
+ loadReport(id) {
34
+ if (!this.persistenceAdapter) {
35
+ this.errorMessage.set(`Report persistence adapter not provided to load report "${id}".`);
36
+ return;
37
+ }
38
+ this.isLoading.set(true);
39
+ this.loadingMessage.set('Loading report definition...');
40
+ this.errorMessage.set(null);
41
+ this.persistenceAdapter.load(id).subscribe({
42
+ next: (def) => {
43
+ this.internalDefinition.set(def);
44
+ this.isLoading.set(false);
45
+ },
46
+ error: (err) => {
47
+ this.errorMessage.set(err?.message ?? `Failed to load report definition with ID: ${id}`);
48
+ this.isLoading.set(false);
49
+ },
50
+ });
51
+ }
52
+ onExecuteReport(event) {
53
+ const grid = event.definition.grid;
54
+ if (!grid) {
55
+ return;
56
+ }
57
+ const ds = event.definition.dataSources.find((d) => d.id === grid.dataSourceId);
58
+ if (!ds) {
59
+ this.errorMessage.set(`Data source "${grid.dataSourceId}" referenced by grid not found in report definition.`);
60
+ return;
61
+ }
62
+ if (!this.dataSourceAdapter) {
63
+ this.errorMessage.set('No ReportDataSourceAdapter provided to execute the data source.');
64
+ return;
65
+ }
66
+ this.isLoading.set(true);
67
+ this.loadingMessage.set('Executing report query...');
68
+ this.errorMessage.set(null);
69
+ const session = this.sessionService?.getCurrentSessionContext() ?? {};
70
+ const executionParams = { ...session, ...event.parameters };
71
+ this.dataSourceAdapter.execute(ds, executionParams).subscribe({
72
+ next: (data) => {
73
+ this.resultData.set(data);
74
+ this.isLoading.set(false);
75
+ },
76
+ error: (err) => {
77
+ this.errorMessage.set(err?.message ?? 'An error occurred while executing report data source.');
78
+ this.isLoading.set(false);
79
+ },
80
+ });
81
+ }
82
+ retry() {
83
+ const id = this.reportId();
84
+ if (id) {
85
+ this.loadReport(id);
86
+ }
87
+ }
88
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
89
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportRuntimeComponent, isStandalone: true, selector: "rpt-report-runtime, rpt-runtime", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, definition: { classPropertyName: "definition", publicName: "report", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
90
+ <div class="rpt-runtime-container">
91
+ @if (isLoading()) {
92
+ <div class="rpt-state-card rpt-loading-state">
93
+ <div class="rpt-spinner" aria-hidden="true"></div>
94
+ <p class="rpt-state-text">{{ loadingMessage() }}</p>
95
+ </div>
96
+ } @else if (errorMessage()) {
97
+ <div class="rpt-state-card rpt-error-state">
98
+ <div class="rpt-error-icon"><rpt-icon name="alert-triangle" [size]="32" color="#ef4444" /></div>
99
+ <p class="rpt-error-title">Unable to run report</p>
100
+ <p class="rpt-state-text">{{ errorMessage() }}</p>
101
+ <button type="button" class="rpt-retry-btn" (click)="retry()">Retry</button>
102
+ </div>
103
+ } @else if (currentDefinition()) {
104
+ <rpt-dynamic-renderer
105
+ [definition]="currentDefinition()!"
106
+ [resultData]="resultData()"
107
+ (executeRequested)="onExecuteReport($event)"
108
+ />
109
+ } @else {
110
+ <div class="rpt-state-card rpt-empty-state">
111
+ <p class="rpt-state-text">No report definition available.</p>
112
+ </div>
113
+ }
114
+ </div>
115
+ `, isInline: true, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicRendererComponent, selector: "rpt-dynamic-renderer", inputs: ["definition", "initialValues", "resultData"], outputs: ["executeRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportRuntimeComponent, decorators: [{
118
+ type: Component,
119
+ args: [{ selector: 'rpt-report-runtime, rpt-runtime', standalone: true, imports: [CommonModule, DynamicRendererComponent, RptIconComponent], template: `
120
+ <div class="rpt-runtime-container">
121
+ @if (isLoading()) {
122
+ <div class="rpt-state-card rpt-loading-state">
123
+ <div class="rpt-spinner" aria-hidden="true"></div>
124
+ <p class="rpt-state-text">{{ loadingMessage() }}</p>
125
+ </div>
126
+ } @else if (errorMessage()) {
127
+ <div class="rpt-state-card rpt-error-state">
128
+ <div class="rpt-error-icon"><rpt-icon name="alert-triangle" [size]="32" color="#ef4444" /></div>
129
+ <p class="rpt-error-title">Unable to run report</p>
130
+ <p class="rpt-state-text">{{ errorMessage() }}</p>
131
+ <button type="button" class="rpt-retry-btn" (click)="retry()">Retry</button>
132
+ </div>
133
+ } @else if (currentDefinition()) {
134
+ <rpt-dynamic-renderer
135
+ [definition]="currentDefinition()!"
136
+ [resultData]="resultData()"
137
+ (executeRequested)="onExecuteReport($event)"
138
+ />
139
+ } @else {
140
+ <div class="rpt-state-card rpt-empty-state">
141
+ <p class="rpt-state-text">No report definition available.</p>
142
+ </div>
143
+ }
144
+ </div>
145
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;font-family:var(--rpt-font-family, inherit)}.rpt-runtime-container{width:100%;box-sizing:border-box}.rpt-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;background:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);margin:24px 0}.rpt-state-text{color:var(--rpt-color-text-muted, #64748b);font-size:var(--rpt-font-size-base, .875rem);margin:8px 0 0}.rpt-error-title{font-weight:600;color:var(--rpt-color-danger, #ef4444);margin:8px 0 0;font-size:var(--rpt-font-size-base, .875rem)}.rpt-spinner{width:36px;height:36px;border:3px solid var(--rpt-color-border, #cbd5e1);border-top-color:var(--rpt-color-primary, #2563eb);border-radius:50%;animation:rpt-spin .8s linear infinite}@keyframes rpt-spin{to{transform:rotate(360deg)}}.rpt-retry-btn{margin-top:16px;padding:6px 16px;font-size:var(--rpt-font-size-sm, .75rem);background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer}\n"] }]
146
+ }], ctorParameters: () => [] });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtcnVudGltZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7O0FBMkZ2RixNQUFNLE9BQU8sc0JBQXNCO0lBQ2hCLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxRixnREFBZ0Q7SUFDdkMsUUFBUSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRXBDLG9FQUFvRTtJQUMzRCxVQUFVLEdBQUcsS0FBSyxDQUEwQixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUd2RSxrQkFBa0IsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzNELFVBQVUsR0FBRyxNQUFNLENBQW1CLElBQUksQ0FBQyxDQUFDO0lBQzVDLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDbkMsY0FBYyxHQUFHLE1BQU0sQ0FBUyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3JELFlBQVksR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRTNDLGlCQUFpQixHQUFHLFFBQVEsQ0FBMEIsR0FBRyxFQUFFO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUg7UUFDRSxNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUdELFVBQVUsQ0FBQyxFQUFVO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsMkRBQTJELEVBQUUsSUFBSSxDQUNsRSxDQUFDO1lBQ0YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsR0FBRyxFQUFFLE9BQU8sSUFBSSw2Q0FBNkMsRUFBRSxFQUFFLENBQ2xFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsS0FHZjtRQUNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMxQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUNsQyxDQUFDO1FBRUYsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ25CLGdCQUFnQixJQUFJLENBQUMsWUFBWSxzREFBc0QsQ0FDeEYsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNuQixpRUFBaUUsQ0FDbEUsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RFLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ25CLEdBQUcsRUFBRSxPQUFPLElBQUksdURBQXVELENBQ3hFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO3dHQWxIVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwyV0FwRnZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCxxdENBNUJTLFlBQVksK0JBQUUsd0JBQXdCLHVKQUFFLGdCQUFnQjs7NEZBc0Z2RCxzQkFBc0I7a0JBekZsQyxTQUFTOytCQUNFLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLENBQUMsWUFFekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJULG1CQXdEZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9yZXBvcnQtcGVyc2lzdGVuY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvZGF0YS1zb3VyY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY1JlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydC1ydW50aW1lLCBycHQtcnVudGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIER5bmFtaWNSZW5kZXJlckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG5cbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LXJ1bnRpbWUtY29udGFpbmVyXCI+XG4gICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtbG9hZGluZy1zdGF0ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3Bpbm5lclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LXN0YXRlLXRleHRcIj57eyBsb2FkaW5nTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2UgaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc3RhdGUtY2FyZCBycHQtZXJyb3Itc3RhdGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWVycm9yLWljb25cIj48cnB0LWljb24gbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCIgW3NpemVdPVwiMzJcIiBjb2xvcj1cIiNlZjQ0NDRcIiAvPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwicnB0LWVycm9yLXRpdGxlXCI+VW5hYmxlIHRvIHJ1biByZXBvcnQ8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9wPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LXJldHJ5LWJ0blwiIChjbGljayk9XCJyZXRyeSgpXCI+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChjdXJyZW50RGVmaW5pdGlvbigpKSB7XG4gICAgICAgIDxycHQtZHluYW1pYy1yZW5kZXJlclxuICAgICAgICAgIFtkZWZpbml0aW9uXT1cImN1cnJlbnREZWZpbml0aW9uKCkhXCJcbiAgICAgICAgICBbcmVzdWx0RGF0YV09XCJyZXN1bHREYXRhKClcIlxuICAgICAgICAgIChleGVjdXRlUmVxdWVzdGVkKT1cIm9uRXhlY3V0ZVJlcG9ydCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXN0YXRlLWNhcmQgcnB0LWVtcHR5LXN0YXRlXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJycHQtc3RhdGUtdGV4dFwiPk5vIHJlcG9ydCBkZWZpbml0aW9uIGF2YWlsYWJsZS48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgIH1cbiAgICAucnB0LXJ1bnRpbWUtY29udGFpbmVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLnJwdC1zdGF0ZS1jYXJkIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogNDhweCAyNHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLWJnLCAjZmZmZmZmKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBtYXJnaW46IDI0cHggMDtcbiAgICB9XG4gICAgLnJwdC1zdGF0ZS10ZXh0IHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgICAgbWFyZ2luOiA4cHggMCAwIDA7XG4gICAgfVxuICAgIC5ycHQtZXJyb3ItdGl0bGUge1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbjogOHB4IDAgMCAwO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLWJhc2UsIDAuODc1cmVtKTtcbiAgICB9XG4gICAgLnJwdC1zcGlubmVyIHtcbiAgICAgIHdpZHRoOiAzNnB4O1xuICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgYm9yZGVyOiAzcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBhbmltYXRpb246IHJwdC1zcGluIDgwMG1zIGxpbmVhciBpbmZpbml0ZTtcbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtc3BpbiB7XG4gICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbiAgICB9XG4gICAgLnJwdC1yZXRyeS1idG4ge1xuICAgICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxNnB4O1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1pbnZlcnNlLCAjZmZmZmZmKTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRSdW50aW1lQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzaXN0ZW5jZUFkYXB0ZXIgPSBpbmplY3QoUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VBZGFwdGVyID0gaW5qZWN0KFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25TZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKiogUmVwb3J0IElEIHRvIGxvYWQgdmlhIHBlcnNpc3RlbmNlIGFkYXB0ZXIgKi9cbiAgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqIERpcmVjdGx5IHBhc3NlZCByZXBvcnQgZGVmaW5pdGlvbiAoc2tpcHMgcGVyc2lzdGVuY2UgYWRhcHRlcikgKi9cbiAgcmVhZG9ubHkgZGVmaW5pdGlvbiA9IGlucHV0PFJlcG9ydERlZmluaXRpb24gfCBudWxsPihudWxsLCB7IGFsaWFzOiAncmVwb3J0JyB9KTtcblxuXG4gIHJlYWRvbmx5IGludGVybmFsRGVmaW5pdGlvbiA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlc3VsdERhdGEgPSBzaWduYWw8dW5rbm93bltdIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmdNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJ0xvYWRpbmcgcmVwb3J0Li4uJyk7XG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpID8/IHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uKCk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgICAgIGlmIChpZCAmJiAhdGhpcy5kZWZpbml0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRSZXBvcnQoaWQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG5cbiAgbG9hZFJlcG9ydChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlcnNpc3RlbmNlQWRhcHRlcikge1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2Uuc2V0KFxuICAgICAgICBgUmVwb3J0IHBlcnNpc3RlbmNlIGFkYXB0ZXIgbm90IHByb3ZpZGVkIHRvIGxvYWQgcmVwb3J0IFwiJHtpZH1cIi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnTG9hZGluZyByZXBvcnQgZGVmaW5pdGlvbi4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VBZGFwdGVyLmxvYWQoaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGVmKSA9PiB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxEZWZpbml0aW9uLnNldChkZWYpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgICBlcnI/Lm1lc3NhZ2UgPz8gYEZhaWxlZCB0byBsb2FkIHJlcG9ydCBkZWZpbml0aW9uIHdpdGggSUQ6ICR7aWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhlY3V0ZVJlcG9ydChldmVudDoge1xuICAgIGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb247XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBncmlkID0gZXZlbnQuZGVmaW5pdGlvbi5ncmlkO1xuICAgIGlmICghZ3JpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRzID0gZXZlbnQuZGVmaW5pdGlvbi5kYXRhU291cmNlcy5maW5kKFxuICAgICAgKGQpID0+IGQuaWQgPT09IGdyaWQuZGF0YVNvdXJjZUlkXG4gICAgKTtcblxuICAgIGlmICghZHMpIHtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChcbiAgICAgICAgYERhdGEgc291cmNlIFwiJHtncmlkLmRhdGFTb3VyY2VJZH1cIiByZWZlcmVuY2VkIGJ5IGdyaWQgbm90IGZvdW5kIGluIHJlcG9ydCBkZWZpbml0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2VBZGFwdGVyKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlLnNldCgnRXhlY3V0aW5nIHJlcG9ydCBxdWVyeS4uLicpO1xuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldChudWxsKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5nZXRDdXJyZW50U2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcbiAgICBjb25zdCBleGVjdXRpb25QYXJhbXMgPSB7IC4uLnNlc3Npb24sIC4uLmV2ZW50LnBhcmFtZXRlcnMgfTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZUFkYXB0ZXIuZXhlY3V0ZShkcywgZXhlY3V0aW9uUGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHREYXRhLnNldChkYXRhKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoXG4gICAgICAgICAgZXJyPy5tZXNzYWdlID8/ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgcmVwb3J0IGRhdGEgc291cmNlLidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXRyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucmVwb3J0SWQoKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMubG9hZFJlcG9ydChpZCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,88 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, output, } from '@angular/core';
2
+ import { RptIconComponent } from '../icon/rpt-icon.component';
3
+ import * as i0 from "@angular/core";
4
+ export class RptButtonComponent {
5
+ config = input.required();
6
+ actionTriggered = output();
7
+ elementId = computed(() => this.config().id);
8
+ buttonLabel = computed(() => this.config().label || this.config().properties?.['text'] || 'Submit');
9
+ buttonHtmlType = computed(() => {
10
+ const action = this.config().properties?.['action'];
11
+ return action === 'submit' ? 'submit' : 'button';
12
+ });
13
+ isDisabled = computed(() => this.config().enabled === false);
14
+ icon = computed(() => this.config().properties?.['icon'] || '');
15
+ buttonClasses = computed(() => {
16
+ const variant = this.config().properties?.['variant'] || 'primary';
17
+ return `rpt-btn rpt-btn-${variant}`;
18
+ });
19
+ isFullWidth = computed(() => {
20
+ return (this.config().properties?.['fullWidth'] === true ||
21
+ this.config().layout?.width === '100%');
22
+ });
23
+ customHeight = computed(() => {
24
+ const h = this.config().layout?.height;
25
+ return h && h !== 'auto' ? h : null;
26
+ });
27
+ customWidth = computed(() => {
28
+ const w = this.config().layout?.width;
29
+ return w && w !== 'auto' ? w : null;
30
+ });
31
+ onClick(event) {
32
+ const events = this.config().events;
33
+ if (events && events.length > 0) {
34
+ const clickEvent = events.find((e) => e.event === 'click');
35
+ if (clickEvent) {
36
+ this.actionTriggered.emit(clickEvent.action);
37
+ }
38
+ }
39
+ else {
40
+ // Default action if configured in properties
41
+ const actionType = this.config().properties?.['action'] || 'execute-report';
42
+ this.actionTriggered.emit({ type: actionType, target: this.config().id });
43
+ }
44
+ }
45
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
46
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptButtonComponent, isStandalone: true, selector: "rpt-button", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionTriggered: "actionTriggered" }, ngImport: i0, template: `
47
+ <div class="rpt-button-container">
48
+ <button
49
+ [id]="elementId()"
50
+ [type]="buttonHtmlType()"
51
+ [class]="buttonClasses()"
52
+ [class.rpt-btn-full]="isFullWidth()"
53
+ [disabled]="isDisabled()"
54
+ [style.height]="customHeight()"
55
+ [style.width]="customWidth()"
56
+ (click)="onClick($event)"
57
+ >
58
+ @if (icon()) {
59
+ <rpt-icon [name]="icon()" [size]="15" />
60
+ }
61
+ <span>{{ buttonLabel() }}</span>
62
+ </button>
63
+ </div>
64
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-button-container{display:flex;align-items:flex-end;height:100%;width:100%;box-sizing:border-box;padding-bottom:2px}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:38px;width:auto;max-width:100%;box-sizing:border-box;padding:0 20px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border-radius:var(--rpt-border-radius, 6px);border:1px solid transparent;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.rpt-btn:focus-visible{outline:none;box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-btn:disabled{opacity:.6;cursor:not-allowed}.rpt-btn-primary{background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border-color:var(--rpt-color-primary, #2563eb)}.rpt-btn-primary:hover:not(:disabled){background-color:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-secondary{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border, #cbd5e1)}.rpt-btn-secondary:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-btn-outline{background-color:transparent;color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-btn-outline:hover:not(:disabled){background-color:var(--rpt-color-primary-focus, rgba(37, 99, 235, .1))}.rpt-btn-danger{background-color:var(--rpt-color-danger, #ef4444);color:var(--rpt-color-text-inverse, #ffffff);border-color:var(--rpt-color-danger, #ef4444)}.rpt-btn-danger:hover:not(:disabled){background-color:#dc2626;border-color:#dc2626}.rpt-btn.rpt-btn-full{width:100%}.rpt-btn-icon{display:flex;align-items:center}\n"], dependencies: [{ kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptButtonComponent, decorators: [{
67
+ type: Component,
68
+ args: [{ selector: 'rpt-button', standalone: true, imports: [RptIconComponent], template: `
69
+ <div class="rpt-button-container">
70
+ <button
71
+ [id]="elementId()"
72
+ [type]="buttonHtmlType()"
73
+ [class]="buttonClasses()"
74
+ [class.rpt-btn-full]="isFullWidth()"
75
+ [disabled]="isDisabled()"
76
+ [style.height]="customHeight()"
77
+ [style.width]="customWidth()"
78
+ (click)="onClick($event)"
79
+ >
80
+ @if (icon()) {
81
+ <rpt-icon [name]="icon()" [size]="15" />
82
+ }
83
+ <span>{{ buttonLabel() }}</span>
84
+ </button>
85
+ </div>
86
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-button-container{display:flex;align-items:flex-end;height:100%;width:100%;box-sizing:border-box;padding-bottom:2px}.rpt-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:38px;width:auto;max-width:100%;box-sizing:border-box;padding:0 20px;font-size:var(--rpt-font-size-base, .875rem);font-weight:500;border-radius:var(--rpt-border-radius, 6px);border:1px solid transparent;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all var(--rpt-transition-speed, .15s) ease;white-space:nowrap}.rpt-btn:focus-visible{outline:none;box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-btn:disabled{opacity:.6;cursor:not-allowed}.rpt-btn-primary{background-color:var(--rpt-color-primary, #2563eb);color:var(--rpt-color-text-inverse, #ffffff);border-color:var(--rpt-color-primary, #2563eb)}.rpt-btn-primary:hover:not(:disabled){background-color:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-secondary{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border, #cbd5e1)}.rpt-btn-secondary:hover:not(:disabled){background-color:var(--rpt-color-surface-hover, #f1f5f9);border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-btn-outline{background-color:transparent;color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-btn-outline:hover:not(:disabled){background-color:var(--rpt-color-primary-focus, rgba(37, 99, 235, .1))}.rpt-btn-danger{background-color:var(--rpt-color-danger, #ef4444);color:var(--rpt-color-text-inverse, #ffffff);border-color:var(--rpt-color-danger, #ef4444)}.rpt-btn-danger:hover:not(:disabled){background-color:#dc2626;border-color:#dc2626}.rpt-btn.rpt-btn-full{width:100%}.rpt-btn-icon{display:flex;align-items:center}\n"] }]
87
+ }] });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9wcmltaXRpdmVzL2NvbXBvbmVudHMvYnV0dG9uL3JwdC1idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQW1IOUQsTUFBTSxPQUFPLGtCQUFrQjtJQUNwQixNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNkIsQ0FBQztJQUVyRCxlQUFlLEdBQUcsTUFBTSxFQUE2QixDQUFDO0lBRXRELFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLFdBQVcsR0FBRyxRQUFRLENBQzdCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLElBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBWSxJQUFJLFFBQVEsQ0FDeEYsQ0FBQztJQUNPLGNBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVcsQ0FBQztRQUM5RCxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ00sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQzdELElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTVFLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQVksSUFBSSxTQUFTLENBQUM7UUFDL0UsT0FBTyxtQkFBbUIsT0FBTyxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNuQyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUk7WUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssTUFBTSxDQUN2QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsUUFBUSxDQUFnQixHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFTSxXQUFXLEdBQUcsUUFBUSxDQUFnQixHQUFHLEVBQUU7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7WUFDM0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sNkNBQTZDO1lBQzdDLE1BQU0sVUFBVSxHQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVksSUFBSSxnQkFBZ0IsQ0FBQztZQUN4RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO3dHQWxEVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiw2UEE3R25COzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQlQsbWdFQW5CUyxnQkFBZ0I7OzRGQThHZixrQkFBa0I7a0JBakg5QixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JULG1CQXlGZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudEFjdGlvbkRlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9jb21wb25lbnQtZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LWJ1dHRvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtScHRJY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LWJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgW3R5cGVdPVwiYnV0dG9uSHRtbFR5cGUoKVwiXG4gICAgICAgIFtjbGFzc109XCJidXR0b25DbGFzc2VzKClcIlxuICAgICAgICBbY2xhc3MucnB0LWJ0bi1mdWxsXT1cImlzRnVsbFdpZHRoKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJjdXN0b21IZWlnaHQoKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJjdXN0b21XaWR0aCgpXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoaWNvbigpKSB7XG4gICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImljb24oKVwiIFtzaXplXT1cIjE1XCIgLz5cbiAgICAgICAgfVxuICAgICAgICA8c3Bhbj57eyBidXR0b25MYWJlbCgpIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGAsXG5cbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtYnV0dG9uLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZy1ib3R0b206IDJweDtcbiAgICB9XG4gICAgLnJwdC1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGhlaWdodDogMzhweDtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHBhZGRpbmc6IDAgMjBweDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1iYXNlLCAwLjg3NXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuICAgIC5ycHQtYnRuOmZvY3VzLXZpc2libGUge1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LWZvY3VzLCAwIDAgMCAzcHggcmdiYSgzNywgOTksIDIzNSwgMC4yNSkpO1xuICAgIH1cbiAgICAucnB0LWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgICAvKiBWYXJpYW50cyAqL1xuICAgIC5ycHQtYnRuLXByaW1hcnkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LWludmVyc2UsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtYnRuLXByaW1hcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktaG92ZXIsICMxZDRlZDgpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNlY29uZGFyeSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICB9XG4gICAgLnJwdC1idG4tc2Vjb25kYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLWhvdmVyLCAjZjFmNWY5KTtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1ob3ZlciwgIzk0YTNiOCk7XG4gICAgfVxuICAgIC5ycHQtYnRuLW91dGxpbmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtYnRuLW91dGxpbmU6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktZm9jdXMsIHJnYmEoMzcsIDk5LCAyMzUsIDAuMSkpO1xuICAgIH1cbiAgICAucnB0LWJ0bi1kYW5nZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtaW52ZXJzZSwgI2ZmZmZmZik7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgIH1cbiAgICAucnB0LWJ0bi1kYW5nZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2RjMjYyNjtcbiAgICAgIGJvcmRlci1jb2xvcjogI2RjMjYyNjtcbiAgICB9XG4gICAgLnJwdC1idG4ucnB0LWJ0bi1mdWxsIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAucnB0LWJ0bi1pY29uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBScHRCdXR0b25Db21wb25lbnQge1xuICByZWFkb25seSBjb25maWcgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPigpO1xuXG4gIHJlYWRvbmx5IGFjdGlvblRyaWdnZXJlZCA9IG91dHB1dDxDb21wb25lbnRBY3Rpb25EZWZpbml0aW9uPigpO1xuXG4gIHJlYWRvbmx5IGVsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29uZmlnKCkuaWQpO1xuICByZWFkb25seSBidXR0b25MYWJlbCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuY29uZmlnKCkubGFiZWwgfHwgKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWyd0ZXh0J10gYXMgc3RyaW5nKSB8fCAnU3VibWl0J1xuICApO1xuICByZWFkb25seSBidXR0b25IdG1sVHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnYWN0aW9uJ10gYXMgc3RyaW5nO1xuICAgIHJldHVybiBhY3Rpb24gPT09ICdzdWJtaXQnID8gJ3N1Ym1pdCcgOiAnYnV0dG9uJztcbiAgfSk7XG4gIHJlYWRvbmx5IGlzRGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZygpLmVuYWJsZWQgPT09IGZhbHNlKTtcbiAgcmVhZG9ubHkgaWNvbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnaWNvbiddIGFzIHN0cmluZykgfHwgJycpO1xuXG4gIHJlYWRvbmx5IGJ1dHRvbkNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdmFyaWFudCA9ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsndmFyaWFudCddIGFzIHN0cmluZykgfHwgJ3ByaW1hcnknO1xuICAgIHJldHVybiBgcnB0LWJ0biBycHQtYnRuLSR7dmFyaWFudH1gO1xuICB9KTtcblxuICByZWFkb25seSBpc0Z1bGxXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ2Z1bGxXaWR0aCddID09PSB0cnVlIHx8XG4gICAgICB0aGlzLmNvbmZpZygpLmxheW91dD8ud2lkdGggPT09ICcxMDAlJ1xuICAgICk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGN1c3RvbUhlaWdodCA9IGNvbXB1dGVkPHN0cmluZyB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBoID0gdGhpcy5jb25maWcoKS5sYXlvdXQ/LmhlaWdodDtcbiAgICByZXR1cm4gaCAmJiBoICE9PSAnYXV0bycgPyBoIDogbnVsbDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY3VzdG9tV2lkdGggPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgdyA9IHRoaXMuY29uZmlnKCkubGF5b3V0Py53aWR0aDtcbiAgICByZXR1cm4gdyAmJiB3ICE9PSAnYXV0bycgPyB3IDogbnVsbDtcbiAgfSk7XG5cbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuY29uZmlnKCkuZXZlbnRzO1xuICAgIGlmIChldmVudHMgJiYgZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNsaWNrRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudCA9PT0gJ2NsaWNrJyk7XG4gICAgICBpZiAoY2xpY2tFdmVudCkge1xuICAgICAgICB0aGlzLmFjdGlvblRyaWdnZXJlZC5lbWl0KGNsaWNrRXZlbnQuYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBhY3Rpb24gaWYgY29uZmlndXJlZCBpbiBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBhY3Rpb25UeXBlID0gKHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWydhY3Rpb24nXSBhcyBzdHJpbmcpIHx8ICdleGVjdXRlLXJlcG9ydCc7XG4gICAgICB0aGlzLmFjdGlvblRyaWdnZXJlZC5lbWl0KHsgdHlwZTogYWN0aW9uVHlwZSwgdGFyZ2V0OiB0aGlzLmNvbmZpZygpLmlkIH0pO1xuICAgIH1cbiAgfVxufVxuIl19