axidio-styleguide-library1-v2 0.4.23 → 0.4.25
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.
|
@@ -14,1029 +14,910 @@ export class GroupChartComponent extends ComponentUniqueId {
|
|
|
14
14
|
super();
|
|
15
15
|
this.clickEvent = new EventEmitter();
|
|
16
16
|
this.headerMenuclickEvent = new EventEmitter();
|
|
17
|
-
this.chartConfiguration = {};
|
|
18
17
|
this.isHeaderVisible = true;
|
|
19
|
-
this.
|
|
20
|
-
this.uniqueId = this.getUniqueId();
|
|
18
|
+
this.legendVisible = true;
|
|
21
19
|
this.isTransparentBackground = false;
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
this.CONSTANTS = {
|
|
25
|
-
RIGHT_SVG_WIDTH: 60,
|
|
26
|
-
LEFT_RIGHT_SPACES: 50,
|
|
27
|
-
SHORT_TICK_LENGTH: 4,
|
|
28
|
-
LONG_TICK_LENGTH: 16,
|
|
29
|
-
SHORT_TICK_LENGTH_BG: 5,
|
|
30
|
-
LONG_TICK_LENGTH_BG: 30,
|
|
31
|
-
DESKTOP_BAR_WIDTH: 40, // Desktop bar width
|
|
32
|
-
MOBILE_BAR_WIDTH: 25, // Mobile/Tablet bar width (reduced)
|
|
33
|
-
BAR_GAP: 30, // Gap between bars (increased for better separation)
|
|
34
|
-
ZOOM_THRESHOLD: 30,
|
|
35
|
-
ZOOM_IN_THRESHOLD: 8,
|
|
36
|
-
};
|
|
20
|
+
this.chartConfiguration = {};
|
|
21
|
+
this.objectKeys = Object.keys;
|
|
37
22
|
this.defaultConfiguration = {
|
|
38
|
-
margin: {
|
|
23
|
+
"margin": {
|
|
24
|
+
"top": 30,
|
|
25
|
+
"left": 110,
|
|
26
|
+
"right": 40,
|
|
27
|
+
"bottom": 50
|
|
28
|
+
},
|
|
29
|
+
labelFormatter: ChartHelper.defaultFormatter,
|
|
39
30
|
svgHeight: 70,
|
|
40
|
-
legendHeight: '10%',
|
|
41
31
|
numberOfYTicks: 5,
|
|
42
|
-
|
|
43
|
-
xAxisLabelFomatter: ChartHelper.defaultFormatter,
|
|
44
|
-
yAxisLabelFomatter: ChartHelper.defaultFormatter,
|
|
32
|
+
legendJustified: true,
|
|
45
33
|
yLineAxisLabelFomatter: ChartHelper.defaultFormatter,
|
|
34
|
+
yAxisLabelFomatter: ChartHelper.defaultFormatter,
|
|
46
35
|
lineGraphColor: '#F6D283',
|
|
47
36
|
showLineChartAxis: true,
|
|
48
|
-
|
|
49
|
-
forComparison: true,
|
|
37
|
+
showValues: true,
|
|
50
38
|
headerMenuOptions: HeaderConfigHelper.headerConfig.headerMenuOptions,
|
|
51
|
-
yAxisGrid:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
isYaxisDashed: undefined,
|
|
63
|
-
isXaxisColor: undefined,
|
|
64
|
-
textFormatter: undefined,
|
|
65
|
-
showTotalOnTop: undefined,
|
|
66
|
-
backendFormatterHasPriority: undefined,
|
|
67
|
-
showAngledLabels: undefined,
|
|
68
|
-
isNoAlternateXaxisText: undefined,
|
|
69
|
-
isXgridBetweenLabels: undefined,
|
|
70
|
-
showXaxisTop: undefined,
|
|
71
|
-
xAxisGrid: undefined,
|
|
72
|
-
xLabelsOnSameLine: undefined,
|
|
73
|
-
hideXaxisTick: undefined,
|
|
74
|
-
isDrilldownChart: undefined,
|
|
75
|
-
isTargetLine: undefined,
|
|
76
|
-
displayTitleOnTop: undefined,
|
|
77
|
-
isToggleVisible: undefined,
|
|
78
|
-
isTitleHidden: undefined,
|
|
39
|
+
yAxisGrid: true,
|
|
40
|
+
legendVisible: true,
|
|
41
|
+
isYaxisLabelHidden: false,
|
|
42
|
+
backgroundColor: '#FFFFFF',
|
|
43
|
+
hideLegendOnTop: true,
|
|
44
|
+
isXaxisColor: '#999999',
|
|
45
|
+
labelOverlapMinorFix: true,
|
|
46
|
+
noHoverEffect: true,
|
|
47
|
+
noHoverDisplayData: true,
|
|
48
|
+
showXaxisTop: true,
|
|
49
|
+
howmanyBarDetailsToDisplay: 0,
|
|
79
50
|
};
|
|
51
|
+
this.uniqueId = this.getUniqueId();
|
|
52
|
+
this.isZoomedOut = false;
|
|
53
|
+
this.isDD1Open = false;
|
|
54
|
+
this.isDD2Open = false;
|
|
55
|
+
this.keepOrder = (a, b) => a;
|
|
80
56
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.
|
|
57
|
+
ngOnInit() { }
|
|
58
|
+
get isAlertEnabled() {
|
|
59
|
+
return this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert');
|
|
84
60
|
}
|
|
85
61
|
onResized(event) {
|
|
86
62
|
setTimeout(() => {
|
|
87
|
-
this.
|
|
88
|
-
this.
|
|
63
|
+
d3.select('#' + this.uniqueId).remove();
|
|
64
|
+
this.initializegroupChart();
|
|
89
65
|
}, 10);
|
|
90
66
|
}
|
|
91
|
-
isZoomOutSelected(isZoomOut) {
|
|
67
|
+
isZoomOutSelected(isZoomOut, event) {
|
|
92
68
|
this.isZoomedOut = isZoomOut;
|
|
93
|
-
this.
|
|
69
|
+
this.onResized(event);
|
|
94
70
|
}
|
|
95
|
-
|
|
96
|
-
|
|
71
|
+
handleZoominZoomoutClick({ isZoomOut, event }) {
|
|
72
|
+
this.isZoomOutSelected(isZoomOut, event);
|
|
73
|
+
}
|
|
74
|
+
isLegendVisible() {
|
|
75
|
+
return !!(this.chartData?.metaData?.colors &&
|
|
76
|
+
Object.keys(this.chartData.metaData.colors).length > 1);
|
|
77
|
+
}
|
|
78
|
+
initializegroupChart() {
|
|
79
|
+
this.mergeConfigurations();
|
|
80
|
+
const chartContext = this.prepareChartData();
|
|
81
|
+
const dimensions = this.calculateDimensions(chartContext);
|
|
82
|
+
const scales = this.createScales(chartContext, dimensions);
|
|
83
|
+
const svgElements = this.createSVGStructure(dimensions);
|
|
84
|
+
this.renderAxes(svgElements, scales, chartContext, dimensions);
|
|
85
|
+
this.renderBars(svgElements.svg, chartContext, scales, dimensions);
|
|
86
|
+
this.renderLabels(svgElements, scales, chartContext, dimensions);
|
|
87
|
+
this.renderTargetLine(svgElements, scales, chartContext, dimensions);
|
|
88
|
+
this.renderLineGraph(svgElements.svg, chartContext, scales);
|
|
97
89
|
}
|
|
98
90
|
mergeConfigurations() {
|
|
99
91
|
for (const key in this.defaultConfiguration) {
|
|
100
92
|
this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
|
|
101
93
|
}
|
|
94
|
+
if (this.chartConfiguration.isHeaderVisible !== undefined) {
|
|
95
|
+
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
96
|
+
}
|
|
97
|
+
if (this.chartConfiguration.legendVisible !== undefined) {
|
|
98
|
+
this.legendVisible = this.chartConfiguration.legendVisible;
|
|
99
|
+
}
|
|
100
|
+
if (this.chartConfiguration.isTransparentBackground !== undefined) {
|
|
101
|
+
this.isTransparentBackground = this.chartConfiguration.isTransparentBackground;
|
|
102
|
+
}
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
metaData.barWithoutClick = metaData.barWithoutClick.map(el => el.toLowerCase());
|
|
104
|
+
prepareChartData() {
|
|
105
|
+
const data = this.chartData.data;
|
|
106
|
+
const metaData = this.chartData.metaData;
|
|
107
|
+
const lineData = this.chartData.lineData;
|
|
108
|
+
if (!metaData.colorAboveTarget) {
|
|
109
|
+
metaData.colorAboveTarget = metaData.colors;
|
|
110
110
|
}
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
return {
|
|
112
|
+
data,
|
|
113
|
+
metaData,
|
|
114
|
+
lineData,
|
|
115
|
+
keyList: metaData.keyList,
|
|
116
|
+
colorMap: metaData.colors,
|
|
117
|
+
isRia: this.customChartConfiguration?.isRia || false,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
calculateDimensions(chartContext) {
|
|
121
|
+
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
122
|
+
const verticalstackedcontainer = d3.select(this.groupcontainerElt.nativeElement);
|
|
123
|
+
const margin = this.chartConfiguration.margin;
|
|
124
|
+
let width = this.calculateWidth(chartContainer, margin);
|
|
125
|
+
let height = this.calculateHeight(verticalstackedcontainer, margin);
|
|
126
|
+
return { width, height, margin, chartContainer, verticalstackedcontainer };
|
|
127
|
+
}
|
|
128
|
+
calculateWidth(chartContainer, margin) {
|
|
129
|
+
const baseWidth = parseInt(chartContainer.style('width')) - margin.left - margin.right;
|
|
130
|
+
const dataLength = this.chartData.data.length;
|
|
131
|
+
let width = baseWidth;
|
|
132
|
+
if (dataLength > 30 && this.isZoomedOut) {
|
|
133
|
+
const multiplier = this.chartData.dropdownData1 ? 60 : 40;
|
|
134
|
+
width = Math.max(width, dataLength * multiplier);
|
|
135
|
+
}
|
|
136
|
+
if (this.chartData.dropdownData2 && width < dataLength * 120 && this.isZoomedOut) {
|
|
137
|
+
width = dataLength * 120;
|
|
138
|
+
}
|
|
139
|
+
if (dataLength > 8 && !this.isZoomedOut) {
|
|
140
|
+
if (this.chartData.dropdownData2 && width < dataLength * 250) {
|
|
141
|
+
width = dataLength * 250;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
width = dataLength * 160;
|
|
145
|
+
}
|
|
113
146
|
}
|
|
114
|
-
return
|
|
147
|
+
return width;
|
|
115
148
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
let height = containerHeight * (this.chartConfiguration.svgHeight / 100) - margin.top - margin.bottom;
|
|
124
|
-
if (dataLength > this.CONSTANTS.ZOOM_THRESHOLD && this.isZoomedOut) {
|
|
125
|
-
const minWidth = dataLength * 25;
|
|
126
|
-
width = Math.max(width, minWidth);
|
|
149
|
+
calculateHeight(verticalstackedcontainer, margin) {
|
|
150
|
+
let height = parseInt(verticalstackedcontainer.style('height')) *
|
|
151
|
+
(this.chartConfiguration.svgHeight / 100) -
|
|
152
|
+
margin.top -
|
|
153
|
+
margin.bottom;
|
|
154
|
+
if (this.chartConfiguration.isFullScreen && this.chartConfiguration.svgHeight !== 70) {
|
|
155
|
+
height = this.chartConfiguration.svgHeight;
|
|
127
156
|
}
|
|
128
|
-
if (
|
|
129
|
-
|
|
157
|
+
else if (this.chartConfiguration.isFullScreen) {
|
|
158
|
+
height = parseInt(verticalstackedcontainer.style('height'));
|
|
130
159
|
}
|
|
131
|
-
if (this.chartConfiguration.
|
|
132
|
-
height =
|
|
133
|
-
? this.chartConfiguration.svgHeight
|
|
134
|
-
: containerHeight;
|
|
160
|
+
if (this.chartConfiguration.isDrilldownChart && !this.isHeaderVisible) {
|
|
161
|
+
height = parseInt(verticalstackedcontainer.style('height')) - margin.top - margin.bottom - 130;
|
|
135
162
|
}
|
|
136
|
-
if (this.chartConfiguration.
|
|
137
|
-
height =
|
|
163
|
+
if (this.chartConfiguration.isHeaderVisible) {
|
|
164
|
+
height = parseInt(verticalstackedcontainer.style('height')) - margin.top - margin.bottom - 100;
|
|
138
165
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
else if (dataLength <= 5) {
|
|
156
|
-
barWidth = 35;
|
|
157
|
-
barPadding = 30;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
barWidth = 25;
|
|
161
|
-
barPadding = 25;
|
|
162
|
-
}
|
|
166
|
+
return height;
|
|
167
|
+
}
|
|
168
|
+
createScales(chartContext, dimensions) {
|
|
169
|
+
const { data, metaData, lineData, keyList } = chartContext;
|
|
170
|
+
const { width, height, margin } = dimensions;
|
|
171
|
+
const leftAndRightSpaces = 50;
|
|
172
|
+
const rightSvgWidth = 60;
|
|
173
|
+
const groups = d3.map(data, (d) => d.name).keys();
|
|
174
|
+
let x;
|
|
175
|
+
if (this.chartConfiguration.isMultiChartGridLine !== undefined) {
|
|
176
|
+
x = d3
|
|
177
|
+
.scaleBand()
|
|
178
|
+
.rangeRound([width, 0])
|
|
179
|
+
.align(0.5)
|
|
180
|
+
.padding(0.5)
|
|
181
|
+
.domain(data.map((d) => d.name.toLowerCase()));
|
|
163
182
|
}
|
|
164
183
|
else {
|
|
165
|
-
|
|
166
|
-
|
|
184
|
+
x = d3
|
|
185
|
+
.scaleBand()
|
|
186
|
+
.domain(groups)
|
|
187
|
+
.range([leftAndRightSpaces, width - rightSvgWidth - leftAndRightSpaces])
|
|
188
|
+
.padding(0.3);
|
|
189
|
+
}
|
|
190
|
+
const xScaleFromOrigin = d3.scaleBand().domain(groups).range([0, width - rightSvgWidth]);
|
|
191
|
+
const xSubgroup = d3.scaleBand().domain(keyList).range([0, x.bandwidth()]);
|
|
192
|
+
const maxValue = this.calculateMaxValue(data, keyList);
|
|
193
|
+
const y = d3.scaleLinear().domain([0, maxValue]).nice().rangeRound([height, 0]);
|
|
194
|
+
let lineYscale = null;
|
|
195
|
+
if (lineData) {
|
|
196
|
+
lineYscale = this.createLineYScale(lineData, height);
|
|
167
197
|
}
|
|
168
|
-
const
|
|
169
|
-
const totalGaps = barPadding * (dataLength - 1);
|
|
170
|
-
const minRequiredWidth = totalBarsWidth + totalGaps + (this.CONSTANTS.LEFT_RIGHT_SPACES * 2);
|
|
171
|
-
const requiredSvgWidth = Math.max(availableWidth, minRequiredWidth);
|
|
198
|
+
const color = d3.scaleOrdinal().domain(keyList).range(Object.values(metaData.colors));
|
|
172
199
|
return {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
200
|
+
x,
|
|
201
|
+
xScaleFromOrigin,
|
|
202
|
+
xSubgroup,
|
|
203
|
+
y,
|
|
204
|
+
lineYscale,
|
|
205
|
+
color,
|
|
206
|
+
leftAndRightSpaces,
|
|
207
|
+
rightSvgWidth,
|
|
180
208
|
};
|
|
181
209
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
210
|
+
calculateMaxValue(data, keyList) {
|
|
211
|
+
let maxValue = d3.max(data, (d) => d3.max(keyList, (key) => +d[key])) || 0;
|
|
212
|
+
if (maxValue === 0) {
|
|
213
|
+
maxValue = this.chartData.targetLineData
|
|
214
|
+
? this.chartData.targetLineData.target + 20
|
|
215
|
+
: 100;
|
|
216
|
+
}
|
|
217
|
+
if (this.chartConfiguration.customYscale) {
|
|
218
|
+
maxValue *= this.chartConfiguration.customYscale;
|
|
219
|
+
}
|
|
220
|
+
if (this.chartData.targetLineData && maxValue < this.chartData.targetLineData.target) {
|
|
221
|
+
const target = this.chartData.targetLineData.target;
|
|
222
|
+
maxValue = maxValue < 10 && target < 10 ? target + 3 : target + 20;
|
|
223
|
+
}
|
|
224
|
+
return maxValue;
|
|
225
|
+
}
|
|
226
|
+
createLineYScale(lineData, height) {
|
|
227
|
+
let maxLineValue = d3.max(lineData, (d) => +d.value) || 0;
|
|
228
|
+
maxLineValue *= this.chartConfiguration.customYscale || 1;
|
|
229
|
+
let minLineValue = d3.min(lineData, (d) => +d.value) || 0;
|
|
230
|
+
if (maxLineValue > 0)
|
|
231
|
+
minLineValue -= 3;
|
|
232
|
+
if (minLineValue > 0)
|
|
233
|
+
minLineValue = 0;
|
|
234
|
+
return d3.scaleLinear().domain([minLineValue, maxLineValue]).range([height, minLineValue]);
|
|
235
|
+
}
|
|
236
|
+
createSVGStructure(dimensions) {
|
|
237
|
+
const { chartContainer, height, margin } = dimensions;
|
|
238
|
+
const rightSvgWidth = 60;
|
|
239
|
+
// Calculate proper left SVG width to include label
|
|
240
|
+
const leftSvgWidth = margin.left + 20;
|
|
241
|
+
const outerContainer = chartContainer
|
|
189
242
|
.append('div')
|
|
190
243
|
.attr('id', this.uniqueId)
|
|
191
|
-
.attr('class', '
|
|
192
|
-
.style('position', 'relative')
|
|
244
|
+
.attr('class', 'outer-container')
|
|
193
245
|
.style('width', '100%')
|
|
194
|
-
.style('height', `${
|
|
195
|
-
|
|
196
|
-
.
|
|
197
|
-
.
|
|
246
|
+
.style('height', `${height + margin.top + margin.bottom}px`)
|
|
247
|
+
.style('overflow', 'hidden') // FIXED: Prevent all overflow
|
|
248
|
+
.style('padding-left', `${margin.left}px`)
|
|
249
|
+
.style('padding-right', `${rightSvgWidth}px`)
|
|
250
|
+
.style('margin-left', '15px')
|
|
251
|
+
.style('position', 'relative'); // FIXED: For absolute positioning
|
|
252
|
+
// FIXED: Create proper Y-axis SVG with enough space for label
|
|
253
|
+
const svgYAxisLeft = outerContainer
|
|
254
|
+
.append('svg')
|
|
255
|
+
.attr('width', leftSvgWidth)
|
|
256
|
+
.attr('height', height + margin.top + margin.bottom)
|
|
198
257
|
.style('position', 'absolute')
|
|
199
258
|
.style('left', '0')
|
|
200
259
|
.style('top', '0')
|
|
201
|
-
.style('
|
|
202
|
-
.style('height', `${dimensions.height + margin.top + margin.bottom}px`)
|
|
203
|
-
.style('background-color', 'var(--card-bg)')
|
|
204
|
-
.style('z-index', '10');
|
|
205
|
-
const svgYAxisLeft = leftAxisContainer
|
|
206
|
-
.append('svg')
|
|
207
|
-
.attr('width', '80')
|
|
208
|
-
.attr('height', dimensions.height + margin.top + margin.bottom)
|
|
260
|
+
.style('z-index', 1)
|
|
209
261
|
.append('g')
|
|
210
|
-
.attr('transform', `translate(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
.
|
|
214
|
-
.attr('
|
|
262
|
+
.attr('transform', `translate(${margin.left + 5},${margin.top})`);
|
|
263
|
+
const svgYAxisRight = outerContainer
|
|
264
|
+
.append('svg')
|
|
265
|
+
.attr('width', rightSvgWidth)
|
|
266
|
+
.attr('height', height + margin.top + margin.bottom)
|
|
215
267
|
.style('position', 'absolute')
|
|
216
|
-
.style('right', '
|
|
268
|
+
.style('right', '12px')
|
|
217
269
|
.style('top', '0')
|
|
218
|
-
.style('
|
|
219
|
-
.style('height', `${dimensions.height + margin.top + margin.bottom}px`) // Exclude X-label space
|
|
220
|
-
.style('background-color', 'var(--card-bg)')
|
|
221
|
-
.style('z-index', '10');
|
|
222
|
-
const svgYAxisRight = rightAxisContainer
|
|
223
|
-
.append('svg')
|
|
224
|
-
.attr('width', this.CONSTANTS.RIGHT_SVG_WIDTH)
|
|
225
|
-
.attr('height', dimensions.height + margin.top + margin.bottom)
|
|
270
|
+
.style('z-index', 1)
|
|
226
271
|
.append('g')
|
|
227
272
|
.attr('transform', `translate(0,${margin.top})`);
|
|
228
|
-
|
|
229
|
-
const scrollableContainer = chartWrapper
|
|
273
|
+
const innerContainer = outerContainer
|
|
230
274
|
.append('div')
|
|
231
|
-
.attr('class', '
|
|
232
|
-
.style('
|
|
233
|
-
.style('
|
|
234
|
-
.style('right', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`)
|
|
235
|
-
.style('top', '0')
|
|
236
|
-
.style('width', 'auto')
|
|
237
|
-
.style('height', `${dimensions.height + margin.top + margin.bottom}px`)
|
|
275
|
+
.attr('class', 'inner-container')
|
|
276
|
+
.style('width', '100%')
|
|
277
|
+
.style('height', '100%')
|
|
238
278
|
.style('overflow-x', 'auto')
|
|
239
279
|
.style('overflow-y', 'hidden');
|
|
240
|
-
const innerContainer = scrollableContainer
|
|
241
|
-
.append('div')
|
|
242
|
-
.attr('class', 'inner-chart-container')
|
|
243
|
-
.style('min-width', '100%');
|
|
244
280
|
const svg = innerContainer
|
|
245
281
|
.append('svg')
|
|
246
|
-
.attr('width', dimensions.
|
|
247
|
-
.attr('height',
|
|
282
|
+
.attr('width', dimensions.width - rightSvgWidth)
|
|
283
|
+
.attr('height', height + margin.top + margin.bottom + 60)
|
|
248
284
|
.append('g')
|
|
249
285
|
.attr('transform', `translate(0,${margin.top})`);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
.
|
|
264
|
-
|
|
286
|
+
return { outerContainer, svgYAxisLeft, svgYAxisRight, svg };
|
|
287
|
+
}
|
|
288
|
+
renderAxes(svgElements, scales, chartContext, dimensions) {
|
|
289
|
+
const { svg, svgYAxisLeft, svgYAxisRight } = svgElements;
|
|
290
|
+
const { x, xScaleFromOrigin, y, lineYscale } = scales;
|
|
291
|
+
const { height } = dimensions;
|
|
292
|
+
const { metaData, lineData, keyList } = chartContext;
|
|
293
|
+
this.renderXAxis(svg, x, xScaleFromOrigin, height, chartContext, keyList);
|
|
294
|
+
this.renderYAxis(svg, svgYAxisLeft, svgYAxisRight, y, dimensions);
|
|
295
|
+
if (this.chartConfiguration.yAxisGrid) {
|
|
296
|
+
this.renderYAxisGrid(svg, y, dimensions.width);
|
|
297
|
+
}
|
|
298
|
+
if (this.chartConfiguration.isXgridBetweenLabels) {
|
|
299
|
+
this.renderXAxisGrid(svg, x, height);
|
|
300
|
+
}
|
|
301
|
+
if (lineData && this.chartConfiguration.showLineChartAxis && lineYscale) {
|
|
302
|
+
this.renderLineYAxis(svgYAxisRight, lineYscale);
|
|
303
|
+
}
|
|
265
304
|
}
|
|
266
|
-
|
|
267
|
-
const {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
.
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
? Number(this.chartData.targetLineData.target) + 20
|
|
291
|
-
: 100;
|
|
305
|
+
renderXAxis(svg, x, xScaleFromOrigin, height, chartContext, keyList) {
|
|
306
|
+
const { data, metaData } = chartContext;
|
|
307
|
+
if (this.chartConfiguration.isMultiChartGridLine === undefined) {
|
|
308
|
+
const xAxis = svg
|
|
309
|
+
.append('g')
|
|
310
|
+
.attr('class', 'x1 axis1')
|
|
311
|
+
.attr('transform', `translate(0,${height})`)
|
|
312
|
+
.call(d3.axisBottom(x).tickSize(0));
|
|
313
|
+
// FIXED: Show X-axis line
|
|
314
|
+
xAxis
|
|
315
|
+
.select('.domain')
|
|
316
|
+
.style('stroke', 'var(--chart-axis-color, #CCCCCC)')
|
|
317
|
+
.style('stroke-width', '1px')
|
|
318
|
+
.style('display', 'block');
|
|
319
|
+
xAxis.selectAll('g.tick line').remove();
|
|
320
|
+
const textClass = 'lib-xaxis-labels-texts-drilldown';
|
|
321
|
+
const textSelection = xAxis
|
|
322
|
+
.selectAll('g.tick text')
|
|
323
|
+
.attr('class', textClass)
|
|
324
|
+
.style('fill', 'var(--chart-text-color, #666666)')
|
|
325
|
+
.style('font-size', '11px');
|
|
326
|
+
if (keyList.length > 1 && !metaData.xLabel) {
|
|
327
|
+
textSelection.attr('y', 28);
|
|
328
|
+
}
|
|
292
329
|
}
|
|
293
|
-
|
|
294
|
-
|
|
330
|
+
else {
|
|
331
|
+
this.renderMultiChartXAxis(svg, x, height, data, metaData);
|
|
295
332
|
}
|
|
296
|
-
if (this.
|
|
297
|
-
|
|
298
|
-
maxValue = maxValue < 10 && target < 10 ? target + 3 : target + 20;
|
|
333
|
+
if (this.chartConfiguration.xLabelsOnSameLine) {
|
|
334
|
+
this.renderXLabelsOnSameLine(svg, data, metaData);
|
|
299
335
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
336
|
+
// Bottom x-axis
|
|
337
|
+
const xAxis2 = svg
|
|
338
|
+
.append('g')
|
|
339
|
+
.attr('class', 'x2 axis2')
|
|
340
|
+
.attr('transform', `translate(0,${height})`)
|
|
341
|
+
.style('color', '#000')
|
|
342
|
+
.call(d3.axisBottom(xScaleFromOrigin).tickSize(0));
|
|
343
|
+
xAxis2
|
|
344
|
+
.select('.domain')
|
|
345
|
+
.style('stroke', 'var(--chart-axis-color, #CCCCCC)')
|
|
346
|
+
.style('stroke-width', '1px')
|
|
347
|
+
.attr('fill', 'none');
|
|
348
|
+
svg.selectAll('g.x2.axis2 g.tick text').style('display', 'none');
|
|
349
|
+
if (this.isZoomedOut) {
|
|
350
|
+
svg.selectAll('.lib-xaxis-labels-texts-drilldown').attr('class', 'lib-display-hidden');
|
|
307
351
|
}
|
|
308
|
-
return { xScale, xScaleFromOrigin, yScale, lineYscale };
|
|
309
352
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
353
|
+
renderMultiChartXAxis(svg, x, height, data, metaData) {
|
|
354
|
+
let alternate_text = false;
|
|
355
|
+
const short_tick_length_bg = 5;
|
|
356
|
+
const long_tick_length_bg = 30;
|
|
357
|
+
svg
|
|
358
|
+
.append('g')
|
|
359
|
+
.attr('class', 'x1 axis1')
|
|
360
|
+
.attr('transform', `translate(0,${height})`)
|
|
361
|
+
.call(d3.axisBottom(x).tickSize(0))
|
|
362
|
+
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
363
|
+
svg.selectAll('g.x1.axis1 g.tick line').attr('y2', () => {
|
|
364
|
+
if (alternate_text && !this.chartConfiguration.isNoAlternateXaxisText) {
|
|
365
|
+
alternate_text = false;
|
|
366
|
+
return long_tick_length_bg - 7;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
alternate_text = true;
|
|
370
|
+
return short_tick_length_bg - 4;
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
alternate_text = false;
|
|
374
|
+
svg.selectAll('g.x1.axis1 g.tick text').attr('class', 'lib-xaxis-labels-texts-weeklycharts').attr('y', () => {
|
|
375
|
+
if (alternate_text) {
|
|
376
|
+
alternate_text = false;
|
|
377
|
+
return long_tick_length_bg;
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
alternate_text = true;
|
|
381
|
+
return short_tick_length_bg;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
renderXLabelsOnSameLine(svg, data, metaData) {
|
|
386
|
+
const short_tick_length_bg = 5;
|
|
387
|
+
const long_tick_length_bg = 30;
|
|
388
|
+
svg
|
|
389
|
+
.selectAll('g.x1.axis1 g.tick text')
|
|
390
|
+
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
391
|
+
.attr('y', short_tick_length_bg)
|
|
392
|
+
.text((d) => {
|
|
393
|
+
const isValueToBeIgnored = data.some((indiv) => indiv.name.toLowerCase() === d.trim().toLowerCase() &&
|
|
394
|
+
indiv[metaData.keyList[0]] === -1);
|
|
395
|
+
if (isValueToBeIgnored)
|
|
396
|
+
return '';
|
|
397
|
+
if (d.trim().indexOf(' ') > -1) {
|
|
398
|
+
return d.trim().substring(0, d.indexOf(' ')).toLowerCase();
|
|
399
|
+
}
|
|
400
|
+
return d.toLowerCase();
|
|
401
|
+
});
|
|
402
|
+
svg
|
|
403
|
+
.selectAll('g.x1.axis1 g.tick')
|
|
404
|
+
.append('text')
|
|
405
|
+
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
406
|
+
.attr('y', long_tick_length_bg)
|
|
407
|
+
.attr('fill', 'currentColor')
|
|
408
|
+
.text((d) => {
|
|
409
|
+
if (d.trim().indexOf(' ') > -1) {
|
|
410
|
+
return d.trim().substring(d.indexOf(' ')).toLowerCase();
|
|
411
|
+
}
|
|
412
|
+
return '';
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
renderYAxis(svg, svgYAxisLeft, svgYAxisRight, y, dimensions) {
|
|
416
|
+
// Main Y-axis in chart area (hidden)
|
|
417
|
+
svg
|
|
418
|
+
.append('g')
|
|
419
|
+
.attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
|
|
420
|
+
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
421
|
+
.attr('transform', 'translate(0,0)')
|
|
422
|
+
.call(y)
|
|
423
|
+
.style('display', 'none');
|
|
424
|
+
// FIXED: Left Y-axis with visible line
|
|
425
|
+
const yAxisLeft = d3
|
|
426
|
+
.axisLeft(y)
|
|
313
427
|
.tickSize(0)
|
|
314
|
-
.tickFormat(this.chartConfiguration.xAxisLabelFomatter);
|
|
315
|
-
const yAxis = d3
|
|
316
|
-
.axisLeft(scales.yScale)
|
|
317
428
|
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
318
|
-
.tickSize(0)
|
|
319
429
|
.tickFormat(this.chartConfiguration.yAxisLabelFomatter);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
430
|
+
const yAxisGroup = svgYAxisLeft
|
|
431
|
+
.append('g')
|
|
432
|
+
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
433
|
+
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
434
|
+
.attr('transform', 'translate(0,0)')
|
|
435
|
+
.call(yAxisLeft);
|
|
436
|
+
// FIXED: Show Y-axis vertical line
|
|
437
|
+
yAxisGroup
|
|
438
|
+
.select('.domain')
|
|
439
|
+
.style('stroke', 'var(--chart-axis-color, #CCCCCC)')
|
|
440
|
+
.style('stroke-width', '1px')
|
|
441
|
+
.style('display', 'block');
|
|
442
|
+
// FIXED: Position Y-axis values with proper spacing
|
|
443
|
+
yAxisGroup
|
|
444
|
+
.selectAll('text')
|
|
445
|
+
.style('fill', 'var(--chart-text-color, #666666)')
|
|
446
|
+
.style('font-size', '11px')
|
|
447
|
+
.style('font-weight', '400')
|
|
448
|
+
.attr('x', -6) // FIXED: Small gap from axis line
|
|
449
|
+
.attr('text-anchor', 'end')
|
|
450
|
+
.attr('dy', '0.32em');
|
|
451
|
+
// Right Y-axis (hidden)
|
|
452
|
+
svgYAxisRight
|
|
453
|
+
.append('g')
|
|
454
|
+
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
455
|
+
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
456
|
+
.attr('transform', 'translate(0,0)')
|
|
457
|
+
.call(y)
|
|
458
|
+
.style('display', 'none');
|
|
459
|
+
this.applyAxisVisibilitySettings();
|
|
460
|
+
}
|
|
461
|
+
applyAxisVisibilitySettings() {
|
|
462
|
+
if (this.chartConfiguration.isXaxisLabelHidden) {
|
|
463
|
+
d3.selectAll('g.lib-line-x-axis-text > g > text').attr('class', 'lib-display-hidden');
|
|
464
|
+
}
|
|
465
|
+
if (this.chartConfiguration.isYaxisLabelHidden) {
|
|
466
|
+
d3.selectAll('.yaxis-dashed > g > text').attr('class', 'lib-display-hidden');
|
|
467
|
+
// FIXED: Don't hide the Y-axis label element
|
|
468
|
+
d3.selectAll('.lib-ylabel-visible').style('display', 'block');
|
|
469
|
+
}
|
|
470
|
+
if (this.chartConfiguration.isYaxisHidden) {
|
|
471
|
+
d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
|
|
472
|
+
// FIXED: Keep Y-axis label visible
|
|
473
|
+
d3.selectAll('.lib-ylabel-visible').style('display', 'block');
|
|
474
|
+
}
|
|
475
|
+
if (this.chartConfiguration.isYaxisDashed) {
|
|
476
|
+
d3.selectAll('.yaxis-dashed .domain').style('stroke-dasharray', '5 5').style('color', '#999999');
|
|
327
477
|
}
|
|
328
|
-
return { xAxis, yAxis, yLineAxis };
|
|
329
478
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
.
|
|
333
|
-
.
|
|
479
|
+
renderYAxisGrid(svg, y, width) {
|
|
480
|
+
svg
|
|
481
|
+
.append('g')
|
|
482
|
+
.attr('class', 'y-axis-grid')
|
|
483
|
+
.call(d3.axisLeft(y)
|
|
484
|
+
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
485
|
+
.tickSize(-width)
|
|
486
|
+
.tickFormat(''))
|
|
487
|
+
.style('color', '#EEEEEE') // FIXED: Lighter grid
|
|
488
|
+
.style('opacity', '0.7')
|
|
489
|
+
.style('stroke-dasharray', 'none')
|
|
490
|
+
.call((g) => g.select('.domain').remove())
|
|
491
|
+
.selectAll('line')
|
|
492
|
+
.style('stroke-width', '0.5px');
|
|
493
|
+
}
|
|
494
|
+
renderXAxisGrid(svg, x, height) {
|
|
495
|
+
svg
|
|
496
|
+
.append('g')
|
|
497
|
+
.attr('class', 'grid')
|
|
498
|
+
.attr('transform', `translate(${x.bandwidth() / 2},${height})`)
|
|
499
|
+
.call(d3.axisBottom(x).tickSize(-height).tickFormat(''))
|
|
500
|
+
.style('stroke-dasharray', '5 5')
|
|
501
|
+
.style('color', 'var(--chart-grid-color, #999999)')
|
|
502
|
+
.call((g) => g.select('.domain').remove());
|
|
503
|
+
}
|
|
504
|
+
renderLineYAxis(svgYAxisRight, lineYscale) {
|
|
505
|
+
const yLineAxis = d3
|
|
506
|
+
.axisRight(lineYscale)
|
|
507
|
+
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
508
|
+
.tickSize(0)
|
|
509
|
+
.tickFormat(this.chartConfiguration.yLineAxisLabelFomatter);
|
|
510
|
+
svgYAxisRight
|
|
511
|
+
.append('g')
|
|
512
|
+
.attr('class', 'lib-stacked-y-axis-text1')
|
|
513
|
+
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
514
|
+
.attr('transform', 'translate(0,0)')
|
|
515
|
+
.call(yLineAxis);
|
|
516
|
+
}
|
|
517
|
+
renderBars(svg, chartContext, scales, dimensions) {
|
|
518
|
+
const { data, metaData, keyList, isRia } = chartContext;
|
|
519
|
+
const { x, xSubgroup, y } = scales;
|
|
520
|
+
const { height } = dimensions;
|
|
521
|
+
const state = svg
|
|
522
|
+
.append('g')
|
|
523
|
+
.selectAll('.state')
|
|
524
|
+
.data(data)
|
|
334
525
|
.enter()
|
|
335
526
|
.append('g')
|
|
336
|
-
.attr('
|
|
337
|
-
|
|
338
|
-
const rect = layer
|
|
527
|
+
.attr('transform', (d) => `translate(${x(d.name)},0)`);
|
|
528
|
+
state
|
|
339
529
|
.selectAll('rect')
|
|
340
|
-
.data((d) => d)
|
|
341
|
-
.enter()
|
|
342
|
-
this.appendRectangles(rect, scales, metaData, dimensions);
|
|
343
|
-
this.addInteractions(rect, svg, metaData, scales);
|
|
344
|
-
return rect;
|
|
345
|
-
}
|
|
346
|
-
appendRectangles(rect, scales, metaData, dimensions) {
|
|
347
|
-
const { barWidth, barPadding } = dimensions;
|
|
348
|
-
const { xScale, yScale } = scales;
|
|
349
|
-
rect
|
|
530
|
+
.data((d) => this.prepareBarData(d, keyList))
|
|
531
|
+
.enter()
|
|
350
532
|
.append('rect')
|
|
351
|
-
.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
.attr('
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
.
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
return
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
if (metaData.barWithoutClick?.includes(d.data.name.toLowerCase())) {
|
|
395
|
-
return 'default';
|
|
533
|
+
.attr('class', 'bars')
|
|
534
|
+
.on('click', (d) => this.handleBarClick(d, metaData))
|
|
535
|
+
.attr('x', (d) => this.getBarX(d, data, x, xSubgroup))
|
|
536
|
+
.attr('y', (d) => y(d.value))
|
|
537
|
+
.attr('width', (d) => this.getBarWidth(d, data, x, xSubgroup))
|
|
538
|
+
.attr('height', (d) => this.getBarHeight(d, y, height))
|
|
539
|
+
.style('cursor', (d) => (metaData.hasDrillDown && !isRia ? 'pointer' : 'default'))
|
|
540
|
+
.attr('fill', (d) => this.getBarColor(d, metaData));
|
|
541
|
+
if (!isRia && (this.chartConfiguration.displayTitleOnTop || (!this.chartConfiguration.textsOnBar && !this.chartConfiguration.displayTitleOnTop))) {
|
|
542
|
+
state.selectAll('rect').on('mouseout', (d, i) => this.handleMouseOut(svg)).on('mouseover', (d, i) => this.handleMouseOver(svg, d, data, metaData, x, y, scales.leftAndRightSpaces));
|
|
543
|
+
}
|
|
544
|
+
if (this.chartConfiguration.textsOnBar && !this.isZoomedOut) {
|
|
545
|
+
this.renderBarTexts(state, data, metaData, keyList, x, xSubgroup, y, isRia, svg);
|
|
546
|
+
}
|
|
547
|
+
if (this.chartConfiguration.isDrilldownChart) {
|
|
548
|
+
svg.selectAll('g.x1.axis1 g.tick line').style('display', 'none');
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
prepareBarData(d, keyList) {
|
|
552
|
+
return keyList.map((key) => ({ key, value: d[key], name: d.name }));
|
|
553
|
+
}
|
|
554
|
+
handleBarClick(d, metaData) {
|
|
555
|
+
if (d.key === 'Target')
|
|
556
|
+
return;
|
|
557
|
+
if (!metaData.barWithoutClick?.length ||
|
|
558
|
+
(!metaData.barWithoutClick.includes(d?.name) && !metaData.barWithoutClick.includes(d?.key))) {
|
|
559
|
+
this.handleClick(d);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
getBarX(d, data, x, xSubgroup) {
|
|
563
|
+
if (this.chartConfiguration.isDrilldownChart) {
|
|
564
|
+
return this.calculateDrilldownBarX(d, data, x);
|
|
565
|
+
}
|
|
566
|
+
return xSubgroup(d.key);
|
|
567
|
+
}
|
|
568
|
+
calculateDrilldownBarX(d, data, x) {
|
|
569
|
+
let tempScale;
|
|
570
|
+
data.forEach((indiv) => {
|
|
571
|
+
if (indiv.name === d.name) {
|
|
572
|
+
const keys = Object.keys(indiv).filter((temp, i) => i !== 0);
|
|
573
|
+
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
574
|
+
if (x.bandwidth() > 100) {
|
|
575
|
+
tempScale = this.adjustDrilldownScale(tempScale, data, x);
|
|
396
576
|
}
|
|
397
|
-
return 'pointer';
|
|
398
577
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
.style('fill', (d) => this.getBarColor(d, metaData));
|
|
578
|
+
});
|
|
579
|
+
return tempScale ? tempScale(d.key) : 0;
|
|
402
580
|
}
|
|
403
|
-
|
|
404
|
-
if (
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
581
|
+
adjustDrilldownScale(tempScale, data, x) {
|
|
582
|
+
if (this.chartData.data.length === 1) {
|
|
583
|
+
const keysLength = Object.keys(this.chartData.data[0]).length;
|
|
584
|
+
const offset = keysLength === 2 ? 200 : 300;
|
|
585
|
+
tempScale.range([
|
|
586
|
+
0 + (x.bandwidth() - offset) / 2,
|
|
587
|
+
x.bandwidth() - (x.bandwidth() - offset) / 2,
|
|
588
|
+
]);
|
|
409
589
|
}
|
|
410
|
-
|
|
590
|
+
else {
|
|
591
|
+
tempScale.range([
|
|
592
|
+
0 + (x.bandwidth() - 125) / 2,
|
|
593
|
+
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
594
|
+
]);
|
|
595
|
+
}
|
|
596
|
+
return tempScale;
|
|
411
597
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
.
|
|
416
|
-
|
|
598
|
+
getBarWidth(d, data, x, xSubgroup) {
|
|
599
|
+
if (this.chartConfiguration.isDrilldownChart) {
|
|
600
|
+
let tempScale;
|
|
601
|
+
data.forEach((indiv) => {
|
|
602
|
+
if (indiv.name === d.name) {
|
|
603
|
+
const keys = Object.keys(indiv).filter((temp, i) => i !== 0);
|
|
604
|
+
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
605
|
+
if (x.bandwidth() > 100) {
|
|
606
|
+
tempScale = this.adjustDrilldownScale(tempScale, data, x);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
return tempScale ? tempScale.bandwidth() : 0;
|
|
611
|
+
}
|
|
612
|
+
return xSubgroup.bandwidth();
|
|
417
613
|
}
|
|
418
|
-
|
|
419
|
-
if (
|
|
420
|
-
return;
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
this.displayTooltip(d, svg, metaData, scales);
|
|
614
|
+
getBarHeight(d, y, height) {
|
|
615
|
+
if (d.value === -1)
|
|
616
|
+
return height - y(0);
|
|
617
|
+
if (d.value)
|
|
618
|
+
return height - y(d.value);
|
|
619
|
+
return height - y(0);
|
|
425
620
|
}
|
|
426
|
-
|
|
427
|
-
if (
|
|
428
|
-
!isNaN(d[1]) &&
|
|
621
|
+
getBarColor(d, metaData) {
|
|
622
|
+
if (d.value &&
|
|
429
623
|
this.chartData.targetLineData &&
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
metaData.colors[d.key];
|
|
624
|
+
d.value >= parseInt(this.chartData.targetLineData.target) &&
|
|
625
|
+
this.chartData.metaData.colorAboveTarget) {
|
|
626
|
+
return this.chartData.metaData.colorAboveTarget[d.key];
|
|
434
627
|
}
|
|
435
|
-
return
|
|
628
|
+
return this.chartData.metaData.colors[d.key];
|
|
436
629
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
630
|
+
renderBarTexts(state, data, metaData, keyList, x, xSubgroup, y, isRia, svg) {
|
|
631
|
+
state
|
|
632
|
+
.selectAll('text')
|
|
633
|
+
.data((d) => this.prepareBarData(d, keyList))
|
|
634
|
+
.enter()
|
|
635
|
+
.append('text')
|
|
636
|
+
.attr('x', 0)
|
|
637
|
+
.attr('y', 0)
|
|
638
|
+
.attr('class', 'lib-data-labels-weeklycharts')
|
|
639
|
+
.text((d) => this.getBarTextLabel(d))
|
|
640
|
+
.style('fill', '#000')
|
|
641
|
+
.style('font-weight', 'bold')
|
|
642
|
+
.style('font-size', () => this.getBarTextFontSize())
|
|
643
|
+
.attr('transform', (d) => this.getBarTextTransform(d, data, x, xSubgroup, y))
|
|
644
|
+
.on('click', (d) => this.handleBarClick(d, metaData));
|
|
645
|
+
if (!isRia) {
|
|
646
|
+
state
|
|
647
|
+
.selectAll('.lib-data-labels-weeklycharts')
|
|
648
|
+
.on('mouseout', (d, i) => this.handleMouseOut(svg))
|
|
649
|
+
.on('mouseover', (d, i) => this.handleMouseOver(svg, d, data, metaData, x, y, x.bandwidth()));
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
getBarTextLabel(d) {
|
|
653
|
+
if (!d.key || !d.value)
|
|
654
|
+
return '';
|
|
655
|
+
return d.key.length > 20 ? d.key.substring(0, 17) + '...' : d.key;
|
|
656
|
+
}
|
|
657
|
+
getBarTextFontSize() {
|
|
658
|
+
if (this.chartConfiguration.isDrilldownChart) {
|
|
659
|
+
if (window.innerWidth > 1900)
|
|
660
|
+
return '18px';
|
|
661
|
+
if (window.innerWidth < 1400)
|
|
662
|
+
return '10px';
|
|
663
|
+
return '14px';
|
|
664
|
+
}
|
|
665
|
+
return '14px';
|
|
666
|
+
}
|
|
667
|
+
getBarTextTransform(d, data, x, xSubgroup, y) {
|
|
668
|
+
let tempScale;
|
|
669
|
+
data.forEach((indiv) => {
|
|
670
|
+
if (indiv.name === d.name) {
|
|
671
|
+
const keys = Object.keys(indiv).filter((temp, i) => i !== 0);
|
|
672
|
+
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
673
|
+
if (x.bandwidth() > 100) {
|
|
674
|
+
tempScale = this.adjustDrilldownScale(tempScale, data, x);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
});
|
|
678
|
+
if (this.chartConfiguration.textAlwaysHorizontal) {
|
|
679
|
+
return `translate(${xSubgroup(d.key)},${y(d.value) - 3})`;
|
|
680
|
+
}
|
|
681
|
+
if (tempScale && !isNaN(tempScale(d.key))) {
|
|
682
|
+
return `translate(${tempScale(d.key) + tempScale.bandwidth() * 0.55},${y(0) - 10}) rotate(270)`;
|
|
683
|
+
}
|
|
684
|
+
return 'translate(0,0)';
|
|
685
|
+
}
|
|
686
|
+
handleMouseOver(svg, d, data, metaData, x, y, leftAndRightSpaces) {
|
|
687
|
+
svg.selectAll('.lib-verticalstack-title-ontop').remove();
|
|
688
|
+
let tempScale;
|
|
689
|
+
data.forEach((indiv) => {
|
|
690
|
+
if (indiv.name === d.name) {
|
|
691
|
+
const keys = Object.keys(indiv).filter((temp, i) => i !== 0);
|
|
692
|
+
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
693
|
+
if (x.bandwidth() > 100) {
|
|
694
|
+
tempScale = this.adjustDrilldownScale(tempScale, data, x);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
const foreignObject = svg
|
|
450
699
|
.append('foreignObject')
|
|
451
|
-
.attr('x', this.calculateTooltipX(d,
|
|
700
|
+
.attr('x', () => this.calculateTooltipX(d, x, tempScale, metaData, leftAndRightSpaces))
|
|
701
|
+
.attr('y', () => y(d.value) - 43)
|
|
452
702
|
.attr('class', 'lib-verticalstack-title-ontop')
|
|
453
|
-
.attr('
|
|
454
|
-
.attr('
|
|
455
|
-
|
|
703
|
+
.attr('width', () => this.calculateTooltipWidth(tempScale, metaData, leftAndRightSpaces))
|
|
704
|
+
.attr('height', 40);
|
|
705
|
+
foreignObject
|
|
456
706
|
.append('xhtml:div')
|
|
457
707
|
.attr('class', 'title')
|
|
458
708
|
.style('z-index', 99)
|
|
459
|
-
.html(this.
|
|
709
|
+
.html(() => this.getTooltipHTML(d, metaData));
|
|
460
710
|
}
|
|
461
|
-
calculateTooltipX(d,
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
711
|
+
calculateTooltipX(d, x, tempScale, metaData, leftAndRightSpaces) {
|
|
712
|
+
if (metaData.hasDrillDown) {
|
|
713
|
+
if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
714
|
+
return x(d.name) + tempScale(d.key) + tempScale.bandwidth() / 2 - 90;
|
|
715
|
+
}
|
|
716
|
+
return (x(d.name) +
|
|
717
|
+
tempScale(d.key) -
|
|
718
|
+
(tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 +
|
|
719
|
+
tempScale.bandwidth() / 2);
|
|
720
|
+
}
|
|
721
|
+
return (x(d.name) +
|
|
722
|
+
tempScale(d.key) -
|
|
723
|
+
(tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 +
|
|
724
|
+
tempScale.bandwidth() / 2);
|
|
725
|
+
}
|
|
726
|
+
calculateTooltipWidth(tempScale, metaData, leftAndRightSpaces) {
|
|
727
|
+
if (metaData.hasDrillDown) {
|
|
728
|
+
if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
729
|
+
return '180px';
|
|
730
|
+
}
|
|
731
|
+
return tempScale.bandwidth() + leftAndRightSpaces * 2;
|
|
467
732
|
}
|
|
468
|
-
return
|
|
733
|
+
return tempScale.bandwidth() + leftAndRightSpaces * 2;
|
|
469
734
|
}
|
|
470
|
-
|
|
471
|
-
if (value === 0)
|
|
472
|
-
return '<span class="title-top-text">0</span>';
|
|
735
|
+
getTooltipHTML(d, metaData) {
|
|
473
736
|
const dataType = metaData.dataType || '';
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
737
|
+
if (!this.isZoomedOut) {
|
|
738
|
+
return `<span class="title-bar-name">${d.name}</span><span class="title-bar-value"><span>${d.value}</span>${dataType}</span>`;
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
const tempKey = d.name.length <= 8 ? d.name : d.name.substring(0, 5) + '...';
|
|
742
|
+
return `<span class="title-bar-name">${tempKey}:${d.value}${dataType}</span><span class="title-bar-value">${d.name}</span>`;
|
|
743
|
+
}
|
|
479
744
|
}
|
|
480
|
-
handleMouseOut(svg
|
|
481
|
-
if (!this.chartConfiguration.displayTitleOnTop)
|
|
482
|
-
return;
|
|
483
|
-
svg.selectAll('rect')
|
|
484
|
-
.style('fill', (d) => this.getBarColor(d, metaData));
|
|
745
|
+
handleMouseOut(svg) {
|
|
485
746
|
svg.selectAll('.lib-verticalstack-title-ontop').remove();
|
|
486
747
|
}
|
|
487
|
-
|
|
748
|
+
renderLabels(svgElements, scales, chartContext, dimensions) {
|
|
749
|
+
const { svg, svgYAxisLeft, svgYAxisRight } = svgElements;
|
|
750
|
+
const { metaData } = chartContext;
|
|
751
|
+
const { width, height, margin } = dimensions;
|
|
488
752
|
if (metaData.yLabel) {
|
|
489
|
-
this.
|
|
753
|
+
this.renderYAxisLabel(svgYAxisLeft, metaData.yLabel, height, margin);
|
|
490
754
|
}
|
|
491
755
|
if (metaData.xLabel) {
|
|
492
|
-
this.
|
|
756
|
+
this.renderXAxisLabel(svg, metaData.xLabel, width, height, margin);
|
|
757
|
+
}
|
|
758
|
+
if (metaData.lineyLabel) {
|
|
759
|
+
this.renderLineYAxisLabel(svgYAxisRight, metaData.lineyLabel);
|
|
493
760
|
}
|
|
494
761
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
const isAcronym = this.isAcronymLabel(label);
|
|
498
|
-
const yPosition = isria ? -margin.left / 2 - 30 : -margin.left / 2 - 40;
|
|
499
|
-
svgYAxisLeft.selectAll('.lib-axis-group-label, .lib-ylabel-drilldowncharts, .lib-ylabel-weeklyCharts').remove();
|
|
762
|
+
renderYAxisLabel(svgYAxisLeft, yLabel, height, margin) {
|
|
763
|
+
// FIXED: Proper Y-axis label with correct positioning
|
|
500
764
|
svgYAxisLeft
|
|
501
765
|
.append('text')
|
|
502
|
-
.attr('class',
|
|
766
|
+
.attr('class', 'lib-axis-group-label lib-ylabel-visible')
|
|
503
767
|
.attr('style', this.chartConfiguration.yAxisCustomlabelStyles)
|
|
504
768
|
.attr('transform', 'rotate(-90)')
|
|
505
|
-
.attr('y',
|
|
506
|
-
.attr('x', -height / 2)
|
|
769
|
+
.attr('y', -margin.left)
|
|
770
|
+
.attr('x', 0 - height / 2)
|
|
507
771
|
.attr('dy', '1em')
|
|
508
772
|
.style('text-anchor', 'middle')
|
|
509
|
-
.style('
|
|
510
|
-
.
|
|
511
|
-
.style('
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
const isAcronym = this.isAcronymLabel(label);
|
|
515
|
-
bottomLabelContainer
|
|
516
|
-
.append('div')
|
|
517
|
-
.style('width', '100%')
|
|
518
|
-
.style('text-align', 'center')
|
|
519
|
-
.style('font-size', '12px')
|
|
520
|
-
.style('font-weight', '600')
|
|
521
|
-
.style('font-family', 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto')
|
|
522
|
-
.style('color', 'var(--chart-text-color)')
|
|
523
|
-
.style('text-transform', isAcronym ? 'none' : 'capitalize')
|
|
524
|
-
.text(isAcronym ? label.toUpperCase() : label.toLowerCase());
|
|
525
|
-
}
|
|
526
|
-
isAcronymLabel(label) {
|
|
527
|
-
const cleanLabel = label.replace(/[^A-Za-z]/g, '');
|
|
528
|
-
return (label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
529
|
-
(label === label.toUpperCase() && /[A-Z]/.test(label));
|
|
530
|
-
}
|
|
531
|
-
getYAxisLabelClass() {
|
|
532
|
-
let baseClass = 'lib-axis-group-label font-size-1';
|
|
533
|
-
if (this.chartConfiguration.isDrilldownChart) {
|
|
534
|
-
return `${baseClass} lib-ylabel-drilldowncharts`;
|
|
773
|
+
.style('font-size', '11px')
|
|
774
|
+
.style('font-weight', '400')
|
|
775
|
+
.style('fill', 'var(--chart-text-color, #666666)');
|
|
776
|
+
if (this.chartConfiguration.isMultiChartGridLine === undefined) {
|
|
777
|
+
svgYAxisLeft.selectAll('.lib-axis-group-label').text(yLabel);
|
|
535
778
|
}
|
|
536
|
-
|
|
537
|
-
|
|
779
|
+
else {
|
|
780
|
+
svgYAxisLeft
|
|
781
|
+
.selectAll('.lib-axis-group-label')
|
|
782
|
+
.attr('class', 'lib-ylabel-weeklyCharts lib-ylabel-visible')
|
|
783
|
+
.text(yLabel.toLowerCase());
|
|
538
784
|
}
|
|
539
|
-
return `${baseClass} lib-axis-waterfall-label`;
|
|
540
785
|
}
|
|
541
|
-
|
|
786
|
+
renderXAxisLabel(svg, xLabel, width, height, margin) {
|
|
787
|
+
const isAcronym = this.isAcronym(xLabel.replace(/[^A-Za-z]/g, ''));
|
|
542
788
|
let baseClass = 'lib-axis-group-label font-size-1';
|
|
543
789
|
if (this.chartConfiguration.isDrilldownChart) {
|
|
544
|
-
|
|
545
|
-
}
|
|
546
|
-
if (this.chartConfiguration.isMultiChartGridLine !== undefined) {
|
|
547
|
-
return `${baseClass} lib-xlabel-weeklyCharts`;
|
|
548
|
-
}
|
|
549
|
-
return `${baseClass} lib-axis-waterfall-label`;
|
|
550
|
-
}
|
|
551
|
-
renderGridsFromLeftAxis(svgMain, svgYAxisLeft, scales, dimensions) {
|
|
552
|
-
if (!this.chartConfiguration.yAxisGrid)
|
|
553
|
-
return;
|
|
554
|
-
// We want horizontal grid lines to span the full visible width:
|
|
555
|
-
// the inner SVG (requiredSvgWidth) plus the right axis width.
|
|
556
|
-
const gridSpan = dimensions.requiredSvgWidth + this.CONSTANTS.RIGHT_SVG_WIDTH;
|
|
557
|
-
// Append the grid to the main (inner) SVG so lines are rendered across the scrollable area.
|
|
558
|
-
svgMain
|
|
559
|
-
.append('g')
|
|
560
|
-
.attr('class', 'grid horizontal-grid-from-left')
|
|
561
|
-
.attr('transform', 'translate(0,0)')
|
|
562
|
-
.call(d3
|
|
563
|
-
.axisLeft(scales.yScale)
|
|
564
|
-
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
565
|
-
.tickSize(-gridSpan)
|
|
566
|
-
.tickFormat(''))
|
|
567
|
-
.style('color', 'var(--chart-grid-color)')
|
|
568
|
-
.style('opacity', '1')
|
|
569
|
-
.call((g) => {
|
|
570
|
-
g.select('.domain').remove();
|
|
571
|
-
g.selectAll('.tick line')
|
|
572
|
-
.style('stroke', 'var(--chart-grid-color)')
|
|
573
|
-
.style('stroke-width', '1px');
|
|
574
|
-
});
|
|
575
|
-
}
|
|
576
|
-
applyConfigurationFlags() {
|
|
577
|
-
if (this.chartConfiguration.isHeaderVisible !== undefined) {
|
|
578
|
-
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
579
|
-
}
|
|
580
|
-
if (this.chartConfiguration.isTopCaptionVisible !== undefined) {
|
|
581
|
-
this.isTopCaptionVisible = this.chartConfiguration.isTopCaptionVisible;
|
|
582
|
-
}
|
|
583
|
-
if (this.chartConfiguration.isTransparentBackground !== undefined) {
|
|
584
|
-
this.isTransparentBackground = this.chartConfiguration.isTransparentBackground;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
initializeStackedChart() {
|
|
588
|
-
// Use fixed configuration for all resolutions
|
|
589
|
-
this.chartConfiguration.margin = { top: 20, right: 20, bottom: 40, left: 40 };
|
|
590
|
-
this.chartConfiguration.numberOfYTicks = 5;
|
|
591
|
-
this.chartConfiguration.svgHeight = 70;
|
|
592
|
-
this.mergeConfigurations();
|
|
593
|
-
this.applyConfigurationFlags();
|
|
594
|
-
const data = this.chartData.data;
|
|
595
|
-
const metaData = this.prepareMetaData(this.chartData.metaData);
|
|
596
|
-
const lineData = this.chartData.lineData;
|
|
597
|
-
const colors = metaData.colors;
|
|
598
|
-
const keyList = metaData.keyList;
|
|
599
|
-
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
600
|
-
const verticalstackedcontainer = d3.select(this.groupcontainerElt.nativeElement);
|
|
601
|
-
const margin = this.chartConfiguration.margin;
|
|
602
|
-
const dimensions = this.calculateDimensions(chartContainer, verticalstackedcontainer, margin, data.length);
|
|
603
|
-
const hasXLabel = !!metaData.xLabel;
|
|
604
|
-
const { svg, svgYAxisLeft, svgYAxisRight, bottomLabelContainer } = this.createSvgContainers(chartContainer, dimensions, margin, hasXLabel);
|
|
605
|
-
const stack = d3.stack().keys(keyList).offset(d3.stackOffsetNone);
|
|
606
|
-
const layers = stack(data);
|
|
607
|
-
data.sort((a, b) => b.total - a.total);
|
|
608
|
-
const scales = this.createScales(data, layers, lineData, dimensions);
|
|
609
|
-
const axes = this.createAxes(scales);
|
|
610
|
-
this.renderGridsFromLeftAxis(svg, svgYAxisLeft, scales, dimensions);
|
|
611
|
-
this.renderGrids(svg, scales, dimensions);
|
|
612
|
-
const rect = this.renderBars(svg, layers, scales, metaData, dimensions);
|
|
613
|
-
this.renderAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions, data);
|
|
614
|
-
this.renderAxisLabels(svg, svgYAxisLeft, bottomLabelContainer, metaData, dimensions, margin);
|
|
615
|
-
this.renderTargetLine(svg, svgYAxisRight, scales, dimensions, metaData);
|
|
616
|
-
this.renderDataLabels(rect, scales, metaData, dimensions);
|
|
617
|
-
this.renderLineChart(svg, lineData, scales, colors, metaData);
|
|
618
|
-
}
|
|
619
|
-
renderGrids(svg, scales, dimensions) {
|
|
620
|
-
if (this.chartConfiguration.isXgridBetweenLabels) {
|
|
621
|
-
svg
|
|
622
|
-
.append('g')
|
|
623
|
-
.attr('class', 'grid vertical-grid')
|
|
624
|
-
.attr('transform', `translate(${scales.xScale.bandwidth() / 2},${dimensions.height})`)
|
|
625
|
-
.call(d3.axisBottom(scales.xScale).tickSize(-dimensions.height).tickFormat(''))
|
|
626
|
-
.style('stroke-dasharray', '5 5')
|
|
627
|
-
.style('color', '#999999')
|
|
628
|
-
.call((g) => g.select('.domain').remove());
|
|
629
|
-
}
|
|
630
|
-
if (this.chartConfiguration.xAxisGrid) {
|
|
631
|
-
for (let j = 0; j < this.chartConfiguration.xAxisGrid.length; j++) {
|
|
632
|
-
svg
|
|
633
|
-
.append('g')
|
|
634
|
-
.attr('class', `x${j + 2} axis${j + 2}`)
|
|
635
|
-
.style('color', 'var(--chart-grid-color)')
|
|
636
|
-
.attr('transform', `translate(0,${dimensions.height * this.chartConfiguration.xAxisGrid[j]})`)
|
|
637
|
-
.call(d3.axisBottom(scales.xScale).tickSize(0).ticks(5).tickFormat(''))
|
|
638
|
-
.style('fill', 'var(--chart-text-color)');
|
|
639
|
-
}
|
|
790
|
+
baseClass += ' lib-xlabel-drilldowncharts';
|
|
640
791
|
}
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
if (this.chartConfiguration.showXaxisTop) {
|
|
644
|
-
svg
|
|
645
|
-
.append('g')
|
|
646
|
-
.attr('class', 'lib-line-axis-text lib-line-x-axis-text x-axis')
|
|
647
|
-
.attr('style', this.chartConfiguration.xAxisCustomTextStyles)
|
|
648
|
-
.call(d3.axisBottom(scales.xScale).tickSize(0));
|
|
649
|
-
svg.selectAll('.x-axis > g > text').attr('class', 'lib-display-hidden');
|
|
650
|
-
}
|
|
651
|
-
if (!this.chartConfiguration.isMultiChartGridLine) {
|
|
652
|
-
this.renderStandardAxes(svg, axes, scales, dimensions, data);
|
|
653
|
-
}
|
|
654
|
-
else if (this.chartConfiguration.isDrilldownChart) {
|
|
655
|
-
this.renderDrilldownAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions);
|
|
792
|
+
else if (this.chartConfiguration.isMultiChartGridLine !== undefined) {
|
|
793
|
+
baseClass += ' lib-xlabel-weeklyCharts';
|
|
656
794
|
}
|
|
657
795
|
else {
|
|
658
|
-
|
|
796
|
+
baseClass += ' lib-axis-waterfall-label';
|
|
659
797
|
}
|
|
660
|
-
this.applyAxisStyling(svg, svgYAxisLeft, svgYAxisRight);
|
|
661
|
-
this.applyAxisConfigurations(svg, scales, dimensions, data);
|
|
662
|
-
}
|
|
663
|
-
renderStandardAxes(svg, axes, scales, dimensions, data) {
|
|
664
|
-
const isMobileOrTablet = window.innerWidth < 1024;
|
|
665
|
-
// X-axis with labels
|
|
666
|
-
const xAxisGroup = svg
|
|
667
|
-
.append('g')
|
|
668
|
-
.attr('transform', `translate(0,${dimensions.height})`)
|
|
669
|
-
.attr('class', 'lib-stacked-x-axis-text')
|
|
670
|
-
.call(axes.xAxis);
|
|
671
|
-
// Style X-axis labels
|
|
672
|
-
xAxisGroup
|
|
673
|
-
.selectAll('text')
|
|
674
|
-
.style('fill', 'var(--chart-text-color)')
|
|
675
|
-
.style('font-size', isMobileOrTablet ? '10px' : '12px')
|
|
676
|
-
.attr('text-anchor', 'middle')
|
|
677
|
-
.attr('dy', '1em')
|
|
678
|
-
.each(function (d) {
|
|
679
|
-
const textElement = d3.select(this);
|
|
680
|
-
const text = textElement.text();
|
|
681
|
-
if (isMobileOrTablet && text.length > 12) {
|
|
682
|
-
textElement.text(text.substring(0, 10) + '...');
|
|
683
|
-
}
|
|
684
|
-
});
|
|
685
|
-
// Ensure X-axis line starts exactly at x=0
|
|
686
|
-
xAxisGroup
|
|
687
|
-
.select('.domain')
|
|
688
|
-
.style('stroke', 'var(--chart-axis-color)')
|
|
689
|
-
.style('stroke-width', '1px')
|
|
690
|
-
.attr('d', `M0,0.5H${dimensions.requiredSvgWidth}`);
|
|
691
|
-
// Y-axis
|
|
692
798
|
svg
|
|
693
|
-
.append('g')
|
|
694
|
-
.attr('class', 'lib-stacked-y-axis-text')
|
|
695
|
-
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
696
|
-
.call(axes.yAxis)
|
|
697
|
-
.selectAll('text')
|
|
698
|
-
.style('fill', 'var(--chart-text-color)');
|
|
699
|
-
}
|
|
700
|
-
renderDrilldownAxes(svg, svgYAxisLeft, svgYAxisRight, axes, scales, dimensions) {
|
|
701
|
-
svg
|
|
702
|
-
.append('g')
|
|
703
|
-
.attr('transform', `translate(0,${dimensions.height})`)
|
|
704
|
-
.attr('class', 'lib-stacked-x-axis-text multichart1')
|
|
705
|
-
.call(axes.xAxis)
|
|
706
|
-
.style('display', 'none');
|
|
707
|
-
svgYAxisLeft
|
|
708
|
-
.append('g')
|
|
709
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
710
|
-
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
711
|
-
.call(axes.yAxis)
|
|
712
|
-
.selectAll('text')
|
|
713
|
-
.style('fill', 'var(--chart-text-color)');
|
|
714
|
-
svgYAxisRight
|
|
715
|
-
.append('g')
|
|
716
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
717
|
-
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
718
|
-
.call(axes.yAxis)
|
|
719
|
-
.style('display', 'none');
|
|
720
|
-
}
|
|
721
|
-
renderMultiChartAxes(svg, axes, scales, dimensions) {
|
|
722
|
-
svg
|
|
723
|
-
.append('g')
|
|
724
|
-
.attr('transform', `translate(0,${dimensions.height})`)
|
|
725
|
-
.attr('class', 'lib-stacked-x-axis-text multichart')
|
|
726
|
-
.call(axes.xAxis)
|
|
727
|
-
.selectAll('text')
|
|
728
|
-
.style('fill', 'var(--chart-text-color)');
|
|
729
|
-
svg
|
|
730
|
-
.append('g')
|
|
731
|
-
.attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
|
|
732
|
-
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
733
|
-
.call(axes.yAxis)
|
|
734
|
-
.selectAll('text')
|
|
735
|
-
.style('fill', 'var(--chart-text-color)');
|
|
736
|
-
}
|
|
737
|
-
applyAxisStyling(svg, svgYAxisLeft, svgYAxisRight) {
|
|
738
|
-
const styleAxisDomain = (container) => {
|
|
739
|
-
container.selectAll('.domain')
|
|
740
|
-
.style('stroke', 'var(--chart-axis-color)')
|
|
741
|
-
.style('stroke-width', '1px');
|
|
742
|
-
};
|
|
743
|
-
styleAxisDomain(svg);
|
|
744
|
-
styleAxisDomain(svgYAxisLeft);
|
|
745
|
-
styleAxisDomain(svgYAxisRight);
|
|
746
|
-
if (this.chartConfiguration.isYaxisDashed) {
|
|
747
|
-
d3.selectAll('.yaxis-dashed')
|
|
748
|
-
.style('stroke-dasharray', '5 5')
|
|
749
|
-
.style('color', 'var(--chart-grid-color)');
|
|
750
|
-
}
|
|
751
|
-
if (this.chartConfiguration.isXaxisColor) {
|
|
752
|
-
d3.selectAll('.multichart').style('color', this.chartConfiguration.isXaxisColor || 'var(--chart-text-color)');
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
applyAxisConfigurations(svg, scales, dimensions, data) {
|
|
756
|
-
if (this.chartConfiguration.isMultiChartGridLine !== undefined) {
|
|
757
|
-
d3.selectAll('.multichart > g > text').attr('class', 'lib-display-hidden');
|
|
758
|
-
}
|
|
759
|
-
if (this.chartConfiguration.isXaxisLabelHidden) {
|
|
760
|
-
d3.selectAll('.multichart > g > text').attr('class', 'lib-display-hidden');
|
|
761
|
-
}
|
|
762
|
-
else if (this.chartConfiguration.isXaxisLabelHidden !== undefined) {
|
|
763
|
-
this.renderCustomXAxis(svg, scales, dimensions, data);
|
|
764
|
-
}
|
|
765
|
-
if (this.chartConfiguration.isYaxisLabelHidden) {
|
|
766
|
-
svg.selectAll('.yaxis-dashed > g > text').attr('class', 'lib-display-hidden');
|
|
767
|
-
}
|
|
768
|
-
if (this.chartConfiguration.isYaxisHidden) {
|
|
769
|
-
d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
|
|
770
|
-
}
|
|
771
|
-
if (this.isZoomedOut && data.length > 9) {
|
|
772
|
-
svg
|
|
773
|
-
.selectAll('.lib-xaxis-labels-texts-drilldown')
|
|
774
|
-
.attr('transform', 'rotate(-90)')
|
|
775
|
-
.attr('text-anchor', 'end')
|
|
776
|
-
.attr('x', '-5')
|
|
777
|
-
.attr('dy', null);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
renderCustomXAxis(svg, scales, dimensions, data) {
|
|
781
|
-
svg
|
|
782
|
-
.append('g')
|
|
783
|
-
.attr('class', 'x1 axis1')
|
|
784
|
-
.attr('transform', `translate(0,${dimensions.height})`)
|
|
785
|
-
.style('color', '#000')
|
|
786
|
-
.call(d3.axisBottom(scales.xScale).tickSize(0))
|
|
787
|
-
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
788
|
-
this.styleCustomXAxisTicks(svg, data);
|
|
789
|
-
if (this.chartConfiguration.xLabelsOnSameLine) {
|
|
790
|
-
this.applyXLabelsOnSameLine(svg);
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
styleCustomXAxisTicks(svg, data) {
|
|
794
|
-
let alternateText = false;
|
|
795
|
-
svg.selectAll('.x1.axis1 .tick line').attr('y2', () => {
|
|
796
|
-
if (this.chartConfiguration.hideXaxisTick)
|
|
797
|
-
return 0;
|
|
798
|
-
if (alternateText && !this.chartConfiguration.isNoAlternateXaxisText) {
|
|
799
|
-
alternateText = false;
|
|
800
|
-
return this.CONSTANTS.LONG_TICK_LENGTH_BG - 7;
|
|
801
|
-
}
|
|
802
|
-
alternateText = true;
|
|
803
|
-
return this.CONSTANTS.SHORT_TICK_LENGTH_BG - 4;
|
|
804
|
-
});
|
|
805
|
-
alternateText = false;
|
|
806
|
-
svg
|
|
807
|
-
.selectAll('g.x1.axis1 g.tick text')
|
|
808
|
-
.attr('class', () => {
|
|
809
|
-
if (this.chartConfiguration.isDrilldownChart) {
|
|
810
|
-
return data.length > 8
|
|
811
|
-
? 'lib-xaxis-labels-texts-drilldown-alt'
|
|
812
|
-
: 'lib-xaxis-labels-texts-drilldown';
|
|
813
|
-
}
|
|
814
|
-
return 'lib-xaxis-labels-texts-weeklycharts';
|
|
815
|
-
})
|
|
816
|
-
.attr('y', () => {
|
|
817
|
-
if (alternateText) {
|
|
818
|
-
alternateText = false;
|
|
819
|
-
return this.CONSTANTS.LONG_TICK_LENGTH_BG;
|
|
820
|
-
}
|
|
821
|
-
alternateText = true;
|
|
822
|
-
return this.CONSTANTS.SHORT_TICK_LENGTH_BG;
|
|
823
|
-
});
|
|
824
|
-
}
|
|
825
|
-
applyXLabelsOnSameLine(svg) {
|
|
826
|
-
svg
|
|
827
|
-
.selectAll('g.x1.axis1 g.tick text')
|
|
828
|
-
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
829
|
-
.attr('y', this.CONSTANTS.SHORT_TICK_LENGTH_BG)
|
|
830
|
-
.text((d) => {
|
|
831
|
-
const trimmed = d.trim();
|
|
832
|
-
const spaceIndex = trimmed.indexOf(' ');
|
|
833
|
-
return spaceIndex > -1
|
|
834
|
-
? trimmed.substring(0, spaceIndex).toLowerCase()
|
|
835
|
-
: trimmed.toLowerCase();
|
|
836
|
-
});
|
|
837
|
-
svg
|
|
838
|
-
.selectAll('g.x1.axis1 g.tick')
|
|
839
799
|
.append('text')
|
|
840
|
-
.attr('class',
|
|
841
|
-
.attr('
|
|
842
|
-
|
|
843
|
-
.
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
});
|
|
850
|
-
}
|
|
851
|
-
renderDataLabels(rect, scales, metaData, dimensions) {
|
|
852
|
-
if (!this.isCC && !this.chartConfiguration.isMultiChartGridLine) {
|
|
853
|
-
rect.append('svg:title').text((d) => d[1] - d[0]);
|
|
854
|
-
}
|
|
855
|
-
if (this.chartConfiguration.showTotalOnTop) {
|
|
856
|
-
this.renderTopLabels(rect, scales, metaData);
|
|
857
|
-
}
|
|
858
|
-
if (this.chartConfiguration.showAngledLabels) {
|
|
859
|
-
this.renderAngledLabels(rect, scales, metaData);
|
|
860
|
-
}
|
|
800
|
+
.attr('class', baseClass)
|
|
801
|
+
.attr('style', this.chartConfiguration.xAxisCustomlabelStyles)
|
|
802
|
+
// FIXED: Adjusted for reduced bottom margin
|
|
803
|
+
.attr('transform', `translate(${width / 2},${height + 32})`)
|
|
804
|
+
.style('text-anchor', 'middle')
|
|
805
|
+
.style('fill', 'var(--chart-text-color, #666666)')
|
|
806
|
+
.style('font-size', '11px')
|
|
807
|
+
.text(isAcronym ? xLabel.toUpperCase() : xLabel.toLowerCase())
|
|
808
|
+
.style('text-transform', isAcronym ? 'none' : 'capitalize');
|
|
861
809
|
}
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
: (d) => d;
|
|
866
|
-
const formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
|
|
867
|
-
rect
|
|
868
|
-
.append('text')
|
|
869
|
-
.attr('x', (d) => scales.xScale(d.data.name) + scales.xScale.bandwidth() / 2)
|
|
870
|
-
.attr('class', 'lib-verticalstack-labels-ontop-weklycharts')
|
|
871
|
-
.attr('y', (d) => scales.yScale(d[1]) - 3)
|
|
872
|
-
.text((d) => {
|
|
873
|
-
const value = d[1] - d[0];
|
|
874
|
-
if (isNaN(value) || value === 0)
|
|
875
|
-
return;
|
|
876
|
-
const formattedValue = value <= 999
|
|
877
|
-
? formatFromBackend(value)
|
|
878
|
-
: formatForHugeNumbers(value);
|
|
879
|
-
return metaData.unit ? metaData.unit + formattedValue : formattedValue;
|
|
880
|
-
});
|
|
810
|
+
isAcronym(label) {
|
|
811
|
+
return ((label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
812
|
+
(label === label.toUpperCase() && /[A-Z]/.test(label)));
|
|
881
813
|
}
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
? ChartHelper.dataValueFormatter(this.chartConfiguration.textFormatter)
|
|
885
|
-
: (d) => d;
|
|
886
|
-
const formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
|
|
887
|
-
const tempObjectHolder = {};
|
|
888
|
-
rect
|
|
814
|
+
renderLineYAxisLabel(svgYAxisRight, lineyLabel) {
|
|
815
|
+
svgYAxisRight
|
|
889
816
|
.append('text')
|
|
890
|
-
.attr('
|
|
891
|
-
.attr('
|
|
892
|
-
.attr('
|
|
893
|
-
.attr('
|
|
894
|
-
.
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
? formatFromBackend(value)
|
|
900
|
-
: formatForHugeNumbers(value);
|
|
901
|
-
return metaData.unit ? metaData.unit + formattedValue : formattedValue;
|
|
902
|
-
})
|
|
903
|
-
.attr('transform', (d) => {
|
|
904
|
-
const value = d[1] - d[0];
|
|
905
|
-
if (isNaN(value) || value <= 0)
|
|
906
|
-
return 'rotate(0)';
|
|
907
|
-
let total = 0;
|
|
908
|
-
let incrementer = 1;
|
|
909
|
-
metaData.keyList.forEach(key => {
|
|
910
|
-
if (d.data[key]) {
|
|
911
|
-
total += d.data[key];
|
|
912
|
-
}
|
|
913
|
-
else {
|
|
914
|
-
incrementer = 2;
|
|
915
|
-
}
|
|
916
|
-
});
|
|
917
|
-
tempObjectHolder[d.data.name] = (tempObjectHolder[d.data.name] || 0) + incrementer;
|
|
918
|
-
const position = tempObjectHolder[d.data.name];
|
|
919
|
-
const xPos = scales.xScale(d.data.name);
|
|
920
|
-
const bandwidth = scales.xScale.bandwidth();
|
|
921
|
-
const yPos = scales.yScale(total) - 3;
|
|
922
|
-
switch (position) {
|
|
923
|
-
case 1:
|
|
924
|
-
return `translate(${xPos + bandwidth / 3},${yPos}) rotate(270)`;
|
|
925
|
-
case 2:
|
|
926
|
-
return `translate(${xPos + bandwidth / 2 + 2},${yPos}) rotate(270)`;
|
|
927
|
-
default:
|
|
928
|
-
return `translate(${xPos + (bandwidth * 3) / 4},${yPos}) rotate(270)`;
|
|
929
|
-
}
|
|
930
|
-
});
|
|
817
|
+
.attr('class', 'lib-axis-group-label lib-line-axis')
|
|
818
|
+
.attr('style', this.chartConfiguration.yAxisCustomlabelStyles)
|
|
819
|
+
.attr('transform', 'translate(0,0) rotate(90)')
|
|
820
|
+
.attr('y', -100)
|
|
821
|
+
.attr('x', 100)
|
|
822
|
+
.attr('dy', '5em')
|
|
823
|
+
.style('text-anchor', 'middle')
|
|
824
|
+
.style('font-size', 'smaller')
|
|
825
|
+
.text(lineyLabel);
|
|
931
826
|
}
|
|
932
|
-
renderTargetLine(
|
|
827
|
+
renderTargetLine(svgElements, scales, chartContext, dimensions) {
|
|
933
828
|
if (!this.chartData.targetLineData)
|
|
934
829
|
return;
|
|
935
|
-
const
|
|
936
|
-
const
|
|
830
|
+
const { svg, svgYAxisRight } = svgElements;
|
|
831
|
+
const { y } = scales;
|
|
832
|
+
const { width } = dimensions;
|
|
833
|
+
const { metaData } = chartContext;
|
|
834
|
+
const targetData = this.chartData.targetLineData;
|
|
835
|
+
const yZero = y(targetData.target);
|
|
937
836
|
svg
|
|
938
837
|
.append('line')
|
|
939
838
|
.attr('x1', 0)
|
|
940
|
-
.attr('x2',
|
|
839
|
+
.attr('x2', width)
|
|
941
840
|
.attr('y1', yZero)
|
|
942
841
|
.attr('y2', yZero)
|
|
943
842
|
.style('stroke-dasharray', '5 5')
|
|
944
|
-
.style('stroke',
|
|
945
|
-
|
|
946
|
-
}
|
|
947
|
-
parseTargetValue(target) {
|
|
948
|
-
const parsed = parseFloat(String(target));
|
|
949
|
-
if (isNaN(parsed))
|
|
950
|
-
return 0;
|
|
951
|
-
return Number.isInteger(parsed) ? parseInt(String(target)) : parsed;
|
|
952
|
-
}
|
|
953
|
-
renderTargetLabel(svgYAxisRight, yZero, metaData) {
|
|
954
|
-
const dataType = metaData.dataType || '';
|
|
955
|
-
const targetName = this.chartData.targetLineData.targetName || 'target';
|
|
843
|
+
.style('stroke', targetData.color);
|
|
844
|
+
const rightSvgWidth = 60;
|
|
956
845
|
svgYAxisRight
|
|
957
846
|
.append('foreignObject')
|
|
958
|
-
.attr('transform', `translate(0,${yZero -
|
|
959
|
-
.attr('width',
|
|
847
|
+
.attr('transform', `translate(0,${yZero - 30})`)
|
|
848
|
+
.attr('width', rightSvgWidth)
|
|
960
849
|
.attr('height', 50)
|
|
961
850
|
.append('xhtml:div')
|
|
962
851
|
.attr('class', 'target-display')
|
|
963
852
|
.style('color', 'var(--chart-text-color)')
|
|
964
|
-
.html(
|
|
853
|
+
.html(() => {
|
|
854
|
+
const dataType = metaData.dataType || '';
|
|
855
|
+
const targetName = targetData.targetName || 'target';
|
|
856
|
+
return `<div>${targetName}</div><div>${targetData.target}${dataType}</div>`;
|
|
857
|
+
});
|
|
965
858
|
}
|
|
966
|
-
|
|
967
|
-
|
|
859
|
+
renderLineGraph(svg, chartContext, scales) {
|
|
860
|
+
const { lineData, metaData } = chartContext;
|
|
861
|
+
if (!lineData)
|
|
968
862
|
return;
|
|
969
|
-
const
|
|
970
|
-
|
|
971
|
-
.
|
|
972
|
-
.
|
|
973
|
-
|
|
863
|
+
const { x, lineYscale } = scales;
|
|
864
|
+
svg
|
|
865
|
+
.append('path')
|
|
866
|
+
.datum(lineData)
|
|
867
|
+
.attr('fill', 'none')
|
|
868
|
+
.attr('stroke', this.chartConfiguration.lineGraphColor)
|
|
869
|
+
.attr('stroke-width', 1.5)
|
|
870
|
+
.attr('d', d3
|
|
974
871
|
.line()
|
|
975
|
-
.x((d) =>
|
|
976
|
-
.y((d) =>
|
|
977
|
-
dataGroup.forEach((group) => {
|
|
978
|
-
svg
|
|
979
|
-
.append('path')
|
|
980
|
-
.datum(group.values)
|
|
981
|
-
.attr('fill', 'none')
|
|
982
|
-
.attr('stroke', (d) => {
|
|
983
|
-
return d[0]?.category
|
|
984
|
-
? colors[d[0].category]
|
|
985
|
-
: this.chartConfiguration.lineGraphColor;
|
|
986
|
-
})
|
|
987
|
-
.attr('stroke-width', 2.5)
|
|
988
|
-
.attr('d', lineGen);
|
|
989
|
-
this.renderLineDots(svg, group.values, scales, colors);
|
|
990
|
-
});
|
|
991
|
-
}
|
|
992
|
-
renderLineDots(svg, values, scales, colors) {
|
|
872
|
+
.x((d) => x(d.name) + x.bandwidth() / 2)
|
|
873
|
+
.y((d) => lineYscale(d.value)));
|
|
993
874
|
const dot = svg
|
|
994
|
-
.selectAll('
|
|
995
|
-
.data(
|
|
875
|
+
.selectAll('myCircles')
|
|
876
|
+
.data(lineData)
|
|
996
877
|
.enter()
|
|
997
878
|
.append('g')
|
|
998
|
-
.on('click', (d) => this.
|
|
879
|
+
.on('click', (d) => this.handleBarClick(d, metaData));
|
|
999
880
|
dot
|
|
1000
881
|
.append('circle')
|
|
1001
|
-
.attr('fill',
|
|
1002
|
-
return d.category
|
|
1003
|
-
? colors[d.category]
|
|
1004
|
-
: this.chartConfiguration.lineGraphColor;
|
|
1005
|
-
})
|
|
882
|
+
.attr('fill', this.chartConfiguration.lineGraphColor)
|
|
1006
883
|
.attr('stroke', 'none')
|
|
1007
|
-
.attr('cx', (d) =>
|
|
1008
|
-
.attr('cy', (d) =>
|
|
1009
|
-
.
|
|
1010
|
-
.
|
|
884
|
+
.attr('cx', (d) => x(d.name) + x.bandwidth() / 2)
|
|
885
|
+
.attr('cy', (d) => lineYscale(d.value))
|
|
886
|
+
.style('cursor', 'pointer')
|
|
887
|
+
.attr('r', 3);
|
|
1011
888
|
if (this.chartConfiguration.lineGraphColor) {
|
|
1012
889
|
dot
|
|
1013
890
|
.append('text')
|
|
1014
|
-
.attr('class', '
|
|
1015
|
-
.attr('
|
|
1016
|
-
.
|
|
1017
|
-
.
|
|
1018
|
-
.attr('
|
|
1019
|
-
.attr('y', (d) => scales.lineYscale(d.value))
|
|
891
|
+
.attr('class', 'dot')
|
|
892
|
+
.attr('color', this.chartConfiguration.lineGraphColor)
|
|
893
|
+
.attr('style', 'font-size: .85em')
|
|
894
|
+
.attr('x', (d) => x(d.name) + x.bandwidth() / 2)
|
|
895
|
+
.attr('y', (d) => lineYscale(d.value))
|
|
1020
896
|
.attr('dy', '-1em')
|
|
1021
897
|
.text((d) => this.chartConfiguration.labelFormatter(d.value));
|
|
1022
898
|
}
|
|
1023
899
|
}
|
|
1024
900
|
handleClick(d) {
|
|
1025
|
-
if (this.chartData
|
|
901
|
+
if (this.chartData.metaData.hasDrillDown || d?.toggleFrom) {
|
|
1026
902
|
this.clickEvent.emit(d);
|
|
1027
903
|
}
|
|
1028
904
|
}
|
|
1029
905
|
handleHeaderMenuClick(id) {
|
|
1030
906
|
this.headerMenuclickEvent.emit(id);
|
|
1031
907
|
}
|
|
908
|
+
handleDD1Click(event) {
|
|
909
|
+
this.isDD1Open = true;
|
|
910
|
+
this.isDD2Open = false;
|
|
911
|
+
}
|
|
912
|
+
handleDD2Click(event) {
|
|
913
|
+
this.isDD2Open = true;
|
|
914
|
+
this.isDD1Open = false;
|
|
915
|
+
}
|
|
1032
916
|
handleCompareByFilterSelection(event) {
|
|
1033
917
|
this.clickEvent.emit(event);
|
|
1034
918
|
}
|
|
1035
|
-
handleZoominZoomoutClick({ isZoomOut, event }) {
|
|
1036
|
-
this.isZoomOutSelected(isZoomOut);
|
|
1037
|
-
}
|
|
1038
919
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1039
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GroupChartComponent, selector: "lib-group-chart", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["groupchartcontainer"], descendants: true, static: true }, { propertyName: "groupcontainerElt", first: true, predicate: ["groupcontainer"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n\r\n<div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n</div>\r\n\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n></lib-chart-header-v1>\r\n\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:35px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title:after{content:\"\";position:absolute;bottom:0;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-top-text{color:#000;font-size:14px;font-weight:600}.title-bar-name{color:#000;font-size:12px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:#4f4f4f;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV1Component, selector: "lib-chart-header-v1", inputs: ["isAlertEnabled", "title", "menuOptions", "isEditEnabled", "isria", "hasDrillDown", "selectedKpiTooltop"], outputs: ["menuOptionClickEvent"] }, { kind: "component", type: i4.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i5.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
920
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GroupChartComponent, selector: "lib-group-chart", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["groupchartcontainer"], descendants: true, static: true }, { propertyName: "groupcontainerElt", first: true, predicate: ["groupcontainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n\r\n<div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n</div>\r\n\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n></lib-chart-header-v1>\r\n\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n</div>\r\n", styles: [".lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1;font-size:1.2em}.lib-axis-group-label{font-size:.85em;font-weight:600;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.dots{font-size:10px}.inline__display{display:flex;justify-content:space-around;padding-top:2%}.verticalbar__text{font-style:normal;font-variant:normal;font-weight:400;font-size:13px;line-height:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;opacity:1}.lib-line-label-item{display:inline-block!important;font-size:.85em;margin-right:10px;font-weight:600}.lib-line-label-wrapper-vertical{display:flex;justify-content:center}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.title{background-color:#d9d9d9;height:35px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1}.title:after{content:\"\";position:absolute;bottom:0;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-top-text{color:#000;font-size:14px;font-weight:600}.title-bar-name{color:#000;font-size:12px;font-weight:700;text-transform:capitalize}.title-bottom-text{color:#4f4f4f;font-size:12px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}@media screen and (min-width: 1024px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1024px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:10px!important}.dots{font-size:10px!important}}@media screen and (min-width: 1366px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1366px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:12px!important}.dots{font-size:12px!important}}@media screen and (min-width: 1920px) and (min-height: 400px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 1920px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:14px!important}.dots{font-size:14px!important}}@media screen and (min-width: 2560px) and (min-height: 500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1000px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}.dots{font-size:16px!important}}@media screen and (min-width: 2560px) and (min-height: 1500px){.lib-stacked-y-axis-text text,.lib-stacked-x-axis-text text{font-size:16px!important}}.bottom__text{position:absolute!important;bottom:0!important;display:flex!important;justify-content:center!important;align-items:center!important;width:100%!important}.box__heightwidth{opacity:1;height:10px;width:10px;border:none!important;border-radius:50%}.label__text{margin-right:10px;display:flex;justify-content:center;align-items:center;font-style:normal;font-variant:normal;font-weight:400;font-size:10px;line-height:13px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;letter-spacing:.2px;color:#707070!important}.lib-verticalstack-labels-ontop-weklycharts{font-style:normal;font-variant:normal;font-weight:700;font-size:10px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.lib-verticalstack-title-ontop{font-style:normal;font-variant:normal;font-size:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.05px;text-anchor:middle;fill:#000}.marginLeft-20{margin-left:20px}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV1Component, selector: "lib-chart-header-v1", inputs: ["isAlertEnabled", "title", "menuOptions", "isEditEnabled", "isria", "hasDrillDown", "selectedKpiTooltop"], outputs: ["menuOptionClickEvent"] }, { kind: "component", type: i4.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i5.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1040
921
|
}
|
|
1041
922
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GroupChartComponent, decorators: [{
|
|
1042
923
|
type: Component,
|
|
@@ -1056,4 +937,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1056
937
|
}], headerMenuclickEvent: [{
|
|
1057
938
|
type: Output
|
|
1058
939
|
}] } });
|
|
1059
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2dyb3VwLWNoYXJ0L2dyb3VwLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ncm91cC1jaGFydC9ncm91cC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFnRGxELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUE4RXhEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUF0RUEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6RCx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQzNCLGFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVGLGNBQVMsR0FBRztZQUMz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d0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXNDO1FBQy9FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDOytHQWh2Q1UsbUJBQW1CO21HQUFuQixtQkFBbUIseWdCQy9EaEMsMDdDQXlDQTs7NEZEc0JhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsaUJBR1osaUJBQWlCLENBQUMsSUFBSTt3REFJckMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbEQsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBPbkNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFVuaXF1ZUlkIH0gZnJvbSAnLi4vdW5pcXVlLWlkJztcclxuaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuLy8gVHlwZXNcclxuaW50ZXJmYWNlIENoYXJ0RGF0YSB7XHJcbiAgZGF0YTogYW55W107XHJcbiAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGE7XHJcbiAgbGluZURhdGE/OiBhbnlbXTtcclxuICB0YXJnZXRMaW5lRGF0YT86IFRhcmdldExpbmVEYXRhO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ2hhcnRNZXRhRGF0YSB7XHJcbiAgdW5pdD86IHN0cmluZztcclxuICBpc0NDPzogYm9vbGVhbjtcclxuICBiYXJXaXRob3V0Q2xpY2s/OiBzdHJpbmdbXTtcclxuICBjb2xvcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAga2V5TGlzdDogc3RyaW5nW107XHJcbiAgZGF0YVR5cGU/OiBzdHJpbmc7XHJcbiAgaGFzRHJpbGxEb3duPzogYm9vbGVhbjtcclxuICBob3ZlckNvbG9yPzogc3RyaW5nO1xyXG4gIHlMYWJlbD86IHN0cmluZztcclxuICB4TGFiZWw/OiBzdHJpbmc7XHJcbiAgbGluZXlMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFRhcmdldExpbmVEYXRhIHtcclxuICB0YXJnZXQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG4gIHRhcmdldE5hbWU/OiBzdHJpbmc7XHJcbiAgYmFyQWJvdmVUYXJnZXRDb2xvcj86IHN0cmluZztcclxuICBiYXJBYm92ZVRhcmdldEhvdmVyQ29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBEaW1lbnNpb25zIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGNvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7XHJcbiAgYmFyV2lkdGg6IG51bWJlcjtcclxuICBiYXJQYWRkaW5nOiBudW1iZXI7XHJcbiAgcmVxdWlyZWRTdmdXaWR0aDogbnVtYmVyO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ncm91cC1jaGFydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncm91cC1jaGFydC5jb21wb25lbnQubGVzcycsICcuLi9jb21tb24tc3R5bGVzLmxlc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JvdXBDaGFydENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlke1xyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBncm91cGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogQ2hhcnREYXRhIHwgYW55IDtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjaGFydENvbmZpZ3VyYXRpb246IGFueSA9IHt9O1xyXG4gIGlzSGVhZGVyVmlzaWJsZSA9IHRydWU7XHJcbiAgaXNUb3BDYXB0aW9uVmlzaWJsZSA9IHRydWU7XHJcbiAgdW5pcXVlSWQgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPSBmYWxzZTtcclxuICBpc0NDID0gZmFsc2U7XHJcbiAgaXNab29tZWRPdXQgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IENPTlNUQU5UUyA9IHtcclxuICAgIFJJR0hUX1NWR19XSURUSDogNjAsXHJcbiAgICBMRUZUX1JJR0hUX1NQQUNFUzogNTAsXHJcbiAgICBTSE9SVF9USUNLX0xFTkdUSDogNCxcclxuICAgIExPTkdfVElDS19MRU5HVEg6IDE2LFxyXG4gICAgU0hPUlRfVElDS19MRU5HVEhfQkc6IDUsXHJcbiAgICBMT05HX1RJQ0tfTEVOR1RIX0JHOiAzMCxcclxuICAgIERFU0tUT1BfQkFSX1dJRFRIOiA0MCwgICAgICAvLyBEZXNrdG9wIGJhciB3aWR0aFxyXG4gICAgTU9CSUxFX0JBUl9XSURUSDogMjUsICAgICAgIC8vIE1vYmlsZS9UYWJsZXQgYmFyIHdpZHRoIChyZWR1Y2VkKVxyXG4gICAgQkFSX0dBUDogMzAsICAgICAgICAgICAgICAgIC8vIEdhcCBiZXR3ZWVuIGJhcnMgKGluY3JlYXNlZCBmb3IgYmV0dGVyIHNlcGFyYXRpb24pXHJcbiAgICBaT09NX1RIUkVTSE9MRDogMzAsXHJcbiAgICBaT09NX0lOX1RIUkVTSE9MRDogOCxcclxuICB9O1xyXG5cclxuICBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICBzdmdIZWlnaHQ6IDcwLFxyXG4gICAgbGVnZW5kSGVpZ2h0OiAnMTAlJyxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGFiZWxGb3JtYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB4QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgbGluZUdyYXBoQ29sb3I6ICcjRjZEMjgzJyxcclxuICAgIHNob3dMaW5lQ2hhcnRBeGlzOiB0cnVlLFxyXG4gICAgc2hvd0xlZ2VuZDogZmFsc2UsXHJcbiAgICBmb3JDb21wYXJpc29uOiB0cnVlLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgICB5QXhpc0dyaWQ6IGZhbHNlLFxyXG4gICAgLy8gT3B0aW9uYWwgY29uZmlncyB3aXRoIHVuZGVmaW5lZCBkZWZhdWx0c1xyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogdW5kZWZpbmVkLFxyXG4gICAgaXNUb3BDYXB0aW9uVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNNdWx0aUNoYXJ0R3JpZExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGlzRnVsbFNjcmVlbjogdW5kZWZpbmVkLFxyXG4gICAgY3VzdG9tWXNjYWxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzTGFiZWxIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0hpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0Rhc2hlZDogdW5kZWZpbmVkLFxyXG4gICAgaXNYYXhpc0NvbG9yOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0Rm9ybWF0dGVyOiB1bmRlZmluZWQsXHJcbiAgICBzaG93VG90YWxPblRvcDogdW5kZWZpbmVkLFxyXG4gICAgYmFja2VuZEZvcm1hdHRlckhhc1ByaW9yaXR5OiB1bmRlZmluZWQsXHJcbiAgICBzaG93QW5nbGVkTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICBpc05vQWx0ZXJuYXRlWGF4aXNUZXh0OiB1bmRlZmluZWQsXHJcbiAgICBpc1hncmlkQmV0d2VlbkxhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgc2hvd1hheGlzVG9wOiB1bmRlZmluZWQsXHJcbiAgICB4QXhpc0dyaWQ6IHVuZGVmaW5lZCxcclxuICAgIHhMYWJlbHNPblNhbWVMaW5lOiB1bmRlZmluZWQsXHJcbiAgICBoaWRlWGF4aXNUaWNrOiB1bmRlZmluZWQsXHJcbiAgICBpc0RyaWxsZG93bkNoYXJ0OiB1bmRlZmluZWQsXHJcbiAgICBpc1RhcmdldExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGRpc3BsYXlUaXRsZU9uVG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1RvZ2dsZVZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIHRoaXMucmVtb3ZlRXhpc3RpbmdDaGFydCgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplU3RhY2tlZENoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVtb3ZlRXhpc3RpbmdDaGFydCgpO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVTdGFja2VkQ2hhcnQoKTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1pvb21lZE91dCA9IGlzWm9vbU91dDtcclxuICAgIHRoaXMubmdPbkNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRXhpc3RpbmdDaGFydCgpIHtcclxuICAgIGQzLnNlbGVjdCgnIycgKyB0aGlzLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VDb25maWd1cmF0aW9ucygpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25ba2V5XSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAgICBrZXksXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWV0YURhdGEobWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBDaGFydE1ldGFEYXRhIHtcclxuICAgIGlmICghbWV0YURhdGEudW5pdCkgbWV0YURhdGEudW5pdCA9ICcnO1xyXG4gICAgaWYgKG1ldGFEYXRhLmlzQ0MpIHRoaXMuaXNDQyA9IG1ldGFEYXRhLmlzQ0M7XHJcbiAgICBcclxuICAgIGlmIChtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2s/Lmxlbmd0aCkge1xyXG4gICAgICBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgPSBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subWFwKGVsID0+IGVsLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWV0YURhdGEuYmFyV2l0aG91dENsaWNrID0gW107XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBtZXRhRGF0YTtcclxuICB9XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZURpbWVuc2lvbnMoXHJcbiAgY2hhcnRDb250YWluZXI6IGFueSxcclxuICB2ZXJ0aWNhbENvbnRhaW5lcjogYW55LFxyXG4gIG1hcmdpbjogYW55LFxyXG4gIGRhdGFMZW5ndGg6IG51bWJlclxyXG4pOiBEaW1lbnNpb25zIHtcclxuICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNoYXJ0Q29udGFpbmVyLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcclxuICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB2ZXJ0aWNhbENvbnRhaW5lci5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xyXG4gIFxyXG4gIGNvbnN0IGxlZnRBeGlzV2lkdGggPSA4MDtcclxuICBjb25zdCByaWdodEF4aXNXaWR0aCA9IHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSDtcclxuICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gbGVmdEF4aXNXaWR0aCAtIHJpZ2h0QXhpc1dpZHRoO1xyXG4gIFxyXG4gIGxldCB3aWR0aCA9IGF2YWlsYWJsZVdpZHRoO1xyXG4gIGxldCBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgKiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0IC8gMTAwKSAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tO1xyXG5cclxuICBpZiAoZGF0YUxlbmd0aCA+IHRoaXMuQ09OU1RBTlRTLlpPT01fVEhSRVNIT0xEICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIGNvbnN0IG1pbldpZHRoID0gZGF0YUxlbmd0aCAqIDI1O1xyXG4gICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluV2lkdGgpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRhdGFMZW5ndGggPiB0aGlzLkNPTlNUQU5UUy5aT09NX0lOX1RIUkVTSE9MRCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgd2lkdGggPSBkYXRhTGVuZ3RoICogMTMwO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgaGVpZ2h0ID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ICE9PSA4MFxyXG4gICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFxyXG4gICAgICA6IGNvbnRhaW5lckhlaWdodDtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIDEzMDtcclxuICB9XHJcblxyXG4gIGNvbnN0IGlzTW9iaWxlT3JUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMjQ7XHJcbiAgbGV0IGJhcldpZHRoOiBudW1iZXI7XHJcbiAgbGV0IGJhclBhZGRpbmc6IG51bWJlcjtcclxuICBcclxuICBpZiAoaXNNb2JpbGVPclRhYmxldCkge1xyXG4gICAgaWYgKGRhdGFMZW5ndGggPT09IDEpIHtcclxuICAgICAgYmFyV2lkdGggPSA2MDtcclxuICAgICAgYmFyUGFkZGluZyA9IDA7XHJcbiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDIpIHtcclxuICAgICAgYmFyV2lkdGggPSA1MDtcclxuICAgICAgYmFyUGFkZGluZyA9IDQ1O1xyXG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID09PSAzKSB7XHJcbiAgICAgIGJhcldpZHRoID0gNDU7XHJcbiAgICAgIGJhclBhZGRpbmcgPSA0MDtcclxuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA8PSA1KSB7XHJcbiAgICAgIGJhcldpZHRoID0gMzU7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAzMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhcldpZHRoID0gMjU7XHJcbiAgICAgIGJhclBhZGRpbmcgPSAyNTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgYmFyV2lkdGggPSB0aGlzLkNPTlNUQU5UUy5ERVNLVE9QX0JBUl9XSURUSDtcclxuICAgIGJhclBhZGRpbmcgPSB0aGlzLkNPTlNUQU5UUy5CQVJfR0FQO1xyXG4gIH1cclxuICBcclxuICBjb25zdCB0b3RhbEJhcnNXaWR0aCA9IGJhcldpZHRoICogZGF0YUxlbmd0aDtcclxuICBjb25zdCB0b3RhbEdhcHMgPSBiYXJQYWRkaW5nICogKGRhdGFMZW5ndGggLSAxKTtcclxuICBjb25zdCBtaW5SZXF1aXJlZFdpZHRoID0gdG90YWxCYXJzV2lkdGggKyB0b3RhbEdhcHMgKyAodGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMgKiAyKTtcclxuICBjb25zdCByZXF1aXJlZFN2Z1dpZHRoID0gTWF0aC5tYXgoYXZhaWxhYmxlV2lkdGgsIG1pblJlcXVpcmVkV2lkdGgpO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgd2lkdGgsXHJcbiAgICBoZWlnaHQsXHJcbiAgICBjb250YWluZXJXaWR0aCxcclxuICAgIGNvbnRhaW5lckhlaWdodCxcclxuICAgIGJhcldpZHRoLFxyXG4gICAgYmFyUGFkZGluZyxcclxuICAgIHJlcXVpcmVkU3ZnV2lkdGgsXHJcbiAgfTtcclxufVxyXG5cclxucHJpdmF0ZSBjcmVhdGVTdmdDb250YWluZXJzKFxyXG4gIGNoYXJ0Q29udGFpbmVyOiBhbnksXHJcbiAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcclxuICBtYXJnaW46IGFueSxcclxuICBoYXNYTGFiZWw6IGJvb2xlYW4gIC8vIEFkZCB0aGlzIHBhcmFtZXRlclxyXG4pIHtcclxuICAvLyBDYWxjdWxhdGUgdG90YWwgaGVpZ2h0IGluY2x1ZGluZyBzcGFjZSBmb3IgWC1heGlzIGxhYmVsIGlmIHByZXNlbnRcclxuICBjb25zdCB4TGFiZWxTcGFjZSA9IGhhc1hMYWJlbCA/IDMwIDogMDtcclxuICBjb25zdCB0b3RhbEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyB4TGFiZWxTcGFjZTtcclxuXHJcbiAgLy8gTWFpbiB3cmFwcGVyXHJcbiAgY29uc3QgY2hhcnRXcmFwcGVyID0gY2hhcnRDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAuYXR0cignaWQnLCB0aGlzLnVuaXF1ZUlkKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2NoYXJ0LXdyYXBwZXItbWFpbicpXHJcbiAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJylcclxuICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXHJcbiAgICAuc3R5bGUoJ2hlaWdodCcsIGAke3RvdGFsSGVpZ2h0fXB4YCk7ICAvLyBJbmNsdWRlIFgtbGFiZWwgc3BhY2VcclxuXHJcbmNvbnN0IGxlZnRBeGlzQ29udGFpbmVyID0gY2hhcnRXcmFwcGVyXHJcbiAgLmFwcGVuZCgnZGl2JylcclxuICAuYXR0cignY2xhc3MnLCAnbGVmdC1heGlzLWNvbnRhaW5lcicpXHJcbiAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gIC5zdHlsZSgndG9wJywgJzAnKVxyXG4gIC5zdHlsZSgnd2lkdGgnLCAnODBweCcpXHJcbiAgLnN0eWxlKCdoZWlnaHQnLCBgJHtkaW1lbnNpb25zLmhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tfXB4YClcclxuICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCAndmFyKC0tY2FyZC1iZyknKVxyXG4gIC5zdHlsZSgnei1pbmRleCcsICcxMCcpO1xyXG5cclxuY29uc3Qgc3ZnWUF4aXNMZWZ0ID0gbGVmdEF4aXNDb250YWluZXJcclxuICAuYXBwZW5kKCdzdmcnKVxyXG4gIC5hdHRyKCd3aWR0aCcsICc4MCcpXHJcbiAgLmF0dHIoJ2hlaWdodCcsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgLmFwcGVuZCgnZycpXHJcbiAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoNzksJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgLy8gUmlnaHQgWS1heGlzIC0gRml4ZWRcclxuICBjb25zdCByaWdodEF4aXNDb250YWluZXIgPSBjaGFydFdyYXBwZXJcclxuICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAncmlnaHQtYXhpcy1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAuc3R5bGUoJ3JpZ2h0JywgJzAnKVxyXG4gICAgLnN0eWxlKCd0b3AnLCAnMCcpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgYCR7dGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIfXB4YClcclxuICAgIC5zdHlsZSgnaGVpZ2h0JywgYCR7ZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbX1weGApICAvLyBFeGNsdWRlIFgtbGFiZWwgc3BhY2VcclxuICAgIC5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICd2YXIoLS1jYXJkLWJnKScpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAnMTAnKTtcclxuXHJcbiAgY29uc3Qgc3ZnWUF4aXNSaWdodCA9IHJpZ2h0QXhpc0NvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBkaW1lbnNpb25zLmhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIFNjcm9sbGFibGUgbWlkZGxlIGFyZWFcclxuY29uc3Qgc2Nyb2xsYWJsZUNvbnRhaW5lciA9IGNoYXJ0V3JhcHBlclxyXG4gIC5hcHBlbmQoJ2RpdicpXHJcbiAgLmF0dHIoJ2NsYXNzJywgJ3Njcm9sbGFibGUtY2hhcnQtY29udGFpbmVyJylcclxuICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAuc3R5bGUoJ2xlZnQnLCAnODBweCcpICAvLyBFeGFjdGx5IHdoZXJlIGxlZnQgY29udGFpbmVyIGVuZHNcclxuICAuc3R5bGUoJ3JpZ2h0JywgYCR7dGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIfXB4YClcclxuICAuc3R5bGUoJ3RvcCcsICcwJylcclxuICAuc3R5bGUoJ3dpZHRoJywgJ2F1dG8nKVxyXG4gIC5zdHlsZSgnaGVpZ2h0JywgYCR7ZGltZW5zaW9ucy5oZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbX1weGApXHJcbiAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKVxyXG4gIC5zdHlsZSgnb3ZlcmZsb3cteScsICdoaWRkZW4nKTtcclxuXHJcblxyXG5jb25zdCBpbm5lckNvbnRhaW5lciA9IHNjcm9sbGFibGVDb250YWluZXJcclxuICAuYXBwZW5kKCdkaXYnKVxyXG4gIC5hdHRyKCdjbGFzcycsICdpbm5lci1jaGFydC1jb250YWluZXInKVxyXG4gIC5zdHlsZSgnbWluLXdpZHRoJywgJzEwMCUnKTtcclxuXHJcbmNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgLmFwcGVuZCgnc3ZnJylcclxuICAuYXR0cignd2lkdGgnLCBkaW1lbnNpb25zLnJlcXVpcmVkU3ZnV2lkdGgpXHJcbiAgLmF0dHIoJ2hlaWdodCcsIGRpbWVuc2lvbnMuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAzMClcclxuICAuYXBwZW5kKCdnJylcclxuICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIEZpeGVkIGJvdHRvbSBjb250YWluZXIgZm9yIFgtYXhpcyBsYWJlbFxyXG4gIGNvbnN0IGJvdHRvbUxhYmVsQ29udGFpbmVyID0gY2hhcnRXcmFwcGVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2JvdHRvbS1sYWJlbC1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAuc3R5bGUoJ2xlZnQnLCAnODBweCcpXHJcbiAgICAuc3R5bGUoJ3JpZ2h0JywgYCR7dGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIfXB4YClcclxuICAgIC5zdHlsZSgnYm90dG9tJywgJzAnKVxyXG4gICAgLnN0eWxlKCdoZWlnaHQnLCBgJHt4TGFiZWxTcGFjZX1weGApXHJcbiAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnZmxleCcpXHJcbiAgICAuc3R5bGUoJ2p1c3RpZnktY29udGVudCcsICdjZW50ZXInKVxyXG4gICAgLnN0eWxlKCdhbGlnbi1pdGVtcycsICdjZW50ZXInKVxyXG4gICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJ3ZhcigtLWNhcmQtYmcpJylcclxuICAgIC5zdHlsZSgnei1pbmRleCcsICcxMCcpO1xyXG5cclxuICByZXR1cm4geyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgaW5uZXJDb250YWluZXIsIGJvdHRvbUxhYmVsQ29udGFpbmVyIH07XHJcbn1cclxuXHJcbnByaXZhdGUgY3JlYXRlU2NhbGVzKFxyXG4gIGRhdGE6IGFueVtdLFxyXG4gIGxheWVyczogYW55W10sXHJcbiAgbGluZURhdGE6IGFueVtdLFxyXG4gIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNcclxuKSB7XHJcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBiYXJXaWR0aCwgYmFyUGFkZGluZyB9ID0gZGltZW5zaW9ucztcclxuICBcclxuICAvLyBDYWxjdWxhdGUgYmFyIHBvc2l0aW9uaW5nXHJcbiAgY29uc3QgdG90YWxCYXJzV2lkdGggPSBkYXRhLmxlbmd0aCAqIGJhcldpZHRoO1xyXG4gIGNvbnN0IHRvdGFsU3BhY2luZyA9IChkYXRhLmxlbmd0aCAtIDEpICogYmFyUGFkZGluZztcclxuICBjb25zdCByZXF1aXJlZFdpZHRoID0gdG90YWxCYXJzV2lkdGggKyB0b3RhbFNwYWNpbmcgKyAodGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMgKiAyKTtcclxuICBjb25zdCBlZmZlY3RpdmVXaWR0aCA9IE1hdGgubWF4KHdpZHRoLCByZXF1aXJlZFdpZHRoKTtcclxuICBcclxuICBjb25zdCBwYWRkaW5nUmF0aW8gPSBiYXJQYWRkaW5nIC8gKGJhcldpZHRoICsgYmFyUGFkZGluZyk7XHJcbiAgXHJcbiAgLy8gWC1zY2FsZSBzdGFydHMgZnJvbSAwIChubyBsZWZ0IHNwYWNpbmcgZm9yIGdyaWQgYWxpZ25tZW50KVxyXG5jb25zdCB4U2NhbGUgPSBkM1xyXG4gIC5zY2FsZUJhbmQoKVxyXG4gIC5yYW5nZVJvdW5kKFswLCBkaW1lbnNpb25zLnJlcXVpcmVkU3ZnV2lkdGhdKVxyXG4gIC5kb21haW4oZGF0YS5tYXAoZCA9PiBkLm5hbWUpLnJldmVyc2UoKSlcclxuICAucGFkZGluZ0lubmVyKHBhZGRpbmdSYXRpbylcclxuICAucGFkZGluZ091dGVyKDAuMSkgIC8vIFNtYWxsIHBhZGRpbmcgZm9yIHZpc3VhbCBzcGFjaW5nXHJcbiAgLmFsaWduKDAuNSk7XHJcblxyXG4gIGNvbnN0IHhTY2FsZUZyb21PcmlnaW4gPSBkM1xyXG4gICAgLnNjYWxlQmFuZCgpXHJcbiAgICAucmFuZ2VSb3VuZChbd2lkdGgsIDBdKVxyXG4gICAgLmRvbWFpbihkYXRhLm1hcChkID0+IGQubmFtZSkucmV2ZXJzZSgpKTtcclxuXHJcbiAgY29uc3QgeVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5yYW5nZVJvdW5kKFtoZWlnaHQsIDBdKTtcclxuICBcclxuICBsZXQgbWF4VmFsdWUgPSBkMy5tYXgobGF5ZXJzLCAoZDogYW55KSA9PiBkMy5tYXgoZCwgKGQ6IGFueSkgPT4gZFsxXSkpO1xyXG4gIFxyXG4gIGlmIChtYXhWYWx1ZSA9PT0gMCkge1xyXG4gICAgbWF4VmFsdWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSBcclxuICAgICAgPyBOdW1iZXIodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSArIDIwIFxyXG4gICAgICA6IDEwMDtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgIG1heFZhbHVlICo9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJiBtYXhWYWx1ZSA8IE51bWJlcih0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpKSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBOdW1iZXIodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPCAxMCAmJiB0YXJnZXQgPCAxMCA/IHRhcmdldCArIDMgOiB0YXJnZXQgKyAyMDtcclxuICB9XHJcblxyXG4gIHlTY2FsZS5kb21haW4oWzAsIG1heFZhbHVlXSkubmljZSgpO1xyXG5cclxuICBsZXQgbGluZVlzY2FsZSA9IG51bGw7XHJcbiAgaWYgKGxpbmVEYXRhKSB7XHJcbiAgICBsaW5lWXNjYWxlID0gZDNcclxuICAgICAgLnNjYWxlTGluZWFyKClcclxuICAgICAgLmRvbWFpbihbMCwgZDMubWF4KGxpbmVEYXRhLCBkID0+ICtkLnZhbHVlKV0pXHJcbiAgICAgIC5yYW5nZShbaGVpZ2h0LCAwXSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyB4U2NhbGUsIHhTY2FsZUZyb21PcmlnaW4sIHlTY2FsZSwgbGluZVlzY2FsZSB9O1xyXG59XHJcblxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUF4ZXMoc2NhbGVzOiBhbnkpIHtcclxuICAgIGNvbnN0IHhBeGlzID0gZDNcclxuICAgICAgLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSlcclxuICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgIC50aWNrRm9ybWF0KHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzTGFiZWxGb21hdHRlcik7XHJcblxyXG4gICAgY29uc3QgeUF4aXMgPSBkM1xyXG4gICAgICAuYXhpc0xlZnQoc2NhbGVzLnlTY2FsZSlcclxuICAgICAgLnRpY2tzKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAudGlja1NpemUoMClcclxuICAgICAgLnRpY2tGb3JtYXQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICBsZXQgeUxpbmVBeGlzID0gbnVsbDtcclxuICAgIGlmIChzY2FsZXMubGluZVlzY2FsZSkge1xyXG4gICAgICB5TGluZUF4aXMgPSBkM1xyXG4gICAgICAgIC5heGlzUmlnaHQoc2NhbGVzLmxpbmVZc2NhbGUpXHJcbiAgICAgICAgLnRpY2tzKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAgIC50aWNrRm9ybWF0KHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlMaW5lQXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHhBeGlzLCB5QXhpcywgeUxpbmVBeGlzIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckJhcnMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIGxheWVyczogYW55W10sXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLFxyXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9uc1xyXG4gICkge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnLmxheWVyJylcclxuICAgICAgLmRhdGEobGF5ZXJzKVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xheWVyJylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgKGQ6IGFueSkgPT4gbWV0YURhdGEuY29sb3JzW2Qua2V5XSk7XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IGxheWVyXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAuZGF0YSgoZDogYW55KSA9PiBkKVxyXG4gICAgICAuZW50ZXIoKTtcclxuXHJcbiAgICB0aGlzLmFwcGVuZFJlY3RhbmdsZXMocmVjdCwgc2NhbGVzLCBtZXRhRGF0YSwgZGltZW5zaW9ucyk7XHJcbiAgICB0aGlzLmFkZEludGVyYWN0aW9ucyhyZWN0LCBzdmcsIG1ldGFEYXRhLCBzY2FsZXMpO1xyXG4gICAgXHJcbiAgICByZXR1cm4gcmVjdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwZW5kUmVjdGFuZ2xlcyhcclxuICByZWN0OiBhbnksXHJcbiAgc2NhbGVzOiBhbnksXHJcbiAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgZGltZW5zaW9uczogRGltZW5zaW9uc1xyXG4pIHtcclxuICBjb25zdCB7IGJhcldpZHRoLCBiYXJQYWRkaW5nIH0gPSBkaW1lbnNpb25zO1xyXG4gIGNvbnN0IHsgeFNjYWxlLCB5U2NhbGUgfSA9IHNjYWxlcztcclxuXHJcbiAgcmVjdFxyXG4gICAgLmFwcGVuZCgncmVjdCcpXHJcbiAgICAub24oJ2NsaWNrJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuY2hhcnREYXRhLmxpbmVEYXRhIHx8IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmZvckNvbXBhcmlzb24pIHtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljaz8uaW5jbHVkZXMoZC5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlQ2xpY2soZC5kYXRhLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWlzTmFOKGRbMF0pICYmICFpc05hTihkWzFdKSkge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IHlTY2FsZShkWzBdKSAtIHlTY2FsZShkWzFdKTtcclxuICAgICAgICByZXR1cm4gYWN0dWFsSGVpZ2h0IDwgMyA/IHlTY2FsZShkWzBdKSAtIDMgOiB5U2NhbGUoZFsxXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoJ3gnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHhQb3NpdGlvbiA9IHhTY2FsZShkLmRhdGEubmFtZSk7XHJcbiAgICAgIGNvbnN0IGJhbmR3aWR0aCA9IHhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgICAgXHJcbiAgICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgICByZXR1cm4geFBvc2l0aW9uICsgKGJhbmR3aWR0aCAtIGJhcldpZHRoKSAvIDI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gMykge1xyXG4gICAgICAgIHJldHVybiB4UG9zaXRpb24gKyBiYW5kd2lkdGggLyAyIC0gMzU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY2FsY3VsYXRlZFdpZHRoID0gYmFuZHdpZHRoICogMC44O1xyXG4gICAgICByZXR1cm4geFBvc2l0aW9uICsgKGJhbmR3aWR0aCAtIGNhbGN1bGF0ZWRXaWR0aCkgLyAyO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKCdoZWlnaHQnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghaXNOYU4oZFswXSkgJiYgIWlzTmFOKGRbMV0pKSB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0geVNjYWxlKGRbMF0pIC0geVNjYWxlKGRbMV0pO1xyXG4gICAgICAgIHJldHVybiBhY3R1YWxIZWlnaHQgPCAzID8gMyA6IGFjdHVhbEhlaWdodDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pXHJcbiAgICAuYXR0cignd2lkdGgnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHJldHVybiBiYXJXaWR0aDtcclxuICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggPD0gMykge1xyXG4gICAgICAgIHJldHVybiA3MDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4geFNjYWxlLmJhbmR3aWR0aCgpICogMC44O1xyXG4gICAgfSlcclxuICAgIC5zdHlsZSgnY3Vyc29yJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICAgICAgaWYgKG1ldGFEYXRhLmJhcldpdGhvdXRDbGljaz8uaW5jbHVkZXMoZC5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgIHJldHVybiAnZGVmYXVsdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAncG9pbnRlcic7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICdkZWZhdWx0JztcclxuICAgIH0pXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldEJhckNvbG9yKGQsIG1ldGFEYXRhKSk7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCYXJDb2xvcihkOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChcclxuICAgICAgIWlzTmFOKGRbMF0pICYmXHJcbiAgICAgICFpc05hTihkWzFdKSAmJlxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICBwYXJzZUZsb2F0KGRbMV0pIC0gcGFyc2VGbG9hdChkWzBdKSA+PSBwYXJzZUZsb2F0KFN0cmluZyh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5iYXJBYm92ZVRhcmdldENvbG9yIHx8IG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkSW50ZXJhY3Rpb25zKHJlY3Q6IGFueSwgc3ZnOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBzY2FsZXM6IGFueSkge1xyXG4gICAgcmVjdFxyXG4gICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGQ6IGFueSkgPT4gdGhpcy5oYW5kbGVNb3VzZU92ZXIoZCwgc3ZnLCBtZXRhRGF0YSwgc2NhbGVzKSlcclxuICAgICAgLm9uKCdtb3VzZW91dCcsIChkOiBhbnkpID0+IHRoaXMuaGFuZGxlTW91c2VPdXQoc3ZnLCBtZXRhRGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZU92ZXIoZDogYW55LCBzdmc6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHNjYWxlczogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wKSByZXR1cm47XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgIC5maWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YSA9PT0gZClcclxuICAgICAgLnN0eWxlKCdmaWxsJywgKGQ6IGFueSkgPT4gdGhpcy5nZXRIb3ZlckNvbG9yKGQsIG1ldGFEYXRhKSk7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5VG9vbHRpcChkLCBzdmcsIG1ldGFEYXRhLCBzY2FsZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIb3ZlckNvbG9yKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBzdHJpbmcge1xyXG4gICAgaWYgKFxyXG4gICAgICAhaXNOYU4oZFswXSkgJiZcclxuICAgICAgIWlzTmFOKGRbMV0pICYmXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgIHBhcnNlRmxvYXQoZFsxXSkgLSBwYXJzZUZsb2F0KGRbMF0pID49IHBhcnNlRmxvYXQoU3RyaW5nKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmJhckFib3ZlVGFyZ2V0SG92ZXJDb2xvciB8fFxyXG4gICAgICAgICAgICAgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuYmFyQWJvdmVUYXJnZXRDb2xvciB8fFxyXG4gICAgICAgICAgICAgbWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXRhRGF0YS5ob3ZlckNvbG9yIHx8IG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BsYXlUb29sdGlwKGQ6IGFueSwgc3ZnOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBzY2FsZXM6IGFueSkge1xyXG4gICAgY29uc3QgeyB4U2NhbGUsIHlTY2FsZSB9ID0gc2NhbGVzO1xyXG4gICAgY29uc3QgdmFsdWUgPSBkWzFdIC0gZFswXTtcclxuICAgIFxyXG4gICAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGJhbmR3aWR0aCA9IHhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgIFxyXG4gICAgLy8gRml4ZWQgdG9vbHRpcCB3aWR0aCBmb3IgYWxsIHJlc29sdXRpb25zXHJcbiAgICBjb25zdCB3aWR0aCA9IC93ZWVrL2kudGVzdChkLmRhdGEubmFtZSkgJiYgL1xcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KGQuZGF0YS5uYW1lKVxyXG4gICAgICA/ICcyNTBweCdcclxuICAgICAgOiBiYW5kd2lkdGggKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIgPiAxODBcclxuICAgICAgICA/ICcxODBweCdcclxuICAgICAgICA6IGJhbmR3aWR0aCArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMjtcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKCd4JywgdGhpcy5jYWxjdWxhdGVUb29sdGlwWChkLCB4U2NhbGUsIHdpZHRoKSlcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgICAgLmF0dHIoJ3knLCB5U2NhbGUoZFsxXSkgLSA1MSlcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCA0MClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgOTkpXHJcbiAgICAgIC5odG1sKHRoaXMuZ2VuZXJhdGVUb29sdGlwSHRtbChkLCBtZXRhRGF0YSwgdmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlVG9vbHRpcFgoZDogYW55LCB4U2NhbGU6IGFueSwgd2lkdGg6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBiYW5kd2lkdGggPSB4U2NhbGUuYmFuZHdpZHRoKCk7XHJcbiAgICBjb25zdCBudW1lcmljV2lkdGggPSB0eXBlb2Ygd2lkdGggPT09ICdzdHJpbmcnID8gcGFyc2VJbnQod2lkdGgpIDogd2lkdGg7XHJcbiAgICBcclxuICAgIGlmIChiYW5kd2lkdGggKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIgPiAxODApIHtcclxuICAgICAgcmV0dXJuIHhTY2FsZShkLmRhdGEubmFtZSkgLSB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyArXHJcbiAgICAgICAgICAgICAoYmFuZHdpZHRoICsgdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMgKiAyIC0gMTgwKSAvIDI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geFNjYWxlKGQuZGF0YS5uYW1lKSAtIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVRvb2x0aXBIdG1sKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gJzxzcGFuIGNsYXNzPVwidGl0bGUtdG9wLXRleHRcIj4wPC9zcGFuPic7XHJcblxyXG4gICAgY29uc3QgZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICAgIGNvbnN0IG5hbWUgPSBkLmRhdGEubmFtZSA/IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JHtkLmRhdGEubmFtZX08L3NwYW4+YCA6ICcnO1xyXG4gICAgY29uc3QgdmFsdWVUZXh0ID0gbWV0YURhdGEudW5pdFxyXG4gICAgICA/IGAke21ldGFEYXRhLnVuaXR9JHt2YWx1ZX0gJHtkYXRhVHlwZX1gXHJcbiAgICAgIDogYCR7dmFsdWV9ICR7ZGF0YVR5cGV9YDtcclxuXHJcbiAgICByZXR1cm4gYCR7bmFtZX08c3BhbiBjbGFzcz1cInRpdGxlLXRvcC10ZXh0XCI+JHt2YWx1ZVRleHR9PC9zcGFuPmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3V0KHN2ZzogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSkge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCkgcmV0dXJuO1xyXG5cclxuICAgIHN2Zy5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAoZDogYW55KSA9PiB0aGlzLmdldEJhckNvbG9yKGQsIG1ldGFEYXRhKSk7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQXhpc0xhYmVscyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNMZWZ0OiBhbnksXHJcbiAgICBib3R0b21MYWJlbENvbnRhaW5lcjogYW55LFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxyXG4gICAgbWFyZ2luOiBhbnlcclxuICApIHtcclxuICAgIGlmIChtZXRhRGF0YS55TGFiZWwpIHtcclxuICAgICAgdGhpcy5hZGRZQXhpc0xhYmVsKHN2Z1lBeGlzTGVmdCwgbWV0YURhdGEueUxhYmVsLCBkaW1lbnNpb25zLmhlaWdodCwgbWFyZ2luKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICAgIHRoaXMuYWRkWEF4aXNMYWJlbChib3R0b21MYWJlbENvbnRhaW5lciwgbWV0YURhdGEueExhYmVsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkWUF4aXNMYWJlbChzdmdZQXhpc0xlZnQ6IGFueSwgbGFiZWw6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIsIG1hcmdpbjogYW55KSB7XHJcbiAgICBjb25zdCBpc3JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uPy5pc1JpYTtcclxuICAgIGNvbnN0IGlzQWNyb255bSA9IHRoaXMuaXNBY3JvbnltTGFiZWwobGFiZWwpO1xyXG4gICAgY29uc3QgeVBvc2l0aW9uID0gaXNyaWEgPyAtbWFyZ2luLmxlZnQgLyAyIC0gMzAgOiAtbWFyZ2luLmxlZnQgLyAyIC0gNDA7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0LnNlbGVjdEFsbCgnLmxpYi1heGlzLWdyb3VwLWxhYmVsLCAubGliLXlsYWJlbC1kcmlsbGRvd25jaGFydHMsIC5saWIteWxhYmVsLXdlZWtseUNoYXJ0cycpLnJlbW92ZSgpO1xyXG5cclxuICAgIHN2Z1lBeGlzTGVmdFxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgdGhpcy5nZXRZQXhpc0xhYmVsQ2xhc3MoKSlcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIC1oZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChpc0Fjcm9ueW0gPyBsYWJlbC50b1VwcGVyQ2FzZSgpIDogbGFiZWwudG9Mb3dlckNhc2UoKSlcclxuICAgICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyb255bSA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbiAgfVxyXG5cclxucHJpdmF0ZSBhZGRYQXhpc0xhYmVsKGJvdHRvbUxhYmVsQ29udGFpbmVyOiBhbnksIGxhYmVsOiBzdHJpbmcpIHtcclxuICBjb25zdCBpc0Fjcm9ueW0gPSB0aGlzLmlzQWNyb255bUxhYmVsKGxhYmVsKTtcclxuXHJcbiAgYm90dG9tTGFiZWxDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgLnN0eWxlKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JylcclxuICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcclxuICAgIC5zdHlsZSgnZm9udC1mYW1pbHknLCAnc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvJylcclxuICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyb255bSA/ICdub25lJyA6ICdjYXBpdGFsaXplJylcclxuICAgIC50ZXh0KGlzQWNyb255bSA/IGxhYmVsLnRvVXBwZXJDYXNlKCkgOiBsYWJlbC50b0xvd2VyQ2FzZSgpKTtcclxufVxyXG5cclxuICBwcml2YXRlIGlzQWNyb255bUxhYmVsKGxhYmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNsZWFuTGFiZWwgPSBsYWJlbC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpO1xyXG4gICAgcmV0dXJuIChsYWJlbC5sZW5ndGggPD0gNCAmJiAvXltBLVpdKyQvLnRlc3QobGFiZWwpKSB8fFxyXG4gICAgICAgICAgIChsYWJlbCA9PT0gbGFiZWwudG9VcHBlckNhc2UoKSAmJiAvW0EtWl0vLnRlc3QobGFiZWwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0WUF4aXNMYWJlbENsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi15bGFiZWwtZHJpbGxkb3duY2hhcnRzYDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi15bGFiZWwtd2Vla2x5Q2hhcnRzYDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtiYXNlQ2xhc3N9IGxpYi1heGlzLXdhdGVyZmFsbC1sYWJlbGA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFhBeGlzTGFiZWxDbGFzcygpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJhc2VDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWIteGxhYmVsLWRyaWxsZG93bmNoYXJ0c2A7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWIteGxhYmVsLXdlZWtseUNoYXJ0c2A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzfSBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWxgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJHcmlkc0Zyb21MZWZ0QXhpcyhcclxuICAgIHN2Z01haW46IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbiAgKSB7XHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFdlIHdhbnQgaG9yaXpvbnRhbCBncmlkIGxpbmVzIHRvIHNwYW4gdGhlIGZ1bGwgdmlzaWJsZSB3aWR0aDpcclxuICAgIC8vIHRoZSBpbm5lciBTVkcgKHJlcXVpcmVkU3ZnV2lkdGgpIHBsdXMgdGhlIHJpZ2h0IGF4aXMgd2lkdGguXHJcbiAgICBjb25zdCBncmlkU3BhbiA9IGRpbWVuc2lvbnMucmVxdWlyZWRTdmdXaWR0aCArIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSDtcclxuICAgIC8vIEFwcGVuZCB0aGUgZ3JpZCB0byB0aGUgbWFpbiAoaW5uZXIpIFNWRyBzbyBsaW5lcyBhcmUgcmVuZGVyZWQgYWNyb3NzIHRoZSBzY3JvbGxhYmxlIGFyZWEuXHJcbiAgICBzdmdNYWluXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCBob3Jpem9udGFsLWdyaWQtZnJvbS1sZWZ0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKFxyXG4gICAgICAgIGQzXHJcbiAgICAgICAgICAuYXhpc0xlZnQoc2NhbGVzLnlTY2FsZSlcclxuICAgICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgIC50aWNrU2l6ZSgtZ3JpZFNwYW4pXHJcbiAgICAgICAgICAudGlja0Zvcm1hdCgnJylcclxuICAgICAgKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IpJylcclxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzEnKVxyXG4gICAgICAuY2FsbCgoZzogYW55KSA9PiB7XHJcbiAgICAgICAgZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKTtcclxuICAgICAgICBnLnNlbGVjdEFsbCgnLnRpY2sgbGluZScpXHJcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yKScpXHJcbiAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKTtcclxuICAgICAgfSk7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUNvbmZpZ3VyYXRpb25GbGFncygpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzSGVhZGVyVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RvcENhcHRpb25WaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc1RvcENhcHRpb25WaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUb3BDYXB0aW9uVmlzaWJsZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVTdGFja2VkQ2hhcnQoKSB7XHJcbiAgICAvLyBVc2UgZml4ZWQgY29uZmlndXJhdGlvbiBmb3IgYWxsIHJlc29sdXRpb25zXHJcbiAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiA0MCwgbGVmdDogNDAgfTtcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzID0gNTtcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCA9IDcwO1xyXG4gICAgXHJcbiAgICB0aGlzLm1lcmdlQ29uZmlndXJhdGlvbnMoKTtcclxuICAgIHRoaXMuYXBwbHlDb25maWd1cmF0aW9uRmxhZ3MoKTtcclxuXHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICAgIGNvbnN0IG1ldGFEYXRhID0gdGhpcy5wcmVwYXJlTWV0YURhdGEodGhpcy5jaGFydERhdGEubWV0YURhdGEpO1xyXG4gICAgY29uc3QgbGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5saW5lRGF0YTtcclxuICAgIGNvbnN0IGNvbG9ycyA9IG1ldGFEYXRhLmNvbG9ycztcclxuICAgIGNvbnN0IGtleUxpc3QgPSBtZXRhRGF0YS5rZXlMaXN0O1xyXG5cclxuICAgIGNvbnN0IGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZ3JvdXBjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoXHJcbiAgICAgIGNoYXJ0Q29udGFpbmVyLFxyXG4gICAgICB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgZGF0YS5sZW5ndGhcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaGFzWExhYmVsID0gISFtZXRhRGF0YS54TGFiZWw7XHJcblxyXG4gICAgY29uc3QgeyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgYm90dG9tTGFiZWxDb250YWluZXIgfSA9IHRoaXMuY3JlYXRlU3ZnQ29udGFpbmVycyhcclxuICAgICAgY2hhcnRDb250YWluZXIsXHJcbiAgICAgIGRpbWVuc2lvbnMsXHJcbiAgICAgIG1hcmdpbixcclxuICAgICAgaGFzWExhYmVsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHN0YWNrOiBhbnkgPSBkMy5zdGFjaygpLmtleXMoa2V5TGlzdCkub2Zmc2V0KGQzLnN0YWNrT2Zmc2V0Tm9uZSk7XHJcbiAgICBjb25zdCBsYXllcnM6IGFueSA9IHN0YWNrKGRhdGEpO1xyXG4gICAgZGF0YS5zb3J0KChhLCBiKSA9PiBiLnRvdGFsIC0gYS50b3RhbCk7XHJcblxyXG4gICAgY29uc3Qgc2NhbGVzID0gdGhpcy5jcmVhdGVTY2FsZXMoZGF0YSwgbGF5ZXJzLCBsaW5lRGF0YSwgZGltZW5zaW9ucyk7XHJcbiAgICBjb25zdCBheGVzID0gdGhpcy5jcmVhdGVBeGVzKHNjYWxlcyk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJHcmlkc0Zyb21MZWZ0QXhpcyhzdmcsIHN2Z1lBeGlzTGVmdCwgc2NhbGVzLCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMucmVuZGVyR3JpZHMoc3ZnLCBzY2FsZXMsIGRpbWVuc2lvbnMpO1xyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyQmFycyhzdmcsIGxheWVycywgc2NhbGVzLCBtZXRhRGF0YSwgZGltZW5zaW9ucyk7XHJcbiAgICB0aGlzLnJlbmRlckF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGF4ZXMsIHNjYWxlcywgZGltZW5zaW9ucywgZGF0YSk7XHJcbiAgICB0aGlzLnJlbmRlckF4aXNMYWJlbHMoc3ZnLCBzdmdZQXhpc0xlZnQsYm90dG9tTGFiZWxDb250YWluZXIsIG1ldGFEYXRhLCBkaW1lbnNpb25zLCBtYXJnaW4pO1xyXG4gICAgdGhpcy5yZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgc2NhbGVzLCBkaW1lbnNpb25zLCBtZXRhRGF0YSk7XHJcbiAgICB0aGlzLnJlbmRlckRhdGFMYWJlbHMocmVjdCwgc2NhbGVzLCBtZXRhRGF0YSwgZGltZW5zaW9ucyk7XHJcbiAgICB0aGlzLnJlbmRlckxpbmVDaGFydChzdmcsIGxpbmVEYXRhLCBzY2FsZXMsIGNvbG9ycywgbWV0YURhdGEpO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgcmVuZGVyR3JpZHMoc3ZnOiBhbnksIHNjYWxlczogYW55LCBkaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkIHZlcnRpY2FsLWdyaWQnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3NjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyfSwke2RpbWVuc2lvbnMuaGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHNjYWxlcy54U2NhbGUpLnRpY2tTaXplKC1kaW1lbnNpb25zLmhlaWdodCkudGlja0Zvcm1hdCgnJykpXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJyM5OTk5OTknKVxyXG4gICAgICAuY2FsbCgoZzogYW55KSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWQpIHtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNHcmlkLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsIGB4JHtqICsgMn0gYXhpcyR7aiArIDJ9YClcclxuICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IpJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7ZGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0dyaWRbal19KWApXHJcbiAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbShzY2FsZXMueFNjYWxlKS50aWNrU2l6ZSgwKS50aWNrcyg1KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQXhlcyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNMZWZ0OiBhbnksXHJcbiAgICBzdmdZQXhpc1JpZ2h0OiBhbnksXHJcbiAgICBheGVzOiBhbnksXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBkYXRhOiBhbnlbXVxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dYYXhpc1RvcCkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWxpbmUtYXhpcy10ZXh0IGxpYi1saW5lLXgtYXhpcy10ZXh0IHgtYXhpcycpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oc2NhbGVzLnhTY2FsZSkudGlja1NpemUoMCkpO1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcueC1heGlzID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyU3RhbmRhcmRBeGVzKHN2ZywgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zLCBkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLnJlbmRlckRyaWxsZG93bkF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGF4ZXMsIHNjYWxlcywgZGltZW5zaW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlck11bHRpQ2hhcnRBeGVzKHN2ZywgYXhlcywgc2NhbGVzLCBkaW1lbnNpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwcGx5QXhpc1N0eWxpbmcoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQpO1xyXG4gICAgdGhpcy5hcHBseUF4aXNDb25maWd1cmF0aW9ucyhzdmcsIHNjYWxlcywgZGltZW5zaW9ucywgZGF0YSk7XHJcbiAgfVxyXG5cclxucHJpdmF0ZSByZW5kZXJTdGFuZGFyZEF4ZXMoXHJcbiAgc3ZnOiBhbnksXHJcbiAgYXhlczogYW55LFxyXG4gIHNjYWxlczogYW55LFxyXG4gIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgZGF0YTogYW55W11cclxuKSB7XHJcbiAgY29uc3QgaXNNb2JpbGVPclRhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyNDtcclxuICBcclxuICAvLyBYLWF4aXMgd2l0aCBsYWJlbHNcclxuICBjb25zdCB4QXhpc0dyb3VwID0gc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCcpXHJcbiAgICAuY2FsbChheGVzLnhBeGlzKTtcclxuXHJcbiAgLy8gU3R5bGUgWC1heGlzIGxhYmVsc1xyXG4gIHhBeGlzR3JvdXBcclxuICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgaXNNb2JpbGVPclRhYmxldCA/ICcxMHB4JyA6ICcxMnB4JylcclxuICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgLmF0dHIoJ2R5JywgJzFlbScpXHJcbiAgICAuZWFjaChmdW5jdGlvbih0aGlzOiBTVkdUZXh0RWxlbWVudCwgZDogYW55KSB7XHJcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gZDMuc2VsZWN0KHRoaXMpO1xyXG4gICAgICBjb25zdCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dCgpO1xyXG4gICAgICAgIFxyXG4gICAgICBpZiAoaXNNb2JpbGVPclRhYmxldCAmJiB0ZXh0Lmxlbmd0aCA+IDEyKSB7XHJcbiAgICAgICAgdGV4dEVsZW1lbnQudGV4dCh0ZXh0LnN1YnN0cmluZygwLCAxMCkgKyAnLi4uJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuLy8gRW5zdXJlIFgtYXhpcyBsaW5lIHN0YXJ0cyBleGFjdGx5IGF0IHg9MFxyXG4gIHhBeGlzR3JvdXBcclxuICAgIC5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciknKVxyXG4gICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4JylcclxuICAgIC5hdHRyKCdkJywgYE0wLDAuNUgke2RpbWVuc2lvbnMucmVxdWlyZWRTdmdXaWR0aH1gKTtcclxuXHJcbiAgLy8gWS1heGlzXHJcbiAgc3ZnXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxufVxyXG5cclxuICBwcml2YXRlIHJlbmRlckRyaWxsZG93bkF4ZXMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgYXhlczogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zXHJcbiAgKSB7XHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtkaW1lbnNpb25zLmhlaWdodH0pYClcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXgtYXhpcy10ZXh0IG11bHRpY2hhcnQxJylcclxuICAgICAgLmNhbGwoYXhlcy54QXhpcylcclxuICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93biB5YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgIC5jYWxsKGF4ZXMueUF4aXMpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuY2FsbChheGVzLnlBeGlzKVxyXG4gICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJNdWx0aUNoYXJ0QXhlcyhzdmc6IGFueSwgYXhlczogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7ZGltZW5zaW9ucy5oZWlnaHR9KWApXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC14LWF4aXMtdGV4dCBtdWx0aWNoYXJ0JylcclxuICAgICAgLmNhbGwoYXhlcy54QXhpcylcclxuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0IHlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmNhbGwoYXhlcy55QXhpcylcclxuICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUF4aXNTdHlsaW5nKHN2ZzogYW55LCBzdmdZQXhpc0xlZnQ6IGFueSwgc3ZnWUF4aXNSaWdodDogYW55KSB7XHJcbiAgICBjb25zdCBzdHlsZUF4aXNEb21haW4gPSAoY29udGFpbmVyOiBhbnkpID0+IHtcclxuICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLmRvbWFpbicpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciknKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpO1xyXG4gICAgfTtcclxuXHJcbiAgICBzdHlsZUF4aXNEb21haW4oc3ZnKTtcclxuICAgIHN0eWxlQXhpc0RvbWFpbihzdmdZQXhpc0xlZnQpO1xyXG4gICAgc3R5bGVBeGlzRG9tYWluKHN2Z1lBeGlzUmlnaHQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkKSB7XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCcpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yKScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzQ29sb3IpIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCcpLnN0eWxlKFxyXG4gICAgICAgICdjb2xvcicsXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0NvbG9yIHx8ICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKSdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlBeGlzQ29uZmlndXJhdGlvbnMoc3ZnOiBhbnksIHNjYWxlczogYW55LCBkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubXVsdGljaGFydCA+IGcgPiB0ZXh0JykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy5tdWx0aWNoYXJ0ID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJDdXN0b21YQXhpcyhzdmcsIHNjYWxlcywgZGltZW5zaW9ucywgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDkpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcclxuICAgICAgICAuYXR0cigneCcsICctNScpXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckN1c3RvbVhBeGlzKHN2ZzogYW55LCBzY2FsZXM6IGFueSwgZGltZW5zaW9uczogRGltZW5zaW9ucywgZGF0YTogYW55W10pIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2RpbWVuc2lvbnMuaGVpZ2h0fSlgKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJyMwMDAnKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHNjYWxlcy54U2NhbGUpLnRpY2tTaXplKDApKVxyXG4gICAgICAuY2FsbCgoZzogYW55KSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuXHJcbiAgICB0aGlzLnN0eWxlQ3VzdG9tWEF4aXNUaWNrcyhzdmcsIGRhdGEpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgICB0aGlzLmFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3R5bGVDdXN0b21YQXhpc1RpY2tzKHN2ZzogYW55LCBkYXRhOiBhbnlbXSkge1xyXG4gICAgbGV0IGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCcueDEuYXhpczEgLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlkZVhheGlzVGljaykgcmV0dXJuIDA7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoYWx0ZXJuYXRlVGV4dCAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCkge1xyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5DT05TVEFOVFMuTE9OR19USUNLX0xFTkdUSF9CRyAtIDc7XHJcbiAgICAgIH1cclxuICAgICAgYWx0ZXJuYXRlVGV4dCA9IHRydWU7XHJcbiAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRyAtIDQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhbHRlcm5hdGVUZXh0ID0gZmFsc2U7XHJcbiAgICBzdmdcclxuICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoID4gOCBcclxuICAgICAgICAgICAgPyAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24tYWx0J1xyXG4gICAgICAgICAgICA6ICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cigneScsICgpID0+IHtcclxuICAgICAgICBpZiAoYWx0ZXJuYXRlVGV4dCkge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsdGVybmF0ZVRleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnOiBhbnkpIHtcclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLmF0dHIoJ3knLCB0aGlzLkNPTlNUQU5UUy5TSE9SVF9USUNLX0xFTkdUSF9CRylcclxuICAgICAgLnRleHQoKGQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBkLnRyaW0oKTtcclxuICAgICAgICBjb25zdCBzcGFjZUluZGV4ID0gdHJpbW1lZC5pbmRleE9mKCcgJyk7XHJcbiAgICAgICAgcmV0dXJuIHNwYWNlSW5kZXggPiAtMSBcclxuICAgICAgICAgID8gdHJpbW1lZC5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgOiB0cmltbWVkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIHRoaXMuQ09OU1RBTlRTLkxPTkdfVElDS19MRU5HVEhfQkcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpXHJcbiAgICAgIC50ZXh0KChkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCB0cmltbWVkID0gZC50cmltKCk7XHJcbiAgICAgICAgY29uc3Qgc3BhY2VJbmRleCA9IHRyaW1tZWQuaW5kZXhPZignICcpO1xyXG4gICAgICAgIHJldHVybiBzcGFjZUluZGV4ID4gLTEgXHJcbiAgICAgICAgICA/IHRyaW1tZWQuc3Vic3RyaW5nKHNwYWNlSW5kZXgpLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgIDogJyc7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJEYXRhTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhLCBkaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNDQyAmJiAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgcmVjdC5hcHBlbmQoJ3N2Zzp0aXRsZScpLnRleHQoKGQ6IGFueSkgPT4gZFsxXSAtIGRbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93VG90YWxPblRvcCkge1xyXG4gICAgICB0aGlzLnJlbmRlclRvcExhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0FuZ2xlZExhYmVscykge1xyXG4gICAgICB0aGlzLnJlbmRlckFuZ2xlZExhYmVscyhyZWN0LCBzY2FsZXMsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyVG9wTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBmb3JtYXRGcm9tQmFja2VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgPyBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcilcclxuICAgICAgOiAoZDogYW55KSA9PiBkO1xyXG4gICAgY29uc3QgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG5cclxuICAgIHJlY3RcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLmRhdGEubmFtZSkgKyBzY2FsZXMueFNjYWxlLmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLWxhYmVscy1vbnRvcC13ZWtseWNoYXJ0cycpXHJcbiAgICAgIC5hdHRyKCd5JywgKGQ6IGFueSkgPT4gc2NhbGVzLnlTY2FsZShkWzFdKSAtIDMpXHJcbiAgICAgIC50ZXh0KChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IDApIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlIDw9IDk5OSBcclxuICAgICAgICAgID8gZm9ybWF0RnJvbUJhY2tlbmQodmFsdWUpXHJcbiAgICAgICAgICA6IGZvcm1hdEZvckh1Z2VOdW1iZXJzKHZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbWV0YURhdGEudW5pdCA/IG1ldGFEYXRhLnVuaXQgKyBmb3JtYXR0ZWRWYWx1ZSA6IGZvcm1hdHRlZFZhbHVlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQW5nbGVkTGFiZWxzKHJlY3Q6IGFueSwgc2NhbGVzOiBhbnksIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBmb3JtYXRGcm9tQmFja2VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgPyBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcilcclxuICAgICAgOiAoZDogYW55KSA9PiBkO1xyXG4gICAgY29uc3QgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG4gICAgY29uc3QgdGVtcE9iamVjdEhvbGRlcjogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG5cclxuICAgIHJlY3RcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd4JywgMClcclxuICAgICAgLmF0dHIoJ3knLCAwKVxyXG4gICAgICAuYXR0cignZmlsbCcsIChkOiBhbnkpID0+IG1ldGFEYXRhLmNvbG9yc1tkLmtleV0pXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGF0YS1sYWJlbHMtYW5nbGVkLXdlZWtseWNoYXJ0cycpXHJcbiAgICAgIC50ZXh0KChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdmFsdWUgPD0gOTk5XHJcbiAgICAgICAgICA/IGZvcm1hdEZyb21CYWNrZW5kKHZhbHVlKVxyXG4gICAgICAgICAgOiBmb3JtYXRGb3JIdWdlTnVtYmVycyh2YWx1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1ldGFEYXRhLnVuaXQgPyBtZXRhRGF0YS51bml0ICsgZm9ybWF0dGVkVmFsdWUgOiBmb3JtYXR0ZWRWYWx1ZTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGRbMV0gLSBkWzBdO1xyXG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkgcmV0dXJuICdyb3RhdGUoMCknO1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIGxldCBpbmNyZW1lbnRlciA9IDE7XHJcbiAgICAgICAgbWV0YURhdGEua2V5TGlzdC5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBpZiAoZC5kYXRhW2tleV0pIHtcclxuICAgICAgICAgICAgdG90YWwgKz0gZC5kYXRhW2tleV07XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbmNyZW1lbnRlciA9IDI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdID0gKHRlbXBPYmplY3RIb2xkZXJbZC5kYXRhLm5hbWVdIHx8IDApICsgaW5jcmVtZW50ZXI7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0ZW1wT2JqZWN0SG9sZGVyW2QuZGF0YS5uYW1lXTtcclxuICAgICAgICBjb25zdCB4UG9zID0gc2NhbGVzLnhTY2FsZShkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgY29uc3QgYmFuZHdpZHRoID0gc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgICAgICBjb25zdCB5UG9zID0gc2NhbGVzLnlTY2FsZSh0b3RhbCkgLSAzO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFBvcyArIGJhbmR3aWR0aCAvIDN9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt4UG9zICsgYmFuZHdpZHRoIC8gMiArIDJ9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFBvcyArIChiYW5kd2lkdGggKiAzKSAvIDR9LCR7eVBvc30pIHJvdGF0ZSgyNzApYDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYXJnZXRMaW5lKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc1JpZ2h0OiBhbnksXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YVxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IHRoaXMucGFyc2VUYXJnZXRWYWx1ZSh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4gICAgY29uc3QgeVplcm8gPSBzY2FsZXMueVNjYWxlKHBhcnNlZFRhcmdldCk7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAuYXR0cigneDInLCBkaW1lbnNpb25zLndpZHRoKVxyXG4gICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExhYmVsKHN2Z1lBeGlzUmlnaHQsIHlaZXJvLCBtZXRhRGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlVGFyZ2V0VmFsdWUodGFyZ2V0OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChTdHJpbmcodGFyZ2V0KSk7XHJcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpID8gcGFyc2VJbnQoU3RyaW5nKHRhcmdldCkpIDogcGFyc2VkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJUYXJnZXRMYWJlbChzdmdZQXhpc1JpZ2h0OiBhbnksIHlaZXJvOiBudW1iZXIsIG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3laZXJvIC0gMTN9KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmh0bWwoYDxkaXY+JHt0YXJnZXROYW1lfTwvZGl2PjxkaXY+JHt0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXR9JHtkYXRhVHlwZX08L2Rpdj5gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KHN2ZzogYW55LCBsaW5lRGF0YTogYW55W10sIHNjYWxlczogYW55LCBjb2xvcnM6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpIHtcclxuICAgIGlmICghbGluZURhdGEgfHwgIWNvbG9ycykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGRhdGFHcm91cCA9IGQzXHJcbiAgICAgIC5uZXN0KClcclxuICAgICAgLmtleSgoZDogYW55KSA9PiBkLmNhdGVnb3J5KVxyXG4gICAgICAuZW50cmllcyhsaW5lRGF0YSk7XHJcblxyXG4gICAgY29uc3QgbGluZUdlbiA9IGQzXHJcbiAgICAgIC5saW5lKClcclxuICAgICAgLngoKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLm5hbWUpICsgc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC55KChkOiBhbnkpID0+IHNjYWxlcy5saW5lWXNjYWxlKGQudmFsdWUpKTtcclxuXHJcbiAgICBkYXRhR3JvdXAuZm9yRWFjaCgoZ3JvdXA6IGFueSkgPT4ge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgICAuZGF0dW0oZ3JvdXAudmFsdWVzKVxyXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAoZDogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZFswXT8uY2F0ZWdvcnkgXHJcbiAgICAgICAgICAgID8gY29sb3JzW2RbMF0uY2F0ZWdvcnldXHJcbiAgICAgICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMi41KVxyXG4gICAgICAgIC5hdHRyKCdkJywgbGluZUdlbik7XHJcblxyXG4gICAgICB0aGlzLnJlbmRlckxpbmVEb3RzKHN2ZywgZ3JvdXAudmFsdWVzLCBzY2FsZXMsIGNvbG9ycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGluZURvdHMoc3ZnOiBhbnksIHZhbHVlczogYW55W10sIHNjYWxlczogYW55LCBjb2xvcnM6IGFueSkge1xyXG4gICAgY29uc3QgZG90ID0gc3ZnXHJcbiAgICAgIC5zZWxlY3RBbGwoJy5saW5lLWRvdHMnKVxyXG4gICAgICAuZGF0YSh2YWx1ZXMpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQ6IGFueSkgPT4gdGhpcy5oYW5kbGVDbGljayhkKSk7XHJcblxyXG4gICAgZG90XHJcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBkLmNhdGVnb3J5IFxyXG4gICAgICAgICAgPyBjb2xvcnNbZC5jYXRlZ29yeV1cclxuICAgICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3I7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbiAgICAgIC5hdHRyKCdjeCcsIChkOiBhbnkpID0+IHNjYWxlcy54U2NhbGUoZC5uYW1lKSArIHNjYWxlcy54U2NhbGUuYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAuYXR0cignY3knLCAoZDogYW55KSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ3InLCAzKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKSB7XHJcbiAgICAgIGRvdFxyXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdkb3RzJylcclxuICAgICAgICAuYXR0cignZmlsbCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJy44NWVtJylcclxuICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSkgPT4gc2NhbGVzLnhTY2FsZShkLm5hbWUpICsgc2NhbGVzLnhTY2FsZS5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogYW55KSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgICAuYXR0cignZHknLCAnLTFlbScpXHJcbiAgICAgICAgLnRleHQoKGQ6IGFueSkgPT4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGE/Lm1ldGFEYXRhPy5oYXNEcmlsbERvd24gfHwgZD8udG9nZ2xlRnJvbSkge1xyXG4gICAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogYW55KSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVpvb21pblpvb21vdXRDbGljayh7IGlzWm9vbU91dCwgZXZlbnQgfTogeyBpc1pvb21PdXQ6IGJvb2xlYW47IGV2ZW50OiBhbnkgfSkge1xyXG4gICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQpO1xyXG4gIH1cclxufSIsIjxkaXZcclxuICAjZ3JvdXBjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZC1iZyk7XCJcclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuXHJcbjxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gID48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjNcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24pPVwiaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuPC9kaXY+XHJcblxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxXHJcbiAgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiXHJcbiAgW2hhc0RyaWxsRG93bl09XCJjaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duXCJcclxuICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiXHJcbiAgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgW2lzcmlhXT1cImN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVwiXHJcbiAgW3NlbGVjdGVkS3BpVG9vbHRvcF09XCJjaGFydENvbmZpZ3VyYXRpb24uc2VsZWN0ZWRLcGlUb29sdG9wXCJcclxuICAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gIFtpc0FsZXJ0RW5hYmxlZF09XCJpc0FsZXJ0RW5hYmxlZFwiXHJcbiAgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIlxyXG4+PC9saWItY2hhcnQtaGVhZGVyLXYxPlxyXG5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJncm91cGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICNncm91cGNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmdcIlxyXG4gID48L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
940
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2dyb3VwLWNoYXJ0L2dyb3VwLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ncm91cC1jaGFydC9ncm91cC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUE4RWxELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFxRHhEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUE3Q0EsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6RCxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQiw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsdUJBQWtCLEdBQXVCLEVBQXdCLENBQUM7UUFDbEUsZUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFFVix5QkFBb0IsR0FBZ0M7WUFDakUsUUFBUSxFQUFFO2dCQUNOLEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxHQUFH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aWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbmltcG9ydCBDaGFydEhlbHBlciBmcm9tICcuLi9jaGFydC1oZWxwZXInO1xyXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XHJcbmltcG9ydCB7IFJlc2l6ZWRFdmVudCB9IGZyb20gJ2FuZ3VsYXItcmVzaXplLWV2ZW50JztcclxuaW1wb3J0IEhlYWRlckNvbmZpZ0hlbHBlciBmcm9tICcuLi9oZWFkZXItY29uZmlnJztcclxuXHJcbmludGVyZmFjZSBDaGFydE1ldGFEYXRhIHtcclxuICBjb2xvcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgY29sb3JBYm92ZVRhcmdldD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAga2V5TGlzdDogc3RyaW5nW107XHJcbiAgaGFzRHJpbGxEb3duPzogYm9vbGVhbjtcclxuICBiYXJXaXRob3V0Q2xpY2s/OiBzdHJpbmdbXTtcclxuICBkYXRhVHlwZT86IHN0cmluZztcclxuICB5TGFiZWw/OiBzdHJpbmc7XHJcbiAgeExhYmVsPzogc3RyaW5nO1xyXG4gIGxpbmV5TGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUYXJnZXRMaW5lRGF0YSB7XHJcbiAgdGFyZ2V0OiBudW1iZXI7XHJcbiAgY29sb3I6IHN0cmluZztcclxuICB0YXJnZXROYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ2hhcnRDb25maWd1cmF0aW9uIHtcclxuICBtYXJnaW46IHsgdG9wOiBudW1iZXI7IHJpZ2h0OiBudW1iZXI7IGJvdHRvbTogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfTtcclxuICBsYWJlbEZvcm1hdHRlcjogKHZhbHVlOiBhbnkpID0+IHN0cmluZztcclxuICBzdmdIZWlnaHQ6IG51bWJlcjtcclxuICBudW1iZXJPZllUaWNrczogbnVtYmVyO1xyXG4gIGxlZ2VuZEp1c3RpZmllZDogYm9vbGVhbjtcclxuICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xyXG4gIHlBeGlzTGFiZWxGb21hdHRlcjogKHZhbHVlOiBhbnkpID0+IHN0cmluZztcclxuICBsaW5lR3JhcGhDb2xvcjogc3RyaW5nO1xyXG4gIHNob3dMaW5lQ2hhcnRBeGlzOiBib29sZWFuO1xyXG4gIHNob3dWYWx1ZXM6IGJvb2xlYW47XHJcbiAgaGVhZGVyTWVudU9wdGlvbnM6IGFueVtdO1xyXG4gIHhBeGlzR3JpZD86IGJvb2xlYW47XHJcbiAgeUF4aXNHcmlkOiBib29sZWFuO1xyXG4gIGxlZ2VuZFZpc2libGU6IGJvb2xlYW47XHJcbiAgaXNIZWFkZXJWaXNpYmxlPzogYm9vbGVhbjtcclxuICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZD86IGJvb2xlYW47XHJcbiAgaXNNdWx0aUNoYXJ0R3JpZExpbmU/OiBib29sZWFuO1xyXG4gIGlzRnVsbFNjcmVlbj86IGJvb2xlYW47XHJcbiAgY3VzdG9tWXNjYWxlPzogbnVtYmVyO1xyXG4gIHRleHRzT25CYXI/OiBib29sZWFuO1xyXG4gIGlzWGF4aXNMYWJlbEhpZGRlbj86IGJvb2xlYW47XHJcbiAgaXNZYXhpc0xhYmVsSGlkZGVuOiBib29sZWFuO1xyXG4gIGlzWWF4aXNIaWRkZW4/OiBib29sZWFuO1xyXG4gIGlzWWF4aXNEYXNoZWQ/OiBib29sZWFuO1xyXG4gIHRleHRGb3JtYXR0ZXI/OiBzdHJpbmc7XHJcbiAgaXNOb0FsdGVybmF0ZVhheGlzVGV4dD86IGJvb2xlYW47XHJcbiAgaXNYZ3JpZEJldHdlZW5MYWJlbHM/OiBib29sZWFuO1xyXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG4gIGhpZGVMZWdlbmRPblRvcDogYm9vbGVhbjtcclxuICBpc1hheGlzQ29sb3I6IHN0cmluZztcclxuICBsYWJlbE92ZXJsYXBNaW5vckZpeDogYm9vbGVhbjtcclxuICBub0hvdmVyRWZmZWN0OiBib29sZWFuO1xyXG4gIG5vSG92ZXJEaXNwbGF5RGF0YTogYm9vbGVhbjtcclxuICBzaG93WGF4aXNUb3A6IGJvb2xlYW47XHJcbiAgZGlzcGxheVlheGlzTGFiZWxzPzogYm9vbGVhbjtcclxuICB4TGFiZWxzT25TYW1lTGluZT86IGJvb2xlYW47XHJcbiAgdGV4dEFsd2F5c0hvcml6b250YWw/OiBib29sZWFuO1xyXG4gIGxlZ2VuZEF0VG9wUmlnaHQ/OiBib29sZWFuO1xyXG4gIGlzRHJpbGxkb3duQ2hhcnQ/OiBib29sZWFuO1xyXG4gIGRpc3BsYXlUaXRsZU9uVG9wPzogYm9vbGVhbjtcclxuICBpc1RvZ2dsZVZpc2libGU/OiBib29sZWFuO1xyXG4gIGlzVGl0bGVIaWRkZW4/OiBib29sZWFuO1xyXG4gIGlzRGlzcGxheUJhckRldGFpbHNBdEJvdHRvbT86IGJvb2xlYW47XHJcbiAgaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXk6IG51bWJlcjtcclxuICBiYXJWYXVsZUNvbG9yPzogc3RyaW5nO1xyXG4gIHlBeGlzQ3VzdG9tVGV4dFN0eWxlcz86IHN0cmluZztcclxuICB5QXhpc0N1c3RvbWxhYmVsU3R5bGVzPzogc3RyaW5nO1xyXG4gIHhBeGlzQ3VzdG9tbGFiZWxTdHlsZXM/OiBzdHJpbmc7XHJcbiAgaXNSaWE/OiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ncm91cC1jaGFydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyb3VwLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ncm91cC1jaGFydC5jb21wb25lbnQubGVzcycsICcuLi9jb21tb24tc3R5bGVzLmxlc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JvdXBDaGFydENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdncm91cGNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdncm91cGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3JvdXBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBjaGFydERhdGE6IGFueTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBpc0hlYWRlclZpc2libGUgPSB0cnVlO1xyXG4gIGxlZ2VuZFZpc2libGUgPSB0cnVlO1xyXG4gIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gZmFsc2U7XHJcbiAgY2hhcnRDb25maWd1cmF0aW9uOiBDaGFydENvbmZpZ3VyYXRpb24gPSB7fSBhcyBDaGFydENvbmZpZ3VyYXRpb247XHJcbiAgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzO1xyXG5cclxucHJpdmF0ZSByZWFkb25seSBkZWZhdWx0Q29uZmlndXJhdGlvbjogUGFydGlhbDxDaGFydENvbmZpZ3VyYXRpb24+ID0ge1xyXG4gICAgXCJtYXJnaW5cIjoge1xyXG4gICAgICAgIFwidG9wXCI6IDMwLFxyXG4gICAgICAgIFwibGVmdFwiOiAxMTAsXHJcbiAgICAgICAgXCJyaWdodFwiOiA0MCxcclxuICAgICAgICBcImJvdHRvbVwiOiA1MFxyXG4gICAgfSxcclxuICAgIGxhYmVsRm9ybWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgc3ZnSGVpZ2h0OiA3MCxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiB0cnVlLFxyXG4gICAgeUxpbmVBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIGxpbmVHcmFwaENvbG9yOiAnI0Y2RDI4MycsXHJcbiAgICBzaG93TGluZUNoYXJ0QXhpczogdHJ1ZSxcclxuICAgIHNob3dWYWx1ZXM6IHRydWUsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICAgIHlBeGlzR3JpZDogdHJ1ZSxcclxuICAgIGxlZ2VuZFZpc2libGU6IHRydWUsXHJcbiAgICBpc1lheGlzTGFiZWxIaWRkZW46IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICBoaWRlTGVnZW5kT25Ub3A6IHRydWUsXHJcbiAgICBpc1hheGlzQ29sb3I6ICcjOTk5OTk5JyxcclxuICAgIGxhYmVsT3ZlcmxhcE1pbm9yRml4OiB0cnVlLFxyXG4gICAgbm9Ib3ZlckVmZmVjdDogdHJ1ZSxcclxuICAgIG5vSG92ZXJEaXNwbGF5RGF0YTogdHJ1ZSxcclxuICAgIHNob3dYYXhpc1RvcDogdHJ1ZSxcclxuICAgIGhvd21hbnlCYXJEZXRhaWxzVG9EaXNwbGF5OiAwLFxyXG4gIH07XHJcblxyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNab29tZWRPdXQgPSBmYWxzZTtcclxuICBpc0REMU9wZW4gPSBmYWxzZTtcclxuICBpc0REMk9wZW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7fVxyXG5cclxuICBnZXQgaXNBbGVydEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKFxyXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09ICdlZGl0QWxlcnQnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemVkKGV2ZW50OiBSZXNpemVkRXZlbnQpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBkMy5zZWxlY3QoJyMnICsgdGhpcy51bmlxdWVJZCkucmVtb3ZlKCk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKTtcclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIGlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dDogYm9vbGVhbiwgZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1pvb21lZE91dCA9IGlzWm9vbU91dDtcclxuICAgIHRoaXMub25SZXNpemVkKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVpvb21pblpvb21vdXRDbGljayh7IGlzWm9vbU91dCwgZXZlbnQgfSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQsIGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGlzTGVnZW5kVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShcclxuICAgICAgdGhpcy5jaGFydERhdGE/Lm1ldGFEYXRhPy5jb2xvcnMgJiZcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5jaGFydERhdGEubWV0YURhdGEuY29sb3JzKS5sZW5ndGggPiAxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAga2VlcE9yZGVyID0gKGEsIGIpID0+IGE7XHJcblxyXG4gIGluaXRpYWxpemVncm91cENoYXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZXJnZUNvbmZpZ3VyYXRpb25zKCk7XHJcbiAgICBjb25zdCBjaGFydENvbnRleHQgPSB0aGlzLnByZXBhcmVDaGFydERhdGEoKTtcclxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmNhbGN1bGF0ZURpbWVuc2lvbnMoY2hhcnRDb250ZXh0KTtcclxuICAgIGNvbnN0IHNjYWxlcyA9IHRoaXMuY3JlYXRlU2NhbGVzKGNoYXJ0Q29udGV4dCwgZGltZW5zaW9ucyk7XHJcbiAgICBjb25zdCBzdmdFbGVtZW50cyA9IHRoaXMuY3JlYXRlU1ZHU3RydWN0dXJlKGRpbWVuc2lvbnMpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyQXhlcyhzdmdFbGVtZW50cywgc2NhbGVzLCBjaGFydENvbnRleHQsIGRpbWVuc2lvbnMpO1xyXG4gICAgdGhpcy5yZW5kZXJCYXJzKHN2Z0VsZW1lbnRzLnN2ZywgY2hhcnRDb250ZXh0LCBzY2FsZXMsIGRpbWVuc2lvbnMpO1xyXG4gICAgdGhpcy5yZW5kZXJMYWJlbHMoc3ZnRWxlbWVudHMsIHNjYWxlcywgY2hhcnRDb250ZXh0LCBkaW1lbnNpb25zKTtcclxuICAgIHRoaXMucmVuZGVyVGFyZ2V0TGluZShzdmdFbGVtZW50cywgc2NhbGVzLCBjaGFydENvbnRleHQsIGRpbWVuc2lvbnMpO1xyXG4gICAgdGhpcy5yZW5kZXJMaW5lR3JhcGgoc3ZnRWxlbWVudHMuc3ZnLCBjaGFydENvbnRleHQsIHNjYWxlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlQ29uZmlndXJhdGlvbnMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMubGVnZW5kVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVDaGFydERhdGEoKSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICAgIGNvbnN0IG1ldGFEYXRhOiBDaGFydE1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcbiAgICBjb25zdCBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG5cclxuICAgIGlmICghbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgICBtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0ID0gbWV0YURhdGEuY29sb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIG1ldGFEYXRhLFxyXG4gICAgICBsaW5lRGF0YSxcclxuICAgICAga2V5TGlzdDogbWV0YURhdGEua2V5TGlzdCxcclxuICAgICAgY29sb3JNYXA6IG1ldGFEYXRhLmNvbG9ycyxcclxuICAgICAgaXNSaWE6IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uPy5pc1JpYSB8fCBmYWxzZSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZURpbWVuc2lvbnMoY2hhcnRDb250ZXh0OiBhbnkpIHtcclxuICAgIGNvbnN0IGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZ3JvdXBjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcblxyXG4gICAgbGV0IHdpZHRoID0gdGhpcy5jYWxjdWxhdGVXaWR0aChjaGFydENvbnRhaW5lciwgbWFyZ2luKTtcclxuICAgIGxldCBoZWlnaHQgPSB0aGlzLmNhbGN1bGF0ZUhlaWdodCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIsIG1hcmdpbik7XHJcblxyXG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgbWFyZ2luLCBjaGFydENvbnRhaW5lciwgdmVydGljYWxzdGFja2VkY29udGFpbmVyIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVdpZHRoKGNoYXJ0Q29udGFpbmVyOiBhbnksIG1hcmdpbjogYW55KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGJhc2VXaWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoO1xyXG4gICAgbGV0IHdpZHRoID0gYmFzZVdpZHRoO1xyXG5cclxuICAgIGlmIChkYXRhTGVuZ3RoID4gMzAgJiYgdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICBjb25zdCBtdWx0aXBsaWVyID0gdGhpcy5jaGFydERhdGEuZHJvcGRvd25EYXRhMSA/IDYwIDogNDA7XHJcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGRhdGFMZW5ndGggKiBtdWx0aXBsaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEuZHJvcGRvd25EYXRhMiAmJiB3aWR0aCA8IGRhdGFMZW5ndGggKiAxMjAgJiYgdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICB3aWR0aCA9IGRhdGFMZW5ndGggKiAxMjA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFMZW5ndGggPiA4ICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDI1MCkge1xyXG4gICAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDI1MDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB3aWR0aCA9IGRhdGFMZW5ndGggKiAxNjA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gd2lkdGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZUhlaWdodCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXI6IGFueSwgbWFyZ2luOiBhbnkpOiBudW1iZXIge1xyXG4gICAgbGV0IGhlaWdodCA9XHJcbiAgICAgIHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpICpcclxuICAgICAgICAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0IC8gMTAwKSAtXHJcbiAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICBtYXJnaW4uYm90dG9tO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ICE9PSA3MCkge1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICBoZWlnaHQgPSBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCAmJiAhdGhpcy5pc0hlYWRlclZpc2libGUpIHtcclxuICAgICAgaGVpZ2h0ID0gcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIDEzMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIGhlaWdodCA9IHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b20gLSAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlaWdodDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU2NhbGVzKGNoYXJ0Q29udGV4dDogYW55LCBkaW1lbnNpb25zOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgZGF0YSwgbWV0YURhdGEsIGxpbmVEYXRhLCBrZXlMaXN0IH0gPSBjaGFydENvbnRleHQ7XHJcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIG1hcmdpbiB9ID0gZGltZW5zaW9ucztcclxuICAgIGNvbnN0IGxlZnRBbmRSaWdodFNwYWNlcyA9IDUwO1xyXG4gICAgY29uc3QgcmlnaHRTdmdXaWR0aCA9IDYwO1xyXG5cclxuICAgIGNvbnN0IGdyb3VwcyA9IGQzLm1hcChkYXRhLCAoZCkgPT4gZC5uYW1lKS5rZXlzKCk7XHJcblxyXG4gICAgbGV0IHg6IGFueTtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHggPSBkM1xyXG4gICAgICAgIC5zY2FsZUJhbmQoKVxyXG4gICAgICAgIC5yYW5nZVJvdW5kKFt3aWR0aCwgMF0pXHJcbiAgICAgICAgLmFsaWduKDAuNSlcclxuICAgICAgICAucGFkZGluZygwLjUpXHJcbiAgICAgICAgLmRvbWFpbihkYXRhLm1hcCgoZDogYW55KSA9PiBkLm5hbWUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgeCA9IGQzXHJcbiAgICAgICAgLnNjYWxlQmFuZCgpXHJcbiAgICAgICAgLmRvbWFpbihncm91cHMpXHJcbiAgICAgICAgLnJhbmdlKFtsZWZ0QW5kUmlnaHRTcGFjZXMsIHdpZHRoIC0gcmlnaHRTdmdXaWR0aCAtIGxlZnRBbmRSaWdodFNwYWNlc10pXHJcbiAgICAgICAgLnBhZGRpbmcoMC4zKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB4U2NhbGVGcm9tT3JpZ2luID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGdyb3VwcykucmFuZ2UoWzAsIHdpZHRoIC0gcmlnaHRTdmdXaWR0aF0pO1xyXG5cclxuICAgIGNvbnN0IHhTdWJncm91cCA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlMaXN0KS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG5cclxuICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5jYWxjdWxhdGVNYXhWYWx1ZShkYXRhLCBrZXlMaXN0KTtcclxuICAgIGNvbnN0IHkgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgbWF4VmFsdWVdKS5uaWNlKCkucmFuZ2VSb3VuZChbaGVpZ2h0LCAwXSk7XHJcblxyXG4gICAgbGV0IGxpbmVZc2NhbGUgPSBudWxsO1xyXG4gICAgaWYgKGxpbmVEYXRhKSB7XHJcbiAgICAgIGxpbmVZc2NhbGUgPSB0aGlzLmNyZWF0ZUxpbmVZU2NhbGUobGluZURhdGEsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKS5kb21haW4oa2V5TGlzdCkucmFuZ2UoT2JqZWN0LnZhbHVlcyhtZXRhRGF0YS5jb2xvcnMpKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4LFxyXG4gICAgICB4U2NhbGVGcm9tT3JpZ2luLFxyXG4gICAgICB4U3ViZ3JvdXAsXHJcbiAgICAgIHksXHJcbiAgICAgIGxpbmVZc2NhbGUsXHJcbiAgICAgIGNvbG9yLFxyXG4gICAgICBsZWZ0QW5kUmlnaHRTcGFjZXMsXHJcbiAgICAgIHJpZ2h0U3ZnV2lkdGgsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhWYWx1ZShkYXRhOiBhbnlbXSwga2V5TGlzdDogc3RyaW5nW10pOiBudW1iZXIge1xyXG4gICAgbGV0IG1heFZhbHVlID0gZDMubWF4KGRhdGEsIChkKSA9PiBkMy5tYXgoa2V5TGlzdCwgKGtleSkgPT4gK2Rba2V5XSkpIHx8IDA7XHJcblxyXG4gICAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICAgIG1heFZhbHVlID0gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGFcclxuICAgICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwXHJcbiAgICAgICAgOiAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4gICAgICBtYXhWYWx1ZSAqPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmIG1heFZhbHVlIDwgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldDtcclxuICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA8IDEwICYmIHRhcmdldCA8IDEwID8gdGFyZ2V0ICsgMyA6IHRhcmdldCArIDIwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYXhWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTGluZVlTY2FsZShsaW5lRGF0YTogYW55W10sIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICBsZXQgbWF4TGluZVZhbHVlID0gZDMubWF4KGxpbmVEYXRhLCAoZCkgPT4gK2QudmFsdWUpIHx8IDA7XHJcbiAgICBtYXhMaW5lVmFsdWUgKj0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlIHx8IDE7XHJcblxyXG4gICAgbGV0IG1pbkxpbmVWYWx1ZSA9IGQzLm1pbihsaW5lRGF0YSwgKGQpID0+ICtkLnZhbHVlKSB8fCAwO1xyXG4gICAgaWYgKG1heExpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSAtPSAzO1xyXG4gICAgaWYgKG1pbkxpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IDA7XHJcblxyXG4gICAgcmV0dXJuIGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFttaW5MaW5lVmFsdWUsIG1heExpbmVWYWx1ZV0pLnJhbmdlKFtoZWlnaHQsIG1pbkxpbmVWYWx1ZV0pO1xyXG4gIH1cclxuXHJcbnByaXZhdGUgY3JlYXRlU1ZHU3RydWN0dXJlKGRpbWVuc2lvbnM6IGFueSkge1xyXG4gICAgY29uc3QgeyBjaGFydENvbnRhaW5lciwgaGVpZ2h0LCBtYXJnaW4gfSA9IGRpbWVuc2lvbnM7XHJcbiAgICBjb25zdCByaWdodFN2Z1dpZHRoID0gNjA7XHJcbiAgICBcclxuICAgIC8vIENhbGN1bGF0ZSBwcm9wZXIgbGVmdCBTVkcgd2lkdGggdG8gaW5jbHVkZSBsYWJlbFxyXG4gICAgY29uc3QgbGVmdFN2Z1dpZHRoID0gbWFyZ2luLmxlZnQgKyAyMDtcclxuXHJcbiAgICBjb25zdCBvdXRlckNvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMudW5pcXVlSWQpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ2hlaWdodCcsIGAke2hlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tfXB4YClcclxuICAgICAgLnN0eWxlKCdvdmVyZmxvdycsICdoaWRkZW4nKSAgLy8gRklYRUQ6IFByZXZlbnQgYWxsIG92ZXJmbG93XHJcbiAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgYCR7bWFyZ2luLmxlZnR9cHhgKVxyXG4gICAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHtyaWdodFN2Z1dpZHRofXB4YClcclxuICAgICAgLnN0eWxlKCdtYXJnaW4tbGVmdCcsICcxNXB4JylcclxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOyAgLy8gRklYRUQ6IEZvciBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xyXG5cclxuICAgIC8vIEZJWEVEOiBDcmVhdGUgcHJvcGVyIFktYXhpcyBTVkcgd2l0aCBlbm91Z2ggc3BhY2UgZm9yIGxhYmVsXHJcbiAgICBjb25zdCBzdmdZQXhpc0xlZnQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCBsZWZ0U3ZnV2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSlcclxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAgIC5zdHlsZSgnbGVmdCcsICcwJylcclxuICAgICAgLnN0eWxlKCd0b3AnLCAnMCcpXHJcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0ICsgNX0sJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgICBjb25zdCBzdmdZQXhpc1JpZ2h0ID0gb3V0ZXJDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdyaWdodCcsICcxMnB4JylcclxuICAgICAgLnN0eWxlKCd0b3AnLCAnMCcpXHJcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gICAgY29uc3QgaW5uZXJDb250YWluZXIgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnaW5uZXItY29udGFpbmVyJylcclxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgLnN0eWxlKCdoZWlnaHQnLCAnMTAwJScpXHJcbiAgICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJylcclxuICAgICAgLnN0eWxlKCdvdmVyZmxvdy15JywgJ2hpZGRlbicpO1xyXG5cclxuICAgIGNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGRpbWVuc2lvbnMud2lkdGggLSByaWdodFN2Z1dpZHRoKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyA2MClcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgICByZXR1cm4geyBvdXRlckNvbnRhaW5lciwgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCBzdmcgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQXhlcyhzdmdFbGVtZW50czogYW55LCBzY2FsZXM6IGFueSwgY2hhcnRDb250ZXh0OiBhbnksIGRpbWVuc2lvbnM6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCB9ID0gc3ZnRWxlbWVudHM7XHJcbiAgICBjb25zdCB7IHgsIHhTY2FsZUZyb21PcmlnaW4sIHksIGxpbmVZc2NhbGUgfSA9IHNjYWxlcztcclxuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBkaW1lbnNpb25zO1xyXG4gICAgY29uc3QgeyBtZXRhRGF0YSwgbGluZURhdGEsIGtleUxpc3QgfSA9IGNoYXJ0Q29udGV4dDtcclxuXHJcbiAgICB0aGlzLnJlbmRlclhBeGlzKHN2ZywgeCwgeFNjYWxlRnJvbU9yaWdpbiwgaGVpZ2h0LCBjaGFydENvbnRleHQsIGtleUxpc3QpO1xyXG4gICAgdGhpcy5yZW5kZXJZQXhpcyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgeSwgZGltZW5zaW9ucyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4gICAgICB0aGlzLnJlbmRlcllBeGlzR3JpZChzdmcsIHksIGRpbWVuc2lvbnMud2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hncmlkQmV0d2VlbkxhYmVscykge1xyXG4gICAgICB0aGlzLnJlbmRlclhBeGlzR3JpZChzdmcsIHgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxpbmVEYXRhICYmIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnNob3dMaW5lQ2hhcnRBeGlzICYmIGxpbmVZc2NhbGUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJMaW5lWUF4aXMoc3ZnWUF4aXNSaWdodCwgbGluZVlzY2FsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxucHJpdmF0ZSByZW5kZXJYQXhpcyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgeDogYW55LFxyXG4gICAgeFNjYWxlRnJvbU9yaWdpbjogYW55LFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICBjaGFydENvbnRleHQ6IGFueSxcclxuICAgIGtleUxpc3Q6IHN0cmluZ1tdXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGRhdGEsIG1ldGFEYXRhIH0gPSBjaGFydENvbnRleHQ7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgeEF4aXMgPSBzdmdcclxuICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHR9KWApXHJcbiAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgwKSk7XHJcblxyXG4gICAgICAvLyBGSVhFRDogU2hvdyBYLWF4aXMgbGluZVxyXG4gICAgICB4QXhpc1xyXG4gICAgICAgIC5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICNDQ0NDQ0MpJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxyXG4gICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdibG9jaycpO1xyXG5cclxuICAgICAgeEF4aXMuc2VsZWN0QWxsKCdnLnRpY2sgbGluZScpLnJlbW92ZSgpO1xyXG5cclxuICAgICAgY29uc3QgdGV4dENsYXNzID0gJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJztcclxuICAgICAgY29uc3QgdGV4dFNlbGVjdGlvbiA9IHhBeGlzXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnZy50aWNrIHRleHQnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsIHRleHRDbGFzcylcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciwgIzY2NjY2NiknKVxyXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzExcHgnKTtcclxuXHJcbiAgICAgIGlmIChrZXlMaXN0Lmxlbmd0aCA+IDEgJiYgIW1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgICAgIHRleHRTZWxlY3Rpb24uYXR0cigneScsIDI4KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJNdWx0aUNoYXJ0WEF4aXMoc3ZnLCB4LCBoZWlnaHQsIGRhdGEsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueExhYmVsc09uU2FtZUxpbmUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJYTGFiZWxzT25TYW1lTGluZShzdmcsIGRhdGEsIG1ldGFEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCb3R0b20geC1heGlzXHJcbiAgICBjb25zdCB4QXhpczIgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MiBheGlzMicpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHR9KWApXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAnIzAwMCcpXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlRnJvbU9yaWdpbikudGlja1NpemUoMCkpO1xyXG5cclxuICAgIHhBeGlzMlxyXG4gICAgICAuc2VsZWN0KCcuZG9tYWluJylcclxuICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0NDQ0NDQyknKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxyXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJyk7XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54Mi5heGlzMiBnLnRpY2sgdGV4dCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTXVsdGlDaGFydFhBeGlzKHN2ZzogYW55LCB4OiBhbnksIGhlaWdodDogbnVtYmVyLCBkYXRhOiBhbnlbXSwgbWV0YURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICBjb25zdCBzaG9ydF90aWNrX2xlbmd0aF9iZyA9IDU7XHJcbiAgICBjb25zdCBsb25nX3RpY2tfbGVuZ3RoX2JnID0gMzA7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKDApKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgKCkgPT4ge1xyXG4gICAgICBpZiAoYWx0ZXJuYXRlX3RleHQgJiYgIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTm9BbHRlcm5hdGVYYXhpc1RleHQpIHtcclxuICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBsb25nX3RpY2tfbGVuZ3RoX2JnIC0gNztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnIC0gNDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLXdlZWtseWNoYXJ0cycpLmF0dHIoJ3knLCAoKSA9PiB7XHJcbiAgICAgIGlmIChhbHRlcm5hdGVfdGV4dCkge1xyXG4gICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGxvbmdfdGlja19sZW5ndGhfYmc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclhMYWJlbHNPblNhbWVMaW5lKHN2ZzogYW55LCBkYXRhOiBhbnlbXSwgbWV0YURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2hvcnRfdGlja19sZW5ndGhfYmcgPSA1O1xyXG4gICAgY29uc3QgbG9uZ190aWNrX2xlbmd0aF9iZyA9IDMwO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLmF0dHIoJ3knLCBzaG9ydF90aWNrX2xlbmd0aF9iZylcclxuICAgICAgLnRleHQoKGQpID0+IHtcclxuICAgICAgICBjb25zdCBpc1ZhbHVlVG9CZUlnbm9yZWQgPSBkYXRhLnNvbWUoXHJcbiAgICAgICAgICAoaW5kaXY6IGFueSkgPT5cclxuICAgICAgICAgICAgaW5kaXYubmFtZS50b0xvd2VyQ2FzZSgpID09PSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpICYmXHJcbiAgICAgICAgICAgIGluZGl2W21ldGFEYXRhLmtleUxpc3RbMF1dID09PSAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGlzVmFsdWVUb0JlSWdub3JlZCkgcmV0dXJuICcnO1xyXG5cclxuICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIGxvbmdfdGlja19sZW5ndGhfYmcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ2N1cnJlbnRDb2xvcicpXHJcbiAgICAgIC50ZXh0KChkKSA9PiB7XHJcbiAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJZQXhpcyhzdmc6IGFueSwgc3ZnWUF4aXNMZWZ0OiBhbnksIHN2Z1lBeGlzUmlnaHQ6IGFueSwgeTogYW55LCBkaW1lbnNpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIE1haW4gWS1heGlzIGluIGNoYXJ0IGFyZWEgKGhpZGRlbilcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0IHlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKHkpXHJcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gICAgLy8gRklYRUQ6IExlZnQgWS1heGlzIHdpdGggdmlzaWJsZSBsaW5lXHJcbiAgICBjb25zdCB5QXhpc0xlZnQgPSBkM1xyXG4gICAgICAuYXhpc0xlZnQoeSlcclxuICAgICAgLnRpY2tTaXplKDApXHJcbiAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgLnRpY2tGb3JtYXQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICBjb25zdCB5QXhpc0dyb3VwID0gc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgICAgLmNhbGwoeUF4aXNMZWZ0KTtcclxuXHJcbiAgICAvLyBGSVhFRDogU2hvdyBZLWF4aXMgdmVydGljYWwgbGluZVxyXG4gICAgeUF4aXNHcm91cFxyXG4gICAgICAuc2VsZWN0KCcuZG9tYWluJylcclxuICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0NDQ0NDQyknKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKVxyXG4gICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHJcbiAgICAvLyBGSVhFRDogUG9zaXRpb24gWS1heGlzIHZhbHVlcyB3aXRoIHByb3BlciBzcGFjaW5nXHJcbiAgICB5QXhpc0dyb3VwXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciwgIzY2NjY2NiknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMXB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxyXG4gICAgICAuYXR0cigneCcsIC02KSAgLy8gRklYRUQ6IFNtYWxsIGdhcCBmcm9tIGF4aXMgbGluZVxyXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJylcclxuICAgICAgLmF0dHIoJ2R5JywgJzAuMzJlbScpO1xyXG5cclxuICAgIC8vIFJpZ2h0IFktYXhpcyAoaGlkZGVuKVxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKHkpXHJcbiAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gICAgdGhpcy5hcHBseUF4aXNWaXNpYmlsaXR5U2V0dGluZ3MoKTtcclxuICB9XHJcblxyXG5wcml2YXRlIGFwcGx5QXhpc1Zpc2liaWxpdHlTZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgICAgLy8gRklYRUQ6IERvbid0IGhpZGUgdGhlIFktYXhpcyBsYWJlbCBlbGVtZW50XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLmxpYi15bGFiZWwtdmlzaWJsZScpLnN0eWxlKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgICAgLy8gRklYRUQ6IEtlZXAgWS1heGlzIGxhYmVsIHZpc2libGVcclxuICAgICAgZDMuc2VsZWN0QWxsKCcubGliLXlsYWJlbC12aXNpYmxlJykuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkKSB7XHJcbiAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCAuZG9tYWluJykuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1Jykuc3R5bGUoJ2NvbG9yJywgJyM5OTk5OTknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5wcml2YXRlIHJlbmRlcllBeGlzR3JpZChzdmc6IGFueSwgeTogYW55LCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd5LWF4aXMtZ3JpZCcpXHJcbiAgICAgIC5jYWxsKFxyXG4gICAgICAgIGQzLmF4aXNMZWZ0KHkpXHJcbiAgICAgICAgICAudGlja3ModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgICAudGlja1NpemUoLXdpZHRoKVxyXG4gICAgICAgICAgLnRpY2tGb3JtYXQoJycpXHJcbiAgICAgIClcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICcjRUVFRUVFJykgIC8vIEZJWEVEOiBMaWdodGVyIGdyaWRcclxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNycpXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICdub25lJylcclxuICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcwLjVweCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJYQXhpc0dyaWQoc3ZnOiBhbnksIHg6IGFueSwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3guYmFuZHdpZHRoKCkgLyAyfSwke2hlaWdodH0pYClcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgtaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciwgIzk5OTk5OSknKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpbmVZQXhpcyhzdmdZQXhpc1JpZ2h0OiBhbnksIGxpbmVZc2NhbGU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgeUxpbmVBeGlzID0gZDNcclxuICAgICAgLmF4aXNSaWdodChsaW5lWXNjYWxlKVxyXG4gICAgICAudGlja3ModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja0Zvcm1hdCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQxJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgICAgLmNhbGwoeUxpbmVBeGlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyQmFycyhzdmc6IGFueSwgY2hhcnRDb250ZXh0OiBhbnksIHNjYWxlczogYW55LCBkaW1lbnNpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgZGF0YSwgbWV0YURhdGEsIGtleUxpc3QsIGlzUmlhIH0gPSBjaGFydENvbnRleHQ7XHJcbiAgICBjb25zdCB7IHgsIHhTdWJncm91cCwgeSB9ID0gc2NhbGVzO1xyXG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGRpbWVuc2lvbnM7XHJcblxyXG4gICAgY29uc3Qgc3RhdGUgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5zZWxlY3RBbGwoJy5zdGF0ZScpXHJcbiAgICAgIC5kYXRhKGRhdGEpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IGB0cmFuc2xhdGUoJHt4KGQubmFtZSl9LDApYCk7XHJcblxyXG4gICAgc3RhdGVcclxuICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgIC5kYXRhKChkKSA9PiB0aGlzLnByZXBhcmVCYXJEYXRhKGQsIGtleUxpc3QpKVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQpID0+IHRoaXMuaGFuZGxlQmFyQ2xpY2soZCwgbWV0YURhdGEpKVxyXG4gICAgICAuYXR0cigneCcsIChkKSA9PiB0aGlzLmdldEJhclgoZCwgZGF0YSwgeCwgeFN1Ymdyb3VwKSlcclxuICAgICAgLmF0dHIoJ3knLCAoZCkgPT4geShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgKGQpID0+IHRoaXMuZ2V0QmFyV2lkdGgoZCwgZGF0YSwgeCwgeFN1Ymdyb3VwKSlcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiB0aGlzLmdldEJhckhlaWdodChkLCB5LCBoZWlnaHQpKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsIChkKSA9PiAobWV0YURhdGEuaGFzRHJpbGxEb3duICYmICFpc1JpYSA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JykpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuZ2V0QmFyQ29sb3IoZCwgbWV0YURhdGEpKTtcclxuXHJcbiAgICBpZiAoIWlzUmlhICYmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCB8fCAoIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgJiYgIXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wKSkpIHtcclxuICAgICAgc3RhdGUuc2VsZWN0QWxsKCdyZWN0Jykub24oJ21vdXNlb3V0JywgKGQsIGkpID0+IHRoaXMuaGFuZGxlTW91c2VPdXQoc3ZnKSkub24oJ21vdXNlb3ZlcicsIChkLCBpKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3ZlcihzdmcsIGQsIGRhdGEsIG1ldGFEYXRhLCB4LCB5LCBzY2FsZXMubGVmdEFuZFJpZ2h0U3BhY2VzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJCYXJUZXh0cyhzdGF0ZSwgZGF0YSwgbWV0YURhdGEsIGtleUxpc3QsIHgsIHhTdWJncm91cCwgeSwgaXNSaWEsIHN2Zyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUJhckRhdGEoZDogYW55LCBrZXlMaXN0OiBzdHJpbmdbXSk6IGFueVtdIHtcclxuICAgIHJldHVybiBrZXlMaXN0Lm1hcCgoa2V5KSA9PiAoeyBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUJhckNsaWNrKGQ6IGFueSwgbWV0YURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGQua2V5ID09PSAnVGFyZ2V0JykgcmV0dXJuO1xyXG4gICAgaWYgKFxyXG4gICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5sZW5ndGggfHxcclxuICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiYgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQ2xpY2soZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhclgoZDogYW55LCBkYXRhOiBhbnlbXSwgeDogYW55LCB4U3ViZ3JvdXA6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVEcmlsbGRvd25CYXJYKGQsIGRhdGEsIHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHhTdWJncm91cChkLmtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZURyaWxsZG93bkJhclgoZDogYW55LCBkYXRhOiBhbnlbXSwgeDogYW55KTogbnVtYmVyIHtcclxuICAgIGxldCB0ZW1wU2NhbGU7XHJcbiAgICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGluZGl2Lm5hbWUgPT09IGQubmFtZSkge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgICAgdGVtcFNjYWxlID0gdGhpcy5hZGp1c3REcmlsbGRvd25TY2FsZSh0ZW1wU2NhbGUsIGRhdGEsIHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGVtcFNjYWxlID8gdGVtcFNjYWxlKGQua2V5KSA6IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkanVzdERyaWxsZG93blNjYWxlKHRlbXBTY2FsZTogYW55LCBkYXRhOiBhbnlbXSwgeDogYW55KTogYW55IHtcclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBjb25zdCBrZXlzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoO1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBrZXlzTGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIG9mZnNldCkgLyAyLFxyXG4gICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIG9mZnNldCkgLyAyLFxyXG4gICAgICBdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbiAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbiAgICAgIF0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBTY2FsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QmFyV2lkdGgoZDogYW55LCBkYXRhOiBhbnlbXSwgeDogYW55LCB4U3ViZ3JvdXA6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICBsZXQgdGVtcFNjYWxlO1xyXG4gICAgICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgICAgIHRlbXBTY2FsZSA9IHRoaXMuYWRqdXN0RHJpbGxkb3duU2NhbGUodGVtcFNjYWxlLCBkYXRhLCB4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdGVtcFNjYWxlID8gdGVtcFNjYWxlLmJhbmR3aWR0aCgpIDogMDtcclxuICAgIH1cclxuICAgIHJldHVybiB4U3ViZ3JvdXAuYmFuZHdpZHRoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhckhlaWdodChkOiBhbnksIHk6IGFueSwgaGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKGQudmFsdWUgPT09IC0xKSByZXR1cm4gaGVpZ2h0IC0geSgwKTtcclxuICAgIGlmIChkLnZhbHVlKSByZXR1cm4gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuICAgIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCYXJDb2xvcihkOiBhbnksIG1ldGFEYXRhOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKFxyXG4gICAgICBkLnZhbHVlICYmXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgIGQudmFsdWUgPj0gcGFyc2VJbnQodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSAmJlxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0XHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXRbZC5rZXldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckJhclRleHRzKFxyXG4gICAgc3RhdGU6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgbWV0YURhdGE6IGFueSxcclxuICAgIGtleUxpc3Q6IHN0cmluZ1tdLFxyXG4gICAgeDogYW55LFxyXG4gICAgeFN1Ymdyb3VwOiBhbnksXHJcbiAgICB5OiBhbnksXHJcbiAgICBpc1JpYTogYm9vbGVhbixcclxuICAgIHN2ZzogYW55XHJcbiAgKTogdm9pZCB7XHJcbiAgICBzdGF0ZVxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLmRhdGEoKGQpID0+IHRoaXMucHJlcGFyZUJhckRhdGEoZCwga2V5TGlzdCkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgIC5hdHRyKCd5JywgMClcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4gICAgICAudGV4dCgoZCkgPT4gdGhpcy5nZXRCYXJUZXh0TGFiZWwoZCkpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICcjMDAwJylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICdib2xkJylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAoKSA9PiB0aGlzLmdldEJhclRleHRGb250U2l6ZSgpKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHRoaXMuZ2V0QmFyVGV4dFRyYW5zZm9ybShkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHkpKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQpID0+IHRoaXMuaGFuZGxlQmFyQ2xpY2soZCwgbWV0YURhdGEpKTtcclxuXHJcbiAgICBpZiAoIWlzUmlhKSB7XHJcbiAgICAgIHN0YXRlXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4gICAgICAgIC5vbignbW91c2VvdXQnLCAoZCwgaSkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcpKVxyXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKGQsIGkpID0+XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZU1vdXNlT3ZlcihzdmcsIGQsIGRhdGEsIG1ldGFEYXRhLCB4LCB5LCB4LmJhbmR3aWR0aCgpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhclRleHRMYWJlbChkOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFkLmtleSB8fCAhZC52YWx1ZSkgcmV0dXJuICcnO1xyXG4gICAgcmV0dXJuIGQua2V5Lmxlbmd0aCA+IDIwID8gZC5rZXkuc3Vic3RyaW5nKDAsIDE3KSArICcuLi4nIDogZC5rZXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhclRleHRGb250U2l6ZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTkwMCkgcmV0dXJuICcxOHB4JztcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCkgcmV0dXJuICcxMHB4JztcclxuICAgICAgcmV0dXJuICcxNHB4JztcclxuICAgIH1cclxuICAgIHJldHVybiAnMTRweCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhclRleHRUcmFuc2Zvcm0oZDogYW55LCBkYXRhOiBhbnlbXSwgeDogYW55LCB4U3ViZ3JvdXA6IGFueSwgeTogYW55KTogc3RyaW5nIHtcclxuICAgIGxldCB0ZW1wU2NhbGU7XHJcbiAgICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGluZGl2Lm5hbWUgPT09IGQubmFtZSkge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgICAgdGVtcFNjYWxlID0gdGhpcy5hZGp1c3REcmlsbGRvd25TY2FsZSh0ZW1wU2NhbGUsIGRhdGEsIHgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRBbHdheXNIb3Jpem9udGFsKSB7XHJcbiAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFN1Ymdyb3VwKGQua2V5KX0sJHt5KGQudmFsdWUpIC0gM30pYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGVtcFNjYWxlICYmICFpc05hTih0ZW1wU2NhbGUoZC5rZXkpKSkge1xyXG4gICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3RlbXBTY2FsZShkLmtleSkgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKiAwLjU1fSwke3koMCkgLSAxMH0pIHJvdGF0ZSgyNzApYDtcclxuICAgIH1cclxuICAgIHJldHVybiAndHJhbnNsYXRlKDAsMCknO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZU92ZXIoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIGQ6IGFueSxcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgbWV0YURhdGE6IGFueSxcclxuICAgIHg6IGFueSxcclxuICAgIHk6IGFueSxcclxuICAgIGxlZnRBbmRSaWdodFNwYWNlczogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuXHJcbiAgICBsZXQgdGVtcFNjYWxlO1xyXG4gICAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICAgIHRlbXBTY2FsZSA9IHRoaXMuYWRqdXN0RHJpbGxkb3duU2NhbGUodGVtcFNjYWxlLCBkYXRhLCB4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKCd4JywgKCkgPT4gdGhpcy5jYWxjdWxhdGVUb29sdGlwWChkLCB4LCB0ZW1wU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpKVxyXG4gICAgICAuYXR0cigneScsICgpID0+IHkoZC52YWx1ZSkgLSA0MylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgKCkgPT4gdGhpcy5jYWxjdWxhdGVUb29sdGlwV2lkdGgodGVtcFNjYWxlLCBtZXRhRGF0YSwgbGVmdEFuZFJpZ2h0U3BhY2VzKSlcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDQwKTtcclxuXHJcbiAgICBmb3JlaWduT2JqZWN0XHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDk5KVxyXG4gICAgICAuaHRtbCgoKSA9PiB0aGlzLmdldFRvb2x0aXBIVE1MKGQsIG1ldGFEYXRhKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBYKFxyXG4gICAgZDogYW55LFxyXG4gICAgeDogYW55LFxyXG4gICAgdGVtcFNjYWxlOiBhbnksXHJcbiAgICBtZXRhRGF0YTogYW55LFxyXG4gICAgbGVmdEFuZFJpZ2h0U3BhY2VzOiBudW1iZXJcclxuICApOiBudW1iZXIge1xyXG4gICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4gICAgICBpZiAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICAgIHJldHVybiB4KGQubmFtZSkgKyB0ZW1wU2NhbGUoZC5rZXkpICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDkwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgeChkLm5hbWUpICtcclxuICAgICAgICB0ZW1wU2NhbGUoZC5rZXkpIC1cclxuICAgICAgICAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICtcclxuICAgICAgICB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB4KGQubmFtZSkgK1xyXG4gICAgICB0ZW1wU2NhbGUoZC5rZXkpIC1cclxuICAgICAgKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArXHJcbiAgICAgIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBXaWR0aCh0ZW1wU2NhbGU6IGFueSwgbWV0YURhdGE6IGFueSwgbGVmdEFuZFJpZ2h0U3BhY2VzOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4gICAgICBpZiAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICAgIHJldHVybiAnMTgwcHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRvb2x0aXBIVE1MKGQ6IGFueSwgbWV0YURhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gICAgaWYgKCF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItbmFtZVwiPiR7ZC5uYW1lfTwvc3Bhbj48c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPiR7ZC52YWx1ZX08L3NwYW4+JHtkYXRhVHlwZX08L3NwYW4+YDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlbXBLZXkgPSBkLm5hbWUubGVuZ3RoIDw9IDggPyBkLm5hbWUgOiBkLm5hbWUuc3Vic3RyaW5nKDAsIDUpICsgJy4uLic7XHJcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItbmFtZVwiPiR7dGVtcEtleX06JHtkLnZhbHVlfSR7ZGF0YVR5cGV9PC9zcGFuPjxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLXZhbHVlXCI+JHtkLm5hbWV9PC9zcGFuPmA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3V0KHN2ZzogYW55KTogdm9pZCB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyTGFiZWxzKHN2Z0VsZW1lbnRzOiBhbnksIHNjYWxlczogYW55LCBjaGFydENvbnRleHQ6IGFueSwgZGltZW5zaW9uczogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB7IHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0IH0gPSBzdmdFbGVtZW50cztcclxuICAgIGNvbnN0IHsgbWV0YURhdGEgfSA9IGNoYXJ0Q29udGV4dDtcclxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgbWFyZ2luIH0gPSBkaW1lbnNpb25zO1xyXG5cclxuICAgIGlmIChtZXRhRGF0YS55TGFiZWwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJZQXhpc0xhYmVsKHN2Z1lBeGlzTGVmdCwgbWV0YURhdGEueUxhYmVsLCBoZWlnaHQsIG1hcmdpbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgICB0aGlzLnJlbmRlclhBeGlzTGFiZWwoc3ZnLCBtZXRhRGF0YS54TGFiZWwsIHdpZHRoLCBoZWlnaHQsIG1hcmdpbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLmxpbmV5TGFiZWwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJMaW5lWUF4aXNMYWJlbChzdmdZQXhpc1JpZ2h0LCBtZXRhRGF0YS5saW5leUxhYmVsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5wcml2YXRlIHJlbmRlcllBeGlzTGFiZWwoc3ZnWUF4aXNMZWZ0OiBhbnksIHlMYWJlbDogc3RyaW5nLCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIEZJWEVEOiBQcm9wZXIgWS1heGlzIGxhYmVsIHdpdGggY29ycmVjdCBwb3NpdGlvbmluZ1xyXG4gICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLXlsYWJlbC12aXNpYmxlJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgLW1hcmdpbi5sZWZ0KVxyXG4gICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMXB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciwgIzY2NjY2NiknKTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdmdZQXhpc0xlZnQuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKS50ZXh0KHlMYWJlbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLXdlZWtseUNoYXJ0cyBsaWIteWxhYmVsLXZpc2libGUnKVxyXG4gICAgICAgIC50ZXh0KHlMYWJlbC50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5wcml2YXRlIHJlbmRlclhBeGlzTGFiZWwoc3ZnOiBhbnksIHhMYWJlbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQWNyb255bSA9IHRoaXMuaXNBY3JvbnltKHhMYWJlbC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpKTtcclxuXHJcbiAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgIGJhc2VDbGFzcyArPSAnIGxpYi14bGFiZWwtZHJpbGxkb3duY2hhcnRzJztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBiYXNlQ2xhc3MgKz0gJyBsaWIteGxhYmVsLXdlZWtseUNoYXJ0cyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBiYXNlQ2xhc3MgKz0gJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4gICAgfVxyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgYmFzZUNsYXNzKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4gICAgICAvLyBGSVhFRDogQWRqdXN0ZWQgZm9yIHJlZHVjZWQgYm90dG9tIG1hcmdpblxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sJHtoZWlnaHQgKyAzMn0pYClcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciwgIzY2NjY2NiknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMXB4JylcclxuICAgICAgLnRleHQoaXNBY3JvbnltID8geExhYmVsLnRvVXBwZXJDYXNlKCkgOiB4TGFiZWwudG9Mb3dlckNhc2UoKSlcclxuICAgICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyb255bSA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQWNyb255bShsYWJlbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaW5lWUF4aXNMYWJlbChzdmdZQXhpc1JpZ2h0OiBhbnksIGxpbmV5TGFiZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGxpYi1saW5lLWF4aXMnKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApIHJvdGF0ZSg5MCknKVxyXG4gICAgICAuYXR0cigneScsIC0xMDApXHJcbiAgICAgIC5hdHRyKCd4JywgMTAwKVxyXG4gICAgICAuYXR0cignZHknLCAnNWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdzbWFsbGVyJylcclxuICAgICAgLnRleHQobGluZXlMYWJlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhcmdldExpbmUoc3ZnRWxlbWVudHM6IGFueSwgc2NhbGVzOiBhbnksIGNoYXJ0Q29udGV4dDogYW55LCBkaW1lbnNpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB7IHN2Zywgc3ZnWUF4aXNSaWdodCB9ID0gc3ZnRWxlbWVudHM7XHJcbiAgICBjb25zdCB7IHkgfSA9IHNjYWxlcztcclxuICAgIGNvbnN0IHsgd2lkdGggfSA9IGRpbWVuc2lvbnM7XHJcbiAgICBjb25zdCB7IG1ldGFEYXRhIH0gPSBjaGFydENvbnRleHQ7XHJcbiAgICBjb25zdCB0YXJnZXREYXRhOiBUYXJnZXRMaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhO1xyXG5cclxuICAgIGNvbnN0IHlaZXJvID0geSh0YXJnZXREYXRhLnRhcmdldCk7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgICAuYXR0cigneDEnLCAwKVxyXG4gICAgICAuYXR0cigneDInLCB3aWR0aClcclxuICAgICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbiAgICAgIC5hdHRyKCd5MicsIHlaZXJvKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgLnN0eWxlKCdzdHJva2UnLCB0YXJnZXREYXRhLmNvbG9yKTtcclxuXHJcbiAgICBjb25zdCByaWdodFN2Z1dpZHRoID0gNjA7XHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7eVplcm8gLSAzMH0pYClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmh0bWwoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGUgfHwgJyc7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRhcmdldERhdGEudGFyZ2V0TmFtZSB8fCAndGFyZ2V0JztcclxuICAgICAgICByZXR1cm4gYDxkaXY+JHt0YXJnZXROYW1lfTwvZGl2PjxkaXY+JHt0YXJnZXREYXRhLnRhcmdldH0ke2RhdGFUeXBlfTwvZGl2PmA7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaW5lR3JhcGgoc3ZnOiBhbnksIGNoYXJ0Q29udGV4dDogYW55LCBzY2FsZXM6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBsaW5lRGF0YSwgbWV0YURhdGEgfSA9IGNoYXJ0Q29udGV4dDtcclxuICAgIGlmICghbGluZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB7IHgsIGxpbmVZc2NhbGUgfSA9IHNjYWxlcztcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5kYXR1bShsaW5lRGF0YSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXHJcbiAgICAgIC5hdHRyKCdzdHJva2UnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEuNSlcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ2QnLFxyXG4gICAgICAgIGQzXHJcbiAgICAgICAgICAubGluZSgpXHJcbiAgICAgICAgICAueCgoZDogYW55KSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgICAgIC55KChkOiBhbnkpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgZG90ID0gc3ZnXHJcbiAgICAgIC5zZWxlY3RBbGwoJ215Q2lyY2xlcycpXHJcbiAgICAgIC5kYXRhKGxpbmVEYXRhKVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhKSk7XHJcblxyXG4gICAgZG90XHJcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbiAgICAgIC5hdHRyKCdjeCcsIChkOiBhbnkpID0+IHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgICAuYXR0cignY3knLCAoZDogYW55KSA9PiBsaW5lWXNjYWxlKGQudmFsdWUpKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcclxuICAgICAgLmF0dHIoJ3InLCAzKTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgICAgZG90XHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RvdCcpXHJcbiAgICAgICAgLmF0dHIoJ2NvbG9yJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogLjg1ZW0nKVxyXG4gICAgICAgIC5hdHRyKCd4JywgKGQ6IGFueSkgPT4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgICAgLmF0dHIoJ3knLCAoZDogYW55KSA9PiBsaW5lWXNjYWxlKGQudmFsdWUpKVxyXG4gICAgICAgIC5hdHRyKCdkeScsICctMWVtJylcclxuICAgICAgICAudGV4dCgoZDogYW55KSA9PiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEZvcm1hdHRlcihkLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDbGljayhkOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd24gfHwgZD8udG9nZ2xlRnJvbSkge1xyXG4gICAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlREQxQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUREMkNsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNERDJPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNERDFPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxufSIsIjxkaXZcclxuICAjZ3JvdXBjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZC1iZyk7XCJcclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuXHJcbjxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gID48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjNcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24pPVwiaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuPC9kaXY+XHJcblxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxXHJcbiAgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiXHJcbiAgW2hhc0RyaWxsRG93bl09XCJjaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duXCJcclxuICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiXHJcbiAgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgW2lzcmlhXT1cImN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVwiXHJcbiAgW3NlbGVjdGVkS3BpVG9vbHRvcF09XCJjaGFydENvbmZpZ3VyYXRpb24uc2VsZWN0ZWRLcGlUb29sdG9wXCJcclxuICAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gIFtpc0FsZXJ0RW5hYmxlZF09XCJpc0FsZXJ0RW5hYmxlZFwiXHJcbiAgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIlxyXG4+PC9saWItY2hhcnQtaGVhZGVyLXYxPlxyXG5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJncm91cGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICNncm91cGNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmdcIlxyXG4gID48L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|