ca-components 1.1.95 → 1.1.97
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/assets/scss/input-dropdown.scss +85 -80
- package/esm2022/lib/components/ca-chart/ca-chart.component.mjs +141 -146
- package/esm2022/lib/components/ca-chart/models/chart-line-dataset.model.mjs +1 -1
- package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +10 -2
- package/esm2022/lib/components/ca-input-dropdown/ca-input-dropdown.component.mjs +6 -4
- package/esm2022/lib/components/ca-input-dropdown/components/ca-input-dropdown-load-broker/ca-input-dropdown-load-broker-item/ca-input-dropdown-load-broker-item.component.mjs +37 -0
- package/esm2022/lib/components/ca-input-dropdown/components/ca-input-dropdown-load-broker/ca-input-dropdown-load-broker.component.mjs +5 -8
- package/esm2022/lib/components/ca-progress-bar/ca-progress-bar.component.mjs +3 -3
- package/fesm2022/ca-components.mjs +187 -157
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/components/ca-chart/ca-chart.component.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-line-dataset.model.d.ts +3 -0
- package/lib/components/ca-chart/utils/helpers/chart.helper.d.ts +3 -0
- package/lib/components/ca-input-dropdown/components/ca-input-dropdown-load-broker/ca-input-dropdown-load-broker-item/ca-input-dropdown-load-broker-item.component.d.ts +10 -0
- package/package.json +1 -1
|
@@ -27,7 +27,10 @@ export class CaChartComponent {
|
|
|
27
27
|
set chartConfig(value) {
|
|
28
28
|
this._chartConfig = value;
|
|
29
29
|
this.isChartDataAvailable = false;
|
|
30
|
-
this.isChartDataAvailable =
|
|
30
|
+
this.isChartDataAvailable =
|
|
31
|
+
this._chartConfig?.chartData?.datasets?.some((item) => item.data.some((value) => Array.isArray(value)
|
|
32
|
+
? value[0] !== 0 || value[1] !== 0
|
|
33
|
+
: value !== 0)) ?? false;
|
|
31
34
|
this.changeDetector.detectChanges();
|
|
32
35
|
if (this.isChartDataAvailable)
|
|
33
36
|
this.updateChart();
|
|
@@ -48,6 +51,7 @@ export class CaChartComponent {
|
|
|
48
51
|
this.destroy$ = new Subject();
|
|
49
52
|
this.areAnimationsCompleated = false;
|
|
50
53
|
this._hoveredIndex = null;
|
|
54
|
+
this.lastHoveredIndex = -1;
|
|
51
55
|
this.isChartDataAvailable = false;
|
|
52
56
|
}
|
|
53
57
|
ngAfterViewInit() {
|
|
@@ -62,9 +66,8 @@ export class CaChartComponent {
|
|
|
62
66
|
initializeChartManagerService() {
|
|
63
67
|
if (!this.chartManagerService)
|
|
64
68
|
return;
|
|
65
|
-
this.chartManagerService.
|
|
66
|
-
|
|
67
|
-
pipe(takeUntil(this.destroy$))
|
|
69
|
+
this.chartManagerService.hoverState$
|
|
70
|
+
.pipe(takeUntil(this.destroy$))
|
|
68
71
|
.subscribe(({ index, chartId }) => {
|
|
69
72
|
if (chartId !== this.chartId) {
|
|
70
73
|
this._hoveredIndex = index;
|
|
@@ -81,61 +84,51 @@ export class CaChartComponent {
|
|
|
81
84
|
return;
|
|
82
85
|
if (chartDatasetHover.isHoverd) {
|
|
83
86
|
const gradient = ChartHelper.createGradient(this.chartContext, this.chartCanvas, chartDatasetHover.color, chartDatasetHover.color, 0.6, 0.1, true);
|
|
84
|
-
this.chart.data.datasets =
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
borderColor: borderColorWithOpacity,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
});
|
|
87
|
+
this.chart.data.datasets = this.chart?.data?.datasets?.map((dataset) => {
|
|
88
|
+
if (dataset.hidden)
|
|
89
|
+
return dataset;
|
|
90
|
+
if (dataset?.label?.toUpperCase() ===
|
|
91
|
+
chartDatasetHover?.label?.toUpperCase()) {
|
|
92
|
+
const hoverdDataSet = {
|
|
93
|
+
...dataset,
|
|
94
|
+
fill: true,
|
|
95
|
+
backgroundColor: gradient,
|
|
96
|
+
borderColor: chartDatasetHover.color,
|
|
97
|
+
order: 1,
|
|
98
|
+
};
|
|
99
|
+
return hoverdDataSet;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const borderColorWithOpacity = ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 0.2);
|
|
103
|
+
return {
|
|
104
|
+
...dataset,
|
|
105
|
+
fill: false,
|
|
106
|
+
borderColor: borderColorWithOpacity,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
});
|
|
111
110
|
}
|
|
112
111
|
else {
|
|
113
|
-
this.chart.data.datasets =
|
|
114
|
-
|
|
115
|
-
.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
else
|
|
130
|
-
return dataset;
|
|
131
|
-
});
|
|
112
|
+
this.chart.data.datasets = this.chart.data.datasets.map((dataset) => {
|
|
113
|
+
if (!dataset.hidden) {
|
|
114
|
+
const originalColor = dataset.borderColor
|
|
115
|
+
? ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 1)
|
|
116
|
+
: ChartConstants.STRING_EMPTY;
|
|
117
|
+
return {
|
|
118
|
+
...dataset,
|
|
119
|
+
fill: false,
|
|
120
|
+
borderColor: originalColor,
|
|
121
|
+
backgroundColor: ChartConstants.STRING_EMPTY,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
return dataset;
|
|
126
|
+
});
|
|
132
127
|
}
|
|
133
128
|
this.chart.update();
|
|
134
129
|
}
|
|
135
130
|
createChart() {
|
|
136
|
-
this.chartContext = this.chartCanvas?.
|
|
137
|
-
nativeElement?.
|
|
138
|
-
getContext('2d');
|
|
131
|
+
this.chartContext = this.chartCanvas?.nativeElement?.getContext('2d');
|
|
139
132
|
this.setChartOptionsProperties();
|
|
140
133
|
this.setChartDataProperties();
|
|
141
134
|
this.setChartPluginsProperties();
|
|
@@ -152,10 +145,7 @@ export class CaChartComponent {
|
|
|
152
145
|
});
|
|
153
146
|
if (!this._chartConfig.isDashboardChart)
|
|
154
147
|
this.chart.config.data.datasets = [
|
|
155
|
-
...this._chartConfig?.
|
|
156
|
-
chartData?.
|
|
157
|
-
datasets?.
|
|
158
|
-
map((item, indx) => {
|
|
148
|
+
...this._chartConfig?.chartData?.datasets?.map((item, indx) => {
|
|
159
149
|
const pointConfig = {
|
|
160
150
|
pointBackgroundColor: "#FFFFFF" /* ChartColorsStringEnum.WHITE */,
|
|
161
151
|
pointBorderWidth: 2,
|
|
@@ -163,28 +153,30 @@ export class CaChartComponent {
|
|
|
163
153
|
};
|
|
164
154
|
this.updateChartAnnotations(item, indx);
|
|
165
155
|
const yScale = this.chart.scales[EChartEventProperties.Y_AXIS_0];
|
|
166
|
-
const backgroundColor =
|
|
167
|
-
item?.color2)
|
|
168
|
-
|
|
156
|
+
const backgroundColor = item?.color && item?.color2
|
|
157
|
+
? ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2)
|
|
158
|
+
: item?.color;
|
|
169
159
|
const datasetConfig = {
|
|
170
160
|
...item,
|
|
171
161
|
pointBorderColor: item.color,
|
|
172
162
|
...pointConfig,
|
|
173
163
|
backgroundColor,
|
|
174
|
-
fill: item?.fill
|
|
164
|
+
fill: item?.fill,
|
|
175
165
|
};
|
|
176
|
-
if (this._chartConfig.chartType ===
|
|
166
|
+
if (this._chartConfig.chartType ===
|
|
167
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
177
168
|
return {
|
|
178
169
|
...datasetConfig,
|
|
179
|
-
backgroundColor: item.backgroundColor
|
|
170
|
+
backgroundColor: item.backgroundColor,
|
|
180
171
|
};
|
|
181
172
|
if (!item.shiftValue)
|
|
182
173
|
return {
|
|
183
174
|
...datasetConfig,
|
|
184
175
|
backgroundColor: item?.color &&
|
|
185
176
|
item?.color2 &&
|
|
186
|
-
item?.color !== item?.color2
|
|
187
|
-
ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2)
|
|
177
|
+
item?.color !== item?.color2
|
|
178
|
+
? ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2)
|
|
179
|
+
: item?.color,
|
|
188
180
|
};
|
|
189
181
|
const shiftValuePx = yScale.getPixelForValue(item.shiftValue || 0);
|
|
190
182
|
const shiftValueAdjusted = shiftValuePx / yScale.maxHeight;
|
|
@@ -197,9 +189,9 @@ export class CaChartComponent {
|
|
|
197
189
|
pointBorderColor: borderColor,
|
|
198
190
|
backgroundColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, color1, color2, shiftValueAdjusted, true),
|
|
199
191
|
borderColor,
|
|
200
|
-
fill: true
|
|
192
|
+
fill: true,
|
|
201
193
|
};
|
|
202
|
-
})
|
|
194
|
+
}),
|
|
203
195
|
];
|
|
204
196
|
this.chart.update();
|
|
205
197
|
}
|
|
@@ -210,6 +202,7 @@ export class CaChartComponent {
|
|
|
210
202
|
}
|
|
211
203
|
setChartOptionsProperties() {
|
|
212
204
|
const labels = this._chartConfig.chartData.labels;
|
|
205
|
+
console.log(this._chartConfig.chartData, 'NEW DATA FOR TESTING');
|
|
213
206
|
this._chartConfig.chartOptions = {
|
|
214
207
|
responsive: true,
|
|
215
208
|
maintainAspectRatio: false,
|
|
@@ -227,18 +220,20 @@ export class CaChartComponent {
|
|
|
227
220
|
layout: {
|
|
228
221
|
padding: {
|
|
229
222
|
top: this._chartConfig.chartType ===
|
|
230
|
-
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */
|
|
231
|
-
8
|
|
232
|
-
0,
|
|
223
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */
|
|
224
|
+
? 8
|
|
225
|
+
: 0,
|
|
233
226
|
bottom: this._chartConfig.chartType ===
|
|
234
|
-
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */
|
|
235
|
-
8
|
|
236
|
-
0,
|
|
237
|
-
left: this._chartConfig.chartType ===
|
|
227
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */
|
|
228
|
+
? 8
|
|
229
|
+
: 0,
|
|
230
|
+
left: this._chartConfig.chartType ===
|
|
231
|
+
"bar" /* ChartTypesStringEnum.BAR */ &&
|
|
238
232
|
this._chartConfig.verticalyAlignBarChartWithLineCart
|
|
239
233
|
? 6
|
|
240
234
|
: 0,
|
|
241
|
-
right: this._chartConfig.chartType ===
|
|
235
|
+
right: this._chartConfig.chartType ===
|
|
236
|
+
"bar" /* ChartTypesStringEnum.BAR */ &&
|
|
242
237
|
this._chartConfig.verticalyAlignBarChartWithLineCart
|
|
243
238
|
? 6
|
|
244
239
|
: 0,
|
|
@@ -277,7 +272,9 @@ export class CaChartComponent {
|
|
|
277
272
|
//Label written in 2 lines, will be adjusted with new design
|
|
278
273
|
callback: function (value, index) {
|
|
279
274
|
const label = labels[index];
|
|
280
|
-
const multiLineLabel = label
|
|
275
|
+
const multiLineLabel = label
|
|
276
|
+
? label.split(' ')
|
|
277
|
+
: [];
|
|
281
278
|
return multiLineLabel;
|
|
282
279
|
},
|
|
283
280
|
},
|
|
@@ -289,7 +286,8 @@ export class CaChartComponent {
|
|
|
289
286
|
display: false,
|
|
290
287
|
beginAtZero: true,
|
|
291
288
|
min: 0,
|
|
292
|
-
max:
|
|
289
|
+
max: ChartHelper.calculateDatasetMaxValue(this._chartConfig.chartData.datasets //leave this as any
|
|
290
|
+
),
|
|
293
291
|
offset: false,
|
|
294
292
|
},
|
|
295
293
|
},
|
|
@@ -299,13 +297,13 @@ export class CaChartComponent {
|
|
|
299
297
|
this.setVerticalDashedAnnotationLine(event);
|
|
300
298
|
}
|
|
301
299
|
this.setOriginalDoughnutArcsColor();
|
|
302
|
-
if (this._chartConfig.chartType ===
|
|
300
|
+
if (this._chartConfig.chartType ===
|
|
301
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */) {
|
|
303
302
|
this.hoveredIndex.emit(item[0]?.index || null);
|
|
304
|
-
item[0]?.index >= 0
|
|
305
|
-
this.focusDoughnutArc(item[0]?.index)
|
|
306
|
-
this.setOriginalDoughnutArcsColor();
|
|
303
|
+
item[0]?.index >= 0
|
|
304
|
+
? this.focusDoughnutArc(item[0]?.index)
|
|
305
|
+
: this.setOriginalDoughnutArcsColor();
|
|
307
306
|
}
|
|
308
|
-
;
|
|
309
307
|
this.chart.update();
|
|
310
308
|
},
|
|
311
309
|
};
|
|
@@ -314,9 +312,8 @@ export class CaChartComponent {
|
|
|
314
312
|
if (this._chartConfig.chartType !== "doughnut" /* ChartTypesStringEnum.DOUGHNUT */ ||
|
|
315
313
|
index === this.chart.data.datasets[0].data.length - 1)
|
|
316
314
|
return;
|
|
317
|
-
const colors = this.chart?.
|
|
318
|
-
|
|
319
|
-
datasets[0]?.backgroundColor;
|
|
315
|
+
const colors = this.chart?.data?.datasets[0]
|
|
316
|
+
?.backgroundColor;
|
|
320
317
|
const updatedColors = colors.map((color, indx) => {
|
|
321
318
|
if (indx === index)
|
|
322
319
|
return color;
|
|
@@ -328,15 +325,17 @@ export class CaChartComponent {
|
|
|
328
325
|
setOriginalDoughnutArcsColor() {
|
|
329
326
|
if (this._chartConfig.chartType !== "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
330
327
|
return;
|
|
331
|
-
const colors = this.chart.data.datasets[0]
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
328
|
+
const colors = this.chart.data.datasets[0]
|
|
329
|
+
.backgroundColor;
|
|
330
|
+
this.chart.data.datasets[0].backgroundColor = [
|
|
331
|
+
...colors.map((color) => {
|
|
332
|
+
return ChartHelper.rgbToRgba(color, 1);
|
|
333
|
+
}),
|
|
334
|
+
];
|
|
336
335
|
this.chart.update();
|
|
337
336
|
}
|
|
338
337
|
setChartDataProperties() {
|
|
339
|
-
if (
|
|
338
|
+
if (this._chartConfig.chartType === "line" /* ChartTypesStringEnum.LINE */) {
|
|
340
339
|
this._chartConfig.chartData.datasets.forEach((dataset) => {
|
|
341
340
|
dataset.order = dataset.order;
|
|
342
341
|
if (ChartTypeGuard.isLineDataset(dataset)) {
|
|
@@ -345,13 +344,22 @@ export class CaChartComponent {
|
|
|
345
344
|
dataset.cubicInterpolationMode ??
|
|
346
345
|
CubicInterpolationStringEnum.MONOTONE;
|
|
347
346
|
dataset.pointBorderColor =
|
|
348
|
-
dataset.pointBorderColor ??
|
|
347
|
+
dataset.pointBorderColor ??
|
|
348
|
+
"transparent" /* ChartColorsStringEnum.TRANSPARENT */;
|
|
349
349
|
dataset.pointBackgroundColor =
|
|
350
|
-
dataset.pointBackgroundColor ??
|
|
351
|
-
|
|
350
|
+
dataset.pointBackgroundColor ??
|
|
351
|
+
"transparent" /* ChartColorsStringEnum.TRANSPARENT */;
|
|
352
|
+
dataset.pointHoverBackgroundColor =
|
|
353
|
+
"#FFFFFF" /* ChartColorsStringEnum.WHITE */;
|
|
354
|
+
dataset.pointHoverBorderColor = dataset.borderColor;
|
|
355
|
+
dataset.pointBorderWidth = dataset.pointBorderWidth ?? 3;
|
|
356
|
+
dataset.pointHoverRadius = 4;
|
|
357
|
+
//dataset.pointHoverRadius = 8;
|
|
358
|
+
dataset.pointHoverBorderWidth = 3;
|
|
352
359
|
dataset.spanGaps = dataset.spanGaps ?? false;
|
|
353
360
|
dataset.showLine = dataset.showLine ?? true;
|
|
354
361
|
}
|
|
362
|
+
console.log(dataset, 'DATASETTT');
|
|
355
363
|
});
|
|
356
364
|
this.setMultipleYAxis(this._chartConfig.chartData);
|
|
357
365
|
}
|
|
@@ -391,16 +399,20 @@ export class CaChartComponent {
|
|
|
391
399
|
const xScale = this.chart.scales[EChartEventProperties.X];
|
|
392
400
|
const tickPositions = xScale.ticks.map((tick) => xScale.getPixelForValue(tick.value));
|
|
393
401
|
const segmentBoundaries = tickPositions.map((tickPos, index) => {
|
|
394
|
-
const leftBoundary = index === 0
|
|
402
|
+
const leftBoundary = index === 0
|
|
403
|
+
? left
|
|
404
|
+
: (tickPos + tickPositions[index - 1]) / 2;
|
|
395
405
|
const rightBoundary = index === tickPositions.length - 1
|
|
396
406
|
? right
|
|
397
407
|
: (tickPos + tickPositions[index + 1]) / 2;
|
|
398
408
|
return { leftBoundary, rightBoundary };
|
|
399
409
|
});
|
|
400
|
-
const newHoveredIndex = segmentBoundaries.findIndex((boundary) => mouseHorizontalCoordinate >=
|
|
410
|
+
const newHoveredIndex = segmentBoundaries.findIndex((boundary) => mouseHorizontalCoordinate >=
|
|
411
|
+
boundary.leftBoundary &&
|
|
401
412
|
mouseHorizontalCoordinate < boundary.rightBoundary);
|
|
402
413
|
if (newHoveredIndex !== this._hoveredIndex) {
|
|
403
|
-
this._hoveredIndex =
|
|
414
|
+
this._hoveredIndex =
|
|
415
|
+
newHoveredIndex === -1 ? null : newHoveredIndex;
|
|
404
416
|
this.chartManagerService?.setHoverState(this._hoveredIndex, this.chartId, segmentBoundaries[this._hoveredIndex]);
|
|
405
417
|
this.chart.draw();
|
|
406
418
|
}
|
|
@@ -409,17 +421,13 @@ export class CaChartComponent {
|
|
|
409
421
|
if (this._hoveredIndex !== null) {
|
|
410
422
|
const { chartArea, scales: { x: xScale }, } = this.chart;
|
|
411
423
|
ChartHelper.highlightSegment(this.chartContext, xScale, chartArea, this._chartConfig.height, this._hoveredIndex);
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
this._chartConfig.showHighlightPointOnHover &&
|
|
420
|
-
this.areAnimationsCompleated) {
|
|
421
|
-
const visibleDatasets = this._chartConfig.chartData.datasets.filter((dataset) => !dataset.hidden);
|
|
422
|
-
ChartHelper.highlightPoint(this.chartContext, this.chart, this._hoveredIndex, { ...this._chartConfig.chartData, datasets: visibleDatasets });
|
|
424
|
+
const activeData = this._chartConfig?.chartData?.datasets?.map((data, index) => {
|
|
425
|
+
return {
|
|
426
|
+
datasetIndex: index,
|
|
427
|
+
index: this._hoveredIndex,
|
|
428
|
+
};
|
|
429
|
+
});
|
|
430
|
+
this.chart.setActiveElements(activeData);
|
|
423
431
|
}
|
|
424
432
|
},
|
|
425
433
|
},
|
|
@@ -433,7 +441,8 @@ export class CaChartComponent {
|
|
|
433
441
|
const lastIndex = dataset.data.length - 1;
|
|
434
442
|
const firstValue = dataset.data[firstIndex];
|
|
435
443
|
const lastValue = dataset.data[lastIndex];
|
|
436
|
-
if (firstValue !== undefined &&
|
|
444
|
+
if (firstValue !== undefined &&
|
|
445
|
+
lastValue !== undefined) {
|
|
437
446
|
const xStart = xScale.getPixelForValue(firstIndex);
|
|
438
447
|
const xEnd = xScale.getPixelForValue(lastIndex);
|
|
439
448
|
const yBottom = chartArea.bottom;
|
|
@@ -460,37 +469,32 @@ export class CaChartComponent {
|
|
|
460
469
|
this._chartConfig.centerLabels?.map((label, indx) => {
|
|
461
470
|
ChartHelper.drawDoughnutLegend(chart, {
|
|
462
471
|
indx,
|
|
463
|
-
offsetTop: label.position?.top || 0
|
|
472
|
+
offsetTop: label.position?.top || 0,
|
|
464
473
|
}, label.value, label.fontSize, label.color);
|
|
465
474
|
});
|
|
466
475
|
},
|
|
467
|
-
}
|
|
476
|
+
},
|
|
468
477
|
];
|
|
469
478
|
}
|
|
470
479
|
updateChartAnnotations(item, indx) {
|
|
471
480
|
if (!this._chartConfig.annotations?.length)
|
|
472
481
|
return;
|
|
473
|
-
this._chartConfig.
|
|
474
|
-
annotations?.
|
|
475
|
-
forEach((annotation, key) => {
|
|
482
|
+
this._chartConfig.annotations?.forEach((annotation, key) => {
|
|
476
483
|
this._chartConfig.chartOptions.plugins = {
|
|
477
484
|
...this._chartConfig.chartOptions.plugins,
|
|
478
485
|
annotation: {
|
|
479
486
|
...this._chartConfig.chartOptions?.plugins?.annotation,
|
|
480
487
|
annotations: {
|
|
481
|
-
...this._chartConfig.
|
|
482
|
-
|
|
483
|
-
plugins?.
|
|
484
|
-
annotation?.
|
|
485
|
-
annotations,
|
|
488
|
+
...this._chartConfig.chartOptions?.plugins
|
|
489
|
+
?.annotation?.annotations,
|
|
486
490
|
[`${item.label}-${indx}-${key}`]: {
|
|
487
|
-
id: annotation.id ||
|
|
491
|
+
id: annotation.id ||
|
|
492
|
+
`annotation-${indx}-${key}`,
|
|
488
493
|
type: annotation.type,
|
|
489
494
|
scaleID: annotation.axis || item.yAxisID,
|
|
490
495
|
value: annotation.value || item.shiftValue,
|
|
491
496
|
borderColor: annotation.color ||
|
|
492
|
-
"#DADADA" /* ChartColorsStringEnum.
|
|
493
|
-
BORDER_BOTTOM_LINE_CHART_COLOR */,
|
|
497
|
+
"#DADADA" /* ChartColorsStringEnum.BORDER_BOTTOM_LINE_CHART_COLOR */,
|
|
494
498
|
borderWidth: annotation.borderWidth || 2,
|
|
495
499
|
borderDash: annotation.borderDash || [0, 0],
|
|
496
500
|
},
|
|
@@ -501,6 +505,7 @@ export class CaChartComponent {
|
|
|
501
505
|
this.chart.update();
|
|
502
506
|
}
|
|
503
507
|
setMultipleYAxis(chartData) {
|
|
508
|
+
console.log(chartData, 'THIS IS MULTIPLE AXIS');
|
|
504
509
|
chartData.datasets.forEach((dataset, index) => {
|
|
505
510
|
if (dataset.type === "line" /* ChartTypesStringEnum.LINE */ ||
|
|
506
511
|
dataset.type === "bar" /* ChartTypesStringEnum.BAR */) {
|
|
@@ -518,9 +523,12 @@ export class CaChartComponent {
|
|
|
518
523
|
maxValue = 1;
|
|
519
524
|
}
|
|
520
525
|
else {
|
|
521
|
-
minValue =
|
|
526
|
+
minValue =
|
|
527
|
+
maxValue === minValue ? minValue - 0.1 : minValue;
|
|
522
528
|
maxValue =
|
|
523
|
-
maxValue === minValue
|
|
529
|
+
maxValue === minValue
|
|
530
|
+
? maxValue + 0.1
|
|
531
|
+
: maxValue + padding;
|
|
524
532
|
}
|
|
525
533
|
this._chartConfig.chartOptions.scales = {
|
|
526
534
|
...this._chartConfig.chartOptions.scales,
|
|
@@ -540,27 +548,18 @@ export class CaChartComponent {
|
|
|
540
548
|
});
|
|
541
549
|
}
|
|
542
550
|
removeVerticalDashedLine() {
|
|
543
|
-
const annotations = this._chartConfig?.
|
|
544
|
-
chartOptions?.
|
|
545
|
-
plugins?.
|
|
546
|
-
annotation?.
|
|
547
|
-
annotations;
|
|
551
|
+
const annotations = this._chartConfig?.chartOptions?.plugins?.annotation?.annotations;
|
|
548
552
|
const key = ChartPluginIdsStringEnum.X_DASHED;
|
|
549
553
|
if (annotations) {
|
|
550
|
-
delete this._chartConfig?.
|
|
551
|
-
|
|
552
|
-
plugins?.
|
|
553
|
-
annotation?.
|
|
554
|
-
annotations?.[key];
|
|
554
|
+
delete this._chartConfig?.chartOptions?.plugins?.annotation
|
|
555
|
+
?.annotations?.[key];
|
|
555
556
|
}
|
|
556
557
|
this.chart.update();
|
|
557
558
|
}
|
|
558
559
|
setVerticalDashedAnnotationLine(event, color) {
|
|
559
560
|
const { left, right } = this.chart.chartArea;
|
|
560
561
|
const xScale = this.chart.scales[EChartEventProperties.X];
|
|
561
|
-
const tickPositions = this._chartConfig?.
|
|
562
|
-
chartData?.labels?.
|
|
563
|
-
map((label, index) => {
|
|
562
|
+
const tickPositions = this._chartConfig?.chartData?.labels?.map((label, index) => {
|
|
564
563
|
return xScale.getPixelForValue(index);
|
|
565
564
|
});
|
|
566
565
|
const segmentBoundaries = tickPositions.map((tickPos, index) => {
|
|
@@ -581,22 +580,18 @@ export class CaChartComponent {
|
|
|
581
580
|
annotation: {
|
|
582
581
|
...this._chartConfig.chartOptions?.plugins?.annotation,
|
|
583
582
|
annotations: {
|
|
584
|
-
...this._chartConfig.
|
|
585
|
-
|
|
586
|
-
plugins?.
|
|
587
|
-
annotation?.
|
|
588
|
-
annotations,
|
|
583
|
+
...this._chartConfig.chartOptions?.plugins?.annotation
|
|
584
|
+
?.annotations,
|
|
589
585
|
[ChartPluginIdsStringEnum.X_DASHED]: {
|
|
590
586
|
...EChartAnnotation.X_DASHED,
|
|
591
587
|
value: newHoveredIndex,
|
|
592
|
-
borderColor: color ||
|
|
593
|
-
|
|
588
|
+
borderColor: color ||
|
|
589
|
+
"#DADADA" /* ChartColorsStringEnum.BORDER_BOTTOM_LINE_CHART_COLOR */,
|
|
594
590
|
},
|
|
595
591
|
},
|
|
596
592
|
},
|
|
597
593
|
};
|
|
598
594
|
}
|
|
599
|
-
;
|
|
600
595
|
this.hoveredIndex.emit(newHoveredIndex);
|
|
601
596
|
this.chart.update();
|
|
602
597
|
}
|
|
@@ -638,4 +633,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
638
633
|
}], hoveredIndex: [{
|
|
639
634
|
type: Output
|
|
640
635
|
}] } });
|
|
641
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxTQUFTO0FBQ1QsT0FBTyxFQUVMLEtBQUssR0FJTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBR3pELFFBQVE7QUFDUixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUU3QixnQkFBZ0IsR0FDakIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBa0JoRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR25ELFFBQVE7QUFDUixPQUFPLEVB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Z0I7d0JBQ2hCLHFCQUFxQjtxQkFDdEI7OzBCQWlERSxRQUFRO3lDQTlDa0MsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVsQyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSztnQkFjTyxhQUFhO3NCQUF6QixLQUFLO2dCQVNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFueU9iamVjdCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvdHlwZXMvYmFzaWMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG4vLyBDaGFydHNcbmltcG9ydCB7XG4gIENhdGVnb3J5U2NhbGUsXG4gIENoYXJ0LFxuICBDaGFydEV2ZW50LFxuICBMaW5lYXJTY2FsZSxcbiAgUGx1Z2luLFxufSBmcm9tICdjaGFydC5qcy9hdXRvJztcbmltcG9ydCBhbm5vdGF0aW9uUGx1Z2luIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWFubm90YXRpb24nO1xuaW1wb3J0IHsgQ2hhcnRUeXBlIH0gZnJvbSAnY2hhcnQuanMnO1xuXG4vLyBFbnVtc1xuaW1wb3J0IHtcbiAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLFxuICBFQ2hhcnRFdmVudFByb3BlcnRpZXMsXG4gIENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bSxcbiAgQ2hhcnRUeXBlc1N0cmluZ0VudW0sXG4gIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0sXG4gIENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0sXG4gIENoYXJ0Rm9udFByb3BlcnRpZXNTdHJpbmdFbnVtLFxuICBFQ2hhcnRBbm5vdGF0aW9uVHlwZSxcbiAgRUNoYXJ0QW5ub3RhdGlvbixcbn0gZnJvbSAnLi9lbnVtcyc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IENoYXJ0SGVscGVyIH0gZnJvbSAnLi91dGlscy9oZWxwZXJzJztcblxuLy8gR3VhcmRzXG5pbXBvcnQgeyBDaGFydFR5cGVHdWFyZCB9IGZyb20gJy4vdXRpbHMvZ3VhcmRzJztcblxuLy9Nb2RlbHNcbmltcG9ydCB7XG4gIElDaGFydERhdGEsXG4gIElMaW5lRGF0YXNldCxcbiAgSUNoYXJ0Q29uZmlndXJhdGlvbixcbiAgSUJhc2VEYXRhc2V0LFxuICBJQ2hhcnRBbm5vdGF0aW9uLFxuICBJQ2hhcnREYXRhc2V0SG92ZXIsXG4gIElDaGFydENlbnRlckxhYmVsLFxuICBJQ2hhcnRMZWdlbmRDb25maWdcbn0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvcGx1Z2lucy9wbHVnaW4udG9vbHRpcCc7XG5cbi8vU2VydmljZXNcbmltcG9ydCB7IENoYXJ0TWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi9jYS1jaGFydC1tYW5hZ2VyL3NlcnZpY2VzJztcblxuLy8gQ29uc3RhbnRzXG5pbXBvcnQgeyBDaGFydENvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvY29uc3RhbnRzJztcbmltcG9ydCB7IF9EZWVwUGFydGlhbEFycmF5LCBfRGVlcFBhcnRpYWxPYmplY3QgfSBmcm9tICdjaGFydC5qcy9kaXN0L3R5cGVzL3V0aWxzJztcblxuLy8gUGlwZXNcbmltcG9ydCB7XG4gIFRob3VzYW5kU2VwYXJhdG9yUGlwZSxcbiAgVW5pdFBvc2l0aW9uUGlwZVxufSBmcm9tICcuLi8uLi9waXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jYS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQW5ndWxhclN2Z0ljb25Nb2R1bGUsXG4gICAgVW5pdFBvc2l0aW9uUGlwZSxcbiAgICBUaG91c2FuZFNlcGFyYXRvclBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENhQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZCgnY2hhcnRDYW52YXMnLCB7IHN0YXRpYzogZmFsc2UgfSkgY2hhcnRDYW52YXMhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGxlZ2VuZERhdGEhOiBJQ2hhcnRMZWdlbmRDb25maWc7XG4gIEBJbnB1dCgpIGNoYXJ0SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHNldCBjaGFydERhdGFzZXRIb3Zlcih2YWx1ZTogSUNoYXJ0RGF0YXNldEhvdmVyIHwgbnVsbCkge1xuICAgIGlmICh2YWx1ZSkgdGhpcy51cGRhdGVEYXRhc2V0QmFja2dyb3VuZE9uSG92ZXIodmFsdWUpO1xuICB9XG4gIEBJbnB1dCgpIHNldCBjaGFydENvbmZpZyh2YWx1ZTogSUNoYXJ0Q29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2NoYXJ0Q29uZmlnID0gdmFsdWU7XG4gICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIFxuICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0aGlzLl9jaGFydENvbmZpZz8uY2hhcnREYXRhPy5kYXRhc2V0cz8uc29tZSgoaXRlbTogSUJhc2VEYXRhc2V0KSA9PlxuICAgICAgaXRlbS5kYXRhLnNvbWUoKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSkgPT5cbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWVbMF0gIT09IDAgfHwgdmFsdWVbMV0gIT09IDApIDogdmFsdWUgIT09IDBcbiAgICAgIClcbiAgICApID8/IGZhbHNlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUpXG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG4gIH1cbiAgQElucHV0KCkgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jaGFydCB8fCAhdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSkgcmV0dXJuO1xuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB0aGlzLmZvY3VzRG91Z2hudXRBcmModmFsdWUpO1xuICAgIGVsc2UgdGhpcy5zZXRPcmlnaW5hbERvdWdobnV0QXJjc0NvbG9yKCk7XG5cbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGhvdmVyZWRJbmRleDogRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgY2hhcnQhOiBDaGFydDtcbiAgcHJpdmF0ZSBjaGFydENvbnRleHQhOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgcGx1Z2lucz86IFBsdWdpbjxDaGFydFR5cGUsIEFueU9iamVjdD5bXTtcbiAgcHJpdmF0ZSBhcmVBbmltYXRpb25zQ29tcGxlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9ob3ZlcmVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBfY2hhcnRDb25maWchOiBJQ2hhcnRDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgaXNDaGFydERhdGFBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNoYXJ0TWFuYWdlclNlcnZpY2U/OiBDaGFydE1hbmFnZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlLlxuICAgICAgaG92ZXJTdGF0ZSQuXG4gICAgICBwaXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICh7IGluZGV4LCBjaGFydElkIH0pID0+IHtcbiAgICAgICAgICBpZiAoY2hhcnRJZCAhPT0gdGhpcy5jaGFydElkKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJ0KSB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk6IHZvaWQge1xuICAgIENoYXJ0LnJlZ2lzdGVyKGFubm90YXRpb25QbHVnaW4pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3ZlcihcbiAgICBjaGFydERhdGFzZXRIb3ZlcjogSUNoYXJ0RGF0YXNldEhvdmVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydCB8fCAhdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzKSByZXR1cm47XG5cbiAgICBpZiAoY2hhcnREYXRhc2V0SG92ZXIuaXNIb3ZlcmQpIHtcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQ2hhcnRIZWxwZXIuY3JlYXRlR3JhZGllbnQoXG4gICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICBjaGFydERhdGFzZXRIb3Zlci5jb2xvcixcbiAgICAgICAgY2hhcnREYXRhc2V0SG92ZXIuY29sb3IsXG4gICAgICAgIDAuNixcbiAgICAgICAgMC4xLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID1cbiAgICAgICAgdGhpcy5jaGFydD8uXG4gICAgICAgICAgZGF0YT8uXG4gICAgICAgICAgZGF0YXNldHM/LlxuICAgICAgICAgIG1hcCgoZGF0YXNldCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFzZXQuaGlkZGVuKSByZXR1cm4gZGF0YXNldDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBkYXRhc2V0Py5sYWJlbD8udG9VcHBlckNhc2UoKSA9PT1cbiAgICAgICAgICAgICAgY2hhcnREYXRhc2V0SG92ZXI/LmxhYmVsPy50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgaG92ZXJkRGF0YVNldCA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgICAgIGZpbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBncmFkaWVudCxcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogY2hhcnREYXRhc2V0SG92ZXIuY29sb3IsXG4gICAgICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiBob3ZlcmREYXRhU2V0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSA9IENoYXJ0SGVscGVyLmNoYW5nZU9wYWNpdHlPZlJnYk9yUmdiYShcbiAgICAgICAgICAgICAgICBkYXRhc2V0LmJvcmRlckNvbG9yIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAwLjJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcldpdGhPcGFjaXR5LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMgPVxuICAgICAgICB0aGlzLmNoYXJ0XG4gICAgICAgICAgLmRhdGFcbiAgICAgICAgICAuZGF0YXNldHNcbiAgICAgICAgICAubWFwKChkYXRhc2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFzZXQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sb3IgPSBkYXRhc2V0LmJvcmRlckNvbG9yXG4gICAgICAgICAgICAgICAgPyBDaGFydEhlbHBlci5jaGFuZ2VPcGFjaXR5T2ZSZ2JPclJnYmEoXG4gICAgICAgICAgICAgICAgICBkYXRhc2V0LmJvcmRlckNvbG9yIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcmlnaW5hbENvbG9yLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogQ2hhcnRDb25zdGFudHMuU1RSSU5HX0VNUFRZLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHJldHVybiBkYXRhc2V0O1xuICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRDb250ZXh0ID0gdGhpcy5jaGFydENhbnZhcz8uXG4gICAgICBuYXRpdmVFbGVtZW50Py5cbiAgICAgIGdldENvbnRleHQoJzJkJyk7XG5cbiAgICB0aGlzLnNldENoYXJ0T3B0aW9uc1Byb3BlcnRpZXMoKTtcbiAgICB0aGlzLnNldENoYXJ0RGF0YVByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnNldENoYXJ0UGx1Z2luc1Byb3BlcnRpZXMoKTtcblxuICAgIGlmICh0aGlzLmNoYXJ0KSB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25QbHVnaW4oKTtcbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVClcbiAgICAgIENoYXJ0Lm92ZXJyaWRlcy5kb3VnaG51dC5jdXRvdXQgPSAnODglJztcblxuICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQodGhpcy5jaGFydENvbnRleHQsIHtcbiAgICAgIHR5cGU6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSxcbiAgICAgIGRhdGE6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucyxcbiAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucyxcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuaXNEYXNoYm9hcmRDaGFydClcbiAgICAgIHRoaXMuY2hhcnQuY29uZmlnLmRhdGEuZGF0YXNldHMgPSBbXG4gICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnPy5cbiAgICAgICAgICBjaGFydERhdGE/LlxuICAgICAgICAgIGRhdGFzZXRzPy5cbiAgICAgICAgICBtYXAoKGl0ZW06IElCYXNlRGF0YXNldCwgaW5keDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwb2ludENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5XSElURSxcbiAgICAgICAgICAgICAgcG9pbnRCb3JkZXJXaWR0aDogMixcbiAgICAgICAgICAgICAgcG9pbnRSYWRpdXM6IDMsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0QW5ub3RhdGlvbnMoaXRlbSwgaW5keCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHlTY2FsZSA9IHRoaXMuY2hhcnQuc2NhbGVzW0VDaGFydEV2ZW50UHJvcGVydGllcy5ZX0FYSVNfMF0gYXNcbiAgICAgICAgICAgICAgfCBDYXRlZ29yeVNjYWxlXG4gICAgICAgICAgICAgIHwgTGluZWFyU2NhbGU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICAgIChpdGVtPy5jb2xvciAmJlxuICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yMikgP1xuICAgICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IsXG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIsXG4gICAgICAgICAgICAgICAgKSA6IGl0ZW0/LmNvbG9yO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgICAgICAuLi5wb2ludENvbmZpZyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICBmaWxsOiBpdGVtPy5maWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUKVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXRDb25maWcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtLmJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXRlbS5zaGlmdFZhbHVlKVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXRDb25maWcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICYmXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yICE9PSBpdGVtPy5jb2xvcjIgP1xuICAgICAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yMiAsXG4gICAgICAgICAgICAgICAgICAgICkgOiBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlUHg6IG51bWJlciA9IHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGl0ZW0uc2hpZnRWYWx1ZSB8fCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0VmFsdWVBZGp1c3RlZDogbnVtYmVyID1cbiAgICAgICAgICAgICAgc2hpZnRWYWx1ZVB4IC8geVNjYWxlLm1heEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgY29sb3IxOiBzdHJpbmcgPSBpdGVtLmNvbG9yIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWTtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yMjogc3RyaW5nID0gaXRlbS5jb2xvcjIgfHwgQ2hhcnRDb25zdGFudHMuU1RSSU5HX0VNUFRZO1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcjogQ2FudmFzR3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudFdpdGhTaGlmdFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgY29sb3IxLFxuICAgICAgICAgICAgICBjb2xvcjIsXG4gICAgICAgICAgICAgIHNoaWZ0VmFsdWVBZGp1c3RlZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgIC4uLnBvaW50Q29uZmlnLFxuICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudFdpdGhTaGlmdFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgIHlTY2FsZS5tYXhIZWlnaHQsXG4gICAgICAgICAgICAgICAgY29sb3IxLFxuICAgICAgICAgICAgICAgIGNvbG9yMixcbiAgICAgICAgICAgICAgICBzaGlmdFZhbHVlQWRqdXN0ZWQsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgZmlsbDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICBdO1xuXG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnQpXG4gICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhcnRPcHRpb25zUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEubGFiZWxzO1xuXG4gICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zID0ge1xuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgICAgY2xpcDogZmFsc2UsXG4gICAgICBhbmltYXRpb246IHtcbiAgICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYXJlQW5pbWF0aW9uc0NvbXBsZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxheW91dDoge1xuICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgdG9wOiB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09XG4gICAgICAgICAgICBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCA/XG4gICAgICAgICAgICA4IDpcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgYm90dG9tOiB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09XG4gICAgICAgICAgICBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCA/XG4gICAgICAgICAgICA4IDpcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgbGVmdDpcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uQkFSICYmXG4gICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLnZlcnRpY2FseUFsaWduQmFyQ2hhcnRXaXRoTGluZUNhcnRcbiAgICAgICAgICAgICAgPyA2XG4gICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICByaWdodDpcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uQkFSICYmXG4gICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLnZlcnRpY2FseUFsaWduQmFyQ2hhcnRXaXRoTGluZUNhcnRcbiAgICAgICAgICAgICAgPyA2XG4gICAgICAgICAgICAgIDogMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgIGxlZ2VuZDoge1xuICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2NhbGVzOiB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpY2tzOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgIGNvbG9yOiBDaGFydENvbG9yc1N0cmluZ0VudW0uWF9BWElTX0xBQkVMX0NPTE9SLFxuICAgICAgICAgICAgZm9udDoge1xuICAgICAgICAgICAgICBzaXplOiAxMSxcbiAgICAgICAgICAgICAgZmFtaWx5OiBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bS5GT05UX0ZBTUlMWV9NT05UU0VSUkFULFxuICAgICAgICAgICAgICB3ZWlnaHQ6IENoYXJ0Rm9udFByb3BlcnRpZXNTdHJpbmdFbnVtLkZPTlRfV0VJR0hUX0JPTERFUixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvU2tpcDogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9Ta2lwUGFkZGluZzogMTIsXG4gICAgICAgICAgICBtYXhSb3RhdGlvbjogMCxcbiAgICAgICAgICAgIG1pblJvdGF0aW9uOiAwLFxuICAgICAgICAgICAgLy9MYWJlbCB3cml0dGVuIGluIDIgbGluZXMsIHdpbGwgYmUgYWRqdXN0ZWQgd2l0aCBuZXcgZGVzaWduXG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKFxuICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgICAgICBpbmRleDogbnVtYmVyXG4gICAgICAgICAgICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2luZGV4XTtcbiAgICAgICAgICAgICAgY29uc3QgbXVsdGlMaW5lTGFiZWwgPSBsYWJlbCA/IGxhYmVsLnNwbGl0KCcgJykgOiBbXTtcbiAgICAgICAgICAgICAgcmV0dXJuIG11bHRpTGluZUxhYmVsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3BsYXk6IHRoaXMuX2NoYXJ0Q29uZmlnLnNob3dYQXhpc0xhYmVscyxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25Ib3ZlcjogKGV2ZW50OiBDaGFydEV2ZW50LCBpdGVtOiBBY3RpdmVFbGVtZW50W10pID0+IHtcblxuICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuaGFzVmVydGljYWxEYXNoZWRBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVWZXJ0aWNhbERhc2hlZExpbmUoKTtcbiAgICAgICAgICB0aGlzLnNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRPcmlnaW5hbERvdWdobnV0QXJjc0NvbG9yKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpIHtcbiAgICAgICAgICB0aGlzLmhvdmVyZWRJbmRleC5lbWl0KGl0ZW1bMF0/LmluZGV4IHx8IG51bGwpO1xuXG4gICAgICAgICAgaXRlbVswXT8uaW5kZXggPj0gMCA/XG4gICAgICAgICAgICB0aGlzLmZvY3VzRG91Z2hudXRBcmMoaXRlbVswXT8uaW5kZXgpIDpcbiAgICAgICAgICAgIHRoaXMuc2V0T3JpZ2luYWxEb3VnaG51dEFyY3NDb2xvcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0RvdWdobnV0QXJjKGluZGV4OiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSAhPT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQgfHxcbiAgICAgIGluZGV4ID09PSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uZGF0YS5sZW5ndGggLSAxKSByZXR1cm47XG4gICAgY29uc3QgY29sb3JzOiBzdHJpbmdbXSA9IHRoaXMuY2hhcnQ/LlxuICAgICAgZGF0YT8uXG4gICAgICBkYXRhc2V0c1swXT8uYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHVwZGF0ZWRDb2xvcnM6IHN0cmluZ1tdID0gY29sb3JzLm1hcChcbiAgICAgIChjb2xvcjogc3RyaW5nLCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKGluZHggPT09IGluZGV4KSByZXR1cm4gY29sb3I7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gQ2hhcnRIZWxwZXIuY29udmVydFJnYlRvUmdiYShjb2xvciwgMC4yKTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yID0gdXBkYXRlZENvbG9ycztcbiAgfVxuXG4gIHByaXZhdGUgc2V0T3JpZ2luYWxEb3VnaG51dEFyY3NDb2xvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlICE9PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sb3JzOiBzdHJpbmdbXSA9XG4gICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciA9XG4gICAgICBbLi4uY29sb3JzLm1hcCgoY29sb3I6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhcnRIZWxwZXIucmdiVG9SZ2JhKGNvbG9yLCAxKTtcbiAgICAgIH0pXTtcblxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG5cbiAgfVxuICBwcml2YXRlIHNldENoYXJ0RGF0YVByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkxJTkUpKSB7XG4gICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCkgPT4ge1xuICAgICAgICBkYXRhc2V0Lm9yZGVyID0gZGF0YXNldC5vcmRlcjtcbiAgICAgICAgaWYgKENoYXJ0VHlwZUd1YXJkLmlzTGluZURhdGFzZXQoZGF0YXNldCkpIHtcbiAgICAgICAgICBkYXRhc2V0LnRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb24gPz8gMC41O1xuICAgICAgICAgIGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9XG4gICAgICAgICAgICBkYXRhc2V0LmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPz9cbiAgICAgICAgICAgIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0uTU9OT1RPTkU7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID1cbiAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvciA/PyBDaGFydENvbG9yc1N0cmluZ0VudW0uVFJBTlNQQVJFTlQ7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICBkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yID8/IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5UUkFOU1BBUkVOVDtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPSBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPz8gMjtcbiAgICAgICAgICBkYXRhc2V0LnNwYW5HYXBzID0gZGF0YXNldC5zcGFuR2FwcyA/PyBmYWxzZTtcbiAgICAgICAgICBkYXRhc2V0LnNob3dMaW5lID0gZGF0YXNldC5zaG93TGluZSA/PyB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0TXVsdGlwbGVZQXhpcyh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhcnRQbHVnaW5zUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLnBsdWdpbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiBDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uSElHSExJR0hUX1NFR01FTlRfT05fSE9WRVIsXG4gICAgICAgIGFmdGVyRXZlbnQ6IChjaGFydCwgZXZlbnQpID0+IHtcblxuICAgICAgICAgIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQuZXZlbnQubmF0aXZlIGFzIE1vdXNlRXZlbnQ7XG5cbiAgICAgICAgICBpZiAoZXZlbnQuZXZlbnQudHlwZSA9PT0gQ2hhcnRFdmVudFR5cGVzU3RyaW5nRW51bS5NT1VTRV9PVVQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IHRoaXMuY2hhcnQuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNNb3VzZU91dHNpZGVDaGFydCA9XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFggPCBib3VuZGluZ1JlY3QubGVmdCB8fFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRYID4gYm91bmRpbmdSZWN0LnJpZ2h0IHx8XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFkgPCBib3VuZGluZ1JlY3QudG9wIHx8XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFkgPiBib3VuZGluZ1JlY3QuYm90dG9tO1xuXG4gICAgICAgICAgICBpZiAoaXNNb3VzZU91dHNpZGVDaGFydCkge1xuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2U/LnNldEhvdmVyU3RhdGUobnVsbCwgdGhpcy5jaGFydElkKTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVWZXJ0aWNhbERhc2hlZExpbmVBbmRGb2N1cygpO1xuICAgICAgICAgICAgICB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXRoaXMuX2NoYXJ0Q29uZmlnLnNob3dUb29sdGlwQmFja2dyb3VuZCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgYm91bmRpbmdSZWN0ID0gdGhpcy5jaGFydC5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgY29uc3QgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA9XG4gICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICAgICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLmNoYXJ0LmNoYXJ0QXJlYTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPCBsZWZ0IHx8XG4gICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID4gcmlnaHRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2U/LnNldEhvdmVyU3RhdGUobnVsbCwgdGhpcy5jaGFydElkKTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHhTY2FsZSA9IHRoaXMuY2hhcnQuc2NhbGVzW0VDaGFydEV2ZW50UHJvcGVydGllcy5YXSBhc1xuICAgICAgICAgICAgfCBDYXRlZ29yeVNjYWxlXG4gICAgICAgICAgICB8IExpbmVhclNjYWxlO1xuXG4gICAgICAgICAgY29uc3QgdGlja1Bvc2l0aW9ucyA9IHhTY2FsZS50aWNrcy5tYXAoKHRpY2spID0+XG4gICAgICAgICAgICB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh0aWNrLnZhbHVlKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBzZWdtZW50Qm91bmRhcmllcyA9IHRpY2tQb3NpdGlvbnMubWFwKCh0aWNrUG9zLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGVmdEJvdW5kYXJ5ID1cbiAgICAgICAgICAgICAgaW5kZXggPT09IDAgPyBsZWZ0IDogKHRpY2tQb3MgKyB0aWNrUG9zaXRpb25zW2luZGV4IC0gMV0pIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm91bmRhcnkgPVxuICAgICAgICAgICAgICBpbmRleCA9PT0gdGlja1Bvc2l0aW9ucy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgPyByaWdodFxuICAgICAgICAgICAgICAgIDogKHRpY2tQb3MgKyB0aWNrUG9zaXRpb25zW2luZGV4ICsgMV0pIC8gMjtcblxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdEJvdW5kYXJ5LCByaWdodEJvdW5kYXJ5IH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBuZXdIb3ZlcmVkSW5kZXggPSBzZWdtZW50Qm91bmRhcmllcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoYm91bmRhcnkpID0+IFxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID49IGJvdW5kYXJ5LmxlZnRCb3VuZGFyeSAmJlxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgYm91bmRhcnkucmlnaHRCb3VuZGFyeVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobmV3SG92ZXJlZEluZGV4ICE9PSB0aGlzLl9ob3ZlcmVkSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IG5ld0hvdmVyZWRJbmRleCA9PT0gLTEgPyBudWxsIDogbmV3SG92ZXJlZEluZGV4O1xuICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRJZCxcbiAgICAgICAgICAgICAgc2VnbWVudEJvdW5kYXJpZXNbdGhpcy5faG92ZXJlZEluZGV4IGFzIG51bWJlcl1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmVmb3JlRHJhdzogKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9ob3ZlcmVkSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICBzY2FsZXM6IHsgeDogeFNjYWxlIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5jaGFydDtcblxuICAgICAgICAgICAgQ2hhcnRIZWxwZXIuaGlnaGxpZ2h0U2VnbWVudChcbiAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgIHhTY2FsZSBhcyBDYXRlZ29yeVNjYWxlIHwgTGluZWFyU2NhbGUsXG4gICAgICAgICAgICAgIGNoYXJ0QXJlYSxcbiAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuaGVpZ2h0LFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfUE9JTlRfT05fSE9WRVIsXG4gICAgICAgIGFmdGVyRHJhdzogKCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuc2hvd0hpZ2hsaWdodFBvaW50T25Ib3ZlciAmJlxuICAgICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZURhdGFzZXRzID0gdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGRhdGFzZXQpID0+ICFkYXRhc2V0LmhpZGRlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIENoYXJ0SGVscGVyLmhpZ2hsaWdodFBvaW50KFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgdGhpcy5jaGFydCxcbiAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4LFxuICAgICAgICAgICAgICB7IC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSwgZGF0YXNldHM6IHZpc2libGVEYXRhc2V0cyB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uQk9SREVSX0JPVFRPTV9MSU5FX0NIQVJULFxuICAgICAgICBiZWZvcmVEcmF3OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnPy5zaG93Qm90dG9tTGluZU9uTGluZUNoYXJ0KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICBzY2FsZXM6IHsgeDogeFNjYWxlIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5jaGFydDtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzZXQgPSBkYXRhLmRhdGFzZXRzWzBdO1xuXG4gICAgICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGRhdGFzZXQuZGF0YS5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gZGF0YXNldC5kYXRhW2ZpcnN0SW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgbGFzdFZhbHVlID0gZGF0YXNldC5kYXRhW2xhc3RJbmRleF07XG5cbiAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbGFzdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeFN0YXJ0ID0geFNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZmlyc3RJbmRleCk7XG5cbiAgICAgICAgICAgICAgY29uc3QgeEVuZCA9IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgIGNvbnN0IHlCb3R0b20gPSBjaGFydEFyZWEuYm90dG9tO1xuXG4gICAgICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9XG4gICAgICAgICAgICAgICAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLkJPUkRFUl9CT1RUT01fTElORV9DSEFSVF9DT0xPUjtcbiAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4U3RhcnQsIHlCb3R0b20pO1xuICAgICAgICAgICAgICBjdHgubGluZVRvKHhFbmQsIHlCb3R0b20pO1xuICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpXG4gICAgICB0aGlzLnBsdWdpbnMgPSBbXG4gICAgICAgIC4uLnRoaXMucGx1Z2lucyxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnZG91Z2hudXQtbGFiZWwnLFxuICAgICAgICAgIGJlZm9yZURhdGFzZXREcmF3OiAoY2hhcnQ6IENoYXJ0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jZW50ZXJMYWJlbHM/Lm1hcChcbiAgICAgICAgICAgICAgKGxhYmVsOiBJQ2hhcnRDZW50ZXJMYWJlbCwgaW5keDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuZHJhd0RvdWdobnV0TGVnZW5kKFxuICAgICAgICAgICAgICAgICAgY2hhcnQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGluZHgsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFRvcDogbGFiZWwucG9zaXRpb24/LnRvcCB8fCAwXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbGFiZWwudmFsdWUsXG4gICAgICAgICAgICAgICAgICBsYWJlbC5mb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLmNvbG9yKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDaGFydEFubm90YXRpb25zKGl0ZW06IElCYXNlRGF0YXNldCwgaW5keDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5hbm5vdGF0aW9ucz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5cbiAgICAgIGFubm90YXRpb25zPy5cbiAgICAgIGZvckVhY2goKGFubm90YXRpb246IElDaGFydEFubm90YXRpb24sIGtleTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zID0ge1xuICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgICAgIGFubm90YXRpb246IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucz8ucGx1Z2lucz8uYW5ub3RhdGlvbixcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLlxuICAgICAgICAgICAgICAgIGNoYXJ0T3B0aW9ucz8uXG4gICAgICAgICAgICAgICAgcGx1Z2lucz8uXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbj8uXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgICAgICAgIFtgJHtpdGVtLmxhYmVsfS0ke2luZHh9LSR7a2V5fWBdOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGFubm90YXRpb24uaWQgfHwgYGFubm90YXRpb24tJHtpbmR4fS0ke2tleX1gLFxuICAgICAgICAgICAgICAgIHR5cGU6IGFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICBzY2FsZUlEOiBhbm5vdGF0aW9uLmF4aXMgfHwgaXRlbS55QXhpc0lELFxuICAgICAgICAgICAgICAgIHZhbHVlOiBhbm5vdGF0aW9uLnZhbHVlIHx8IGl0ZW0uc2hpZnRWYWx1ZSxcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogYW5ub3RhdGlvbi5jb2xvciB8fFxuICAgICAgICAgICAgICAgICAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlxuICAgICAgICAgICAgICAgICAgICBCT1JERVJfQk9UVE9NX0xJTkVfQ0hBUlRfQ09MT1IsXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGFubm90YXRpb24uYm9yZGVyV2lkdGggfHwgMixcbiAgICAgICAgICAgICAgICBib3JkZXJEYXNoOiBhbm5vdGF0aW9uLmJvcmRlckRhc2ggfHwgWzAsIDBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRNdWx0aXBsZVlBeGlzKGNoYXJ0RGF0YTogSUNoYXJ0RGF0YTxJTGluZURhdGFzZXQ+KTogdm9pZCB7XG4gICAgY2hhcnREYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGRhdGFzZXQudHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uTElORSB8fFxuICAgICAgICBkYXRhc2V0LnR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHlBeGlzSUQgPSB0aGlzLl9jaGFydENvbmZpZy5pc011bHRpWUF4aXNcbiAgICAgICAgICA/IGB5LWF4aXMtJHtpbmRleH1gXG4gICAgICAgICAgOiBkYXRhc2V0LnlBeGlzSUQgfHwgJ3ktYXhpcy0wJztcblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIGRhdGFzZXQgaXMgYWxsIDBcbiAgICAgICAgY29uc3QgaXNBbGxaZXJvRGF0YXNldCA9IChkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pLmV2ZXJ5KFxuICAgICAgICAgICh2YWw6IG51bWJlcikgPT4gdmFsID09PSAwXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IG1pblZhbHVlID0gQ2hhcnRIZWxwZXIuY2FsY3VsYXRlTWluVmFsdWUoZGF0YXNldC5kYXRhIGFzIG51bWJlcltdKTtcbiAgICAgICAgbGV0IG1heFZhbHVlID0gQ2hhcnRIZWxwZXIuY2FsY3VsYXRlTWF4VmFsdWUoZGF0YXNldC5kYXRhIGFzIG51bWJlcltdKTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IG1heFZhbHVlICogMC4wMztcblxuICAgICAgICAvLyBBZGp1c3Qgc2NhbGluZyBmb3IgYWxsIDAgZGF0YXNldHNcbiAgICAgICAgaWYgKGlzQWxsWmVyb0RhdGFzZXQpIHtcbiAgICAgICAgICBtaW5WYWx1ZSA9IDA7XG4gICAgICAgICAgbWF4VmFsdWUgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1pblZhbHVlID0gbWF4VmFsdWUgPT09IG1pblZhbHVlID8gbWluVmFsdWUgLSAwLjEgOiBtaW5WYWx1ZTtcbiAgICAgICAgICBtYXhWYWx1ZSA9XG4gICAgICAgICAgICBtYXhWYWx1ZSA9PT0gbWluVmFsdWUgPyBtYXhWYWx1ZSArIDAuMSA6IG1heFZhbHVlICsgcGFkZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5zY2FsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnNjYWxlcyxcbiAgICAgICAgICBbeUF4aXNJRF06IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXG4gICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgbWF4OiBtYXhWYWx1ZSxcbiAgICAgICAgICAgIHN0YWNrZWQ6IHRoaXMuX2NoYXJ0Q29uZmlnLmlzU3RhY2tlZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNoYXJ0RGF0YS5kYXRhc2V0c1tpbmRleF0gPSB7XG4gICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICB5QXhpc0lELFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVWZXJ0aWNhbERhc2hlZExpbmUoKTogdm9pZCB7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPVxuICAgICAgdGhpcy5fY2hhcnRDb25maWc/LlxuICAgICAgICBjaGFydE9wdGlvbnM/LlxuICAgICAgICBwbHVnaW5zPy5cbiAgICAgICAgYW5ub3RhdGlvbj8uXG4gICAgICAgIGFubm90YXRpb25zO1xuXG4gICAgY29uc3Qga2V5OiBzdHJpbmcgPSBDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uWF9EQVNIRUQ7XG5cbiAgICBpZiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jaGFydENvbmZpZz8uXG4gICAgICAgIGNoYXJ0T3B0aW9ucz8uXG4gICAgICAgIHBsdWdpbnM/LlxuICAgICAgICBhbm5vdGF0aW9uPy5cbiAgICAgICAgYW5ub3RhdGlvbnM/LlxuICAgICAgW2tleSBhcyBrZXlvZiB0eXBlb2YgYW5ub3RhdGlvbnNdO1xuICAgIH1cblxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoZXZlbnQ6IENoYXJ0RXZlbnQsIGNvbG9yPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5jaGFydC5jaGFydEFyZWE7XG5cbiAgICBjb25zdCB4U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWF0gYXNcbiAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgfCBMaW5lYXJTY2FsZTtcblxuICAgIGNvbnN0IHRpY2tQb3NpdGlvbnMgPVxuICAgICAgdGhpcy5fY2hhcnRDb25maWc/LlxuICAgICAgICBjaGFydERhdGE/LmxhYmVscz8uXG4gICAgICAgIG1hcChcbiAgICAgICAgICAoXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICAgICAgaW5kZXg6IG51bWJlclxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGluZGV4KVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICBjb25zdCBzZWdtZW50Qm91bmRhcmllcyA9IHRpY2tQb3NpdGlvbnMubWFwKCh0aWNrUG9zLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbGVmdEJvdW5kYXJ5ID1cbiAgICAgICAgaW5kZXggPT09IDAgPyBsZWZ0IDogKHRpY2tQb3MgKyB0aWNrUG9zaXRpb25zW2luZGV4IC0gMV0pIC8gMjtcbiAgICAgIGNvbnN0IHJpZ2h0Qm91bmRhcnkgPVxuICAgICAgICBpbmRleCA9PT0gdGlja1Bvc2l0aW9ucy5sZW5ndGggLSAxXG4gICAgICAgICAgPyByaWdodFxuICAgICAgICAgIDogKHRpY2tQb3MgKyB0aWNrUG9zaXRpb25zW2luZGV4ICsgMV0pIC8gMjtcblxuICAgICAgcmV0dXJuIHsgbGVmdEJvdW5kYXJ5LCByaWdodEJvdW5kYXJ5IH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZSBhcyBNb3VzZUV2ZW50O1xuXG4gICAgY29uc3QgYm91bmRpbmdSZWN0ID0gdGhpcy5jaGFydC5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA9XG4gICAgICBuYXRpdmVFdmVudC5jbGllbnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICBjb25zdCBuZXdIb3ZlcmVkSW5kZXggPSBzZWdtZW50Qm91bmRhcmllcy5maW5kSW5kZXgoXG4gICAgICAoYm91bmRhcnkpID0+XG4gICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPj0gYm91bmRhcnkubGVmdEJvdW5kYXJ5ICYmXG4gICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPCBib3VuZGFyeS5yaWdodEJvdW5kYXJ5XG4gICAgKTtcblxuICAgIGlmIChuZXdIb3ZlcmVkSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMgPSB7XG4gICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgICBhbm5vdGF0aW9uOiB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5cbiAgICAgICAgICAgICAgY2hhcnRPcHRpb25zPy5cbiAgICAgICAgICAgICAgcGx1Z2lucz8uXG4gICAgICAgICAgICAgIGFubm90YXRpb24/LlxuICAgICAgICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIFtDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uWF9EQVNIRURdOiB7XG4gICAgICAgICAgICAgIC4uLkVDaGFydEFubm90YXRpb24uWF9EQVNIRUQsXG4gICAgICAgICAgICAgIHZhbHVlOiBuZXdIb3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBjb2xvciB8fCBDaGFydENvbG9yc1N0cmluZ0VudW0uXG4gICAgICAgICAgICAgICAgQk9SREVSX0JPVFRPTV9MSU5FX0NIQVJUX0NPTE9SLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdGhpcy5ob3ZlcmVkSW5kZXguZW1pdChuZXdIb3ZlcmVkSW5kZXgpO1xuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlVmVydGljYWxEYXNoZWRMaW5lQW5kRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlcmVkSW5kZXguZW1pdChudWxsKTtcbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuaGFzVmVydGljYWxEYXNoZWRBbm5vdGF0aW9uKVxuICAgICAgdGhpcy5yZW1vdmVWZXJ0aWNhbERhc2hlZExpbmUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiQGlmIChpc0NoYXJ0RGF0YUF2YWlsYWJsZSkge1xuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGxlZ2VuZDtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGxlZ2VuZERhdGEsXG4gICAgICAgICAgICB9XG4gICAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxkaXZcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgaGVpZ2h0OiBfY2hhcnRDb25maWcuaGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgICAgIHdpZHRoOiBfY2hhcnRDb25maWcud2lkdGggKyAnJScsXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAgPGNhbnZhcyAjY2hhcnRDYW52YXM+PC9jYW52YXM+XG4gICAgPC9kaXY+XG59IEBlbHNlIHtcbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgaGVpZ2h0OiBfY2hhcnRDb25maWcuaGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgICAgIHdpZHRoOiBfY2hhcnRDb25maWcud2lkdGggKyAnJScsXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAgPHN2Zy1pY29uXG4gICAgICAgICAgICBbc3JjXT1cIl9jaGFydENvbmZpZy5ub0RhdGFJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJObyBkYXRhIGF2YWlsYWJsZVwiXG4gICAgICAgICAgICBjbGFzcz1cIm5vLWRhdGEtc3ZnXCJcbiAgICAgICAgPjwvc3ZnLWljb24+XG4gICAgPC9kaXY+XG59XG48bmctdGVtcGxhdGUgI2xlZ2VuZCBsZXQtY29uZmlnPVwiY29uZmlnXCI+XG4gICAgQGlmIChjb25maWc/LmRhdGEpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLmhhc0hpZ2hsaWdodGVkQmFja2dyb3VuZCAmJiAnY29sb3JlZC1iYWNrZ3JvdW5kJ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoY29uZmlnLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10aXRsZSBmb250LXNpemUtMTQgdGEtZm9udC1leHRyYS1ib2xkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGNvbmZpZy50aXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC13cmFwcGVyIGQtZmxleFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBpdGVtIG9mIGNvbmZpZy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAkaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrIGl0ZW0ubmFtZVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBhbGlnbi1jb250ZW50LWNlbnRlciB0ZXh0LXNpemUtMTEgdGEtZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtPy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uaXNMaW5lSW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGluZS1pbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2lyY2xlLWluZGljYXRvcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBpdGVtPy5jb2xvciB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zaXplLTE4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0/LnZhbHVlICE9PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChpdGVtPy52YWx1ZSB8IHRob3VzYW5kU2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfCB1bml0UG9zaXRpb246IGl0ZW0/LnVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
636
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxTQUFTO0FBQ1QsT0FBTyxFQUVILEtBQUssR0FJUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBR3pELFFBQVE7QUFDUixPQUFPLEVBRUgscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUU3QixnQkFBZ0IsR0FDbkIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBa0JoRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTW5ELFFBQVE7QUFDUixPQUFPLEVB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QUNJLGNBQWMsY0FHWixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixvQkFBb0I7d0JBQ3BCLGdCQUFnQjt3QkFDaEIscUJBQXFCO3FCQUN4Qjs7MEJBb0RJLFFBQVE7eUNBakRnQyxXQUFXO3NCQUF2RCxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWxDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQWdCTyxhQUFhO3NCQUF6QixLQUFLO2dCQVNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFdmVudEVtaXR0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFueU9iamVjdCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvdHlwZXMvYmFzaWMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG4vLyBDaGFydHNcbmltcG9ydCB7XG4gICAgQ2F0ZWdvcnlTY2FsZSxcbiAgICBDaGFydCxcbiAgICBDaGFydEV2ZW50LFxuICAgIExpbmVhclNjYWxlLFxuICAgIFBsdWdpbixcbn0gZnJvbSAnY2hhcnQuanMvYXV0byc7XG5pbXBvcnQgYW5ub3RhdGlvblBsdWdpbiBmcm9tICdjaGFydGpzLXBsdWdpbi1hbm5vdGF0aW9uJztcbmltcG9ydCB7IEFjdGl2ZURhdGFQb2ludCwgQ2hhcnRUeXBlIH0gZnJvbSAnY2hhcnQuanMnO1xuXG4vLyBFbnVtc1xuaW1wb3J0IHtcbiAgICBDaGFydENvbG9yc1N0cmluZ0VudW0sXG4gICAgRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLFxuICAgIENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bSxcbiAgICBDaGFydFR5cGVzU3RyaW5nRW51bSxcbiAgICBDdWJpY0ludGVycG9sYXRpb25TdHJpbmdFbnVtLFxuICAgIENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0sXG4gICAgQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0sXG4gICAgRUNoYXJ0QW5ub3RhdGlvblR5cGUsXG4gICAgRUNoYXJ0QW5ub3RhdGlvbixcbn0gZnJvbSAnLi9lbnVtcyc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IENoYXJ0SGVscGVyIH0gZnJvbSAnLi91dGlscy9oZWxwZXJzJztcblxuLy8gR3VhcmRzXG5pbXBvcnQgeyBDaGFydFR5cGVHdWFyZCB9IGZyb20gJy4vdXRpbHMvZ3VhcmRzJztcblxuLy9Nb2RlbHNcbmltcG9ydCB7XG4gICAgSUNoYXJ0RGF0YSxcbiAgICBJTGluZURhdGFzZXQsXG4gICAgSUNoYXJ0Q29uZmlndXJhdGlvbixcbiAgICBJQmFzZURhdGFzZXQsXG4gICAgSUNoYXJ0QW5ub3RhdGlvbixcbiAgICBJQ2hhcnREYXRhc2V0SG92ZXIsXG4gICAgSUNoYXJ0Q2VudGVyTGFiZWwsXG4gICAgSUNoYXJ0TGVnZW5kQ29uZmlnLFxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50IH0gZnJvbSAnY2hhcnQuanMvZGlzdC9wbHVnaW5zL3BsdWdpbi50b29sdGlwJztcblxuLy9TZXJ2aWNlc1xuaW1wb3J0IHsgQ2hhcnRNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL2NhLWNoYXJ0LW1hbmFnZXIvc2VydmljZXMnO1xuXG4vLyBDb25zdGFudHNcbmltcG9ydCB7IENoYXJ0Q29uc3RhbnRzIH0gZnJvbSAnLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgICBfRGVlcFBhcnRpYWxBcnJheSxcbiAgICBfRGVlcFBhcnRpYWxPYmplY3QsXG59IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvdHlwZXMvdXRpbHMnO1xuXG4vLyBQaXBlc1xuaW1wb3J0IHsgVGhvdXNhbmRTZXBhcmF0b3JQaXBlLCBVbml0UG9zaXRpb25QaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jYS1jaGFydCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEFuZ3VsYXJTdmdJY29uTW9kdWxlLFxuICAgICAgICBVbml0UG9zaXRpb25QaXBlLFxuICAgICAgICBUaG91c2FuZFNlcGFyYXRvclBpcGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIEBWaWV3Q2hpbGQoJ2NoYXJ0Q2FudmFzJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNoYXJ0Q2FudmFzITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpIGxlZ2VuZERhdGEhOiBJQ2hhcnRMZWdlbmRDb25maWc7XG4gICAgQElucHV0KCkgY2hhcnRJZCE6IHN0cmluZztcbiAgICBASW5wdXQoKVxuICAgIHNldCBjaGFydERhdGFzZXRIb3Zlcih2YWx1ZTogSUNoYXJ0RGF0YXNldEhvdmVyIHwgbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUpIHRoaXMudXBkYXRlRGF0YXNldEJhY2tncm91bmRPbkhvdmVyKHZhbHVlKTtcbiAgICB9XG4gICAgQElucHV0KCkgc2V0IGNoYXJ0Q29uZmlnKHZhbHVlOiBJQ2hhcnRDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID1cbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnPy5jaGFydERhdGE/LmRhdGFzZXRzPy5zb21lKChpdGVtOiBJQmFzZURhdGFzZXQpID0+XG4gICAgICAgICAgICAgICAgaXRlbS5kYXRhLnNvbWUoKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsdWVbMF0gIT09IDAgfHwgdmFsdWVbMV0gIT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWUgIT09IDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBpZiAodGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSkgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cbiAgICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFydCB8fCAhdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgdGhpcy5mb2N1c0RvdWdobnV0QXJjKHZhbHVlKTtcbiAgICAgICAgZWxzZSB0aGlzLnNldE9yaWdpbmFsRG91Z2hudXRBcmNzQ29sb3IoKTtcblxuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIEBPdXRwdXQoKSBob3ZlcmVkSW5kZXg6IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcHJpdmF0ZSBjaGFydCE6IENoYXJ0O1xuICAgIHByaXZhdGUgY2hhcnRDb250ZXh0ITogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIHByaXZhdGUgcGx1Z2lucz86IFBsdWdpbjxDaGFydFR5cGUsIEFueU9iamVjdD5bXTtcbiAgICBwcml2YXRlIGFyZUFuaW1hdGlvbnNDb21wbGVhdGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaG92ZXJlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGxhc3RIb3ZlcmVkSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgcHVibGljIF9jaGFydENvbmZpZyE6IElDaGFydENvbmZpZ3VyYXRpb247XG4gICAgcHVibGljIGlzQ2hhcnREYXRhQXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY2hhcnRNYW5hZ2VyU2VydmljZT86IENoYXJ0TWFuYWdlclNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUNoYXJ0TWFuYWdlclNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlLmhvdmVyU3RhdGUkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGluZGV4LCBjaGFydElkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhcnRJZCAhPT0gdGhpcy5jaGFydElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGFydCkgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplQW5ub3RhdGlvblBsdWdpbigpOiB2b2lkIHtcbiAgICAgICAgQ2hhcnQucmVnaXN0ZXIoYW5ub3RhdGlvblBsdWdpbik7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3ZlcihcbiAgICAgICAgY2hhcnREYXRhc2V0SG92ZXI6IElDaGFydERhdGFzZXRIb3ZlclxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2hhcnQgfHwgIXRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChjaGFydERhdGFzZXRIb3Zlci5pc0hvdmVyZCkge1xuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICAgICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAgICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAgICAgICAgIDAuNixcbiAgICAgICAgICAgICAgICAwLjEsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IHRoaXMuY2hhcnQ/LmRhdGE/LmRhdGFzZXRzPy5tYXAoXG4gICAgICAgICAgICAgICAgKGRhdGFzZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFzZXQuaGlkZGVuKSByZXR1cm4gZGF0YXNldDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0Py5sYWJlbD8udG9VcHBlckNhc2UoKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyPy5sYWJlbD8udG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvdmVyZERhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZ3JhZGllbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBob3ZlcmREYXRhU2V0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LmJvcmRlckNvbG9yIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLm1hcChcbiAgICAgICAgICAgICAgICAoZGF0YXNldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFzZXQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbG9yID0gZGF0YXNldC5ib3JkZXJDb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQuYm9yZGVyQ29sb3IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcmlnaW5hbENvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogQ2hhcnRDb25zdGFudHMuU1RSSU5HX0VNUFRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJldHVybiBkYXRhc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhcnRDb250ZXh0ID0gdGhpcy5jaGFydENhbnZhcz8ubmF0aXZlRWxlbWVudD8uZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICB0aGlzLnNldENoYXJ0T3B0aW9uc1Byb3BlcnRpZXMoKTtcbiAgICAgICAgdGhpcy5zZXRDaGFydERhdGFQcm9wZXJ0aWVzKCk7XG4gICAgICAgIHRoaXMuc2V0Q2hhcnRQbHVnaW5zUHJvcGVydGllcygpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0KSB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUKVxuICAgICAgICAgICAgQ2hhcnQub3ZlcnJpZGVzLmRvdWdobnV0LmN1dG91dCA9ICc4OCUnO1xuXG4gICAgICAgIHRoaXMuY2hhcnQgPSBuZXcgQ2hhcnQodGhpcy5jaGFydENvbnRleHQsIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5pc0Rhc2hib2FyZENoYXJ0KVxuICAgICAgICAgICAgdGhpcy5jaGFydC5jb25maWcuZGF0YS5kYXRhc2V0cyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZz8uY2hhcnREYXRhPy5kYXRhc2V0cz8ubWFwKFxuICAgICAgICAgICAgICAgICAgICAoaXRlbTogSUJhc2VEYXRhc2V0LCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50QmFja2dyb3VuZENvbG9yOiBDaGFydENvbG9yc1N0cmluZ0VudW0uV0hJVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRCb3JkZXJXaWR0aDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludFJhZGl1czogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnRBbm5vdGF0aW9ucyhpdGVtLCBpbmR4KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gdGhpcy5jaGFydC5zY2FsZXNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLllfQVhJU18wXG4gICAgICAgICAgICAgICAgICAgICAgICBdIGFzIENhdGVnb3J5U2NhbGUgfCBMaW5lYXJTY2FsZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvciAmJiBpdGVtPy5jb2xvcjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbT8uY29sb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzZXRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvaW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBpdGVtPy5maWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGFzZXRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogaXRlbS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnNoaWZ0VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YXNldENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yMiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgIT09IGl0ZW0/LmNvbG9yMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ2hhcnRIZWxwZXIuY3JlYXRlR3JhZGllbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydENhbnZhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0VmFsdWVQeDogbnVtYmVyID0geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zaGlmdFZhbHVlIHx8IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGlmdFZhbHVlQWRqdXN0ZWQ6IG51bWJlciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRWYWx1ZVB4IC8geVNjYWxlLm1heEhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3IxOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IgfHwgQ2hhcnRDb25zdGFudHMuU1RSSU5HX0VNUFRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb3IyOiBzdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IyIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyQ29sb3I6IENhbnZhc0dyYWRpZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudFdpdGhTaGlmdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0VmFsdWVBZGp1c3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5wb2ludENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZS5tYXhIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFZhbHVlQWRqdXN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0KSB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEubGFiZWxzO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEsICdORVcgREFUQSBGT1IgVEVTVElORycpO1xuXG4gICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZSxcbiAgICAgICAgICAgIGNsaXA6IGZhbHNlLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXJlQW5pbWF0aW9uc0NvbXBsZWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXlvdXQ6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIHRvcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyA4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gOFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGVzU3RyaW5nRW51bS5CQVIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLnZlcnRpY2FseUFsaWduQmFyQ2hhcnRXaXRoTGluZUNhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcudmVydGljYWx5QWxpZ25CYXJDaGFydFdpdGhMaW5lQ2FydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gNlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2NhbGVzOiB7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5YX0FYSVNfTEFCRUxfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogMTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5OiBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bS5GT05UX0ZBTUlMWV9NT05UU0VSUkFULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDogQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0uRk9OVF9XRUlHSFRfQk9MREVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ta2lwOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NraXBQYWRkaW5nOiAxMixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvdGF0aW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluUm90YXRpb246IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0xhYmVsIHdyaXR0ZW4gaW4gMiBsaW5lcywgd2lsbCBiZSBhZGp1c3RlZCB3aXRoIG5ldyBkZXNpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpTGluZUxhYmVsID0gbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsYWJlbC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG11bHRpTGluZUxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdGhpcy5fY2hhcnRDb25maWcuc2hvd1hBeGlzTGFiZWxzLFxuICAgICAgICAgICAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBDaGFydEhlbHBlci5jYWxjdWxhdGVEYXRhc2V0TWF4VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMgYXMgYW55IC8vbGVhdmUgdGhpcyBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uSG92ZXI6IChldmVudDogQ2hhcnRFdmVudCwgaXRlbTogQWN0aXZlRWxlbWVudFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmhhc1ZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVZlcnRpY2FsRGFzaGVkTGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0T3JpZ2luYWxEb3VnaG51dEFyY3NDb2xvcigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQoaXRlbVswXT8uaW5kZXggfHwgbnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbVswXT8uaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmZvY3VzRG91Z2hudXRBcmMoaXRlbVswXT8uaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2V0T3JpZ2luYWxEb3VnaG51dEFyY3NDb2xvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzRG91Z2hudXRBcmMoaW5kZXg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlICE9PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCB8fFxuICAgICAgICAgICAgaW5kZXggPT09IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5kYXRhLmxlbmd0aCAtIDFcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdID0gdGhpcy5jaGFydD8uZGF0YT8uZGF0YXNldHNbMF1cbiAgICAgICAgICAgID8uYmFja2dyb3VuZENvbG9yIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCB1cGRhdGVkQ29sb3JzOiBzdHJpbmdbXSA9IGNvbG9ycy5tYXAoXG4gICAgICAgICAgICAoY29sb3I6IHN0cmluZywgaW5keDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZHggPT09IGluZGV4KSByZXR1cm4gY29sb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBDaGFydEhlbHBlci5jb252ZXJ0UmdiVG9SZ2JhKGNvbG9yLCAwLjIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yID0gdXBkYXRlZENvbG9ycztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldE9yaWdpbmFsRG91Z2hudXRBcmNzQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgIT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbG9yczogc3RyaW5nW10gPSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF1cbiAgICAgICAgICAgIC5iYWNrZ3JvdW5kQ29sb3IgYXMgc3RyaW5nW107XG5cbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciA9IFtcbiAgICAgICAgICAgIC4uLmNvbG9ycy5tYXAoKGNvbG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcnRIZWxwZXIucmdiVG9SZ2JhKGNvbG9yLCAxKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0Q2hhcnREYXRhUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uTElORSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0Lm9yZGVyID0gZGF0YXNldC5vcmRlcjtcbiAgICAgICAgICAgICAgICBpZiAoQ2hhcnRUeXBlR3VhcmQuaXNMaW5lRGF0YXNldChkYXRhc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb24gPz8gMC41O1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5jdWJpY0ludGVycG9sYXRpb25Nb2RlID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBDdWJpY0ludGVycG9sYXRpb25TdHJpbmdFbnVtLk1PTk9UT05FO1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyQ29sb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydENvbG9yc1N0cmluZ0VudW0uVFJBTlNQQVJFTlQ7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlRSQU5TUEFSRU5UO1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLldISVRFO1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnBvaW50SG92ZXJCb3JkZXJDb2xvciA9IGRhdGFzZXQuYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA9IGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA/PyAzO1xuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnBvaW50SG92ZXJSYWRpdXMgPSA0O1xuICAgICAgICAgICAgICAgICAgICAvL2RhdGFzZXQucG9pbnRIb3ZlclJhZGl1cyA9IDg7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlcldpZHRoID0gMztcblxuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0LnNwYW5HYXBzID0gZGF0YXNldC5zcGFuR2FwcyA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5zaG93TGluZSA9IGRhdGFzZXQuc2hvd0xpbmUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhc2V0LCAnREFUQVNFVFRUJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0TXVsdGlwbGVZQXhpcyh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGFydFBsdWdpbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfU0VHTUVOVF9PTl9IT1ZFUixcbiAgICAgICAgICAgICAgICBhZnRlckV2ZW50OiAoY2hhcnQsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUV2ZW50ID0gZXZlbnQuZXZlbnQubmF0aXZlIGFzIE1vdXNlRXZlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnQudHlwZSA9PT0gQ2hhcnRFdmVudFR5cGVzU3RyaW5nRW51bS5NT1VTRV9PVVRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNb3VzZU91dHNpZGVDaGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCA8IGJvdW5kaW5nUmVjdC5sZWZ0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCA+IGJvdW5kaW5nUmVjdC5yaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFkgPCBib3VuZGluZ1JlY3QudG9wIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WSA+IGJvdW5kaW5nUmVjdC5ib3R0b207XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vdXNlT3V0c2lkZUNoYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2U/LnNldEhvdmVyU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVWZXJ0aWNhbERhc2hlZExpbmVBbmRGb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5zaG93VG9vbHRpcEJhY2tncm91bmQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCAtIGJvdW5kaW5nUmVjdC5sZWZ0O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMuY2hhcnQuY2hhcnRBcmVhO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPCBsZWZ0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID4gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydElkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tcbiAgICAgICAgICAgICAgICAgICAgICAgIEVDaGFydEV2ZW50UHJvcGVydGllcy5YXG4gICAgICAgICAgICAgICAgICAgIF0gYXMgQ2F0ZWdvcnlTY2FsZSB8IExpbmVhclNjYWxlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpY2tQb3NpdGlvbnMgPSB4U2NhbGUudGlja3MubWFwKCh0aWNrKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgeFNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGljay52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50Qm91bmRhcmllcyA9IHRpY2tQb3NpdGlvbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRpY2tQb3MsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdEJvdW5kYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodGlja1BvcyArIHRpY2tQb3NpdGlvbnNbaW5kZXggLSAxXSkgLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm91bmRhcnkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gdGlja1Bvc2l0aW9ucy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCArIDFdKSAvIDI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBsZWZ0Qm91bmRhcnksIHJpZ2h0Qm91bmRhcnkgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdIb3ZlcmVkSW5kZXggPSBzZWdtZW50Qm91bmRhcmllcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYm91bmRhcnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS5sZWZ0Qm91bmRhcnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgYm91bmRhcnkucmlnaHRCb3VuZGFyeVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdIb3ZlcmVkSW5kZXggIT09IHRoaXMuX2hvdmVyZWRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3ZlcmVkSW5kZXggPT09IC0xID8gbnVsbCA6IG5ld0hvdmVyZWRJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZT8uc2V0SG92ZXJTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRCb3VuZGFyaWVzW3RoaXMuX2hvdmVyZWRJbmRleCBhcyBudW1iZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgYmVmb3JlRHJhdzogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faG92ZXJlZEluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczogeyB4OiB4U2NhbGUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0aGlzLmNoYXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5oaWdobGlnaHRTZWdtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSBhcyBDYXRlZ29yeVNjYWxlIHwgTGluZWFyU2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZURhdGEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnPy5jaGFydERhdGE/LmRhdGFzZXRzPy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFydC5zZXRBY3RpdmVFbGVtZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEYXRhIGFzIEFjdGl2ZURhdGFQb2ludFtdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5CT1JERVJfQk9UVE9NX0xJTkVfQ0hBUlQsXG4gICAgICAgICAgICAgICAgYmVmb3JlRHJhdzogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWc/LnNob3dCb3R0b21MaW5lT25MaW5lQ2hhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOiB7IHg6IHhTY2FsZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuY2hhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhc2V0ID0gZGF0YS5kYXRhc2V0c1swXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBkYXRhc2V0LmRhdGEubGVuZ3RoIC0gMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGRhdGFzZXQuZGF0YVtmaXJzdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGRhdGFzZXQuZGF0YVtsYXN0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHhTdGFydCA9IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGZpcnN0SW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeEVuZCA9IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeUJvdHRvbSA9IGNoYXJ0QXJlYS5ib3R0b207XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0Q29sb3JzU3RyaW5nRW51bS5CT1JERVJfQk9UVE9NX0xJTkVfQ0hBUlRfQ09MT1I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeFN0YXJ0LCB5Qm90dG9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHhFbmQsIHlCb3R0b20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5wbHVnaW5zLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdkb3VnaG51dC1sYWJlbCcsXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZURhdGFzZXREcmF3OiAoY2hhcnQ6IENoYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jZW50ZXJMYWJlbHM/Lm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWw6IElDaGFydENlbnRlckxhYmVsLCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuZHJhd0RvdWdobnV0TGVnZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5keCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRUb3A6IGxhYmVsLnBvc2l0aW9uPy50b3AgfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hhcnRBbm5vdGF0aW9ucyhpdGVtOiBJQmFzZURhdGFzZXQsIGluZHg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2NoYXJ0Q29uZmlnLmFubm90YXRpb25zPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5hbm5vdGF0aW9ucz8uZm9yRWFjaChcbiAgICAgICAgICAgIChhbm5vdGF0aW9uOiBJQ2hhcnRBbm5vdGF0aW9uLCBrZXk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnM/LnBsdWdpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5hbm5vdGF0aW9uPy5hbm5vdGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYCR7aXRlbS5sYWJlbH0tJHtpbmR4fS0ke2tleX1gXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhbm5vdGF0aW9uLSR7aW5keH0tJHtrZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZUlEOiBhbm5vdGF0aW9uLmF4aXMgfHwgaXRlbS55QXhpc0lELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYW5ub3RhdGlvbi52YWx1ZSB8fCBpdGVtLnNoaWZ0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5jb2xvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLkJPUkRFUl9CT1RUT01fTElORV9DSEFSVF9DT0xPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGFubm90YXRpb24uYm9yZGVyV2lkdGggfHwgMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyRGFzaDogYW5ub3RhdGlvbi5ib3JkZXJEYXNoIHx8IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TXVsdGlwbGVZQXhpcyhjaGFydERhdGE6IElDaGFydERhdGE8SUxpbmVEYXRhc2V0Pik6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFydERhdGEsICdUSElTIElTIE1VTFRJUExFIEFYSVMnKTtcbiAgICAgICAgY2hhcnREYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YXNldC50eXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5MSU5FIHx8XG4gICAgICAgICAgICAgICAgZGF0YXNldC50eXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5CQVJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHlBeGlzSUQgPSB0aGlzLl9jaGFydENvbmZpZy5pc011bHRpWUF4aXNcbiAgICAgICAgICAgICAgICAgICAgPyBgeS1heGlzLSR7aW5kZXh9YFxuICAgICAgICAgICAgICAgICAgICA6IGRhdGFzZXQueUF4aXNJRCB8fCAneS1heGlzLTAnO1xuXG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBkYXRhc2V0IGlzIGFsbCAwXG4gICAgICAgICAgICAgICAgY29uc3QgaXNBbGxaZXJvRGF0YXNldCA9IChkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAodmFsOiBudW1iZXIpID0+IHZhbCA9PT0gMFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBsZXQgbWluVmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNaW5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5kYXRhIGFzIG51bWJlcltdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgbWF4VmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNYXhWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldC5kYXRhIGFzIG51bWJlcltdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4VmFsdWUgKiAwLjAzO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IHNjYWxpbmcgZm9yIGFsbCAwIGRhdGFzZXRzXG4gICAgICAgICAgICAgICAgaWYgKGlzQWxsWmVyb0RhdGFzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPT09IG1pblZhbHVlID8gbWluVmFsdWUgLSAwLjEgOiBtaW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPT09IG1pblZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXhWYWx1ZSArIDAuMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWF4VmFsdWUgKyBwYWRkaW5nO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5zY2FsZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5zY2FsZXMsXG4gICAgICAgICAgICAgICAgICAgIFt5QXhpc0lEXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogbWluVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg6IG1heFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tlZDogdGhpcy5fY2hhcnRDb25maWcuaXNTdGFja2VkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjaGFydERhdGEuZGF0YXNldHNbaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgICAgICAgICB5QXhpc0lELFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVmVydGljYWxEYXNoZWRMaW5lKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZz8uY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uPy5hbm5vdGF0aW9ucztcblxuICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5YX0RBU0hFRDtcblxuICAgICAgICBpZiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jaGFydENvbmZpZz8uY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uXG4gICAgICAgICAgICAgICAgPy5hbm5vdGF0aW9ucz8uW2tleSBhcyBrZXlvZiB0eXBlb2YgYW5ub3RhdGlvbnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoXG4gICAgICAgIGV2ZW50OiBDaGFydEV2ZW50LFxuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLmNoYXJ0LmNoYXJ0QXJlYTtcblxuICAgICAgICBjb25zdCB4U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWF0gYXNcbiAgICAgICAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgICAgICAgfCBMaW5lYXJTY2FsZTtcblxuICAgICAgICBjb25zdCB0aWNrUG9zaXRpb25zID0gdGhpcy5fY2hhcnRDb25maWc/LmNoYXJ0RGF0YT8ubGFiZWxzPy5tYXAoXG4gICAgICAgICAgICAobGFiZWw6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRCb3VuZGFyaWVzID0gdGlja1Bvc2l0aW9ucy5tYXAoKHRpY2tQb3MsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm91bmRhcnkgPVxuICAgICAgICAgICAgICAgIGluZGV4ID09PSAwID8gbGVmdCA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCAtIDFdKSAvIDI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvdW5kYXJ5ID1cbiAgICAgICAgICAgICAgICBpbmRleCA9PT0gdGlja1Bvc2l0aW9ucy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgID8gcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiAodGlja1BvcyArIHRpY2tQb3NpdGlvbnNbaW5kZXggKyAxXSkgLyAyO1xuXG4gICAgICAgICAgICByZXR1cm4geyBsZWZ0Qm91bmRhcnksIHJpZ2h0Qm91bmRhcnkgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmUgYXMgTW91c2VFdmVudDtcblxuICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLmNoYXJ0LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA9XG4gICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICAgICAgY29uc3QgbmV3SG92ZXJlZEluZGV4ID0gc2VnbWVudEJvdW5kYXJpZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKGJvdW5kYXJ5KSA9PlxuICAgICAgICAgICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPj0gYm91bmRhcnkubGVmdEJvdW5kYXJ5ICYmXG4gICAgICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA8IGJvdW5kYXJ5LnJpZ2h0Qm91bmRhcnlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobmV3SG92ZXJlZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5hbm5vdGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtDaGFydFBsdWdpbklkc1N0cmluZ0VudW0uWF9EQVNIRURdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uRUNoYXJ0QW5ub3RhdGlvbi5YX0RBU0hFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3SG92ZXJlZEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydENvbG9yc1N0cmluZ0VudW0uQk9SREVSX0JPVFRPTV9MSU5FX0NIQVJUX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQobmV3SG92ZXJlZEluZGV4KTtcbiAgICAgICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlVmVydGljYWxEYXNoZWRMaW5lQW5kRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQobnVsbCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5oYXNWZXJ0aWNhbERhc2hlZEFubm90YXRpb24pXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVZlcnRpY2FsRGFzaGVkTGluZSgpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiIsIkBpZiAoaXNDaGFydERhdGFBdmFpbGFibGUpIHtcbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBsZWdlbmQ7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgY29uZmlnOiBsZWdlbmREYXRhLFxuICAgICAgICAgICAgfVxuICAgICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICAgICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxjYW52YXMgI2NoYXJ0Q2FudmFzPjwvY2FudmFzPlxuICAgIDwvZGl2PlxufSBAZWxzZSB7XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICAgICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIDxzdmctaWNvblxuICAgICAgICAgICAgW3NyY109XCJfY2hhcnRDb25maWcubm9EYXRhSW1hZ2VcIlxuICAgICAgICAgICAgYWx0PVwiTm8gZGF0YSBhdmFpbGFibGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJuby1kYXRhLXN2Z1wiXG4gICAgICAgID48L3N2Zy1pY29uPlxuICAgIDwvZGl2PlxufVxuPG5nLXRlbXBsYXRlICNsZWdlbmQgbGV0LWNvbmZpZz1cImNvbmZpZ1wiPlxuICAgIEBpZiAoY29uZmlnPy5kYXRhKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbmZpZy5oYXNIaWdobGlnaHRlZEJhY2tncm91bmQgJiYgJ2NvbG9yZWQtYmFja2dyb3VuZCdcIlxuICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGNvbmZpZy50aXRsZSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtdGl0bGUgZm9udC1zaXplLTE0IHRhLWZvbnQtZXh0cmEtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQtd3JhcHBlciBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSBvZiBjb25maWcuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gJGluZGV4O1xuICAgICAgICAgICAgICAgICAgICB0cmFjayBpdGVtLm5hbWVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24tY29udGVudC1jZW50ZXIgdGV4dC1zaXplLTExIHRhLWZvbnQtYm9sZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbT8ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmlzTGluZUluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2xpbmUtaW5kaWNhdG9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2NpcmNsZS1pbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogaXRlbT8uY29sb3IgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc2l6ZS0xOFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtPy52YWx1ZSAhPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoaXRlbT8udmFsdWUgfCB0aG91c2FuZFNlcGFyYXRvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHwgdW5pdFBvc2l0aW9uOiBpdGVtPy51bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|