axidio-styleguide-library1-v2 0.2.27 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/group-chart/group-chart.component.mjs +486 -1063
- package/esm2022/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.mjs +772 -1037
- package/esm2022/lib/horizontal-grouped-bar-with-scroll-zoom/horizontal-grouped-bar-with-scroll-zoom.component.mjs +1908 -982
- package/fesm2022/axidio-styleguide-library1-v2.mjs +3193 -3109
- package/fesm2022/axidio-styleguide-library1-v2.mjs.map +1 -1
- package/lib/group-chart/group-chart.component.d.ts +137 -12
- package/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.d.ts +133 -8
- package/lib/horizontal-grouped-bar-with-scroll-zoom/horizontal-grouped-bar-with-scroll-zoom.component.d.ts +34 -0
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ import * as i5 from "../chart-header-v3/chart-header-v3.component";
|
|
|
12
12
|
export class GroupChartComponent extends ComponentUniqueId {
|
|
13
13
|
constructor() {
|
|
14
14
|
super();
|
|
15
|
+
this.customChartConfiguration = {};
|
|
15
16
|
this.clickEvent = new EventEmitter();
|
|
16
17
|
this.headerMenuclickEvent = new EventEmitter();
|
|
17
18
|
this.isHeaderVisible = true;
|
|
@@ -19,6 +20,18 @@ export class GroupChartComponent extends ComponentUniqueId {
|
|
|
19
20
|
this.isTransparentBackground = false;
|
|
20
21
|
this.chartConfiguration = {};
|
|
21
22
|
this.objectKeys = Object.keys;
|
|
23
|
+
this.CONSTANTS = {
|
|
24
|
+
SHORT_TICK_LENGTH: 4,
|
|
25
|
+
LONG_TICK_LENGTH: 16,
|
|
26
|
+
SHORT_TICK_LENGTH_BG: 5,
|
|
27
|
+
LONG_TICK_LENGTH_BG: 30,
|
|
28
|
+
LEFT_RIGHT_SPACES: 50,
|
|
29
|
+
RIGHT_SVG_WIDTH: 60,
|
|
30
|
+
ZOOM_WIDTH_MULTIPLIER: 40,
|
|
31
|
+
DRILLDOWN_WIDTH_MULTIPLIER: 160,
|
|
32
|
+
MIN_BAR_WIDTH_SINGLE: 200,
|
|
33
|
+
MIN_BAR_WIDTH_MULTIPLE: 125,
|
|
34
|
+
};
|
|
22
35
|
this.defaultConfiguration = {
|
|
23
36
|
margin: { top: 20, right: 20, bottom: 20, left: 40 },
|
|
24
37
|
labelFormatter: ChartHelper.defaultFormatter,
|
|
@@ -31,22 +44,9 @@ export class GroupChartComponent extends ComponentUniqueId {
|
|
|
31
44
|
showLineChartAxis: true,
|
|
32
45
|
showValues: true,
|
|
33
46
|
headerMenuOptions: HeaderConfigHelper.headerConfig.headerMenuOptions,
|
|
34
|
-
xAxisGrid: undefined,
|
|
35
47
|
yAxisGrid: false,
|
|
36
48
|
legendVisible: true,
|
|
37
|
-
isHeaderVisible: undefined,
|
|
38
|
-
isTransparentBackground: undefined,
|
|
39
|
-
isMultiChartGridLine: undefined,
|
|
40
|
-
isFullScreen: undefined,
|
|
41
|
-
customYscale: undefined,
|
|
42
|
-
textsOnBar: undefined,
|
|
43
|
-
isXaxisLabelHidden: undefined,
|
|
44
49
|
isYaxisLabelHidden: false,
|
|
45
|
-
isYaxisHidden: undefined,
|
|
46
|
-
isYaxisDashed: undefined,
|
|
47
|
-
textFormatter: undefined,
|
|
48
|
-
isNoAlternateXaxisText: undefined,
|
|
49
|
-
isXgridBetweenLabels: undefined,
|
|
50
50
|
backgroundColor: '#FFFFFF',
|
|
51
51
|
hideLegendOnTop: true,
|
|
52
52
|
isXaxisColor: '#999999',
|
|
@@ -54,190 +54,141 @@ export class GroupChartComponent extends ComponentUniqueId {
|
|
|
54
54
|
noHoverEffect: true,
|
|
55
55
|
noHoverDisplayData: true,
|
|
56
56
|
showXaxisTop: true,
|
|
57
|
-
displayYaxisLabels: undefined,
|
|
58
|
-
xLabelsOnSameLine: undefined,
|
|
59
|
-
textAlwaysHorizontal: undefined,
|
|
60
|
-
legendAtTopRight: undefined,
|
|
61
|
-
isDrilldownChart: undefined,
|
|
62
|
-
displayTitleOnTop: undefined,
|
|
63
|
-
isToggleVisible: undefined,
|
|
64
|
-
isTitleHidden: undefined,
|
|
65
|
-
isDisplayBarDetailsAtBottom: undefined,
|
|
66
57
|
howmanyBarDetailsToDisplay: 0,
|
|
67
|
-
barVauleColor: undefined,
|
|
68
58
|
};
|
|
69
59
|
this.uniqueId = this.getUniqueId();
|
|
70
60
|
this.isZoomedOut = false;
|
|
71
61
|
this.isDD1Open = false;
|
|
72
62
|
this.isDD2Open = false;
|
|
73
|
-
this.keepOrder = (a
|
|
74
|
-
|
|
75
|
-
|
|
63
|
+
this.keepOrder = (a) => a;
|
|
64
|
+
}
|
|
65
|
+
ngOnInit() {
|
|
66
|
+
this.initializeConfiguration();
|
|
67
|
+
}
|
|
68
|
+
get isAlertEnabled() {
|
|
69
|
+
return this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert');
|
|
76
70
|
}
|
|
77
71
|
onResized(event) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}.bind(self), 10);
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
d3.select('#' + this.uniqueId).remove();
|
|
74
|
+
this.initializegroupChart();
|
|
75
|
+
}, 10);
|
|
83
76
|
}
|
|
84
|
-
|
|
77
|
+
handleZoominZoomoutClick({ isZoomOut, event }) {
|
|
85
78
|
this.isZoomedOut = isZoomOut;
|
|
86
79
|
this.onResized(event);
|
|
87
80
|
}
|
|
88
|
-
handleZoominZoomoutClick({ isZoomOut, event }) {
|
|
89
|
-
this.isZoomOutSelected(isZoomOut, event);
|
|
90
|
-
}
|
|
91
|
-
ngOnInit() { }
|
|
92
81
|
isLegendVisible() {
|
|
93
|
-
|
|
94
|
-
this.chartData.metaData.colors
|
|
95
|
-
Object.keys(this.chartData.metaData.colors).length > 1) {
|
|
96
|
-
return true;
|
|
97
|
-
}
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
get isAlertEnabled() {
|
|
101
|
-
return this.chartConfiguration?.headerMenuOptions?.some(option => option.id === 'editAlert');
|
|
82
|
+
return !!(this.chartData?.metaData?.colors &&
|
|
83
|
+
Object.keys(this.chartData.metaData.colors).length > 1);
|
|
102
84
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
let metaData = null;
|
|
107
|
-
let keyList = null;
|
|
108
|
-
let lineData = null;
|
|
109
|
-
let colorMap = {};
|
|
110
|
-
var formatFromBackend;
|
|
111
|
-
var formatForHugeNumbers;
|
|
112
|
-
let isria = this.customChartConfiguration.isRia;
|
|
113
|
-
var x;
|
|
114
|
-
var alternate_text = false;
|
|
115
|
-
var short_tick_length = 4;
|
|
116
|
-
var long_tick_length = 16;
|
|
117
|
-
/**
|
|
118
|
-
* longer tick length needed for weekly charts
|
|
119
|
-
*/
|
|
120
|
-
var short_tick_length_bg = 5;
|
|
121
|
-
var long_tick_length_bg = 30;
|
|
122
|
-
var leftAndRightSpaces = 50;
|
|
123
|
-
var rightSvgWidth = 60;
|
|
124
|
-
var tempScale;
|
|
125
|
-
for (var i in this.defaultConfiguration) {
|
|
126
|
-
this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(i, this.defaultConfiguration, this.customChartConfiguration);
|
|
85
|
+
initializeConfiguration() {
|
|
86
|
+
for (const key in this.defaultConfiguration) {
|
|
87
|
+
this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
|
|
127
88
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
lineData = this.chartData.lineData;
|
|
131
|
-
// if (lineData || this.chartData.targetLineData) {
|
|
132
|
-
// rightSvgWidth = 60;
|
|
133
|
-
// }
|
|
134
|
-
if (!metaData.colorAboveTarget) {
|
|
135
|
-
metaData['colorAboveTarget'] = metaData.colors;
|
|
89
|
+
if (this.chartConfiguration.isHeaderVisible !== undefined) {
|
|
90
|
+
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
136
91
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
var chartContainer = d3.select(this.containerElt.nativeElement);
|
|
140
|
-
var verticalstackedcontainer = d3.select(this.groupcontainerElt.nativeElement);
|
|
141
|
-
var margin = this.chartConfiguration.margin;
|
|
142
|
-
var width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
|
|
143
|
-
if (this.chartData.data.length > 30 && this.isZoomedOut) {
|
|
144
|
-
width =
|
|
145
|
-
width > this.chartData.data.length * 40
|
|
146
|
-
? this.chartData.dropdownData1
|
|
147
|
-
? this.chartData.data.length * 60
|
|
148
|
-
: width
|
|
149
|
-
: this.chartData.dropdownData1
|
|
150
|
-
? this.chartData.data.length * 60
|
|
151
|
-
: this.chartData.data.length * 40;
|
|
152
|
-
width =
|
|
153
|
-
width > this.chartData.data.length * 40
|
|
154
|
-
? width
|
|
155
|
-
: this.chartData.data.length * 40;
|
|
92
|
+
if (this.chartConfiguration.legendVisible !== undefined) {
|
|
93
|
+
this.legendVisible = this.chartConfiguration.legendVisible;
|
|
156
94
|
}
|
|
157
|
-
if (this.
|
|
158
|
-
|
|
159
|
-
this.isZoomedOut) {
|
|
160
|
-
width = this.chartData.data.length * 120;
|
|
95
|
+
if (this.chartConfiguration.isTransparentBackground !== undefined) {
|
|
96
|
+
this.isTransparentBackground = this.chartConfiguration.isTransparentBackground;
|
|
161
97
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
98
|
+
}
|
|
99
|
+
initializegroupChart() {
|
|
100
|
+
const data = this.chartData.data;
|
|
101
|
+
const metaData = this.prepareMetaData(this.chartData.metaData);
|
|
102
|
+
const lineData = this.chartData.lineData;
|
|
103
|
+
const isRia = this.chartConfiguration.isRia || false;
|
|
104
|
+
const { width, height } = this.calculateDimensions();
|
|
105
|
+
const { svg, svgYAxisLeft, svgYAxisRight } = this.createSvgContainers(width, height);
|
|
106
|
+
const scales = this.createScales(data, metaData, width, height, lineData);
|
|
107
|
+
this.renderAxes(svg, svgYAxisLeft, svgYAxisRight, scales, width, height);
|
|
108
|
+
this.renderBars(svg, data, metaData, scales, isRia);
|
|
109
|
+
this.renderLabels(svg, svgYAxisLeft, svgYAxisRight, metaData, width, height, scales);
|
|
110
|
+
this.renderTargetLine(svg, svgYAxisRight, scales.y, width);
|
|
111
|
+
this.renderLineGraph(svg, lineData, metaData, scales, isRia);
|
|
112
|
+
}
|
|
113
|
+
prepareMetaData(metaData) {
|
|
114
|
+
if (!metaData.colorAboveTarget) {
|
|
115
|
+
metaData.colorAboveTarget = metaData.colors;
|
|
116
|
+
}
|
|
117
|
+
return metaData;
|
|
118
|
+
}
|
|
119
|
+
calculateDimensions() {
|
|
120
|
+
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
121
|
+
const verticalstackedcontainer = d3.select(this.groupcontainerElt.nativeElement);
|
|
122
|
+
const margin = this.chartConfiguration.margin;
|
|
123
|
+
let width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
|
|
124
|
+
width = this.adjustWidthForZoom(width);
|
|
125
|
+
let height = this.calculateHeight(verticalstackedcontainer, margin);
|
|
126
|
+
return { width, height };
|
|
127
|
+
}
|
|
128
|
+
adjustWidthForZoom(width) {
|
|
129
|
+
const dataLength = this.chartData.data.length;
|
|
130
|
+
if (dataLength > 30 && this.isZoomedOut) {
|
|
131
|
+
const baseWidth = dataLength * this.CONSTANTS.ZOOM_WIDTH_MULTIPLIER;
|
|
132
|
+
const dropdownWidth = this.chartData.dropdownData1 ? dataLength * 60 : baseWidth;
|
|
133
|
+
width = Math.max(width, dropdownWidth);
|
|
134
|
+
}
|
|
135
|
+
if (this.chartData.dropdownData2 && width < dataLength * 120 && this.isZoomedOut) {
|
|
136
|
+
width = dataLength * 120;
|
|
137
|
+
}
|
|
138
|
+
if (dataLength > 8 && !this.isZoomedOut) {
|
|
139
|
+
width = this.chartData.dropdownData2 && width < dataLength * 250
|
|
140
|
+
? dataLength * 250
|
|
141
|
+
: dataLength * this.CONSTANTS.DRILLDOWN_WIDTH_MULTIPLIER;
|
|
142
|
+
}
|
|
143
|
+
return width;
|
|
144
|
+
}
|
|
145
|
+
calculateHeight(container, margin) {
|
|
146
|
+
let height = parseInt(container.style('height')) *
|
|
147
|
+
(this.chartConfiguration.svgHeight / 100) - margin.top - margin.bottom;
|
|
148
|
+
if (this.chartConfiguration.isFullScreen && this.chartConfiguration.svgHeight !== 70) {
|
|
149
|
+
height = this.chartConfiguration.svgHeight;
|
|
169
150
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// }
|
|
173
|
-
var height = parseInt(verticalstackedcontainer.style('height')) *
|
|
174
|
-
(self.chartConfiguration.svgHeight / 100) -
|
|
175
|
-
margin.top -
|
|
176
|
-
margin.bottom;
|
|
177
|
-
/**
|
|
178
|
-
* entire height used in weekly charts as x axis needed to be displayed at the bottom of the chart
|
|
179
|
-
*/
|
|
180
|
-
if (this.chartConfiguration.isFullScreen != undefined &&
|
|
181
|
-
this.chartConfiguration.isFullScreen) {
|
|
182
|
-
height =
|
|
183
|
-
this.chartConfiguration.svgHeight != 70
|
|
184
|
-
? this.chartConfiguration.svgHeight
|
|
185
|
-
: parseInt(verticalstackedcontainer.style('height'));
|
|
151
|
+
else if (this.chartConfiguration.isFullScreen) {
|
|
152
|
+
height = parseInt(container.style('height'));
|
|
186
153
|
}
|
|
187
154
|
if (this.chartConfiguration.isDrilldownChart && !this.isHeaderVisible) {
|
|
188
|
-
height =
|
|
189
|
-
parseInt(verticalstackedcontainer.style('height')) -
|
|
190
|
-
margin.top -
|
|
191
|
-
margin.bottom -
|
|
192
|
-
130;
|
|
155
|
+
height = parseInt(container.style('height')) - margin.top - margin.bottom - 130;
|
|
193
156
|
}
|
|
194
157
|
if (this.chartConfiguration.isHeaderVisible) {
|
|
195
|
-
height =
|
|
196
|
-
parseInt(verticalstackedcontainer.style('height')) -
|
|
197
|
-
margin.top -
|
|
198
|
-
margin.bottom -
|
|
199
|
-
100;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* for hiding header
|
|
203
|
-
* used by weekly charts
|
|
204
|
-
*/
|
|
205
|
-
if (this.chartConfiguration.isHeaderVisible != undefined)
|
|
206
|
-
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
207
|
-
/**
|
|
208
|
-
* for hiding legends
|
|
209
|
-
* used by weekly charts
|
|
210
|
-
*/
|
|
211
|
-
if (this.chartConfiguration.legendVisible != undefined) {
|
|
212
|
-
this.legendVisible = this.chartConfiguration.legendVisible;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* for removing background color so that it can take parents color
|
|
216
|
-
*
|
|
217
|
-
*/
|
|
218
|
-
if (this.chartConfiguration.isTransparentBackground != undefined) {
|
|
219
|
-
this.isTransparentBackground =
|
|
220
|
-
this.chartConfiguration.isTransparentBackground;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* format data values based on configuration received
|
|
224
|
-
*/
|
|
225
|
-
if (this.chartConfiguration.textFormatter != undefined) {
|
|
226
|
-
formatFromBackend = ChartHelper.dataValueFormatter(this.chartConfiguration.textFormatter);
|
|
227
|
-
formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
|
|
158
|
+
height = parseInt(container.style('height')) - margin.top - margin.bottom - 100;
|
|
228
159
|
}
|
|
229
|
-
|
|
160
|
+
return height;
|
|
161
|
+
}
|
|
162
|
+
createSvgContainers(width, height) {
|
|
163
|
+
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
164
|
+
const margin = this.chartConfiguration.margin;
|
|
165
|
+
const outerContainer = chartContainer
|
|
230
166
|
.append('div')
|
|
231
|
-
.attr('id',
|
|
167
|
+
.attr('id', this.uniqueId)
|
|
232
168
|
.attr('class', 'outer-container')
|
|
233
169
|
.style('width', '100%')
|
|
234
|
-
.style('height', height)
|
|
170
|
+
.style('height', height + 'px')
|
|
235
171
|
.style('overflow-x', 'hidden')
|
|
236
172
|
.style('padding-left', `${margin.left}px`)
|
|
237
|
-
|
|
238
|
-
.style('padding-right', `${rightSvgWidth}px`)
|
|
173
|
+
.style('padding-right', `${this.CONSTANTS.RIGHT_SVG_WIDTH}px`)
|
|
239
174
|
.style('margin-left', '15px');
|
|
240
|
-
|
|
175
|
+
const svgYAxisLeft = this.createLeftYAxis(outerContainer, height, margin);
|
|
176
|
+
const svgYAxisRight = this.createRightYAxis(outerContainer, height, margin);
|
|
177
|
+
const innerContainer = outerContainer
|
|
178
|
+
.append('div')
|
|
179
|
+
.attr('class', 'inner-container')
|
|
180
|
+
.style('width', '100%')
|
|
181
|
+
.style('overflow-x', 'auto');
|
|
182
|
+
const svg = innerContainer
|
|
183
|
+
.append('svg')
|
|
184
|
+
.attr('width', width - this.CONSTANTS.RIGHT_SVG_WIDTH)
|
|
185
|
+
.attr('height', height + margin.top + margin.bottom + 30)
|
|
186
|
+
.append('g')
|
|
187
|
+
.attr('transform', `translate(0, ${margin.top})`);
|
|
188
|
+
return { svg, svgYAxisLeft, svgYAxisRight };
|
|
189
|
+
}
|
|
190
|
+
createLeftYAxis(container, height, margin) {
|
|
191
|
+
return container
|
|
241
192
|
.append('svg')
|
|
242
193
|
.attr('width', '100')
|
|
243
194
|
.attr('height', height + margin.top + margin.bottom + 10)
|
|
@@ -245,971 +196,443 @@ export class GroupChartComponent extends ComponentUniqueId {
|
|
|
245
196
|
.style('left', '0')
|
|
246
197
|
.style('z-index', 1)
|
|
247
198
|
.append('g')
|
|
248
|
-
.attr('transform',
|
|
249
|
-
|
|
199
|
+
.attr('transform', `translate(${margin.left + 15}, ${margin.top})`);
|
|
200
|
+
}
|
|
201
|
+
createRightYAxis(container, height, margin) {
|
|
202
|
+
return container
|
|
250
203
|
.append('svg')
|
|
251
|
-
.attr('width',
|
|
204
|
+
.attr('width', this.CONSTANTS.RIGHT_SVG_WIDTH)
|
|
252
205
|
.attr('height', height + margin.top + margin.bottom + 10)
|
|
253
206
|
.style('position', 'absolute')
|
|
254
207
|
.style('right', '12px')
|
|
255
208
|
.style('z-index', 1)
|
|
256
209
|
.append('g')
|
|
257
|
-
.attr('transform',
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
.
|
|
270
|
-
.
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
.
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* x axis range made similar to line chart or vertical stack so that all the charts will get aligned with each other.
|
|
279
|
-
*/
|
|
280
|
-
if (this.chartConfiguration.isMultiChartGridLine != undefined) {
|
|
281
|
-
x = d3
|
|
282
|
-
.scaleBand()
|
|
283
|
-
.rangeRound([width, 0])
|
|
284
|
-
.align(0.5)
|
|
285
|
-
.padding([0.5])
|
|
286
|
-
.domain(data.map(function (d) {
|
|
287
|
-
return d.name.toLowerCase();
|
|
288
|
-
}));
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
x = d3
|
|
292
|
-
.scaleBand()
|
|
293
|
-
.domain(groups)
|
|
294
|
-
.range([leftAndRightSpaces, width - rightSvgWidth - leftAndRightSpaces])
|
|
295
|
-
.padding([0.3]);
|
|
296
|
-
}
|
|
297
|
-
// x.bandwidth(96);
|
|
298
|
-
var xScaleFromOrigin = d3
|
|
210
|
+
.attr('transform', `translate(0, ${margin.top})`);
|
|
211
|
+
}
|
|
212
|
+
createScales(data, metaData, width, height, lineData) {
|
|
213
|
+
const { x, xScaleFromOrigin } = this.createXScales(data, width);
|
|
214
|
+
const y = this.createYScale(data, metaData.keyList, height);
|
|
215
|
+
const xSubgroup = this.createSubgroupScale(metaData.keyList, x);
|
|
216
|
+
const lineYscale = lineData ? this.createLineYScale(lineData, height) : null;
|
|
217
|
+
return { x, xScaleFromOrigin, y, xSubgroup, lineYscale };
|
|
218
|
+
}
|
|
219
|
+
createXScales(data, width) {
|
|
220
|
+
const groups = data.map((d) => d.name);
|
|
221
|
+
const x = d3
|
|
222
|
+
.scaleBand()
|
|
223
|
+
.domain(groups)
|
|
224
|
+
.range([
|
|
225
|
+
this.CONSTANTS.LEFT_RIGHT_SPACES,
|
|
226
|
+
width - this.CONSTANTS.RIGHT_SVG_WIDTH - this.CONSTANTS.LEFT_RIGHT_SPACES,
|
|
227
|
+
])
|
|
228
|
+
.padding(0.3);
|
|
229
|
+
const xScaleFromOrigin = d3
|
|
299
230
|
.scaleBand()
|
|
300
231
|
.domain(groups)
|
|
301
|
-
.range([0, width -
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
if (this.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
232
|
+
.range([0, width - this.CONSTANTS.RIGHT_SVG_WIDTH]);
|
|
233
|
+
return { x, xScaleFromOrigin };
|
|
234
|
+
}
|
|
235
|
+
createYScale(data, keyList, height) {
|
|
236
|
+
let maxValue = d3.max(data, (d) => d3.max(keyList, (key) => +d[key])) || 0;
|
|
237
|
+
if (maxValue === 0) {
|
|
238
|
+
maxValue = this.chartData.targetLineData
|
|
239
|
+
? this.chartData.targetLineData.target + 20
|
|
240
|
+
: 100;
|
|
241
|
+
}
|
|
242
|
+
if (this.chartConfiguration.customYscale) {
|
|
243
|
+
maxValue *= this.chartConfiguration.customYscale;
|
|
244
|
+
}
|
|
245
|
+
if (this.chartData.targetLineData && maxValue < this.chartData.targetLineData.target) {
|
|
246
|
+
const target = this.chartData.targetLineData.target;
|
|
247
|
+
maxValue = maxValue < 10 && target < 10 ? target + 3 : target + 20;
|
|
248
|
+
}
|
|
249
|
+
return d3.scaleLinear().domain([0, maxValue]).range([height, 0]).nice();
|
|
250
|
+
}
|
|
251
|
+
createSubgroupScale(subgroups, x) {
|
|
252
|
+
return d3.scaleBand().domain(subgroups).range([0, x.bandwidth()]);
|
|
253
|
+
}
|
|
254
|
+
createLineYScale(lineData, height) {
|
|
255
|
+
let maxLineValue = d3.max(lineData, (d) => +d.value) || 0;
|
|
256
|
+
maxLineValue *= this.chartConfiguration.customYscale || 1;
|
|
257
|
+
let minLineValue = d3.min(lineData, (d) => +d.value) || 0;
|
|
258
|
+
if (maxLineValue > 0)
|
|
259
|
+
minLineValue -= 3;
|
|
260
|
+
if (minLineValue > 0)
|
|
261
|
+
minLineValue = 0;
|
|
262
|
+
return d3
|
|
263
|
+
.scaleLinear()
|
|
264
|
+
.domain([minLineValue, maxLineValue])
|
|
265
|
+
.range([height, minLineValue]);
|
|
266
|
+
}
|
|
267
|
+
renderAxes(svg, svgYAxisLeft, svgYAxisRight, scales, width, height) {
|
|
268
|
+
this.renderXAxis(svg, scales.x, height);
|
|
269
|
+
this.renderYAxis(svg, svgYAxisLeft, scales.y, width, height);
|
|
270
|
+
this.renderGridLines(svg, scales, width, height);
|
|
271
|
+
}
|
|
272
|
+
renderXAxis(svg, x, height) {
|
|
273
|
+
if (!this.chartConfiguration.isMultiChartGridLine) {
|
|
318
274
|
svg
|
|
319
275
|
.append('g')
|
|
320
276
|
.attr('class', 'x1 axis1')
|
|
321
|
-
.attr('transform',
|
|
277
|
+
.attr('transform', `translate(0, ${height})`)
|
|
322
278
|
.call(d3.axisBottom(x))
|
|
323
279
|
.call((g) => g.select('.domain').remove());
|
|
324
280
|
svg.selectAll('g.x1.axis1 g.tick line').remove();
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
.selectAll('g.x1.axis1 g.tick text')
|
|
328
|
-
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
329
|
-
.style('fill', 'var(--chart-text-color)')
|
|
330
|
-
.attr('y', 32); // Increase distance from bars (default is ~9)
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
svg
|
|
334
|
-
.selectAll('g.x1.axis1 g.tick text')
|
|
335
|
-
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
336
|
-
.style('fill', 'var(--chart-text-color)');
|
|
337
|
-
}
|
|
338
|
-
// .attr('y', function () {
|
|
339
|
-
// if (alternate_text) {
|
|
340
|
-
// alternate_text = false;
|
|
341
|
-
// return long_tick_length + 1;
|
|
342
|
-
// } else {
|
|
343
|
-
// alternate_text = true;
|
|
344
|
-
// return short_tick_length + 1;
|
|
345
|
-
// }
|
|
346
|
-
// });
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
/**
|
|
350
|
-
* bigger ticks for weekly charts and more space from x axis to labels
|
|
351
|
-
*/
|
|
352
|
-
/**
|
|
353
|
-
* draw x axis
|
|
354
|
-
*/
|
|
355
|
-
svg
|
|
356
|
-
.append('g')
|
|
357
|
-
.attr('class', 'x1 axis1')
|
|
358
|
-
.attr('transform', 'translate(0,' + height + ')')
|
|
359
|
-
.call(d3.axisBottom(x).tickSize(0))
|
|
360
|
-
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
361
|
-
/**
|
|
362
|
-
* tick line size in alternate fashion
|
|
363
|
-
*/
|
|
364
|
-
svg.selectAll('g.x1.axis1 g.tick line').attr('y2', function () {
|
|
365
|
-
if (alternate_text &&
|
|
366
|
-
self.chartConfiguration.isNoAlternateXaxisText == undefined) {
|
|
367
|
-
alternate_text = false;
|
|
368
|
-
return long_tick_length_bg - 7;
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
alternate_text = true;
|
|
372
|
-
return short_tick_length_bg - 4;
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
/**
|
|
376
|
-
* reset the flag so that values can be shown in same alternate fashion
|
|
377
|
-
*/
|
|
378
|
-
alternate_text = false;
|
|
379
|
-
/**
|
|
380
|
-
* print x-axis label texts
|
|
381
|
-
* used by weekly charts
|
|
382
|
-
*/
|
|
281
|
+
const yOffset = this.chartData.metaData.keyList.length > 1 &&
|
|
282
|
+
!this.chartData.metaData.xLabel ? 32 : 0;
|
|
383
283
|
svg
|
|
384
284
|
.selectAll('g.x1.axis1 g.tick text')
|
|
385
|
-
.attr('class', 'lib-xaxis-labels-texts-weeklycharts')
|
|
386
|
-
.attr('y', function () {
|
|
387
|
-
if (alternate_text) {
|
|
388
|
-
alternate_text = false;
|
|
389
|
-
return long_tick_length_bg;
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
alternate_text = true;
|
|
393
|
-
return short_tick_length_bg;
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
if (self.chartConfiguration.xLabelsOnSameLine) {
|
|
398
|
-
svg
|
|
399
|
-
.selectAll('g.x1.axis1 g.tick text')
|
|
400
|
-
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
401
|
-
.attr('y', short_tick_length_bg)
|
|
402
|
-
.text(function (d) {
|
|
403
|
-
var isValueToBeIgnored = false;
|
|
404
|
-
data.map((indiv) => {
|
|
405
|
-
if (indiv.name.toLowerCase() == d.trim().toLowerCase() &&
|
|
406
|
-
indiv[metaData.keyList[0]] == -1) {
|
|
407
|
-
isValueToBeIgnored = true;
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
if (isValueToBeIgnored) {
|
|
411
|
-
return '';
|
|
412
|
-
}
|
|
413
|
-
if (d.trim().indexOf(' ') > -1) {
|
|
414
|
-
return d.trim().substring(0, d.indexOf(' ')).toLowerCase();
|
|
415
|
-
}
|
|
416
|
-
return d.toLowerCase();
|
|
417
|
-
});
|
|
418
|
-
svg
|
|
419
|
-
.selectAll('g.x1.axis1 g.tick')
|
|
420
|
-
.append('text')
|
|
421
285
|
.attr('class', 'lib-xaxis-labels-texts-drilldown')
|
|
422
|
-
.
|
|
423
|
-
.attr('
|
|
424
|
-
.text(function (d) {
|
|
425
|
-
if (d.trim().indexOf(' ') > -1) {
|
|
426
|
-
return d.trim().substring(d.indexOf(' '), d.length).toLowerCase();
|
|
427
|
-
}
|
|
428
|
-
return '';
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
/**y scale for left y axis */
|
|
432
|
-
var y = d3.scaleLinear().rangeRound([height, 0]);
|
|
433
|
-
var maxValue = d3.max(data, (d) => d3.max(keyList, (key) => +d[key]));
|
|
434
|
-
if (maxValue == 0) {
|
|
435
|
-
if (this.chartData.targetLineData) {
|
|
436
|
-
maxValue = this.chartData.targetLineData.target + 20;
|
|
437
|
-
}
|
|
438
|
-
else {
|
|
439
|
-
maxValue = 100;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
if (self.chartConfiguration.yAxisGrid) {
|
|
443
|
-
// svg
|
|
444
|
-
// .append('g')
|
|
445
|
-
// .attr('class', 'grid')
|
|
446
|
-
// .call(
|
|
447
|
-
// d3
|
|
448
|
-
// .axisLeft(y)
|
|
449
|
-
// .ticks(self.chartConfiguration.numberOfYTicks)
|
|
450
|
-
// .tickSize(-width)
|
|
451
|
-
// .tickFormat('')
|
|
452
|
-
// )
|
|
453
|
-
// // .style('stroke-dasharray', '5 5')
|
|
454
|
-
// .style('color', '#B9B9B9')
|
|
455
|
-
// .style('opacity', '0.5')
|
|
456
|
-
// .call((g) => g.select('.domain').remove());
|
|
457
|
-
}
|
|
458
|
-
if (this.chartConfiguration.customYscale) {
|
|
459
|
-
/**
|
|
460
|
-
* increase y-scale so that values wont cross or exceed out of range
|
|
461
|
-
* used in weekly charts
|
|
462
|
-
*/
|
|
463
|
-
maxValue = maxValue * this.chartConfiguration.customYscale;
|
|
464
|
-
}
|
|
465
|
-
if (this.chartData.targetLineData &&
|
|
466
|
-
maxValue < this.chartData.targetLineData.target) {
|
|
467
|
-
maxValue =
|
|
468
|
-
maxValue < 10 && this.chartData.targetLineData.target < 10
|
|
469
|
-
? this.chartData.targetLineData.target + 3
|
|
470
|
-
: this.chartData.targetLineData.target + 20;
|
|
471
|
-
}
|
|
472
|
-
y.domain([0, maxValue]).nice();
|
|
473
|
-
let lineYscale;
|
|
474
|
-
if (lineData != null) {
|
|
475
|
-
let maxLineValue = d3.max(lineData, function (d) {
|
|
476
|
-
return +d.value;
|
|
477
|
-
});
|
|
478
|
-
maxLineValue = maxLineValue * this.chartConfiguration.customYscale;
|
|
479
|
-
let minLineValue = d3.min(lineData, function (d) {
|
|
480
|
-
return +d.value;
|
|
481
|
-
});
|
|
482
|
-
if (maxLineValue > 0)
|
|
483
|
-
minLineValue = minLineValue - 3;
|
|
484
|
-
if (minLineValue > 0) {
|
|
485
|
-
minLineValue = 0;
|
|
486
|
-
}
|
|
487
|
-
lineYscale = d3
|
|
488
|
-
.scaleLinear()
|
|
489
|
-
.domain([minLineValue, maxLineValue])
|
|
490
|
-
.range([height, minLineValue]);
|
|
491
|
-
}
|
|
492
|
-
let yLineAxis;
|
|
493
|
-
if (lineYscale != null) {
|
|
494
|
-
yLineAxis = d3
|
|
495
|
-
.axisRight(lineYscale)
|
|
496
|
-
.ticks(self.chartConfiguration.numberOfYTicks)
|
|
497
|
-
.tickSize(0)
|
|
498
|
-
.tickFormat(self.chartConfiguration.yLineAxisLabelFomatter);
|
|
286
|
+
.style('fill', 'var(--chart-text-color)')
|
|
287
|
+
.attr('y', yOffset);
|
|
499
288
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
289
|
+
}
|
|
290
|
+
renderYAxis(svg, svgYAxisLeft, y, width, height) {
|
|
291
|
+
svgYAxisLeft
|
|
292
|
+
.append('g')
|
|
293
|
+
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
294
|
+
.attr('style', this.chartConfiguration.yAxisCustomTextStyles)
|
|
295
|
+
.call(d3
|
|
296
|
+
.axisLeft(y)
|
|
297
|
+
.tickSize(0)
|
|
298
|
+
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
299
|
+
.tickFormat(this.chartConfiguration.yAxisLabelFomatter))
|
|
300
|
+
.selectAll('text')
|
|
301
|
+
.style('fill', 'var(--chart-text-color)');
|
|
302
|
+
this.applyAxisVisibility();
|
|
303
|
+
}
|
|
304
|
+
renderGridLines(svg, scales, width, height) {
|
|
305
|
+
if (this.chartConfiguration.isXgridBetweenLabels) {
|
|
505
306
|
svg
|
|
506
307
|
.append('g')
|
|
507
308
|
.attr('class', 'grid')
|
|
508
|
-
.attr('transform',
|
|
509
|
-
.call(d3.axisBottom(x).tickSize(-height).tickFormat(''))
|
|
309
|
+
.attr('transform', `translate(${scales.x.bandwidth() / 2}, ${height})`)
|
|
310
|
+
.call(d3.axisBottom(scales.x).tickSize(-height).tickFormat(''))
|
|
510
311
|
.style('stroke-dasharray', '5 5')
|
|
511
312
|
.style('color', 'var(--chart-grid-color, #999999)')
|
|
512
313
|
.call((g) => g.select('.domain').remove());
|
|
513
314
|
}
|
|
514
315
|
if (this.chartConfiguration.yAxisGrid) {
|
|
515
|
-
/**
|
|
516
|
-
* draw y axis
|
|
517
|
-
*/
|
|
518
316
|
svg
|
|
519
317
|
.append('g')
|
|
520
318
|
.call(d3
|
|
521
|
-
.axisLeft(y)
|
|
522
|
-
.ticks(
|
|
319
|
+
.axisLeft(scales.y)
|
|
320
|
+
.ticks(this.chartConfiguration.numberOfYTicks)
|
|
523
321
|
.tickSize(-width))
|
|
524
322
|
.style('color', 'var(--chart-axis-color, #B9B9B9)')
|
|
525
323
|
.style('opacity', '0.5')
|
|
526
324
|
.call((g) => g.select('.domain').remove());
|
|
527
325
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
.style('color', '#B9B9B9')
|
|
533
|
-
.style('opacity', '0.5')
|
|
534
|
-
.call((g) => g.select('.domain').remove());
|
|
326
|
+
}
|
|
327
|
+
applyAxisVisibility() {
|
|
328
|
+
if (this.chartConfiguration.isXaxisLabelHidden) {
|
|
329
|
+
d3.selectAll('g.lib-line-x-axis-text > g > text').attr('class', 'lib-display-hidden');
|
|
535
330
|
}
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
xSubgroup.range([0, x.bandwidth()]);
|
|
331
|
+
if (this.chartConfiguration.isYaxisLabelHidden) {
|
|
332
|
+
d3.selectAll('.yaxis-dashed > g > text').attr('class', 'lib-display-hidden');
|
|
539
333
|
}
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
* used to make grouped bars with lesser width as we are not using padding for width
|
|
543
|
-
* used by weekly charts
|
|
544
|
-
*/
|
|
545
|
-
xSubgroup.range([0, x.bandwidth()]);
|
|
334
|
+
if (this.chartConfiguration.isYaxisHidden) {
|
|
335
|
+
d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
|
|
546
336
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
// .domain(subgroups)
|
|
556
|
-
// .range(Object.values(metaData.colorAboveTarget));
|
|
557
|
-
var state = svg
|
|
337
|
+
if (this.chartConfiguration.isYaxisDashed) {
|
|
338
|
+
d3.selectAll('.yaxis-dashed')
|
|
339
|
+
.style('stroke-dasharray', '5 5')
|
|
340
|
+
.style('color', '#999999');
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
renderBars(svg, data, metaData, scales, isRia) {
|
|
344
|
+
const state = svg
|
|
558
345
|
.append('g')
|
|
559
346
|
.selectAll('.state')
|
|
560
347
|
.data(data)
|
|
561
348
|
.enter()
|
|
562
349
|
.append('g')
|
|
563
|
-
.attr('transform',
|
|
564
|
-
return 'translate(' + x(d.name) + ',0)';
|
|
565
|
-
});
|
|
350
|
+
.attr('transform', (d) => `translate(${scales.x(d.name)}, 0)`);
|
|
566
351
|
state
|
|
567
352
|
.selectAll('rect')
|
|
568
|
-
.data(
|
|
569
|
-
let newList = [];
|
|
570
|
-
subgroups.map(function (key) {
|
|
571
|
-
// if (key !== "group") {
|
|
572
|
-
let obj = { key: key, value: d[key], name: d.name };
|
|
573
|
-
newList.push(obj);
|
|
574
|
-
// }
|
|
575
|
-
});
|
|
576
|
-
return newList;
|
|
577
|
-
})
|
|
353
|
+
.data((d) => this.prepareBarData(d, metaData.keyList))
|
|
578
354
|
.enter()
|
|
579
355
|
.append('rect')
|
|
580
356
|
.attr('class', 'bars')
|
|
581
|
-
.on('click',
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
617
|
-
]);
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
});
|
|
621
|
-
return tempScale(d.key);
|
|
622
|
-
}
|
|
623
|
-
return xSubgroup(d.key);
|
|
624
|
-
})
|
|
625
|
-
.attr('y', function (d) {
|
|
626
|
-
return y(d.value);
|
|
627
|
-
})
|
|
628
|
-
.attr('width', function (d) {
|
|
629
|
-
if (self.chartConfiguration.isDrilldownChart) {
|
|
630
|
-
// var tempScale;
|
|
631
|
-
data.map((indiv) => {
|
|
632
|
-
if (indiv.name == d.name) {
|
|
633
|
-
let keys = Object.keys(indiv).filter((temp, i) => i != 0);
|
|
634
|
-
var temp;
|
|
635
|
-
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
636
|
-
if (x.bandwidth() > 100) {
|
|
637
|
-
if (self.chartData.data.length == 1) {
|
|
638
|
-
if (Object.keys(self.chartData.data[0]).length == 2) {
|
|
639
|
-
tempScale.range([
|
|
640
|
-
0 + (x.bandwidth() - 200) / 2,
|
|
641
|
-
x.bandwidth() - (x.bandwidth() - 200) / 2,
|
|
642
|
-
]);
|
|
643
|
-
// .padding(0.05);
|
|
644
|
-
}
|
|
645
|
-
else
|
|
646
|
-
tempScale.range([
|
|
647
|
-
0 + (x.bandwidth() - 300) / 2,
|
|
648
|
-
x.bandwidth() - (x.bandwidth() - 300) / 2,
|
|
649
|
-
]);
|
|
650
|
-
// .padding(0.05);
|
|
651
|
-
}
|
|
652
|
-
else
|
|
653
|
-
tempScale.range([
|
|
654
|
-
0 + (x.bandwidth() - 125) / 2,
|
|
655
|
-
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
656
|
-
]);
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
});
|
|
660
|
-
return tempScale.bandwidth();
|
|
661
|
-
}
|
|
662
|
-
return xSubgroup.bandwidth();
|
|
663
|
-
})
|
|
664
|
-
.attr('height', function (d) {
|
|
665
|
-
if (d.value == -1) {
|
|
666
|
-
return height - y(0);
|
|
357
|
+
.on('click', (d) => this.handleBarClick(d, metaData))
|
|
358
|
+
.attr('x', (d) => this.getBarX(d, scales, data))
|
|
359
|
+
.attr('y', (d) => scales.y(d.value))
|
|
360
|
+
.attr('width', (d) => this.getBarWidth(d, scales, data))
|
|
361
|
+
.attr('height', (d) => this.getBarHeight(d, scales))
|
|
362
|
+
.style('cursor', metaData.hasDrillDown && !isRia ? 'pointer' : 'default')
|
|
363
|
+
.attr('fill', (d) => this.getBarColor(d, metaData));
|
|
364
|
+
if (!isRia && (this.chartConfiguration.displayTitleOnTop || !this.chartConfiguration.textsOnBar)) {
|
|
365
|
+
state.selectAll('rect')
|
|
366
|
+
.on('mouseout', () => this.handleMouseOut(svg))
|
|
367
|
+
.on('mouseover', (d) => this.handleMouseOver(d, svg, scales, metaData, data));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
prepareBarData(d, keyList) {
|
|
371
|
+
return keyList.map((key) => ({ key, value: d[key], name: d.name }));
|
|
372
|
+
}
|
|
373
|
+
handleBarClick(d, metaData) {
|
|
374
|
+
if (d.key === 'Target')
|
|
375
|
+
return;
|
|
376
|
+
const shouldBlock = metaData.barWithoutClick?.length &&
|
|
377
|
+
(metaData.barWithoutClick.includes(d?.name) || metaData.barWithoutClick.includes(d?.key));
|
|
378
|
+
if (!shouldBlock) {
|
|
379
|
+
this.handleClick(d);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
getBarX(d, scales, data) {
|
|
383
|
+
if (!this.chartConfiguration.isDrilldownChart) {
|
|
384
|
+
return scales.xSubgroup(d.key);
|
|
385
|
+
}
|
|
386
|
+
let tempScale = scales.xSubgroup;
|
|
387
|
+
data.forEach((indiv) => {
|
|
388
|
+
if (indiv.name === d.name) {
|
|
389
|
+
const keys = Object.keys(indiv).filter((_, i) => i !== 0);
|
|
390
|
+
tempScale = d3.scaleBand().domain(keys).range([0, scales.x.bandwidth()]);
|
|
391
|
+
tempScale = this.adjustScaleForWidth(tempScale, scales.x.bandwidth(), data.length);
|
|
667
392
|
}
|
|
668
|
-
if (d.value)
|
|
669
|
-
return height - y(d.value);
|
|
670
|
-
return height - y(0);
|
|
671
|
-
})
|
|
672
|
-
// .style('cursor', 'pointer')
|
|
673
|
-
.style('cursor', function (d) {
|
|
674
|
-
if (metaData.hasDrillDown && !isria)
|
|
675
|
-
return 'pointer';
|
|
676
|
-
else
|
|
677
|
-
return 'default';
|
|
678
|
-
})
|
|
679
|
-
.attr('fill', function (d) {
|
|
680
|
-
if (d.value &&
|
|
681
|
-
self.chartData.targetLineData &&
|
|
682
|
-
d.value >= parseInt(self.chartData.targetLineData.target) &&
|
|
683
|
-
self.chartData.metaData.colorAboveTarget)
|
|
684
|
-
return self.chartData.metaData.colorAboveTarget[d.key];
|
|
685
|
-
return self.chartData.metaData.colors[d.key];
|
|
686
393
|
});
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
if (this.chartConfiguration.
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
return newList;
|
|
700
|
-
})
|
|
701
|
-
.enter()
|
|
702
|
-
.append('text')
|
|
703
|
-
.attr('x', function (d) {
|
|
704
|
-
return 0;
|
|
705
|
-
})
|
|
706
|
-
.attr('y', function (d) {
|
|
707
|
-
return 0;
|
|
708
|
-
})
|
|
709
|
-
.attr('class', 'lib-data-labels-weeklycharts')
|
|
710
|
-
.text(function (d) {
|
|
711
|
-
return d.key && d.value
|
|
712
|
-
? d.key.length > 20
|
|
713
|
-
? d.key.substring(0, 17) + '...'
|
|
714
|
-
: d.key
|
|
715
|
-
: '';
|
|
716
|
-
})
|
|
717
|
-
.style('fill', function (d) {
|
|
718
|
-
return '#000';
|
|
719
|
-
})
|
|
720
|
-
.style('font-weight', 'bold')
|
|
721
|
-
.style('font-size', function (d) {
|
|
722
|
-
if (self.chartConfiguration.isDrilldownChart) {
|
|
723
|
-
if (window.innerWidth > 1900) {
|
|
724
|
-
return '18px';
|
|
725
|
-
}
|
|
726
|
-
else if (window.innerWidth < 1400) {
|
|
727
|
-
return '10px';
|
|
728
|
-
}
|
|
729
|
-
else {
|
|
730
|
-
return '14px';
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
else {
|
|
734
|
-
return '14px';
|
|
735
|
-
}
|
|
736
|
-
})
|
|
737
|
-
.attr('transform', function (d) {
|
|
738
|
-
data.map((indiv) => {
|
|
739
|
-
if (indiv.name == d.name) {
|
|
740
|
-
let keys = Object.keys(indiv).filter((temp, i) => i != 0);
|
|
741
|
-
var temp;
|
|
742
|
-
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
743
|
-
if (x.bandwidth() > 100) {
|
|
744
|
-
if (self.chartData.data.length == 1) {
|
|
745
|
-
if (Object.keys(self.chartData.data[0]).length == 2) {
|
|
746
|
-
tempScale.range([
|
|
747
|
-
0 + (x.bandwidth() - 200) / 2,
|
|
748
|
-
x.bandwidth() - (x.bandwidth() - 200) / 2,
|
|
749
|
-
]);
|
|
750
|
-
// .padding(0.05);
|
|
751
|
-
}
|
|
752
|
-
else
|
|
753
|
-
tempScale.range([
|
|
754
|
-
0 + (x.bandwidth() - 300) / 2,
|
|
755
|
-
x.bandwidth() - (x.bandwidth() - 300) / 2,
|
|
756
|
-
]);
|
|
757
|
-
// .padding(0.05);
|
|
758
|
-
}
|
|
759
|
-
else
|
|
760
|
-
tempScale.range([
|
|
761
|
-
0 + (x.bandwidth() - 125) / 2,
|
|
762
|
-
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
763
|
-
]);
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
});
|
|
767
|
-
/**
|
|
768
|
-
* if set, then all texts ll be horizontal
|
|
769
|
-
*/
|
|
770
|
-
if (self.chartConfiguration.textAlwaysHorizontal) {
|
|
771
|
-
return ('translate(' + xSubgroup(d.key) + ',' + (y(d.value) - 3) + ')');
|
|
772
|
-
}
|
|
773
|
-
/**
|
|
774
|
-
* rotate texts having more than one digits
|
|
775
|
-
*/
|
|
776
|
-
// if (d.value > 9)
|
|
777
|
-
if (!isNaN(tempScale(d.key)))
|
|
778
|
-
return ('translate(' +
|
|
779
|
-
(tempScale(d.key) + tempScale.bandwidth() * 0.55) +
|
|
780
|
-
',' +
|
|
781
|
-
(y(0) - 10) +
|
|
782
|
-
') rotate(270)');
|
|
783
|
-
return 'translate(0,0)';
|
|
784
|
-
// else
|
|
785
|
-
// return (
|
|
786
|
-
// 'translate(' +
|
|
787
|
-
// (tempScale(d.key) + tempScale.bandwidth() / 2) +
|
|
788
|
-
// ',' +
|
|
789
|
-
// y(0) +
|
|
790
|
-
// ')'
|
|
791
|
-
// );
|
|
792
|
-
})
|
|
793
|
-
.on('click', function (d) {
|
|
794
|
-
if (!metaData.barWithoutClick ||
|
|
795
|
-
!metaData.barWithoutClick.length ||
|
|
796
|
-
(!metaData.barWithoutClick.includes(d?.name) &&
|
|
797
|
-
!metaData.barWithoutClick.includes(d?.key)))
|
|
798
|
-
self.handleClick(d);
|
|
799
|
-
});
|
|
800
|
-
if (!isria) {
|
|
801
|
-
state.selectAll('.lib-data-labels-weeklycharts')
|
|
802
|
-
.on('mouseout', handleMouseOut)
|
|
803
|
-
.on('mouseover', handleMouseOver);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
if (this.chartConfiguration.displayTitleOnTop || (this.chartConfiguration.textsOnBar == undefined &&
|
|
807
|
-
this.chartConfiguration.displayTitleOnTop == undefined)) {
|
|
808
|
-
if (!isria) {
|
|
809
|
-
state
|
|
810
|
-
.selectAll('rect')
|
|
811
|
-
.on('mouseout', handleMouseOut)
|
|
812
|
-
.on('mouseover', handleMouseOver);
|
|
394
|
+
return tempScale(d.key);
|
|
395
|
+
}
|
|
396
|
+
getBarWidth(d, scales, data) {
|
|
397
|
+
if (!this.chartConfiguration.isDrilldownChart) {
|
|
398
|
+
return scales.xSubgroup.bandwidth();
|
|
399
|
+
}
|
|
400
|
+
let tempScale = scales.xSubgroup;
|
|
401
|
+
data.forEach((indiv) => {
|
|
402
|
+
if (indiv.name === d.name) {
|
|
403
|
+
const keys = Object.keys(indiv).filter((_, i) => i !== 0);
|
|
404
|
+
tempScale = d3.scaleBand().domain(keys).range([0, scales.x.bandwidth()]);
|
|
405
|
+
tempScale = this.adjustScaleForWidth(tempScale, scales.x.bandwidth(), data.length);
|
|
813
406
|
}
|
|
407
|
+
});
|
|
408
|
+
return tempScale.bandwidth();
|
|
409
|
+
}
|
|
410
|
+
adjustScaleForWidth(tempScale, bandwidth, dataLength) {
|
|
411
|
+
if (bandwidth <= 100)
|
|
412
|
+
return tempScale;
|
|
413
|
+
const isSingleItem = dataLength === 1;
|
|
414
|
+
const minWidth = isSingleItem
|
|
415
|
+
? this.CONSTANTS.MIN_BAR_WIDTH_SINGLE
|
|
416
|
+
: this.CONSTANTS.MIN_BAR_WIDTH_MULTIPLE;
|
|
417
|
+
const offset = (bandwidth - minWidth) / 2;
|
|
418
|
+
tempScale.range([offset, bandwidth - offset]);
|
|
419
|
+
return tempScale;
|
|
420
|
+
}
|
|
421
|
+
getBarHeight(d, scales) {
|
|
422
|
+
if (d.value === -1 || !d.value) {
|
|
423
|
+
return scales.y.range()[0] - scales.y(0);
|
|
814
424
|
}
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
data.map((indiv) => {
|
|
823
|
-
if (indiv.name == d.name) {
|
|
824
|
-
let keys = Object.keys(indiv).filter((temp, i) => i != 0);
|
|
825
|
-
elementsCounter = keys.length;
|
|
826
|
-
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
827
|
-
if (x.bandwidth() > 100) {
|
|
828
|
-
if (self.chartData.data.length == 1) {
|
|
829
|
-
if (Object.keys(self.chartData.data[0]).length == 2) {
|
|
830
|
-
tempScale.range([
|
|
831
|
-
0 + (x.bandwidth() - 200) / 2,
|
|
832
|
-
x.bandwidth() - (x.bandwidth() - 200) / 2,
|
|
833
|
-
]);
|
|
834
|
-
// .padding(0.05);
|
|
835
|
-
}
|
|
836
|
-
else
|
|
837
|
-
tempScale.range([
|
|
838
|
-
0 + (x.bandwidth() - 300) / 2,
|
|
839
|
-
x.bandwidth() - (x.bandwidth() - 300) / 2,
|
|
840
|
-
]);
|
|
841
|
-
// .padding(0.05);
|
|
842
|
-
}
|
|
843
|
-
else
|
|
844
|
-
tempScale.range([
|
|
845
|
-
0 + (x.bandwidth() - 125) / 2,
|
|
846
|
-
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
847
|
-
]);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
});
|
|
851
|
-
if (metaData.hasDrillDown) {
|
|
852
|
-
if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
853
|
-
return (x(d.name) + tempScale(d.key) + tempScale.bandwidth() / 2 - 90);
|
|
854
|
-
}
|
|
855
|
-
return (x(d.name) +
|
|
856
|
-
tempScale(d.key) -
|
|
857
|
-
(tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 +
|
|
858
|
-
tempScale.bandwidth() / 2);
|
|
859
|
-
}
|
|
860
|
-
else
|
|
861
|
-
return x(d.name) + tempScale(d.key) - (tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 + tempScale.bandwidth() / 2;
|
|
862
|
-
})
|
|
863
|
-
.attr('class', 'lib-verticalstack-title-ontop')
|
|
864
|
-
.attr('y', function () {
|
|
865
|
-
return y(d.value) - 3 - 40;
|
|
866
|
-
})
|
|
867
|
-
.attr('dy', function () {
|
|
868
|
-
return d.class;
|
|
869
|
-
})
|
|
870
|
-
.attr('width', function () {
|
|
871
|
-
// var tempScale;
|
|
872
|
-
data.map((indiv) => {
|
|
873
|
-
if (indiv.name == d.name) {
|
|
874
|
-
let keys = Object.keys(indiv).filter((temp, i) => i != 0);
|
|
875
|
-
tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
|
|
876
|
-
if (x.bandwidth() > 100) {
|
|
877
|
-
if (self.chartData.data.length == 1) {
|
|
878
|
-
if (Object.keys(self.chartData.data[0]).length == 2) {
|
|
879
|
-
tempScale.range([
|
|
880
|
-
0 + (x.bandwidth() - 200) / 2,
|
|
881
|
-
x.bandwidth() - (x.bandwidth() - 200) / 2,
|
|
882
|
-
]);
|
|
883
|
-
// .padding(0.05);
|
|
884
|
-
}
|
|
885
|
-
else
|
|
886
|
-
tempScale.range([
|
|
887
|
-
0 + (x.bandwidth() - 300) / 2,
|
|
888
|
-
x.bandwidth() - (x.bandwidth() - 300) / 2,
|
|
889
|
-
]);
|
|
890
|
-
// .padding(0.05);
|
|
891
|
-
}
|
|
892
|
-
else
|
|
893
|
-
tempScale.range([
|
|
894
|
-
0 + (x.bandwidth() - 125) / 2,
|
|
895
|
-
x.bandwidth() - (x.bandwidth() - 125) / 2,
|
|
896
|
-
]);
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
});
|
|
900
|
-
if (metaData.hasDrillDown) {
|
|
901
|
-
if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
|
|
902
|
-
return '180px';
|
|
903
|
-
}
|
|
904
|
-
return tempScale.bandwidth() + leftAndRightSpaces * 2;
|
|
905
|
-
}
|
|
906
|
-
else
|
|
907
|
-
return tempScale.bandwidth() + leftAndRightSpaces * 2;
|
|
908
|
-
})
|
|
909
|
-
.attr('height', 40)
|
|
910
|
-
.append('xhtml:div')
|
|
911
|
-
.attr('class', 'title')
|
|
912
|
-
.style('z-index', 99)
|
|
913
|
-
.html(function () {
|
|
914
|
-
let dataType = metaData.dataType ? metaData.dataType : '';
|
|
915
|
-
if (!self.isZoomedOut) {
|
|
916
|
-
let desiredText = '<span class="title-bar-name">' + d.name + '</span>';
|
|
917
|
-
desiredText +=
|
|
918
|
-
'<span class="title-bar-value"><span>' +
|
|
919
|
-
d.value +
|
|
920
|
-
'</span>' +
|
|
921
|
-
dataType +
|
|
922
|
-
'</span>';
|
|
923
|
-
return desiredText;
|
|
924
|
-
}
|
|
925
|
-
else {
|
|
926
|
-
let tempKey = d.name.length <= 8 ? d.name : d.name.substring(0, 5) + '...';
|
|
927
|
-
let desiredText = '<span class="title-bar-name">' +
|
|
928
|
-
tempKey +
|
|
929
|
-
':' +
|
|
930
|
-
d.value +
|
|
931
|
-
dataType +
|
|
932
|
-
'</span>';
|
|
933
|
-
desiredText +=
|
|
934
|
-
'<span class="title-bar-value">' + d.name + '</span>';
|
|
935
|
-
return desiredText;
|
|
936
|
-
}
|
|
937
|
-
});
|
|
425
|
+
return scales.y.range()[0] - scales.y(d.value);
|
|
426
|
+
}
|
|
427
|
+
getBarColor(d, metaData) {
|
|
428
|
+
const targetLineData = this.chartData.targetLineData;
|
|
429
|
+
const isAboveTarget = targetLineData && d.value >= targetLineData.target;
|
|
430
|
+
if (d.value && isAboveTarget && metaData.colorAboveTarget) {
|
|
431
|
+
return metaData.colorAboveTarget[d.key];
|
|
938
432
|
}
|
|
939
|
-
|
|
940
|
-
|
|
433
|
+
return metaData.colors[d.key];
|
|
434
|
+
}
|
|
435
|
+
handleMouseOver(d, svg, scales, metaData, data) {
|
|
436
|
+
svg.selectAll('.lib-verticalstack-title-ontop').remove();
|
|
437
|
+
const foreignObject = svg
|
|
438
|
+
.append('foreignObject')
|
|
439
|
+
.attr('class', 'lib-verticalstack-title-ontop')
|
|
440
|
+
.attr('x', this.getTooltipX(d, scales, data, metaData))
|
|
441
|
+
.attr('y', scales.y(d.value) - 43)
|
|
442
|
+
.attr('width', this.getTooltipWidth(d, scales, data, metaData))
|
|
443
|
+
.attr('height', 40);
|
|
444
|
+
foreignObject
|
|
445
|
+
.append('xhtml:div')
|
|
446
|
+
.attr('class', 'title')
|
|
447
|
+
.style('z-index', 99)
|
|
448
|
+
.html(this.getTooltipHtml(d, metaData));
|
|
449
|
+
}
|
|
450
|
+
getTooltipX(d, scales, data, metaData) {
|
|
451
|
+
let tempScale = this.getTempScale(d, scales, data);
|
|
452
|
+
const baseX = scales.x(d.name) + tempScale(d.key);
|
|
453
|
+
if (!metaData.hasDrillDown) {
|
|
454
|
+
return baseX - (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2) / 2 + tempScale.bandwidth() / 2;
|
|
941
455
|
}
|
|
942
|
-
|
|
943
|
-
.
|
|
944
|
-
.attr('class', 'x2 axis2')
|
|
945
|
-
.attr('transform', 'translate(0,' + height + ')')
|
|
946
|
-
.style('color', '#000')
|
|
947
|
-
.call(d3.axisBottom(xScaleFromOrigin).tickSize(0))
|
|
948
|
-
.call((g) => g.select('.domain').attr('fill', 'none'));
|
|
949
|
-
svg.selectAll('g.x2.axis2 g.tick text').style('display', 'none');
|
|
950
|
-
svg
|
|
951
|
-
.append('g')
|
|
952
|
-
.attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
|
|
953
|
-
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
954
|
-
.attr('transform', 'translate(0,0)')
|
|
955
|
-
.call(y)
|
|
956
|
-
.style('display', 'none');
|
|
957
|
-
svgYAxisLeft
|
|
958
|
-
.append('g')
|
|
959
|
-
.append('g')
|
|
960
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
961
|
-
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
962
|
-
.attr('transform', 'translate(0,0)')
|
|
963
|
-
.call(d3
|
|
964
|
-
.axisLeft(y)
|
|
965
|
-
.tickSize(0)
|
|
966
|
-
.ticks(self.chartConfiguration.numberOfYTicks)
|
|
967
|
-
.tickFormat(self.chartConfiguration.yAxisLabelFomatter))
|
|
968
|
-
.selectAll('text')
|
|
969
|
-
.style('fill', 'var(--chart-text-color)');
|
|
970
|
-
svgYAxisRight
|
|
971
|
-
.append('g')
|
|
972
|
-
.attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
|
|
973
|
-
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
974
|
-
.attr('transform', 'translate(0,0)')
|
|
975
|
-
.call(y)
|
|
976
|
-
.style('display', 'none');
|
|
977
|
-
/**
|
|
978
|
-
* hide x axis labels
|
|
979
|
-
* config is there for future use
|
|
980
|
-
* used by weekly charts
|
|
981
|
-
*/
|
|
982
|
-
if (this.chartConfiguration.isXaxisLabelHidden != undefined &&
|
|
983
|
-
this.chartConfiguration.isXaxisLabelHidden) {
|
|
984
|
-
d3.selectAll('g.lib-line-x-axis-text > g > text').attr('class', 'lib-display-hidden');
|
|
456
|
+
if (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2 > 180) {
|
|
457
|
+
return baseX + tempScale.bandwidth() / 2 - 90;
|
|
985
458
|
}
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
if (
|
|
991
|
-
this.
|
|
992
|
-
d3.selectAll('.yaxis-dashed > g > text').attr('class', 'lib-display-hidden');
|
|
459
|
+
return baseX - (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2) / 2 + tempScale.bandwidth() / 2;
|
|
460
|
+
}
|
|
461
|
+
getTooltipWidth(d, scales, data, metaData) {
|
|
462
|
+
let tempScale = this.getTempScale(d, scales, data);
|
|
463
|
+
if (!metaData.hasDrillDown) {
|
|
464
|
+
return (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2) + 'px';
|
|
993
465
|
}
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
* config is there for future use
|
|
997
|
-
*/
|
|
998
|
-
if (this.chartConfiguration.isYaxisHidden != undefined &&
|
|
999
|
-
this.chartConfiguration.isYaxisHidden) {
|
|
1000
|
-
d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
|
|
466
|
+
if (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2 > 180) {
|
|
467
|
+
return '180px';
|
|
1001
468
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
.
|
|
1010
|
-
.
|
|
1011
|
-
}
|
|
1012
|
-
if (lineData != null) {
|
|
1013
|
-
if (lineData && self.chartConfiguration.showLineChartAxis) {
|
|
1014
|
-
svgYAxisRight
|
|
1015
|
-
.append('g')
|
|
1016
|
-
.attr('class', 'lib-stacked-y-axis-text1')
|
|
1017
|
-
.attr('style', self.chartConfiguration.yAxisCustomTextStyles)
|
|
1018
|
-
.attr('transform', 'translate(' + 0 + ',0)')
|
|
1019
|
-
.call(yLineAxis);
|
|
469
|
+
return (tempScale.bandwidth() + this.CONSTANTS.LEFT_RIGHT_SPACES * 2) + 'px';
|
|
470
|
+
}
|
|
471
|
+
getTempScale(d, scales, data) {
|
|
472
|
+
let tempScale = scales.xSubgroup;
|
|
473
|
+
data.forEach((indiv) => {
|
|
474
|
+
if (indiv.name === d.name) {
|
|
475
|
+
const keys = Object.keys(indiv).filter((_, i) => i !== 0);
|
|
476
|
+
tempScale = d3.scaleBand().domain(keys).range([0, scales.x.bandwidth()]);
|
|
477
|
+
tempScale = this.adjustScaleForWidth(tempScale, scales.x.bandwidth(), data.length);
|
|
1020
478
|
}
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
}
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
479
|
+
});
|
|
480
|
+
return tempScale;
|
|
481
|
+
}
|
|
482
|
+
getTooltipHtml(d, metaData) {
|
|
483
|
+
const dataType = metaData.dataType || '';
|
|
484
|
+
if (!this.isZoomedOut) {
|
|
485
|
+
return `<span class="title-bar-name">${d.name}</span>
|
|
486
|
+
<span class="title-bar-value"><span>${d.value}</span>${dataType}</span>`;
|
|
487
|
+
}
|
|
488
|
+
const truncatedName = d.name.length <= 8 ? d.name : d.name.substring(0, 5) + '...';
|
|
489
|
+
return `<span class="title-bar-name">${truncatedName}:${d.value}${dataType}</span>
|
|
490
|
+
<span class="title-bar-value">${d.name}</span>`;
|
|
491
|
+
}
|
|
492
|
+
handleMouseOut(svg) {
|
|
493
|
+
svg.selectAll('.lib-verticalstack-title-ontop').remove();
|
|
494
|
+
}
|
|
495
|
+
renderLabels(svg, svgYAxisLeft, svgYAxisRight, metaData, width, height, scales) {
|
|
1033
496
|
if (metaData.yLabel) {
|
|
1034
|
-
svgYAxisLeft
|
|
1035
|
-
.append('text')
|
|
1036
|
-
.attr('class', 'lib-axis-group-label font-size-1')
|
|
1037
|
-
.attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
|
|
1038
|
-
.attr('transform', 'rotate(-90)')
|
|
1039
|
-
.attr('y', 0 - margin.left / 2 - 30)
|
|
1040
|
-
.attr('x', 0 - height / 2)
|
|
1041
|
-
.attr('dy', '1em')
|
|
1042
|
-
.style('text-anchor', 'middle')
|
|
1043
|
-
.attr('fill', 'var(--chart-text-color)');
|
|
1044
|
-
if (this.chartConfiguration.isMultiChartGridLine == undefined) {
|
|
1045
|
-
svgYAxisLeft
|
|
1046
|
-
.selectAll('.lib-axis-group-label')
|
|
1047
|
-
.style('font-size', 'smaller')
|
|
1048
|
-
.text(metaData.yLabel);
|
|
1049
|
-
}
|
|
1050
|
-
else {
|
|
1051
|
-
/**
|
|
1052
|
-
* used by weekly charts
|
|
1053
|
-
*/
|
|
1054
|
-
svg
|
|
1055
|
-
.selectAll('.lib-axis-group-label')
|
|
1056
|
-
.attr('class', 'lib-ylabel-weeklyCharts')
|
|
1057
|
-
.text(metaData.yLabel.toLowerCase());
|
|
1058
|
-
}
|
|
497
|
+
this.renderYLabel(svgYAxisLeft, metaData.yLabel, height);
|
|
1059
498
|
}
|
|
1060
499
|
if (metaData.xLabel) {
|
|
1061
|
-
|
|
1062
|
-
return ((label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
1063
|
-
(label === label.toUpperCase() && /[A-Z]/.test(label)));
|
|
1064
|
-
}
|
|
1065
|
-
const xLabelText = metaData.xLabel;
|
|
1066
|
-
const isAcr = isAcronym(xLabelText.replace(/[^A-Za-z]/g, ''));
|
|
1067
|
-
svg
|
|
1068
|
-
.append('text')
|
|
1069
|
-
.attr('class', function () {
|
|
1070
|
-
let baseClass = 'lib-axis-group-label font-size-1';
|
|
1071
|
-
if (self.chartConfiguration.isDrilldownChart)
|
|
1072
|
-
return baseClass + ' lib-xlabel-drilldowncharts';
|
|
1073
|
-
if (self.chartConfiguration.isMultiChartGridLine != undefined)
|
|
1074
|
-
return baseClass + ' lib-xlabel-weeklyCharts';
|
|
1075
|
-
return baseClass + ' lib-axis-waterfall-label';
|
|
1076
|
-
})
|
|
1077
|
-
.attr('style', self.chartConfiguration.xAxisCustomlabelStyles)
|
|
1078
|
-
.attr('transform', 'translate(' + width / 2 + ' ,' + (height + margin.top + 20) + ')')
|
|
1079
|
-
.style('text-anchor', 'middle')
|
|
1080
|
-
.style('fill', 'var(--chart-text-color)')
|
|
1081
|
-
.text(isAcr ? xLabelText.toUpperCase() : xLabelText.toLowerCase())
|
|
1082
|
-
.style('text-transform', isAcr ? 'none' : 'capitalize');
|
|
500
|
+
this.renderXLabel(svg, metaData.xLabel, width, height);
|
|
1083
501
|
}
|
|
1084
|
-
if (
|
|
1085
|
-
|
|
1086
|
-
svg
|
|
1087
|
-
.append('line')
|
|
1088
|
-
.attr('x1', 0)
|
|
1089
|
-
.attr('x2', width)
|
|
1090
|
-
.attr('y1', yZero)
|
|
1091
|
-
.attr('y2', yZero)
|
|
1092
|
-
.style('stroke-dasharray', '5 5')
|
|
1093
|
-
.style('stroke', this.chartData.targetLineData.color);
|
|
1094
|
-
// svgYAxisRight
|
|
1095
|
-
// .append('line')
|
|
1096
|
-
// .attr('x1', 0)
|
|
1097
|
-
// .attr('x2', rightSvgWidth)
|
|
1098
|
-
// .attr('y1', yZero)
|
|
1099
|
-
// .attr('y2', yZero)
|
|
1100
|
-
// .style('stroke', this.chartData.targetLineData.color);
|
|
1101
|
-
svgYAxisRight
|
|
1102
|
-
.append('foreignObject')
|
|
1103
|
-
.attr('transform', 'translate(' + 0 + ',' + (yZero - 30) + ')')
|
|
1104
|
-
.attr('width', rightSvgWidth)
|
|
1105
|
-
.attr('height', 50)
|
|
1106
|
-
.append('xhtml:div')
|
|
1107
|
-
.attr('class', 'target-display')
|
|
1108
|
-
.style('color', 'var(--chart-text-color)')
|
|
1109
|
-
.html(function () {
|
|
1110
|
-
let dataTypeTemp = '';
|
|
1111
|
-
let targetLineName = 'target';
|
|
1112
|
-
if (metaData.dataType) {
|
|
1113
|
-
dataTypeTemp = metaData.dataType;
|
|
1114
|
-
}
|
|
1115
|
-
if (self.chartData.targetLineData &&
|
|
1116
|
-
self.chartData.targetLineData.targetName) {
|
|
1117
|
-
targetLineName = self.chartData.targetLineData.targetName;
|
|
1118
|
-
}
|
|
1119
|
-
return (`<div>${targetLineName}</div>` +
|
|
1120
|
-
'<div>' +
|
|
1121
|
-
self.chartData.targetLineData.target +
|
|
1122
|
-
'' +
|
|
1123
|
-
dataTypeTemp +
|
|
1124
|
-
'</div>');
|
|
1125
|
-
});
|
|
502
|
+
if (metaData.lineyLabel) {
|
|
503
|
+
this.renderLineYLabel(svgYAxisRight, metaData.lineyLabel);
|
|
1126
504
|
}
|
|
505
|
+
}
|
|
506
|
+
renderYLabel(svgYAxisLeft, yLabel, height) {
|
|
507
|
+
const margin = this.chartConfiguration.margin;
|
|
508
|
+
svgYAxisLeft
|
|
509
|
+
.append('text')
|
|
510
|
+
.attr('class', 'lib-axis-group-label font-size-1')
|
|
511
|
+
.attr('style', this.chartConfiguration.yAxisCustomlabelStyles)
|
|
512
|
+
.attr('transform', 'rotate(-90)')
|
|
513
|
+
.attr('y', 0 - margin.left / 2 - 30)
|
|
514
|
+
.attr('x', 0 - height / 2)
|
|
515
|
+
.attr('dy', '1em')
|
|
516
|
+
.style('text-anchor', 'middle')
|
|
517
|
+
.attr('fill', 'var(--chart-text-color)')
|
|
518
|
+
.text(this.chartConfiguration.isMultiChartGridLine ? yLabel.toLowerCase() : yLabel);
|
|
519
|
+
}
|
|
520
|
+
renderXLabel(svg, xLabel, width, height) {
|
|
521
|
+
const margin = this.chartConfiguration.margin;
|
|
522
|
+
const isAcronym = this.isAcronym(xLabel.replace(/[^A-Za-z]/g, ''));
|
|
523
|
+
let labelClass = 'lib-axis-group-label font-size-1';
|
|
1127
524
|
if (this.chartConfiguration.isDrilldownChart) {
|
|
1128
|
-
|
|
1129
|
-
* used by drilldown charts
|
|
1130
|
-
*/
|
|
1131
|
-
// svg
|
|
1132
|
-
// .selectAll('.lib-axis-group-label')
|
|
1133
|
-
// .attr('class', 'lib-ylabel-drilldowncharts')
|
|
1134
|
-
// .text(metaData.yLabel.toLowerCase());
|
|
1135
|
-
svg.selectAll('g.x1.axis1 g.tick line').style('display', 'none');
|
|
525
|
+
labelClass += ' lib-xlabel-drilldowncharts';
|
|
1136
526
|
}
|
|
1137
|
-
if (
|
|
1138
|
-
|
|
1139
|
-
.append('text')
|
|
1140
|
-
.attr('class', 'lib-axis-group-label lib-line-axis')
|
|
1141
|
-
.attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
|
|
1142
|
-
.attr('transform', 'translate(0,0) rotate(90)')
|
|
1143
|
-
.attr('y', 0 - 100)
|
|
1144
|
-
.attr('x', 0 + 100)
|
|
1145
|
-
.attr('dy', '5em')
|
|
1146
|
-
.style('text-anchor', 'middle')
|
|
1147
|
-
.style('font-size', 'smaller')
|
|
1148
|
-
.text(metaData.lineyLabel);
|
|
527
|
+
else if (this.chartConfiguration.isMultiChartGridLine) {
|
|
528
|
+
labelClass += ' lib-xlabel-weeklyCharts';
|
|
1149
529
|
}
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
530
|
+
else {
|
|
531
|
+
labelClass += ' lib-axis-waterfall-label';
|
|
532
|
+
}
|
|
533
|
+
svg
|
|
534
|
+
.append('text')
|
|
535
|
+
.attr('class', labelClass)
|
|
536
|
+
.attr('style', this.chartConfiguration.xAxisCustomlabelStyles)
|
|
537
|
+
.attr('transform', `translate(${width / 2}, ${height + margin.top + 20})`)
|
|
538
|
+
.style('text-anchor', 'middle')
|
|
539
|
+
.style('fill', 'var(--chart-text-color)')
|
|
540
|
+
.text(isAcronym ? xLabel.toUpperCase() : xLabel.toLowerCase())
|
|
541
|
+
.style('text-transform', isAcronym ? 'none' : 'capitalize');
|
|
542
|
+
}
|
|
543
|
+
renderLineYLabel(svgYAxisRight, lineyLabel) {
|
|
544
|
+
svgYAxisRight
|
|
545
|
+
.append('text')
|
|
546
|
+
.attr('class', 'lib-axis-group-label lib-line-axis')
|
|
547
|
+
.attr('style', this.chartConfiguration.yAxisCustomlabelStyles)
|
|
548
|
+
.attr('transform', 'translate(0,0) rotate(90)')
|
|
549
|
+
.attr('y', -100)
|
|
550
|
+
.attr('x', 100)
|
|
551
|
+
.attr('dy', '5em')
|
|
552
|
+
.style('text-anchor', 'middle')
|
|
553
|
+
.style('font-size', 'smaller')
|
|
554
|
+
.text(lineyLabel);
|
|
555
|
+
}
|
|
556
|
+
isAcronym(label) {
|
|
557
|
+
return ((label.length <= 4 && /^[A-Z]+$/.test(label)) ||
|
|
558
|
+
(label === label.toUpperCase() && /[A-Z]/.test(label)));
|
|
559
|
+
}
|
|
560
|
+
renderTargetLine(svg, svgYAxisRight, yScale, width) {
|
|
561
|
+
if (!this.chartData.targetLineData)
|
|
562
|
+
return;
|
|
563
|
+
const targetLineData = this.chartData.targetLineData;
|
|
564
|
+
const yZero = yScale(targetLineData.target);
|
|
565
|
+
svg
|
|
566
|
+
.append('line')
|
|
567
|
+
.attr('x1', 0)
|
|
568
|
+
.attr('x2', width)
|
|
569
|
+
.attr('y1', yZero)
|
|
570
|
+
.attr('y2', yZero)
|
|
571
|
+
.style('stroke-dasharray', '5 5')
|
|
572
|
+
.style('stroke', targetLineData.color);
|
|
573
|
+
const dataType = this.chartData.metaData.dataType || '';
|
|
574
|
+
const targetName = targetLineData.targetName || 'target';
|
|
575
|
+
svgYAxisRight
|
|
576
|
+
.append('foreignObject')
|
|
577
|
+
.attr('transform', `translate(0, ${yZero - 30})`)
|
|
578
|
+
.attr('width', this.CONSTANTS.RIGHT_SVG_WIDTH)
|
|
579
|
+
.attr('height', 50)
|
|
580
|
+
.append('xhtml:div')
|
|
581
|
+
.attr('class', 'target-display')
|
|
582
|
+
.style('color', 'var(--chart-text-color)')
|
|
583
|
+
.html(`<div>${targetName}</div><div>${targetLineData.target}${dataType}</div>`);
|
|
584
|
+
}
|
|
585
|
+
renderLineGraph(svg, lineData, metaData, scales, isRia) {
|
|
586
|
+
if (!lineData)
|
|
587
|
+
return;
|
|
588
|
+
const linePath = d3
|
|
589
|
+
.line()
|
|
590
|
+
.x((d) => scales.x(d.name) + scales.x.bandwidth() / 2)
|
|
591
|
+
.y((d) => scales.lineYscale(d.value));
|
|
592
|
+
svg
|
|
593
|
+
.append('path')
|
|
594
|
+
.datum(lineData)
|
|
595
|
+
.attr('fill', 'none')
|
|
596
|
+
.attr('stroke', this.chartConfiguration.lineGraphColor)
|
|
597
|
+
.attr('stroke-width', 1.5)
|
|
598
|
+
.attr('d', linePath);
|
|
599
|
+
const dot = svg
|
|
600
|
+
.selectAll('myCircles')
|
|
601
|
+
.data(lineData)
|
|
602
|
+
.enter()
|
|
603
|
+
.append('g')
|
|
604
|
+
.on('click', (d) => this.handleLinePointClick(d, metaData));
|
|
605
|
+
dot
|
|
606
|
+
.append('circle')
|
|
607
|
+
.attr('fill', this.chartConfiguration.lineGraphColor)
|
|
608
|
+
.attr('stroke', 'none')
|
|
609
|
+
.attr('cx', (d) => scales.x(d.name) + scales.x.bandwidth() / 2)
|
|
610
|
+
.attr('cy', (d) => scales.lineYscale(d.value))
|
|
611
|
+
.style('cursor', 'pointer')
|
|
612
|
+
.attr('r', 3);
|
|
613
|
+
if (this.chartConfiguration.lineGraphColor) {
|
|
1177
614
|
dot
|
|
1178
|
-
.append('
|
|
1179
|
-
.attr('
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
.attr('
|
|
1183
|
-
.attr('
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
.append('text')
|
|
1194
|
-
.attr('class', 'dot')
|
|
1195
|
-
.attr('color', self.chartConfiguration.lineGraphColor)
|
|
1196
|
-
.attr('style', 'font-size: ' + '.85em')
|
|
1197
|
-
.attr('x', function (d, i) {
|
|
1198
|
-
return x(d.name) + x.bandwidth() / 2;
|
|
1199
|
-
})
|
|
1200
|
-
.attr('y', function (d) {
|
|
1201
|
-
return lineYscale(d.value);
|
|
1202
|
-
})
|
|
1203
|
-
.attr('dy', '-1em')
|
|
1204
|
-
.text(function (d) {
|
|
1205
|
-
return self.chartConfiguration.labelFormatter(d.value);
|
|
1206
|
-
});
|
|
1207
|
-
}
|
|
615
|
+
.append('text')
|
|
616
|
+
.attr('class', 'dot')
|
|
617
|
+
.attr('color', this.chartConfiguration.lineGraphColor)
|
|
618
|
+
.attr('style', 'font-size: .85em')
|
|
619
|
+
.attr('x', (d) => scales.x(d.name) + scales.x.bandwidth() / 2)
|
|
620
|
+
.attr('y', (d) => scales.lineYscale(d.value))
|
|
621
|
+
.attr('dy', '-1em')
|
|
622
|
+
.text((d) => this.chartConfiguration.labelFormatter(d.value));
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
handleLinePointClick(d, metaData) {
|
|
626
|
+
const shouldBlock = metaData.barWithoutClick?.length &&
|
|
627
|
+
(metaData.barWithoutClick.includes(d?.name) || metaData.barWithoutClick.includes(d?.key));
|
|
628
|
+
if (!shouldBlock) {
|
|
629
|
+
this.handleClick(d);
|
|
1208
630
|
}
|
|
1209
631
|
}
|
|
1210
632
|
handleClick(d) {
|
|
1211
|
-
if (this.chartData.metaData.hasDrillDown || d?.toggleFrom)
|
|
633
|
+
if (this.chartData.metaData.hasDrillDown || d?.toggleFrom) {
|
|
1212
634
|
this.clickEvent.emit(d);
|
|
635
|
+
}
|
|
1213
636
|
}
|
|
1214
637
|
handleHeaderMenuClick(id) {
|
|
1215
638
|
this.headerMenuclickEvent.emit(id);
|
|
@@ -1246,4 +669,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1246
669
|
}], headerMenuclickEvent: [{
|
|
1247
670
|
type: Output
|
|
1248
671
|
}] } });
|
|
1249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2dyb3VwLWNoYXJ0L2dyb3VwLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ncm91cC1jaGFydC9ncm91cC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBRSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFRbEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGlCQUFpQjtJQXNFdEQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQTlEQSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyQyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pELG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQzlCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6Qyx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsZUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFFekIseUJBQW9CLEdBQVE7WUFDMUIsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFF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QkFDekIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQzFELElBQUksSUFBSSxDQUFDO3dCQUNULFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNsRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQzs0QkFDeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7Z0NBQ3BDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztvQ0FDcEQsU0FBUyxDQUFDLEtBQUssQ0FBQzt3Q0FDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQzt3Q0FDN0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7cUNBQzFDLENBQUMsQ0FBQztvQ0FDSCxrQkFBa0I7Z0NBQ3BCLENBQUM7O29DQUNDLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0NBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7d0NBQzdCLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO3FDQUMxQyxD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XG4gICAgT25Jbml0LFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIElucHV0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuICBpbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbiAgaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbiAgaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG4gIGltcG9ydCB7IFJlc2l6ZWRFdmVudCB9IGZyb20gJ2FuZ3VsYXItcmVzaXplLWV2ZW50JztcclxuICBpbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuICBAQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWdyb3VwLWNoYXJ0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncm91cC1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9ncm91cC1jaGFydC5jb21wb25lbnQubGVzcycsICcuLi9jb21tb24tc3R5bGVzLmxlc3MnXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgR3JvdXBDaGFydENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgICAgQFZpZXdDaGlsZCgnZ3JvdXBjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICAgIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgICBcclxuICAgICAgQFZpZXdDaGlsZCgnZ3JvdXBjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgICBncm91cGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgICBcclxuICAgICAgQElucHV0KCkgY2hhcnREYXRhOiBhbnk7XHJcbiAgICAgIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gICAgICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgICBAT3V0cHV0KCkgaGVhZGVyTWVudWNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgICAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgbGVnZW5kVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgICAgIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cztcclxuICAgIFxyXG4gICAgICBkZWZhdWx0Q29uZmlndXJhdGlvbjogYW55ID0ge1xyXG4gICAgICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICAgICAgbGFiZWxGb3JtYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICAgICAgc3ZnSGVpZ2h0OiA3MCxcclxuICAgICAgICBudW1iZXJPZllUaWNrczogNSxcclxuICAgICAgICBsZWdlbmRKdXN0aWZpZWQ6IHRydWUsXHJcbiAgICAgICAgeUxpbmVBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgICAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICAgICAgbGluZUdyYXBoQ29sb3I6ICcjRjZEMjgzJyxcclxuICAgICAgICBzaG93TGluZUNoYXJ0QXhpczogdHJ1ZSxcclxuICAgICAgICBzaG93VmFsdWVzOiB0cnVlLFxyXG4gICAgICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gICAgICAgIHhBeGlzR3JpZDogdW5kZWZpbmVkLFxyXG4gICAgICAgIHlBeGlzR3JpZDogZmFsc2UsXHJcbiAgICAgICAgbGVnZW5kVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBpc0hlYWRlclZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgICAgICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzTXVsdGlDaGFydEdyaWRMaW5lOiB1bmRlZmluZWQsXHJcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB1bmRlZmluZWQsXHJcbiAgICAgICAgY3VzdG9tWXNjYWxlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dHNPbkJhcjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzWGF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogZmFsc2UsXHJcbiAgICAgICAgaXNZYXhpc0hpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzWWF4aXNEYXNoZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICB0ZXh0Rm9ybWF0dGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgaXNOb0FsdGVybmF0ZVhheGlzVGV4dDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzWGdyaWRCZXR3ZWVuTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICAgICAgaGlkZUxlZ2VuZE9uVG9wOiB0cnVlLFxyXG4gICAgICAgIGlzWGF4aXNDb2xvcjogJyM5OTk5OTknLFxyXG4gICAgICAgIGxhYmVsT3ZlcmxhcE1pbm9yRml4OiB0cnVlLFxyXG4gICAgICAgIG5vSG92ZXJFZmZlY3Q6IHRydWUsXHJcbiAgICAgICAgbm9Ib3ZlckRpc3BsYXlEYXRhOiB0cnVlLFxyXG4gICAgICAgIHNob3dYYXhpc1RvcDogdHJ1ZSxcclxuICAgICAgICBkaXNwbGF5WWF4aXNMYWJlbHM6IHVuZGVmaW5lZCxcclxuICAgICAgICB4TGFiZWxzT25TYW1lTGluZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIHRleHRBbHdheXNIb3Jpem9udGFsOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbGVnZW5kQXRUb3BSaWdodDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzRHJpbGxkb3duQ2hhcnQ6IHVuZGVmaW5lZCxcclxuICAgICAgICBkaXNwbGF5VGl0bGVPblRvcDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgICAgICBpc0Rpc3BsYXlCYXJEZXRhaWxzQXRCb3R0b206IHVuZGVmaW5lZCxcclxuICAgICAgICBob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheTogMCxcclxuICAgICAgICBiYXJWYXVsZUNvbG9yOiB1bmRlZmluZWQsXHJcbiAgICAgIH07XHJcbiAgICBcclxuICAgICAgdW5pcXVlSWQ6IGFueSA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICAgICAgaXNab29tZWRPdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgaXNERDFPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgIGlzREQyT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBkMy5zZWxlY3QoJyMnICsgc2VsZi51bmlxdWVJZCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKTtcclxuICAgICAgICAgIH0uYmluZChzZWxmKSxcclxuICAgICAgICAgIDEwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBpc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQsIGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5pc1pvb21lZE91dCA9IGlzWm9vbU91dDtcclxuICAgICAgICB0aGlzLm9uUmVzaXplZChldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKHsgaXNab29tT3V0LCBldmVudCB9KSB7XHJcbiAgICAgICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQsIGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgICBuZ09uSW5pdCgpIHt9XHJcbiAgICAgIGlzTGVnZW5kVmlzaWJsZSgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0RGF0YSAmJlxyXG4gICAgICAgICAgdGhpcy5jaGFydERhdGEubWV0YURhdGEuY29sb3JzICYmXHJcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMpLmxlbmd0aCA+IDFcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAga2VlcE9yZGVyID0gKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gYTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgICAgZ2V0IGlzQWxlcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCcpO1xyXG59XHJcbiAgICAgIGluaXRpYWxpemVncm91cENoYXJ0KCkge1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgZGF0YSA9IFtdO1xyXG4gICAgICAgIGxldCBtZXRhRGF0YTogYW55ID0gbnVsbDtcclxuICAgICAgICBsZXQga2V5TGlzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGxpbmVEYXRhID0gbnVsbDtcclxuICAgICAgICBsZXQgY29sb3JNYXAgPSB7fTtcclxuICAgICAgICB2YXIgZm9ybWF0RnJvbUJhY2tlbmQ7XHJcbiAgICAgICAgdmFyIGZvcm1hdEZvckh1Z2VOdW1iZXJzO1xyXG5cclxuICAgbGV0IGlzcmlhID0gdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcclxuXHJcbiAgICBcclxuICAgICAgICB2YXIgeDogYW55O1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHNob3J0X3RpY2tfbGVuZ3RoID0gNDtcclxuICAgICAgICB2YXIgbG9uZ190aWNrX2xlbmd0aCA9IDE2O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGxvbmdlciB0aWNrIGxlbmd0aCBuZWVkZWQgZm9yIHdlZWtseSBjaGFydHNcclxuICAgICAgICAgKi9cclxuICAgICAgICB2YXIgc2hvcnRfdGlja19sZW5ndGhfYmcgPSA1O1xyXG4gICAgICAgIHZhciBsb25nX3RpY2tfbGVuZ3RoX2JnID0gMzA7XHJcbiAgICAgICAgdmFyIGxlZnRBbmRSaWdodFNwYWNlcyA9IDUwO1xyXG4gICAgICAgIHZhciByaWdodFN2Z1dpZHRoID0gNjA7XHJcbiAgICAgICAgdmFyIHRlbXBTY2FsZTtcclxuICAgIFxyXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25baV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAgICAgIGksXHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgICAgIG1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcbiAgICAgICAgbGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5saW5lRGF0YTtcclxuICAgIFxyXG4gICAgICAgIC8vIGlmIChsaW5lRGF0YSB8fCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgICAgIC8vICAgcmlnaHRTdmdXaWR0aCA9IDYwO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpIHtcclxuICAgICAgICAgIG1ldGFEYXRhWydjb2xvckFib3ZlVGFyZ2V0J10gPSBtZXRhRGF0YS5jb2xvcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbG9yTWFwID0gbWV0YURhdGEuY29sb3JzO1xyXG4gICAgICAgIGtleUxpc3QgPSBtZXRhRGF0YS5rZXlMaXN0O1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIHZhciB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIgPSBkMy5zZWxlY3QoXHJcbiAgICAgICAgICB0aGlzLmdyb3VwY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIHZhciBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcbiAgICAgICAgdmFyIHdpZHRoID1cclxuICAgICAgICAgIHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDMwICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgICAgIHdpZHRoID1cclxuICAgICAgICAgICAgd2lkdGggPiB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAqIDQwXHJcbiAgICAgICAgICAgICAgPyB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGExXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogNjBcclxuICAgICAgICAgICAgICAgIDogd2lkdGhcclxuICAgICAgICAgICAgICA6IHRoaXMuY2hhcnREYXRhLmRyb3Bkb3duRGF0YTFcclxuICAgICAgICAgICAgICA/IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogNjBcclxuICAgICAgICAgICAgICA6IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogNDA7XHJcbiAgICBcclxuICAgICAgICAgIHdpZHRoID1cclxuICAgICAgICAgICAgd2lkdGggPiB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAqIDQwXHJcbiAgICAgICAgICAgICAgPyB3aWR0aFxyXG4gICAgICAgICAgICAgIDogdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggKiA0MDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5jaGFydERhdGEuZHJvcGRvd25EYXRhMiAmJlxyXG4gICAgICAgICAgd2lkdGggPCB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAqIDEyMCAmJlxyXG4gICAgICAgICAgdGhpcy5pc1pvb21lZE91dFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgd2lkdGggPSB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAqIDEyMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmXHJcbiAgICAgICAgICAgIHdpZHRoIDwgdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggKiAyNTBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoICogMjUwO1xyXG4gICAgICAgICAgfSBlbHNlIHdpZHRoID0gdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggKiAxNjA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDgpIHtcclxuICAgICAgICAvLyAgIHdpZHRoID0gdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggKiAxNDA7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgXHJcbiAgICAgICAgdmFyIGhlaWdodCA9XHJcbiAgICAgICAgICBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKSAqXHJcbiAgICAgICAgICAgIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgLyAxMDApIC1cclxuICAgICAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICAgICAgbWFyZ2luLmJvdHRvbTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGVudGlyZSBoZWlnaHQgdXNlZCBpbiB3ZWVrbHkgY2hhcnRzIGFzIHggYXhpcyBuZWVkZWQgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIGNoYXJ0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBoZWlnaHQgPVxyXG4gICAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgIT0gNzBcclxuICAgICAgICAgICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFxyXG4gICAgICAgICAgICAgIDogcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9XHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICAgICAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICAgICAgICAgIDEzMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9XHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICAgICAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICAgICAgICAgIDEwMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBmb3IgaGlkaW5nIGhlYWRlclxyXG4gICAgICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogZm9yIGhpZGluZyBsZWdlbmRzXHJcbiAgICAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxlZ2VuZFZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRWaXNpYmxlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGZvciByZW1vdmluZyBiYWNrZ3JvdW5kIGNvbG9yIHNvIHRoYXQgaXQgY2FuIHRha2UgcGFyZW50cyBjb2xvclxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBmb3JtYXQgZGF0YSB2YWx1ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiByZWNlaXZlZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgZm9ybWF0RnJvbUJhY2tlbmQgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoXHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBmb3JtYXRGb3JIdWdlTnVtYmVycyA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcignLjJzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBvdXRlckNvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgICAgICAgLmF0dHIoJ2lkJywgc2VsZi51bmlxdWVJZClcclxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgICAgIC5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0KVxyXG4gICAgXHJcbiAgICAgICAgICAuc3R5bGUoJ292ZXJmbG93LXgnLCAnaGlkZGVuJylcclxuICAgICAgICAgIC5zdHlsZSgncGFkZGluZy1sZWZ0JywgYCR7bWFyZ2luLmxlZnR9cHhgKVxyXG4gICAgICAgICAgLy8gLmNhbGwoQ2hhcnRIZWxwZXIucmVzcG9uc2l2ZWZ5KVxyXG4gICAgXHJcbiAgICAgICAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHtyaWdodFN2Z1dpZHRofXB4YClcclxuICAgICAgICAgIC5zdHlsZSgnbWFyZ2luLWxlZnQnLCcxNXB4Jyk7XHJcbiAgICAgICAgdmFyIHN2Z1lBeGlzTGVmdCA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAgICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCcpXHJcbiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAgICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIChtYXJnaW4ubGVmdCArIDE1KSArICcsJyArIG1hcmdpbi50b3AgKyAnKScpO1xyXG4gICAgXHJcbiAgICAgICAgdmFyIHN2Z1lBeGlzUmlnaHQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAgICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAgICAgLnN0eWxlKCdyaWdodCcsICcxMnB4JylcclxuICAgICAgICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywnICsgbWFyZ2luLnRvcCArICcpJyk7XHJcbiAgICBcclxuICAgICAgICB2YXIgaW5uZXJDb250YWluZXIgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgICAgICAgLmFwcGVuZCgnZGl2JylcclxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgICAgICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJyk7XHJcbiAgICBcclxuICAgICAgICB2YXIgc3ZnID0gaW5uZXJDb250YWluZXJcclxuICAgICAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgICAgICAvLyAuYXR0cignaWQnLCBzZWxmLnVuaXF1ZUlkKVxyXG4gICAgICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGggLSByaWdodFN2Z1dpZHRoKVxyXG4gICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMzApXHJcbiAgICAgICAgICAvLyAuY2FsbChDaGFydEhlbHBlci5yZXNwb25zaXZlZnkpXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywnICsgbWFyZ2luLnRvcCArICcpJyk7XHJcbiAgICBcclxuICAgICAgICB2YXIgc3ViZ3JvdXBzOiBhbnkgPSBrZXlMaXN0O1xyXG4gICAgXHJcbiAgICAgICAgdmFyIGdyb3VwcyA9IGQzXHJcbiAgICAgICAgICAubWFwKGRhdGEsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkLm5hbWU7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmtleXMoKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHggYXhpcyByYW5nZSBtYWRlIHNpbWlsYXIgdG8gbGluZSBjaGFydCBvciB2ZXJ0aWNhbCBzdGFjayBzbyB0aGF0IGFsbCB0aGUgY2hhcnRzIHdpbGwgZ2V0IGFsaWduZWQgd2l0aCBlYWNoIG90aGVyLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHggPSBkM1xyXG4gICAgICAgICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgICAgICAgLnJhbmdlUm91bmQoW3dpZHRoLCAwXSlcclxuICAgICAgICAgICAgLmFsaWduKDAuNSlcclxuICAgICAgICAgICAgLnBhZGRpbmcoWzAuNV0pXHJcbiAgICAgICAgICAgIC5kb21haW4oXHJcbiAgICAgICAgICAgICAgZGF0YS5tYXAoZnVuY3Rpb24gKGQ6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQubmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHggPSBkM1xyXG4gICAgICAgICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgICAgICAgLmRvbWFpbihncm91cHMpXHJcbiAgICAgICAgICAgIC5yYW5nZShbbGVmdEFuZFJpZ2h0U3BhY2VzLCB3aWR0aCAtIHJpZ2h0U3ZnV2lkdGggLSBsZWZ0QW5kUmlnaHRTcGFjZXNdKVxyXG4gICAgICAgICAgICAucGFkZGluZyhbMC4zXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHguYmFuZHdpZHRoKDk2KTtcclxuICAgICAgICB2YXIgeFNjYWxlRnJvbU9yaWdpbiA9IGQzXHJcbiAgICAgICAgICAuc2NhbGVCYW5kKClcclxuICAgICAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgICAgICAgLnJhbmdlKFswLCB3aWR0aCAtIHJpZ2h0U3ZnV2lkdGhdKTtcclxuICAgICAgICAvLyAucGFkZGluZyhbMC4yXSk7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogZHJhdyBzZWNvbmQgeCBheGlzIG9uIHRvcFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIC8vIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93WGF4aXNUb3ApIHtcclxuICAgICAgICAvLyAgIHN2Z1xyXG4gICAgICAgIC8vICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAvLyAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1saW5lLWF4aXMtdGV4dCBsaWItbGluZS14LWF4aXMtdGV4dCB4LWF4aXMnKVxyXG4gICAgICAgIC8vICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgICAgLy8gICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkudGlja1NpemUoMCkpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBkMy5zdmcuYXhpcygpLnNjYWxlKHgpLm9yaWVudCgnYm90dG9tJykudGlja3MoMSkuaW5uZXJUaWNrU2l6ZSgtaGVpZ2h0KTtcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAvKipcclxuICAgICAgICAgICAqIG5vcm1hbCB0aWNrcyBmb3IgYWxsIGRhc2hib2FyZCBjaGFydHNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCcgKyBoZWlnaHQgKyAnKScpXHJcbiAgICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpKVxyXG4gICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIW1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAzMik7IC8vIEluY3JlYXNlIGRpc3RhbmNlIGZyb20gYmFycyAoZGVmYXVsdCBpcyB+OSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIC8vICAgaWYgKGFsdGVybmF0ZV90ZXh0KSB7XHJcbiAgICAgICAgICAvLyAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICAgIC8vICAgICByZXR1cm4gbG9uZ190aWNrX2xlbmd0aCArIDE7XHJcbiAgICAgICAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aCArIDE7XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvKipcclxuICAgICAgICAgICAqIGJpZ2dlciB0aWNrcyBmb3Igd2Vla2x5IGNoYXJ0cyBhbmQgbW9yZSBzcGFjZSBmcm9tIHggYXhpcyB0byBsYWJlbHNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiBkcmF3IHggYXhpc1xyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuICAgICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgwKSlcclxuICAgICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykuYXR0cignZmlsbCcsICdub25lJykpO1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiB0aWNrIGxpbmUgc2l6ZSBpbiBhbHRlcm5hdGUgZmFzaGlvblxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuYXR0cigneTInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCAmJlxyXG4gICAgICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTm9BbHRlcm5hdGVYYXhpc1RleHQgPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGxvbmdfdGlja19sZW5ndGhfYmcgLSA3O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICByZXR1cm4gc2hvcnRfdGlja19sZW5ndGhfYmcgLSA0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogcmVzZXQgdGhlIGZsYWcgc28gdGhhdCB2YWx1ZXMgY2FuIGJlIHNob3duIGluIHNhbWUgYWx0ZXJuYXRlIGZhc2hpb25cclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogcHJpbnQgeC1heGlzIGxhYmVsIHRleHRzXHJcbiAgICAgICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnKVxyXG4gICAgICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRlX3RleHQpIHtcclxuICAgICAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ190aWNrX2xlbmd0aF9iZztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAgICAgICAuYXR0cigneScsIHNob3J0X3RpY2tfbGVuZ3RoX2JnKVxyXG4gICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIHZhciBpc1ZhbHVlVG9CZUlnbm9yZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICBpbmRpdi5uYW1lLnRvTG93ZXJDYXNlKCkgPT0gZC50cmltKCkudG9Mb3dlckNhc2UoKSAmJlxyXG4gICAgICAgICAgICAgICAgICBpbmRpdlttZXRhRGF0YS5rZXlMaXN0WzBdXSA9PSAtMVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlzVmFsdWVUb0JlSWdub3JlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgaWYgKGlzVmFsdWVUb0JlSWdub3JlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrJylcclxuICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgICAgICAgIC5hdHRyKCd5JywgbG9uZ190aWNrX2xlbmd0aF9iZylcclxuICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnY3VycmVudENvbG9yJylcclxuICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJyksIGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKip5IHNjYWxlIGZvciBsZWZ0IHkgYXhpcyAqL1xyXG4gICAgICAgIHZhciB5ID0gZDMuc2NhbGVMaW5lYXIoKS5yYW5nZVJvdW5kKFtoZWlnaHQsIDBdKTtcclxuICAgICAgICB2YXIgbWF4VmFsdWUgPSBkMy5tYXgoZGF0YSwgKGQpID0+IGQzLm1heChrZXlMaXN0LCAoa2V5KSA9PiArZFtrZXldKSk7XHJcbiAgICAgICAgaWYgKG1heFZhbHVlID09IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgICAgICAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF4VmFsdWUgPSAxMDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuICAgICAgICAgIC8vIHN2Z1xyXG4gICAgICAgICAgLy8gICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC8vICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAgICAgLy8gICAuY2FsbChcclxuICAgICAgICAgIC8vICAgICBkM1xyXG4gICAgICAgICAgLy8gICAgICAgLmF4aXNMZWZ0KHkpXHJcbiAgICAgICAgICAvLyAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgICAvLyAgICAgICAudGlja1NpemUoLXdpZHRoKVxyXG4gICAgICAgICAgLy8gICAgICAgLnRpY2tGb3JtYXQoJycpXHJcbiAgICAgICAgICAvLyAgIClcclxuICAgICAgICAgIC8vICAgLy8gLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgICAvLyAgIC5zdHlsZSgnY29sb3InLCAnI0I5QjlCOScpXHJcbiAgICAgICAgICAvLyAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAgICAgLy8gICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICogaW5jcmVhc2UgeS1zY2FsZSBzbyB0aGF0IHZhbHVlcyB3b250IGNyb3NzIG9yIGV4Y2VlZCBvdXQgb2YgcmFuZ2VcclxuICAgICAgICAgICAqIHVzZWQgaW4gd2Vla2x5IGNoYXJ0c1xyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBtYXhWYWx1ZSA9IG1heFZhbHVlICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICAgICAgbWF4VmFsdWUgPCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIG1heFZhbHVlID1cclxuICAgICAgICAgICAgbWF4VmFsdWUgPCAxMCAmJiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgPCAxMFxyXG4gICAgICAgICAgICAgID8gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgM1xyXG4gICAgICAgICAgICAgIDogdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgMjA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHkuZG9tYWluKFswLCBtYXhWYWx1ZV0pLm5pY2UoKTtcclxuICAgICAgICBsZXQgbGluZVlzY2FsZTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1heExpbmVWYWx1ZSA9IGQzLm1heChsaW5lRGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICtkLnZhbHVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgICAgIG1heExpbmVWYWx1ZSA9IG1heExpbmVWYWx1ZSAqIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuICAgIFxyXG4gICAgICAgICAgbGV0IG1pbkxpbmVWYWx1ZSA9IGQzLm1pbihsaW5lRGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICtkLnZhbHVlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAobWF4TGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gbWluTGluZVZhbHVlIC0gMztcclxuICAgICAgICAgIGlmIChtaW5MaW5lVmFsdWUgPiAwKSB7XHJcbiAgICAgICAgICAgIG1pbkxpbmVWYWx1ZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsaW5lWXNjYWxlID0gZDNcclxuICAgICAgICAgICAgLnNjYWxlTGluZWFyKClcclxuICAgICAgICAgICAgLmRvbWFpbihbbWluTGluZVZhbHVlLCBtYXhMaW5lVmFsdWVdKVxyXG4gICAgICAgICAgICAucmFuZ2UoW2hlaWdodCwgbWluTGluZVZhbHVlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB5TGluZUF4aXM7XHJcbiAgICAgICAgaWYgKGxpbmVZc2NhbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgeUxpbmVBeGlzID0gZDNcclxuICAgICAgICAgICAgLmF4aXNSaWdodChsaW5lWXNjYWxlKVxyXG4gICAgICAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgICAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAgICAgICAudGlja0Zvcm1hdChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogc2hvdyB4LWF4aXMgZ3JpZCBiZXR3ZWVuIGxhYmVsc1xyXG4gICAgICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hncmlkQmV0d2VlbkxhYmVscykge1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXHJcbiAgICAgICAgICAgIC5hdHRyKFxyXG4gICAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICAgICAgICd0cmFuc2xhdGUoJyArIHguYmFuZHdpZHRoKCkgLyAyICsgJywnICsgaGVpZ2h0ICsgJyknXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgtaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciwgIzk5OTk5OSknKVxyXG4gICAgICAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiBkcmF3IHkgYXhpc1xyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAgIC5jYWxsKFxyXG4gICAgICAgICAgICAgIGQzXHJcbiAgICAgICAgICAgICAgICAuYXhpc0xlZnQoeSlcclxuICAgICAgICAgICAgICAgIC50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgICAgICAgIC50aWNrU2l6ZSgtd2lkdGgpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN2Z1xyXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgICAgLmNhbGwoZDMuYXhpc0xlZnQoeSkudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJyNCOUI5QjknKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC41JylcclxuICAgICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHZhciB4U3ViZ3JvdXAgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oc3ViZ3JvdXBzKTtcclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiB1c2VkIHRvIG1ha2UgZ3JvdXBlZCBiYXJzIHdpdGggbGVzc2VyIHdpZHRoIGFzIHdlIGFyZSBub3QgdXNpbmcgcGFkZGluZyBmb3Igd2lkdGhcclxuICAgICAgICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIFxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICB2YXIgY29sb3IgPSBkM1xyXG4gICAgICAgICAgLnNjYWxlT3JkaW5hbCgpXHJcbiAgICAgICAgICAuZG9tYWluKHN1Ymdyb3VwcylcclxuICAgICAgICAgIC5yYW5nZShPYmplY3QudmFsdWVzKG1ldGFEYXRhLmNvbG9ycykpO1xyXG4gICAgICAgIC8vIHZhciBjb2xvckFib3ZlVGFyZ2V0ID0gZDNcclxuICAgICAgICAvLyAgIC5zY2FsZU9yZGluYWwoKVxyXG4gICAgICAgIC8vICAgLmRvbWFpbihzdWJncm91cHMpXHJcbiAgICAgICAgLy8gICAucmFuZ2UoT2JqZWN0LnZhbHVlcyhtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSk7XHJcbiAgICAgICAgdmFyIHN0YXRlID0gc3ZnXHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5zZWxlY3RBbGwoJy5zdGF0ZScpXHJcbiAgICAgICAgICAuZGF0YShkYXRhKVxyXG4gICAgICAgICAgLmVudGVyKClcclxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyB4KGQubmFtZSkgKyAnLDApJztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIHN0YXRlXHJcbiAgICAgICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgICAgIC5kYXRhKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgc3ViZ3JvdXBzLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgKGtleSAhPT0gXCJncm91cFwiKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG9iajogYW55ID0geyBrZXk6IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH07XHJcbiAgICAgICAgICAgICAgbmV3TGlzdC5wdXNoKG9iaik7XHJcbiAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmVudGVyKClcclxuICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIGlmIChkLmtleSAhPSAnVGFyZ2V0Jykge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHxcclxuICAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbiAgICAgICAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLy8gc2VsZi5oYW5kbGVDbGljayhkLmRhdGEubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4gICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIC5wYWRkaW5nKDAuMDUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdGVtcFNjYWxlKGQua2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geFN1Ymdyb3VwKGQua2V5KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB5KGQudmFsdWUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgICAgICAgICAgLy8gdmFyIHRlbXBTY2FsZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4gICAgICAgICAgICAgICAgICB2YXIgdGVtcDtcclxuICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLnBhZGRpbmcoMC4wNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRlbXBTY2FsZS5iYW5kd2lkdGgoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geFN1Ymdyb3VwLmJhbmR3aWR0aCgpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICBpZiAoZC52YWx1ZSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkLnZhbHVlKSByZXR1cm4gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLy8gLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXHJcbiAgICAgICAgICAuc3R5bGUoJ2N1cnNvcicsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24gJiYgIWlzcmlhKSByZXR1cm4gJ3BvaW50ZXInO1xyXG4gICAgICAgICAgICBlbHNlIHJldHVybiAnZGVmYXVsdCc7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgZC52YWx1ZSAmJlxyXG4gICAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbiAgICAgICAgICAgICAgZC52YWx1ZSA+PSBwYXJzZUludChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICYmXHJcbiAgICAgICAgICAgICAgc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXRbZC5rZXldO1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogZGlzcGxheSBhbmdsZWQgdGV4dHMgb24gdGhlIGJhcnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciAhPSB1bmRlZmluZWQgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgICAgIHN0YXRlXHJcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAgICAgICAuZGF0YShmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIGxldCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICBzdWJncm91cHMubWFwKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHsga2V5OiBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9O1xyXG4gICAgICAgICAgICAgICAgbmV3TGlzdC5wdXNoKG9iaik7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5lbnRlcigpXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4gICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBkLmtleSAmJiBkLnZhbHVlXHJcbiAgICAgICAgICAgICAgICA/IGQua2V5Lmxlbmd0aCA+IDIwXHJcbiAgICAgICAgICAgICAgICAgID8gZC5rZXkuc3Vic3RyaW5nKDAsIDE3KSArICcuLi4nXHJcbiAgICAgICAgICAgICAgICAgIDogZC5rZXlcclxuICAgICAgICAgICAgICAgIDogJyc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuICcjMDAwJztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICdib2xkJylcclxuICAgICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxOTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAnMThweCc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gJzEwcHgnO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuICcxNHB4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcxNHB4JztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4gICAgICAgICAgICAgICAgICB2YXIgdGVtcDtcclxuICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLnBhZGRpbmcoMC4wNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICogaWYgc2V0LCB0aGVuIGFsbCB0ZXh0cyBsbCBiZSBob3Jpem9udGFsXHJcbiAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnRleHRBbHdheXNIb3Jpem9udGFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgKyB4U3ViZ3JvdXAoZC5rZXkpICsgJywnICsgKHkoZC52YWx1ZSkgLSAzKSArICcpJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICogcm90YXRlIHRleHRzIGhhdmluZyBtb3JlIHRoYW4gb25lIGRpZ2l0c1xyXG4gICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgIC8vIGlmIChkLnZhbHVlID4gOSlcclxuICAgICAgICAgICAgICBpZiAoIWlzTmFOKHRlbXBTY2FsZShkLmtleSkpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICtcclxuICAgICAgICAgICAgICAgICAgKHRlbXBTY2FsZShkLmtleSkgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKiAwLjU1KSArXHJcbiAgICAgICAgICAgICAgICAgICcsJyArXHJcbiAgICAgICAgICAgICAgICAgICh5KDApIC0gMTApICtcclxuICAgICAgICAgICAgICAgICAgJykgcm90YXRlKDI3MCknXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKDAsMCknO1xyXG4gICAgICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgICAgICAvLyAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgLy8gICAgICd0cmFuc2xhdGUoJyArXHJcbiAgICAgICAgICAgICAgLy8gICAgICh0ZW1wU2NhbGUoZC5rZXkpICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMikgK1xyXG4gICAgICAgICAgICAgIC8vICAgICAnLCcgK1xyXG4gICAgICAgICAgICAgIC8vICAgICB5KDApICtcclxuICAgICAgICAgICAgICAvLyAgICAgJyknXHJcbiAgICAgICAgICAgICAgLy8gICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8XHJcbiAgICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmxlbmd0aCB8fFxyXG4gICAgICAgICAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiZcclxuICAgICAgICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ2xpY2soZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWlzcmlhKSB7XHJcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0QWxsKCcubGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3V0JywgaGFuZGxlTW91c2VPdXQpXHJcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGhhbmRsZU1vdXNlT3Zlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wIHx8IChcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCA9PSB1bmRlZmluZWRcclxuICAgICAgICApKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3JpYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcclxuICAgICAgICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBoYW5kbGVNb3VzZU91dClcclxuICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBoYW5kbGVNb3VzZU92ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU92ZXIoZCwgaSkge1xyXG4gICAgICAgICAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbiAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIC8vIHZhciB0ZW1wU2NhbGU7XHJcbiAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzQ291bnRlcjtcclxuICAgICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudHNDb3VudGVyID0ga2V5cy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC5wYWRkaW5nKDAuMDUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gLnBhZGRpbmcoMC4wNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgeChkLm5hbWUpICsgdGVtcFNjYWxlKGQua2V5KSArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDIgLSA5MFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgeChkLm5hbWUpICtcclxuICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlKGQua2V5KSAtXHJcbiAgICAgICAgICAgICAgICAgICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyKSAvIDIgK1xyXG4gICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4geChkLm5hbWUpICsgdGVtcFNjYWxlKGQua2V5KSAtICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyKSAvIDIgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKVxyXG4gICAgICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICByZXR1cm4geShkLnZhbHVlKSAtIDMgLSA0MDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ2R5JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBkLmNsYXNzO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYXR0cignd2lkdGgnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgLy8gdmFyIHRlbXBTY2FsZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4gICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIC5wYWRkaW5nKDAuMDUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gJzE4MHB4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gdGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDQwKVxyXG4gICAgICAgICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIGxldCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlID8gbWV0YURhdGEuZGF0YVR5cGUgOiAnJztcclxuICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNab29tZWRPdXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBkZXNpcmVkVGV4dCA9XHJcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JyArIGQubmFtZSArICc8L3NwYW4+JztcclxuICAgICAgICAgICAgICAgIGRlc2lyZWRUZXh0ICs9XHJcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgICBkLnZhbHVlICtcclxuICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgK1xyXG4gICAgICAgICAgICAgICAgICAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzaXJlZFRleHQ7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wS2V5ID1cclxuICAgICAgICAgICAgICAgICAgZC5uYW1lLmxlbmd0aCA8PSA4ID8gZC5uYW1lIDogZC5uYW1lLnN1YnN0cmluZygwLCA1KSArICcuLi4nO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRlc2lyZWRUZXh0ID1cclxuICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLW5hbWVcIj4nICtcclxuICAgICAgICAgICAgICAgICAgdGVtcEtleSArXHJcbiAgICAgICAgICAgICAgICAgICc6JyArXHJcbiAgICAgICAgICAgICAgICAgIGQudmFsdWUgK1xyXG4gICAgICAgICAgICAgICAgICBkYXRhVHlwZSArXHJcbiAgICAgICAgICAgICAgICAgICc8L3NwYW4+JztcclxuICAgICAgICAgICAgICAgIGRlc2lyZWRUZXh0ICs9XHJcbiAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPicgKyBkLm5hbWUgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzaXJlZFRleHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlTW91c2VPdXQoZCwgaSkge1xyXG4gICAgICAgICAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN2Z1xyXG4gICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAneDIgYXhpczInKVxyXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKVxyXG4gICAgICAgICAgLnN0eWxlKCdjb2xvcicsICcjMDAwJylcclxuICAgIFxyXG4gICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4U2NhbGVGcm9tT3JpZ2luKS50aWNrU2l6ZSgwKSlcclxuICAgICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuICAgICAgICBzdmcuc2VsZWN0QWxsKCdnLngyLmF4aXMyIGcudGljayB0ZXh0Jykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgIHN2Z1xyXG4gICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQgeWF4aXMtZGFzaGVkJylcclxuICAgICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgICAgICAgLmNhbGwoeSlcclxuICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgICAgICAgIC5jYWxsKFxyXG4gICAgICAgICAgICBkM1xyXG4gICAgICAgICAgICAgIC5heGlzTGVmdCh5KVxyXG4gICAgICAgICAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAgICAgICAgIC50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgICAgICAudGlja0Zvcm1hdChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gICAgICAgIHN2Z1lBeGlzUmlnaHRcclxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgICAgICAgIC5jYWxsKHkpXHJcbiAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGhpZGUgeCBheGlzIGxhYmVsc1xyXG4gICAgICAgICAqIGNvbmZpZyBpcyB0aGVyZSBmb3IgZnV0dXJlIHVzZVxyXG4gICAgICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbiAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlblxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKS5hdHRyKFxyXG4gICAgICAgICAgICAnY2xhc3MnLFxyXG4gICAgICAgICAgICAnbGliLWRpc3BsYXktaGlkZGVuJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogaGlkZSB5IGF4aXMgbGFiZWxzXHJcbiAgICAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQgPiBnID4gdGV4dCcpLmF0dHIoXHJcbiAgICAgICAgICAgICdjbGFzcycsXHJcbiAgICAgICAgICAgICdsaWItZGlzcGxheS1oaWRkZW4nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBoaWRlIHkgYXhpcyBsYWJlbHNcclxuICAgICAgICAgKiBjb25maWcgaXMgdGhlcmUgZm9yIGZ1dHVyZSB1c2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlblxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIGRhc2hlZCB5IGF4aXNcclxuICAgICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkICE9IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgICAgIC5zdHlsZSgnY29sb3InLCAnIzk5OTk5OScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGxpbmVEYXRhICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnNob3dMaW5lQ2hhcnRBeGlzKSB7XHJcbiAgICAgICAgICAgIHN2Z1lBeGlzUmlnaHRcclxuICAgICAgICAgICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQxJylcclxuICAgICAgICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIDAgKyAnLDApJylcclxuICAgICAgICAgICAgICAuY2FsbCh5TGluZUF4aXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB1c2VkIHRvIGRpc3BsYXkgeSBsYWJlbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHVzZWQgdG8gd3JpdGUgeSBsYWJlbHMgYmFzZWQgb24gY29uZmlndXJhdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS55TGFiZWwpIHtcclxuICAgICAgICAgIHN2Z1lBeGlzTGVmdFxyXG4gICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJylcclxuICAgICAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMCAtIG1hcmdpbi5sZWZ0IC8gMiAtIDMwKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAgICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4gICAgICAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4gICAgICAgICAgICAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4gICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLXdlZWtseUNoYXJ0cycpXHJcbiAgICAgICAgICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICAgIGZ1bmN0aW9uIGlzQWNyb255bShsYWJlbCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgICAgIChsYWJlbCA9PT0gbGFiZWwudG9VcHBlckNhc2UoKSAmJiAvW0EtWl0vLnRlc3QobGFiZWwpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgeExhYmVsVGV4dCA9IG1ldGFEYXRhLnhMYWJlbDtcclxuICAgICAgY29uc3QgaXNBY3IgPSBpc0Fjcm9ueW0oeExhYmVsVGV4dC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpKTtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgbGV0IGJhc2VDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbiAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydClcclxuICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4gICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4gICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLWF4aXMtd2F0ZXJmYWxsLWxhYmVsJztcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgICAgLmF0dHIoXHJcbiAgICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICAgICd0cmFuc2xhdGUoJyArIHdpZHRoIC8gMiArICcgLCcgKyAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIDIwKSArICcpJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgICAudGV4dChpc0FjciA/IHhMYWJlbFRleHQudG9VcHBlckNhc2UoKSA6IHhMYWJlbFRleHQudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3IgPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgICAgICAgY29uc3QgeVplcm8gPSB5KHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCk7XHJcbiAgICAgICAgICBzdmdcclxuICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAgICAgICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgICAgICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuICAgICAgICAgIC8vIHN2Z1lBeGlzUmlnaHRcclxuICAgICAgICAgIC8vICAgLmFwcGVuZCgnbGluZScpXHJcbiAgICAgICAgICAvLyAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAgICAgICAvLyAgIC5hdHRyKCd4MicsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAgICAgICAvLyAgIC5hdHRyKCd5MScsIHlaZXJvKVxyXG4gICAgICAgICAgLy8gICAuYXR0cigneTInLCB5WmVybylcclxuICAgICAgICAgIC8vICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcbiAgICAgICAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgMCArICcsJyArICh5WmVybyAtIDMwKSArICcpJylcclxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgICAgICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIGxldCBkYXRhVHlwZVRlbXAgPSAnJztcclxuICAgICAgICAgICAgICBsZXQgdGFyZ2V0TGluZU5hbWUgPSAndGFyZ2V0JztcclxuICAgICAgICAgICAgICBpZiAobWV0YURhdGEuZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlVGVtcCA9IG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4gICAgICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0TmFtZVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGluZU5hbWUgPSBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgYDxkaXY+JHt0YXJnZXRMaW5lTmFtZX08L2Rpdj5gICtcclxuICAgICAgICAgICAgICAgICc8ZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICtcclxuICAgICAgICAgICAgICAgICcnICtcclxuICAgICAgICAgICAgICAgIGRhdGFUeXBlVGVtcCArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+J1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgKiB1c2VkIGJ5IGRyaWxsZG93biBjaGFydHNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgLy8gc3ZnXHJcbiAgICAgICAgICAvLyAgIC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgICAvLyAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cycpXHJcbiAgICAgICAgICAvLyAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbC50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXRhRGF0YS5saW5leUxhYmVsKSB7XHJcbiAgICAgICAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCkgcm90YXRlKDkwKScpXHJcbiAgICAgICAgICAgIC5hdHRyKCd5JywgMCAtIDEwMClcclxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAwICsgMTAwKVxyXG4gICAgICAgICAgICAuYXR0cignZHknLCAnNWVtJylcclxuICAgICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdzbWFsbGVyJylcclxuICAgICAgICAgICAgLnRleHQobWV0YURhdGEubGluZXlMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaW5lRGF0YSkge1xyXG4gICAgICAgICAgc3ZnXHJcbiAgICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAgICAgICAuZGF0dW0obGluZURhdGEpXHJcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxLjUpXHJcbiAgICAgICAgICAgIC5hdHRyKFxyXG4gICAgICAgICAgICAgICdkJyxcclxuICAgICAgICAgICAgICBkM1xyXG4gICAgICAgICAgICAgICAgLmxpbmUoKVxyXG4gICAgICAgICAgICAgICAgLngoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC55KGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgIFxyXG4gICAgICAgICAgdmFyIGRvdCA9IHN2Z1xyXG4gICAgICAgICAgICAuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgICAgICAgICAuZGF0YShsaW5lRGF0YSlcclxuICAgICAgICAgICAgLmVudGVyKClcclxuICAgICAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHxcclxuICAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbiAgICAgICAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJlxyXG4gICAgICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgICAgIGRvdFxyXG4gICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgICAgICAgICAuYXR0cignY3gnLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMjtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmF0dHIoJ2N5JywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gbGluZVlzY2FsZShkLnZhbHVlKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXHJcbiAgICAgICAgICAgIC5hdHRyKCdyJywgMyk7XHJcbiAgICBcclxuICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcikge1xyXG4gICAgICAgICAgICBkb3RcclxuICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZG90JylcclxuICAgICAgICAgICAgICAuYXR0cignY29sb3InLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgICAgICAgICAuYXR0cignc3R5bGUnLCAnZm9udC1zaXplOiAnICsgJy44NWVtJylcclxuICAgICAgICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDI7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbGluZVlzY2FsZShkLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIC5hdHRyKCdkeScsICctMWVtJylcclxuICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsRm9ybWF0dGVyKGQudmFsdWUpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGhhbmRsZUNsaWNrKGQ6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd24gfHwgZD8udG9nZ2xlRnJvbSlcclxuICAgICAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gICAgICB9XHJcbiAgICAgIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZCkge1xyXG4gICAgICAgIHRoaXMuaGVhZGVyTWVudWNsaWNrRXZlbnQuZW1pdChpZCk7XHJcbiAgICAgIH1cclxuICAgICAgaGFuZGxlREQxQ2xpY2soZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmlzREQxT3BlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0REMk9wZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBoYW5kbGVERDJDbGljayhldmVudCkge1xyXG4gICAgICAgIHRoaXMuaXNERDJPcGVuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzREQxT3BlbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbihldmVudCkge1xyXG4gICAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgfSAgXHJcbiAgfSIsIjxkaXZcclxuICAjZ3JvdXBjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZC1iZyk7XCJcclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuXHJcbjxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gID48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjNcclxuICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgIChjb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24pPVwiaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuPC9kaXY+XHJcblxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxXHJcbiAgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiXHJcbiAgW2hhc0RyaWxsRG93bl09XCJjaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duXCJcclxuICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiXHJcbiAgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgW2lzcmlhXT1cImN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVwiXHJcbiAgW3NlbGVjdGVkS3BpVG9vbHRvcF09XCJjaGFydENvbmZpZ3VyYXRpb24uc2VsZWN0ZWRLcGlUb29sdG9wXCJcclxuICAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gIFtpc0FsZXJ0RW5hYmxlZF09XCJpc0FsZXJ0RW5hYmxlZFwiXHJcbiAgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIlxyXG4+PC9saWItY2hhcnQtaGVhZGVyLXYxPlxyXG5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJncm91cGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICNncm91cGNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmdcIlxyXG4gID48L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
672
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2dyb3VwLWNoYXJ0L2dyb3VwLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ncm91cC1jaGFydC9ncm91cC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUF1RmxELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUE2RHhEO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUF0REQsNkJBQXdCLEdBQWdDLEVBQUUsQ0FBQztRQUMxRCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyQyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXpELG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ2hDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQzlCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUN6Qyx1QkFBa0IsR0FBdUIsRUFBd0IsQ0FBQztRQUNsRSxlQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUVSLGNBQVMsR0FBRztZQUMzQixpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLGdC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a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGlCQUdaLGlCQUFpQixDQUFDLElBQUk7d0RBSXJDLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWxELGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR3BDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFVuaXF1ZUlkIH0gZnJvbSAnLi4vdW5pcXVlLWlkJztcclxuaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuaW50ZXJmYWNlIENoYXJ0RGF0YSB7XHJcbiAgZGF0YTogYW55W107XHJcbiAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGE7XHJcbiAgbGluZURhdGE/OiBhbnlbXTtcclxuICB0YXJnZXRMaW5lRGF0YT86IFRhcmdldExpbmVEYXRhO1xyXG4gIGRyb3Bkb3duRGF0YTE/OiBhbnk7XHJcbiAgZHJvcGRvd25EYXRhMj86IGFueTtcclxufVxyXG5cclxuaW50ZXJmYWNlIENoYXJ0TWV0YURhdGEge1xyXG4gIGNvbG9yczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBjb2xvckFib3ZlVGFyZ2V0PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBrZXlMaXN0OiBzdHJpbmdbXTtcclxuICBoYXNEcmlsbERvd24/OiBib29sZWFuO1xyXG4gIGJhcldpdGhvdXRDbGljaz86IHN0cmluZ1tdO1xyXG4gIGRhdGFUeXBlPzogc3RyaW5nO1xyXG4gIHlMYWJlbD86IHN0cmluZztcclxuICB4TGFiZWw/OiBzdHJpbmc7XHJcbiAgbGluZXlMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFRhcmdldExpbmVEYXRhIHtcclxuICB0YXJnZXQ6IG51bWJlcjtcclxuICB0YXJnZXROYW1lPzogc3RyaW5nO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBDaGFydENvbmZpZ3VyYXRpb24ge1xyXG4gIG1hcmdpbjogeyB0b3A6IG51bWJlcjsgcmlnaHQ6IG51bWJlcjsgYm90dG9tOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9O1xyXG4gIGxhYmVsRm9ybWF0dGVyOiBGdW5jdGlvbjtcclxuICBzdmdIZWlnaHQ6IG51bWJlcjtcclxuICBudW1iZXJPZllUaWNrczogbnVtYmVyO1xyXG4gIGxlZ2VuZEp1c3RpZmllZDogYm9vbGVhbjtcclxuICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiBGdW5jdGlvbjtcclxuICB5QXhpc0xhYmVsRm9tYXR0ZXI6IEZ1bmN0aW9uO1xyXG4gIGxpbmVHcmFwaENvbG9yOiBzdHJpbmc7XHJcbiAgc2hvd0xpbmVDaGFydEF4aXM6IGJvb2xlYW47XHJcbiAgc2hvd1ZhbHVlczogYm9vbGVhbjtcclxuICBoZWFkZXJNZW51T3B0aW9uczogYW55W107XHJcbiAgeEF4aXNHcmlkPzogYm9vbGVhbjtcclxuICB5QXhpc0dyaWQ6IGJvb2xlYW47XHJcbiAgbGVnZW5kVmlzaWJsZTogYm9vbGVhbjtcclxuICBpc0hlYWRlclZpc2libGU/OiBib29sZWFuO1xyXG4gIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kPzogYm9vbGVhbjtcclxuICBpc011bHRpQ2hhcnRHcmlkTGluZT86IGJvb2xlYW47XHJcbiAgaXNGdWxsU2NyZWVuPzogYm9vbGVhbjtcclxuICBjdXN0b21Zc2NhbGU/OiBudW1iZXI7XHJcbiAgdGV4dHNPbkJhcj86IGJvb2xlYW47XHJcbiAgaXNYYXhpc0xhYmVsSGlkZGVuPzogYm9vbGVhbjtcclxuICBpc1lheGlzTGFiZWxIaWRkZW46IGJvb2xlYW47XHJcbiAgaXNZYXhpc0hpZGRlbj86IGJvb2xlYW47XHJcbiAgaXNZYXhpc0Rhc2hlZD86IGJvb2xlYW47XHJcbiAgdGV4dEZvcm1hdHRlcj86IHN0cmluZztcclxuICBpc05vQWx0ZXJuYXRlWGF4aXNUZXh0PzogYm9vbGVhbjtcclxuICBpc1hncmlkQmV0d2VlbkxhYmVscz86IGJvb2xlYW47XHJcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XHJcbiAgaGlkZUxlZ2VuZE9uVG9wOiBib29sZWFuO1xyXG4gIGlzWGF4aXNDb2xvcjogc3RyaW5nO1xyXG4gIGxhYmVsT3ZlcmxhcE1pbm9yRml4OiBib29sZWFuO1xyXG4gIG5vSG92ZXJFZmZlY3Q6IGJvb2xlYW47XHJcbiAgbm9Ib3ZlckRpc3BsYXlEYXRhOiBib29sZWFuO1xyXG4gIHNob3dYYXhpc1RvcDogYm9vbGVhbjtcclxuICBkaXNwbGF5WWF4aXNMYWJlbHM/OiBib29sZWFuO1xyXG4gIHhMYWJlbHNPblNhbWVMaW5lPzogYm9vbGVhbjtcclxuICB0ZXh0QWx3YXlzSG9yaXpvbnRhbD86IGJvb2xlYW47XHJcbiAgbGVnZW5kQXRUb3BSaWdodD86IGJvb2xlYW47XHJcbiAgaXNEcmlsbGRvd25DaGFydD86IGJvb2xlYW47XHJcbiAgZGlzcGxheVRpdGxlT25Ub3A/OiBib29sZWFuO1xyXG4gIGlzVG9nZ2xlVmlzaWJsZT86IGJvb2xlYW47XHJcbiAgaXNUaXRsZUhpZGRlbj86IGJvb2xlYW47XHJcbiAgaXNEaXNwbGF5QmFyRGV0YWlsc0F0Qm90dG9tPzogYm9vbGVhbjtcclxuICBob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheTogbnVtYmVyO1xyXG4gIGJhclZhdWxlQ29sb3I/OiBzdHJpbmc7XHJcbiAgaXNSaWE/OiBib29sZWFuO1xyXG4gIHlBeGlzQ3VzdG9tVGV4dFN0eWxlcz86IHN0cmluZztcclxuICB5QXhpc0N1c3RvbWxhYmVsU3R5bGVzPzogc3RyaW5nO1xyXG4gIHhBeGlzQ3VzdG9tbGFiZWxTdHlsZXM/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWdyb3VwLWNoYXJ0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JvdXAtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dyb3VwLWNoYXJ0LmNvbXBvbmVudC5sZXNzJywgJy4uL2NvbW1vbi1zdHlsZXMubGVzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcm91cENoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50VW5pcXVlSWQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBncm91cGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YSE6IENoYXJ0RGF0YTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2hhcnRDb25maWd1cmF0aW9uPiA9IHt9O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGlzSGVhZGVyVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgbGVnZW5kVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNUcmFuc3BhcmVudEJhY2tncm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjaGFydENvbmZpZ3VyYXRpb246IENoYXJ0Q29uZmlndXJhdGlvbiA9IHt9IGFzIENoYXJ0Q29uZmlndXJhdGlvbjtcclxuICBvYmplY3RLZXlzID0gT2JqZWN0LmtleXM7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09OU1RBTlRTID0ge1xyXG4gICAgU0hPUlRfVElDS19MRU5HVEg6IDQsXHJcbiAgICBMT05HX1RJQ0tfTEVOR1RIOiAxNixcclxuICAgIFNIT1JUX1RJQ0tfTEVOR1RIX0JHOiA1LFxyXG4gICAgTE9OR19USUNLX0xFTkdUSF9CRzogMzAsXHJcbiAgICBMRUZUX1JJR0hUX1NQQUNFUzogNTAsXHJcbiAgICBSSUdIVF9TVkdfV0lEVEg6IDYwLFxyXG4gICAgWk9PTV9XSURUSF9NVUxUSVBMSUVSOiA0MCxcclxuICAgIERSSUxMRE9XTl9XSURUSF9NVUxUSVBMSUVSOiAxNjAsXHJcbiAgICBNSU5fQkFSX1dJRFRIX1NJTkdMRTogMjAwLFxyXG4gICAgTUlOX0JBUl9XSURUSF9NVUxUSVBMRTogMTI1LFxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdENvbmZpZ3VyYXRpb246IENoYXJ0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICBsYWJlbEZvcm1hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHN2Z0hlaWdodDogNzAsXHJcbiAgICBudW1iZXJPZllUaWNrczogNSxcclxuICAgIGxlZ2VuZEp1c3RpZmllZDogdHJ1ZSxcclxuICAgIHlMaW5lQXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICBsaW5lR3JhcGhDb2xvcjogJyNGNkQyODMnLFxyXG4gICAgc2hvd0xpbmVDaGFydEF4aXM6IHRydWUsXHJcbiAgICBzaG93VmFsdWVzOiB0cnVlLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgICB5QXhpc0dyaWQ6IGZhbHNlLFxyXG4gICAgbGVnZW5kVmlzaWJsZTogdHJ1ZSxcclxuICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogZmFsc2UsXHJcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGRkZGJyxcclxuICAgIGhpZGVMZWdlbmRPblRvcDogdHJ1ZSxcclxuICAgIGlzWGF4aXNDb2xvcjogJyM5OTk5OTknLFxyXG4gICAgbGFiZWxPdmVybGFwTWlub3JGaXg6IHRydWUsXHJcbiAgICBub0hvdmVyRWZmZWN0OiB0cnVlLFxyXG4gICAgbm9Ib3ZlckRpc3BsYXlEYXRhOiB0cnVlLFxyXG4gICAgc2hvd1hheGlzVG9wOiB0cnVlLFxyXG4gICAgaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXk6IDAsXHJcbiAgfTtcclxuXHJcbiAgdW5pcXVlSWQ6IHN0cmluZyA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc1pvb21lZE91dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzREQxT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzREQyT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGQzLnNlbGVjdCgnIycgKyB0aGlzLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplZ3JvdXBDaGFydCgpO1xyXG4gICAgfSwgMTApO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKHsgaXNab29tT3V0LCBldmVudCB9KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzWm9vbWVkT3V0ID0gaXNab29tT3V0O1xyXG4gICAgdGhpcy5vblJlc2l6ZWQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgaXNMZWdlbmRWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YT8ubWV0YURhdGE/LmNvbG9ycyAmJlxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMpLmxlbmd0aCA+IDFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBrZWVwT3JkZXIgPSAoYTogYW55KTogYW55ID0+IGE7XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMubGVnZW5kVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplZ3JvdXBDaGFydCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLnByZXBhcmVNZXRhRGF0YSh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YSk7XHJcbiAgICBjb25zdCBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG4gICAgY29uc3QgaXNSaWEgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYSB8fCBmYWxzZTtcclxuXHJcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FsY3VsYXRlRGltZW5zaW9ucygpO1xyXG4gICAgY29uc3QgeyBzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCB9ID0gdGhpcy5jcmVhdGVTdmdDb250YWluZXJzKFxyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNjYWxlcyA9IHRoaXMuY3JlYXRlU2NhbGVzKGRhdGEsIG1ldGFEYXRhLCB3aWR0aCwgaGVpZ2h0LCBsaW5lRGF0YSk7XHJcbiAgICB0aGlzLnJlbmRlckF4ZXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHNjYWxlcywgd2lkdGgsIGhlaWdodCk7XHJcbiAgICB0aGlzLnJlbmRlckJhcnMoc3ZnLCBkYXRhLCBtZXRhRGF0YSwgc2NhbGVzLCBpc1JpYSk7XHJcbiAgICB0aGlzLnJlbmRlckxhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgbWV0YURhdGEsIHdpZHRoLCBoZWlnaHQsIHNjYWxlcyk7XHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCBzY2FsZXMueSwgd2lkdGgpO1xyXG4gICAgdGhpcy5yZW5kZXJMaW5lR3JhcGgoc3ZnLCBsaW5lRGF0YSwgbWV0YURhdGEsIHNjYWxlcywgaXNSaWEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlTWV0YURhdGEobWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBDaGFydE1ldGFEYXRhIHtcclxuICAgIGlmICghbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgICBtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0ID0gbWV0YURhdGEuY29sb3JzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1ldGFEYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVEaW1lbnNpb25zKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmdyb3VwY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG5cclxuICAgIGxldCB3aWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gICAgd2lkdGggPSB0aGlzLmFkanVzdFdpZHRoRm9yWm9vbSh3aWR0aCk7XHJcblxyXG4gICAgbGV0IGhlaWdodCA9IHRoaXMuY2FsY3VsYXRlSGVpZ2h0KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lciwgbWFyZ2luKTtcclxuXHJcbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkanVzdFdpZHRoRm9yWm9vbSh3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGRhdGFMZW5ndGggPSB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoZGF0YUxlbmd0aCA+IDMwICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgY29uc3QgYmFzZVdpZHRoID0gZGF0YUxlbmd0aCAqIHRoaXMuQ09OU1RBTlRTLlpPT01fV0lEVEhfTVVMVElQTElFUjtcclxuICAgICAgY29uc3QgZHJvcGRvd25XaWR0aCA9IHRoaXMuY2hhcnREYXRhLmRyb3Bkb3duRGF0YTEgPyBkYXRhTGVuZ3RoICogNjAgOiBiYXNlV2lkdGg7XHJcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGRyb3Bkb3duV2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDEyMCAmJiB0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDEyMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUxlbmd0aCA+IDggJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgICAgd2lkdGggPSB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDI1MFxyXG4gICAgICAgID8gZGF0YUxlbmd0aCAqIDI1MFxyXG4gICAgICAgIDogZGF0YUxlbmd0aCAqIHRoaXMuQ09OU1RBTlRTLkRSSUxMRE9XTl9XSURUSF9NVUxUSVBMSUVSO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB3aWR0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlSGVpZ2h0KFxyXG4gICAgY29udGFpbmVyOiBkMy5TZWxlY3Rpb248YW55LCB1bmtub3duLCBIVE1MRWxlbWVudCwgYW55PixcclxuICAgIG1hcmdpbjogeyB0b3A6IG51bWJlcjsgYm90dG9tOiBudW1iZXIgfVxyXG4gICk6IG51bWJlciB7XHJcbiAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgKlxyXG4gICAgICAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0IC8gMTAwKSAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ICE9PSA3MCkge1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICBoZWlnaHQgPSBwYXJzZUludChjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCAmJiAhdGhpcy5pc0hlYWRlclZpc2libGUpIHtcclxuICAgICAgaGVpZ2h0ID0gcGFyc2VJbnQoY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIDEzMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIGhlaWdodCA9IHBhcnNlSW50KGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b20gLSAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlaWdodDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3ZnQ29udGFpbmVycyh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuXHJcbiAgICBjb25zdCBvdXRlckNvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdpZCcsIHRoaXMudW5pcXVlSWQpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ2hlaWdodCcsIGhlaWdodCArICdweCcpXHJcbiAgICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdoaWRkZW4nKVxyXG4gICAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsIGAke21hcmdpbi5sZWZ0fXB4YClcclxuICAgICAgLnN0eWxlKCdwYWRkaW5nLXJpZ2h0JywgYCR7dGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIfXB4YClcclxuICAgICAgLnN0eWxlKCdtYXJnaW4tbGVmdCcsICcxNXB4Jyk7XHJcblxyXG4gICAgY29uc3Qgc3ZnWUF4aXNMZWZ0ID0gdGhpcy5jcmVhdGVMZWZ0WUF4aXMob3V0ZXJDb250YWluZXIsIGhlaWdodCwgbWFyZ2luKTtcclxuICAgIGNvbnN0IHN2Z1lBeGlzUmlnaHQgPSB0aGlzLmNyZWF0ZVJpZ2h0WUF4aXMob3V0ZXJDb250YWluZXIsIGhlaWdodCwgbWFyZ2luKTtcclxuXHJcbiAgICBjb25zdCBpbm5lckNvbnRhaW5lciA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgICAuc3R5bGUoJ292ZXJmbG93LXgnLCAnYXV0bycpO1xyXG5cclxuICAgIGNvbnN0IHN2ZyA9IGlubmVyQ29udGFpbmVyXHJcbiAgICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoIC0gdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAzMClcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gICAgcmV0dXJuIHsgc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTGVmdFlBeGlzKGNvbnRhaW5lcjogYW55LCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAnMTAwJylcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMTApXHJcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgICAuc3R5bGUoJ2xlZnQnLCAnMCcpXHJcbiAgICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0ICsgMTV9LCAke21hcmdpbi50b3B9KWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSaWdodFlBeGlzKGNvbnRhaW5lcjogYW55LCBoZWlnaHQ6IG51bWJlciwgbWFyZ2luOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDEwKVxyXG4gICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgICAgLnN0eWxlKCdyaWdodCcsICcxMnB4JylcclxuICAgICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7bWFyZ2luLnRvcH0pYCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVNjYWxlcyhcclxuICAgIGRhdGE6IGFueVtdLFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICBsaW5lRGF0YT86IGFueVtdXHJcbiAgKTogYW55IHtcclxuICAgIGNvbnN0IHsgeCwgeFNjYWxlRnJvbU9yaWdpbiB9ID0gdGhpcy5jcmVhdGVYU2NhbGVzKGRhdGEsIHdpZHRoKTtcclxuICAgIGNvbnN0IHkgPSB0aGlzLmNyZWF0ZVlTY2FsZShkYXRhLCBtZXRhRGF0YS5rZXlMaXN0LCBoZWlnaHQpO1xyXG4gICAgY29uc3QgeFN1Ymdyb3VwID0gdGhpcy5jcmVhdGVTdWJncm91cFNjYWxlKG1ldGFEYXRhLmtleUxpc3QsIHgpO1xyXG4gICAgY29uc3QgbGluZVlzY2FsZSA9IGxpbmVEYXRhID8gdGhpcy5jcmVhdGVMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQpIDogbnVsbDtcclxuXHJcbiAgICByZXR1cm4geyB4LCB4U2NhbGVGcm9tT3JpZ2luLCB5LCB4U3ViZ3JvdXAsIGxpbmVZc2NhbGUgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlWFNjYWxlcyhkYXRhOiBhbnlbXSwgd2lkdGg6IG51bWJlcik6IGFueSB7XHJcbiAgICBjb25zdCBncm91cHMgPSBkYXRhLm1hcCgoZCkgPT4gZC5uYW1lKTtcclxuXHJcbiAgICBjb25zdCB4ID0gZDNcclxuICAgICAgLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgICAucmFuZ2UoW1xyXG4gICAgICAgIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTLFxyXG4gICAgICAgIHdpZHRoIC0gdGhpcy5DT05TVEFOVFMuUklHSFRfU1ZHX1dJRFRIIC0gdGhpcy5DT05TVEFOVFMuTEVGVF9SSUdIVF9TUEFDRVMsXHJcbiAgICAgIF0pXHJcbiAgICAgIC5wYWRkaW5nKDAuMyk7XHJcblxyXG4gICAgY29uc3QgeFNjYWxlRnJvbU9yaWdpbiA9IGQzXHJcbiAgICAgIC5zY2FsZUJhbmQoKVxyXG4gICAgICAuZG9tYWluKGdyb3VwcylcclxuICAgICAgLnJhbmdlKFswLCB3aWR0aCAtIHRoaXMuQ09OU1RBTlRTLlJJR0hUX1NWR19XSURUSF0pO1xyXG5cclxuICAgIHJldHVybiB7IHgsIHhTY2FsZUZyb21PcmlnaW4gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlWVNjYWxlKGRhdGE6IGFueVtdLCBrZXlMaXN0OiBzdHJpbmdbXSwgaGVpZ2h0OiBudW1iZXIpOiBhbnkge1xyXG4gICAgbGV0IG1heFZhbHVlID0gZDMubWF4KGRhdGEsIChkKSA9PiBkMy5tYXgoa2V5TGlzdCwgKGtleSkgPT4gK2Rba2V5XSkpIHx8IDA7XHJcblxyXG4gICAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICAgIG1heFZhbHVlID0gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGFcclxuICAgICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwXHJcbiAgICAgICAgOiAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4gICAgICBtYXhWYWx1ZSAqPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmIG1heFZhbHVlIDwgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldDtcclxuICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA8IDEwICYmIHRhcmdldCA8IDEwID8gdGFyZ2V0ICsgMyA6IHRhcmdldCArIDIwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgbWF4VmFsdWVdKS5yYW5nZShbaGVpZ2h0LCAwXSkubmljZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdWJncm91cFNjYWxlKHN1Ymdyb3Vwczogc3RyaW5nW10sIHg6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gZDMuc2NhbGVCYW5kKCkuZG9tYWluKHN1Ymdyb3VwcykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTGluZVlTY2FsZShsaW5lRGF0YTogYW55W10sIGhlaWdodDogbnVtYmVyKTogYW55IHtcclxuICAgIGxldCBtYXhMaW5lVmFsdWUgPSBkMy5tYXgobGluZURhdGEsIChkKSA9PiArZC52YWx1ZSkgfHwgMDtcclxuICAgIG1heExpbmVWYWx1ZSAqPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUgfHwgMTtcclxuXHJcbiAgICBsZXQgbWluTGluZVZhbHVlID0gZDMubWluKGxpbmVEYXRhLCAoZCkgPT4gK2QudmFsdWUpIHx8IDA7XHJcbiAgICBpZiAobWF4TGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlIC09IDM7XHJcbiAgICBpZiAobWluTGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gMDtcclxuXHJcbiAgICByZXR1cm4gZDNcclxuICAgICAgLnNjYWxlTGluZWFyKClcclxuICAgICAgLmRvbWFpbihbbWluTGluZVZhbHVlLCBtYXhMaW5lVmFsdWVdKVxyXG4gICAgICAucmFuZ2UoW2hlaWdodCwgbWluTGluZVZhbHVlXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckF4ZXMoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIHN2Z1lBeGlzTGVmdDogYW55LFxyXG4gICAgc3ZnWUF4aXNSaWdodDogYW55LFxyXG4gICAgc2NhbGVzOiBhbnksXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyWEF4aXMoc3ZnLCBzY2FsZXMueCwgaGVpZ2h0KTtcclxuICAgIHRoaXMucmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHNjYWxlcy55LCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIHRoaXMucmVuZGVyR3JpZExpbmVzKHN2Zywgc2NhbGVzLCB3aWR0aCwgaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWEF4aXMoc3ZnOiBhbnksIHg6IGFueSwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke2hlaWdodH0pYClcclxuICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpKVxyXG4gICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuXHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgIGNvbnN0IHlPZmZzZXQgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5rZXlMaXN0Lmxlbmd0aCA+IDEgJiYgXHJcbiAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5jaGFydERhdGEubWV0YURhdGEueExhYmVsID8gMzIgOiAwO1xyXG5cclxuICAgICAgc3ZnXHJcbiAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAgIC5hdHRyKCd5JywgeU9mZnNldCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlcllBeGlzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBzdmdZQXhpc0xlZnQ6IGFueSxcclxuICAgIHk6IGFueSxcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgc3ZnWUF4aXNMZWZ0XHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgICAuY2FsbChcclxuICAgICAgICBkM1xyXG4gICAgICAgICAgLmF4aXNMZWZ0KHkpXHJcbiAgICAgICAgICAudGlja1NpemUoMClcclxuICAgICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgIC50aWNrRm9ybWF0KHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzTGFiZWxGb21hdHRlcilcclxuICAgICAgKVxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4gICAgdGhpcy5hcHBseUF4aXNWaXNpYmlsaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckdyaWRMaW5lcyhzdmc6IGFueSwgc2NhbGVzOiBhbnksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYZ3JpZEJldHdlZW5MYWJlbHMpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7c2NhbGVzLnguYmFuZHdpZHRoKCkgLyAyfSwgJHtoZWlnaHR9KWApXHJcbiAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbShzY2FsZXMueCkudGlja1NpemUoLWhlaWdodCkudGlja0Zvcm1hdCgnJykpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yLCAjOTk5OTk5KScpXHJcbiAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgICAgLmNhbGwoXHJcbiAgICAgICAgICBkM1xyXG4gICAgICAgICAgICAuYXhpc0xlZnQoc2NhbGVzLnkpXHJcbiAgICAgICAgICAgIC50aWNrcyh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuICAgICAgICAgICAgLnRpY2tTaXplKC13aWR0aClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXHJcbiAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUF4aXNWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJ2cubGliLWxpbmUteC1heGlzLXRleHQgPiBnID4gdGV4dCcpLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbikge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCkge1xyXG4gICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAgIC5zdHlsZSgnY29sb3InLCAnIzk5OTk5OScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJCYXJzKHN2ZzogYW55LCBkYXRhOiBhbnlbXSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIHNjYWxlczogYW55LCBpc1JpYTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qgc3RhdGUgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5zZWxlY3RBbGwoJy5zdGF0ZScpXHJcbiAgICAgIC5kYXRhKGRhdGEpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IGB0cmFuc2xhdGUoJHtzY2FsZXMueChkLm5hbWUpfSwgMClgKTtcclxuXHJcbiAgICBzdGF0ZVxyXG4gICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgLmRhdGEoKGQpID0+IHRoaXMucHJlcGFyZUJhckRhdGEoZCwgbWV0YURhdGEua2V5TGlzdCkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnYmFycycpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZCkgPT4gdGhpcy5oYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSkpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQpID0+IHRoaXMuZ2V0QmFyWChkLCBzY2FsZXMsIGRhdGEpKVxyXG4gICAgICAuYXR0cigneScsIChkKSA9PiBzY2FsZXMueShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgKGQpID0+IHRoaXMuZ2V0QmFyV2lkdGgoZCwgc2NhbGVzLCBkYXRhKSlcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiB0aGlzLmdldEJhckhlaWdodChkLCBzY2FsZXMpKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsIG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNSaWEgPyAncG9pbnRlcicgOiAnZGVmYXVsdCcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuZ2V0QmFyQ29sb3IoZCwgbWV0YURhdGEpKTtcclxuXHJcbiAgICBpZiAoIWlzUmlhICYmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCB8fCAhdGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhcikpIHtcclxuICAgICAgc3RhdGUuc2VsZWN0QWxsKCdyZWN0JylcclxuICAgICAgICAub24oJ21vdXNlb3V0JywgKCkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcpKVxyXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKGQpID0+IHRoaXMuaGFuZGxlTW91c2VPdmVyKGQsIHN2Zywgc2NhbGVzLCBtZXRhRGF0YSwgZGF0YSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcmVwYXJlQmFyRGF0YShkOiBhbnksIGtleUxpc3Q6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGtleUxpc3QubWFwKChrZXkpID0+ICh7IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQmFyQ2xpY2soZDogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSk6IHZvaWQge1xyXG4gICAgaWYgKGQua2V5ID09PSAnVGFyZ2V0JykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNob3VsZEJsb2NrID0gbWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5sZW5ndGggJiZcclxuICAgICAgKG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSB8fCBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSk7XHJcblxyXG4gICAgaWYgKCFzaG91bGRCbG9jaykge1xyXG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCYXJYKGQ6IGFueSwgc2NhbGVzOiBhbnksIGRhdGE6IGFueVtdKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICByZXR1cm4gc2NhbGVzLnhTdWJncm91cChkLmtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRlbXBTY2FsZSA9IHNjYWxlcy54U3ViZ3JvdXA7XHJcbiAgICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGluZGl2Lm5hbWUgPT09IGQubmFtZSkge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKChfLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHNjYWxlcy54LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgdGVtcFNjYWxlID0gdGhpcy5hZGp1c3RTY2FsZUZvcldpZHRoKHRlbXBTY2FsZSwgc2NhbGVzLnguYmFuZHdpZHRoKCksIGRhdGEubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRlbXBTY2FsZShkLmtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhcldpZHRoKGQ6IGFueSwgc2NhbGVzOiBhbnksIGRhdGE6IGFueVtdKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICByZXR1cm4gc2NhbGVzLnhTdWJncm91cC5iYW5kd2lkdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdGVtcFNjYWxlID0gc2NhbGVzLnhTdWJncm91cDtcclxuICAgIGRhdGEuZm9yRWFjaCgoaW5kaXY6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IDApO1xyXG4gICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgc2NhbGVzLnguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICB0ZW1wU2NhbGUgPSB0aGlzLmFkanVzdFNjYWxlRm9yV2lkdGgodGVtcFNjYWxlLCBzY2FsZXMueC5iYW5kd2lkdGgoKSwgZGF0YS5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGVtcFNjYWxlLmJhbmR3aWR0aCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3RTY2FsZUZvcldpZHRoKHRlbXBTY2FsZTogYW55LCBiYW5kd2lkdGg6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKTogYW55IHtcclxuICAgIGlmIChiYW5kd2lkdGggPD0gMTAwKSByZXR1cm4gdGVtcFNjYWxlO1xyXG5cclxuICAgIGNvbnN0IGlzU2luZ2xlSXRlbSA9IGRhdGFMZW5ndGggPT09IDE7XHJcbiAgICBjb25zdCBtaW5XaWR0aCA9IGlzU2luZ2xlSXRlbVxyXG4gICAgICA/IHRoaXMuQ09OU1RBTlRTLk1JTl9CQVJfV0lEVEhfU0lOR0xFXHJcbiAgICAgIDogdGhpcy5DT05TVEFOVFMuTUlOX0JBUl9XSURUSF9NVUxUSVBMRTtcclxuXHJcbiAgICBjb25zdCBvZmZzZXQgPSAoYmFuZHdpZHRoIC0gbWluV2lkdGgpIC8gMjtcclxuICAgIHRlbXBTY2FsZS5yYW5nZShbb2Zmc2V0LCBiYW5kd2lkdGggLSBvZmZzZXRdKTtcclxuXHJcbiAgICByZXR1cm4gdGVtcFNjYWxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCYXJIZWlnaHQoZDogYW55LCBzY2FsZXM6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoZC52YWx1ZSA9PT0gLTEgfHwgIWQudmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHNjYWxlcy55LnJhbmdlKClbMF0gLSBzY2FsZXMueSgwKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzY2FsZXMueS5yYW5nZSgpWzBdIC0gc2NhbGVzLnkoZC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJhckNvbG9yKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGFyZ2V0TGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YTtcclxuY29uc3QgaXNBYm92ZVRhcmdldCA9IHRhcmdldExpbmVEYXRhICYmIGQudmFsdWUgPj0gdGFyZ2V0TGluZURhdGEudGFyZ2V0O1xyXG5cclxuICAgIGlmIChkLnZhbHVlICYmIGlzQWJvdmVUYXJnZXQgJiYgbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgICByZXR1cm4gbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldFtkLmtleV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU1vdXNlT3ZlcihkOiBhbnksIHN2ZzogYW55LCBzY2FsZXM6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsIGRhdGE6IGFueVtdKTogdm9pZCB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuXHJcbiAgICBjb25zdCBmb3JlaWduT2JqZWN0ID0gc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKVxyXG4gICAgICAuYXR0cigneCcsIHRoaXMuZ2V0VG9vbHRpcFgoZCwgc2NhbGVzLCBkYXRhLCBtZXRhRGF0YSkpXHJcbiAgICAgIC5hdHRyKCd5Jywgc2NhbGVzLnkoZC52YWx1ZSkgLSA0MylcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5nZXRUb29sdGlwV2lkdGgoZCwgc2NhbGVzLCBkYXRhLCBtZXRhRGF0YSkpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCA0MCk7XHJcblxyXG4gICAgZm9yZWlnbk9iamVjdFxyXG4gICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4gICAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgICAgLmh0bWwodGhpcy5nZXRUb29sdGlwSHRtbChkLCBtZXRhRGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUb29sdGlwWChkOiBhbnksIHNjYWxlczogYW55LCBkYXRhOiBhbnlbXSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiBudW1iZXIge1xyXG4gICAgbGV0IHRlbXBTY2FsZSA9IHRoaXMuZ2V0VGVtcFNjYWxlKGQsIHNjYWxlcywgZGF0YSk7XHJcbiAgICBjb25zdCBiYXNlWCA9IHNjYWxlcy54KGQubmFtZSkgKyB0ZW1wU2NhbGUoZC5rZXkpO1xyXG5cclxuICAgIGlmICghbWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICAgIHJldHVybiBiYXNlWCAtICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIpIC8gMiArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4gYmFzZVggKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyIC0gOTA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJhc2VYIC0gKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMikgLyAyICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VG9vbHRpcFdpZHRoKGQ6IGFueSwgc2NhbGVzOiBhbnksIGRhdGE6IGFueVtdLCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGVtcFNjYWxlID0gdGhpcy5nZXRUZW1wU2NhbGUoZCwgc2NhbGVzLCBkYXRhKTtcclxuXHJcbiAgICBpZiAoIW1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4gICAgICByZXR1cm4gKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIHRoaXMuQ09OU1RBTlRTLkxFRlRfUklHSFRfU1BBQ0VTICogMikgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIgPiAxODApIHtcclxuICAgICAgcmV0dXJuICcxODBweCc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyB0aGlzLkNPTlNUQU5UUy5MRUZUX1JJR0hUX1NQQUNFUyAqIDIpICsgJ3B4JztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VGVtcFNjYWxlKGQ6IGFueSwgc2NhbGVzOiBhbnksIGRhdGE6IGFueVtdKTogYW55IHtcclxuICAgIGxldCB0ZW1wU2NhbGUgPSBzY2FsZXMueFN1Ymdyb3VwO1xyXG4gICAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCBzY2FsZXMueC5iYW5kd2lkdGgoKV0pO1xyXG4gICAgICAgIHRlbXBTY2FsZSA9IHRoaXMuYWRqdXN0U2NhbGVGb3JXaWR0aCh0ZW1wU2NhbGUsIHNjYWxlcy54LmJhbmR3aWR0aCgpLCBkYXRhLmxlbmd0aCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRlbXBTY2FsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VG9vbHRpcEh0bWwoZDogYW55LCBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLW5hbWVcIj4ke2QubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItdmFsdWVcIj48c3Bhbj4ke2QudmFsdWV9PC9zcGFuPiR7ZGF0YVR5cGV9PC9zcGFuPmA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IGQubmFtZS5sZW5ndGggPD0gOCA/IGQubmFtZSA6IGQubmFtZS5zdWJzdHJpbmcoMCwgNSkgKyAnLi4uJztcclxuICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItbmFtZVwiPiR7dHJ1bmNhdGVkTmFtZX06JHtkLnZhbHVlfSR7ZGF0YVR5cGV9PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPiR7ZC5uYW1lfTwvc3Bhbj5gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZU91dChzdmc6IGFueSk6IHZvaWQge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxhYmVscyhcclxuICAgIHN2ZzogYW55LFxyXG4gICAgc3ZnWUF4aXNMZWZ0OiBhbnksXHJcbiAgICBzdmdZQXhpc1JpZ2h0OiBhbnksXHJcbiAgICBtZXRhRGF0YTogQ2hhcnRNZXRhRGF0YSxcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxuICAgIHNjYWxlczogYW55XHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyWUxhYmVsKHN2Z1lBeGlzTGVmdCwgbWV0YURhdGEueUxhYmVsLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJYTGFiZWwoc3ZnLCBtZXRhRGF0YS54TGFiZWwsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhRGF0YS5saW5leUxhYmVsKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyTGluZVlMYWJlbChzdmdZQXhpc1JpZ2h0LCBtZXRhRGF0YS5saW5leUxhYmVsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWUxhYmVsKHN2Z1lBeGlzTGVmdDogYW55LCB5TGFiZWw6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnRcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxyXG4gICAgICAuYXR0cigneScsIDAgLSBtYXJnaW4ubGVmdCAvIDIgLSAzMClcclxuICAgICAgLmF0dHIoJ3gnLCAwIC0gaGVpZ2h0IC8gMilcclxuICAgICAgLmF0dHIoJ2R5JywgJzFlbScpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dCh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA/IHlMYWJlbC50b0xvd2VyQ2FzZSgpIDogeUxhYmVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyWExhYmVsKHN2ZzogYW55LCB4TGFiZWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIGNvbnN0IGlzQWNyb255bSA9IHRoaXMuaXNBY3JvbnltKHhMYWJlbC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpKTtcclxuXHJcbiAgICBsZXQgbGFiZWxDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICBsYWJlbENsYXNzICs9ICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSkge1xyXG4gICAgICBsYWJlbENsYXNzICs9ICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGFiZWxDbGFzcyArPSAnIGxpYi1heGlzLXdhdGVyZmFsbC1sYWJlbCc7XHJcbiAgICB9XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCBsYWJlbENsYXNzKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3dpZHRoIC8gMn0sICR7aGVpZ2h0ICsgbWFyZ2luLnRvcCArIDIwfSlgKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGlzQWNyb255bSA/IHhMYWJlbC50b1VwcGVyQ2FzZSgpIDogeExhYmVsLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJMaW5lWUxhYmVsKHN2Z1lBeGlzUmlnaHQ6IGFueSwgbGluZXlMYWJlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzdmdZQXhpc1JpZ2h0XHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCkgcm90YXRlKDkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgLTEwMClcclxuICAgICAgLmF0dHIoJ3gnLCAxMDApXHJcbiAgICAgIC5hdHRyKCdkeScsICc1ZW0nKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4gICAgICAudGV4dChsaW5leUxhYmVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBY3JvbnltKGxhYmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIChsYWJlbC5sZW5ndGggPD0gNCAmJiAvXltBLVpdKyQvLnRlc3QobGFiZWwpKSB8fFxyXG4gICAgICAobGFiZWwgPT09IGxhYmVsLnRvVXBwZXJDYXNlKCkgJiYgL1tBLVpdLy50ZXN0KGxhYmVsKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRhcmdldExpbmUoc3ZnOiBhbnksIHN2Z1lBeGlzUmlnaHQ6IGFueSwgeVNjYWxlOiBhbnksIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0YXJnZXRMaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhO1xyXG4gICAgY29uc3QgeVplcm8gPSB5U2NhbGUodGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnbGluZScpXHJcbiAgICAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgICAuYXR0cigneTEnLCB5WmVybylcclxuICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZScsIHRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuXHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gICAgY29uc3QgdGFyZ2V0TmFtZSA9IHRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gICAgc3ZnWUF4aXNSaWdodFxyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHt5WmVybyAtIDMwfSlgKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB0aGlzLkNPTlNUQU5UUy5SSUdIVF9TVkdfV0lEVEgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5odG1sKGA8ZGl2PiR7dGFyZ2V0TmFtZX08L2Rpdj48ZGl2PiR7dGFyZ2V0TGluZURhdGEudGFyZ2V0fSR7ZGF0YVR5cGV9PC9kaXY+YCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlckxpbmVHcmFwaChcclxuICAgIHN2ZzogYW55LFxyXG4gICAgbGluZURhdGE6IGFueVtdIHwgdW5kZWZpbmVkLFxyXG4gICAgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEsXHJcbiAgICBzY2FsZXM6IGFueSxcclxuICAgIGlzUmlhOiBib29sZWFuXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIWxpbmVEYXRhKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbGluZVBhdGggPSBkM1xyXG4gICAgICAubGluZTxhbnk+KClcclxuICAgICAgLngoKGQpID0+IHNjYWxlcy54KGQubmFtZSkgKyBzY2FsZXMueC5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC55KChkKSA9PiBzY2FsZXMubGluZVlzY2FsZShkLnZhbHVlKSk7XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuZGF0dW0obGluZURhdGEpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgICAuYXR0cignc3Ryb2tlJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxLjUpXHJcbiAgICAgIC5hdHRyKCdkJywgbGluZVBhdGgpO1xyXG5cclxuICAgIGNvbnN0IGRvdCA9IHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgICAuZGF0YShsaW5lRGF0YSlcclxuICAgICAgLmVudGVyKClcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5vbignY2xpY2snLCAoZCkgPT4gdGhpcy5oYW5kbGVMaW5lUG9pbnRDbGljayhkLCBtZXRhRGF0YSkpO1xyXG5cclxuICAgIGRvdFxyXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4gICAgICAuYXR0cignZmlsbCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgICAuYXR0cignY3gnLCAoZCkgPT4gc2NhbGVzLngoZC5uYW1lKSArIHNjYWxlcy54LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ2N5JywgKGQpID0+IHNjYWxlcy5saW5lWXNjYWxlKGQudmFsdWUpKVxyXG4gICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJylcclxuICAgICAgLmF0dHIoJ3InLCAzKTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgICAgZG90XHJcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RvdCcpXHJcbiAgICAgICAgLmF0dHIoJ2NvbG9yJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogLjg1ZW0nKVxyXG4gICAgICAgIC5hdHRyKCd4JywgKGQpID0+IHNjYWxlcy54KGQubmFtZSkgKyBzY2FsZXMueC5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgICAgLmF0dHIoJ3knLCAoZCkgPT4gc2NhbGVzLmxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4gICAgICAgIC50ZXh0KChkKSA9PiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEZvcm1hdHRlcihkLnZhbHVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUxpbmVQb2ludENsaWNrKGQ6IGFueSwgbWV0YURhdGE6IENoYXJ0TWV0YURhdGEpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNob3VsZEJsb2NrID0gbWV0YURhdGEuYmFyV2l0aG91dENsaWNrPy5sZW5ndGggJiZcclxuICAgICAgKG1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSB8fCBtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSk7XHJcblxyXG4gICAgaWYgKCFzaG91bGRCbG9jaykge1xyXG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duIHx8IGQ/LnRvZ2dsZUZyb20pIHtcclxuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIZWFkZXJNZW51Q2xpY2soaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5oZWFkZXJNZW51Y2xpY2tFdmVudC5lbWl0KGlkKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUREMUNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUREMkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbihldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XHJcbiAgfVxyXG59IiwiPGRpdlxyXG4gICNncm91cGNvbnRhaW5lclxyXG4gIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIlxyXG4gIFtuZ0NsYXNzXT1cInsgJ2xpYi1uby1iYWNrZ3JvdW5kJzogaXNUcmFuc3BhcmVudEJhY2tncm91bmQgfVwiXHJcbiAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcclxuPlxyXG5cclxuPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICA8bGliLWNoYXJ0LWhlYWRlci12MlxyXG4gICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXHJcbiAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mj5cclxuICA8bGliLWNoYXJ0LWhlYWRlci12M1xyXG4gICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgKGNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbik9XCJoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAoem9vbUluWm9vbU91dENsaWNrKT1cImhhbmRsZVpvb21pblpvb21vdXRDbGljaygkZXZlbnQpXCJcclxuICA+PC9saWItY2hhcnQtaGVhZGVyLXYzPlxyXG48L2Rpdj5cclxuXHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjFcclxuICBbdGl0bGVdPVwiY2hhcnREYXRhLm1ldGFEYXRhLnRpdGxlXCJcclxuICBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gIFtpc0VkaXRFbmFibGVkXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5pc0VkaXRFbmFibGVkXCJcclxuICBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCJcclxuICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIlxyXG4gIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCJcclxuICAqbmdJZj1cImlzSGVhZGVyVmlzaWJsZVwiXHJcbj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcblxyXG4gIDxkaXZcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiXHJcbiAgICBpZD1cImdyb3VwY2hhcnRjb250YWluZXJcIlxyXG4gICAgI2dyb3VwY2hhcnRjb250YWluZXJcclxuICAgIGNsYXNzPVwibGliLWNoYXJ0LXN2Z1wiXHJcbiAgPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|