snap-report-viewer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2022/lib/components/chart-renderer/chart-renderer.component.mjs +75 -0
- package/esm2022/lib/components/complex-table-renderer/complex-table-renderer.component.mjs +155 -0
- package/esm2022/lib/components/component-renderer/component-renderer.component.mjs +158 -0
- package/esm2022/lib/components/container-renderer/container-renderer.component.mjs +53 -0
- package/esm2022/lib/components/image-renderer/image-renderer.component.mjs +67 -0
- package/esm2022/lib/components/line-renderer/line-renderer.component.mjs +94 -0
- package/esm2022/lib/components/list-renderer/list-renderer.component.mjs +96 -0
- package/esm2022/lib/components/qrcode-renderer/qrcode-renderer.component.mjs +67 -0
- package/esm2022/lib/components/shape-renderer/shape-renderer.component.mjs +133 -0
- package/esm2022/lib/components/table-renderer/table-renderer.component.mjs +148 -0
- package/esm2022/lib/components/text-renderer/text-renderer.component.mjs +33 -0
- package/esm2022/lib/constants/page-sizes.mjs +3 -0
- package/esm2022/lib/constants/report-tokens.mjs +21 -0
- package/esm2022/lib/layout/report-band.component.mjs +33 -0
- package/esm2022/lib/layout/report-page.component.mjs +159 -0
- package/esm2022/lib/models/component.model.mjs +3 -0
- package/esm2022/lib/models/report-template.model.mjs +19 -0
- package/esm2022/lib/page-container/page-container.component.mjs +248 -0
- package/esm2022/lib/report-viewer.component.mjs +393 -0
- package/esm2022/lib/services/chart-options-builder.service.mjs +749 -0
- package/esm2022/lib/services/data-resolver.service.mjs +385 -0
- package/esm2022/lib/services/export.service.mjs +82 -0
- package/esm2022/lib/services/formatting.service.mjs +59 -0
- package/esm2022/lib/services/print.service.mjs +133 -0
- package/esm2022/lib/services/search.service.mjs +117 -0
- package/esm2022/lib/services/style-mapper.service.mjs +247 -0
- package/esm2022/lib/services/template-normalizer.service.mjs +213 -0
- package/esm2022/lib/services/template-validator.service.mjs +293 -0
- package/esm2022/lib/services/token-resolver.service.mjs +14 -0
- package/esm2022/lib/services/viewer-state.service.mjs +155 -0
- package/esm2022/lib/sidebar/sidebar-container.component.mjs +86 -0
- package/esm2022/lib/sidebar/thumbnail-sidebar.component.mjs +110 -0
- package/esm2022/lib/sidebar/toc-sidebar.component.mjs +155 -0
- package/esm2022/lib/toolbar/viewer-toolbar.component.mjs +486 -0
- package/esm2022/public-api.mjs +43 -0
- package/esm2022/snap-report-viewer.mjs +5 -0
- package/fesm2022/snap-report-viewer.mjs +5110 -0
- package/fesm2022/snap-report-viewer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/chart-renderer/chart-renderer.component.d.ts +14 -0
- package/lib/components/complex-table-renderer/complex-table-renderer.component.d.ts +17 -0
- package/lib/components/component-renderer/component-renderer.component.d.ts +14 -0
- package/lib/components/container-renderer/container-renderer.component.d.ts +11 -0
- package/lib/components/image-renderer/image-renderer.component.d.ts +14 -0
- package/lib/components/line-renderer/line-renderer.component.d.ts +10 -0
- package/lib/components/list-renderer/list-renderer.component.d.ts +16 -0
- package/lib/components/qrcode-renderer/qrcode-renderer.component.d.ts +16 -0
- package/lib/components/shape-renderer/shape-renderer.component.d.ts +11 -0
- package/lib/components/table-renderer/table-renderer.component.d.ts +20 -0
- package/lib/components/text-renderer/text-renderer.component.d.ts +13 -0
- package/lib/constants/page-sizes.d.ts +2 -0
- package/lib/constants/report-tokens.d.ts +8 -0
- package/lib/layout/report-band.component.d.ts +10 -0
- package/lib/layout/report-page.component.d.ts +21 -0
- package/lib/models/component.model.d.ts +315 -0
- package/lib/models/report-template.model.d.ts +122 -0
- package/lib/page-container/page-container.component.d.ts +29 -0
- package/lib/report-viewer.component.d.ts +51 -0
- package/lib/services/chart-options-builder.service.d.ts +31 -0
- package/lib/services/data-resolver.service.d.ts +27 -0
- package/lib/services/export.service.d.ts +11 -0
- package/lib/services/formatting.service.d.ts +10 -0
- package/lib/services/print.service.d.ts +12 -0
- package/lib/services/search.service.d.ts +13 -0
- package/lib/services/style-mapper.service.d.ts +14 -0
- package/lib/services/template-normalizer.service.d.ts +24 -0
- package/lib/services/template-validator.service.d.ts +19 -0
- package/lib/services/token-resolver.service.d.ts +6 -0
- package/lib/services/viewer-state.service.d.ts +49 -0
- package/lib/sidebar/sidebar-container.component.d.ts +8 -0
- package/lib/sidebar/thumbnail-sidebar.component.d.ts +15 -0
- package/lib/sidebar/toc-sidebar.component.d.ts +17 -0
- package/lib/toolbar/viewer-toolbar.component.d.ts +17 -0
- package/package.json +43 -0
- package/public-api.d.ts +35 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class PrintService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.printStyleId = 'rv-print-styles';
|
|
6
|
+
}
|
|
7
|
+
print(viewerElement, pageSetup) {
|
|
8
|
+
this.injectPrintStyles(viewerElement, pageSetup);
|
|
9
|
+
window.print();
|
|
10
|
+
}
|
|
11
|
+
injectPrintStyles(viewerElement, pageSetup) {
|
|
12
|
+
// Remove existing print styles if any
|
|
13
|
+
this.cleanupPrintStyles();
|
|
14
|
+
// Add a data attribute to identify the viewer for print
|
|
15
|
+
viewerElement.setAttribute('data-rv-printing', 'true');
|
|
16
|
+
const pageRule = this.buildPageRule(pageSetup);
|
|
17
|
+
const style = document.createElement('style');
|
|
18
|
+
style.id = this.printStyleId;
|
|
19
|
+
style.textContent = `
|
|
20
|
+
@media print {
|
|
21
|
+
${pageRule}
|
|
22
|
+
|
|
23
|
+
/* Hide everything except the viewer */
|
|
24
|
+
body > *:not(:has([data-rv-printing])) {
|
|
25
|
+
display: none !important;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Hide toolbar and sidebars */
|
|
29
|
+
rv-viewer-toolbar,
|
|
30
|
+
.rv-sidebar-wrapper,
|
|
31
|
+
rv-toc-sidebar,
|
|
32
|
+
rv-thumbnail-sidebar,
|
|
33
|
+
.rv-search-highlight {
|
|
34
|
+
display: none !important;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Reset viewer layout for print */
|
|
38
|
+
[data-rv-printing] {
|
|
39
|
+
position: static !important;
|
|
40
|
+
width: 100% !important;
|
|
41
|
+
height: auto !important;
|
|
42
|
+
overflow: visible !important;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.rv-viewer-root {
|
|
46
|
+
height: auto !important;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.rv-viewer-body {
|
|
50
|
+
height: auto !important;
|
|
51
|
+
overflow: visible !important;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.rv-page-container {
|
|
55
|
+
overflow: visible !important;
|
|
56
|
+
padding: 0 !important;
|
|
57
|
+
background: white !important;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.rv-page-wrapper {
|
|
61
|
+
transform: none !important;
|
|
62
|
+
page-break-after: always;
|
|
63
|
+
box-shadow: none !important;
|
|
64
|
+
margin: 0 !important;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.rv-page-wrapper:last-child {
|
|
68
|
+
page-break-after: avoid;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.rv-page {
|
|
72
|
+
box-shadow: none !important;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
`;
|
|
76
|
+
document.head.appendChild(style);
|
|
77
|
+
// Cleanup after print
|
|
78
|
+
const cleanup = () => {
|
|
79
|
+
this.cleanupPrintStyles();
|
|
80
|
+
viewerElement.removeAttribute('data-rv-printing');
|
|
81
|
+
window.removeEventListener('afterprint', cleanup);
|
|
82
|
+
};
|
|
83
|
+
window.addEventListener('afterprint', cleanup);
|
|
84
|
+
}
|
|
85
|
+
buildPageRule(pageSetup) {
|
|
86
|
+
if (!pageSetup) {
|
|
87
|
+
return '@page { size: A4 portrait; margin: 25.4mm; }';
|
|
88
|
+
}
|
|
89
|
+
// Build the size value
|
|
90
|
+
const sizeValue = this.getPageSizeCSS(pageSetup);
|
|
91
|
+
// Build the margin value
|
|
92
|
+
const margins = pageSetup.margins;
|
|
93
|
+
const marginValue = `${margins.top}mm ${margins.right}mm ${margins.bottom}mm ${margins.left}mm`;
|
|
94
|
+
return `@page { size: ${sizeValue}; margin: ${marginValue}; }`;
|
|
95
|
+
}
|
|
96
|
+
getPageSizeCSS(pageSetup) {
|
|
97
|
+
const orientation = pageSetup.orientation === 'Landscape' ? 'landscape' : 'portrait';
|
|
98
|
+
if (pageSetup.size === 'Custom') {
|
|
99
|
+
// For custom sizes, use explicit width and height in mm
|
|
100
|
+
const width = pageSetup.width || 210;
|
|
101
|
+
const height = pageSetup.height || 297;
|
|
102
|
+
// CSS @page size with explicit dimensions doesn't use orientation keyword;
|
|
103
|
+
// instead we swap width/height for landscape
|
|
104
|
+
if (orientation === 'landscape') {
|
|
105
|
+
return `${Math.max(width, height)}mm ${Math.min(width, height)}mm`;
|
|
106
|
+
}
|
|
107
|
+
return `${Math.min(width, height)}mm ${Math.max(width, height)}mm`;
|
|
108
|
+
}
|
|
109
|
+
// Named page sizes: A3, A4, A5, letter, legal + orientation
|
|
110
|
+
const sizeMap = {
|
|
111
|
+
'A2': 'A3', // CSS @page doesn't support A2, fall back to closest
|
|
112
|
+
'A3': 'A3',
|
|
113
|
+
'A4': 'A4',
|
|
114
|
+
'A5': 'A5',
|
|
115
|
+
'Letter': 'letter',
|
|
116
|
+
'Legal': 'legal',
|
|
117
|
+
};
|
|
118
|
+
const cssSize = sizeMap[pageSetup.size] || 'A4';
|
|
119
|
+
return `${cssSize} ${orientation}`;
|
|
120
|
+
}
|
|
121
|
+
cleanupPrintStyles() {
|
|
122
|
+
const existing = document.getElementById(this.printStyleId);
|
|
123
|
+
if (existing) {
|
|
124
|
+
existing.remove();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrintService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
128
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrintService }); }
|
|
129
|
+
}
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrintService, decorators: [{
|
|
131
|
+
type: Injectable
|
|
132
|
+
}] });
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydC12aWV3ZXIvc3JjL2xpYi9zZXJ2aWNlcy9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSTNDLE1BQU0sT0FBTyxZQUFZO0lBRHpCO1FBRVUsaUJBQVksR0FBRyxpQkFBaUIsQ0FBQztLQXdJMUM7SUF0SUMsS0FBSyxDQUFDLGFBQTBCLEVBQUUsU0FBcUI7UUFDckQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLGFBQTBCLEVBQUUsU0FBcUI7UUFDekUsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLHdEQUF3RDtRQUN4RCxhQUFhLENBQUMsWUFBWSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFL0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDN0IsS0FBSyxDQUFDLFdBQVcsR0FBRzs7VUFFZCxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzRGIsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpDLHNCQUFzQjtRQUN0QixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsYUFBYSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sYUFBYSxDQUFDLFNBQXFCO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sOENBQThDLENBQUM7UUFDeEQsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpELHlCQUF5QjtRQUN6QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxNQUFNLE9BQU8sQ0FBQyxNQUFNLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO1FBRWhHLE9BQU8saUJBQWlCLFNBQVMsYUFBYSxXQUFXLEtBQUssQ0FBQztJQUNqRSxDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQW9CO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUVyRixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsd0RBQXdEO1lBQ3hELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDO1lBQ3ZDLDJFQUEyRTtZQUMzRSw2Q0FBNkM7WUFDN0MsSUFBSSxXQUFXLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3JFLENBQUM7WUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyRSxDQUFDO1FBRUQsNERBQTREO1FBQzVELE1BQU0sT0FBTyxHQUEyQjtZQUN0QyxJQUFJLEVBQUUsSUFBSSxFQUFHLHFEQUFxRDtZQUNsRSxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxJQUFJO1lBQ1YsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsUUFBUTtZQUNsQixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDaEQsT0FBTyxHQUFHLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7K0dBeElVLFlBQVk7bUhBQVosWUFBWTs7NEZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnZVNldHVwLCBQQUdFX1NJWkVTIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC10ZW1wbGF0ZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcmludFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcHJpbnRTdHlsZUlkID0gJ3J2LXByaW50LXN0eWxlcyc7XHJcblxyXG4gIHByaW50KHZpZXdlckVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYWdlU2V0dXA/OiBQYWdlU2V0dXApOiB2b2lkIHtcclxuICAgIHRoaXMuaW5qZWN0UHJpbnRTdHlsZXModmlld2VyRWxlbWVudCwgcGFnZVNldHVwKTtcclxuICAgIHdpbmRvdy5wcmludCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbmplY3RQcmludFN0eWxlcyh2aWV3ZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgcGFnZVNldHVwPzogUGFnZVNldHVwKTogdm9pZCB7XHJcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgcHJpbnQgc3R5bGVzIGlmIGFueVxyXG4gICAgdGhpcy5jbGVhbnVwUHJpbnRTdHlsZXMoKTtcclxuXHJcbiAgICAvLyBBZGQgYSBkYXRhIGF0dHJpYnV0ZSB0byBpZGVudGlmeSB0aGUgdmlld2VyIGZvciBwcmludFxyXG4gICAgdmlld2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcnYtcHJpbnRpbmcnLCAndHJ1ZScpO1xyXG5cclxuICAgIGNvbnN0IHBhZ2VSdWxlID0gdGhpcy5idWlsZFBhZ2VSdWxlKHBhZ2VTZXR1cCk7XHJcblxyXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgc3R5bGUuaWQgPSB0aGlzLnByaW50U3R5bGVJZDtcclxuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxyXG4gICAgICBAbWVkaWEgcHJpbnQge1xyXG4gICAgICAgICR7cGFnZVJ1bGV9XHJcblxyXG4gICAgICAgIC8qIEhpZGUgZXZlcnl0aGluZyBleGNlcHQgdGhlIHZpZXdlciAqL1xyXG4gICAgICAgIGJvZHkgPiAqOm5vdCg6aGFzKFtkYXRhLXJ2LXByaW50aW5nXSkpIHtcclxuICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIEhpZGUgdG9vbGJhciBhbmQgc2lkZWJhcnMgKi9cclxuICAgICAgICBydi12aWV3ZXItdG9vbGJhcixcclxuICAgICAgICAucnYtc2lkZWJhci13cmFwcGVyLFxyXG4gICAgICAgIHJ2LXRvYy1zaWRlYmFyLFxyXG4gICAgICAgIHJ2LXRodW1ibmFpbC1zaWRlYmFyLFxyXG4gICAgICAgIC5ydi1zZWFyY2gtaGlnaGxpZ2h0IHtcclxuICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qIFJlc2V0IHZpZXdlciBsYXlvdXQgZm9yIHByaW50ICovXHJcbiAgICAgICAgW2RhdGEtcnYtcHJpbnRpbmddIHtcclxuICAgICAgICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcclxuICAgICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAucnYtdmlld2VyLXJvb3Qge1xyXG4gICAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAucnYtdmlld2VyLWJvZHkge1xyXG4gICAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLnJ2LXBhZ2UtY29udGFpbmVyIHtcclxuICAgICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLnJ2LXBhZ2Utd3JhcHBlciB7XHJcbiAgICAgICAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgICAgIHBhZ2UtYnJlYWstYWZ0ZXI6IGFsd2F5cztcclxuICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLnJ2LXBhZ2Utd3JhcHBlcjpsYXN0LWNoaWxkIHtcclxuICAgICAgICAgIHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLnJ2LXBhZ2Uge1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgYDtcclxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG5cclxuICAgIC8vIENsZWFudXAgYWZ0ZXIgcHJpbnRcclxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xlYW51cFByaW50U3R5bGVzKCk7XHJcbiAgICAgIHZpZXdlckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXJ2LXByaW50aW5nJyk7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZnRlcnByaW50JywgY2xlYW51cCk7XHJcbiAgICB9O1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2FmdGVycHJpbnQnLCBjbGVhbnVwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRQYWdlUnVsZShwYWdlU2V0dXA/OiBQYWdlU2V0dXApOiBzdHJpbmcge1xyXG4gICAgaWYgKCFwYWdlU2V0dXApIHtcclxuICAgICAgcmV0dXJuICdAcGFnZSB7IHNpemU6IEE0IHBvcnRyYWl0OyBtYXJnaW46IDI1LjRtbTsgfSc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQnVpbGQgdGhlIHNpemUgdmFsdWVcclxuICAgIGNvbnN0IHNpemVWYWx1ZSA9IHRoaXMuZ2V0UGFnZVNpemVDU1MocGFnZVNldHVwKTtcclxuXHJcbiAgICAvLyBCdWlsZCB0aGUgbWFyZ2luIHZhbHVlXHJcbiAgICBjb25zdCBtYXJnaW5zID0gcGFnZVNldHVwLm1hcmdpbnM7XHJcbiAgICBjb25zdCBtYXJnaW5WYWx1ZSA9IGAke21hcmdpbnMudG9wfW1tICR7bWFyZ2lucy5yaWdodH1tbSAke21hcmdpbnMuYm90dG9tfW1tICR7bWFyZ2lucy5sZWZ0fW1tYDtcclxuXHJcbiAgICByZXR1cm4gYEBwYWdlIHsgc2l6ZTogJHtzaXplVmFsdWV9OyBtYXJnaW46ICR7bWFyZ2luVmFsdWV9OyB9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZVNpemVDU1MocGFnZVNldHVwOiBQYWdlU2V0dXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlU2V0dXAub3JpZW50YXRpb24gPT09ICdMYW5kc2NhcGUnID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnO1xyXG5cclxuICAgIGlmIChwYWdlU2V0dXAuc2l6ZSA9PT0gJ0N1c3RvbScpIHtcclxuICAgICAgLy8gRm9yIGN1c3RvbSBzaXplcywgdXNlIGV4cGxpY2l0IHdpZHRoIGFuZCBoZWlnaHQgaW4gbW1cclxuICAgICAgY29uc3Qgd2lkdGggPSBwYWdlU2V0dXAud2lkdGggfHwgMjEwO1xyXG4gICAgICBjb25zdCBoZWlnaHQgPSBwYWdlU2V0dXAuaGVpZ2h0IHx8IDI5NztcclxuICAgICAgLy8gQ1NTIEBwYWdlIHNpemUgd2l0aCBleHBsaWNpdCBkaW1lbnNpb25zIGRvZXNuJ3QgdXNlIG9yaWVudGF0aW9uIGtleXdvcmQ7XHJcbiAgICAgIC8vIGluc3RlYWQgd2Ugc3dhcCB3aWR0aC9oZWlnaHQgZm9yIGxhbmRzY2FwZVxyXG4gICAgICBpZiAob3JpZW50YXRpb24gPT09ICdsYW5kc2NhcGUnKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke01hdGgubWF4KHdpZHRoLCBoZWlnaHQpfW1tICR7TWF0aC5taW4od2lkdGgsIGhlaWdodCl9bW1gO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBgJHtNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KX1tbSAke01hdGgubWF4KHdpZHRoLCBoZWlnaHQpfW1tYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBOYW1lZCBwYWdlIHNpemVzOiBBMywgQTQsIEE1LCBsZXR0ZXIsIGxlZ2FsICsgb3JpZW50YXRpb25cclxuICAgIGNvbnN0IHNpemVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICdBMic6ICdBMycsICAvLyBDU1MgQHBhZ2UgZG9lc24ndCBzdXBwb3J0IEEyLCBmYWxsIGJhY2sgdG8gY2xvc2VzdFxyXG4gICAgICAnQTMnOiAnQTMnLFxyXG4gICAgICAnQTQnOiAnQTQnLFxyXG4gICAgICAnQTUnOiAnQTUnLFxyXG4gICAgICAnTGV0dGVyJzogJ2xldHRlcicsXHJcbiAgICAgICdMZWdhbCc6ICdsZWdhbCcsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNzc1NpemUgPSBzaXplTWFwW3BhZ2VTZXR1cC5zaXplXSB8fCAnQTQnO1xyXG4gICAgcmV0dXJuIGAke2Nzc1NpemV9ICR7b3JpZW50YXRpb259YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW51cFByaW50U3R5bGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnByaW50U3R5bGVJZCk7XHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgZXhpc3RpbmcucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SearchService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.highlights = [];
|
|
6
|
+
}
|
|
7
|
+
search(query, container) {
|
|
8
|
+
this.clearHighlights();
|
|
9
|
+
if (!query || !query.trim())
|
|
10
|
+
return [];
|
|
11
|
+
const matches = [];
|
|
12
|
+
const escapedQuery = this.escapeRegex(query);
|
|
13
|
+
const regex = new RegExp(escapedQuery, 'gi');
|
|
14
|
+
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {
|
|
15
|
+
acceptNode: (node) => {
|
|
16
|
+
// Skip nodes inside marks (our own highlights) or script/style tags
|
|
17
|
+
const parent = node.parentElement;
|
|
18
|
+
if (!parent)
|
|
19
|
+
return NodeFilter.FILTER_REJECT;
|
|
20
|
+
const tag = parent.tagName?.toLowerCase();
|
|
21
|
+
if (tag === 'script' || tag === 'style' || tag === 'mark') {
|
|
22
|
+
return NodeFilter.FILTER_REJECT;
|
|
23
|
+
}
|
|
24
|
+
return (node.textContent && node.textContent.trim().length > 0)
|
|
25
|
+
? NodeFilter.FILTER_ACCEPT
|
|
26
|
+
: NodeFilter.FILTER_REJECT;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
let textNode;
|
|
30
|
+
while ((textNode = walker.nextNode())) {
|
|
31
|
+
const text = textNode.textContent || '';
|
|
32
|
+
let match;
|
|
33
|
+
regex.lastIndex = 0;
|
|
34
|
+
while ((match = regex.exec(text)) !== null) {
|
|
35
|
+
const pageIndex = this.getPageIndex(textNode);
|
|
36
|
+
matches.push({
|
|
37
|
+
textNode,
|
|
38
|
+
startOffset: match.index,
|
|
39
|
+
endOffset: match.index + match[0].length,
|
|
40
|
+
pageIndex,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
this.applyHighlights(matches);
|
|
45
|
+
return matches;
|
|
46
|
+
}
|
|
47
|
+
highlightCurrentMatch(index) {
|
|
48
|
+
// Reverse the stored order since we apply in reverse
|
|
49
|
+
const reversed = [...this.highlights].reverse();
|
|
50
|
+
reversed.forEach((mark, i) => {
|
|
51
|
+
if (i === index) {
|
|
52
|
+
mark.classList.add('rv-search-active');
|
|
53
|
+
mark.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
mark.classList.remove('rv-search-active');
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
clearHighlights() {
|
|
61
|
+
this.highlights.forEach(mark => {
|
|
62
|
+
const parent = mark.parentNode;
|
|
63
|
+
if (parent) {
|
|
64
|
+
const textNode = document.createTextNode(mark.textContent || '');
|
|
65
|
+
parent.replaceChild(textNode, mark);
|
|
66
|
+
parent.normalize();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
this.highlights = [];
|
|
70
|
+
}
|
|
71
|
+
applyHighlights(matches) {
|
|
72
|
+
// Group matches by text node
|
|
73
|
+
const nodeMap = new Map();
|
|
74
|
+
for (const match of matches) {
|
|
75
|
+
const existing = nodeMap.get(match.textNode) || [];
|
|
76
|
+
existing.push(match);
|
|
77
|
+
nodeMap.set(match.textNode, existing);
|
|
78
|
+
}
|
|
79
|
+
// Process each node. Process offsets in reverse to preserve earlier offsets.
|
|
80
|
+
for (const [textNode, nodeMatches] of nodeMap) {
|
|
81
|
+
const sorted = [...nodeMatches].sort((a, b) => b.startOffset - a.startOffset);
|
|
82
|
+
for (const m of sorted) {
|
|
83
|
+
try {
|
|
84
|
+
const range = document.createRange();
|
|
85
|
+
range.setStart(textNode.parentNode ? textNode : textNode, m.startOffset);
|
|
86
|
+
range.setEnd(textNode.parentNode ? textNode : textNode, m.endOffset);
|
|
87
|
+
const mark = document.createElement('mark');
|
|
88
|
+
mark.className = 'rv-search-highlight';
|
|
89
|
+
range.surroundContents(mark);
|
|
90
|
+
this.highlights.push(mark);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Range might be invalid if DOM changed; skip silently
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
getPageIndex(node) {
|
|
99
|
+
let current = node;
|
|
100
|
+
while (current) {
|
|
101
|
+
if (current instanceof HTMLElement && current.hasAttribute('data-page-index')) {
|
|
102
|
+
return parseInt(current.getAttribute('data-page-index'), 10);
|
|
103
|
+
}
|
|
104
|
+
current = current.parentNode;
|
|
105
|
+
}
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
escapeRegex(str) {
|
|
109
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
110
|
+
}
|
|
111
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
112
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService }); }
|
|
113
|
+
}
|
|
114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService, decorators: [{
|
|
115
|
+
type: Injectable
|
|
116
|
+
}] });
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnQtdmlld2VyL3NyYy9saWIvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJM0MsTUFBTSxPQUFPLGFBQWE7SUFEMUI7UUFFVSxlQUFVLEdBQWtCLEVBQUUsQ0FBQztLQXNIeEM7SUFwSEMsTUFBTSxDQUFDLEtBQWEsRUFBRSxTQUFzQjtRQUMxQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV2QyxNQUFNLE9BQU8sR0FBa0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTdDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDdEMsU0FBUyxFQUNULFVBQVUsQ0FBQyxTQUFTLEVBQ3BCO1lBQ0UsVUFBVSxFQUFFLENBQUMsSUFBVSxFQUFFLEVBQUU7Z0JBQ3pCLG9FQUFvRTtnQkFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDO2dCQUM3QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLE9BQU8sSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFLENB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UCx1REFBdUQ7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixJQUFJLE9BQU8sR0FBZ0IsSUFBSSxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDZixJQUFJLE9BQU8sWUFBWSxXQUFXLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzlFLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDOytHQXRIVSxhQUFhO21IQUFiLGFBQWE7OzRGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNlYXJjaE1hdGNoIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC10ZW1wbGF0ZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIHtcclxuICBwcml2YXRlIGhpZ2hsaWdodHM6IEhUTUxFbGVtZW50W10gPSBbXTtcclxuXHJcbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiBTZWFyY2hNYXRjaFtdIHtcclxuICAgIHRoaXMuY2xlYXJIaWdobGlnaHRzKCk7XHJcbiAgICBpZiAoIXF1ZXJ5IHx8ICFxdWVyeS50cmltKCkpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBtYXRjaGVzOiBTZWFyY2hNYXRjaFtdID0gW107XHJcbiAgICBjb25zdCBlc2NhcGVkUXVlcnkgPSB0aGlzLmVzY2FwZVJlZ2V4KHF1ZXJ5KTtcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChlc2NhcGVkUXVlcnksICdnaScpO1xyXG5cclxuICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgIGNvbnRhaW5lcixcclxuICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXHJcbiAgICAgIHtcclxuICAgICAgICBhY2NlcHROb2RlOiAobm9kZTogVGV4dCkgPT4ge1xyXG4gICAgICAgICAgLy8gU2tpcCBub2RlcyBpbnNpZGUgbWFya3MgKG91ciBvd24gaGlnaGxpZ2h0cykgb3Igc2NyaXB0L3N0eWxlIHRhZ3NcclxuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfUkVKRUNUO1xyXG4gICAgICAgICAgY29uc3QgdGFnID0gcGFyZW50LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICBpZiAodGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnbWFyaycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiAobm9kZS50ZXh0Q29udGVudCAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxyXG4gICAgICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgbGV0IHRleHROb2RlOiBUZXh0IHwgbnVsbDtcclxuICAgIHdoaWxlICgodGV4dE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSBhcyBUZXh0IHwgbnVsbCkpIHtcclxuICAgICAgY29uc3QgdGV4dCA9IHRleHROb2RlLnRleHRDb250ZW50IHx8ICcnO1xyXG4gICAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XHJcbiAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XHJcblxyXG4gICAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSB0aGlzLmdldFBhZ2VJbmRleCh0ZXh0Tm9kZSk7XHJcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgIHRleHROb2RlLFxyXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IG1hdGNoLmluZGV4LFxyXG4gICAgICAgICAgZW5kT2Zmc2V0OiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCxcclxuICAgICAgICAgIHBhZ2VJbmRleCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXBwbHlIaWdobGlnaHRzKG1hdGNoZXMpO1xyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHRDdXJyZW50TWF0Y2goaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gUmV2ZXJzZSB0aGUgc3RvcmVkIG9yZGVyIHNpbmNlIHdlIGFwcGx5IGluIHJldmVyc2VcclxuICAgIGNvbnN0IHJldmVyc2VkID0gWy4uLnRoaXMuaGlnaGxpZ2h0c10ucmV2ZXJzZSgpO1xyXG4gICAgcmV2ZXJzZWQuZm9yRWFjaCgobWFyaywgaSkgPT4ge1xyXG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcclxuICAgICAgICBtYXJrLmNsYXNzTGlzdC5hZGQoJ3J2LXNlYXJjaC1hY3RpdmUnKTtcclxuICAgICAgICBtYXJrLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWFyay5jbGFzc0xpc3QucmVtb3ZlKCdydi1zZWFyY2gtYWN0aXZlJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJIaWdobGlnaHRzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWdobGlnaHRzLmZvckVhY2gobWFyayA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IG1hcmsucGFyZW50Tm9kZTtcclxuICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWFyay50ZXh0Q29udGVudCB8fCAnJyk7XHJcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCh0ZXh0Tm9kZSwgbWFyayk7XHJcbiAgICAgICAgcGFyZW50Lm5vcm1hbGl6ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuaGlnaGxpZ2h0cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUhpZ2hsaWdodHMobWF0Y2hlczogU2VhcmNoTWF0Y2hbXSk6IHZvaWQge1xyXG4gICAgLy8gR3JvdXAgbWF0Y2hlcyBieSB0ZXh0IG5vZGVcclxuICAgIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPFRleHQsIFNlYXJjaE1hdGNoW10+KCk7XHJcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBub2RlTWFwLmdldChtYXRjaC50ZXh0Tm9kZSkgfHwgW107XHJcbiAgICAgIGV4aXN0aW5nLnB1c2gobWF0Y2gpO1xyXG4gICAgICBub2RlTWFwLnNldChtYXRjaC50ZXh0Tm9kZSwgZXhpc3RpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb2Nlc3MgZWFjaCBub2RlLiBQcm9jZXNzIG9mZnNldHMgaW4gcmV2ZXJzZSB0byBwcmVzZXJ2ZSBlYXJsaWVyIG9mZnNldHMuXHJcbiAgICBmb3IgKGNvbnN0IFt0ZXh0Tm9kZSwgbm9kZU1hdGNoZXNdIG9mIG5vZGVNYXApIHtcclxuICAgICAgY29uc3Qgc29ydGVkID0gWy4uLm5vZGVNYXRjaGVzXS5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0T2Zmc2V0IC0gYS5zdGFydE9mZnNldCk7XHJcbiAgICAgIGZvciAoY29uc3QgbSBvZiBzb3J0ZWQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUucGFyZW50Tm9kZSA/IHRleHROb2RlIDogdGV4dE5vZGUsIG0uc3RhcnRPZmZzZXQpO1xyXG4gICAgICAgICAgcmFuZ2Uuc2V0RW5kKHRleHROb2RlLnBhcmVudE5vZGUgPyB0ZXh0Tm9kZSA6IHRleHROb2RlLCBtLmVuZE9mZnNldCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgbWFyayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21hcmsnKTtcclxuICAgICAgICAgIG1hcmsuY2xhc3NOYW1lID0gJ3J2LXNlYXJjaC1oaWdobGlnaHQnO1xyXG4gICAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhtYXJrKTtcclxuICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5wdXNoKG1hcmspO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgLy8gUmFuZ2UgbWlnaHQgYmUgaW52YWxpZCBpZiBET00gY2hhbmdlZDsgc2tpcCBzaWxlbnRseVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQYWdlSW5kZXgobm9kZTogTm9kZSk6IG51bWJlciB7XHJcbiAgICBsZXQgY3VycmVudDogTm9kZSB8IG51bGwgPSBub2RlO1xyXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBjdXJyZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wYWdlLWluZGV4JykpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VJbnQoY3VycmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGFnZS1pbmRleCcpISwgMTApO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class StyleMapperService {
|
|
4
|
+
mapComponentStyles(style) {
|
|
5
|
+
const result = {};
|
|
6
|
+
// Typography
|
|
7
|
+
if (style.fontFamily)
|
|
8
|
+
result['font-family'] = style.fontFamily;
|
|
9
|
+
if (style.fontSize)
|
|
10
|
+
result['font-size'] = style.fontSize;
|
|
11
|
+
if (style.fontWeight)
|
|
12
|
+
result['font-weight'] = style.fontWeight;
|
|
13
|
+
if (style.fontStyle)
|
|
14
|
+
result['font-style'] = style.fontStyle;
|
|
15
|
+
if (style.textDecoration)
|
|
16
|
+
result['text-decoration'] = style.textDecoration;
|
|
17
|
+
if (style.lineHeight)
|
|
18
|
+
result['line-height'] = style.lineHeight;
|
|
19
|
+
if (style.letterSpacing)
|
|
20
|
+
result['letter-spacing'] = style.letterSpacing;
|
|
21
|
+
// Colors
|
|
22
|
+
if (style.color)
|
|
23
|
+
result['color'] = style.color;
|
|
24
|
+
if (style.backgroundColor)
|
|
25
|
+
result['background-color'] = style.backgroundColor;
|
|
26
|
+
// Alignment
|
|
27
|
+
if (style.textAlign)
|
|
28
|
+
result['text-align'] = style.textAlign;
|
|
29
|
+
// Spacing
|
|
30
|
+
if (style.padding)
|
|
31
|
+
result['padding'] = style.padding;
|
|
32
|
+
if (style.paddingTop)
|
|
33
|
+
result['padding-top'] = style.paddingTop;
|
|
34
|
+
if (style.paddingRight)
|
|
35
|
+
result['padding-right'] = style.paddingRight;
|
|
36
|
+
if (style.paddingBottom)
|
|
37
|
+
result['padding-bottom'] = style.paddingBottom;
|
|
38
|
+
if (style.paddingLeft)
|
|
39
|
+
result['padding-left'] = style.paddingLeft;
|
|
40
|
+
// Borders
|
|
41
|
+
if (style.border)
|
|
42
|
+
result['border'] = style.border;
|
|
43
|
+
if (style.borderWidth)
|
|
44
|
+
result['border-width'] = style.borderWidth;
|
|
45
|
+
if (style.borderStyle)
|
|
46
|
+
result['border-style'] = style.borderStyle;
|
|
47
|
+
if (style.borderColor)
|
|
48
|
+
result['border-color'] = style.borderColor;
|
|
49
|
+
if (style.borderRadius)
|
|
50
|
+
result['border-radius'] = style.borderRadius;
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
mapTableStyle(component) {
|
|
54
|
+
const result = {};
|
|
55
|
+
const config = component.tableConfig;
|
|
56
|
+
if (config?.showOuterBorder !== false) {
|
|
57
|
+
const width = config?.outerBorderWidth || '1px';
|
|
58
|
+
const color = config?.outerBorderColor || '#cccccc';
|
|
59
|
+
const style = config?.outerBorderStyle || 'solid';
|
|
60
|
+
result['border'] = `${width} ${style} ${color}`;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
result['border'] = 'none';
|
|
64
|
+
}
|
|
65
|
+
if (config?.tableLayout) {
|
|
66
|
+
result['table-layout'] = config.tableLayout;
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
mapHeaderStyle(component, colIndex, col) {
|
|
71
|
+
const result = {};
|
|
72
|
+
const config = component.tableConfig;
|
|
73
|
+
if (config?.headerBackground) {
|
|
74
|
+
result['background-color'] = config.headerBackground;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
result['background-color'] = '#f5f5f5';
|
|
78
|
+
}
|
|
79
|
+
if (config?.headerTextColor) {
|
|
80
|
+
result['color'] = config.headerTextColor;
|
|
81
|
+
}
|
|
82
|
+
if (config?.headerFontWeight) {
|
|
83
|
+
result['font-weight'] = config.headerFontWeight;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
result['font-weight'] = 'bold';
|
|
87
|
+
}
|
|
88
|
+
if (config?.headerFontSize) {
|
|
89
|
+
result['font-size'] = config.headerFontSize;
|
|
90
|
+
}
|
|
91
|
+
if (config?.headerTextAlign) {
|
|
92
|
+
result['text-align'] = config.headerTextAlign;
|
|
93
|
+
}
|
|
94
|
+
else if (col?.style?.textAlign) {
|
|
95
|
+
result['text-align'] = col.style.textAlign;
|
|
96
|
+
}
|
|
97
|
+
if (config?.headerPadding) {
|
|
98
|
+
result['padding'] = config.headerPadding;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
result['padding'] = '8px';
|
|
102
|
+
}
|
|
103
|
+
if (config?.headerBorderBottom) {
|
|
104
|
+
result['border-bottom'] = config.headerBorderBottom;
|
|
105
|
+
}
|
|
106
|
+
if (col?.width) {
|
|
107
|
+
result['width'] = col.width;
|
|
108
|
+
}
|
|
109
|
+
const totalCols = component.columns?.length || 0;
|
|
110
|
+
if (config?.showColumnSeparators !== false && colIndex < totalCols - 1) {
|
|
111
|
+
const sepWidth = config?.columnSeparatorWidth || '1px';
|
|
112
|
+
const sepColor = config?.columnSeparatorColor || '#e0e0e0';
|
|
113
|
+
const sepStyle = config?.columnSeparatorStyle || 'solid';
|
|
114
|
+
result['border-right'] = `${sepWidth} ${sepStyle} ${sepColor}`;
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
mapRowStyle(component, rowIndex, totalRows) {
|
|
119
|
+
const result = {};
|
|
120
|
+
const config = component.tableConfig;
|
|
121
|
+
if (config?.highlightFirstRow && rowIndex === 0) {
|
|
122
|
+
result['background-color'] = config.firstRowBackground || '#e8f5e9';
|
|
123
|
+
}
|
|
124
|
+
else if (config?.highlightLastRow && rowIndex === totalRows - 1) {
|
|
125
|
+
result['background-color'] = config.lastRowBackground || '#fff3e0';
|
|
126
|
+
}
|
|
127
|
+
else if (config?.enableAlternateRows) {
|
|
128
|
+
if (rowIndex % 2 === 0) {
|
|
129
|
+
result['background-color'] = config.evenRowBackground || '#ffffff';
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
result['background-color'] = config.oddRowBackground || '#f9f9f9';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (config?.showRowSeparators !== false && rowIndex < totalRows - 1) {
|
|
136
|
+
const sepWidth = config?.rowSeparatorWidth || '1px';
|
|
137
|
+
const sepColor = config?.rowSeparatorColor || '#e0e0e0';
|
|
138
|
+
const sepStyle = config?.rowSeparatorStyle || 'solid';
|
|
139
|
+
result['border-bottom'] = `${sepWidth} ${sepStyle} ${sepColor}`;
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
mapCellStyle(component, colIndex, col) {
|
|
144
|
+
const result = {};
|
|
145
|
+
const config = component.tableConfig;
|
|
146
|
+
if (config?.cellPadding) {
|
|
147
|
+
result['padding'] = config.cellPadding;
|
|
148
|
+
}
|
|
149
|
+
else if (col?.style?.padding) {
|
|
150
|
+
result['padding'] = col.style.padding;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
result['padding'] = '8px';
|
|
154
|
+
}
|
|
155
|
+
if (config?.cellVerticalAlign) {
|
|
156
|
+
result['vertical-align'] = config.cellVerticalAlign;
|
|
157
|
+
}
|
|
158
|
+
if (col?.width) {
|
|
159
|
+
result['width'] = col.width;
|
|
160
|
+
}
|
|
161
|
+
if (col?.style?.textAlign) {
|
|
162
|
+
result['text-align'] = col.style.textAlign;
|
|
163
|
+
}
|
|
164
|
+
if (col?.style?.fontWeight) {
|
|
165
|
+
result['font-weight'] = col.style.fontWeight;
|
|
166
|
+
}
|
|
167
|
+
if (col?.style?.color) {
|
|
168
|
+
result['color'] = col.style.color;
|
|
169
|
+
}
|
|
170
|
+
const totalCols = component.columns?.length || 0;
|
|
171
|
+
if (config?.showColumnSeparators !== false && colIndex < totalCols - 1) {
|
|
172
|
+
const sepWidth = config?.columnSeparatorWidth || '1px';
|
|
173
|
+
const sepColor = config?.columnSeparatorColor || '#e0e0e0';
|
|
174
|
+
const sepStyle = config?.columnSeparatorStyle || 'solid';
|
|
175
|
+
result['border-right'] = `${sepWidth} ${sepStyle} ${sepColor}`;
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
mapBandStyle(section) {
|
|
180
|
+
const result = {};
|
|
181
|
+
if (section.style?.backgroundColor) {
|
|
182
|
+
result['background-color'] = section.style.backgroundColor;
|
|
183
|
+
}
|
|
184
|
+
if (section.style?.borderBottom) {
|
|
185
|
+
result['border-bottom'] = section.style.borderBottom;
|
|
186
|
+
}
|
|
187
|
+
if (section.style?.borderTop) {
|
|
188
|
+
result['border-top'] = section.style.borderTop;
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
mapComplexCellStyle(cell, config, isHeader) {
|
|
193
|
+
const result = {};
|
|
194
|
+
// Grid lines
|
|
195
|
+
if (config.showGridLines !== false) {
|
|
196
|
+
const w = config.gridLineWidth || '1px';
|
|
197
|
+
const c = config.gridLineColor || '#e0e0e0';
|
|
198
|
+
const s = config.gridLineStyle || 'solid';
|
|
199
|
+
result['border'] = `${w} ${s} ${c}`;
|
|
200
|
+
}
|
|
201
|
+
// Header/body defaults
|
|
202
|
+
if (isHeader) {
|
|
203
|
+
if (config.headerBackground)
|
|
204
|
+
result['background-color'] = config.headerBackground;
|
|
205
|
+
if (config.headerTextColor)
|
|
206
|
+
result['color'] = config.headerTextColor;
|
|
207
|
+
if (config.headerFontWeight)
|
|
208
|
+
result['font-weight'] = config.headerFontWeight;
|
|
209
|
+
if (config.headerFontSize)
|
|
210
|
+
result['font-size'] = config.headerFontSize;
|
|
211
|
+
if (config.headerTextAlign)
|
|
212
|
+
result['text-align'] = config.headerTextAlign;
|
|
213
|
+
if (config.headerPadding)
|
|
214
|
+
result['padding'] = config.headerPadding;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
if (config.cellPadding)
|
|
218
|
+
result['padding'] = config.cellPadding;
|
|
219
|
+
if (config.cellTextAlign)
|
|
220
|
+
result['text-align'] = config.cellTextAlign;
|
|
221
|
+
}
|
|
222
|
+
if (config.cellVerticalAlign)
|
|
223
|
+
result['vertical-align'] = config.cellVerticalAlign;
|
|
224
|
+
// Per-cell style overrides
|
|
225
|
+
if (cell.style) {
|
|
226
|
+
if (cell.style.backgroundColor)
|
|
227
|
+
result['background-color'] = cell.style.backgroundColor;
|
|
228
|
+
if (cell.style.color)
|
|
229
|
+
result['color'] = cell.style.color;
|
|
230
|
+
if (cell.style.fontWeight)
|
|
231
|
+
result['font-weight'] = cell.style.fontWeight;
|
|
232
|
+
if (cell.style.fontSize)
|
|
233
|
+
result['font-size'] = cell.style.fontSize;
|
|
234
|
+
if (cell.style.textAlign)
|
|
235
|
+
result['text-align'] = cell.style.textAlign;
|
|
236
|
+
if (cell.style.padding)
|
|
237
|
+
result['padding'] = cell.style.padding;
|
|
238
|
+
}
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StyleMapperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
242
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StyleMapperService }); }
|
|
243
|
+
}
|
|
244
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StyleMapperService, decorators: [{
|
|
245
|
+
type: Injectable
|
|
246
|
+
}] });
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGUtbWFwcGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnQtdmlld2VyL3NyYy9saWIvc2VydmljZXMvc3R5bGUtbWFwcGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixrQkFBa0IsQ0FBQyxLQUFzQjtRQUN2QyxNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1FBRTFDLGFBQWE7UUFDYixJQUFJLEtBQUssQ0FBQyxVQUFVO1lBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDL0QsSUFBSSxLQUFLLENBQUMsUUFBUTtZQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3pELElBQUksS0FBSyxDQUFDLFVBQVU7WUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUMvRCxJQUFJLEtBQUssQ0FBQyxTQUFTO1lBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDNUQsSUFBSSxLQUFLLENBQUMsY0FBYztZQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0UsSUFBSSxLQUFLLENBQUMsVUFBVTtZQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQy9ELElBQUksS0FBSyxDQUFDLGFBQWE7WUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBRXhFLFNBQVM7UUFDVCxJQUFJLEtBQUssQ0FBQyxLQUFLO1lBQUUsTUFBTSxDQUFDLE9BQU8s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SyxDQUFDLGVBQWU7Z0JBQUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDeEYsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO2dCQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUN6RSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbkUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7Z0JBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3RFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNqRSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F2T1Usa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbCwgU3R5bGVQcm9wZXJ0aWVzLCBUYWJsZUNvbHVtbiwgQ29tcGxleFRhYmxlQ2VsbCwgQ29tcGxleFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlcG9ydC10ZW1wbGF0ZS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTdHlsZU1hcHBlclNlcnZpY2Uge1xuXG4gIG1hcENvbXBvbmVudFN0eWxlcyhzdHlsZTogU3R5bGVQcm9wZXJ0aWVzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAvLyBUeXBvZ3JhcGh5XG4gICAgaWYgKHN0eWxlLmZvbnRGYW1pbHkpIHJlc3VsdFsnZm9udC1mYW1pbHknXSA9IHN0eWxlLmZvbnRGYW1pbHk7XG4gICAgaWYgKHN0eWxlLmZvbnRTaXplKSByZXN1bHRbJ2ZvbnQtc2l6ZSddID0gc3R5bGUuZm9udFNpemU7XG4gICAgaWYgKHN0eWxlLmZvbnRXZWlnaHQpIHJlc3VsdFsnZm9udC13ZWlnaHQnXSA9IHN0eWxlLmZvbnRXZWlnaHQ7XG4gICAgaWYgKHN0eWxlLmZvbnRTdHlsZSkgcmVzdWx0Wydmb250LXN0eWxlJ10gPSBzdHlsZS5mb250U3R5bGU7XG4gICAgaWYgKHN0eWxlLnRleHREZWNvcmF0aW9uKSByZXN1bHRbJ3RleHQtZGVjb3JhdGlvbiddID0gc3R5bGUudGV4dERlY29yYXRpb247XG4gICAgaWYgKHN0eWxlLmxpbmVIZWlnaHQpIHJlc3VsdFsnbGluZS1oZWlnaHQnXSA9IHN0eWxlLmxpbmVIZWlnaHQ7XG4gICAgaWYgKHN0eWxlLmxldHRlclNwYWNpbmcpIHJlc3VsdFsnbGV0dGVyLXNwYWNpbmcnXSA9IHN0eWxlLmxldHRlclNwYWNpbmc7XG5cbiAgICAvLyBDb2xvcnNcbiAgICBpZiAoc3R5bGUuY29sb3IpIHJlc3VsdFsnY29sb3InXSA9IHN0eWxlLmNvbG9yO1xuICAgIGlmIChzdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgLy8gQWxpZ25tZW50XG4gICAgaWYgKHN0eWxlLnRleHRBbGlnbikgcmVzdWx0Wyd0ZXh0LWFsaWduJ10gPSBzdHlsZS50ZXh0QWxpZ247XG5cbiAgICAvLyBTcGFjaW5nXG4gICAgaWYgKHN0eWxlLnBhZGRpbmcpIHJlc3VsdFsncGFkZGluZyddID0gc3R5bGUucGFkZGluZztcbiAgICBpZiAoc3R5bGUucGFkZGluZ1RvcCkgcmVzdWx0WydwYWRkaW5nLXRvcCddID0gc3R5bGUucGFkZGluZ1RvcDtcbiAgICBpZiAoc3R5bGUucGFkZGluZ1JpZ2h0KSByZXN1bHRbJ3BhZGRpbmctcmlnaHQnXSA9IHN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICBpZiAoc3R5bGUucGFkZGluZ0JvdHRvbSkgcmVzdWx0WydwYWRkaW5nLWJvdHRvbSddID0gc3R5bGUucGFkZGluZ0JvdHRvbTtcbiAgICBpZiAoc3R5bGUucGFkZGluZ0xlZnQpIHJlc3VsdFsncGFkZGluZy1sZWZ0J10gPSBzdHlsZS5wYWRkaW5nTGVmdDtcblxuICAgIC8vIEJvcmRlcnNcbiAgICBpZiAoc3R5bGUuYm9yZGVyKSByZXN1bHRbJ2JvcmRlciddID0gc3R5bGUuYm9yZGVyO1xuICAgIGlmIChzdHlsZS5ib3JkZXJXaWR0aCkgcmVzdWx0Wydib3JkZXItd2lkdGgnXSA9IHN0eWxlLmJvcmRlcldpZHRoO1xuICAgIGlmIChzdHlsZS5ib3JkZXJTdHlsZSkgcmVzdWx0Wydib3JkZXItc3R5bGUnXSA9IHN0eWxlLmJvcmRlclN0eWxlO1xuICAgIGlmIChzdHlsZS5ib3JkZXJDb2xvcikgcmVzdWx0Wydib3JkZXItY29sb3InXSA9IHN0eWxlLmJvcmRlckNvbG9yO1xuICAgIGlmIChzdHlsZS5ib3JkZXJSYWRpdXMpIHJlc3VsdFsnYm9yZGVyLXJhZGl1cyddID0gc3R5bGUuYm9yZGVyUmFkaXVzO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG1hcFRhYmxlU3R5bGUoY29tcG9uZW50OiBDb21wb25lbnRNb2RlbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC50YWJsZUNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnNob3dPdXRlckJvcmRlciAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY29uZmlnPy5vdXRlckJvcmRlcldpZHRoIHx8ICcxcHgnO1xuICAgICAgY29uc3QgY29sb3IgPSBjb25maWc/Lm91dGVyQm9yZGVyQ29sb3IgfHwgJyNjY2NjY2MnO1xuICAgICAgY29uc3Qgc3R5bGUgPSBjb25maWc/Lm91dGVyQm9yZGVyU3R5bGUgfHwgJ3NvbGlkJztcbiAgICAgIHJlc3VsdFsnYm9yZGVyJ10gPSBgJHt3aWR0aH0gJHtzdHlsZX0gJHtjb2xvcn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbJ2JvcmRlciddID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGlmIChjb25maWc/LnRhYmxlTGF5b3V0KSB7XG4gICAgICByZXN1bHRbJ3RhYmxlLWxheW91dCddID0gY29uZmlnLnRhYmxlTGF5b3V0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBtYXBIZWFkZXJTdHlsZShjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsLCBjb2xJbmRleDogbnVtYmVyLCBjb2w/OiBUYWJsZUNvbHVtbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC50YWJsZUNvbmZpZztcblxuICAgIGlmIChjb25maWc/LmhlYWRlckJhY2tncm91bmQpIHtcbiAgICAgIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gY29uZmlnLmhlYWRlckJhY2tncm91bmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gJyNmNWY1ZjUnO1xuICAgIH1cblxuICAgIGlmIChjb25maWc/LmhlYWRlclRleHRDb2xvcikge1xuICAgICAgcmVzdWx0Wydjb2xvciddID0gY29uZmlnLmhlYWRlclRleHRDb2xvcjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnPy5oZWFkZXJGb250V2VpZ2h0KSB7XG4gICAgICByZXN1bHRbJ2ZvbnQtd2VpZ2h0J10gPSBjb25maWcuaGVhZGVyRm9udFdlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0Wydmb250LXdlaWdodCddID0gJ2JvbGQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWc/LmhlYWRlckZvbnRTaXplKSB7XG4gICAgICByZXN1bHRbJ2ZvbnQtc2l6ZSddID0gY29uZmlnLmhlYWRlckZvbnRTaXplO1xuICAgIH1cblxuICAgIGlmIChjb25maWc/LmhlYWRlclRleHRBbGlnbikge1xuICAgICAgcmVzdWx0Wyd0ZXh0LWFsaWduJ10gPSBjb25maWcuaGVhZGVyVGV4dEFsaWduO1xuICAgIH0gZWxzZSBpZiAoY29sPy5zdHlsZT8udGV4dEFsaWduKSB7XG4gICAgICByZXN1bHRbJ3RleHQtYWxpZ24nXSA9IGNvbC5zdHlsZS50ZXh0QWxpZ247XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZz8uaGVhZGVyUGFkZGluZykge1xuICAgICAgcmVzdWx0WydwYWRkaW5nJ10gPSBjb25maWcuaGVhZGVyUGFkZGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0WydwYWRkaW5nJ10gPSAnOHB4JztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnPy5oZWFkZXJCb3JkZXJCb3R0b20pIHtcbiAgICAgIHJlc3VsdFsnYm9yZGVyLWJvdHRvbSddID0gY29uZmlnLmhlYWRlckJvcmRlckJvdHRvbTtcbiAgICB9XG5cbiAgICBpZiAoY29sPy53aWR0aCkge1xuICAgICAgcmVzdWx0Wyd3aWR0aCddID0gY29sLndpZHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsQ29scyA9IGNvbXBvbmVudC5jb2x1bW5zPy5sZW5ndGggfHwgMDtcbiAgICBpZiAoY29uZmlnPy5zaG93Q29sdW1uU2VwYXJhdG9ycyAhPT0gZmFsc2UgJiYgY29sSW5kZXggPCB0b3RhbENvbHMgLSAxKSB7XG4gICAgICBjb25zdCBzZXBXaWR0aCA9IGNvbmZpZz8uY29sdW1uU2VwYXJhdG9yV2lkdGggfHwgJzFweCc7XG4gICAgICBjb25zdCBzZXBDb2xvciA9IGNvbmZpZz8uY29sdW1uU2VwYXJhdG9yQ29sb3IgfHwgJyNlMGUwZTAnO1xuICAgICAgY29uc3Qgc2VwU3R5bGUgPSBjb25maWc/LmNvbHVtblNlcGFyYXRvclN0eWxlIHx8ICdzb2xpZCc7XG4gICAgICByZXN1bHRbJ2JvcmRlci1yaWdodCddID0gYCR7c2VwV2lkdGh9ICR7c2VwU3R5bGV9ICR7c2VwQ29sb3J9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbWFwUm93U3R5bGUoY29tcG9uZW50OiBDb21wb25lbnRNb2RlbCwgcm93SW5kZXg6IG51bWJlciwgdG90YWxSb3dzOiBudW1iZXIpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQudGFibGVDb25maWc7XG5cbiAgICBpZiAoY29uZmlnPy5oaWdobGlnaHRGaXJzdFJvdyAmJiByb3dJbmRleCA9PT0gMCkge1xuICAgICAgcmVzdWx0WydiYWNrZ3JvdW5kLWNvbG9yJ10gPSBjb25maWcuZmlyc3RSb3dCYWNrZ3JvdW5kIHx8ICcjZThmNWU5JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZz8uaGlnaGxpZ2h0TGFzdFJvdyAmJiByb3dJbmRleCA9PT0gdG90YWxSb3dzIC0gMSkge1xuICAgICAgcmVzdWx0WydiYWNrZ3JvdW5kLWNvbG9yJ10gPSBjb25maWcubGFzdFJvd0JhY2tncm91bmQgfHwgJyNmZmYzZTAnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnPy5lbmFibGVBbHRlcm5hdGVSb3dzKSB7XG4gICAgICBpZiAocm93SW5kZXggJSAyID09PSAwKSB7XG4gICAgICAgIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gY29uZmlnLmV2ZW5Sb3dCYWNrZ3JvdW5kIHx8ICcjZmZmZmZmJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gY29uZmlnLm9kZFJvd0JhY2tncm91bmQgfHwgJyNmOWY5ZjknO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWc/LnNob3dSb3dTZXBhcmF0b3JzICE9PSBmYWxzZSAmJiByb3dJbmRleCA8IHRvdGFsUm93cyAtIDEpIHtcbiAgICAgIGNvbnN0IHNlcFdpZHRoID0gY29uZmlnPy5yb3dTZXBhcmF0b3JXaWR0aCB8fCAnMXB4JztcbiAgICAgIGNvbnN0IHNlcENvbG9yID0gY29uZmlnPy5yb3dTZXBhcmF0b3JDb2xvciB8fCAnI2UwZTBlMCc7XG4gICAgICBjb25zdCBzZXBTdHlsZSA9IGNvbmZpZz8ucm93U2VwYXJhdG9yU3R5bGUgfHwgJ3NvbGlkJztcbiAgICAgIHJlc3VsdFsnYm9yZGVyLWJvdHRvbSddID0gYCR7c2VwV2lkdGh9ICR7c2VwU3R5bGV9ICR7c2VwQ29sb3J9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbWFwQ2VsbFN0eWxlKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWwsIGNvbEluZGV4OiBudW1iZXIsIGNvbD86IFRhYmxlQ29sdW1uKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LnRhYmxlQ29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8uY2VsbFBhZGRpbmcpIHtcbiAgICAgIHJlc3VsdFsncGFkZGluZyddID0gY29uZmlnLmNlbGxQYWRkaW5nO1xuICAgIH0gZWxzZSBpZiAoY29sPy5zdHlsZT8ucGFkZGluZykge1xuICAgICAgcmVzdWx0WydwYWRkaW5nJ10gPSBjb2wuc3R5bGUucGFkZGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0WydwYWRkaW5nJ10gPSAnOHB4JztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnPy5jZWxsVmVydGljYWxBbGlnbikge1xuICAgICAgcmVzdWx0Wyd2ZXJ0aWNhbC1hbGlnbiddID0gY29uZmlnLmNlbGxWZXJ0aWNhbEFsaWduO1xuICAgIH1cblxuICAgIGlmIChjb2w/LndpZHRoKSB7XG4gICAgICByZXN1bHRbJ3dpZHRoJ10gPSBjb2wud2lkdGg7XG4gICAgfVxuXG4gICAgaWYgKGNvbD8uc3R5bGU/LnRleHRBbGlnbikge1xuICAgICAgcmVzdWx0Wyd0ZXh0LWFsaWduJ10gPSBjb2wuc3R5bGUudGV4dEFsaWduO1xuICAgIH1cbiAgICBpZiAoY29sPy5zdHlsZT8uZm9udFdlaWdodCkge1xuICAgICAgcmVzdWx0Wydmb250LXdlaWdodCddID0gY29sLnN0eWxlLmZvbnRXZWlnaHQ7XG4gICAgfVxuICAgIGlmIChjb2w/LnN0eWxlPy5jb2xvcikge1xuICAgICAgcmVzdWx0Wydjb2xvciddID0gY29sLnN0eWxlLmNvbG9yO1xuICAgIH1cblxuICAgIGNvbnN0IHRvdGFsQ29scyA9IGNvbXBvbmVudC5jb2x1bW5zPy5sZW5ndGggfHwgMDtcbiAgICBpZiAoY29uZmlnPy5zaG93Q29sdW1uU2VwYXJhdG9ycyAhPT0gZmFsc2UgJiYgY29sSW5kZXggPCB0b3RhbENvbHMgLSAxKSB7XG4gICAgICBjb25zdCBzZXBXaWR0aCA9IGNvbmZpZz8uY29sdW1uU2VwYXJhdG9yV2lkdGggfHwgJzFweCc7XG4gICAgICBjb25zdCBzZXBDb2xvciA9IGNvbmZpZz8uY29sdW1uU2VwYXJhdG9yQ29sb3IgfHwgJyNlMGUwZTAnO1xuICAgICAgY29uc3Qgc2VwU3R5bGUgPSBjb25maWc/LmNvbHVtblNlcGFyYXRvclN0eWxlIHx8ICdzb2xpZCc7XG4gICAgICByZXN1bHRbJ2JvcmRlci1yaWdodCddID0gYCR7c2VwV2lkdGh9ICR7c2VwU3R5bGV9ICR7c2VwQ29sb3J9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbWFwQmFuZFN0eWxlKHNlY3Rpb246IFJlcG9ydFNlY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoc2VjdGlvbi5zdHlsZT8uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICByZXN1bHRbJ2JhY2tncm91bmQtY29sb3InXSA9IHNlY3Rpb24uc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgIH1cbiAgICBpZiAoc2VjdGlvbi5zdHlsZT8uYm9yZGVyQm90dG9tKSB7XG4gICAgICByZXN1bHRbJ2JvcmRlci1ib3R0b20nXSA9IHNlY3Rpb24uc3R5bGUuYm9yZGVyQm90dG9tO1xuICAgIH1cbiAgICBpZiAoc2VjdGlvbi5zdHlsZT8uYm9yZGVyVG9wKSB7XG4gICAgICByZXN1bHRbJ2JvcmRlci10b3AnXSA9IHNlY3Rpb24uc3R5bGUuYm9yZGVyVG9wO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbWFwQ29tcGxleENlbGxTdHlsZShjZWxsOiBDb21wbGV4VGFibGVDZWxsLCBjb25maWc6IENvbXBsZXhUYWJsZUNvbmZpZywgaXNIZWFkZXI6IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIC8vIEdyaWQgbGluZXNcbiAgICBpZiAoY29uZmlnLnNob3dHcmlkTGluZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB3ID0gY29uZmlnLmdyaWRMaW5lV2lkdGggfHwgJzFweCc7XG4gICAgICBjb25zdCBjID0gY29uZmlnLmdyaWRMaW5lQ29sb3IgfHwgJyNlMGUwZTAnO1xuICAgICAgY29uc3QgcyA9IGNvbmZpZy5ncmlkTGluZVN0eWxlIHx8ICdzb2xpZCc7XG4gICAgICByZXN1bHRbJ2JvcmRlciddID0gYCR7d30gJHtzfSAke2N9YDtcbiAgICB9XG5cbiAgICAvLyBIZWFkZXIvYm9keSBkZWZhdWx0c1xuICAgIGlmIChpc0hlYWRlcikge1xuICAgICAgaWYgKGNvbmZpZy5oZWFkZXJCYWNrZ3JvdW5kKSByZXN1bHRbJ2JhY2tncm91bmQtY29sb3InXSA9IGNvbmZpZy5oZWFkZXJCYWNrZ3JvdW5kO1xuICAgICAgaWYgKGNvbmZpZy5oZWFkZXJUZXh0Q29sb3IpIHJlc3VsdFsnY29sb3InXSA9IGNvbmZpZy5oZWFkZXJUZXh0Q29sb3I7XG4gICAgICBpZiAoY29uZmlnLmhlYWRlckZvbnRXZWlnaHQpIHJlc3VsdFsnZm9udC13ZWlnaHQnXSA9IGNvbmZpZy5oZWFkZXJGb250V2VpZ2h0O1xuICAgICAgaWYgKGNvbmZpZy5oZWFkZXJGb250U2l6ZSkgcmVzdWx0Wydmb250LXNpemUnXSA9IGNvbmZpZy5oZWFkZXJGb250U2l6ZTtcbiAgICAgIGlmIChjb25maWcuaGVhZGVyVGV4dEFsaWduKSByZXN1bHRbJ3RleHQtYWxpZ24nXSA9IGNvbmZpZy5oZWFkZXJUZXh0QWxpZ247XG4gICAgICBpZiAoY29uZmlnLmhlYWRlclBhZGRpbmcpIHJlc3VsdFsncGFkZGluZyddID0gY29uZmlnLmhlYWRlclBhZGRpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb25maWcuY2VsbFBhZGRpbmcpIHJlc3VsdFsncGFkZGluZyddID0gY29uZmlnLmNlbGxQYWRkaW5nO1xuICAgICAgaWYgKGNvbmZpZy5jZWxsVGV4dEFsaWduKSByZXN1bHRbJ3RleHQtYWxpZ24nXSA9IGNvbmZpZy5jZWxsVGV4dEFsaWduO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2VsbFZlcnRpY2FsQWxpZ24pIHJlc3VsdFsndmVydGljYWwtYWxpZ24nXSA9IGNvbmZpZy5jZWxsVmVydGljYWxBbGlnbjtcblxuICAgIC8vIFBlci1jZWxsIHN0eWxlIG92ZXJyaWRlc1xuICAgIGlmIChjZWxsLnN0eWxlKSB7XG4gICAgICBpZiAoY2VsbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHJlc3VsdFsnYmFja2dyb3VuZC1jb2xvciddID0gY2VsbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBpZiAoY2VsbC5zdHlsZS5jb2xvcikgcmVzdWx0Wydjb2xvciddID0gY2VsbC5zdHlsZS5jb2xvcjtcbiAgICAgIGlmIChjZWxsLnN0eWxlLmZvbnRXZWlnaHQpIHJlc3VsdFsnZm9udC13ZWlnaHQnXSA9IGNlbGwuc3R5bGUuZm9udFdlaWdodDtcbiAgICAgIGlmIChjZWxsLnN0eWxlLmZvbnRTaXplKSByZXN1bHRbJ2ZvbnQtc2l6ZSddID0gY2VsbC5zdHlsZS5mb250U2l6ZTtcbiAgICAgIGlmIChjZWxsLnN0eWxlLnRleHRBbGlnbikgcmVzdWx0Wyd0ZXh0LWFsaWduJ10gPSBjZWxsLnN0eWxlLnRleHRBbGlnbjtcbiAgICAgIGlmIChjZWxsLnN0eWxlLnBhZGRpbmcpIHJlc3VsdFsncGFkZGluZyddID0gY2VsbC5zdHlsZS5wYWRkaW5nO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|