bways-report 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +463 -316
- package/esm2022/lib/core/config/bways-report-config.mjs +31 -32
- package/esm2022/lib/core/models/index.mjs +1 -1
- package/esm2022/lib/core/models/report-api-endpoint.model.mjs +8 -0
- package/esm2022/lib/core/models/report-component.model.mjs +1 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/services/index.mjs +2 -1
- package/esm2022/lib/core/services/report-api-execution.service.mjs +210 -0
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +76 -4
- package/esm2022/lib/core/services/report-session-context.service.mjs +72 -3
- package/esm2022/lib/core/tokens/designer-config.token.mjs +4 -0
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/report-endpoint.util.mjs +22 -0
- package/esm2022/lib/core/utils/report-request-scope.mjs +48 -0
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +31 -1
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +27 -2
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +5 -2
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +30 -14
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +32 -28
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +1 -1
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +4 -37
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +28 -51
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +43 -194
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +17 -65
- package/esm2022/lib/data-access/adapters/index.mjs +1 -1
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +13 -4
- package/esm2022/lib/data-access/adapters/report-id-availability.mjs +20 -0
- package/esm2022/lib/data-access/adapters/session-headers.mjs +11 -0
- package/esm2022/lib/data-access/contracts/index.mjs +1 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +13 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +536 -6
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +55 -17
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +546 -119
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +142 -8
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +129 -28
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +27 -13
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +54 -32
- package/esm2022/lib/features/designer/designer.component.mjs +109 -75
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +10 -4
- package/esm2022/lib/features/designer/services/designer-config.service.mjs +56 -0
- package/esm2022/lib/features/designer/services/designer-endpoints.service.mjs +155 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +3 -2
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +2 -1
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +3 -3
- package/esm2022/lib/features/export/services/report-export.service.mjs +11 -6
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +78 -23
- package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +59 -3
- package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +12 -17
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +6 -4
- package/esm2022/lib/features/routing/report-routes.mjs +6 -6
- package/esm2022/lib/features/routing/resolvers/report-route-identifier.mjs +5 -0
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +3 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +23 -4
- package/esm2022/lib/features/runtime/report-execution.service.mjs +36 -6
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +54 -11
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +105 -68
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +50 -42
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +7 -2
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +16 -7
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +53 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/components/radio/rpt-radio.component.mjs +428 -0
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +11 -29
- package/fesm2022/bways-report.mjs +3745 -1281
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +27 -5
- package/lib/core/models/index.d.ts +2 -1
- package/lib/core/models/report-api-endpoint.model.d.ts +30 -0
- package/lib/core/models/report-component.model.d.ts +16 -4
- package/lib/core/models/report-datasource.model.d.ts +21 -2
- package/lib/core/services/index.d.ts +1 -0
- package/lib/core/services/report-api-execution.service.d.ts +41 -0
- package/lib/core/services/report-data-discovery.service.d.ts +23 -1
- package/lib/core/services/report-session-context.service.d.ts +9 -0
- package/lib/core/tokens/designer-config.token.d.ts +4 -0
- package/lib/core/tokens/reporting-config.token.d.ts +4 -0
- package/lib/core/utils/report-endpoint.util.d.ts +12 -0
- package/lib/core/utils/report-request-scope.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +2 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +1 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +6 -2
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +4 -2
- package/lib/data-access/adapters/endpoint-tokens.d.ts +7 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +1 -3
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -4
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +11 -16
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +3 -5
- package/lib/data-access/adapters/index.d.ts +1 -1
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +2 -2
- package/lib/data-access/adapters/report-id-availability.d.ts +6 -0
- package/lib/data-access/adapters/session-headers.d.ts +3 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +3 -0
- package/lib/data-access/contracts/report-persistence.contract.d.ts +16 -1
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +16 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +2 -0
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +37 -5
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +21 -3
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -7
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +2 -1
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -1
- package/lib/features/designer/designer.component.d.ts +16 -2
- package/lib/features/designer/rpt-report-designer.component.d.ts +5 -1
- package/lib/features/designer/services/designer-config.service.d.ts +13 -0
- package/lib/features/designer/services/designer-endpoints.service.d.ts +25 -0
- package/lib/features/persistence/services/report-store.service.d.ts +15 -1
- package/lib/features/persistence/services/schema-validator.service.d.ts +2 -0
- package/lib/features/routing/resolvers/report-route-identifier.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +4 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +4 -1
- package/lib/features/runtime/report-runtime.component.d.ts +14 -1
- package/lib/features/runtime/rpt-report.component.d.ts +5 -0
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +3 -1
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/radio/rpt-radio.component.d.ts +77 -0
- package/package.json +2 -1
|
@@ -19,6 +19,8 @@ import * as i0 from "@angular/core";
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
export class RptReportDesignerComponent {
|
|
22
|
+
config = input(null);
|
|
23
|
+
apiUrl = input(null);
|
|
22
24
|
/** Report ID to automatically load via configured ReportPersistenceAdapter */
|
|
23
25
|
id = input();
|
|
24
26
|
/** Report definition to load directly in memory */
|
|
@@ -43,7 +45,7 @@ export class RptReportDesignerComponent {
|
|
|
43
45
|
this.closed.emit();
|
|
44
46
|
}
|
|
45
47
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportDesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
46
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportDesignerComponent, isStandalone: true, selector: "rpt-report-designer, rpt-designer-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", closed: "closed", definitionChange: "definitionChange" }, ngImport: i0, template: `
|
|
48
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportDesignerComponent, isStandalone: true, selector: "rpt-report-designer, rpt-designer-view", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, apiUrl: { classPropertyName: "apiUrl", publicName: "apiUrl", 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 }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, closeLabel: { classPropertyName: "closeLabel", publicName: "closeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", closed: "closed", definitionChange: "definitionChange" }, ngImport: i0, template: `
|
|
47
49
|
<div class="rpt-designer-facade">
|
|
48
50
|
@if (showCloseButton()) {
|
|
49
51
|
<div class="rpt-facade-top-bar">
|
|
@@ -61,6 +63,8 @@ export class RptReportDesignerComponent {
|
|
|
61
63
|
|
|
62
64
|
<div class="rpt-designer-wrapper">
|
|
63
65
|
<rpt-designer
|
|
66
|
+
[config]="config()"
|
|
67
|
+
[apiUrl]="apiUrl()"
|
|
64
68
|
[reportId]="id()"
|
|
65
69
|
[initialReport]="report()"
|
|
66
70
|
(save)="onSave($event)"
|
|
@@ -68,7 +72,7 @@ export class RptReportDesignerComponent {
|
|
|
68
72
|
/>
|
|
69
73
|
</div>
|
|
70
74
|
</div>
|
|
71
|
-
`, isInline: true, styles: [":host{display:
|
|
75
|
+
`, isInline: true, styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;width:100%;height:100%;box-sizing:border-box}.rpt-designer-facade{flex:1;min-height:0;display:flex;flex-direction:column;width:100%;height:100%;position:relative;background:#f8fafc;overflow:hidden}.rpt-facade-top-bar{flex-shrink:0;display:flex;align-items:center;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:20}.rpt-btn-close{display:inline-flex;align-items:center;gap:6px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;padding:6px 12px;border-radius:6px;font-size:.825rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-btn-close:hover{background:#e2e8f0;color:#0f172a}.rpt-designer-wrapper{flex:1;min-height:0;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DesignerComponent, selector: "rpt-designer", inputs: ["config", "apiUrl", "reportId", "initialReport"], outputs: ["save", "definitionChange"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
72
76
|
}
|
|
73
77
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportDesignerComponent, decorators: [{
|
|
74
78
|
type: Component,
|
|
@@ -90,6 +94,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
90
94
|
|
|
91
95
|
<div class="rpt-designer-wrapper">
|
|
92
96
|
<rpt-designer
|
|
97
|
+
[config]="config()"
|
|
98
|
+
[apiUrl]="apiUrl()"
|
|
93
99
|
[reportId]="id()"
|
|
94
100
|
[initialReport]="report()"
|
|
95
101
|
(save)="onSave($event)"
|
|
@@ -97,6 +103,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
97
103
|
/>
|
|
98
104
|
</div>
|
|
99
105
|
</div>
|
|
100
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:
|
|
106
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;width:100%;height:100%;box-sizing:border-box}.rpt-designer-facade{flex:1;min-height:0;display:flex;flex-direction:column;width:100%;height:100%;position:relative;background:#f8fafc;overflow:hidden}.rpt-facade-top-bar{flex-shrink:0;display:flex;align-items:center;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:20}.rpt-btn-close{display:inline-flex;align-items:center;gap:6px;background:#f1f5f9;color:#334155;border:1px solid #cbd5e1;padding:6px 12px;border-radius:6px;font-size:.825rem;font-weight:500;cursor:pointer;transition:all .15s ease}.rpt-btn-close:hover{background:#e2e8f0;color:#0f172a}.rpt-designer-wrapper{flex:1;min-height:0;position:relative}\n"] }]
|
|
101
107
|
}] });
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXJlcG9ydC1kZXNpZ25lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9ycHQtcmVwb3J0LWRlc2lnbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7QUFFdkY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUEwRkgsTUFBTSxPQUFPLDBCQUEwQjtJQUM1QixNQUFNLEdBQUcsS0FBSyxDQUEyQixJQUFJLENBQUMsQ0FBQztJQUMvQyxNQUFNLEdBQUcsS0FBSyxDQUE0QixJQUFJLENBQUMsQ0FBQztJQUN6RCw4RUFBOEU7SUFDckUsRUFBRSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBRTlCLG1EQUFtRDtJQUMxQyxNQUFNLEdBQUcsS0FBSyxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUV2RCxvREFBb0Q7SUFDM0MsZUFBZSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUVqRCw2QkFBNkI7SUFDcEIsVUFBVSxHQUFHLEtBQUssQ0FBUyxNQUFNLENBQUMsQ0FBQztJQUU1Qyx5Q0FBeUM7SUFDaEMsS0FBSyxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUU1QyxnREFBZ0Q7SUFDdkMsTUFBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRWpDLHVEQUF1RDtJQUM5QyxnQkFBZ0IsR0FBRyxNQUFNLEVBQW9CLENBQUM7SUFFdkQsTUFBTSxDQUFDLFVBQTRCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUE0QjtRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO3dHQWxDVSwwQkFBMEI7NEZBQTFCLDBCQUEwQixnOEJBckYzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJULDh6QkE1QlMsWUFBWSwrQkFBRSxpQkFBaUIsMkpBQUUsZ0JBQWdCOzs0RkFzRmhELDBCQUEwQjtrQkF6RnRDLFNBQVM7K0JBQ0Usd0NBQXdDLGNBQ3RDLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxZQUNsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJULG1CQXdEZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ3YXlzUmVwb3J0Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS9jb25maWcvYndheXMtcmVwb3J0LWNvbmZpZyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ3YXlzUmVwb3J0QXBpVXJscyB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2VuZHBvaW50LXRva2Vucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcbmltcG9ydCB7IERlc2lnbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5cbi8qKlxuICogYDxycHQtcmVwb3J0LWRlc2lnbmVyPmAgKGFuZCBgPHJwdC1kZXNpZ25lci12aWV3PmApXG4gKlxuICogMS10YWcgZmFjYWRlIGNvbXBvbmVudCBmb3IgdmlzdWFsIHJlcG9ydCBidWlsZGluZy5cbiAqIFNpbXBsaWZpZXMgcmVwb3J0IGNyZWF0aW9uIGFuZCBlZGl0aW5nIGFjcm9zcyBBbmd1bGFyIGFwcHMgYW5kIEVSUCBzdWl0ZXMuXG4gKlxuICogVXNhZ2U6XG4gKiBgYGBodG1sXG4gKiA8IS0tIExvYWQgYW5kIGVkaXQgYnkgSUQgd2l0aCBhdXRvbWF0aWMgcGVyc2lzdGVuY2UgLS0+XG4gKiA8cnB0LXJlcG9ydC1kZXNpZ25lciBbaWRdPVwiJ3NhbGVzLXJlcG9ydCdcIiAoc2F2ZWQpPVwib25SZXBvcnRTYXZlZCgkZXZlbnQpXCIgLz5cbiAqXG4gKiA8IS0tIE9yIHBhc3MgaW4tbWVtb3J5IHJlcG9ydCBvYmplY3QgLS0+XG4gKiA8cnB0LXJlcG9ydC1kZXNpZ25lciBbcmVwb3J0XT1cIm15UmVwb3J0XCIgKHNhdmVkKT1cIm9uUmVwb3J0U2F2ZWQoJGV2ZW50KVwiIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXJlcG9ydC1kZXNpZ25lciwgcnB0LWRlc2lnbmVyLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZXNpZ25lckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1kZXNpZ25lci1mYWNhZGVcIj5cbiAgICAgIEBpZiAoc2hvd0Nsb3NlQnV0dG9uKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1mYWNhZGUtdG9wLWJhclwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLWNsb3NlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIERlc2lnbmVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImFycm93LWxlZnRcIiBbc2l6ZV09XCIxNlwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyBjbG9zZUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWRlc2lnbmVyLXdyYXBwZXJcIj5cbiAgICAgICAgPHJwdC1kZXNpZ25lclxuICAgICAgICAgIFtjb25maWddPVwiY29uZmlnKClcIlxuICAgICAgICAgIFthcGlVcmxdPVwiYXBpVXJsKClcIlxuICAgICAgICAgIFtyZXBvcnRJZF09XCJpZCgpXCJcbiAgICAgICAgICBbaW5pdGlhbFJlcG9ydF09XCJyZXBvcnQoKVwiXG4gICAgICAgICAgKHNhdmUpPVwib25TYXZlKCRldmVudClcIlxuICAgICAgICAgIChkZWZpbml0aW9uQ2hhbmdlKT1cIm9uRGVmaW5pdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLnJwdC1kZXNpZ25lci1mYWNhZGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuICAgIC5ycHQtZmFjYWRlLXRvcC1iYXIge1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgei1pbmRleDogMjA7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNsb3NlIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjgyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tY2xvc2U6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2UyZThmMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cbiAgICAucnB0LWRlc2lnbmVyLXdyYXBwZXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJwdFJlcG9ydERlc2lnbmVyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQ8QndheXNSZXBvcnRDb25maWcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgYXBpVXJsID0gaW5wdXQ8QndheXNSZXBvcnRBcGlVcmxzIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBSZXBvcnQgSUQgdG8gYXV0b21hdGljYWxseSBsb2FkIHZpYSBjb25maWd1cmVkIFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciAqL1xuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvKiogUmVwb3J0IGRlZmluaXRpb24gdG8gbG9hZCBkaXJlY3RseSBpbiBtZW1vcnkgKi9cbiAgcmVhZG9ubHkgcmVwb3J0ID0gaW5wdXQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHJlbmRlciBhIGJhY2svY2xvc2UgYnV0dG9uIHRvb2xiYXIgKi9cbiAgcmVhZG9ubHkgc2hvd0Nsb3NlQnV0dG9uID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKiBMYWJlbCBmb3IgY2xvc2UgYnV0dG9uICovXG4gIHJlYWRvbmx5IGNsb3NlTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCdCYWNrJyk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIHNhdmVzIHRoZSByZXBvcnQgKi9cbiAgcmVhZG9ubHkgc2F2ZWQgPSBvdXRwdXQ8UmVwb3J0RGVmaW5pdGlvbj4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIHRoZSBjbG9zZSBidXR0b24gKi9cbiAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGRlc2lnbmVyIGRlZmluaXRpb24gY2hhbmdlcyAqL1xuICByZWFkb25seSBkZWZpbml0aW9uQ2hhbmdlID0gb3V0cHV0PFJlcG9ydERlZmluaXRpb24+KCk7XG5cbiAgb25TYXZlKGRlZmluaXRpb246IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVkLmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBvbkRlZmluaXRpb25DaGFuZ2UoZGVmaW5pdGlvbjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuZGVmaW5pdGlvbkNoYW5nZS5lbWl0KGRlZmluaXRpb24pO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { inject, Injectable, signal, computed } from '@angular/core';
|
|
2
|
+
import { normalizeBwaysConfig } from '../../../core/config/bways-report-config';
|
|
3
|
+
import { REPORTING_CONFIG } from '../../../core/tokens/reporting-config.token';
|
|
4
|
+
import { ComponentRegistry } from '../../../core/registry/component-registry';
|
|
5
|
+
import { registerBuiltinComponents } from '../../../primitives/register-builtins';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class DesignerConfigService {
|
|
8
|
+
inherited = inject(REPORTING_CONFIG, { skipSelf: true, optional: true });
|
|
9
|
+
local = signal(null);
|
|
10
|
+
effective = computed(() => {
|
|
11
|
+
const config = this.local();
|
|
12
|
+
const normalized = normalizeBwaysConfig(config ?? {});
|
|
13
|
+
const inherited = {
|
|
14
|
+
defaultPageSize: 25, dateFormat: 'dd/MM/yyyy', schemaVersion: 1,
|
|
15
|
+
enableDesigner: true, autoParameter: true, routeBase: 'reports', lookupTimeoutMs: 300000,
|
|
16
|
+
...this.inherited,
|
|
17
|
+
};
|
|
18
|
+
if (!config)
|
|
19
|
+
return inherited;
|
|
20
|
+
const result = { ...inherited };
|
|
21
|
+
for (const key of ['defaultPageSize', 'dateFormat', 'lookupTimeoutMs', 'autoParameter', 'routeBase', 'executionTimeoutMs', 'trustedApiOrigins']) {
|
|
22
|
+
if (config[key] !== undefined)
|
|
23
|
+
result[key] = normalized[key];
|
|
24
|
+
}
|
|
25
|
+
if (config.lookupTimeoutMs !== undefined && config.executionTimeoutMs === undefined && this.inherited?.executionTimeoutMs === undefined)
|
|
26
|
+
result.executionTimeoutMs = normalized.executionTimeoutMs;
|
|
27
|
+
if (config.components !== undefined)
|
|
28
|
+
result.allowedCategories = normalized.allowedCategories;
|
|
29
|
+
return result;
|
|
30
|
+
});
|
|
31
|
+
reporting = new Proxy({}, {
|
|
32
|
+
get: (_, key) => this.effective()[key],
|
|
33
|
+
ownKeys: () => Reflect.ownKeys(this.effective()),
|
|
34
|
+
getOwnPropertyDescriptor: () => ({ configurable: true, enumerable: true }),
|
|
35
|
+
});
|
|
36
|
+
constructor() {
|
|
37
|
+
const registry = inject(ComponentRegistry);
|
|
38
|
+
// Register missing builtins once, preserving host registrations.
|
|
39
|
+
const builtins = new ComponentRegistry();
|
|
40
|
+
registerBuiltinComponents(builtins);
|
|
41
|
+
for (const item of builtins.getAll())
|
|
42
|
+
if (!registry.resolve(item.type))
|
|
43
|
+
registry.register(item);
|
|
44
|
+
}
|
|
45
|
+
set(value) {
|
|
46
|
+
const next = value == null ? null : Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined));
|
|
47
|
+
normalizeBwaysConfig(next ?? {});
|
|
48
|
+
this.local.set(next);
|
|
49
|
+
}
|
|
50
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
51
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerConfigService });
|
|
52
|
+
}
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerConfigService, decorators: [{
|
|
54
|
+
type: Injectable
|
|
55
|
+
}], ctorParameters: () => [] });
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9zZXJ2aWNlcy9kZXNpZ25lci1jb25maWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0sNkNBQTZDLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBR2xGLE1BQU0sT0FBTyxxQkFBcUI7SUFDZixTQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRixLQUFLLEdBQUcsTUFBTSxDQUEyQixJQUFJLENBQUMsQ0FBQztJQUN2QyxTQUFTLEdBQUcsUUFBUSxDQUFrQixHQUFHLEVBQUU7UUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBb0I7WUFDakMsZUFBZSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQy9ELGNBQWMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNO1lBQ3hGLEdBQUcsSUFBSSxDQUFDLFNBQVM7U0FDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsQ0FBVSxFQUFFLENBQUM7WUFDekosSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztnQkFBRyxNQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsS0FBSyxTQUFTO1lBQUUsTUFBTSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztRQUNuTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsaUJBQWlCLENBQUM7UUFDN0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBcUIsRUFBRTtRQUNwRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBMEIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUM3RCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEQsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzNFLENBQUMsQ0FBQztJQUVIO1FBQ0UsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0MsaUVBQWlFO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN6Qyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUEyQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBc0IsQ0FBQztRQUM1SSxvQkFBb0IsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQzt3R0F0Q1UscUJBQXFCOzRHQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ3YXlzUmVwb3J0Q29uZmlnLCBub3JtYWxpemVCd2F5c0NvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29uZmlnL2J3YXlzLXJlcG9ydC1jb25maWcnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0NPTkZJRywgUmVwb3J0aW5nQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5pbXBvcnQgeyBDb21wb25lbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvY29tcG9uZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7IHJlZ2lzdGVyQnVpbHRpbkNvbXBvbmVudHMgfSBmcm9tICcuLi8uLi8uLi9wcmltaXRpdmVzL3JlZ2lzdGVyLWJ1aWx0aW5zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyQ29uZmlnU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5oZXJpdGVkID0gaW5qZWN0KFJFUE9SVElOR19DT05GSUcsIHsgc2tpcFNlbGY6IHRydWUsIG9wdGlvbmFsOiB0cnVlIH0pO1xuICByZWFkb25seSBsb2NhbCA9IHNpZ25hbDxCd2F5c1JlcG9ydENvbmZpZyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVmZmVjdGl2ZSA9IGNvbXB1dGVkPFJlcG9ydGluZ0NvbmZpZz4oKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubG9jYWwoKTtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQndheXNDb25maWcoY29uZmlnID8/IHt9KTtcbiAgICBjb25zdCBpbmhlcml0ZWQ6IFJlcG9ydGluZ0NvbmZpZyA9IHtcbiAgICAgIGRlZmF1bHRQYWdlU2l6ZTogMjUsIGRhdGVGb3JtYXQ6ICdkZC9NTS95eXl5Jywgc2NoZW1hVmVyc2lvbjogMSxcbiAgICAgIGVuYWJsZURlc2lnbmVyOiB0cnVlLCBhdXRvUGFyYW1ldGVyOiB0cnVlLCByb3V0ZUJhc2U6ICdyZXBvcnRzJywgbG9va3VwVGltZW91dE1zOiAzMDAwMDAsXG4gICAgICAuLi50aGlzLmluaGVyaXRlZCxcbiAgICB9O1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gaW5oZXJpdGVkO1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uaW5oZXJpdGVkIH07XG4gICAgZm9yIChjb25zdCBrZXkgb2YgWydkZWZhdWx0UGFnZVNpemUnLCAnZGF0ZUZvcm1hdCcsICdsb29rdXBUaW1lb3V0TXMnLCAnYXV0b1BhcmFtZXRlcicsICdyb3V0ZUJhc2UnLCAnZXhlY3V0aW9uVGltZW91dE1zJywgJ3RydXN0ZWRBcGlPcmlnaW5zJ10gYXMgY29uc3QpIHtcbiAgICAgIGlmIChjb25maWdba2V5XSAhPT0gdW5kZWZpbmVkKSAocmVzdWx0IGFzIGFueSlba2V5XSA9IG5vcm1hbGl6ZWRba2V5XTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5sb29rdXBUaW1lb3V0TXMgIT09IHVuZGVmaW5lZCAmJiBjb25maWcuZXhlY3V0aW9uVGltZW91dE1zID09PSB1bmRlZmluZWQgJiYgdGhpcy5pbmhlcml0ZWQ/LmV4ZWN1dGlvblRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkKSByZXN1bHQuZXhlY3V0aW9uVGltZW91dE1zID0gbm9ybWFsaXplZC5leGVjdXRpb25UaW1lb3V0TXM7XG4gICAgaWYgKGNvbmZpZy5jb21wb25lbnRzICE9PSB1bmRlZmluZWQpIHJlc3VsdC5hbGxvd2VkQ2F0ZWdvcmllcyA9IG5vcm1hbGl6ZWQuYWxsb3dlZENhdGVnb3JpZXM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG4gIHJlYWRvbmx5IHJlcG9ydGluZyA9IG5ldyBQcm94eSh7fSBhcyBSZXBvcnRpbmdDb25maWcsIHtcbiAgICBnZXQ6IChfLCBrZXk6IGtleW9mIFJlcG9ydGluZ0NvbmZpZykgPT4gdGhpcy5lZmZlY3RpdmUoKVtrZXldLFxuICAgIG93bktleXM6ICgpID0+IFJlZmxlY3Qub3duS2V5cyh0aGlzLmVmZmVjdGl2ZSgpKSxcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICgpID0+ICh7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgcmVnaXN0cnkgPSBpbmplY3QoQ29tcG9uZW50UmVnaXN0cnkpO1xuICAgIC8vIFJlZ2lzdGVyIG1pc3NpbmcgYnVpbHRpbnMgb25jZSwgcHJlc2VydmluZyBob3N0IHJlZ2lzdHJhdGlvbnMuXG4gICAgY29uc3QgYnVpbHRpbnMgPSBuZXcgQ29tcG9uZW50UmVnaXN0cnkoKTtcbiAgICByZWdpc3RlckJ1aWx0aW5Db21wb25lbnRzKGJ1aWx0aW5zKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYnVpbHRpbnMuZ2V0QWxsKCkpIGlmICghcmVnaXN0cnkucmVzb2x2ZShpdGVtLnR5cGUpKSByZWdpc3RyeS5yZWdpc3RlcihpdGVtKTtcbiAgfVxuXG4gIHNldCh2YWx1ZTogQndheXNSZXBvcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID09IG51bGwgPyBudWxsIDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5maWx0ZXIoKFssIGl0ZW1dKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpKSBhcyBCd2F5c1JlcG9ydENvbmZpZztcbiAgICBub3JtYWxpemVCd2F5c0NvbmZpZyhuZXh0ID8/IHt9KTtcbiAgICB0aGlzLmxvY2FsLnNldChuZXh0KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { DesignerConfigService } from './designer-config.service';
|
|
2
|
+
import { DESIGNER_LOCAL_CONFIG } from '../../../core/tokens/designer-config.token';
|
|
3
|
+
import { ReportSessionContextService } from '../../../core/services/report-session-context.service';
|
|
4
|
+
import { HttpReportDataSourceAdapter } from '../../../data-access/adapters/http-datasource.adapter';
|
|
5
|
+
import { HttpReportLookupAdapter } from '../../../data-access/adapters/http-lookup.adapter';
|
|
6
|
+
import { HttpReportSchemaDiscoveryAdapter } from '../../../data-access/adapters/http-schema-discovery.adapter';
|
|
7
|
+
import { HttpMasterDataAdapter } from '../../../data-access/adapters/http-masterdata.adapter';
|
|
8
|
+
import { resolveReportsEndpoint } from '../../../core/utils/report-endpoint.util';
|
|
9
|
+
import { HttpReportPersistenceAdapter } from '../../../data-access/adapters/http-persistence.adapter';
|
|
10
|
+
import { ReportStoreService } from '../../persistence/services/report-store.service';
|
|
11
|
+
import { inject, Injectable, Injector, runInInjectionContext, signal, computed } from '@angular/core';
|
|
12
|
+
import { of, throwError } from 'rxjs';
|
|
13
|
+
import { BWAYS_REPORT_ENDPOINTS } from '../../../data-access/adapters/endpoint-tokens';
|
|
14
|
+
import { REPORTING_CONFIG } from '../../../core/tokens/reporting-config.token';
|
|
15
|
+
import { ReportDataSourceAdapter } from '../../../data-access/contracts/data-source.contract';
|
|
16
|
+
import { ReportPersistenceAdapter } from '../../../data-access/contracts/report-persistence.contract';
|
|
17
|
+
import { ReportSchemaDiscoveryAdapter } from '../../../data-access/contracts/schema-discovery.contract';
|
|
18
|
+
import { ReportLookupAdapter } from '../../../data-access/contracts/lookup.contract';
|
|
19
|
+
import { MasterDataProvider } from '../../../data-access/contracts/master-data.provider';
|
|
20
|
+
import { EndpointDataSourceAdapter } from '../../../data-access/adapters/endpoint-datasource.adapter';
|
|
21
|
+
import { EndpointPersistenceAdapter } from '../../../data-access/adapters/endpoint-persistence.adapter';
|
|
22
|
+
import { EndpointSchemaDiscoveryAdapter } from '../../../data-access/adapters/endpoint-schema-discovery.adapter';
|
|
23
|
+
import { EndpointLookupAdapter } from '../../../data-access/adapters/endpoint-lookup.adapter';
|
|
24
|
+
import { EndpointMasterDataAdapter } from '../../../data-access/adapters/endpoint-masterdata.adapter';
|
|
25
|
+
import { ReportApiExecutionService } from '../../../core/services/report-api-execution.service';
|
|
26
|
+
import { ReportDataDiscoveryService } from '../../../core/services/report-data-discovery.service';
|
|
27
|
+
import { ReportExecutionService } from '../../runtime/report-execution.service';
|
|
28
|
+
import * as i0 from "@angular/core";
|
|
29
|
+
/** Private state owned by one designer; never mutates application providers. */
|
|
30
|
+
export class DesignerEndpointsService {
|
|
31
|
+
defaults = inject(BWAYS_REPORT_ENDPOINTS, { skipSelf: true, optional: true });
|
|
32
|
+
config = inject(REPORTING_CONFIG, { optional: true });
|
|
33
|
+
injector = inject(Injector);
|
|
34
|
+
pageConfig = inject(DesignerConfigService);
|
|
35
|
+
adapters = new Map();
|
|
36
|
+
overrides = {};
|
|
37
|
+
revision = signal(0);
|
|
38
|
+
resolved = computed(() => { this.revision(); return this.merged(); });
|
|
39
|
+
endpoints = new Proxy({}, {
|
|
40
|
+
get: (_, key) => this.resolved()[key],
|
|
41
|
+
ownKeys: () => Reflect.ownKeys(this.resolved()),
|
|
42
|
+
getOwnPropertyDescriptor: () => ({ configurable: true, enumerable: true }),
|
|
43
|
+
});
|
|
44
|
+
setOverrides(value) {
|
|
45
|
+
const next = {};
|
|
46
|
+
for (const key of ['spEndpoint', 'tablesEndpoint', 'executeEndpoint', 'lookupEndpoint', 'reportsEndpoint', 'apisEndpoint']) {
|
|
47
|
+
const url = value?.[key];
|
|
48
|
+
if (url === undefined)
|
|
49
|
+
continue;
|
|
50
|
+
if (typeof url !== 'string' || !url.trim()) {
|
|
51
|
+
throw new Error('[bways-report] apiUrl.' + key + ' must be a non-empty URL.');
|
|
52
|
+
}
|
|
53
|
+
next[key] = url.trim().replace(/\/+$/, '');
|
|
54
|
+
}
|
|
55
|
+
if (JSON.stringify(next) === JSON.stringify(this.overrides))
|
|
56
|
+
return;
|
|
57
|
+
this.overrides = next;
|
|
58
|
+
// Schema and lookup caches belong to the endpoint configuration that created them.
|
|
59
|
+
this.adapters.clear();
|
|
60
|
+
this.revision.update(value => value + 1);
|
|
61
|
+
}
|
|
62
|
+
hasOverride(keys) {
|
|
63
|
+
return keys.some(key => this.overrides[key] !== undefined || this.pageConfig.local()?.[key] !== undefined);
|
|
64
|
+
}
|
|
65
|
+
adapter(type) {
|
|
66
|
+
if (!this.adapters.has(type)) {
|
|
67
|
+
this.adapters.set(type, runInInjectionContext(this.injector, () => new type()));
|
|
68
|
+
}
|
|
69
|
+
return this.adapters.get(type);
|
|
70
|
+
}
|
|
71
|
+
isConfigured() { return this.pageConfig.local() !== null; }
|
|
72
|
+
refresh() {
|
|
73
|
+
this.adapters.clear();
|
|
74
|
+
this.revision.update(value => value + 1);
|
|
75
|
+
}
|
|
76
|
+
usesDefaultStorageBase() {
|
|
77
|
+
return !this.defaults?.reportsEndpoint && (!this.config?.apiBaseUrl || this.config.apiBaseUrl === '/api/reporting');
|
|
78
|
+
}
|
|
79
|
+
merged() {
|
|
80
|
+
const base = this.config?.apiBaseUrl?.replace(/\/+$/, '');
|
|
81
|
+
const local = this.pageConfig.local();
|
|
82
|
+
const localEndpoints = Object.fromEntries(Object.entries(local ?? {}).filter(([key]) => ['spEndpoint', 'tablesEndpoint', 'executeEndpoint', 'lookupEndpoint', 'reportsEndpoint', 'apisEndpoint', 'apiEndpoints'].includes(key)));
|
|
83
|
+
return {
|
|
84
|
+
spEndpoint: base ? base + '/procedures' : '',
|
|
85
|
+
tablesEndpoint: base ? base + '/tables' : '',
|
|
86
|
+
executeEndpoint: base ? base + '/execute' : '',
|
|
87
|
+
lookupEndpoint: base ? base + '/lookup' : null,
|
|
88
|
+
reportsEndpoint: this.usesDefaultStorageBase()
|
|
89
|
+
? resolveReportsEndpoint(this.overrides) : (base ? base + '/reports' : '/api/reporting/reports'),
|
|
90
|
+
apisEndpoint: base ? base + '/apis' : null,
|
|
91
|
+
...this.defaults,
|
|
92
|
+
...localEndpoints,
|
|
93
|
+
...(local?.executeEndpoint !== undefined && /\/execute\/?$/.test(local.executeEndpoint) && local.lookupEndpoint === undefined && !this.defaults?.lookupEndpoint
|
|
94
|
+
? { lookupEndpoint: local.executeEndpoint.replace(/\/execute\/?$/, '/lookup') } : {}),
|
|
95
|
+
...(local && this.usesDefaultStorageBase() && ['spEndpoint', 'tablesEndpoint', 'executeEndpoint', 'lookupEndpoint', 'apisEndpoint'].some(key => local[key] !== undefined)
|
|
96
|
+
? { reportsEndpoint: resolveReportsEndpoint({ ...local, ...this.overrides }) } : {}),
|
|
97
|
+
...this.overrides,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerEndpointsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
101
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerEndpointsService });
|
|
102
|
+
}
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerEndpointsService, decorators: [{
|
|
104
|
+
type: Injectable
|
|
105
|
+
}] });
|
|
106
|
+
// Delegation is lazy: Angular binds inputs before children make requests, and
|
|
107
|
+
// an unused capability never requires HttpClient or replaces a custom adapter.
|
|
108
|
+
function scopedAdapter(token, type, keys, fallback) {
|
|
109
|
+
return {
|
|
110
|
+
provide: token,
|
|
111
|
+
useFactory: () => {
|
|
112
|
+
const scope = inject(DesignerEndpointsService);
|
|
113
|
+
const parent = inject(token, { skipSelf: true, optional: true });
|
|
114
|
+
return new Proxy(fallback, {
|
|
115
|
+
get: (_, property) => !(property in fallback) ? undefined : (...args) => {
|
|
116
|
+
const overridden = typeof keys === 'function' ? keys(scope, parent) : scope.hasOverride(keys);
|
|
117
|
+
const builtIn = parent instanceof type || [HttpReportDataSourceAdapter, HttpReportPersistenceAdapter,
|
|
118
|
+
HttpReportLookupAdapter, HttpReportSchemaDiscoveryAdapter, HttpMasterDataAdapter].some(adapter => parent instanceof adapter);
|
|
119
|
+
const target = overridden || !parent || (scope.isConfigured() && builtIn) ? scope.adapter(type) : parent;
|
|
120
|
+
if ((property === 'checkId' || property === 'inspectId') && typeof target[property] !== 'function') {
|
|
121
|
+
return property === 'checkId' ? ReportPersistenceAdapter.prototype.checkId.call(target, args[0])
|
|
122
|
+
: ReportPersistenceAdapter.prototype.inspectId.call(target, args[0]);
|
|
123
|
+
}
|
|
124
|
+
return target[property](...args);
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const unavailable = () => throwError(() => new Error('[bways-report] No adapter configured for this capability.'));
|
|
131
|
+
export const DESIGNER_ENDPOINT_PROVIDERS = [
|
|
132
|
+
DesignerConfigService,
|
|
133
|
+
{ provide: REPORTING_CONFIG, useFactory: () => inject(DesignerConfigService).reporting },
|
|
134
|
+
{ provide: DESIGNER_LOCAL_CONFIG, useFactory: () => inject(DesignerConfigService).local },
|
|
135
|
+
ReportSessionContextService,
|
|
136
|
+
DesignerEndpointsService,
|
|
137
|
+
{ provide: BWAYS_REPORT_ENDPOINTS, useFactory: () => inject(DesignerEndpointsService).endpoints },
|
|
138
|
+
scopedAdapter(ReportDataSourceAdapter, EndpointDataSourceAdapter, ['executeEndpoint'], { execute: unavailable }),
|
|
139
|
+
scopedAdapter(ReportPersistenceAdapter, EndpointPersistenceAdapter, (scope, parent) => scope.hasOverride(['reportsEndpoint']) || (parent instanceof HttpReportPersistenceAdapter && scope.usesDefaultStorageBase() &&
|
|
140
|
+
scope.hasOverride(['executeEndpoint', 'spEndpoint', 'tablesEndpoint', 'lookupEndpoint', 'apisEndpoint'])), {
|
|
141
|
+
inspectId: unavailable, checkId: unavailable, load: unavailable, save: unavailable, list: () => of([]), delete: unavailable, publish: unavailable,
|
|
142
|
+
}),
|
|
143
|
+
scopedAdapter(ReportSchemaDiscoveryAdapter, EndpointSchemaDiscoveryAdapter, ['spEndpoint', 'tablesEndpoint'], {
|
|
144
|
+
getEntities: () => of([]), getColumns: () => of([]), getParameters: () => of([]),
|
|
145
|
+
}),
|
|
146
|
+
scopedAdapter(ReportLookupAdapter, EndpointLookupAdapter, ['lookupEndpoint', 'executeEndpoint'], { fetchOptions: () => of([]) }),
|
|
147
|
+
scopedAdapter(MasterDataProvider, EndpointMasterDataAdapter, ['executeEndpoint'], { getMasterData: () => of([]) }),
|
|
148
|
+
ReportApiExecutionService,
|
|
149
|
+
ReportDataDiscoveryService,
|
|
150
|
+
ReportStoreService,
|
|
151
|
+
scopedAdapter(ReportExecutionService, ReportExecutionService, ['executeEndpoint', 'apisEndpoint'], {
|
|
152
|
+
execute: unavailable, getMissingFields: () => [],
|
|
153
|
+
}),
|
|
154
|
+
];
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItZW5kcG9pbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9zZXJ2aWNlcy9kZXNpZ25lci1lbmRwb2ludHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMvRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN0RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQVkscUJBQXFCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQTRDLE1BQU0sK0NBQStDLENBQUM7QUFDakksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDdEcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDeEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDdEcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDeEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDakgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDOUYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDdEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDaEcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRWhGLGdGQUFnRjtBQUVoRixNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FBRyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLFVBQVUsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMzQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFDdEQsU0FBUyxHQUF1QixFQUFFLENBQUM7SUFDbEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUViLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBMEIsRUFBRTtRQUN6RCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBK0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0Msd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzNFLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyxLQUE0QztRQUN2RCxNQUFNLElBQUksR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxDQUFVLEVBQUUsQ0FBQztZQUNwSSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLEdBQUcsS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDaEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLEdBQUcsMkJBQTJCLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTztRQUNwRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQWtDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsT0FBTyxDQUFJLElBQWE7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQVksS0FBYyxPQUFPLElBQUksQ0FBQyxVQUFVLENB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LEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQ2pGLENBQUM7SUFDRixhQUFhLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2hJLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbEgseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQixrQkFBa0I7SUFDbEIsYUFBYSxDQUFDLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLEVBQUU7UUFDakcsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0tBQ1osQ0FBQztDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVzaWduZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9kZXNpZ25lci1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBERVNJR05FUl9MT0NBTF9DT05GSUcgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Rva2Vucy9kZXNpZ25lci1jb25maWcudG9rZW4nO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvYWRhcHRlcnMvaHR0cC1kYXRhc291cmNlLmFkYXB0ZXInO1xuaW1wb3J0IHsgSHR0cFJlcG9ydExvb2t1cEFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9hZGFwdGVycy9odHRwLWxvb2t1cC5hZGFwdGVyJztcbmltcG9ydCB7IEh0dHBSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvYWRhcHRlcnMvaHR0cC1zY2hlbWEtZGlzY292ZXJ5LmFkYXB0ZXInO1xuaW1wb3J0IHsgSHR0cE1hc3RlckRhdGFBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvYWRhcHRlcnMvaHR0cC1tYXN0ZXJkYXRhLmFkYXB0ZXInO1xuaW1wb3J0IHsgcmVzb2x2ZVJlcG9ydHNFbmRwb2ludCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVwb3J0LWVuZHBvaW50LnV0aWwnO1xuaW1wb3J0IHsgSHR0cFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2h0dHAtcGVyc2lzdGVuY2UuYWRhcHRlcic7XG5pbXBvcnQgeyBSZXBvcnRTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9yZXBvcnQtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBQcm92aWRlciwgcnVuSW5JbmplY3Rpb25Db250ZXh0LCBzaWduYWwsIGNvbXB1dGVkLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQldBWVNfUkVQT1JUX0VORFBPSU5UUywgQndheXNSZXBvcnRBcGlVcmxzLCBCd2F5c1JlcG9ydEVuZHBvaW50cyB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2VuZHBvaW50LXRva2Vucyc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9kYXRhLXNvdXJjZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvcmVwb3J0LXBlcnNpc3RlbmNlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvc2NoZW1hLWRpc2NvdmVyeS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRMb29rdXBBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL2xvb2t1cC5jb250cmFjdCc7XG5pbXBvcnQgeyBNYXN0ZXJEYXRhUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvbWFzdGVyLWRhdGEucHJvdmlkZXInO1xuaW1wb3J0IHsgRW5kcG9pbnREYXRhU291cmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2VuZHBvaW50LWRhdGFzb3VyY2UuYWRhcHRlcic7XG5pbXBvcnQgeyBFbmRwb2ludFBlcnNpc3RlbmNlQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2VuZHBvaW50LXBlcnNpc3RlbmNlLmFkYXB0ZXInO1xuaW1wb3J0IHsgRW5kcG9pbnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvYWRhcHRlcnMvZW5kcG9pbnQtc2NoZW1hLWRpc2NvdmVyeS5hZGFwdGVyJztcbmltcG9ydCB7IEVuZHBvaW50TG9va3VwQWRhcHRlciB9IGZyb20gJy4uLy4uLy4uL2RhdGEtYWNjZXNzL2FkYXB0ZXJzL2VuZHBvaW50LWxvb2t1cC5hZGFwdGVyJztcbmltcG9ydCB7IEVuZHBvaW50TWFzdGVyRGF0YUFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9hZGFwdGVycy9lbmRwb2ludC1tYXN0ZXJkYXRhLmFkYXB0ZXInO1xuaW1wb3J0IHsgUmVwb3J0QXBpRXhlY3V0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LWFwaS1leGVjdXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhRGlzY292ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LWRhdGEtZGlzY292ZXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhlY3V0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvcmVwb3J0LWV4ZWN1dGlvbi5zZXJ2aWNlJztcblxuLyoqIFByaXZhdGUgc3RhdGUgb3duZWQgYnkgb25lIGRlc2lnbmVyOyBuZXZlciBtdXRhdGVzIGFwcGxpY2F0aW9uIHByb3ZpZGVycy4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckVuZHBvaW50c1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRzID0gaW5qZWN0KEJXQVlTX1JFUE9SVF9FTkRQT0lOVFMsIHsgc2tpcFNlbGY6IHRydWUsIG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChSRVBPUlRJTkdfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYWdlQ29uZmlnID0gaW5qZWN0KERlc2lnbmVyQ29uZmlnU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnMgPSBuZXcgTWFwPFR5cGU8dW5rbm93bj4sIHVua25vd24+KCk7XG4gIHByaXZhdGUgb3ZlcnJpZGVzOiBCd2F5c1JlcG9ydEFwaVVybHMgPSB7fTtcbiAgcmVhZG9ubHkgcmV2aXNpb24gPSBzaWduYWwoMCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZCA9IGNvbXB1dGVkKCgpID0+IHsgdGhpcy5yZXZpc2lvbigpOyByZXR1cm4gdGhpcy5tZXJnZWQoKTsgfSk7XG5cbiAgcmVhZG9ubHkgZW5kcG9pbnRzID0gbmV3IFByb3h5KHt9IGFzIEJ3YXlzUmVwb3J0RW5kcG9pbnRzLCB7XG4gICAgZ2V0OiAoXywga2V5OiBrZXlvZiBCd2F5c1JlcG9ydEVuZHBvaW50cykgPT4gdGhpcy5yZXNvbHZlZCgpW2tleV0sXG4gICAgb3duS2V5czogKCkgPT4gUmVmbGVjdC5vd25LZXlzKHRoaXMucmVzb2x2ZWQoKSksXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiAoeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfSksXG4gIH0pO1xuXG4gIHNldE92ZXJyaWRlcyh2YWx1ZTogQndheXNSZXBvcnRBcGlVcmxzIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQ6IEJ3YXlzUmVwb3J0QXBpVXJscyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFsnc3BFbmRwb2ludCcsICd0YWJsZXNFbmRwb2ludCcsICdleGVjdXRlRW5kcG9pbnQnLCAnbG9va3VwRW5kcG9pbnQnLCAncmVwb3J0c0VuZHBvaW50JywgJ2FwaXNFbmRwb2ludCddIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCB1cmwgPSB2YWx1ZT8uW2tleV07XG4gICAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnIHx8ICF1cmwudHJpbSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW2J3YXlzLXJlcG9ydF0gYXBpVXJsLicgKyBrZXkgKyAnIG11c3QgYmUgYSBub24tZW1wdHkgVVJMLicpO1xuICAgICAgfVxuICAgICAgbmV4dFtrZXldID0gdXJsLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KG5leHQpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLm92ZXJyaWRlcykpIHJldHVybjtcbiAgICB0aGlzLm92ZXJyaWRlcyA9IG5leHQ7XG4gICAgLy8gU2NoZW1hIGFuZCBsb29rdXAgY2FjaGVzIGJlbG9uZyB0byB0aGUgZW5kcG9pbnQgY29uZmlndXJhdGlvbiB0aGF0IGNyZWF0ZWQgdGhlbS5cbiAgICB0aGlzLmFkYXB0ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5yZXZpc2lvbi51cGRhdGUodmFsdWUgPT4gdmFsdWUgKyAxKTtcbiAgfVxuXG4gIGhhc092ZXJyaWRlKGtleXM6IChrZXlvZiBCd2F5c1JlcG9ydEFwaVVybHMpW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4ga2V5cy5zb21lKGtleSA9PiB0aGlzLm92ZXJyaWRlc1trZXldICE9PSB1bmRlZmluZWQgfHwgdGhpcy5wYWdlQ29uZmlnLmxvY2FsKCk/LltrZXldICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgYWRhcHRlcjxUPih0eXBlOiBUeXBlPFQ+KTogVCB7XG4gICAgaWYgKCF0aGlzLmFkYXB0ZXJzLmhhcyh0eXBlKSkge1xuICAgICAgdGhpcy5hZGFwdGVycy5zZXQodHlwZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IG5ldyB0eXBlKCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlcnMuZ2V0KHR5cGUpIGFzIFQ7XG4gIH1cblxuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBhZ2VDb25maWcubG9jYWwoKSAhPT0gbnVsbDsgfVxuXG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5hZGFwdGVycy5jbGVhcigpO1xuICAgIHRoaXMucmV2aXNpb24udXBkYXRlKHZhbHVlID0+IHZhbHVlICsgMSk7XG4gIH1cblxuICB1c2VzRGVmYXVsdFN0b3JhZ2VCYXNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kZWZhdWx0cz8ucmVwb3J0c0VuZHBvaW50ICYmICghdGhpcy5jb25maWc/LmFwaUJhc2VVcmwgfHwgdGhpcy5jb25maWcuYXBpQmFzZVVybCA9PT0gJy9hcGkvcmVwb3J0aW5nJyk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlZCgpOiBCd2F5c1JlcG9ydEVuZHBvaW50cyB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuY29uZmlnPy5hcGlCYXNlVXJsPy5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICBjb25zdCBsb2NhbCA9IHRoaXMucGFnZUNvbmZpZy5sb2NhbCgpO1xuICAgIGNvbnN0IGxvY2FsRW5kcG9pbnRzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGxvY2FsID8/IHt9KS5maWx0ZXIoKFtrZXldKSA9PiBbJ3NwRW5kcG9pbnQnLCAndGFibGVzRW5kcG9pbnQnLCAnZXhlY3V0ZUVuZHBvaW50JywgJ2xvb2t1cEVuZHBvaW50JywgJ3JlcG9ydHNFbmRwb2ludCcsICdhcGlzRW5kcG9pbnQnLCAnYXBpRW5kcG9pbnRzJ10uaW5jbHVkZXMoa2V5KSkpO1xuICAgIHJldHVybiB7XG4gICAgICBzcEVuZHBvaW50OiBiYXNlID8gYmFzZSArICcvcHJvY2VkdXJlcycgOiAnJyxcbiAgICAgIHRhYmxlc0VuZHBvaW50OiBiYXNlID8gYmFzZSArICcvdGFibGVzJyA6ICcnLFxuICAgICAgZXhlY3V0ZUVuZHBvaW50OiBiYXNlID8gYmFzZSArICcvZXhlY3V0ZScgOiAnJyxcbiAgICAgIGxvb2t1cEVuZHBvaW50OiBiYXNlID8gYmFzZSArICcvbG9va3VwJyA6IG51bGwsXG4gICAgICByZXBvcnRzRW5kcG9pbnQ6IHRoaXMudXNlc0RlZmF1bHRTdG9yYWdlQmFzZSgpXG4gICAgICAgID8gcmVzb2x2ZVJlcG9ydHNFbmRwb2ludCh0aGlzLm92ZXJyaWRlcykgOiAoYmFzZSA/IGJhc2UgKyAnL3JlcG9ydHMnIDogJy9hcGkvcmVwb3J0aW5nL3JlcG9ydHMnKSxcbiAgICAgIGFwaXNFbmRwb2ludDogYmFzZSA/IGJhc2UgKyAnL2FwaXMnIDogbnVsbCxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdHMsXG4gICAgICAuLi5sb2NhbEVuZHBvaW50cyxcbiAgICAgIC4uLihsb2NhbD8uZXhlY3V0ZUVuZHBvaW50ICE9PSB1bmRlZmluZWQgJiYgL1xcL2V4ZWN1dGVcXC8/JC8udGVzdChsb2NhbC5leGVjdXRlRW5kcG9pbnQpICYmIGxvY2FsLmxvb2t1cEVuZHBvaW50ID09PSB1bmRlZmluZWQgJiYgIXRoaXMuZGVmYXVsdHM/Lmxvb2t1cEVuZHBvaW50XG4gICAgICAgID8geyBsb29rdXBFbmRwb2ludDogbG9jYWwuZXhlY3V0ZUVuZHBvaW50LnJlcGxhY2UoL1xcL2V4ZWN1dGVcXC8/JC8sICcvbG9va3VwJykgfSA6IHt9KSxcbiAgICAgIC4uLihsb2NhbCAmJiB0aGlzLnVzZXNEZWZhdWx0U3RvcmFnZUJhc2UoKSAmJiBbJ3NwRW5kcG9pbnQnLCAndGFibGVzRW5kcG9pbnQnLCAnZXhlY3V0ZUVuZHBvaW50JywgJ2xvb2t1cEVuZHBvaW50JywgJ2FwaXNFbmRwb2ludCddLnNvbWUoa2V5ID0+IChsb2NhbCBhcyBhbnkpW2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgPyB7IHJlcG9ydHNFbmRwb2ludDogcmVzb2x2ZVJlcG9ydHNFbmRwb2ludCh7IC4uLmxvY2FsLCAuLi50aGlzLm92ZXJyaWRlcyB9KSB9IDoge30pLFxuICAgICAgLi4udGhpcy5vdmVycmlkZXMsXG4gICAgfTtcbiAgfVxufVxuXG4vLyBEZWxlZ2F0aW9uIGlzIGxhenk6IEFuZ3VsYXIgYmluZHMgaW5wdXRzIGJlZm9yZSBjaGlsZHJlbiBtYWtlIHJlcXVlc3RzLCBhbmRcbi8vIGFuIHVudXNlZCBjYXBhYmlsaXR5IG5ldmVyIHJlcXVpcmVzIEh0dHBDbGllbnQgb3IgcmVwbGFjZXMgYSBjdXN0b20gYWRhcHRlci5cbmZ1bmN0aW9uIHNjb3BlZEFkYXB0ZXI8VCBleHRlbmRzIG9iamVjdD4odG9rZW46IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIHR5cGU6IFR5cGU8VD4sIGtleXM6IChrZXlvZiBCd2F5c1JlcG9ydEFwaVVybHMpW10gfCAoKHNjb3BlOiBEZXNpZ25lckVuZHBvaW50c1NlcnZpY2UsIHBhcmVudDogVCB8IG51bGwpID0+IGJvb2xlYW4pLCBmYWxsYmFjazogVCk6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiB0b2tlbixcbiAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGluamVjdChEZXNpZ25lckVuZHBvaW50c1NlcnZpY2UpO1xuICAgICAgY29uc3QgcGFyZW50ID0gaW5qZWN0KHRva2VuLCB7IHNraXBTZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkoZmFsbGJhY2ssIHtcbiAgICAgICAgZ2V0OiAoXywgcHJvcGVydHkpID0+ICEocHJvcGVydHkgaW4gZmFsbGJhY2spID8gdW5kZWZpbmVkIDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG92ZXJyaWRkZW4gPSB0eXBlb2Yga2V5cyA9PT0gJ2Z1bmN0aW9uJyA/IGtleXMoc2NvcGUsIHBhcmVudCkgOiBzY29wZS5oYXNPdmVycmlkZShrZXlzKTtcbiAgICAgICAgICBjb25zdCBidWlsdEluID0gcGFyZW50IGluc3RhbmNlb2YgdHlwZSB8fCBbSHR0cFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyLCBIdHRwUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyLFxuICAgICAgICAgICAgSHR0cFJlcG9ydExvb2t1cEFkYXB0ZXIsIEh0dHBSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyLCBIdHRwTWFzdGVyRGF0YUFkYXB0ZXJdLnNvbWUoYWRhcHRlciA9PiBwYXJlbnQgaW5zdGFuY2VvZiBhZGFwdGVyKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBvdmVycmlkZGVuIHx8ICFwYXJlbnQgfHwgKHNjb3BlLmlzQ29uZmlndXJlZCgpICYmIGJ1aWx0SW4pID8gc2NvcGUuYWRhcHRlcih0eXBlKSA6IHBhcmVudDtcbiAgICAgICAgICBpZiAoKHByb3BlcnR5ID09PSAnY2hlY2tJZCcgfHwgcHJvcGVydHkgPT09ICdpbnNwZWN0SWQnKSAmJiB0eXBlb2YgKHRhcmdldCBhcyBhbnkpW3Byb3BlcnR5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5ID09PSAnY2hlY2tJZCcgPyBSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIucHJvdG90eXBlLmNoZWNrSWQuY2FsbCh0YXJnZXQsIGFyZ3NbMF0gYXMgc3RyaW5nKVxuICAgICAgICAgICAgICA6IFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlci5wcm90b3R5cGUuaW5zcGVjdElkLmNhbGwodGFyZ2V0LCBhcmdzWzBdIGFzIHN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodGFyZ2V0IGFzIGFueSlbcHJvcGVydHldKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignW2J3YXlzLXJlcG9ydF0gTm8gYWRhcHRlciBjb25maWd1cmVkIGZvciB0aGlzIGNhcGFiaWxpdHkuJykpO1xuXG5leHBvcnQgY29uc3QgREVTSUdORVJfRU5EUE9JTlRfUFJPVklERVJTOiBQcm92aWRlcltdID0gW1xuICBEZXNpZ25lckNvbmZpZ1NlcnZpY2UsXG4gIHsgcHJvdmlkZTogUkVQT1JUSU5HX0NPTkZJRywgdXNlRmFjdG9yeTogKCkgPT4gaW5qZWN0KERlc2lnbmVyQ29uZmlnU2VydmljZSkucmVwb3J0aW5nIH0sXG4gIHsgcHJvdmlkZTogREVTSUdORVJfTE9DQUxfQ09ORklHLCB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoRGVzaWduZXJDb25maWdTZXJ2aWNlKS5sb2NhbCB9LFxuICBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsXG4gIERlc2lnbmVyRW5kcG9pbnRzU2VydmljZSxcbiAgeyBwcm92aWRlOiBCV0FZU19SRVBPUlRfRU5EUE9JTlRTLCB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoRGVzaWduZXJFbmRwb2ludHNTZXJ2aWNlKS5lbmRwb2ludHMgfSxcbiAgc2NvcGVkQWRhcHRlcihSZXBvcnREYXRhU291cmNlQWRhcHRlciwgRW5kcG9pbnREYXRhU291cmNlQWRhcHRlciwgWydleGVjdXRlRW5kcG9pbnQnXSwgeyBleGVjdXRlOiB1bmF2YWlsYWJsZSB9KSxcbiAgc2NvcGVkQWRhcHRlcihSZXBvcnRQZXJzaXN0ZW5jZUFkYXB0ZXIsIEVuZHBvaW50UGVyc2lzdGVuY2VBZGFwdGVyLCAoc2NvcGUsIHBhcmVudCkgPT5cbiAgICBzY29wZS5oYXNPdmVycmlkZShbJ3JlcG9ydHNFbmRwb2ludCddKSB8fCAocGFyZW50IGluc3RhbmNlb2YgSHR0cFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciAmJiBzY29wZS51c2VzRGVmYXVsdFN0b3JhZ2VCYXNlKCkgJiZcbiAgICAgIHNjb3BlLmhhc092ZXJyaWRlKFsnZXhlY3V0ZUVuZHBvaW50JywgJ3NwRW5kcG9pbnQnLCAndGFibGVzRW5kcG9pbnQnLCAnbG9va3VwRW5kcG9pbnQnLCAnYXBpc0VuZHBvaW50J10pKSwge1xuICAgIGluc3BlY3RJZDogdW5hdmFpbGFibGUsIGNoZWNrSWQ6IHVuYXZhaWxhYmxlLCBsb2FkOiB1bmF2YWlsYWJsZSwgc2F2ZTogdW5hdmFpbGFibGUsIGxpc3Q6ICgpID0+IG9mKFtdKSwgZGVsZXRlOiB1bmF2YWlsYWJsZSwgcHVibGlzaDogdW5hdmFpbGFibGUsXG4gIH0pLFxuICBzY29wZWRBZGFwdGVyKFJlcG9ydFNjaGVtYURpc2NvdmVyeUFkYXB0ZXIsIEVuZHBvaW50U2NoZW1hRGlzY292ZXJ5QWRhcHRlciwgWydzcEVuZHBvaW50JywgJ3RhYmxlc0VuZHBvaW50J10sIHtcbiAgICBnZXRFbnRpdGllczogKCkgPT4gb2YoW10pLCBnZXRDb2x1bW5zOiAoKSA9PiBvZihbXSksIGdldFBhcmFtZXRlcnM6ICgpID0+IG9mKFtdKSxcbiAgfSksXG4gIHNjb3BlZEFkYXB0ZXIoUmVwb3J0TG9va3VwQWRhcHRlciwgRW5kcG9pbnRMb29rdXBBZGFwdGVyLCBbJ2xvb2t1cEVuZHBvaW50JywgJ2V4ZWN1dGVFbmRwb2ludCddLCB7IGZldGNoT3B0aW9uczogKCkgPT4gb2YoW10pIH0pLFxuICBzY29wZWRBZGFwdGVyKE1hc3RlckRhdGFQcm92aWRlciwgRW5kcG9pbnRNYXN0ZXJEYXRhQWRhcHRlciwgWydleGVjdXRlRW5kcG9pbnQnXSwgeyBnZXRNYXN0ZXJEYXRhOiAoKSA9PiBvZihbXSkgfSksXG4gIFJlcG9ydEFwaUV4ZWN1dGlvblNlcnZpY2UsXG4gIFJlcG9ydERhdGFEaXNjb3ZlcnlTZXJ2aWNlLFxuICBSZXBvcnRTdG9yZVNlcnZpY2UsXG4gIHNjb3BlZEFkYXB0ZXIoUmVwb3J0RXhlY3V0aW9uU2VydmljZSwgUmVwb3J0RXhlY3V0aW9uU2VydmljZSwgWydleGVjdXRlRW5kcG9pbnQnLCAnYXBpc0VuZHBvaW50J10sIHtcbiAgICBleGVjdXRlOiB1bmF2YWlsYWJsZSwgZ2V0TWlzc2luZ0ZpZWxkczogKCkgPT4gW10sXG4gIH0gYXMgdW5rbm93biBhcyBSZXBvcnRFeGVjdXRpb25TZXJ2aWNlKSxcbl07XG4iXX0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeReportDefinition } from '../../persistence/services/schema-validator.service';
|
|
1
2
|
import { computed, inject, Injectable, signal } from '@angular/core';
|
|
2
3
|
import { ComponentRegistry } from '../../../core/registry/component-registry';
|
|
3
4
|
import { generateId } from '../../../core/utilities/id-generator';
|
|
@@ -46,7 +47,7 @@ export class DesignerStateService {
|
|
|
46
47
|
* Initializes or reloads a report definition into the designer.
|
|
47
48
|
*/
|
|
48
49
|
loadDefinition(def) {
|
|
49
|
-
const cloned = JSON.parse(JSON.stringify(def));
|
|
50
|
+
const cloned = JSON.parse(JSON.stringify(normalizeReportDefinition(def)));
|
|
50
51
|
this.definition.set(cloned);
|
|
51
52
|
// Preserve active component selection if it still exists in the loaded definition
|
|
52
53
|
const currentSelectedId = this.selectedComponentId();
|
|
@@ -382,4 +383,4 @@ export class DesignerStateService {
|
|
|
382
383
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerStateService, decorators: [{
|
|
383
384
|
type: Injectable
|
|
384
385
|
}] });
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxpQ0FBaUM7SUFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBb0IsWUFBWSxDQUFDLENB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RSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQzt3R0FuYVUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRhdGFzb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlsaXRpZXMvaWQtZ2VuZXJhdG9yJztcblxuZXhwb3J0IHR5cGUgRGVzaWduZXJWaWV3TW9kZSA9ICdkZXNpZ24nIHwgJ3ByZXZpZXcnIHwgJ2pzb24nO1xuZXhwb3J0IHR5cGUgRGVzaWduZXJBY3RpdmVUYWIgPSAncHJvcGVydGllcycgfCAncmVwb3J0JyB8ICdncmlkJztcblxuY29uc3QgTUFYX0hJU1RPUlkgPSAzMDtcblxuLyoqXG4gKiBEZXNpZ25lclN0YXRlU2VydmljZSBjb29yZGluYXRlcyBzdGF0ZSBmb3IgdGhlIHZpc3VhbCByZXBvcnQgZGVzaWduZXIuXG4gKlxuICogU2NvcGVkIGF0IHRoZSBEZXNpZ25lciBjb21wb25lbnQgbGV2ZWwgKG5vdCByb290KSB0byBlbnN1cmUgbXVsdGlwbGUgZGVzaWduZXJcbiAqIGluc3RhbmNlcyBvciBuYXZpZ2F0aW9uIGZsb3dzIHJlbWFpbiBzdHJpY3RseSBpc29sYXRlZC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyU3RhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG5cbiAgLyoqIEN1cnJlbnQgYWN0aXZlIHJlcG9ydCBkZWZpbml0aW9uICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbj4oe1xuICAgIGlkOiBnZW5lcmF0ZUlkKCdycHQnKSxcbiAgICBuYW1lOiAnVW50aXRsZWQgUmVwb3J0JyxcbiAgICBzY2hlbWFWZXJzaW9uOiAxLFxuICAgIHZlcnNpb246IDEsXG4gICAgbGF5b3V0OiB7IGNvbHVtbnM6IDEyLCBnYXA6IDE2LCBwYWRkaW5nOiAyNCwgZGlyZWN0aW9uOiAnbHRyJyB9LFxuICAgIGNvbXBvbmVudHM6IFtdLFxuICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgIGRhdGFTb3VyY2VzOiBbXSxcbiAgfSk7XG5cbiAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRCBpbiBjYW52YXMgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnRJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogQWN0aXZlIHByb3BlcnR5IGVkaXRvciB0YWIgKi9cbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gc2lnbmFsPERlc2lnbmVyQWN0aXZlVGFiPigncHJvcGVydGllcycpO1xuXG4gIC8qKiBDdXJyZW50IHZpZXcgbW9kZSAoZGVzaWduLCBwcmV2aWV3LCBvciByYXcganNvbikgKi9cbiAgcmVhZG9ubHkgdmlld01vZGUgPSBzaWduYWw8RGVzaWduZXJWaWV3TW9kZT4oJ2Rlc2lnbicpO1xuXG4gIC8qKiBEaXJ0eSBmbGFnIGluZGljYXRpbmcgdW5zYXZlZCBjaGFuZ2VzICovXG4gIHJlYWRvbmx5IGlzRGlydHkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIEhpc3Rvcnkgc3RhY2sgZm9yIFVuZG8gLyBSZWRvXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5SW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJiB0aGlzLmhpc3RvcnlJbmRleCgpIDwgdGhpcy5oaXN0b3J5KCkubGVuZ3RoIC0gMSk7XG5cbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBjb21wb25lbnQgaW5zdGFuY2UsIG9yIG51bGwgaWYgbm9uZSAqL1xuICByZWFkb25seSBzZWxlY3RlZENvbXBvbmVudCA9IGNvbXB1dGVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIG9yIHJlbG9hZHMgYSByZXBvcnQgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXNpZ25lci5cbiAgICovXG4gIGxvYWREZWZpbml0aW9uKGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KGNsb25lZCk7XG5cbiAgICAvLyBQcmVzZXJ2ZSBhY3RpdmUgY29tcG9uZW50IHNlbGVjdGlvbiBpZiBpdCBzdGlsbCBleGlzdHMgaW4gdGhlIGxvYWRlZCBkZWZpbml0aW9uXG4gICAgY29uc3QgY3VycmVudFNlbGVjdGVkSWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoY3VycmVudFNlbGVjdGVkSWQgJiYgY2xvbmVkLmNvbXBvbmVudHMuc29tZSgoYykgPT4gYy5pZCA9PT0gY3VycmVudFNlbGVjdGVkSWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGN1cnJlbnRTZWxlY3RlZElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpc3Rvcnkuc2V0KFtKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNsb25lZCkpXSk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBjb21wb25lbnQgZm9yIHByb3BlcnR5IGVkaXRpbmcuXG4gICAqL1xuICBzZWxlY3RDb21wb25lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGlkKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgncHJvcGVydGllcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgdmlldyBtb2RlIChkZXNpZ24sIGxpdmUgcHJldmlldywganNvbiBzY2hlbWEpLlxuICAgKi9cbiAgc2V0Vmlld01vZGUobW9kZTogRGVzaWduZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGUuc2V0KG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgdGFiLlxuICAgKi9cbiAgc2V0QWN0aXZlVGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGNvbXBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb250byB0aGUgY2FudmFzLlxuICAgKi9cbiAgYWRkQ29tcG9uZW50KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB0YXJnZXRJbmRleD86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+XG4gICk6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUodHlwZSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IG1ldGE/LmNyZWF0ZURlZmF1bHRDb25maWcoKSA/PyB7XG4gICAgICBpZDogZ2VuZXJhdGVJZCh0eXBlKSxcbiAgICAgIHR5cGUsXG4gICAgICBsYWJlbDogbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogYCR7dHlwZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNil9YCxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4gYy5rZXkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgYmFzZUtleSA9IG92ZXJyaWRlcz8ua2V5ID8/IGRlZmF1bHRDb25maWcua2V5ID8/IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWA7XG4gICAgbGV0IHVuaXF1ZUtleSA9IGJhc2VLZXk7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIHdoaWxlIChleGlzdGluZ0tleXMuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgIHVuaXF1ZUtleSA9IGAke2Jhc2VLZXl9XyR7Y291bnRlcisrfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29tcG9uZW50OiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG92ZXJyaWRlcz8ubGFiZWwgPz8gZGVmYXVsdENvbmZpZy5sYWJlbCA/PyBtZXRhPy5kaXNwbGF5TmFtZSA/PyB0eXBlLFxuICAgICAga2V5OiB1bmlxdWVLZXksXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGxheW91dDoge1xuICAgICAgICBjb2x1bW5TcGFuOiBvdmVycmlkZXM/LmxheW91dD8uY29sdW1uU3BhbiA/PyBkZWZhdWx0Q29uZmlnLmxheW91dD8uY29sdW1uU3BhbiA/PyAodHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNCksXG4gICAgICAgIC4uLmRlZmF1bHRDb25maWcubGF5b3V0LFxuICAgICAgICAuLi5vdmVycmlkZXM/LmxheW91dCxcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLihkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMgPz8ge30pLCAuLi4ob3ZlcnJpZGVzPy5wcm9wZXJ0aWVzID8/IHt9KSB9LFxuICAgICAgdmFsaWRhdGlvbjogb3ZlcnJpZGVzPy52YWxpZGF0aW9uID8/IChkZWZhdWx0Q29uZmlnLnZhbGlkYXRpb24gPyB7IC4uLmRlZmF1bHRDb25maWcudmFsaWRhdGlvbiB9IDogdW5kZWZpbmVkKSxcbiAgICAgIGRhdGFTb3VyY2U6IG92ZXJyaWRlcz8uZGF0YVNvdXJjZSA/PyAoZGVmYXVsdENvbmZpZy5kYXRhU291cmNlID8geyAuLi5kZWZhdWx0Q29uZmlnLmRhdGFTb3VyY2UgfSA6IHVuZGVmaW5lZCksXG4gICAgICBlbmFibGVkOiBvdmVycmlkZXM/LmVuYWJsZWQgPz8gZGVmYXVsdENvbmZpZy5lbmFibGVkID8/IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gWy4uLnRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKVxuICAgICk7XG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0SW5kZXggPj0gMCAmJiB0YXJnZXRJbmRleCA8PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbmV3Q29tcG9uZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudENvbXBvbmVudHMucHVzaChuZXdDb21wb25lbnQpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsY3VsYXRlIG9yZGVyIGluZGljZXNcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudChuZXdDb21wb25lbnQuaWQpO1xuICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNvbXBvbmVudCBieSBpdHMgSUQuXG4gICAqL1xuICByZW1vdmVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maWx0ZXIoKGMpID0+IGMuaWQgIT09IGlkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCgpID09PSBpZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEdXBsaWNhdGVzIGFuIGV4aXN0aW5nIGNvbXBvbmVudC5cbiAgICovXG4gIGR1cGxpY2F0ZUNvbXBvbmVudChpZDogc3RyaW5nKTogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCk7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkdXBsaWNhdGVkOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgLi4uSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleGlzdGluZykpLFxuICAgICAgaWQ6IGdlbmVyYXRlSWQoZXhpc3RpbmcudHlwZSksXG4gICAgICBrZXk6IGV4aXN0aW5nLmtleSA/IGAke2V4aXN0aW5nLmtleX1fY29weWAgOiB1bmRlZmluZWQsXG4gICAgICBsYWJlbDogZXhpc3RpbmcubGFiZWwgPyBgJHtleGlzdGluZy5sYWJlbH0gKENvcHkpYCA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gYy5pZCA9PT0gaWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZShpbmRleCArIDEsIDAsIGR1cGxpY2F0ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGR1cGxpY2F0ZWQuaWQpO1xuICAgIHJldHVybiBkdXBsaWNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gcHJldmlvdXMgaW5kZXggdG8gY3VycmVudCBpbmRleCAoZS5nLiBmcm9tIENESyBkcmFnIGRyb3ApLlxuICAgKi9cbiAgbW92ZUNvbXBvbmVudChwcmV2aW91c0luZGV4OiBudW1iZXIsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPT09IGN1cnJlbnRJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBpZiAocHJldmlvdXNJbmRleCA8IDAgfHwgcHJldmlvdXNJbmRleCA+PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJyZW50SW5kZXgsIGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCAtIDEpKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHRhcmdldElkeCwgMCwgbW92ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHBhcnRpYWwgcHJvcGVydGllcyBvZiBhIGNvbXBvbmVudC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudChpZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKGMuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmMsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHNpbmdsZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgd2l0aGluIGBwcm9wZXJ0aWVzYC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudFByb3BlcnR5KGlkOiBzdHJpbmcsIHByb3BLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC4uLihjLnByb3BlcnRpZXMgPz8ge30pLFxuICAgICAgICAgICAgW3Byb3BLZXldOiB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGxheW91dCBwcm9wZXJ0aWVzIGZvciBhIGNvbXBvbmVudCAoZS5nLiBjb2x1bW5TcGFuKS5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudExheW91dChpZDogc3RyaW5nLCBsYXlvdXQ6IFBhcnRpYWw8Q29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgY29uc3QgbmV4dExheW91dCA9IHtcbiAgICAgICAgICAuLi4oYy5sYXlvdXQgPz8ge30pLFxuICAgICAgICAgIC4uLmxheW91dCxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGF5b3V0KSBhcyAoa2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbilbXSkge1xuICAgICAgICAgIGlmIChsYXlvdXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgbmV4dExheW91dFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgbGF5b3V0OiBuZXh0TGF5b3V0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHJlcG9ydC1sZXZlbCBzZXR0aW5ncyAobmFtZSwgZGVzY3JpcHRpb24sIGxheW91dCkuXG4gICAqL1xuICB1cGRhdGVSZXBvcnRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxSZXBvcnREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgLi4uc2V0dGluZ3MsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZ3JpZCBkZWZpbml0aW9uIHNldHRpbmdzLlxuICAgKi9cbiAgdXBkYXRlR3JpZFNldHRpbmdzKGdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogeyBza2lwSGlzdG9yeT86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5za2lwSGlzdG9yeSkge1xuICAgICAgdGhpcy5kZWZpbml0aW9uLnVwZGF0ZSgoZGVmKSA9PiAoe1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGdyaWQsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGdyaWQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgcHJpbWFyeSBkYXRhIHNvdXJjZSBmb3IgdGhlIHJlcG9ydCdzIHJlc3VsdCBncmlkLlxuICAgKi9cbiAgc2V0R3JpZERhdGFTb3VyY2UoZHM6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlcyA9IGRlZi5kYXRhU291cmNlcyA/PyBbXTtcbiAgICAgIGNvbnN0IGlkeCA9IGV4aXN0aW5nU291cmNlcy5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGRzLmlkKTtcbiAgICAgIGxldCBuZXh0U291cmNlczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb25bXTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICBuZXh0U291cmNlcyA9IFsuLi5leGlzdGluZ1NvdXJjZXNdO1xuICAgICAgICBuZXh0U291cmNlc1tpZHhdID0gZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U291cmNlcyA9IFtkcywgLi4uZXhpc3RpbmdTb3VyY2VzXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uID0ge1xuICAgICAgICAuLi4oZGVmLmdyaWQgPz8ge1xuICAgICAgICAgIGRhdGFTb3VyY2VJZDogZHMuaWQsXG4gICAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgICAgb3B0aW9uczogeyBwYWdpbmF0aW9uOiB0cnVlLCBwYWdlU2l6ZTogMjUsIHNob3dSb3dOdW1iZXJzOiB0cnVlLCBzaG93Rm9vdGVyOiB0cnVlIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhU291cmNlSWQ6IGRzLmlkLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBkYXRhU291cmNlczogbmV4dFNvdXJjZXMsXG4gICAgICAgIGdyaWQ6IHVwZGF0ZWRHcmlkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYXJhbWV0ZXIgbWFwcGluZ3MgZm9yIHRoZSBwcmltYXJ5IGdyaWQgZGF0YSBzb3VyY2UuXG4gICAqL1xuICB1cGRhdGVHcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnMobWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGdyaWREc0lkID0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZDtcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBkZWYuZGF0YVNvdXJjZXMgPz8gW107XG4gICAgICBjb25zdCB0YXJnZXRJZHggPSBzb3VyY2VzLmZpbmRJbmRleCgocykgPT4gcy5pZCA9PT0gZ3JpZERzSWQgfHwgcy5uYW1lID09PSBncmlkRHNJZCk7XG5cbiAgICAgIGlmICh0YXJnZXRJZHggPj0gMCkge1xuICAgICAgICBjb25zdCBuZXh0U291cmNlcyA9IFsuLi5zb3VyY2VzXTtcbiAgICAgICAgbmV4dFNvdXJjZXNbdGFyZ2V0SWR4XSA9IHtcbiAgICAgICAgICAuLi5uZXh0U291cmNlc1t0YXJnZXRJZHhdLFxuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBtYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgZGF0YVNvdXJjZXM6IG5leHRTb3VyY2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgdG8gdGhlIHByZXZpb3VzIHN0YXRlIGluIGhpc3RvcnkuXG4gICAqL1xuICB1bmRvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHJldHVybjtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgLSAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXdJbmRleCk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeSgpW25ld0luZGV4XSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChyZXN0b3JlZCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlcyB0byB0aGUgbmV4dCBzdGF0ZSBpbiBoaXN0b3J5LlxuICAgKi9cbiAgcmVkbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSByZXR1cm47XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpICsgMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpc3RvcnkoKVtuZXdJbmRleF0pKSBhcyBSZXBvcnREZWZpbml0aW9uO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQocmVzdG9yZWQpO1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBzdGF0ZSBhcyBzYXZlZC5cbiAgICovXG4gIG1hcmtTYXZlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFuIGltbXV0YWJsZSBzdGF0ZSBjaGFuZ2UgYW5kIHB1c2hlcyB0byBoaXN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBtdXRhdGVEZWZpbml0aW9uKHVwZGF0ZXI6IChjdXJyZW50OiBSZXBvcnREZWZpbml0aW9uKSA9PiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIodGhpcy5kZWZpbml0aW9uKCkpO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQobmV4dCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgICB0aGlzLnB1c2hIaXN0b3J5KG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXNoSGlzdG9yeShkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SGlzdCA9IHRoaXMuaGlzdG9yeSgpLnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxKTtcbiAgICBjdXJyZW50SGlzdC5wdXNoKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkpO1xuICAgIGlmIChjdXJyZW50SGlzdC5sZW5ndGggPiBNQVhfSElTVE9SWSkge1xuICAgICAgY3VycmVudEhpc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5oaXN0b3J5LnNldChjdXJyZW50SGlzdCk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KGN1cnJlbnRIaXN0Lmxlbmd0aCAtIDEpO1xuICB9XG59XG4iXX0=
|
|
386
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxp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Q3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO3dHQW5hVSxvQkFBb0I7NEdBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vcm1hbGl6ZVJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9wZXJzaXN0ZW5jZS9zZXJ2aWNlcy9zY2hlbWEtdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kYXRhc291cmNlLm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL2lkLWdlbmVyYXRvcic7XG5cbmV4cG9ydCB0eXBlIERlc2lnbmVyVmlld01vZGUgPSAnZGVzaWduJyB8ICdwcmV2aWV3JyB8ICdqc29uJztcbmV4cG9ydCB0eXBlIERlc2lnbmVyQWN0aXZlVGFiID0gJ3Byb3BlcnRpZXMnIHwgJ3JlcG9ydCcgfCAnZ3JpZCc7XG5cbmNvbnN0IE1BWF9ISVNUT1JZID0gMzA7XG5cbi8qKlxuICogRGVzaWduZXJTdGF0ZVNlcnZpY2UgY29vcmRpbmF0ZXMgc3RhdGUgZm9yIHRoZSB2aXN1YWwgcmVwb3J0IGRlc2lnbmVyLlxuICpcbiAqIFNjb3BlZCBhdCB0aGUgRGVzaWduZXIgY29tcG9uZW50IGxldmVsIChub3Qgcm9vdCkgdG8gZW5zdXJlIG11bHRpcGxlIGRlc2lnbmVyXG4gKiBpbnN0YW5jZXMgb3IgbmF2aWdhdGlvbiBmbG93cyByZW1haW4gc3RyaWN0bHkgaXNvbGF0ZWQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXNpZ25lclN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPSBpbmplY3QoQ29tcG9uZW50UmVnaXN0cnkpO1xuXG4gIC8qKiBDdXJyZW50IGFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiAqL1xuICByZWFkb25seSBkZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24+KHtcbiAgICBpZDogZ2VuZXJhdGVJZCgncnB0JyksXG4gICAgbmFtZTogJ1VudGl0bGVkIFJlcG9ydCcsXG4gICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICB2ZXJzaW9uOiAxLFxuICAgIGxheW91dDogeyBjb2x1bW5zOiAxMiwgZ2FwOiAxNiwgcGFkZGluZzogMjQsIGRpcmVjdGlvbjogJ2x0cicgfSxcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICBkYXRhU291cmNlczogW10sXG4gIH0pO1xuXG4gIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSUQgaW4gY2FudmFzICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29tcG9uZW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSBwcm9wZXJ0eSBlZGl0b3IgdGFiICovXG4gIHJlYWRvbmx5IGFjdGl2ZVRhYiA9IHNpZ25hbDxEZXNpZ25lckFjdGl2ZVRhYj4oJ3Byb3BlcnRpZXMnKTtcblxuICAvKiogQ3VycmVudCB2aWV3IG1vZGUgKGRlc2lnbiwgcHJldmlldywgb3IgcmF3IGpzb24pICovXG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gc2lnbmFsPERlc2lnbmVyVmlld01vZGU+KCdkZXNpZ24nKTtcblxuICAvKiogRGlydHkgZmxhZyBpbmRpY2F0aW5nIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICByZWFkb25seSBpc0RpcnR5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBIaXN0b3J5IHN0YWNrIGZvciBVbmRvIC8gUmVkb1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnkgPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIHJlYWRvbmx5IGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID4gMCk7XG4gIHJlYWRvbmx5IGNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiYgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgY29tcG9uZW50IGluc3RhbmNlLCBvciBudWxsIGlmIG5vbmUgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSBjb21wdXRlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBvciByZWxvYWRzIGEgcmVwb3J0IGRlZmluaXRpb24gaW50byB0aGUgZGVzaWduZXIuXG4gICAqL1xuICBsb2FkRGVmaW5pdGlvbihkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZVJlcG9ydERlZmluaXRpb24oZGVmKSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChjbG9uZWQpO1xuXG4gICAgLy8gUHJlc2VydmUgYWN0aXZlIGNvbXBvbmVudCBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzIGluIHRoZSBsb2FkZWQgZGVmaW5pdGlvblxuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZElkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RlZElkICYmIGNsb25lZC5jb21wb25lbnRzLnNvbWUoKGMpID0+IGMuaWQgPT09IGN1cnJlbnRTZWxlY3RlZElkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChjdXJyZW50U2VsZWN0ZWRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0RpcnR5LnNldChmYWxzZSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjbG9uZWQpKV0pO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgY29tcG9uZW50IGZvciBwcm9wZXJ0eSBlZGl0aW5nLlxuICAgKi9cbiAgc2VsZWN0Q29tcG9uZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChpZCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoJ3Byb3BlcnRpZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIHZpZXcgbW9kZSAoZGVzaWduLCBsaXZlIHByZXZpZXcsIGpzb24gc2NoZW1hKS5cbiAgICovXG4gIHNldFZpZXdNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlLnNldChtb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIHRhYi5cbiAgICovXG4gIHNldEFjdGl2ZVRhYih0YWI6IERlc2lnbmVyQWN0aXZlVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KHRhYik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBjb21wb25lbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9udG8gdGhlIGNhbnZhcy5cbiAgICovXG4gIGFkZENvbXBvbmVudChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgdGFyZ2V0SW5kZXg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPlxuICApOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHR5cGUpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBtZXRhPy5jcmVhdGVEZWZhdWx0Q29uZmlnKCkgPz8ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG1ldGE/LmRpc3BsYXlOYW1lID8/IHR5cGUsXG4gICAgICBrZXk6IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWAsXG4gICAgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQodGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IGMua2V5KS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIGNvbnN0IGJhc2VLZXkgPSBvdmVycmlkZXM/LmtleSA/PyBkZWZhdWx0Q29uZmlnLmtleSA/PyBgJHt0eXBlfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA2KX1gO1xuICAgIGxldCB1bmlxdWVLZXkgPSBiYXNlS2V5O1xuICAgIGxldCBjb3VudGVyID0gMTtcbiAgICB3aGlsZSAoZXhpc3RpbmdLZXlzLmhhcyh1bmlxdWVLZXkpKSB7XG4gICAgICB1bmlxdWVLZXkgPSBgJHtiYXNlS2V5fV8ke2NvdW50ZXIrK31gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZUlkKHR5cGUpLFxuICAgICAgdHlwZSxcbiAgICAgIGxhYmVsOiBvdmVycmlkZXM/LmxhYmVsID8/IGRlZmF1bHRDb25maWcubGFiZWwgPz8gbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogdW5pcXVlS2V5LFxuICAgICAgb3JkZXI6IDAsXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgY29sdW1uU3Bhbjogb3ZlcnJpZGVzPy5sYXlvdXQ/LmNvbHVtblNwYW4gPz8gZGVmYXVsdENvbmZpZy5sYXlvdXQ/LmNvbHVtblNwYW4gPz8gKHR5cGUgPT09ICdidXR0b24nID8gMiA6IDQpLFxuICAgICAgICAuLi5kZWZhdWx0Q29uZmlnLmxheW91dCxcbiAgICAgICAgLi4ub3ZlcnJpZGVzPy5sYXlvdXQsXG4gICAgICB9LFxuICAgICAgcHJvcGVydGllczogeyAuLi4oZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzID8/IHt9KSwgLi4uKG92ZXJyaWRlcz8ucHJvcGVydGllcyA/PyB7fSkgfSxcbiAgICAgIHZhbGlkYXRpb246IG92ZXJyaWRlcz8udmFsaWRhdGlvbiA/PyAoZGVmYXVsdENvbmZpZy52YWxpZGF0aW9uID8geyAuLi5kZWZhdWx0Q29uZmlnLnZhbGlkYXRpb24gfSA6IHVuZGVmaW5lZCksXG4gICAgICBkYXRhU291cmNlOiBvdmVycmlkZXM/LmRhdGFTb3VyY2UgPz8gKGRlZmF1bHRDb25maWcuZGF0YVNvdXJjZSA/IHsgLi4uZGVmYXVsdENvbmZpZy5kYXRhU291cmNlIH0gOiB1bmRlZmluZWQpLFxuICAgICAgZW5hYmxlZDogb3ZlcnJpZGVzPy5lbmFibGVkID8/IGRlZmF1bHRDb25maWcuZW5hYmxlZCA/PyB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IFsuLi50aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMClcbiAgICApO1xuICAgIGlmICh0YXJnZXRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldEluZGV4ID49IDAgJiYgdGFyZ2V0SW5kZXggPD0gY3VycmVudENvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UodGFyZ2V0SW5kZXgsIDAsIG5ld0NvbXBvbmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDb21wb25lbnRzLnB1c2gobmV3Q29tcG9uZW50KTtcbiAgICB9XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSBvcmRlciBpbmRpY2VzXG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQobmV3Q29tcG9uZW50LmlkKTtcbiAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjb21wb25lbnQgYnkgaXRzIElELlxuICAgKi9cbiAgcmVtb3ZlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmlsdGVyKChjKSA9PiBjLmlkICE9PSBpZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKSA9PT0gaWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRHVwbGljYXRlcyBhbiBleGlzdGluZyBjb21wb25lbnQuXG4gICAqL1xuICBkdXBsaWNhdGVDb21wb25lbnQoaWQ6IHN0cmluZyk6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfCBudWxsIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZHVwbGljYXRlZDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiA9IHtcbiAgICAgIC4uLkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpKSxcbiAgICAgIGlkOiBnZW5lcmF0ZUlkKGV4aXN0aW5nLnR5cGUpLFxuICAgICAga2V5OiBleGlzdGluZy5rZXkgPyBgJHtleGlzdGluZy5rZXl9X2NvcHlgIDogdW5kZWZpbmVkLFxuICAgICAgbGFiZWw6IGV4aXN0aW5nLmxhYmVsID8gYCR7ZXhpc3RpbmcubGFiZWx9IChDb3B5KWAgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gWy4uLnRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKVxuICAgICk7XG4gICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29tcG9uZW50cy5maW5kSW5kZXgoKGMpID0+IGMuaWQgPT09IGlkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UoaW5kZXggKyAxLCAwLCBkdXBsaWNhdGVkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudChkdXBsaWNhdGVkLmlkKTtcbiAgICByZXR1cm4gZHVwbGljYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIGNvbXBvbmVudCBmcm9tIHByZXZpb3VzIGluZGV4IHRvIGN1cnJlbnQgaW5kZXggKGUuZy4gZnJvbSBDREsgZHJhZyBkcm9wKS5cbiAgICovXG4gIG1vdmVDb21wb25lbnQocHJldmlvdXNJbmRleDogbnVtYmVyLCBjdXJyZW50SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChwcmV2aW91c0luZGV4ID09PSBjdXJyZW50SW5kZXgpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gWy4uLnRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKVxuICAgICk7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPCAwIHx8IHByZXZpb3VzSW5kZXggPj0gY3VycmVudENvbXBvbmVudHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0SWR4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3VycmVudEluZGV4LCBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGggLSAxKSk7XG5cbiAgICBjb25zdCBbbW92ZWRdID0gY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZSh0YXJnZXRJZHgsIDAsIG1vdmVkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBwYXJ0aWFsIHByb3BlcnRpZXMgb2YgYSBjb21wb25lbnQuXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQoaWQ6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IHtcbiAgICAgIGlmIChjLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4geyAuLi5jLCAuLi51cGRhdGVzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBzaW5nbGUgY29tcG9uZW50IHByb3BlcnR5IHZhbHVlIHdpdGhpbiBgcHJvcGVydGllc2AuXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnRQcm9wZXJ0eShpZDogc3RyaW5nLCBwcm9wS2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKGMuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAuLi4oYy5wcm9wZXJ0aWVzID8/IHt9KSxcbiAgICAgICAgICAgIFtwcm9wS2V5XTogdmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBsYXlvdXQgcHJvcGVydGllcyBmb3IgYSBjb21wb25lbnQgKGUuZy4gY29sdW1uU3BhbikuXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnRMYXlvdXQoaWQ6IHN0cmluZywgbGF5b3V0OiBQYXJ0aWFsPENvbXBvbmVudExheW91dERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKGMuaWQgPT09IGlkKSB7XG4gICAgICAgIGNvbnN0IG5leHRMYXlvdXQgPSB7XG4gICAgICAgICAgLi4uKGMubGF5b3V0ID8/IHt9KSxcbiAgICAgICAgICAuLi5sYXlvdXQsXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGxheW91dCkgYXMgKGtleW9mIENvbXBvbmVudExheW91dERlZmluaXRpb24pW10pIHtcbiAgICAgICAgICBpZiAobGF5b3V0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIG5leHRMYXlvdXRba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jLFxuICAgICAgICAgIGxheW91dDogbmV4dExheW91dCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyByZXBvcnQtbGV2ZWwgc2V0dGluZ3MgKG5hbWUsIGRlc2NyaXB0aW9uLCBsYXlvdXQpLlxuICAgKi9cbiAgdXBkYXRlUmVwb3J0U2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8UmVwb3J0RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIC4uLnNldHRpbmdzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGdyaWQgZGVmaW5pdGlvbiBzZXR0aW5ncy5cbiAgICovXG4gIHVwZGF0ZUdyaWRTZXR0aW5ncyhncmlkOiBSZXBvcnRHcmlkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IHsgc2tpcEhpc3Rvcnk/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcEhpc3RvcnkpIHtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbi51cGRhdGUoKGRlZikgPT4gKHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBncmlkLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBncmlkLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG9yIHVwZGF0ZXMgdGhlIHByaW1hcnkgZGF0YSBzb3VyY2UgZm9yIHRoZSByZXBvcnQncyByZXN1bHQgZ3JpZC5cbiAgICovXG4gIHNldEdyaWREYXRhU291cmNlKGRzOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ1NvdXJjZXMgPSBkZWYuZGF0YVNvdXJjZXMgPz8gW107XG4gICAgICBjb25zdCBpZHggPSBleGlzdGluZ1NvdXJjZXMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBkcy5pZCk7XG4gICAgICBsZXQgbmV4dFNvdXJjZXM6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uW107XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgbmV4dFNvdXJjZXMgPSBbLi4uZXhpc3RpbmdTb3VyY2VzXTtcbiAgICAgICAgbmV4dFNvdXJjZXNbaWR4XSA9IGRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNvdXJjZXMgPSBbZHMsIC4uLmV4aXN0aW5nU291cmNlc107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRHcmlkOiBSZXBvcnRHcmlkRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgLi4uKGRlZi5ncmlkID8/IHtcbiAgICAgICAgICBkYXRhU291cmNlSWQ6IGRzLmlkLFxuICAgICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICAgIG9wdGlvbnM6IHsgcGFnaW5hdGlvbjogdHJ1ZSwgcGFnZVNpemU6IDI1LCBzaG93Um93TnVtYmVyczogdHJ1ZSwgc2hvd0Zvb3RlcjogdHJ1ZSB9LFxuICAgICAgICB9KSxcbiAgICAgICAgZGF0YVNvdXJjZUlkOiBkcy5pZCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgZGF0YVNvdXJjZXM6IG5leHRTb3VyY2VzLFxuICAgICAgICBncmlkOiB1cGRhdGVkR3JpZCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcGFyYW1ldGVyIG1hcHBpbmdzIGZvciB0aGUgcHJpbWFyeSBncmlkIGRhdGEgc291cmNlLlxuICAgKi9cbiAgdXBkYXRlR3JpZERhdGFTb3VyY2VQYXJhbWV0ZXJzKG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiB7XG4gICAgICBjb25zdCBncmlkRHNJZCA9IGRlZi5ncmlkPy5kYXRhU291cmNlSWQ7XG4gICAgICBjb25zdCBzb3VyY2VzID0gZGVmLmRhdGFTb3VyY2VzID8/IFtdO1xuICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gc291cmNlcy5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGdyaWREc0lkIHx8IHMubmFtZSA9PT0gZ3JpZERzSWQpO1xuXG4gICAgICBpZiAodGFyZ2V0SWR4ID49IDApIHtcbiAgICAgICAgY29uc3QgbmV4dFNvdXJjZXMgPSBbLi4uc291cmNlc107XG4gICAgICAgIG5leHRTb3VyY2VzW3RhcmdldElkeF0gPSB7XG4gICAgICAgICAgLi4ubmV4dFNvdXJjZXNbdGFyZ2V0SWR4XSxcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nczogbWFwcGluZ3MgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgIGRhdGFTb3VyY2VzOiBuZXh0U291cmNlcyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIHRvIHRoZSBwcmV2aW91cyBzdGF0ZSBpbiBoaXN0b3J5LlxuICAgKi9cbiAgdW5kbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbygpKSByZXR1cm47XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpIC0gMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpc3RvcnkoKVtuZXdJbmRleF0pKSBhcyBSZXBvcnREZWZpbml0aW9uO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQocmVzdG9yZWQpO1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZXMgdG8gdGhlIG5leHQgc3RhdGUgaW4gaGlzdG9yeS5cbiAgICovXG4gIHJlZG8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblJlZG8oKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSArIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5ld0luZGV4KTtcbiAgICBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaXN0b3J5KClbbmV3SW5kZXhdKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KHJlc3RvcmVkKTtcbiAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBjdXJyZW50IGRlZmluaXRpb24gc3RhdGUgYXMgc2F2ZWQuXG4gICAqL1xuICBtYXJrU2F2ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RpcnR5LnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbiBpbW11dGFibGUgc3RhdGUgY2hhbmdlIGFuZCBwdXNoZXMgdG8gaGlzdG9yeS5cbiAgICovXG4gIHByaXZhdGUgbXV0YXRlRGVmaW5pdGlvbih1cGRhdGVyOiAoY3VycmVudDogUmVwb3J0RGVmaW5pdGlvbikgPT4gUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB1cGRhdGVyKHRoaXMuZGVmaW5pdGlvbigpKTtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KG5leHQpO1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5wdXNoSGlzdG9yeShuZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgcHVzaEhpc3RvcnkoZGVmOiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEhpc3QgPSB0aGlzLmhpc3RvcnkoKS5zbGljZSgwLCB0aGlzLmhpc3RvcnlJbmRleCgpICsgMSk7XG4gICAgY3VycmVudEhpc3QucHVzaChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZikpKTtcbiAgICBpZiAoY3VycmVudEhpc3QubGVuZ3RoID4gTUFYX0hJU1RPUlkpIHtcbiAgICAgIGN1cnJlbnRIaXN0LnNoaWZ0KCk7XG4gICAgfVxuICAgIHRoaXMuaGlzdG9yeS5zZXQoY3VycmVudEhpc3QpO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChjdXJyZW50SGlzdC5sZW5ndGggLSAxKTtcbiAgfVxufVxuIl19
|