ca-components 1.0.76 → 1.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/ca-chart/ca-chart.component.mjs +200 -120
- package/esm2022/lib/components/ca-chart/enums/chart-annotation.enum.mjs +11 -0
- package/esm2022/lib/components/ca-chart/enums/chart-plugin-ids.enum.mjs +2 -1
- package/esm2022/lib/components/ca-chart/enums/index.mjs +2 -1
- package/esm2022/lib/components/ca-chart/models/chart-config.model.mjs +1 -1
- package/esm2022/lib/components/ca-chart/models/chart-legend-config.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/chart-legend-property.model.mjs +2 -0
- package/esm2022/lib/components/ca-chart/models/index.mjs +3 -1
- package/esm2022/lib/components/ca-chart/utils/helpers/chart.helper.mjs +2 -2
- package/esm2022/lib/components/ca-chart-manager/ca-chart-manager.component.mjs +4 -4
- package/esm2022/lib/components/ca-dropdown-menu/ca-dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +21 -22
- package/esm2022/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.mjs +6 -0
- package/esm2022/lib/pipes/index.mjs +19 -0
- package/esm2022/lib/pipes/unit-position.pipe.mjs +24 -0
- package/fesm2022/ca-components.mjs +277 -163
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/components/ca-chart/ca-chart.component.d.ts +9 -4
- package/lib/components/ca-chart/enums/chart-annotation.enum.d.ts +10 -0
- package/lib/components/ca-chart/enums/chart-plugin-ids.enum.d.ts +2 -1
- package/lib/components/ca-chart/enums/index.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-config.model.d.ts +1 -0
- package/lib/components/ca-chart/models/chart-legend-config.model.d.ts +6 -0
- package/lib/components/ca-chart/models/chart-legend-property.model.d.ts +7 -0
- package/lib/components/ca-chart/models/index.d.ts +2 -0
- package/lib/components/ca-input-address-dropdown/enums/input-address-basic-string.enum.d.ts +4 -0
- package/lib/pipes/index.d.ts +18 -0
- package/lib/pipes/unit-position.pipe.d.ts +7 -0
- package/package.json +1 -1
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { Component, Input, Output, Optional, ViewChild, EventEmitter, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { AngularSvgIconModule } from 'angular-svg-icon';
|
|
4
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
5
|
// Charts
|
|
5
6
|
import { Chart, } from 'chart.js/auto';
|
|
6
7
|
import annotationPlugin from 'chartjs-plugin-annotation';
|
|
7
8
|
// Enums
|
|
8
|
-
import { EChartEventProperties, ChartPluginIdsStringEnum, CubicInterpolationStringEnum, ChartEventTypesStringEnum, ChartFontPropertiesStringEnum,
|
|
9
|
+
import { EChartEventProperties, ChartPluginIdsStringEnum, CubicInterpolationStringEnum, ChartEventTypesStringEnum, ChartFontPropertiesStringEnum, EChartAnnotation, } from './enums';
|
|
9
10
|
// Helpers
|
|
10
11
|
import { ChartHelper } from './utils/helpers';
|
|
11
12
|
// Guards
|
|
12
13
|
import { ChartTypeGuard } from './utils/guards';
|
|
13
14
|
// Constants
|
|
14
15
|
import { ChartConstants } from './utils/constants';
|
|
16
|
+
// Pipes
|
|
17
|
+
import { ThousandSeparatorPipe, UnitPositionPipe } from '../../pipes';
|
|
15
18
|
import * as i0 from "@angular/core";
|
|
16
19
|
import * as i1 from "../ca-chart-manager/services";
|
|
17
20
|
import * as i2 from "@angular/common";
|
|
@@ -53,10 +56,20 @@ export class CaChartComponent {
|
|
|
53
56
|
});
|
|
54
57
|
});
|
|
55
58
|
}
|
|
59
|
+
set selectedIndex(value) {
|
|
60
|
+
if (!this.chart || !this.isChartDataAvailable)
|
|
61
|
+
return;
|
|
62
|
+
if (value !== null)
|
|
63
|
+
this.focusDoughnutArc(value);
|
|
64
|
+
else
|
|
65
|
+
this.setOriginalDoughnutArcsColor();
|
|
66
|
+
this.chart.update();
|
|
67
|
+
}
|
|
56
68
|
constructor(changeDetector, chartManagerService) {
|
|
57
69
|
this.changeDetector = changeDetector;
|
|
58
70
|
this.chartManagerService = chartManagerService;
|
|
59
71
|
this.hoveredIndex = new EventEmitter();
|
|
72
|
+
this.destroy$ = new Subject();
|
|
60
73
|
this.areAnimationsCompleated = false;
|
|
61
74
|
this._hoveredIndex = null;
|
|
62
75
|
this.isChartDataAvailable = false;
|
|
@@ -73,7 +86,10 @@ export class CaChartComponent {
|
|
|
73
86
|
initializeChartManagerService() {
|
|
74
87
|
if (!this.chartManagerService)
|
|
75
88
|
return;
|
|
76
|
-
this.
|
|
89
|
+
this.chartManagerService.
|
|
90
|
+
hoverState$.
|
|
91
|
+
pipe(takeUntil(this.destroy$))
|
|
92
|
+
.subscribe(({ index, chartId }) => {
|
|
77
93
|
if (chartId !== this.chartId) {
|
|
78
94
|
this._hoveredIndex = index;
|
|
79
95
|
if (this.chart)
|
|
@@ -89,45 +105,54 @@ export class CaChartComponent {
|
|
|
89
105
|
return;
|
|
90
106
|
if (chartDatasetHover.isHoverd) {
|
|
91
107
|
const gradient = ChartHelper.createGradient(this.chartContext, this.chartCanvas, chartDatasetHover.color, chartDatasetHover.color, 0.6, 0.1, true);
|
|
92
|
-
this.chart.data.datasets =
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
this.chart.data.datasets =
|
|
109
|
+
this.chart?.
|
|
110
|
+
data?.
|
|
111
|
+
datasets?.
|
|
112
|
+
map((dataset) => {
|
|
113
|
+
if (dataset.hidden)
|
|
114
|
+
return dataset;
|
|
115
|
+
if (dataset?.label?.toUpperCase() ===
|
|
116
|
+
chartDatasetHover?.label?.toUpperCase()) {
|
|
117
|
+
const hoverdDataSet = {
|
|
118
|
+
...dataset,
|
|
119
|
+
fill: true,
|
|
120
|
+
backgroundColor: gradient,
|
|
121
|
+
borderColor: chartDatasetHover.color,
|
|
122
|
+
order: 1,
|
|
123
|
+
};
|
|
124
|
+
return hoverdDataSet;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const borderColorWithOpacity = ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 0.2);
|
|
128
|
+
return {
|
|
129
|
+
...dataset,
|
|
130
|
+
fill: false,
|
|
131
|
+
borderColor: borderColorWithOpacity,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
});
|
|
114
135
|
}
|
|
115
136
|
else {
|
|
116
|
-
this.chart.data.datasets =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
137
|
+
this.chart.data.datasets =
|
|
138
|
+
this.chart
|
|
139
|
+
.data
|
|
140
|
+
.datasets
|
|
141
|
+
.map((dataset) => {
|
|
142
|
+
if (!dataset.hidden) {
|
|
143
|
+
const originalColor = dataset.borderColor
|
|
144
|
+
? ChartHelper.changeOpacityOfRgbOrRgba(dataset.borderColor, 1)
|
|
145
|
+
: ChartConstants.STRING_EMPTY;
|
|
146
|
+
return {
|
|
147
|
+
...dataset,
|
|
148
|
+
fill: false,
|
|
149
|
+
borderColor: originalColor,
|
|
150
|
+
backgroundColor: ChartConstants.STRING_EMPTY,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
return dataset;
|
|
155
|
+
});
|
|
131
156
|
}
|
|
132
157
|
this.chart.update();
|
|
133
158
|
}
|
|
@@ -142,14 +167,14 @@ export class CaChartComponent {
|
|
|
142
167
|
this.chart.destroy();
|
|
143
168
|
this.initializeAnnotationPlugin();
|
|
144
169
|
if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
145
|
-
Chart.overrides.doughnut.cutout = '
|
|
170
|
+
Chart.overrides.doughnut.cutout = '88%';
|
|
146
171
|
this.chart = new Chart(this.chartContext, {
|
|
147
172
|
type: this._chartConfig.chartType,
|
|
148
173
|
data: this._chartConfig.chartData,
|
|
149
174
|
options: this._chartConfig.chartOptions,
|
|
150
175
|
plugins: this.plugins,
|
|
151
176
|
});
|
|
152
|
-
if (!this._chartConfig.isDashboardChart)
|
|
177
|
+
if (!this._chartConfig.isDashboardChart)
|
|
153
178
|
this.chart.config.data.datasets = [
|
|
154
179
|
...this._chartConfig?.
|
|
155
180
|
chartData?.
|
|
@@ -162,23 +187,22 @@ export class CaChartComponent {
|
|
|
162
187
|
};
|
|
163
188
|
this.updateChartAnnotations(item, indx);
|
|
164
189
|
const yScale = this.chart.scales[EChartEventProperties.Y_AXIS_0];
|
|
190
|
+
const backgroundColor = (item?.color &&
|
|
191
|
+
item?.color2) ?
|
|
192
|
+
ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2) : item?.color;
|
|
165
193
|
const datasetConfig = {
|
|
166
194
|
...item,
|
|
167
195
|
pointBorderColor: item.color,
|
|
168
196
|
...pointConfig,
|
|
169
|
-
backgroundColor
|
|
170
|
-
item?.color2 &&
|
|
171
|
-
item?.color !== item?.color2 ?
|
|
172
|
-
ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2) : item?.color,
|
|
197
|
+
backgroundColor,
|
|
173
198
|
fill: item?.fill
|
|
174
199
|
};
|
|
175
|
-
if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
200
|
+
if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
176
201
|
return {
|
|
177
202
|
...datasetConfig,
|
|
178
203
|
backgroundColor: item.backgroundColor
|
|
179
204
|
};
|
|
180
|
-
|
|
181
|
-
if (!item.shiftValue) {
|
|
205
|
+
if (!item.shiftValue)
|
|
182
206
|
return {
|
|
183
207
|
...datasetConfig,
|
|
184
208
|
backgroundColor: item?.color &&
|
|
@@ -186,26 +210,26 @@ export class CaChartComponent {
|
|
|
186
210
|
item?.color !== item?.color2 ?
|
|
187
211
|
ChartHelper.createGradient(this.chartContext, this.chartCanvas, item?.color, item?.color2) : item?.color,
|
|
188
212
|
};
|
|
189
|
-
}
|
|
190
213
|
const shiftValuePx = yScale.getPixelForValue(item.shiftValue || 0);
|
|
191
214
|
const shiftValueAdjusted = shiftValuePx / yScale.maxHeight;
|
|
192
|
-
const
|
|
215
|
+
const color1 = item.color || ChartConstants.STRING_EMPTY;
|
|
216
|
+
const color2 = item.color2 || ChartConstants.STRING_EMPTY;
|
|
217
|
+
const borderColor = ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, color1, color2, shiftValueAdjusted);
|
|
193
218
|
return {
|
|
194
219
|
...item,
|
|
195
220
|
...pointConfig,
|
|
196
221
|
pointBorderColor: borderColor,
|
|
197
|
-
backgroundColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight,
|
|
222
|
+
backgroundColor: ChartHelper.createGradientWithShiftValue(this.chartContext, yScale.maxHeight, color1, color2, shiftValueAdjusted, true),
|
|
198
223
|
borderColor,
|
|
199
224
|
fill: true
|
|
200
225
|
};
|
|
201
226
|
})
|
|
202
227
|
];
|
|
203
|
-
}
|
|
204
228
|
this.chart.update();
|
|
205
229
|
}
|
|
206
230
|
updateChart() {
|
|
207
231
|
if (this.chart)
|
|
208
|
-
this.chart
|
|
232
|
+
this.chart.update();
|
|
209
233
|
this.createChart();
|
|
210
234
|
}
|
|
211
235
|
setChartOptionsProperties() {
|
|
@@ -226,8 +250,14 @@ export class CaChartComponent {
|
|
|
226
250
|
},
|
|
227
251
|
layout: {
|
|
228
252
|
padding: {
|
|
229
|
-
top:
|
|
230
|
-
|
|
253
|
+
top: this._chartConfig.chartType ===
|
|
254
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */ ?
|
|
255
|
+
8 :
|
|
256
|
+
0,
|
|
257
|
+
bottom: this._chartConfig.chartType ===
|
|
258
|
+
"doughnut" /* ChartTypesStringEnum.DOUGHNUT */ ?
|
|
259
|
+
8 :
|
|
260
|
+
0,
|
|
231
261
|
left: this._chartConfig.chartType === "bar" /* ChartTypesStringEnum.BAR */ &&
|
|
232
262
|
this._chartConfig.verticalyAlignBarChartWithLineCart
|
|
233
263
|
? 6
|
|
@@ -268,7 +298,7 @@ export class CaChartComponent {
|
|
|
268
298
|
autoSkipPadding: 12,
|
|
269
299
|
maxRotation: 0,
|
|
270
300
|
minRotation: 0,
|
|
271
|
-
//Label written in 2 lines, will be
|
|
301
|
+
//Label written in 2 lines, will be adjusted with new design
|
|
272
302
|
callback: function (value, index) {
|
|
273
303
|
const label = labels[index];
|
|
274
304
|
const multiLineLabel = label ? label.split(' ') : [];
|
|
@@ -288,38 +318,47 @@ export class CaChartComponent {
|
|
|
288
318
|
},
|
|
289
319
|
},
|
|
290
320
|
onHover: (event, item) => {
|
|
291
|
-
if (this._chartConfig.hasVerticalDashedAnnotation)
|
|
292
|
-
this.
|
|
293
|
-
|
|
294
|
-
const colors = this.chart.data.datasets[0].backgroundColor;
|
|
295
|
-
this.chart.data.datasets[0].backgroundColor =
|
|
296
|
-
colors.map((color) => {
|
|
297
|
-
return ChartHelper.convertRgbToRgba(color);
|
|
298
|
-
});
|
|
299
|
-
this.chart.update();
|
|
300
|
-
}
|
|
301
|
-
if (!item ||
|
|
302
|
-
!item?.length) {
|
|
303
|
-
this.hoveredIndex.emit(null);
|
|
304
|
-
return;
|
|
321
|
+
if (this._chartConfig.hasVerticalDashedAnnotation) {
|
|
322
|
+
this.removeVerticalDashedLine();
|
|
323
|
+
this.setVerticalDashedAnnotationLine(event);
|
|
305
324
|
}
|
|
306
|
-
this.
|
|
325
|
+
this.setOriginalDoughnutArcsColor();
|
|
307
326
|
if (this._chartConfig.chartType === "doughnut" /* ChartTypesStringEnum.DOUGHNUT */) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
const convertedValue = ChartHelper.convertRgbToRgba(color, 0.2);
|
|
313
|
-
return convertedValue;
|
|
314
|
-
});
|
|
315
|
-
this.chart.data.datasets[0].backgroundColor = updatedColors;
|
|
327
|
+
this.hoveredIndex.emit(item[0]?.index || null);
|
|
328
|
+
item[0]?.index >= 0 ?
|
|
329
|
+
this.focusDoughnutArc(item[0]?.index) :
|
|
330
|
+
this.setOriginalDoughnutArcsColor();
|
|
316
331
|
}
|
|
317
|
-
|
|
318
|
-
this.setVerticalDashedAnnotationLine(item[0].element.x);
|
|
332
|
+
;
|
|
319
333
|
this.chart.update();
|
|
320
334
|
},
|
|
321
335
|
};
|
|
322
336
|
}
|
|
337
|
+
focusDoughnutArc(index) {
|
|
338
|
+
if (this._chartConfig.chartType !== "doughnut" /* ChartTypesStringEnum.DOUGHNUT */ ||
|
|
339
|
+
index === this.chart.data.datasets[0].data.length - 1)
|
|
340
|
+
return;
|
|
341
|
+
const colors = this.chart?.
|
|
342
|
+
data?.
|
|
343
|
+
datasets[0]?.backgroundColor;
|
|
344
|
+
const updatedColors = colors.map((color, indx) => {
|
|
345
|
+
if (indx === index)
|
|
346
|
+
return color;
|
|
347
|
+
const convertedValue = ChartHelper.convertRgbToRgba(color, 0.2);
|
|
348
|
+
return convertedValue;
|
|
349
|
+
});
|
|
350
|
+
this.chart.data.datasets[0].backgroundColor = updatedColors;
|
|
351
|
+
}
|
|
352
|
+
setOriginalDoughnutArcsColor() {
|
|
353
|
+
if (this._chartConfig.chartType !== "doughnut" /* ChartTypesStringEnum.DOUGHNUT */)
|
|
354
|
+
return;
|
|
355
|
+
const colors = this.chart.data.datasets[0].backgroundColor;
|
|
356
|
+
this.chart.data.datasets[0].backgroundColor =
|
|
357
|
+
[...colors.map((color) => {
|
|
358
|
+
return ChartHelper.rgbToRgba(color, 1);
|
|
359
|
+
})];
|
|
360
|
+
this.chart.update();
|
|
361
|
+
}
|
|
323
362
|
setChartDataProperties() {
|
|
324
363
|
if ((this._chartConfig.chartType === "line" /* ChartTypesStringEnum.LINE */)) {
|
|
325
364
|
this._chartConfig.chartData.datasets.forEach((dataset) => {
|
|
@@ -342,13 +381,10 @@ export class CaChartComponent {
|
|
|
342
381
|
}
|
|
343
382
|
}
|
|
344
383
|
setChartPluginsProperties() {
|
|
345
|
-
let hoveredIndex = null;
|
|
346
384
|
this.plugins = [
|
|
347
385
|
{
|
|
348
386
|
id: ChartPluginIdsStringEnum.HIGHLIGHT_SEGMENT_ON_HOVER,
|
|
349
387
|
afterEvent: (chart, event) => {
|
|
350
|
-
if (!this._chartConfig.showTooltipBackground)
|
|
351
|
-
return;
|
|
352
388
|
const nativeEvent = event.event.native;
|
|
353
389
|
if (event.event.type === ChartEventTypesStringEnum.MOUSE_OUT) {
|
|
354
390
|
const boundingRect = this.chart.canvas.getBoundingClientRect();
|
|
@@ -359,10 +395,13 @@ export class CaChartComponent {
|
|
|
359
395
|
if (isMouseOutsideChart) {
|
|
360
396
|
this._hoveredIndex = null;
|
|
361
397
|
this.chartManagerService?.setHoverState(null, this.chartId);
|
|
398
|
+
this.removeVerticalDashedLineAndFocus();
|
|
362
399
|
this.chart.draw();
|
|
363
400
|
}
|
|
364
401
|
return;
|
|
365
402
|
}
|
|
403
|
+
if (!this._chartConfig.showTooltipBackground)
|
|
404
|
+
return;
|
|
366
405
|
const boundingRect = this.chart.canvas.getBoundingClientRect();
|
|
367
406
|
const mouseHorizontalCoordinate = nativeEvent.clientX - boundingRect.left;
|
|
368
407
|
const { left, right } = this.chart.chartArea;
|
|
@@ -473,7 +512,9 @@ export class CaChartComponent {
|
|
|
473
512
|
type: annotation.type,
|
|
474
513
|
scaleID: annotation.axis || item.yAxisID,
|
|
475
514
|
value: annotation.value || item.shiftValue,
|
|
476
|
-
borderColor: annotation.color ||
|
|
515
|
+
borderColor: annotation.color ||
|
|
516
|
+
"#DADADA" /* ChartColorsStringEnum.
|
|
517
|
+
BORDER_BOTTOM_LINE_CHART_COLOR */,
|
|
477
518
|
borderWidth: annotation.borderWidth || 2,
|
|
478
519
|
borderDash: annotation.borderDash || [0, 0],
|
|
479
520
|
},
|
|
@@ -484,7 +525,6 @@ export class CaChartComponent {
|
|
|
484
525
|
this.chart.update();
|
|
485
526
|
}
|
|
486
527
|
setMultipleYAxis(chartData) {
|
|
487
|
-
let absoluteMax;
|
|
488
528
|
chartData.datasets.forEach((dataset, index) => {
|
|
489
529
|
if (dataset.type === "line" /* ChartTypesStringEnum.LINE */ ||
|
|
490
530
|
dataset.type === "bar" /* ChartTypesStringEnum.BAR */) {
|
|
@@ -523,63 +563,103 @@ export class CaChartComponent {
|
|
|
523
563
|
}
|
|
524
564
|
});
|
|
525
565
|
}
|
|
526
|
-
|
|
527
|
-
this._chartConfig
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
566
|
+
removeVerticalDashedLine() {
|
|
567
|
+
const annotations = this._chartConfig?.
|
|
568
|
+
chartOptions?.
|
|
569
|
+
plugins?.
|
|
570
|
+
annotation?.
|
|
571
|
+
annotations;
|
|
572
|
+
const key = ChartPluginIdsStringEnum.X_DASHED;
|
|
573
|
+
if (annotations) {
|
|
574
|
+
delete this._chartConfig?.
|
|
575
|
+
chartOptions?.
|
|
576
|
+
plugins?.
|
|
577
|
+
annotation?.
|
|
578
|
+
annotations?.[key];
|
|
579
|
+
}
|
|
532
580
|
this.chart.update();
|
|
533
581
|
}
|
|
534
|
-
setVerticalDashedAnnotationLine(
|
|
582
|
+
setVerticalDashedAnnotationLine(event, color) {
|
|
583
|
+
const { left, right } = this.chart.chartArea;
|
|
535
584
|
const xScale = this.chart.scales[EChartEventProperties.X];
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
585
|
+
const tickPositions = this._chartConfig?.
|
|
586
|
+
chartData?.labels?.
|
|
587
|
+
map((label, index) => {
|
|
588
|
+
return xScale.getPixelForValue(index);
|
|
589
|
+
});
|
|
590
|
+
const segmentBoundaries = tickPositions.map((tickPos, index) => {
|
|
591
|
+
const leftBoundary = index === 0 ? left : (tickPos + tickPositions[index - 1]) / 2;
|
|
592
|
+
const rightBoundary = index === tickPositions.length - 1
|
|
593
|
+
? right
|
|
594
|
+
: (tickPos + tickPositions[index + 1]) / 2;
|
|
595
|
+
return { leftBoundary, rightBoundary };
|
|
596
|
+
});
|
|
597
|
+
const nativeEvent = event.native;
|
|
598
|
+
const boundingRect = this.chart.canvas.getBoundingClientRect();
|
|
599
|
+
const mouseHorizontalCoordinate = nativeEvent.clientX - boundingRect.left;
|
|
600
|
+
const newHoveredIndex = segmentBoundaries.findIndex((boundary) => mouseHorizontalCoordinate >= boundary.leftBoundary &&
|
|
601
|
+
mouseHorizontalCoordinate < boundary.rightBoundary);
|
|
602
|
+
if (newHoveredIndex >= 0) {
|
|
603
|
+
this._chartConfig.chartOptions.plugins = {
|
|
604
|
+
...this._chartConfig.chartOptions.plugins,
|
|
605
|
+
annotation: {
|
|
606
|
+
...this._chartConfig.chartOptions?.plugins?.annotation,
|
|
607
|
+
annotations: {
|
|
608
|
+
...this._chartConfig.
|
|
609
|
+
chartOptions?.
|
|
610
|
+
plugins?.
|
|
611
|
+
annotation?.
|
|
612
|
+
annotations,
|
|
613
|
+
[ChartPluginIdsStringEnum.X_DASHED]: {
|
|
614
|
+
...EChartAnnotation.X_DASHED,
|
|
615
|
+
value: newHoveredIndex,
|
|
616
|
+
borderColor: color || "#DADADA" /* ChartColorsStringEnum.
|
|
617
|
+
BORDER_BOTTOM_LINE_CHART_COLOR */,
|
|
618
|
+
},
|
|
557
619
|
},
|
|
558
620
|
},
|
|
559
|
-
}
|
|
560
|
-
}
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
;
|
|
624
|
+
this.hoveredIndex.emit(newHoveredIndex);
|
|
625
|
+
this.chart.update();
|
|
626
|
+
}
|
|
627
|
+
removeVerticalDashedLineAndFocus() {
|
|
628
|
+
this.hoveredIndex.emit(null);
|
|
629
|
+
if (this._chartConfig.hasVerticalDashedAnnotation)
|
|
630
|
+
this.removeVerticalDashedLine();
|
|
561
631
|
}
|
|
562
632
|
ngOnDestroy() {
|
|
563
|
-
this.
|
|
633
|
+
this.destroy$.next();
|
|
634
|
+
this.destroy$.complete();
|
|
564
635
|
}
|
|
565
636
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaChartComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ChartManagerService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
566
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
637
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CaChartComponent, isStandalone: true, selector: "app-ca-chart", inputs: { legendData: "legendData", chartId: "chartId", chartDatasetHover: "chartDatasetHover", chartConfig: "chartConfig", selectedIndex: "selectedIndex" }, outputs: { hoveredIndex: "hoveredIndex" }, viewQueries: [{ propertyName: "chartCanvas", first: true, predicate: ["chartCanvas"], descendants: true }], ngImport: i0, template: "@if (isChartDataAvailable) {\n <ng-container\n *ngTemplateOutlet=\"\n legend;\n context: {\n config: legendData,\n }\n \"\n ></ng-container>\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n} @else {\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n}\n<ng-template #legend let-config=\"config\">\n @if (config?.data) {\n <div\n [ngClass]=\"config.hasHighlightedBackground && 'colored-background'\"\n >\n @if (config.title) {\n <div class=\"legend-title font-size-14 ta-font-extra-bold\">\n {{ config.title }}\n </div>\n }\n <div class=\"legend-wrapper d-flex\">\n @for (\n item of config.data;\n let index = $index;\n track item.name\n ) {\n <div class=\"w-100\">\n <div\n class=\"d-flex align-content-center text-size-11 ta-font-bold\"\n >\n <span>{{ item?.name }}</span>\n <span\n [ngClass]=\"\n item?.isLineIndicator\n ? 'line-indicator'\n : 'circle-indicator'\n \"\n [ngStyle]=\"{ background: item?.color }\"\n ></span>\n </div>\n <div class=\"text-size-18\">\n {{\n (item?.value !== 0\n ? (item?.value | thousandSeparator)\n : 0\n ) | unitPosition: item?.unit\n }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.no-data-svg{width:100%;height:auto;max-width:100%}.legend-title{margin:6px;height:26px;line-height:26px;border-bottom:1px solid #dadada}.legend-wrapper{width:100%;min-height:46px;padding:4px 6px}.legend-wrapper .circle-indicator{height:10px;width:10px;border-radius:50px;margin:2px 4px}.legend-wrapper .line-indicator{height:2px;width:10px;margin:auto 4px}.colored-background{background-color:#eee;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: AngularSvgIconModule }, { kind: "component", type: i3.SvgIconComponent, selector: "svg-icon", inputs: ["src", "name", "stretch", "applyClass", "applyCss", "svgClass", "class", "viewBox", "svgAriaLabel", "svgStyle"] }, { kind: "pipe", type: UnitPositionPipe, name: "unitPosition" }, { kind: "pipe", type: ThousandSeparatorPipe, name: "thousandSeparator" }] }); }
|
|
567
638
|
}
|
|
568
639
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CaChartComponent, decorators: [{
|
|
569
640
|
type: Component,
|
|
570
|
-
args: [{ selector: 'app-ca-chart', standalone: true, imports: [
|
|
641
|
+
args: [{ selector: 'app-ca-chart', standalone: true, imports: [
|
|
642
|
+
CommonModule,
|
|
643
|
+
AngularSvgIconModule,
|
|
644
|
+
UnitPositionPipe,
|
|
645
|
+
ThousandSeparatorPipe,
|
|
646
|
+
], template: "@if (isChartDataAvailable) {\n <ng-container\n *ngTemplateOutlet=\"\n legend;\n context: {\n config: legendData,\n }\n \"\n ></ng-container>\n <div\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <canvas #chartCanvas></canvas>\n </div>\n} @else {\n <div\n class=\"d-flex justify-content-center align-items-center\"\n [ngStyle]=\"{\n height: _chartConfig.height + 'px',\n width: _chartConfig.width + '%',\n }\"\n >\n <svg-icon\n [src]=\"_chartConfig.noDataImage\"\n alt=\"No data available\"\n class=\"no-data-svg\"\n ></svg-icon>\n </div>\n}\n<ng-template #legend let-config=\"config\">\n @if (config?.data) {\n <div\n [ngClass]=\"config.hasHighlightedBackground && 'colored-background'\"\n >\n @if (config.title) {\n <div class=\"legend-title font-size-14 ta-font-extra-bold\">\n {{ config.title }}\n </div>\n }\n <div class=\"legend-wrapper d-flex\">\n @for (\n item of config.data;\n let index = $index;\n track item.name\n ) {\n <div class=\"w-100\">\n <div\n class=\"d-flex align-content-center text-size-11 ta-font-bold\"\n >\n <span>{{ item?.name }}</span>\n <span\n [ngClass]=\"\n item?.isLineIndicator\n ? 'line-indicator'\n : 'circle-indicator'\n \"\n [ngStyle]=\"{ background: item?.color }\"\n ></span>\n </div>\n <div class=\"text-size-18\">\n {{\n (item?.value !== 0\n ? (item?.value | thousandSeparator)\n : 0\n ) | unitPosition: item?.unit\n }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: ["@keyframes dropdown{0%{margin-top:20px;visibility:hidden;opacity:0}to{opacity:1;margin-top:10px;visibility:visible!important}}@keyframes dropup{0%{margin-top:-19px;visibility:hidden;opacity:0}to{margin-top:inherit;visibility:visible!important}}.no-data-svg{width:100%;height:auto;max-width:100%}.legend-title{margin:6px;height:26px;line-height:26px;border-bottom:1px solid #dadada}.legend-wrapper{width:100%;min-height:46px;padding:4px 6px}.legend-wrapper .circle-indicator{height:10px;width:10px;border-radius:50px;margin:2px 4px}.legend-wrapper .line-indicator{height:2px;width:10px;margin:auto 4px}.colored-background{background-color:#eee;padding:0}\n"] }]
|
|
571
647
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.ChartManagerService, decorators: [{
|
|
572
648
|
type: Optional
|
|
573
649
|
}] }], propDecorators: { chartCanvas: [{
|
|
574
650
|
type: ViewChild,
|
|
575
651
|
args: ['chartCanvas', { static: false }]
|
|
652
|
+
}], legendData: [{
|
|
653
|
+
type: Input
|
|
576
654
|
}], chartId: [{
|
|
577
655
|
type: Input
|
|
578
656
|
}], chartDatasetHover: [{
|
|
579
657
|
type: Input
|
|
580
658
|
}], chartConfig: [{
|
|
581
659
|
type: Input
|
|
660
|
+
}], selectedIndex: [{
|
|
661
|
+
type: Input
|
|
582
662
|
}], hoveredIndex: [{
|
|
583
663
|
type: Output
|
|
584
664
|
}] } });
|
|
585
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd4RCxTQUFTO0FBQ1QsT0FBTyxFQUVMLEtBQUssR0FJTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBR3pELFFBQVE7QUFDUixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QixvQkFBb0IsR0FDckIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBaUJoRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7OztBQVNuRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCLElBQ0ksaUJBQWlCLENBQUMsS0FBZ0M7UUFDcEQsSUFBSSxLQUFLO1lB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RjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzsrR0F2dEJVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLG1VQ3RFN0IsK25CQXlCQSw4R0QyQ1ksWUFBWSx1TkFBRSxvQkFBb0I7OzRGQUVqQyxnQkFBZ0I7a0JBUDVCLFNBQVM7K0JBQ0UsY0FBYyxjQUdaLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzs7MEJBMEQxQyxRQUFRO3lDQXZEa0MsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVsQyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUYsaUJBQWlCO3NCQURwQixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBa0NJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFueU9iamVjdCB9IGZyb20gJ2NoYXJ0LmpzL2Rpc3QvdHlwZXMvYmFzaWMnO1xuaW1wb3J0IHsgQW5ndWxhclN2Z0ljb25Nb2R1bGUgfSBmcm9tICdhbmd1bGFyLXN2Zy1pY29uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vLyBDaGFydHNcbmltcG9ydCB7XG4gIENhdGVnb3J5U2NhbGUsXG4gIENoYXJ0LFxuICBDaGFydEV2ZW50LFxuICBMaW5lYXJTY2FsZSxcbiAgUGx1Z2luLFxufSBmcm9tICdjaGFydC5qcy9hdXRvJztcbmltcG9ydCBhbm5vdGF0aW9uUGx1Z2luIGZyb20gJ2NoYXJ0anMtcGx1Z2luLWFubm90YXRpb24nO1xuaW1wb3J0IHsgQ2hhcnRUeXBlIH0gZnJvbSAnY2hhcnQuanMnO1xuXG4vLyBFbnVtc1xuaW1wb3J0IHtcbiAgQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLFxuICBFQ2hhcnRFdmVudFByb3BlcnRpZXMsXG4gIENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bSxcbiAgQ2hhcnRUeXBlc1N0cmluZ0VudW0sXG4gIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0sXG4gIENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0sXG4gIENoYXJ0Rm9udFByb3BlcnRpZXNTdHJpbmdFbnVtLFxuICBFQ2hhcnRBbm5vdGF0aW9uVHlwZSxcbn0gZnJvbSAnLi9lbnVtcyc7XG5cbi8vIEhlbHBlcnNcbmltcG9ydCB7IENoYXJ0SGVscGVyIH0gZnJvbSAnLi91dGlscy9oZWxwZXJzJztcblxuLy8gR3VhcmRzXG5pbXBvcnQgeyBDaGFydFR5cGVHdWFyZCB9IGZyb20gJy4vdXRpbHMvZ3VhcmRzJztcblxuLy9Nb2RlbHNcbmltcG9ydCB7XG4gIElDaGFydERhdGEsXG4gIElMaW5lRGF0YXNldCxcbiAgSUNoYXJ0Q29uZmlndXJhdGlvbixcbiAgSUJhc2VEYXRhc2V0LFxuICBJQ2hhcnRBbm5vdGF0aW9uLFxuICBJQ2hhcnREYXRhc2V0SG92ZXIsXG4gIElDaGFydENlbnRlckxhYmVsXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnQgfSBmcm9tICdjaGFydC5qcy9kaXN0L3BsdWdpbnMvcGx1Z2luLnRvb2x0aXAnO1xuXG4vL1NlcnZpY2VzXG5pbXBvcnQgeyBDaGFydE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY2EtY2hhcnQtbWFuYWdlci9zZXJ2aWNlcyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHsgQ2hhcnRDb25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jYS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEFuZ3VsYXJTdmdJY29uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdjaGFydENhbnZhcycsIHsgc3RhdGljOiBmYWxzZSB9KSBjaGFydENhbnZhcyE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgY2hhcnRJZCE6IHN0cmluZztcbiAgQElucHV0KClcbiAgc2V0IGNoYXJ0RGF0YXNldEhvdmVyKHZhbHVlOiBJQ2hhcnREYXRhc2V0SG92ZXIgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlKSB0aGlzLnVwZGF0ZURhdGFzZXRCYWNrZ3JvdW5kT25Ib3Zlcih2YWx1ZSk7XG4gIH1cbiAgQElucHV0KCkgc2V0IGNoYXJ0Q29uZmlnKHZhbHVlOiBJQ2hhcnRDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY2hhcnRDb25maWcgPSB2YWx1ZTtcbiAgICB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5fY2hhcnRDb25maWc/LlxuICAgICAgY2hhcnREYXRhPy5cbiAgICAgIGRhdGFzZXRzPy5cbiAgICAgIGZvckVhY2goKGl0ZW06IElCYXNlRGF0YXNldCkgPT4ge1xuICAgICAgICBpdGVtLmRhdGEuZm9yRWFjaCgodmFsdWU6IG51bWJlciB8IG51bWJlcltdKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0gIT09IDAgfHwgdmFsdWVbMV0gIT09IDApXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IDApXG4gICAgICAgICAgICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUpXG4gICAgICB0aGlzLnVwZGF0ZUNoYXJ0KCk7XG5cblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cy5mb3JFYWNoKChpdGVtOiBJQmFzZURhdGFzZXQpID0+IHtcbiAgICAgIGl0ZW0uZGF0YS5mb3JFYWNoKCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlWzBdICE9PSAwIHx8IHZhbHVlWzFdICE9PSAwKVxuICAgICAgICAgICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSAwKSB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBAT3V0cHV0KCkgaG92ZXJlZEluZGV4OiBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBjaGFydCE6IENoYXJ0O1xuICBwcml2YXRlIGNoYXJ0Q29udGV4dCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcGx1Z2lucz86IFBsdWdpbjxDaGFydFR5cGUsIEFueU9iamVjdD5bXTtcbiAgcHJpdmF0ZSBhcmVBbmltYXRpb25zQ29tcGxlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9ob3ZlcmVkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBfY2hhcnRDb25maWchOiBJQ2hhcnRDb25maWd1cmF0aW9uO1xuICBwdWJsaWMgaXNDaGFydERhdGFBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNoYXJ0TWFuYWdlclNlcnZpY2U/OiBDaGFydE1hbmFnZXJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhcnRNYW5hZ2VyU2VydmljZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2UuaG92ZXJTdGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgKHsgaW5kZXgsIGNoYXJ0SWQgfSkgPT4ge1xuICAgICAgICBpZiAoY2hhcnRJZCAhPT0gdGhpcy5jaGFydElkKSB7XG4gICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgaWYgKHRoaXMuY2hhcnQpIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQW5ub3RhdGlvblBsdWdpbigpOiB2b2lkIHtcbiAgICBDaGFydC5yZWdpc3Rlcihhbm5vdGF0aW9uUGx1Z2luKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVEYXRhc2V0QmFja2dyb3VuZE9uSG92ZXIoXG4gICAgY2hhcnREYXRhc2V0SG92ZXI6IElDaGFydERhdGFzZXRIb3ZlclxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnQgfHwgIXRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cykgcmV0dXJuO1xuXG4gICAgaWYgKGNoYXJ0RGF0YXNldEhvdmVyLmlzSG92ZXJkKSB7XG4gICAgICBjb25zdCBncmFkaWVudCA9IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgdGhpcy5jaGFydENhbnZhcyxcbiAgICAgICAgY2hhcnREYXRhc2V0SG92ZXIuY29sb3IsXG4gICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAwLjYsXG4gICAgICAgIDAuMSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5tYXAoKGRhdGFzZXQpID0+IHtcbiAgICAgICAgaWYgKGRhdGFzZXQuaGlkZGVuKSByZXR1cm4gZGF0YXNldDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YXNldC5sYWJlbD8udG9VcHBlckNhc2UoKSA9PT0gY2hhcnREYXRhc2V0SG92ZXIubGFiZWwudG9VcHBlckNhc2UoKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob3ZlcmREYXRhU2V0ID0ge1xuICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgIGZpbGw6IHRydWUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGdyYWRpZW50LFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaG92ZXJkRGF0YVNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcldpdGhPcGFjaXR5ID0gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgZGF0YXNldC5ib3JkZXJDb2xvciBhcyBzdHJpbmcsXG4gICAgICAgICAgICAwLjJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3JXaXRoT3BhY2l0eSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLm1hcCgoZGF0YXNldCkgPT4ge1xuICAgICAgICBpZiAoIWRhdGFzZXQuaGlkZGVuKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2xvciA9IGRhdGFzZXQuYm9yZGVyQ29sb3JcbiAgICAgICAgICAgID8gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgICBkYXRhc2V0LmJvcmRlckNvbG9yIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9yaWdpbmFsQ29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgcmV0dXJuIGRhdGFzZXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0Q29udGV4dCA9IHRoaXMuY2hhcnRDYW52YXM/LlxuICAgICAgbmF0aXZlRWxlbWVudD8uXG4gICAgICBnZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgdGhpcy5zZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5zZXRDaGFydERhdGFQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5zZXRDaGFydFBsdWdpbnNQcm9wZXJ0aWVzKCk7XG5cbiAgICBpZiAodGhpcy5jaGFydCkgdGhpcy5jaGFydC5kZXN0cm95KCk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVBbm5vdGF0aW9uUGx1Z2luKCk7XG4gICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpXG4gICAgICBDaGFydC5vdmVycmlkZXMuZG91Z2hudXQuY3V0b3V0ID0gJzgwJSc7XG4gICAgdGhpcy5jaGFydCA9IG5ldyBDaGFydCh0aGlzLmNoYXJ0Q29udGV4dCwge1xuICAgICAgdHlwZTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlLFxuICAgICAgZGF0YTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLFxuICAgICAgb3B0aW9uczogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLFxuICAgICAgcGx1Z2luczogdGhpcy5wbHVnaW5zLFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5pc0Rhc2hib2FyZENoYXJ0KSB7XG4gICAgICB0aGlzLmNoYXJ0LmNvbmZpZy5kYXRhLmRhdGFzZXRzID0gW1xuICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZz8uXG4gICAgICAgICAgY2hhcnREYXRhPy5cbiAgICAgICAgICBkYXRhc2V0cz8uXG4gICAgICAgICAgbWFwKChpdGVtOiBJQmFzZURhdGFzZXQsIGluZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgIHBvaW50QmFja2dyb3VuZENvbG9yOiBDaGFydENvbG9yc1N0cmluZ0VudW0uV0hJVEUsXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgICAgIHBvaW50UmFkaXVzOiAzLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGFydEFubm90YXRpb25zKGl0ZW0sIGluZHgpO1xuXG4gICAgICAgICAgICBjb25zdCB5U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWV9BWElTXzBdIGFzXG4gICAgICAgICAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgICAgICAgICB8IExpbmVhclNjYWxlO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhc2V0Q29uZmlnID0ge1xuICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBpdGVtLmNvbG9yLFxuICAgICAgICAgICAgICAuLi5wb2ludENvbmZpZyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOlxuICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yICYmXG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgJiZcbiAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yICE9PSBpdGVtPy5jb2xvcjIgP1xuICAgICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuY3JlYXRlR3JhZGllbnQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q2FudmFzLFxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICxcbiAgICAgICAgICAgICAgICAgICkgOiBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgZmlsbDogaXRlbT8uZmlsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXRDb25maWcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtLmJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXRlbS5zaGlmdFZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YXNldENvbmZpZyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvciAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgIT09IGl0ZW0/LmNvbG9yMiA/XG4gICAgICAgICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICxcbiAgICAgICAgICAgICAgICAgICAgKSA6IGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0VmFsdWVQeDogbnVtYmVyID0geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoaXRlbS5zaGlmdFZhbHVlIHx8IDApO1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRWYWx1ZUFkanVzdGVkOiBudW1iZXIgPVxuICAgICAgICAgICAgICBzaGlmdFZhbHVlUHggLyB5U2NhbGUubWF4SGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcjogQ2FudmFzR3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudFdpdGhTaGlmdFZhbHVlKFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgaXRlbS5jb2xvciB8fCBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFksXG4gICAgICAgICAgICAgIGl0ZW0uY29sb3IyIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgLi4ucG9pbnRDb25maWcsXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yIHx8IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWSxcbiAgICAgICAgICAgICAgICBpdGVtLmNvbG9yMiB8fCBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFksXG4gICAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgIGZpbGw6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgXTtcbiAgICB9XG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnQpXG4gICAgICB0aGlzLmNoYXJ0Py5kZXN0cm95KCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5sYWJlbHM7XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMgPSB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBjbGlwOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUHJvZ3Jlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgIGxlZnQ6XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUiAmJlxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy52ZXJ0aWNhbHlBbGlnbkJhckNoYXJ0V2l0aExpbmVDYXJ0XG4gICAgICAgICAgICAgID8gNlxuICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgcmlnaHQ6XG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkJBUiAmJlxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy52ZXJ0aWNhbHlBbGlnbkJhckNoYXJ0V2l0aExpbmVDYXJ0XG4gICAgICAgICAgICAgID8gNlxuICAgICAgICAgICAgICA6IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGx1Z2luczoge1xuICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjYWxlczoge1xuICAgICAgICB4OiB7XG4gICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3NpdGlvbjogJ2JvdHRvbScsXG4gICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICBjb2xvcjogQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlhfQVhJU19MQUJFTF9DT0xPUixcbiAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgc2l6ZTogMTEsXG4gICAgICAgICAgICAgIGZhbWlseTogQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0uRk9OVF9GQU1JTFlfTU9OVFNFUlJBVCxcbiAgICAgICAgICAgICAgd2VpZ2h0OiBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bS5GT05UX1dFSUdIVF9CT0xERVIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b1NraXA6IHRydWUsXG4gICAgICAgICAgICBhdXRvU2tpcFBhZGRpbmc6IDEyLFxuICAgICAgICAgICAgbWF4Um90YXRpb246IDAsXG4gICAgICAgICAgICBtaW5Sb3RhdGlvbjogMCxcbiAgICAgICAgICAgIC8vTGFiZWwgd3JpdHRlbiBpbiAyIGxpbmVzLCB3aWxsIGJlIHVqdXN0ZWQgd2l0aCBuZXcgZGVzaWduXG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKFxuICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgICAgICBpbmRleDogbnVtYmVyXG4gICAgICAgICAgICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2luZGV4XTtcbiAgICAgICAgICAgICAgY29uc3QgbXVsdGlMaW5lTGFiZWwgPSBsYWJlbCA/IGxhYmVsLnNwbGl0KCcgJykgOiBbXTtcbiAgICAgICAgICAgICAgcmV0dXJuIG11bHRpTGluZUxhYmVsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc3BsYXk6IHRoaXMuX2NoYXJ0Q29uZmlnLnNob3dYQXhpc0xhYmVscyxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb25Ib3ZlcjogKGV2ZW50OiBDaGFydEV2ZW50LCBpdGVtOiBBY3RpdmVFbGVtZW50W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmhhc1ZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbilcbiAgICAgICAgICB0aGlzLnJlc2V0QW5ub3RhdGlvbnMoKTtcblxuICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkge1xuICAgICAgICAgIGNvbnN0IGNvbG9yczogc3RyaW5nW10gPVxuICAgICAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgY29sb3JzLm1hcCgoY29sb3I6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gQ2hhcnRIZWxwZXIuY29udmVydFJnYlRvUmdiYShjb2xvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFpdGVtIHx8XG4gICAgICAgICAgIWl0ZW0/Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhvdmVyZWRJbmRleC5lbWl0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQoaXRlbVswXS5pbmRleCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpIHtcbiAgICAgICAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvciBhcyBzdHJpbmdbXTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkQ29sb3JzOiBzdHJpbmdbXSA9IGNvbG9ycy5tYXAoKGNvbG9yOiBzdHJpbmcsIGluZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKGluZHggPT09IGl0ZW1bMF0uaW5kZXgpIHJldHVybiBjb2xvcjtcblxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBDaGFydEhlbHBlci5jb252ZXJ0UmdiVG9SZ2JhKGNvbG9yLCAwLjIpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7XG5cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgPSB1cGRhdGVkQ29sb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmhhc1ZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbilcbiAgICAgICAgICB0aGlzLnNldFZlcnRpY2FsRGFzaGVkQW5ub3RhdGlvbkxpbmUoaXRlbVswXS5lbGVtZW50LngpO1xuXG4gICAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldENoYXJ0RGF0YVByb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkxJTkUpKSB7XG4gICAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCkgPT4ge1xuICAgICAgICBkYXRhc2V0Lm9yZGVyID0gZGF0YXNldC5vcmRlcjtcbiAgICAgICAgaWYgKENoYXJ0VHlwZUd1YXJkLmlzTGluZURhdGFzZXQoZGF0YXNldCkpIHtcbiAgICAgICAgICBkYXRhc2V0LnRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb24gPz8gMC41O1xuICAgICAgICAgIGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9XG4gICAgICAgICAgICBkYXRhc2V0LmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPz9cbiAgICAgICAgICAgIEN1YmljSW50ZXJwb2xhdGlvblN0cmluZ0VudW0uTU9OT1RPTkU7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID1cbiAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvciA/PyBDaGFydENvbG9yc1N0cmluZ0VudW0uVFJBTlNQQVJFTlQ7XG4gICAgICAgICAgZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICBkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yID8/IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5UUkFOU1BBUkVOVDtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPSBkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGggPz8gMjtcbiAgICAgICAgICBkYXRhc2V0LnNwYW5HYXBzID0gZGF0YXNldC5zcGFuR2FwcyA/PyBmYWxzZTtcbiAgICAgICAgICBkYXRhc2V0LnNob3dMaW5lID0gZGF0YXNldC5zaG93TGluZSA/PyB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0TXVsdGlwbGVZQXhpcyh0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhcnRQbHVnaW5zUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICBsZXQgaG92ZXJlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHRoaXMucGx1Z2lucyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfU0VHTUVOVF9PTl9IT1ZFUixcbiAgICAgICAgYWZ0ZXJFdmVudDogKGNoYXJ0LCBldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuc2hvd1Rvb2x0aXBCYWNrZ3JvdW5kKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50LmV2ZW50Lm5hdGl2ZSBhcyBNb3VzZUV2ZW50O1xuXG4gICAgICAgICAgaWYgKGV2ZW50LmV2ZW50LnR5cGUgPT09IENoYXJ0RXZlbnRUeXBlc1N0cmluZ0VudW0uTU9VU0VfT1VUKSB7XG4gICAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLmNoYXJ0LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTW91c2VPdXRzaWRlQ2hhcnQgPVxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRYIDwgYm91bmRpbmdSZWN0LmxlZnQgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCA+IGJvdW5kaW5nUmVjdC5yaWdodCB8fFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRZIDwgYm91bmRpbmdSZWN0LnRvcCB8fFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudC5jbGllbnRZID4gYm91bmRpbmdSZWN0LmJvdHRvbTtcblxuICAgICAgICAgICAgaWYgKGlzTW91c2VPdXRzaWRlQ2hhcnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKG51bGwsIHRoaXMuY2hhcnRJZCk7XG4gICAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IHRoaXMuY2hhcnQuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIGNvbnN0IG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPVxuICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCAtIGJvdW5kaW5nUmVjdC5sZWZ0O1xuXG4gICAgICAgICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5jaGFydC5jaGFydEFyZWE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgbGVmdCB8fFxuICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA+IHJpZ2h0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKG51bGwsIHRoaXMuY2hhcnRJZCk7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB4U2NhbGUgPSB0aGlzLmNoYXJ0LnNjYWxlc1tFQ2hhcnRFdmVudFByb3BlcnRpZXMuWF0gYXNcbiAgICAgICAgICAgIHwgQ2F0ZWdvcnlTY2FsZVxuICAgICAgICAgICAgfCBMaW5lYXJTY2FsZTtcblxuICAgICAgICAgIGNvbnN0IHRpY2tQb3NpdGlvbnMgPSB4U2NhbGUudGlja3MubWFwKCh0aWNrKSA9PlxuICAgICAgICAgICAgeFNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGljay52YWx1ZSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgc2VnbWVudEJvdW5kYXJpZXMgPSB0aWNrUG9zaXRpb25zLm1hcCgodGlja1BvcywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRCb3VuZGFyeSA9XG4gICAgICAgICAgICAgIGluZGV4ID09PSAwID8gbGVmdCA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCAtIDFdKSAvIDI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvdW5kYXJ5ID1cbiAgICAgICAgICAgICAgaW5kZXggPT09IHRpY2tQb3NpdGlvbnMubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgID8gcmlnaHRcbiAgICAgICAgICAgICAgICA6ICh0aWNrUG9zICsgdGlja1Bvc2l0aW9uc1tpbmRleCArIDFdKSAvIDI7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGxlZnRCb3VuZGFyeSwgcmlnaHRCb3VuZGFyeSB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbmV3SG92ZXJlZEluZGV4ID0gc2VnbWVudEJvdW5kYXJpZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKGJvdW5kYXJ5KSA9PlxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID49IGJvdW5kYXJ5LmxlZnRCb3VuZGFyeSAmJlxuICAgICAgICAgICAgICBtb3VzZUhvcml6b250YWxDb29yZGluYXRlIDwgYm91bmRhcnkucmlnaHRCb3VuZGFyeVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAobmV3SG92ZXJlZEluZGV4ICE9PSB0aGlzLl9ob3ZlcmVkSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IG5ld0hvdmVyZWRJbmRleCA9PT0gLTEgPyBudWxsIDogbmV3SG92ZXJlZEluZGV4O1xuICAgICAgICAgICAgdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlPy5zZXRIb3ZlclN0YXRlKFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBiZWZvcmVEcmF3OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2hvdmVyZWRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgIHNjYWxlczogeyB4OiB4U2NhbGUgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmNoYXJ0O1xuXG4gICAgICAgICAgICBDaGFydEhlbHBlci5oaWdobGlnaHRTZWdtZW50KFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgeFNjYWxlIGFzIENhdGVnb3J5U2NhbGUgfCBMaW5lYXJTY2FsZSxcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5oZWlnaHQsXG4gICAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogQ2hhcnRQbHVnaW5JZHNTdHJpbmdFbnVtLkhJR0hMSUdIVF9QT0lOVF9PTl9IT1ZFUixcbiAgICAgICAgYWZ0ZXJEcmF3OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ICE9PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLl9jaGFydENvbmZpZy5zaG93SGlnaGxpZ2h0UG9pbnRPbkhvdmVyICYmXG4gICAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlRGF0YXNldHMgPSB0aGlzLl9jaGFydENvbmZpZy5jaGFydERhdGEuZGF0YXNldHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZGF0YXNldCkgPT4gIWRhdGFzZXQuaGlkZGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ2hhcnRIZWxwZXIuaGlnaGxpZ2h0UG9pbnQoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0LFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXgsXG4gICAgICAgICAgICAgIHsgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLCBkYXRhc2V0czogdmlzaWJsZURhdGFzZXRzIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5CT1JERVJfQk9UVE9NX0xJTkVfQ0hBUlQsXG4gICAgICAgIGJlZm9yZURyYXc6ICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWc/LnNob3dCb3R0b21MaW5lT25MaW5lQ2hhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjaGFydEFyZWEsXG4gICAgICAgICAgICAgIHNjYWxlczogeyB4OiB4U2NhbGUgfSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmNoYXJ0O1xuICAgICAgICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGEuZGF0YXNldHNbMF07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSAwO1xuICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gZGF0YXNldC5kYXRhLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBkYXRhc2V0LmRhdGFbZmlyc3RJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsdWUgPSBkYXRhc2V0LmRhdGFbbGFzdEluZGV4XTtcblxuICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBsYXN0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCB4U3RhcnQgPSB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShmaXJzdEluZGV4KTtcblxuICAgICAgICAgICAgICBjb25zdCB4RW5kID0geFNjYWxlLmdldFBpeGVsRm9yVmFsdWUobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgY29uc3QgeUJvdHRvbSA9IGNoYXJ0QXJlYS5ib3R0b207XG5cbiAgICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID1cbiAgICAgICAgICAgICAgICBDaGFydENvbG9yc1N0cmluZ0VudW0uQk9SREVSX0JPVFRPTV9MSU5FX0NIQVJUX0NPTE9SO1xuICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTtcbiAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICBjdHgubW92ZVRvKHhTdGFydCwgeUJvdHRvbSk7XG4gICAgICAgICAgICAgIGN0eC5saW5lVG8oeEVuZCwgeUJvdHRvbSk7XG4gICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVClcbiAgICAgIHRoaXMucGx1Z2lucyA9IFtcbiAgICAgICAgLi4udGhpcy5wbHVnaW5zLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdkb3VnaG51dC1sYWJlbCcsXG4gICAgICAgICAgYmVmb3JlRGF0YXNldERyYXc6IChjaGFydDogQ2hhcnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNlbnRlckxhYmVscz8ubWFwKFxuICAgICAgICAgICAgICAobGFiZWw6IElDaGFydENlbnRlckxhYmVsLCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBDaGFydEhlbHBlci5kcmF3RG91Z2hudXRMZWdlbmQoXG4gICAgICAgICAgICAgICAgICBjaGFydCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaW5keCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VG9wOiBsYWJlbC5wb3NpdGlvbj8udG9wIHx8IDBcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBsYWJlbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLmZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgbGFiZWwuY29sb3IpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIF07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNoYXJ0QW5ub3RhdGlvbnMoaXRlbTogSUJhc2VEYXRhc2V0LCBpbmR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2NoYXJ0Q29uZmlnLmFubm90YXRpb25zPy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuX2NoYXJ0Q29uZmlnLlxuICAgICAgYW5ub3RhdGlvbnM/LlxuICAgICAgZm9yRWFjaCgoYW5ub3RhdGlvbjogSUNoYXJ0QW5ub3RhdGlvbiwga2V5OiBudW1iZXIpID0+IHtcbiAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMgPSB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMsXG4gICAgICAgICAgYW5ub3RhdGlvbjoge1xuICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zPy5wbHVnaW5zPy5hbm5vdGF0aW9uLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuXG4gICAgICAgICAgICAgICAgY2hhcnRPcHRpb25zPy5cbiAgICAgICAgICAgICAgICBwbHVnaW5zPy5cbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uPy5cbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgICAgICAgW2Ake2l0ZW0ubGFiZWx9LSR7aW5keH0tJHtrZXl9YF06IHtcbiAgICAgICAgICAgICAgICBpZDogYW5ub3RhdGlvbi5pZCB8fCBgYW5ub3RhdGlvbi0ke2luZHh9LSR7a2V5fWAsXG4gICAgICAgICAgICAgICAgdHlwZTogYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgIHNjYWxlSUQ6IGFubm90YXRpb24uYXhpcyB8fCBpdGVtLnlBeGlzSUQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFubm90YXRpb24udmFsdWUgfHwgaXRlbS5zaGlmdFZhbHVlLFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBhbm5vdGF0aW9uLmNvbG9yIHx8ICcjREFEQURBJyxcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogYW5ub3RhdGlvbi5ib3JkZXJXaWR0aCB8fCAyLFxuICAgICAgICAgICAgICAgIGJvcmRlckRhc2g6IGFubm90YXRpb24uYm9yZGVyRGFzaCB8fCBbMCwgMF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuXG4gIH1cblxuICBwcml2YXRlIHNldE11bHRpcGxlWUF4aXMoY2hhcnREYXRhOiBJQ2hhcnREYXRhPElMaW5lRGF0YXNldD4pOiB2b2lkIHtcbiAgICBsZXQgYWJzb2x1dGVNYXg6IG51bWJlcjtcbiAgICBjaGFydERhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZGF0YXNldC50eXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5MSU5FIHx8XG4gICAgICAgIGRhdGFzZXQudHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uQkFSXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeUF4aXNJRCA9IHRoaXMuX2NoYXJ0Q29uZmlnLmlzTXVsdGlZQXhpc1xuICAgICAgICAgID8gYHktYXhpcy0ke2luZGV4fWBcbiAgICAgICAgICA6IGRhdGFzZXQueUF4aXNJRCB8fCAneS1heGlzLTAnO1xuXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGUgZGF0YXNldCBpcyBhbGwgMFxuICAgICAgICBjb25zdCBpc0FsbFplcm9EYXRhc2V0ID0gKGRhdGFzZXQuZGF0YSBhcyBudW1iZXJbXSkuZXZlcnkoXG4gICAgICAgICAgKHZhbDogbnVtYmVyKSA9PiB2YWwgPT09IDBcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbWluVmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNaW5WYWx1ZShkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pO1xuICAgICAgICBsZXQgbWF4VmFsdWUgPSBDaGFydEhlbHBlci5jYWxjdWxhdGVNYXhWYWx1ZShkYXRhc2V0LmRhdGEgYXMgbnVtYmVyW10pO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gbWF4VmFsdWUgKiAwLjAzO1xuXG4gICAgICAgIC8vIEFkanVzdCBzY2FsaW5nIGZvciBhbGwgMCBkYXRhc2V0c1xuICAgICAgICBpZiAoaXNBbGxaZXJvRGF0YXNldCkge1xuICAgICAgICAgIG1pblZhbHVlID0gMDtcbiAgICAgICAgICBtYXhWYWx1ZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWluVmFsdWUgPSBtYXhWYWx1ZSA9PT0gbWluVmFsdWUgPyBtaW5WYWx1ZSAtIDAuMSA6IG1pblZhbHVlO1xuICAgICAgICAgIG1heFZhbHVlID1cbiAgICAgICAgICAgIG1heFZhbHVlID09PSBtaW5WYWx1ZSA/IG1heFZhbHVlICsgMC4xIDogbWF4VmFsdWUgKyBwYWRkaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnNjYWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMuc2NhbGVzLFxuICAgICAgICAgIFt5QXhpc0lEXToge1xuICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICBiZWdpbkF0WmVybzogdHJ1ZSxcbiAgICAgICAgICAgIG1pbjogbWluVmFsdWUsXG4gICAgICAgICAgICBtYXg6IG1heFZhbHVlLFxuICAgICAgICAgICAgc3RhY2tlZDogdGhpcy5fY2hhcnRDb25maWcuaXNTdGFja2VkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnREYXRhLmRhdGFzZXRzW2luZGV4XSA9IHtcbiAgICAgICAgICAuLi5kYXRhc2V0LFxuICAgICAgICAgIHlBeGlzSUQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QW5ub3RhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLnBsdWdpbnMgPVxuICAgIHtcbiAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgYW5ub3RhdGlvbjoge31cbiAgICB9XG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmVydGljYWxEYXNoZWRBbm5vdGF0aW9uTGluZSh4Q29yZDogbnVtYmVyLCBjb2xvcj86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHhTY2FsZSA9IHRoaXMuY2hhcnQuc2NhbGVzW0VDaGFydEV2ZW50UHJvcGVydGllcy5YXSBhc1xuICAgICAgfCBDYXRlZ29yeVNjYWxlXG4gICAgICB8IExpbmVhclNjYWxlO1xuXG4gICAgY29uc3QgdmFsdWVGcm9tUGl4ZWw6IG51bWJlciB8IHVuZGVmaW5lZCA9IHhTY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHhDb3JkKTtcblxuICAgIGlmICh2YWx1ZUZyb21QaXhlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMucGx1Z2lucyA9IHtcbiAgICAgIC4uLnRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0T3B0aW9ucy5wbHVnaW5zLFxuICAgICAgYW5ub3RhdGlvbjoge1xuICAgICAgICAuLi50aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnM/LnBsdWdpbnM/LmFubm90YXRpb24sXG4gICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWcuXG4gICAgICAgICAgICBjaGFydE9wdGlvbnM/LlxuICAgICAgICAgICAgcGx1Z2lucz8uXG4gICAgICAgICAgICBhbm5vdGF0aW9uPy5cbiAgICAgICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICAgIFtgeC1kYXNoZWRgXToge1xuICAgICAgICAgICAgaWQ6IGB4LWRhc2hlZGAsXG4gICAgICAgICAgICB0eXBlOiBFQ2hhcnRBbm5vdGF0aW9uVHlwZS5MSU5FLFxuICAgICAgICAgICAgc2NhbGVJRDogRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLlgsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVGcm9tUGl4ZWwsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogY29sb3IgfHwgJyNEQURBREEnLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgICAgICBib3JkZXJEYXNoOiBbNSwgNV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFydERhdGFBdmFpbGFibGU7IGVsc2Ugbm9EYXRhVGVtcGxhdGVcIj5cbiAgPGRpdlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgIH1cIlxuICA+XG4gICAgPGNhbnZhcyAjY2hhcnRDYW52YXM+PC9jYW52YXM+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI25vRGF0YVRlbXBsYXRlPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgIGhlaWdodDogX2NoYXJ0Q29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogX2NoYXJ0Q29uZmlnLndpZHRoICsgJyUnLFxuICAgIH1cIlxuICA+XG4gICAgPHN2Zy1pY29uXG4gICAgICBbc3JjXT1cIl9jaGFydENvbmZpZy5ub0RhdGFJbWFnZVwiXG4gICAgICBhbHQ9XCJObyBkYXRhIGF2YWlsYWJsZVwiXG4gICAgICBjbGFzcz1cIm5vLWRhdGEtc3ZnXCJcbiAgICA+PC9zdmctaWNvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
665
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2EtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2EtY2hhcnQvY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxTQUFTO0FBQ1QsT0FBTyxFQUVMLEtBQUssR0FJTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBR3pELFFBQVE7QUFDUixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUV4Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUU3QixnQkFBZ0IsR0FDakIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxTQUFTO0FBQ1QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBa0JoRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR25ELFFBQVE7QUFDUixPQUFPLEVB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QUFlLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxnQ0FBZ0M7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLDJCQUEyQjtZQUMvQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQWh6QlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsNlhDcEY3QixzaEZBNEVBLHdzQkRFSSxZQUFZLHdYQUNaLG9CQUFvQiw0TkFDcEIsZ0JBQWdCLGdEQUNoQixxQkFBcUI7OzRGQUdaLGdCQUFnQjtrQkFaNUIsU0FBUzsrQkFDRSxjQUFjLGNBR1osSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjtxQkFDdEI7OzBCQW9FRSxRQUFRO3lDQWpFa0MsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVsQyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSztnQkFpQ08sYUFBYTtzQkFBekIsS0FBSztnQkFTSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBbnlPYmplY3QgfSBmcm9tICdjaGFydC5qcy9kaXN0L3R5cGVzL2Jhc2ljJztcbmltcG9ydCB7IEFuZ3VsYXJTdmdJY29uTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1zdmctaWNvbic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuLy8gQ2hhcnRzXG5pbXBvcnQge1xuICBDYXRlZ29yeVNjYWxlLFxuICBDaGFydCxcbiAgQ2hhcnRFdmVudCxcbiAgTGluZWFyU2NhbGUsXG4gIFBsdWdpbixcbn0gZnJvbSAnY2hhcnQuanMvYXV0byc7XG5pbXBvcnQgYW5ub3RhdGlvblBsdWdpbiBmcm9tICdjaGFydGpzLXBsdWdpbi1hbm5vdGF0aW9uJztcbmltcG9ydCB7IENoYXJ0VHlwZSB9IGZyb20gJ2NoYXJ0LmpzJztcblxuLy8gRW51bXNcbmltcG9ydCB7XG4gIENoYXJ0Q29sb3JzU3RyaW5nRW51bSxcbiAgRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLFxuICBDaGFydFBsdWdpbklkc1N0cmluZ0VudW0sXG4gIENoYXJ0VHlwZXNTdHJpbmdFbnVtLFxuICBDdWJpY0ludGVycG9sYXRpb25TdHJpbmdFbnVtLFxuICBDaGFydEV2ZW50VHlwZXNTdHJpbmdFbnVtLFxuICBDaGFydEZvbnRQcm9wZXJ0aWVzU3RyaW5nRW51bSxcbiAgRUNoYXJ0QW5ub3RhdGlvblR5cGUsXG4gIEVDaGFydEFubm90YXRpb24sXG59IGZyb20gJy4vZW51bXMnO1xuXG4vLyBIZWxwZXJzXG5pbXBvcnQgeyBDaGFydEhlbHBlciB9IGZyb20gJy4vdXRpbHMvaGVscGVycyc7XG5cbi8vIEd1YXJkc1xuaW1wb3J0IHsgQ2hhcnRUeXBlR3VhcmQgfSBmcm9tICcuL3V0aWxzL2d1YXJkcyc7XG5cbi8vTW9kZWxzXG5pbXBvcnQge1xuICBJQ2hhcnREYXRhLFxuICBJTGluZURhdGFzZXQsXG4gIElDaGFydENvbmZpZ3VyYXRpb24sXG4gIElCYXNlRGF0YXNldCxcbiAgSUNoYXJ0QW5ub3RhdGlvbixcbiAgSUNoYXJ0RGF0YXNldEhvdmVyLFxuICBJQ2hhcnRDZW50ZXJMYWJlbCxcbiAgSUNoYXJ0TGVnZW5kQ29uZmlnXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnQgfSBmcm9tICdjaGFydC5qcy9kaXN0L3BsdWdpbnMvcGx1Z2luLnRvb2x0aXAnO1xuXG4vL1NlcnZpY2VzXG5pbXBvcnQgeyBDaGFydE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vY2EtY2hhcnQtbWFuYWdlci9zZXJ2aWNlcyc7XG5cbi8vIENvbnN0YW50c1xuaW1wb3J0IHsgQ2hhcnRDb25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBfRGVlcFBhcnRpYWxBcnJheSwgX0RlZXBQYXJ0aWFsT2JqZWN0IH0gZnJvbSAnY2hhcnQuanMvZGlzdC90eXBlcy91dGlscyc7XG5cbi8vIFBpcGVzXG5pbXBvcnQge1xuICBUaG91c2FuZFNlcGFyYXRvclBpcGUsXG4gIFVuaXRQb3NpdGlvblBpcGVcbn0gZnJvbSAnLi4vLi4vcGlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2EtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2EtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFuZ3VsYXJTdmdJY29uTW9kdWxlLFxuICAgIFVuaXRQb3NpdGlvblBpcGUsXG4gICAgVGhvdXNhbmRTZXBhcmF0b3JQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDYUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2NoYXJ0Q2FudmFzJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNoYXJ0Q2FudmFzITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBsZWdlbmREYXRhITogSUNoYXJ0TGVnZW5kQ29uZmlnO1xuICBASW5wdXQoKSBjaGFydElkITogc3RyaW5nO1xuICBASW5wdXQoKVxuICBzZXQgY2hhcnREYXRhc2V0SG92ZXIodmFsdWU6IElDaGFydERhdGFzZXRIb3ZlciB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUpIHRoaXMudXBkYXRlRGF0YXNldEJhY2tncm91bmRPbkhvdmVyKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKSBzZXQgY2hhcnRDb25maWcodmFsdWU6IElDaGFydENvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9jaGFydENvbmZpZyA9IHZhbHVlO1xuICAgIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLl9jaGFydENvbmZpZz8uXG4gICAgICBjaGFydERhdGE/LlxuICAgICAgZGF0YXNldHM/LlxuICAgICAgZm9yRWFjaCgoaXRlbTogSUJhc2VEYXRhc2V0KSA9PiB7XG4gICAgICAgIGl0ZW0uZGF0YS5mb3JFYWNoKCh2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10pID0+IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVswXSAhPT0gMCB8fCB2YWx1ZVsxXSAhPT0gMClcbiAgICAgICAgICAgICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMClcbiAgICAgICAgICAgICAgdGhpcy5pc0NoYXJ0RGF0YUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGlmICh0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKVxuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuXG4gICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzLmZvckVhY2goKGl0ZW06IElCYXNlRGF0YXNldCkgPT4ge1xuICAgICAgaXRlbS5kYXRhLmZvckVhY2goKHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVbMF0gIT09IDAgfHwgdmFsdWVbMV0gIT09IDApXG4gICAgICAgICAgICB0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IDApIHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0IHx8ICF0aGlzLmlzQ2hhcnREYXRhQXZhaWxhYmxlKSByZXR1cm47XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHRoaXMuZm9jdXNEb3VnaG51dEFyYyh2YWx1ZSk7XG4gICAgZWxzZSB0aGlzLnNldE9yaWdpbmFsRG91Z2hudXRBcmNzQ29sb3IoKTtcblxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gIH1cblxuICBAT3V0cHV0KCkgaG92ZXJlZEluZGV4OiBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBjaGFydCE6IENoYXJ0O1xuICBwcml2YXRlIGNoYXJ0Q29udGV4dCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBwbHVnaW5zPzogUGx1Z2luPENoYXJ0VHlwZSwgQW55T2JqZWN0PltdO1xuICBwcml2YXRlIGFyZUFuaW1hdGlvbnNDb21wbGVhdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2hvdmVyZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIF9jaGFydENvbmZpZyE6IElDaGFydENvbmZpZ3VyYXRpb247XG4gIHB1YmxpYyBpc0NoYXJ0RGF0YUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY2hhcnRNYW5hZ2VyU2VydmljZT86IENoYXJ0TWFuYWdlclNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFBdmFpbGFibGUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25QbHVnaW4oKTtcbiAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDaGFydE1hbmFnZXJTZXJ2aWNlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDaGFydE1hbmFnZXJTZXJ2aWNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGFydE1hbmFnZXJTZXJ2aWNlKSByZXR1cm47XG5cbiAgICB0aGlzLmNoYXJ0TWFuYWdlclNlcnZpY2UuXG4gICAgICBob3ZlclN0YXRlJC5cbiAgICAgIHBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKHsgaW5kZXgsIGNoYXJ0SWQgfSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFydElkICE9PSB0aGlzLmNoYXJ0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnQpIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFubm90YXRpb25QbHVnaW4oKTogdm9pZCB7XG4gICAgQ2hhcnQucmVnaXN0ZXIoYW5ub3RhdGlvblBsdWdpbik7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRGF0YXNldEJhY2tncm91bmRPbkhvdmVyKFxuICAgIGNoYXJ0RGF0YXNldEhvdmVyOiBJQ2hhcnREYXRhc2V0SG92ZXJcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXJ0IHx8ICF0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMpIHJldHVybjtcblxuICAgIGlmIChjaGFydERhdGFzZXRIb3Zlci5pc0hvdmVyZCkge1xuICAgICAgY29uc3QgZ3JhZGllbnQgPSBDaGFydEhlbHBlci5jcmVhdGVHcmFkaWVudChcbiAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgIGNoYXJ0RGF0YXNldEhvdmVyLmNvbG9yLFxuICAgICAgICBjaGFydERhdGFzZXRIb3Zlci5jb2xvcixcbiAgICAgICAgMC42LFxuICAgICAgICAwLjEsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMgPVxuICAgICAgICB0aGlzLmNoYXJ0Py5cbiAgICAgICAgICBkYXRhPy5cbiAgICAgICAgICBkYXRhc2V0cz8uXG4gICAgICAgICAgbWFwKChkYXRhc2V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YXNldC5oaWRkZW4pIHJldHVybiBkYXRhc2V0O1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRhdGFzZXQ/LmxhYmVsPy50b1VwcGVyQ2FzZSgpID09PVxuICAgICAgICAgICAgICBjaGFydERhdGFzZXRIb3Zlcj8ubGFiZWw/LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBob3ZlcmREYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgICAgICAgZmlsbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGdyYWRpZW50LFxuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBjaGFydERhdGFzZXRIb3Zlci5jb2xvcixcbiAgICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhvdmVyZERhdGFTZXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBib3JkZXJDb2xvcldpdGhPcGFjaXR5ID0gQ2hhcnRIZWxwZXIuY2hhbmdlT3BhY2l0eU9mUmdiT3JSZ2JhKFxuICAgICAgICAgICAgICAgIGRhdGFzZXQuYm9yZGVyQ29sb3IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIDAuMlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yV2l0aE9wYWNpdHksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9XG4gICAgICAgIHRoaXMuY2hhcnRcbiAgICAgICAgICAuZGF0YVxuICAgICAgICAgIC5kYXRhc2V0c1xuICAgICAgICAgIC5tYXAoKGRhdGFzZXQpID0+IHtcbiAgICAgICAgICAgIGlmICghZGF0YXNldC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2xvciA9IGRhdGFzZXQuYm9yZGVyQ29sb3JcbiAgICAgICAgICAgICAgICA/IENoYXJ0SGVscGVyLmNoYW5nZU9wYWNpdHlPZlJnYk9yUmdiYShcbiAgICAgICAgICAgICAgICAgIGRhdGFzZXQuYm9yZGVyQ29sb3IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IENoYXJ0Q29uc3RhbnRzLlNUUklOR19FTVBUWTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9yaWdpbmFsQ29sb3IsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgcmV0dXJuIGRhdGFzZXQ7XG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydENvbnRleHQgPSB0aGlzLmNoYXJ0Q2FudmFzPy5cbiAgICAgIG5hdGl2ZUVsZW1lbnQ/LlxuICAgICAgZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIHRoaXMuc2V0Q2hhcnRPcHRpb25zUHJvcGVydGllcygpO1xuICAgIHRoaXMuc2V0Q2hhcnREYXRhUHJvcGVydGllcygpO1xuICAgIHRoaXMuc2V0Q2hhcnRQbHVnaW5zUHJvcGVydGllcygpO1xuXG4gICAgaWYgKHRoaXMuY2hhcnQpIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplQW5ub3RhdGlvblBsdWdpbigpO1xuICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgPT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUKVxuICAgICAgQ2hhcnQub3ZlcnJpZGVzLmRvdWdobnV0LmN1dG91dCA9ICc4OCUnO1xuXG4gICAgdGhpcy5jaGFydCA9IG5ldyBDaGFydCh0aGlzLmNoYXJ0Q29udGV4dCwge1xuICAgICAgdHlwZTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlLFxuICAgICAgZGF0YTogdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLFxuICAgICAgb3B0aW9uczogdGhpcy5fY2hhcnRDb25maWcuY2hhcnRPcHRpb25zLFxuICAgICAgcGx1Z2luczogdGhpcy5wbHVnaW5zLFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLl9jaGFydENvbmZpZy5pc0Rhc2hib2FyZENoYXJ0KVxuICAgICAgdGhpcy5jaGFydC5jb25maWcuZGF0YS5kYXRhc2V0cyA9IFtcbiAgICAgICAgLi4udGhpcy5fY2hhcnRDb25maWc/LlxuICAgICAgICAgIGNoYXJ0RGF0YT8uXG4gICAgICAgICAgZGF0YXNldHM/LlxuICAgICAgICAgIG1hcCgoaXRlbTogSUJhc2VEYXRhc2V0LCBpbmR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICBwb2ludEJhY2tncm91bmRDb2xvcjogQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLldISVRFLFxuICAgICAgICAgICAgICBwb2ludEJvcmRlcldpZHRoOiAyLFxuICAgICAgICAgICAgICBwb2ludFJhZGl1czogMyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnRBbm5vdGF0aW9ucyhpdGVtLCBpbmR4KTtcblxuICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gdGhpcy5jaGFydC5zY2FsZXNbRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLllfQVhJU18wXSBhc1xuICAgICAgICAgICAgICB8IENhdGVnb3J5U2NhbGVcbiAgICAgICAgICAgICAgfCBMaW5lYXJTY2FsZTtcblxuICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgKGl0ZW0/LmNvbG9yICYmXG4gICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyKSA/XG4gICAgICAgICAgICAgICAgQ2hhcnRIZWxwZXIuY3JlYXRlR3JhZGllbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcixcbiAgICAgICAgICAgICAgICAgIGl0ZW0/LmNvbG9yMixcbiAgICAgICAgICAgICAgICApIDogaXRlbT8uY29sb3I7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFzZXRDb25maWcgPSB7XG4gICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGl0ZW0uY29sb3IsXG4gICAgICAgICAgICAgIC4uLnBvaW50Q29uZmlnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgIGZpbGw6IGl0ZW0/LmZpbGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uRE9VR0hOVVQpXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YXNldENvbmZpZyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGl0ZW0uYmFja2dyb3VuZENvbG9yXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpdGVtLnNoaWZ0VmFsdWUpXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YXNldENvbmZpZyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvciAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtPy5jb2xvcjIgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IgIT09IGl0ZW0/LmNvbG9yMiA/XG4gICAgICAgICAgICAgICAgICAgIENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50KFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRDYW52YXMsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY29sb3IyICxcbiAgICAgICAgICAgICAgICAgICAgKSA6IGl0ZW0/LmNvbG9yLFxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0VmFsdWVQeDogbnVtYmVyID0geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoaXRlbS5zaGlmdFZhbHVlIHx8IDApO1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRWYWx1ZUFkanVzdGVkOiBudW1iZXIgPVxuICAgICAgICAgICAgICBzaGlmdFZhbHVlUHggLyB5U2NhbGUubWF4SGVpZ2h0O1xuXG4gICAgICAgICAgICBjb25zdCBjb2xvcjE6IHN0cmluZyA9IGl0ZW0uY29sb3IgfHwgQ2hhcnRDb25zdGFudHMuU1RSSU5HX0VNUFRZO1xuICAgICAgICAgICAgY29uc3QgY29sb3IyOiBzdHJpbmcgPSBpdGVtLmNvbG9yMiB8fCBDaGFydENvbnN0YW50cy5TVFJJTkdfRU1QVFk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlckNvbG9yOiBDYW52YXNHcmFkaWVudCA9IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRDb250ZXh0LFxuICAgICAgICAgICAgICB5U2NhbGUubWF4SGVpZ2h0LFxuICAgICAgICAgICAgICBjb2xvcjEsXG4gICAgICAgICAgICAgIGNvbG9yMixcbiAgICAgICAgICAgICAgc2hpZnRWYWx1ZUFkanVzdGVkLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgLi4ucG9pbnRDb25maWcsXG4gICAgICAgICAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IENoYXJ0SGVscGVyLmNyZWF0ZUdyYWRpZW50V2l0aFNoaWZ0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgICAgeVNjYWxlLm1heEhlaWdodCxcbiAgICAgICAgICAgICAgICBjb2xvcjEsXG4gICAgICAgICAgICAgICAgY29sb3IyLFxuICAgICAgICAgICAgICAgIHNoaWZ0VmFsdWVBZGp1c3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICBmaWxsOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgIF07XG5cbiAgICB0aGlzLmNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFydClcbiAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydE9wdGlvbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5sYWJlbHM7XG5cbiAgICB0aGlzLl9jaGFydENvbmZpZy5jaGFydE9wdGlvbnMgPSB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICBjbGlwOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUHJvZ3Jlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFyZUFuaW1hdGlvbnNDb21wbGVhdGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT1cbiAgICAgICAgICAgIENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUID9cbiAgICAgICAgICAgIDggOlxuICAgICAgICAgICAgMCxcbiAgICAgICAgICBib3R0b206IHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT1cbiAgICAgICAgICAgIENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUID9cbiAgICAgICAgICAgIDggOlxuICAgICAgICAgICAgMCxcbiAgICAgICAgICBsZWZ0OlxuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5CQVIgJiZcbiAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcudmVydGljYWx5QWxpZ25CYXJDaGFydFdpdGhMaW5lQ2FydFxuICAgICAgICAgICAgICA/IDZcbiAgICAgICAgICAgICAgOiAwLFxuICAgICAgICAgIHJpZ2h0OlxuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5CQVIgJiZcbiAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcudmVydGljYWx5QWxpZ25CYXJDaGFydFdpdGhMaW5lQ2FydFxuICAgICAgICAgICAgICA/IDZcbiAgICAgICAgICAgICAgOiAwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzY2FsZXM6IHtcbiAgICAgICAgeDoge1xuICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgY29sb3I6IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5YX0FYSVNfTEFCRUxfQ09MT1IsXG4gICAgICAgICAgICBmb250OiB7XG4gICAgICAgICAgICAgIHNpemU6IDExLFxuICAgICAgICAgICAgICBmYW1pbHk6IENoYXJ0Rm9udFByb3BlcnRpZXNTdHJpbmdFbnVtLkZPTlRfRkFNSUxZX01PTlRTRVJSQVQsXG4gICAgICAgICAgICAgIHdlaWdodDogQ2hhcnRGb250UHJvcGVydGllc1N0cmluZ0VudW0uRk9OVF9XRUlHSFRfQk9MREVSLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9Ta2lwOiB0cnVlLFxuICAgICAgICAgICAgYXV0b1NraXBQYWRkaW5nOiAxMixcbiAgICAgICAgICAgIG1heFJvdGF0aW9uOiAwLFxuICAgICAgICAgICAgbWluUm90YXRpb246IDAsXG4gICAgICAgICAgICAvL0xhYmVsIHdyaXR0ZW4gaW4gMiBsaW5lcywgd2lsbCBiZSBhZGp1c3RlZCB3aXRoIG5ldyBkZXNpZ25cbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoXG4gICAgICAgICAgICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgICAgICAgIGluZGV4OiBudW1iZXJcbiAgICAgICAgICAgICk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICAgICAgICBjb25zdCBtdWx0aUxpbmVMYWJlbCA9IGxhYmVsID8gbGFiZWwuc3BsaXQoJyAnKSA6IFtdO1xuICAgICAgICAgICAgICByZXR1cm4gbXVsdGlMaW5lTGFiZWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzcGxheTogdGhpcy5fY2hhcnRDb25maWcuc2hvd1hBeGlzTGFiZWxzLFxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgIG9mZnNldDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgeToge1xuICAgICAgICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvbkhvdmVyOiAoZXZlbnQ6IENoYXJ0RXZlbnQsIGl0ZW06IEFjdGl2ZUVsZW1lbnRbXSkgPT4ge1xuXG4gICAgICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5oYXNWZXJ0aWNhbERhc2hlZEFubm90YXRpb24pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVZlcnRpY2FsRGFzaGVkTGluZSgpO1xuICAgICAgICAgIHRoaXMuc2V0VmVydGljYWxEYXNoZWRBbm5vdGF0aW9uTGluZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldE9yaWdpbmFsRG91Z2hudXRBcmNzQ29sb3IoKTtcblxuICAgICAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlID09PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCkge1xuICAgICAgICAgIHRoaXMuaG92ZXJlZEluZGV4LmVtaXQoaXRlbVswXT8uaW5kZXggfHwgbnVsbCk7XG5cbiAgICAgICAgICBpdGVtWzBdPy5pbmRleCA+PSAwID9cbiAgICAgICAgICAgIHRoaXMuZm9jdXNEb3VnaG51dEFyYyhpdGVtWzBdPy5pbmRleCkgOlxuICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW5hbERvdWdobnV0QXJjc0NvbG9yKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG91Z2hudXRBcmMoaW5kZXg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hhcnRDb25maWcuY2hhcnRUeXBlICE9PSBDaGFydFR5cGVzU3RyaW5nRW51bS5ET1VHSE5VVCB8fFxuICAgICAgaW5kZXggPT09IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5kYXRhLmxlbmd0aCAtIDEpIHJldHVybjtcbiAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdID0gdGhpcy5jaGFydD8uXG4gICAgICBkYXRhPy5cbiAgICAgIGRhdGFzZXRzWzBdPy5iYWNrZ3JvdW5kQ29sb3IgYXMgc3RyaW5nW107XG4gICAgY29uc3QgdXBkYXRlZENvbG9yczogc3RyaW5nW10gPSBjb2xvcnMubWFwKFxuICAgICAgKGNvbG9yOiBzdHJpbmcsIGluZHg6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAoaW5keCA9PT0gaW5kZXgpIHJldHVybiBjb2xvcjtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBDaGFydEhlbHBlci5jb252ZXJ0UmdiVG9SZ2JhKGNvbG9yLCAwLjIpO1xuICAgICAgICByZXR1cm4gY29udmVydGVkVmFsdWU7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgPSB1cGRhdGVkQ29sb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcmlnaW5hbERvdWdobnV0QXJjc0NvbG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jaGFydENvbmZpZy5jaGFydFR5cGUgIT09IENoYXJ0VHlwZXNTdHJpbmdFbnVtLkRPVUdITlVUKSByZXR1cm47XG5cbiAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdID1cbiAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3IgYXMgc3RyaW5nW107XG5cbiAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yID1cbiAgICAgIFsuLi5jb2xvcnMubWFwKChjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBDaGFydEhlbHBlci5yZ2JUb1JnYmEoY29sb3IsIDEpO1xuICAgICAgfSldO1xuXG4gICAgdGhpcy5jaGFydC51cGRhdGUoKTtcblxuICB9XG4gIHByaXZhdGUgc2V0Q2hhcnREYXRhUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0VHlwZSA9PT0gQ2hhcnRUeXBlc1N0cmluZ0VudW0uTElORSkpIHtcbiAgICAgIHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KSA9PiB7XG4gICAgICAgIGRhdGFzZXQub3JkZXIgPSBkYXRhc2V0Lm9yZGVyO1xuICAgICAgICBpZiAoQ2hhcnRUeXBlR3VhcmQuaXNMaW5lRGF0YXNldChkYXRhc2V0KSkge1xuICAgICAgICAgIGRhdGFzZXQudGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbiA/PyAwLjU7XG4gICAgICAgICAgZGF0YXNldC5jdWJpY0ludGVycG9sYXRpb25Nb2RlID1cbiAgICAgICAgICAgIGRhdGFzZXQuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA/P1xuICAgICAgICAgICAgQ3ViaWNJbnRlcnBvbGF0aW9uU3RyaW5nRW51bS5NT05PVE9ORTtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50Qm9yZGVyQ29sb3IgPVxuICAgICAgICAgICAgZGF0YXNldC5wb2ludEJvcmRlckNvbG9yID8/IENoYXJ0Q29sb3JzU3RyaW5nRW51bS5UUkFOU1BBUkVOVDtcbiAgICAgICAgICBkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgIGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IgPz8gQ2hhcnRDb2xvcnNTdHJpbmdFbnVtLlRSQU5TUEFSRU5UO1xuICAgICAgICAgIGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA9IGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCA/PyAyO1xuICAgICAgICAgIGRhdGFzZXQuc3BhbkdhcHMgPSBkYXRhc2V0LnNwYW5HYXBzID8/IGZhbHNlO1xuICAgICAgICAgIGRhdGFzZXQuc2hvd0xpbmUgPSBkYXRhc2V0LnNob3dMaW5lID8/IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRNdWx0aXBsZVlBeGlzKHRoaXMuX2NoYXJ0Q29uZmlnLmNoYXJ0RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydFBsdWdpbnNQcm9wZXJ0aWVzKCk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2lucyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfU0VHTUVOVF9PTl9IT1ZFUixcbiAgICAgICAgYWZ0ZXJFdmVudDogKGNoYXJ0LCBldmVudCkgPT4ge1xuXG4gICAgICAgICAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5ldmVudC5uYXRpdmUgYXMgTW91c2VFdmVudDtcblxuICAgICAgICAgIGlmIChldmVudC5ldmVudC50eXBlID09PSBDaGFydEV2ZW50VHlwZXNTdHJpbmdFbnVtLk1PVVNFX09VVCkge1xuICAgICAgICAgICAgY29uc3QgYm91bmRpbmdSZWN0ID0gdGhpcy5jaGFydC5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBpc01vdXNlT3V0c2lkZUNoYXJ0ID1cbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WCA8IGJvdW5kaW5nUmVjdC5sZWZ0IHx8XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFggPiBib3VuZGluZ1JlY3QucmlnaHQgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WSA8IGJvdW5kaW5nUmVjdC50b3AgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuY2xpZW50WSA+IGJvdW5kaW5nUmVjdC5ib3R0b207XG5cbiAgICAgICAgICAgIGlmIChpc01vdXNlT3V0c2lkZUNoYXJ0KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZT8uc2V0SG92ZXJTdGF0ZShudWxsLCB0aGlzLmNoYXJ0SWQpO1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVZlcnRpY2FsRGFzaGVkTGluZUFuZEZvY3VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuY2hhcnQuZHJhdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5fY2hhcnRDb25maWcuc2hvd1Rvb2x0aXBCYWNrZ3JvdW5kKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLmNoYXJ0LmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBjb25zdCBtb3VzZUhvcml6b250YWxDb29yZGluYXRlID1cbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmNsaWVudFggLSBib3VuZGluZ1JlY3QubGVmdDtcblxuICAgICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMuY2hhcnQuY2hhcnRBcmVhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA8IGxlZnQgfHxcbiAgICAgICAgICAgIG1vdXNlSG9yaXpvbnRhbENvb3JkaW5hdGUgPiByaWdodFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZT8uc2V0SG92ZXJTdGF0ZShudWxsLCB0aGlzLmNoYXJ0SWQpO1xuICAgICAgICAgICAgdGhpcy5jaGFydC5kcmF3KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeFNjYWxlID0gdGhpcy5jaGFydC5zY2FsZXNbRUNoYXJ0RXZlbnRQcm9wZXJ0aWVzLlhdIGFzXG4gICAgICAgICAgICB8IENhdGVnb3J5U2NhbGVcbiAgICAgICAgICAgIHwgTGluZWFyU2NhbGU7XG5cbiAgICAgICAgICBjb25zdCB0aWNrUG9zaXRpb25zID0geFNjYWxlLnRpY2tzLm1hcCgodGljaykgPT5cbiAgICAgICAgICAgIHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHRpY2sudmFsdWUpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHNlZ21lbnRCb3VuZGFyaWVzID0gdGlja1Bvc2l0aW9ucy5tYXAoKHRpY2tQb3MsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm91bmRhcnkgPVxuICAgICAgICAgICAgICBpbmRleCA9PT0gMCA/IGxlZnQgOiAodGlja1BvcyArIHRpY2tQb3NpdGlvbnNbaW5kZXggLSAxXSkgLyAyO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRCb3VuZGFyeSA9XG4gICAgICAgICAgICAgIGluZGV4ID09PSB0aWNrUG9zaXRpb25zLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICA/IHJpZ2h0XG4gICAgICAgICAgICAgICAgOiAodGlja1BvcyArIHRpY2tQb3NpdGlvbnNbaW5kZXggKyAxXSkgLyAyO1xuXG4gICAgICAgICAgICByZXR1cm4geyBsZWZ0Qm91bmRhcnksIHJpZ2h0Qm91bmRhcnkgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IG5ld0hvdmVyZWRJbmRleCA9IHNlZ21lbnRCb3VuZGFyaWVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChib3VuZGFyeSkgPT5cbiAgICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA+PSBib3VuZGFyeS5sZWZ0Qm91bmRhcnkgJiZcbiAgICAgICAgICAgICAgbW91c2VIb3Jpem9udGFsQ29vcmRpbmF0ZSA8IGJvdW5kYXJ5LnJpZ2h0Qm91bmRhcnlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG5ld0hvdmVyZWRJbmRleCAhPT0gdGhpcy5faG92ZXJlZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXggPSBuZXdIb3ZlcmVkSW5kZXggPT09IC0xID8gbnVsbCA6IG5ld0hvdmVyZWRJbmRleDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRNYW5hZ2VyU2VydmljZT8uc2V0SG92ZXJTdGF0ZShcbiAgICAgICAgICAgICAgdGhpcy5faG92ZXJlZEluZGV4LFxuICAgICAgICAgICAgICB0aGlzLmNoYXJ0SWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0LmRyYXcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmVmb3JlRHJhdzogKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9ob3ZlcmVkSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgY2hhcnRBcmVhLFxuICAgICAgICAgICAgICBzY2FsZXM6IHsgeDogeFNjYWxlIH0sXG4gICAgICAgICAgICB9ID0gdGhpcy5jaGFydDtcblxuICAgICAgICAgICAgQ2hhcnRIZWxwZXIuaGlnaGxpZ2h0U2VnbWVudChcbiAgICAgICAgICAgICAgdGhpcy5jaGFydENvbnRleHQsXG4gICAgICAgICAgICAgIHhTY2FsZSBhcyBDYXRlZ29yeVNjYWxlIHwgTGluZWFyU2NhbGUsXG4gICAgICAgICAgICAgIGNoYXJ0QXJlYSxcbiAgICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuaGVpZ2h0LFxuICAgICAgICAgICAgICB0aGlzLl9ob3ZlcmVkSW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IENoYXJ0UGx1Z2luSWRzU3RyaW5nRW51bS5ISUdITElHSFRfUE9JTlRfT05fSE9WRVIsXG4gICAgICAgIGFmdGVyRHJhdzogKCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWRJbmRleCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy5fY2hhcnRDb25maWcuc2hvd0hpZ2hsaWdodFBvaW50T25Ib3ZlciAmJlxuICAgICAgICAgICAgdGhpcy5hcmVBbmltYXRpb25zQ29tcGxlYXRlZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZURhdGFzZXRzID0gdGhpcy5fY2hhcnRDb25maWcuY2hhcnREYXRhLmRhdGFzZXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKGRhdGFzZXQpID0+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
|