@ruc-lib/org-chart 3.2.0 → 4.0.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.
@@ -1,26 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { ButtonModule } from 'primeng/button';
4
- import { OrganizationChartModule } from 'primeng/organizationchart';
5
- import { MatInputModule } from '@angular/material/input';
6
- import { FormsModule } from '@angular/forms';
7
- import { MatMenuModule } from '@angular/material/menu';
8
- import { MatButtonModule } from '@angular/material/button';
9
- import { MatIconModule } from '@angular/material/icon';
10
- import { OrgChartComponent } from './org-chart/org-chart.component';
11
- import { BrowserModule } from '@angular/platform-browser';
12
- import * as i0 from "@angular/core";
13
- export class RuclibOrgChartModule {
14
- }
15
- RuclibOrgChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
- RuclibOrgChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, declarations: [OrgChartComponent], imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule], exports: [OrgChartComponent] });
17
- RuclibOrgChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule] });
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, decorators: [{
19
- type: NgModule,
20
- args: [{
21
- imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule],
22
- declarations: [OrgChartComponent],
23
- exports: [OrgChartComponent]
24
- }]
25
- }] });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW9yZy1jaGFydC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vcmctY2hhcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPMUQsTUFBTSxPQUFPLG9CQUFvQjs7a0hBQXBCLG9CQUFvQjttSEFBcEIsb0JBQW9CLGlCQUhoQixpQkFBaUIsYUFEdEIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWEsYUFFOUksaUJBQWlCO21IQUVoQixvQkFBb0IsWUFKckIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWE7NEZBSTdJLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDO29CQUN6SixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDakMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7aUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb25DaGFydE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvb3JnYW5pemF0aW9uY2hhcnQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBPcmdDaGFydENvbXBvbmVudCB9IGZyb20gJy4vb3JnLWNoYXJ0L29yZy1jaGFydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgQnJvd3Nlck1vZHVsZSwgRm9ybXNNb2R1bGUsIE9yZ2FuaXphdGlvbkNoYXJ0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcclxuICBkZWNsYXJhdGlvbnM6IFtPcmdDaGFydENvbXBvbmVudF0sXHJcbiAgZXhwb3J0czogW09yZ0NoYXJ0Q29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUnVjbGliT3JnQ2hhcnRNb2R1bGUge31cclxuXHJcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi1vcmctY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVjLWxpYi1vcmctY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -1,182 +0,0 @@
1
- import { jsPDF } from 'jspdf';
2
- import html2canvas from 'html2canvas';
3
- export const downloadChart = (chartContainer, format) => {
4
- if (!chartContainer) {
5
- console.error('Chart container not found!');
6
- return;
7
- }
8
- // Capture the chart container as an image (either PNG or JPEG)
9
- if (format === 'pdf') {
10
- createPDF(chartContainer);
11
- }
12
- else {
13
- captureElementAsImage(chartContainer, format)
14
- .then((imgData) => {
15
- downloadImage(imgData, format); // Download as PNG or JPEG
16
- })
17
- .catch(handleCanvasError);
18
- }
19
- };
20
- // Capture the element as an image and return a promise
21
- export const captureElementAsImage = (element, format) => {
22
- return new Promise((resolve, reject) => {
23
- html2canvas(element, {
24
- useCORS: true,
25
- scrollX: 0,
26
- scrollY: -window.scrollY,
27
- logging: false,
28
- backgroundColor: null,
29
- })
30
- .then((canvas) => {
31
- const imgData = canvas.toDataURL(`image/${format}`);
32
- resolve(imgData);
33
- })
34
- .catch((error) => reject(error));
35
- });
36
- };
37
- // Downloads the org chart as a PDF document.
38
- export const createPDF = (element) => {
39
- html2canvas(element, {
40
- useCORS: true,
41
- scale: 4,
42
- scrollX: 0,
43
- scrollY: -window.scrollY,
44
- logging: false,
45
- backgroundColor: null,
46
- })
47
- .then((canvas) => {
48
- const imgData = canvas.toDataURL('image/png'); // Capture as PNG (or you can use JPEG)
49
- const pdf = new jsPDF('p', 'mm', 'a4'); // Standard A4 page size
50
- // Get the dimensions of the PDF page
51
- const pdfWidth = pdf.internal.pageSize.width;
52
- const pdfHeight = pdf.internal.pageSize.height;
53
- const canvasWidth = canvas.width;
54
- const canvasHeight = canvas.height;
55
- const aspectRatio = canvasWidth / canvasHeight;
56
- let imgWidth = pdfWidth;
57
- let imgHeight = pdfWidth / aspectRatio;
58
- // If the image height exceeds the PDF page height, adjust it
59
- if (imgHeight > pdfHeight) {
60
- imgHeight = pdfHeight;
61
- imgWidth = pdfHeight * aspectRatio;
62
- }
63
- // Add the image to the PDF
64
- pdf.addImage(imgData, 'PNG', 0, 20, imgWidth, imgHeight); // Fit image on PDF page
65
- pdf.save('organization-chart.pdf'); // Download the PDF
66
- })
67
- .catch(handleCanvasError);
68
- };
69
- // Download the captured image in the required format (PNG/JPEG)
70
- export const downloadImage = (imgData, format) => {
71
- const link = document.createElement('a');
72
- link.href = imgData;
73
- link.download = `organization-chart.${format}`;
74
- link.click();
75
- };
76
- // Error handler for any issues during canvas generation or file creation
77
- export const handleCanvasError = (error) => {
78
- console.error('Error generating file:', error);
79
- };
80
- export const checkPropsType = (props) => {
81
- if (props.isDisplayHambergerMenu !== undefined && typeof props.isDisplayHambergerMenu !== 'boolean') {
82
- console.error('Error: isDisplayHambergerMenu should be a boolean.');
83
- }
84
- if (props.isDisplaySearchBar !== undefined && typeof props.isDisplaySearchBar !== 'boolean') {
85
- console.error('Error: isDisplaySearchBar should be a boolean.');
86
- }
87
- if (!['portrait', 'triangle', 'landscape'].includes(props.nodeTemplate)) {
88
- console.error('Error: nodeTemplate should be "portrait", "triangle", or "landscape".');
89
- }
90
- if (!Array.isArray(props.hambergerMenuList)) {
91
- console.error('Error: hambergerMenuList should be an array.');
92
- }
93
- else {
94
- props.hambergerMenuList.forEach(item => {
95
- if (typeof item.label !== 'string') {
96
- console.error('Error: hambergerMenuList label should be a string.');
97
- }
98
- if (typeof item.id !== 'number') {
99
- console.error('Error: hambergerMenuList id should be a number.');
100
- }
101
- });
102
- }
103
- // Check if greyNodeStyle is of type CustomNodeStyle
104
- const greyNodeStyle = props.greyNodeStyle;
105
- if (greyNodeStyle) {
106
- if (greyNodeStyle.backgroundColor && typeof greyNodeStyle.backgroundColor !== 'string') {
107
- console.error('Error: greyNodeStyle.backgroundColor should be a string.');
108
- }
109
- if (greyNodeStyle.color && typeof greyNodeStyle.color !== 'string') {
110
- console.error('Error: greyNodeStyle.color should be a string.');
111
- }
112
- if (greyNodeStyle.padding && typeof greyNodeStyle.padding !== 'string') {
113
- console.error('Error: greyNodeStyle.padding should be a string.');
114
- }
115
- if (greyNodeStyle.borderRadius && typeof greyNodeStyle.borderRadius !== 'string') {
116
- console.error('Error: greyNodeStyle.borderRadius should be a string.');
117
- }
118
- }
119
- // Check if orgData is an array of OrgDataItem objects
120
- if (!Array.isArray(props.orgData)) {
121
- console.error('Error: orgData should be an array.');
122
- }
123
- else {
124
- props.orgData.forEach(item => checkOrgDataItem(item));
125
- }
126
- };
127
- export const checkOrgDataItem = (item) => {
128
- if (item.label !== undefined && typeof item.label !== 'string') {
129
- console.error('Error: OrgDataItem label should be a string.');
130
- }
131
- if (item.expanded !== undefined && typeof item.expanded !== 'boolean') {
132
- console.error('Error: OrgDataItem expanded should be a boolean.');
133
- }
134
- if (item.description !== undefined && typeof item.description !== 'string') {
135
- console.error('Error: OrgDataItem description should be a string.');
136
- }
137
- if (item.customNodeStyle !== undefined) {
138
- const customNodeStyle = item.customNodeStyle;
139
- if (customNodeStyle.backgroundColor && typeof customNodeStyle.backgroundColor !== 'string') {
140
- console.error('Error: customNodeStyle.backgroundColor should be a string.');
141
- }
142
- if (customNodeStyle.color && typeof customNodeStyle.color !== 'string') {
143
- console.error('Error: customNodeStyle.color should be a string.');
144
- }
145
- if (customNodeStyle.padding && typeof customNodeStyle.padding !== 'string') {
146
- console.error('Error: customNodeStyle.padding should be a string.');
147
- }
148
- if (customNodeStyle.borderRadius && typeof customNodeStyle.borderRadius !== 'string') {
149
- console.error('Error: customNodeStyle.borderRadius should be a string.');
150
- }
151
- }
152
- if (item.data) {
153
- if (item.data.image !== undefined && typeof item.data.image !== 'string') {
154
- console.error('Error: OrgDataItem data.image should be a string.');
155
- }
156
- if (item.data.name !== undefined && typeof item.data.name !== 'string') {
157
- console.error('Error: OrgDataItem data.name should be a string.');
158
- }
159
- if (typeof item.data.title !== 'string') {
160
- console.error('Error: OrgDataItem data.title should be a string.');
161
- }
162
- }
163
- if (item.children && Array.isArray(item.children)) {
164
- item.children.forEach(child => checkOrgDataItem(child)); // Recursive call for children
165
- }
166
- if (item.originalStyle) {
167
- const originalStyle = item.originalStyle;
168
- if (originalStyle.backgroundColor && typeof originalStyle.backgroundColor !== 'string') {
169
- console.error('Error: originalStyle.backgroundColor should be a string.');
170
- }
171
- if (originalStyle.color && typeof originalStyle.color !== 'string') {
172
- console.error('Error: originalStyle.color should be a string.');
173
- }
174
- if (originalStyle.padding && typeof originalStyle.padding !== 'string') {
175
- console.error('Error: originalStyle.padding should be a string.');
176
- }
177
- if (originalStyle.borderRadius && typeof originalStyle.borderRadius !== 'string') {
178
- console.error('Error: originalStyle.borderRadius should be a string.');
179
- }
180
- }
181
- };
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtZG93bmxvYWQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jaGFydC1kb3dubG9hZC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQTJCLEVBQUUsTUFBOEIsRUFBUSxFQUFFO0lBQ2pHLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLE9BQU87S0FDUjtJQUVELCtEQUErRDtJQUMvRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDcEIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzNCO1NBQU07UUFDTCxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDLENBQUE7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLE1BQXNCLEVBQW1CLEVBQUU7SUFDckcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsS0FBSztZQUNk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YUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDaEYsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQ3hFO0tBQ0Y7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc1BERiB9IGZyb20gJ2pzcGRmJztcclxuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcclxuaW1wb3J0IHsgT3JnRGF0YSwgT3JnRGF0YUl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL29yZy1jaGFydCc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkQ2hhcnQgPSAoY2hhcnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnIHwgJ3BkZicpOiB2b2lkID0+IHtcclxuICBpZiAoIWNoYXJ0Q29udGFpbmVyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdDaGFydCBjb250YWluZXIgbm90IGZvdW5kIScpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FwdHVyZSB0aGUgY2hhcnQgY29udGFpbmVyIGFzIGFuIGltYWdlIChlaXRoZXIgUE5HIG9yIEpQRUcpXHJcbiAgaWYgKGZvcm1hdCA9PT0gJ3BkZicpIHtcclxuICAgIGNyZWF0ZVBERihjaGFydENvbnRhaW5lcik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNhcHR1cmVFbGVtZW50QXNJbWFnZShjaGFydENvbnRhaW5lciwgZm9ybWF0KVxyXG4gICAgICAudGhlbigoaW1nRGF0YSkgPT4ge1xyXG4gICAgICAgIGRvd25sb2FkSW1hZ2UoaW1nRGF0YSwgZm9ybWF0KTsgLy8gRG93bmxvYWQgYXMgUE5HIG9yIEpQRUdcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGhhbmRsZUNhbnZhc0Vycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENhcHR1cmUgdGhlIGVsZW1lbnQgYXMgYW4gaW1hZ2UgYW5kIHJldHVybiBhIHByb21pc2VcclxuZXhwb3J0IGNvbnN0IGNhcHR1cmVFbGVtZW50QXNJbWFnZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZm9ybWF0OiAncG5nJyB8ICdqcGVnJyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGh0bWwyY2FudmFzKGVsZW1lbnQsIHtcclxuICAgICAgdXNlQ09SUzogdHJ1ZSxcclxuICAgICAgc2Nyb2xsWDogMCxcclxuICAgICAgc2Nyb2xsWTogLXdpbmRvdy5zY3JvbGxZLFxyXG4gICAgICBsb2dnaW5nOiBmYWxzZSxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGNhbnZhcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke2Zvcm1hdH1gKTtcclxuICAgICAgICByZXNvbHZlKGltZ0RhdGEpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gRG93bmxvYWRzIHRoZSBvcmcgY2hhcnQgYXMgYSBQREYgZG9jdW1lbnQuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVQREYgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcclxuICBodG1sMmNhbnZhcyhlbGVtZW50LCB7XHJcbiAgICB1c2VDT1JTOiB0cnVlLFxyXG4gICAgc2NhbGU6IDQsIFxyXG4gICAgc2Nyb2xsWDogMCxcclxuICAgIHNjcm9sbFk6IC13aW5kb3cuc2Nyb2xsWSxcclxuICAgIGxvZ2dpbmc6IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gIH0pXHJcbiAgICAudGhlbigoY2FudmFzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsgLy8gQ2FwdHVyZSBhcyBQTkcgKG9yIHlvdSBjYW4gdXNlIEpQRUcpXHJcbiAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpOyAvLyBTdGFuZGFyZCBBNCBwYWdlIHNpemVcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUERGIHBhZ2VcclxuICAgICAgY29uc3QgcGRmV2lkdGggPSBwZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICAgIGNvbnN0IHBkZkhlaWdodCA9IHBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY2FudmFzV2lkdGggLyBjYW52YXNIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgaW1nV2lkdGggPSBwZGZXaWR0aDtcclxuICAgICAgbGV0IGltZ0hlaWdodCA9IHBkZldpZHRoIC8gYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAvLyBJZiB0aGUgaW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdGhlIFBERiBwYWdlIGhlaWdodCwgYWRqdXN0IGl0XHJcbiAgICAgIGlmIChpbWdIZWlnaHQgPiBwZGZIZWlnaHQpIHtcclxuICAgICAgICBpbWdIZWlnaHQgPSBwZGZIZWlnaHQ7XHJcbiAgICAgICAgaW1nV2lkdGggPSBwZGZIZWlnaHQgKiBhc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIHRoZSBpbWFnZSB0byB0aGUgUERGXHJcbiAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMCwgMjAsIGltZ1dpZHRoLCBpbWdIZWlnaHQpOyAvLyBGaXQgaW1hZ2Ugb24gUERGIHBhZ2VcclxuICAgICAgcGRmLnNhdmUoJ29yZ2FuaXphdGlvbi1jaGFydC5wZGYnKTsgLy8gRG93bmxvYWQgdGhlIFBERlxyXG4gICAgfSlcclxuICAgIC5jYXRjaChoYW5kbGVDYW52YXNFcnJvcik7XHJcbn1cclxuXHJcbi8vIERvd25sb2FkIHRoZSBjYXB0dXJlZCBpbWFnZSBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0IChQTkcvSlBFRylcclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkSW1hZ2UgPSAoaW1nRGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICBsaW5rLmhyZWYgPSBpbWdEYXRhO1xyXG4gIGxpbmsuZG93bmxvYWQgPSBgb3JnYW5pemF0aW9uLWNoYXJ0LiR7Zm9ybWF0fWA7XHJcbiAgbGluay5jbGljaygpO1xyXG59XHJcblxyXG4vLyBFcnJvciBoYW5kbGVyIGZvciBhbnkgaXNzdWVzIGR1cmluZyBjYW52YXMgZ2VuZXJhdGlvbiBvciBmaWxlIGNyZWF0aW9uXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDYW52YXNFcnJvciA9IChlcnJvcjogYW55KTogdm9pZCA9PiB7XHJcbiAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBmaWxlOicsIGVycm9yKTtcclxufVxyXG5cclxuICBcclxuZXhwb3J0IGNvbnN0IGNoZWNrUHJvcHNUeXBlID0gKHByb3BzOiBPcmdEYXRhKTogdm9pZCA9PiB7XHJcbiAgICBpZiAocHJvcHMuaXNEaXNwbGF5SGFtYmVyZ2VyTWVudSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwcm9wcy5pc0Rpc3BsYXlIYW1iZXJnZXJNZW51ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheUhhbWJlcmdlck1lbnUgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgIH1cclxuICBcclxuICAgIGlmIChwcm9wcy5pc0Rpc3BsYXlTZWFyY2hCYXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcHMuaXNEaXNwbGF5U2VhcmNoQmFyICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheVNlYXJjaEJhciBzaG91bGQgYmUgYSBib29sZWFuLicpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgaWYgKCFbJ3BvcnRyYWl0JywgJ3RyaWFuZ2xlJywgJ2xhbmRzY2FwZSddLmluY2x1ZGVzKHByb3BzLm5vZGVUZW1wbGF0ZSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG5vZGVUZW1wbGF0ZSBzaG91bGQgYmUgXCJwb3J0cmFpdFwiLCBcInRyaWFuZ2xlXCIsIG9yIFwibGFuZHNjYXBlXCIuJyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcHMuaGFtYmVyZ2VyTWVudUxpc3QpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5oYW1iZXJnZXJNZW51TGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5sYWJlbCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5pZCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBpZCBzaG91bGQgYmUgYSBudW1iZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENoZWNrIGlmIGdyZXlOb2RlU3R5bGUgaXMgb2YgdHlwZSBDdXN0b21Ob2RlU3R5bGVcclxuICAgIGNvbnN0IGdyZXlOb2RlU3R5bGUgPSBwcm9wcy5ncmV5Tm9kZVN0eWxlO1xyXG4gICAgaWYgKGdyZXlOb2RlU3R5bGUpIHtcclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmV5Tm9kZVN0eWxlLmNvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBncmV5Tm9kZVN0eWxlLmNvbG9yIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JleU5vZGVTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGdyZXlOb2RlU3R5bGUucGFkZGluZyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBDaGVjayBpZiBvcmdEYXRhIGlzIGFuIGFycmF5IG9mIE9yZ0RhdGFJdGVtIG9iamVjdHNcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wcy5vcmdEYXRhKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JnRGF0YSBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5vcmdEYXRhLmZvckVhY2goaXRlbSA9PiBjaGVja09yZ0RhdGFJdGVtKGl0ZW0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBleHBvcnQgY29uc3QgY2hlY2tPcmdEYXRhSXRlbSA9IChpdGVtOiBPcmdEYXRhSXRlbSk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5sYWJlbCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmxhYmVsICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBPcmdEYXRhSXRlbSBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmV4cGFuZGVkICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZXhwYW5kZWQgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmN1c3RvbU5vZGVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTm9kZVN0eWxlID0gaXRlbS5jdXN0b21Ob2RlU3R5bGU7XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21Ob2RlU3R5bGUuY29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5jb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBjdXN0b21Ob2RlU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VzdG9tTm9kZVN0eWxlLnBhZGRpbmcgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uZGF0YSkge1xyXG4gICAgICAgIGlmIChpdGVtLmRhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLmltYWdlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRhdGEuaW1hZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5kYXRhLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLm5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS5uYW1lIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmRhdGEudGl0bGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS50aXRsZSBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGVja09yZ0RhdGFJdGVtKGNoaWxkKSk7IC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBjaGlsZHJlblxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0ub3JpZ2luYWxTdHlsZSkge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSBpdGVtLm9yaWdpbmFsU3R5bGU7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmlnaW5hbFN0eWxlLmNvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG9yaWdpbmFsU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JpZ2luYWxTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JpZ2luYWxTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==