@seniorsistemas/angular-components 17.16.4 → 17.16.6
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/bundles/seniorsistemas-angular-components.umd.js +192 -194
- package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
- package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
- package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
- package/components/panel/panel.component.d.ts +2 -2
- package/components/slider/slider.component.d.ts +19 -17
- package/esm2015/components/panel/panel.component.js +7 -7
- package/esm2015/components/slider/slider.component.js +180 -187
- package/esm5/components/panel/panel.component.js +7 -7
- package/esm5/components/slider/slider.component.js +188 -190
- package/fesm2015/seniorsistemas-angular-components.js +185 -192
- package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
- package/fesm5/seniorsistemas-angular-components.js +192 -194
- package/fesm5/seniorsistemas-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/seniorsistemas-angular-components.metadata.json +1 -1
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
var SliderComponent_1;
|
|
2
2
|
import { __decorate } from "tslib";
|
|
3
|
-
import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild
|
|
3
|
+
import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from "@angular/core";
|
|
4
4
|
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
5
5
|
let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
6
6
|
constructor() {
|
|
7
|
+
this.MAX_RANGE_VALUE = 100;
|
|
8
|
+
this.MIN_RANGE_VALUE = 0;
|
|
7
9
|
this.multiple = false;
|
|
8
10
|
this.value = 0;
|
|
9
11
|
this.valueChange = new EventEmitter();
|
|
10
12
|
this.step = 1;
|
|
11
13
|
this.hiddenThumb = false;
|
|
12
14
|
this.disabled = false;
|
|
13
|
-
this.min =
|
|
14
|
-
this.max =
|
|
15
|
+
this.min = this.MIN_RANGE_VALUE;
|
|
16
|
+
this.max = this.MAX_RANGE_VALUE;
|
|
15
17
|
this.tabindex = 0;
|
|
16
18
|
this.startValue = 0;
|
|
17
19
|
this.endValue = 0;
|
|
@@ -30,13 +32,11 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
30
32
|
* @example
|
|
31
33
|
* with min = -10 and max = 10 will have this map.
|
|
32
34
|
* {
|
|
33
|
-
* -10: {
|
|
34
|
-
* -9: {
|
|
35
|
+
* -10: { 0 },
|
|
36
|
+
* -9: { 10 },
|
|
35
37
|
* ...
|
|
36
|
-
* 10: {
|
|
38
|
+
* 10: { 10 }
|
|
37
39
|
* }
|
|
38
|
-
* the left value represent value for startValue, the right value represent value for endValue
|
|
39
|
-
* left and right values are used when applying percentages in the slider
|
|
40
40
|
*/
|
|
41
41
|
this.mapRangeValuesForSlider = new Map();
|
|
42
42
|
this.activeMouseDown = false;
|
|
@@ -49,16 +49,16 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
49
49
|
(this.multiple && this.draggingThumb === "end" && newPosition < this.startValue)) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
const positionInUserRange = this.
|
|
52
|
+
const positionInUserRange = this.getValueFromMapByValue(newPosition);
|
|
53
53
|
if (this.multiple) {
|
|
54
54
|
if (this.draggingThumb === "start") {
|
|
55
55
|
this.startValue = this.needParseValues
|
|
56
|
-
? this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
56
|
+
? this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
57
57
|
: newPosition;
|
|
58
58
|
}
|
|
59
59
|
else if (this.draggingThumb === "end") {
|
|
60
60
|
this.endValue = this.needParseValues
|
|
61
|
-
? this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
61
|
+
? this.mapRangeValuesForSlider.get(positionInUserRange)
|
|
62
62
|
: newPosition;
|
|
63
63
|
}
|
|
64
64
|
this.setValue([this.startValue, this.endValue]);
|
|
@@ -71,18 +71,15 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
else if (pickRightValue) {
|
|
82
|
-
this.endValue = this.needParseValues
|
|
83
|
-
? this.mapRangeValuesForSlider.get(positionInUserRange).right
|
|
84
|
-
: newPosition;
|
|
74
|
+
const currentValue = this.value;
|
|
75
|
+
const _value = this.needParseValues ? positionInUserRange : newPosition;
|
|
76
|
+
const isAtSameValue = this.needParseValues ? positionInUserRange === this.value : false;
|
|
77
|
+
const hasStep = this.step !== 0;
|
|
78
|
+
const newValueIsValidByStep = hasStep ? currentValue + this.step === _value || currentValue - this.step === _value : false;
|
|
79
|
+
if (isAtSameValue && !newValueIsValidByStep) {
|
|
80
|
+
return;
|
|
85
81
|
}
|
|
82
|
+
this.endValue = this.needParseValues ? this.mapRangeValuesForSlider.get(positionInUserRange) : newPosition;
|
|
86
83
|
this.startValue = this.endValue;
|
|
87
84
|
this.setValue(this.endValue);
|
|
88
85
|
}
|
|
@@ -103,20 +100,20 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
103
100
|
const startValueBeforeEvent = this.startValueBeforeProgressBarEvent;
|
|
104
101
|
const range = this.rangeBetweenElementsBeforeProgressBarEvent;
|
|
105
102
|
let { newStart, newEnd } = calculateNewRange(startValueBeforeEvent, startValueBeforeEvent + range, startPositionBeforeEvent, newCenter);
|
|
106
|
-
if (newStart <
|
|
103
|
+
if (newStart < this.MIN_RANGE_VALUE || newEnd > this.MAX_RANGE_VALUE) {
|
|
107
104
|
return;
|
|
108
105
|
}
|
|
109
106
|
if (this.needParseValues) {
|
|
110
|
-
const startValueBeforeEventUserRange = this.
|
|
111
|
-
const startPositionBeforeEventUserRange = this.
|
|
112
|
-
const centerUserRange = this.
|
|
107
|
+
const startValueBeforeEventUserRange = this.getValueFromMapByValue(startValueBeforeEvent);
|
|
108
|
+
const startPositionBeforeEventUserRange = this.getValueFromMapByValue(startPositionBeforeEvent);
|
|
109
|
+
const centerUserRange = this.getValueFromMapByValue(newCenter);
|
|
113
110
|
const valueRange = this.totalRangeBeforeProgressBarEvent;
|
|
114
111
|
let { newStart, newEnd } = calculateNewRange(startValueBeforeEventUserRange, startValueBeforeEventUserRange + valueRange, startPositionBeforeEventUserRange, centerUserRange);
|
|
115
112
|
if (newStart < this.min || newEnd > this.max) {
|
|
116
113
|
return;
|
|
117
114
|
}
|
|
118
|
-
this.startValue = this.mapRangeValuesForSlider.get(newStart)
|
|
119
|
-
this.endValue = this.mapRangeValuesForSlider.get(newEnd)
|
|
115
|
+
this.startValue = this.mapRangeValuesForSlider.get(newStart);
|
|
116
|
+
this.endValue = this.mapRangeValuesForSlider.get(newEnd);
|
|
120
117
|
}
|
|
121
118
|
else {
|
|
122
119
|
this.startValue = newStart;
|
|
@@ -138,8 +135,15 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
138
135
|
};
|
|
139
136
|
}
|
|
140
137
|
ngOnInit() {
|
|
141
|
-
|
|
138
|
+
this.setUserRangeMapValues();
|
|
139
|
+
}
|
|
140
|
+
ngOnChanges(changes) {
|
|
141
|
+
const hasChangesOnMin = changes.min && !changes.min.firstChange;
|
|
142
|
+
const hasChangesOnMax = changes.max && !changes.max.firstChange;
|
|
143
|
+
const hasChanges = hasChangesOnMin || hasChangesOnMax;
|
|
144
|
+
if (hasChanges) {
|
|
142
145
|
this.setUserRangeMapValues();
|
|
146
|
+
this.setRangeValues();
|
|
143
147
|
}
|
|
144
148
|
}
|
|
145
149
|
ngAfterViewInit() {
|
|
@@ -160,10 +164,12 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
160
164
|
}
|
|
161
165
|
}
|
|
162
166
|
get tooltipStartText() {
|
|
163
|
-
|
|
167
|
+
var _a, _b;
|
|
168
|
+
return Array.isArray(this.value) ? (_a = this.value[0]) === null || _a === void 0 ? void 0 : _a.toString() : (_b = this.value) === null || _b === void 0 ? void 0 : _b.toString();
|
|
164
169
|
}
|
|
165
170
|
get tooltipEndText() {
|
|
166
|
-
|
|
171
|
+
var _a, _b;
|
|
172
|
+
return Array.isArray(this.value) ? (_a = this.value[1]) === null || _a === void 0 ? void 0 : _a.toString() : (_b = this.value) === null || _b === void 0 ? void 0 : _b.toString();
|
|
167
173
|
}
|
|
168
174
|
writeValue(obj) {
|
|
169
175
|
this.value = obj;
|
|
@@ -188,11 +194,11 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
188
194
|
return;
|
|
189
195
|
}
|
|
190
196
|
const trackClickPercentage = this.getPercentageByEvent(evt);
|
|
191
|
-
const trackClickToUserRange = this.
|
|
197
|
+
const trackClickToUserRange = this.getValueFromMapByValue(trackClickPercentage);
|
|
192
198
|
const _trackClickValid = this.needParseValues ? trackClickToUserRange : trackClickPercentage;
|
|
193
199
|
const _setEndValue = () => {
|
|
194
|
-
const _endValueUserValue = this.
|
|
195
|
-
const _endValue = this.needParseValues ? this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
200
|
+
const _endValueUserValue = this.getValueFromMapByValue(this.endValue);
|
|
201
|
+
const _endValue = this.needParseValues ? this.mapRangeValuesForSlider.get(trackClickToUserRange) : trackClickPercentage;
|
|
196
202
|
if (this.needParseValues && _endValueUserValue !== trackClickToUserRange) {
|
|
197
203
|
this.endValue = _endValue;
|
|
198
204
|
}
|
|
@@ -201,10 +207,10 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
201
207
|
}
|
|
202
208
|
};
|
|
203
209
|
const _setStartValue = () => {
|
|
204
|
-
const _startValueUserValue = this.
|
|
210
|
+
const _startValueUserValue = this.getValueFromMapByValue(this.startValue);
|
|
205
211
|
if (this.needParseValues && _startValueUserValue !== trackClickToUserRange) {
|
|
206
212
|
const _startValue = this.needParseValues
|
|
207
|
-
? this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
213
|
+
? this.mapRangeValuesForSlider.get(trackClickToUserRange)
|
|
208
214
|
: trackClickPercentage;
|
|
209
215
|
this.startValue = _startValue;
|
|
210
216
|
}
|
|
@@ -214,8 +220,8 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
214
220
|
};
|
|
215
221
|
if (this.multiple) {
|
|
216
222
|
const [start, end] = this.value;
|
|
217
|
-
const validStart = this.needParseValues ? this.mapRangeValuesForSlider.get(start)
|
|
218
|
-
const validEnd = this.needParseValues ? this.mapRangeValuesForSlider.get(end)
|
|
223
|
+
const validStart = this.needParseValues ? this.mapRangeValuesForSlider.get(start) : start;
|
|
224
|
+
const validEnd = this.needParseValues ? this.mapRangeValuesForSlider.get(end) : end;
|
|
219
225
|
const _updateStart = () => {
|
|
220
226
|
_setStartValue();
|
|
221
227
|
this.setValue([trackClickPercentage, validEnd]);
|
|
@@ -278,11 +284,14 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
278
284
|
document.addEventListener("mouseup", this.onMouseUp);
|
|
279
285
|
}
|
|
280
286
|
setRangeValues() {
|
|
287
|
+
const _setStartAndEndValue = (startValue, endValue) => {
|
|
288
|
+
this.startValue = this.getClosestValueFromMapSlider(startValue);
|
|
289
|
+
this.endValue = this.getClosestValueFromMapSlider(endValue);
|
|
290
|
+
};
|
|
281
291
|
if (Array.isArray(this.value) && !this.multiple) {
|
|
282
292
|
throw new Error('You must use "multiple" with value as array');
|
|
283
293
|
}
|
|
284
|
-
|
|
285
|
-
if (this.multiple && Array.isArray(this.value) && !hasRangeValues) {
|
|
294
|
+
if (this.multiple && Array.isArray(this.value)) {
|
|
286
295
|
this.startValue = this.value[0];
|
|
287
296
|
this.endValue = this.value[1];
|
|
288
297
|
}
|
|
@@ -294,13 +303,40 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
294
303
|
this.endValue = this.value;
|
|
295
304
|
}
|
|
296
305
|
if (this.needParseValues) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
306
|
+
_setStartAndEndValue(this.startValue, this.endValue);
|
|
307
|
+
if (this.multiple) {
|
|
308
|
+
let [_startValue, _endValue] = this.value;
|
|
309
|
+
const difference = getDifference(_endValue, _startValue);
|
|
310
|
+
const endValueIsGreatherThanMax = _endValue > this.max;
|
|
311
|
+
const startValueIsLessThanMin = _startValue < this.min;
|
|
312
|
+
const needUpdateValues = endValueIsGreatherThanMax || startValueIsLessThanMin;
|
|
313
|
+
if (endValueIsGreatherThanMax) {
|
|
314
|
+
_endValue = this.max;
|
|
315
|
+
_startValue = _endValue - difference;
|
|
316
|
+
}
|
|
317
|
+
else if (startValueIsLessThanMin) {
|
|
318
|
+
_startValue = this.min;
|
|
319
|
+
_endValue = _startValue + difference;
|
|
320
|
+
}
|
|
321
|
+
if (needUpdateValues) {
|
|
322
|
+
_setStartAndEndValue(_startValue, _endValue);
|
|
323
|
+
this.setValue([this.startValue, this.endValue]);
|
|
324
|
+
}
|
|
301
325
|
}
|
|
302
326
|
else {
|
|
303
|
-
|
|
327
|
+
let _value = this.value;
|
|
328
|
+
const valueGreatherThanMax = _value > this.max;
|
|
329
|
+
const valueLessThanMin = _value < this.min;
|
|
330
|
+
const needUpdateValue = valueGreatherThanMax || valueLessThanMin;
|
|
331
|
+
if (valueGreatherThanMax) {
|
|
332
|
+
_value = this.max;
|
|
333
|
+
}
|
|
334
|
+
else if (valueLessThanMin) {
|
|
335
|
+
_value = this.min;
|
|
336
|
+
}
|
|
337
|
+
if (needUpdateValue) {
|
|
338
|
+
this.setValue(_value);
|
|
339
|
+
}
|
|
304
340
|
}
|
|
305
341
|
}
|
|
306
342
|
this.setProgress();
|
|
@@ -322,21 +358,20 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
322
358
|
*/
|
|
323
359
|
getPercentageByEvent(mouseEvent) {
|
|
324
360
|
const trackRect = this.track.nativeElement.getBoundingClientRect();
|
|
325
|
-
let newLeft = ((mouseEvent.clientX - trackRect.left) / trackRect.width) *
|
|
326
|
-
newLeft = Math.
|
|
327
|
-
newLeft = Math.max(0, Math.min(newLeft, 100));
|
|
361
|
+
let newLeft = Math.round(((mouseEvent.clientX - trackRect.left) / trackRect.width) * this.MAX_RANGE_VALUE);
|
|
362
|
+
newLeft = Math.max(0, Math.min(newLeft, this.MAX_RANGE_VALUE));
|
|
328
363
|
return newLeft;
|
|
329
364
|
}
|
|
330
|
-
setValue(value) {
|
|
365
|
+
setValue(value, parse = true) {
|
|
331
366
|
if (this.disabled) {
|
|
332
367
|
return;
|
|
333
368
|
}
|
|
334
|
-
if (this.needParseValues) {
|
|
369
|
+
if (this.needParseValues && parse) {
|
|
335
370
|
if (Array.isArray(value)) {
|
|
336
|
-
value = value.map((x) => this.
|
|
371
|
+
value = value.map((x) => this.getValueFromMapByValue(x));
|
|
337
372
|
}
|
|
338
373
|
else {
|
|
339
|
-
value = this.
|
|
374
|
+
value = this.getValueFromMapByValue(value);
|
|
340
375
|
}
|
|
341
376
|
}
|
|
342
377
|
this.value = value;
|
|
@@ -348,54 +383,78 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
348
383
|
setUserRangeMapValues() {
|
|
349
384
|
const start = this.min;
|
|
350
385
|
const end = this.max;
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
this.mapRangeValuesForSlider.clear();
|
|
354
|
-
const mappedValues = [];
|
|
355
|
-
for (let i = start; i <= end; i++) {
|
|
356
|
-
const valuesWithMap = [];
|
|
357
|
-
for (let j = forStart; j <= forEnd; j++) {
|
|
358
|
-
const sliderToUserRangeValue = this.mapSliderToUserRange(j);
|
|
359
|
-
if (sliderToUserRangeValue !== i) {
|
|
360
|
-
forStart = j;
|
|
361
|
-
break;
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
valuesWithMap.push(j);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
const left = valuesWithMap[0];
|
|
368
|
-
const right = valuesWithMap[valuesWithMap.length - 1];
|
|
369
|
-
mappedValues.push({ value: i, left, right });
|
|
386
|
+
if (start > end) {
|
|
387
|
+
throw new Error('Max value must be greater than min value');
|
|
370
388
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
389
|
+
this.mapRangeValuesForSlider.clear();
|
|
390
|
+
const range = end - start;
|
|
391
|
+
const decimalPlaces = 2;
|
|
392
|
+
const stepCount = Math.floor(range / this.step);
|
|
393
|
+
const values = [];
|
|
394
|
+
for (let value = start; value <= end; value += this.step) {
|
|
395
|
+
values.push(value);
|
|
396
|
+
}
|
|
397
|
+
if (values[values.length - 1] !== end) {
|
|
398
|
+
values.push(end);
|
|
399
|
+
}
|
|
400
|
+
const mappedValues = values.map((value) => {
|
|
401
|
+
let mapped = ((value - start) / range) * this.MAX_RANGE_VALUE;
|
|
402
|
+
return parseFloat(mapped.toFixed(decimalPlaces));
|
|
403
|
+
});
|
|
404
|
+
mappedValues[0] = 0;
|
|
405
|
+
mappedValues[mappedValues.length - 1] = this.MAX_RANGE_VALUE;
|
|
406
|
+
const error = this.MAX_RANGE_VALUE - mappedValues[mappedValues.length - 1];
|
|
407
|
+
const errorPerStep = error / stepCount;
|
|
408
|
+
for (let i = 1; i < mappedValues.length - 1; i++) {
|
|
409
|
+
mappedValues[i] += errorPerStep;
|
|
410
|
+
mappedValues[i] = parseFloat(mappedValues[i].toFixed(decimalPlaces));
|
|
411
|
+
}
|
|
412
|
+
values.forEach((value, index) => {
|
|
413
|
+
this.mapRangeValuesForSlider.set(value, mappedValues[index]);
|
|
374
414
|
});
|
|
375
415
|
}
|
|
376
416
|
/**
|
|
377
|
-
*
|
|
417
|
+
* Returns the user value from the given slider value by using the map of range values.
|
|
378
418
|
* @example
|
|
379
|
-
* If
|
|
419
|
+
* If the map is 0: { 0 }, 1: { 10 }, 2: { 30 }, 3: { 40 }, 4: { 50 }
|
|
420
|
+
* and the sliderValue is 37, the function returns 3
|
|
421
|
+
* or the slider value is 40, the function returns 4
|
|
422
|
+
* @param sliderValue the value of the slider (values only between range MIN and MAX)
|
|
423
|
+
* @returns the user value from the given slider value
|
|
380
424
|
*/
|
|
381
|
-
|
|
382
|
-
|
|
425
|
+
getValueFromMapByValue(sliderValue) {
|
|
426
|
+
const mapToArray = Array.from(this.mapRangeValuesForSlider).map(([value, mapped]) => ({ value, mapped }));
|
|
427
|
+
const exactValue = mapToArray.find((x) => x.mapped == sliderValue);
|
|
428
|
+
const closest = mapToArray.reduce((prev, curr) => Math.abs(curr.mapped - sliderValue) < Math.abs(prev.mapped - sliderValue) ? curr : prev);
|
|
429
|
+
return exactValue ? exactValue.value : closest.value;
|
|
383
430
|
}
|
|
384
431
|
/**
|
|
385
|
-
*
|
|
386
|
-
* @
|
|
387
|
-
*
|
|
388
|
-
* and the sliderValue is 37, the function returns 1
|
|
389
|
-
* @param sliderValue the value of the slider
|
|
390
|
-
* @returns the user value from the given slider value
|
|
432
|
+
* Retrieves the key from the map that is closest to the given slider value.
|
|
433
|
+
* @param userValue - The value to find the closest key for. (values only between 0 - 100)
|
|
434
|
+
* @returns The key that corresponds to the closest mapped value.
|
|
391
435
|
*/
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
return
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
|
|
436
|
+
getClosestValueFromMapSlider(userValue) {
|
|
437
|
+
const mapToArray = Array.from(this.mapRangeValuesForSlider).map(([value, mapped]) => ({ value, mapped }));
|
|
438
|
+
if (userValue >= this.max) {
|
|
439
|
+
return mapToArray[mapToArray.length - 1].mapped;
|
|
440
|
+
}
|
|
441
|
+
else if (userValue <= this.min) {
|
|
442
|
+
return mapToArray[0].mapped;
|
|
443
|
+
}
|
|
444
|
+
const exactValue = mapToArray.find((x) => x.value == userValue);
|
|
445
|
+
const closestValue = mapToArray.reduce((prev, curr) => Math.abs(curr.value - userValue) < Math.abs(prev.value - userValue) ? curr : prev);
|
|
446
|
+
const item = exactValue || closestValue;
|
|
447
|
+
const isFirstItem = mapToArray[0] === item;
|
|
448
|
+
const isLastItem = mapToArray[mapToArray.length - 1] === item;
|
|
449
|
+
if (isFirstItem && userValue > this.min) {
|
|
450
|
+
return getMidpoint(item.mapped, mapToArray[1].mapped);
|
|
451
|
+
}
|
|
452
|
+
else if (isLastItem && userValue < this.max) {
|
|
453
|
+
return getMidpoint(item.mapped, mapToArray[mapToArray.length - 2].mapped);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
return item.mapped;
|
|
457
|
+
}
|
|
399
458
|
}
|
|
400
459
|
handleArrowKeyLeft() {
|
|
401
460
|
if (this.multiple) {
|
|
@@ -417,6 +476,7 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
417
476
|
}
|
|
418
477
|
_incrementOrDecrementStartAndEndValue(increment) {
|
|
419
478
|
let [start, end] = this.value;
|
|
479
|
+
const difference = getDifference(end, start);
|
|
420
480
|
if (increment) {
|
|
421
481
|
start += this.step;
|
|
422
482
|
end += this.step;
|
|
@@ -425,31 +485,28 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
425
485
|
start -= this.step;
|
|
426
486
|
end -= this.step;
|
|
427
487
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
488
|
+
const startLessThanMin = start < this.min;
|
|
489
|
+
const endGreaterThanMax = end > this.max;
|
|
490
|
+
if (startLessThanMin || endGreaterThanMax) {
|
|
491
|
+
if (startLessThanMin) {
|
|
492
|
+
start = this.min;
|
|
493
|
+
end = start + difference;
|
|
431
494
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
start =
|
|
435
|
-
end = start;
|
|
436
|
-
}
|
|
437
|
-
else {
|
|
438
|
-
start = this.mapRangeValuesForSlider.get(start).left;
|
|
439
|
-
if (isEqual) {
|
|
440
|
-
end = start;
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
end = this.mapRangeValuesForSlider.get(end).right;
|
|
444
|
-
}
|
|
495
|
+
else if (endGreaterThanMax) {
|
|
496
|
+
end = this.max;
|
|
497
|
+
start = end - difference;
|
|
445
498
|
}
|
|
446
499
|
}
|
|
447
|
-
if (start <
|
|
500
|
+
if (start < this.min || end > this.max) {
|
|
448
501
|
return;
|
|
449
502
|
}
|
|
503
|
+
this.setValue([start, end], false);
|
|
504
|
+
if (this.needParseValues) {
|
|
505
|
+
start = this.getClosestValueFromMapSlider(start);
|
|
506
|
+
end = this.getClosestValueFromMapSlider(end);
|
|
507
|
+
}
|
|
450
508
|
this.startValue = start;
|
|
451
509
|
this.endValue = end;
|
|
452
|
-
this.setValue([start, end]);
|
|
453
510
|
}
|
|
454
511
|
_incrementOrDecrementEndValue(increment) {
|
|
455
512
|
let value = this.value;
|
|
@@ -461,27 +518,17 @@ let SliderComponent = SliderComponent_1 = class SliderComponent {
|
|
|
461
518
|
}
|
|
462
519
|
let _newEndValue = value;
|
|
463
520
|
if (this.needParseValues) {
|
|
464
|
-
|
|
465
|
-
if (!valueParsedInSlider) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
const pickLeft = valueParsedInSlider.right <= 50;
|
|
469
|
-
if (pickLeft) {
|
|
470
|
-
_newEndValue = this.mapRangeValuesForSlider.get(value).left;
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
_newEndValue = this.mapRangeValuesForSlider.get(value).right;
|
|
474
|
-
}
|
|
521
|
+
_newEndValue = this.getClosestValueFromMapSlider(_newEndValue);
|
|
475
522
|
}
|
|
476
|
-
if (_newEndValue <
|
|
523
|
+
if (_newEndValue < this.MIN_RANGE_VALUE || _newEndValue > this.MAX_RANGE_VALUE) {
|
|
477
524
|
return;
|
|
478
525
|
}
|
|
479
526
|
this.endValue = _newEndValue;
|
|
480
527
|
this.startValue = this.endValue;
|
|
481
|
-
this.setValue(
|
|
528
|
+
this.setValue(_newEndValue);
|
|
482
529
|
}
|
|
483
530
|
get needParseValues() {
|
|
484
|
-
return this.max !==
|
|
531
|
+
return this.max !== this.MAX_RANGE_VALUE || this.min !== this.MIN_RANGE_VALUE;
|
|
485
532
|
}
|
|
486
533
|
};
|
|
487
534
|
__decorate([
|
|
@@ -559,68 +606,14 @@ const isInRange = (value, rangeStart, rangeEnd) => {
|
|
|
559
606
|
return value >= min && value <= max;
|
|
560
607
|
};
|
|
561
608
|
const ɵ1 = isInRange;
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
* The function works by finding the gap between the last item and the penultimate item and
|
|
570
|
-
* then distributing this gap among the previous items. The distribution is done by finding
|
|
571
|
-
* the items that need to be fixed and then fixing them by shifting their left and right
|
|
572
|
-
* positions.
|
|
573
|
-
*
|
|
574
|
-
* The function returns nothing, but it modifies the mappedValues array in place.
|
|
575
|
-
*/
|
|
576
|
-
const adjustLastItem = (mappedValues) => {
|
|
577
|
-
const lastItem = mappedValues[mappedValues.length - 1];
|
|
578
|
-
const lastDifference = lastItem.right - lastItem.left;
|
|
579
|
-
const withoutLastItem = mappedValues.slice(0, mappedValues.length - 1);
|
|
580
|
-
const differences = withoutLastItem.map(({ left, right }) => right - left);
|
|
581
|
-
const averageDifference = Math.floor(differences.reduce((sum, diff) => sum + diff, 0) / differences.length);
|
|
582
|
-
const _getRandomIndexFromArray = (array, storedChanges) => {
|
|
583
|
-
if (storedChanges.length === array.length) {
|
|
584
|
-
storedChanges = [];
|
|
585
|
-
}
|
|
586
|
-
let randomIndex = Math.floor(Math.random() * array.length);
|
|
587
|
-
let randomIndexAlreadyStored = storedChanges.includes(randomIndex);
|
|
588
|
-
while (randomIndexAlreadyStored) {
|
|
589
|
-
randomIndex = Math.floor(Math.random() * withoutLastItem.length);
|
|
590
|
-
randomIndexAlreadyStored = storedChanges.includes(randomIndex);
|
|
591
|
-
}
|
|
592
|
-
storedChanges.push(randomIndex);
|
|
593
|
-
return { randomIndex, storedChanges };
|
|
594
|
-
};
|
|
595
|
-
const needFixLastItem = lastDifference < averageDifference;
|
|
596
|
-
let arr = [];
|
|
597
|
-
if (needFixLastItem) {
|
|
598
|
-
const captureItensCount = averageDifference - lastDifference;
|
|
599
|
-
let randomIndexStored = [];
|
|
600
|
-
for (let i = 0; i <= captureItensCount; i++) {
|
|
601
|
-
const { randomIndex, storedChanges } = _getRandomIndexFromArray(withoutLastItem, randomIndexStored);
|
|
602
|
-
randomIndexStored = storedChanges;
|
|
603
|
-
arr.push(randomIndex);
|
|
604
|
-
const randomItem = withoutLastItem[randomIndex];
|
|
605
|
-
--lastItem.left;
|
|
606
|
-
--randomItem.right;
|
|
607
|
-
}
|
|
608
|
-
mappedValues.forEach((mappedValue, index) => {
|
|
609
|
-
const _next = mappedValues[index + 1];
|
|
610
|
-
if (!_next) {
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
const nextLeft = _next.left;
|
|
614
|
-
const currentRight = mappedValue.right;
|
|
615
|
-
if (currentRight !== currentRight + 1) {
|
|
616
|
-
const _nextDiff = _next.right - nextLeft;
|
|
617
|
-
const _nextLeft = currentRight + 1;
|
|
618
|
-
_next.left = _nextLeft;
|
|
619
|
-
_next.right = _nextLeft + _nextDiff;
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
}
|
|
609
|
+
const getMidpoint = (start, end) => {
|
|
610
|
+
const midpoint = (start + end) / 2;
|
|
611
|
+
return parseFloat(midpoint.toFixed(2));
|
|
612
|
+
};
|
|
613
|
+
const ɵ2 = getMidpoint;
|
|
614
|
+
const getDifference = (end, start) => {
|
|
615
|
+
return Math.abs(end - start);
|
|
623
616
|
};
|
|
624
|
-
const ɵ
|
|
625
|
-
export { ɵ0, ɵ1, ɵ2 };
|
|
626
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFjekUsSUFBYSxlQUFlLHVCQUE1QixNQUFhLGVBQWU7SUFBNUI7UUFLVyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFVBQUssR0FBOEIsQ0FBQyxDQUFDO1FBR3JDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFHNUQsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUdULGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBR3BCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHakIsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUdSLFFBQUcsR0FBRyxHQUFHLENBQUM7UUFTVixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFbkIsYUFBUSxHQUErQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDaEUsY0FBUyxHQUErQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFaEUsa0JBQWEsR0FBMkIsSUFBSSxDQUFDO1FBQzdDLGtDQUE2QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLHFDQUFnQyxHQUFHLENB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TSxZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLFlBQVksS0FBSyxZQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDekMsTUFBTSxTQUFTLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDbkMsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxHQUFHLFNBQVMsQ0FBQzthQUN2QztRQUNMLENBQUMsQ0FBQyxDQUFDO0tBQ047QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInMtc2xpZGVyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9zbGlkZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vc2xpZGVyLmNvbXBvbmVudC5zY3NzXCJdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsaWRlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBAVmlld0NoaWxkKFwidHJhY2tcIilcbiAgICBwdWJsaWMgdHJhY2shOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdID0gMDtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgW251bWJlciwgbnVtYmVyXT4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHN0ZXAgPSAxO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGlkZGVuVGh1bWIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW4gPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4ID0gMTAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluVmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4VmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgcHVibGljIHN0YXJ0VmFsdWUgPSAwO1xuICAgIHB1YmxpYyBlbmRWYWx1ZSA9IDA7XG4gICAgcHVibGljIG1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgcHVibGljIHByb2dyZXNzTGVmdCA9IDA7XG4gICAgcHVibGljIHByb2dyZXNzV2lkdGggPSBcIlwiO1xuXG4gICAgcHVibGljIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwdWJsaWMgb25Ub3VjaGVkOiAodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgZHJhZ2dpbmdUaHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSAtMTtcbiAgICBwcml2YXRlIHN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgcHJpdmF0ZSByYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICBwcml2YXRlIHRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgLyoqXG4gICAgICogTWFwIG9mIHZhbGlkIHZhbHVlcyBmb3IgdmFsdWVzIGluIHJhbmdlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogd2l0aCBtaW4gPSAtMTAgYW5kIG1heCA9IDEwIHdpbGwgaGF2ZSB0aGlzIG1hcC5cbiAgICAgKiB7XG4gICAgICogICAgIC0xMDogeyBsZWZ0OiAwLCByaWdodDogMTAgfSxcbiAgICAgKiAgICAgLTk6IHsgbGVmdDogMTEsIHJpZ2h0OiAxOSB9LFxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgIDEwOiB7IGxlZnQ6IDkwLCByaWdodDogMTAwIH1cbiAgICAgKiB9XG4gICAgICogdGhlIGxlZnQgdmFsdWUgcmVwcmVzZW50IHZhbHVlIGZvciBzdGFydFZhbHVlLCB0aGUgcmlnaHQgdmFsdWUgcmVwcmVzZW50IHZhbHVlIGZvciBlbmRWYWx1ZVxuICAgICAqIGxlZnQgYW5kIHJpZ2h0IHZhbHVlcyDigIvigIthcmUgdXNlZCB3aGVuIGFwcGx5aW5nIHBlcmNlbnRhZ2VzIGluIHRoZSBzbGlkZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIG1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyOiBNYXA8bnVtYmVyLCB7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGFjdGl2ZU1vdXNlRG93biA9IGZhbHNlO1xuICAgIHByaXZhdGUgZm9jdXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnNldFVzZXJSYW5nZU1hcFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlVmFsdWVzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDprZXlkb3duXCIsIFtcIiRldmVudFwiXSlcbiAgICBwdWJsaWMgb25LZXlkb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5mb2N1c0FjdGl2ZSAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgaXNBcnJvd0tleUxlZnQgPSAkZXZlbnQua2V5ID09PSBcIkFycm93TGVmdFwiO1xuICAgICAgICAgICAgY29uc3QgaXNBcnJvd0tleVJpZ2h0ID0gJGV2ZW50LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCI7XG4gICAgICAgICAgICBpZiAoaXNBcnJvd0tleUxlZnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFycm93S2V5TGVmdCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fycm93S2V5UmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFycm93S2V5UmlnaHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcFN0YXJ0VGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5zdGFydFZhbHVlKSA6IHRoaXMuc3RhcnRWYWx1ZSkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBFbmRUZXh0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcCh0aGlzLmVuZFZhbHVlKSA6IHRoaXMuZW5kVmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgfSAgICBcblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKG9iajogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gb2JqO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRm9jdXNJbigpIHtcbiAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQmx1cigpIHtcbiAgICAgICAgdGhpcy5mb2N1c0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRyYWNrQ2xpY2soZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5tb3ZpbmdQcm9ncmVzc0JhciB8fCB0aGlzLmFjdGl2ZU1vdXNlRG93bikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYWNrQ2xpY2tQZXJjZW50YWdlID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldnQpO1xuICAgICAgICBjb25zdCB0cmFja0NsaWNrVG9Vc2VyUmFuZ2UgPSB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHRyYWNrQ2xpY2tQZXJjZW50YWdlKTtcbiAgICAgICAgY29uc3QgX3RyYWNrQ2xpY2tWYWxpZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdHJhY2tDbGlja1RvVXNlclJhbmdlIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgIGNvbnN0IF9zZXRFbmRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9lbmRWYWx1ZVVzZXJWYWx1ZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkucmlnaHQgOiB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfZW5kVmFsdWVVc2VyVmFsdWUgIT09IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSBfZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBfc2V0U3RhcnRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9zdGFydFZhbHVlVXNlclZhbHVlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcCh0aGlzLnN0YXJ0VmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzICYmIF9zdGFydFZhbHVlVXNlclZhbHVlICE9PSB0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfc3RhcnRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodHJhY2tDbGlja1RvVXNlclJhbmdlKS5sZWZ0XG4gICAgICAgICAgICAgICAgICAgIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gX3N0YXJ0VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRTdGFydCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoc3RhcnQpLmxlZnQgOiBzdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkRW5kID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChlbmQpLnJpZ2h0IDogZW5kO1xuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZVN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRTdGFydFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShbdHJhY2tDbGlja1BlcmNlbnRhZ2UsIHZhbGlkRW5kXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBfdXBkYXRlRW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRFbmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3ZhbGlkU3RhcnQsIHRyYWNrQ2xpY2tQZXJjZW50YWdlXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlID0gaXNJblJhbmdlKF90cmFja0NsaWNrVmFsaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKF90cmFja0NsaWNrVmFsaWQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfdHJhY2tDbGlja1ZhbGlkID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGlja1BlcmNlbnRhZ2VCZXR3ZWVuUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWRkbGUgPSAoc3RhcnQgKyBlbmQpIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZUlzRXhhY3RpZGRsZSA9IF90cmFja0NsaWNrVmFsaWQgPT09IG1pZGRsZTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0U3RhcnQgPSBfdHJhY2tDbGlja1ZhbGlkIDwgbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRFbmQgPSBfdHJhY2tDbGlja1ZhbGlkID4gbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldEVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qcm9ncmVzc01vdXNlRG93bihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2dCk7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1vdXNlRG93bihfOiBNb3VzZUV2ZW50LCB0aHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IHRodW1iO1xuICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJhbmdlVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCB1c2UgXCJtdWx0aXBsZVwiIHdpdGggdmFsdWUgYXMgYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoYXNSYW5nZVZhbHVlcyA9ICEhKHRoaXMuc3RhcnRWYWx1ZSAmJiB0aGlzLmVuZFZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhaGFzUmFuZ2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWVbMF07XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy52YWx1ZVsxXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VxdWFsQW5kTXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlICYmIHRoaXMuc3RhcnRWYWx1ZSA9PT0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRoaXMuc3RhcnRWYWx1ZSkubGVmdDtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsQW5kTXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodGhpcy5lbmRWYWx1ZSkucmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25UaHVtYk1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgfHwgIXRoaXMuZHJhZ2dpbmdUaHVtYikgcmV0dXJuO1xuXG4gICAgICAgIGxldCBuZXdQb3NpdGlvbiA9IHRoaXMuZ2V0UGVyY2VudGFnZUJ5RXZlbnQoZXZlbnQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiICYmIG5ld1Bvc2l0aW9uID4gdGhpcy5lbmRWYWx1ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIiAmJiBuZXdQb3NpdGlvbiA8IHRoaXMuc3RhcnRWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbkluVXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcChuZXdQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKS5yaWdodFxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcblxuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID09PSBlbmQgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBpY2tMZWZ0VmFsdWUgPSBuZXdQb3NpdGlvbiA8PSA1MDtcbiAgICAgICAgICAgIGNvbnN0IHBpY2tSaWdodFZhbHVlID0gbmV3UG9zaXRpb24gPiA1MDtcblxuICAgICAgICAgICAgaWYgKHBpY2tMZWZ0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKS5sZWZ0XG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBpY2tSaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkucmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZ1RodW1iID0gbnVsbDtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm9uVGh1bWJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50ID0gdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydDtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ID0gdGhpcy5zdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQgKyByYW5nZSxcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCxcbiAgICAgICAgICAgIG5ld0NlbnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAobmV3U3RhcnQgPCAwIHx8IG5ld0VuZCA+IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcChzdGFydFZhbHVlQmVmb3JlRXZlbnQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcChzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyVXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcChuZXdDZW50ZXIpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVSYW5nZSA9IHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgICAgICBsZXQgeyBuZXdTdGFydCwgbmV3RW5kIH0gPSBjYWxjdWxhdGVOZXdSYW5nZShcbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlICsgdmFsdWVSYW5nZSxcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgY2VudGVyVXNlclJhbmdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG5ld1N0YXJ0IDwgdGhpcy5taW4gfHwgbmV3RW5kID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChuZXdTdGFydCkubGVmdDtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChuZXdFbmQpLnJpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gbmV3U3RhcnQ7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gbmV3RW5kO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV0pO1xuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgdGhpcy5yYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgdGhpcy50b3RhbFJhbmdlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgPSBmYWxzZTtcbiAgICAgICAgfSwgMTUwKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRQcm9ncmVzcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NMZWZ0ID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1dpZHRoID0gYGNhbGMoJHt0aGlzLmVuZFZhbHVlIC0gdGhpcy5zdGFydFZhbHVlfSUgKyAxMHB4KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzTGVmdCA9IDA7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzV2lkdGggPSBgY2FsYygke3RoaXMuZW5kVmFsdWV9JSArIDEwcHgpYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcGVyY2VudGFnZSBvZiBhIG1vdXNlIGV2ZW50IGZyb20gdGhlIHRyYWNrJ3MgbGVmdCBlZGdlXG4gICAgICogQHBhcmFtIG1vdXNlRXZlbnQgbW91c2UgZXZlbnRcbiAgICAgKiBAcmV0dXJucyBwZXJjZW50YWdlIGZyb20gdGhlIGxlZnQgZWRnZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UGVyY2VudGFnZUJ5RXZlbnQobW91c2VFdmVudDogTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRyYWNrUmVjdCA9IHRoaXMudHJhY2submF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IG5ld0xlZnQgPSAoKG1vdXNlRXZlbnQuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aCkgKiAxMDA7XG4gICAgICAgIG5ld0xlZnQgPSBNYXRoLnJvdW5kKG5ld0xlZnQgLyB0aGlzLnN0ZXApICogdGhpcy5zdGVwO1xuICAgICAgICBuZXdMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obmV3TGVmdCwgMTAwKSk7XG4gICAgICAgIHJldHVybiBuZXdMZWZ0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoKHgpID0+IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoeCkpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VXNlclJhbmdlTWFwVmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMubWluO1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLm1heDtcbiAgICAgICAgbGV0IGZvclN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGZvckVuZCA9IDEwMDtcbiAgICAgICAgdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5jbGVhcigpO1xuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZXM6IHsgdmFsdWU6IG51bWJlcjsgbGVmdDogbnVtYmVyOyByaWdodDogbnVtYmVyIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlc1dpdGhNYXAgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBmb3JTdGFydDsgaiA8PSBmb3JFbmQ7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsaWRlclRvVXNlclJhbmdlVmFsdWUgPSB0aGlzLm1hcFNsaWRlclRvVXNlclJhbmdlKGopO1xuICAgICAgICAgICAgICAgIGlmIChzbGlkZXJUb1VzZXJSYW5nZVZhbHVlICE9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvclN0YXJ0ID0gajtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzV2l0aE1hcC5wdXNoKGopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB2YWx1ZXNXaXRoTWFwWzBdO1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB2YWx1ZXNXaXRoTWFwW3ZhbHVlc1dpdGhNYXAubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBtYXBwZWRWYWx1ZXMucHVzaCh7IHZhbHVlOiBpLCBsZWZ0LCByaWdodCB9KTtcbiAgICAgICAgfVxuICAgICAgICBhZGp1c3RMYXN0SXRlbShtYXBwZWRWYWx1ZXMpO1xuICAgICAgICBtYXBwZWRWYWx1ZXMuZm9yRWFjaCgobWFwcGVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuc2V0KG1hcHBlZFZhbHVlLnZhbHVlLCB7IC4uLm1hcHBlZFZhbHVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgc2xpZGVyIHZhbHVlIHRvIGEgdXNlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgW21pbiwgbWF4XS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElmIG1pbiA9IDAgYW5kIG1heCA9IDEwLCBtYXBTbGlkZXJUb1VzZXJSYW5nZSgyNSkgcmV0dXJucyAyLjVcbiAgICAgKi9cbiAgICBwcml2YXRlIG1hcFNsaWRlclRvVXNlclJhbmdlKHNsaWRlclZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5taW4gKyAoc2xpZGVyVmFsdWUgLyAxMDApICogKHRoaXMubWF4IC0gdGhpcy5taW4pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIHZhbHVlIGZyb20gdGhlIGdpdmVuIHNsaWRlciB2YWx1ZSBieSB1c2luZyB0aGUgbWFwIG9mIHJhbmdlIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElmIHRoZSBtYXAgaXMgW3t2YWx1ZTogMCwgbGVmdDogMCwgcmlnaHQ6IDI1fSwge3ZhbHVlOiAxLCBsZWZ0OiAyNSwgcmlnaHQ6IDUwfSwge3ZhbHVlOiAyLCBsZWZ0OiA1MCwgcmlnaHQ6IDc1fSwge3ZhbHVlOiAzLCBsZWZ0OiA3NSwgcmlnaHQ6IDEwMH1dXG4gICAgICogYW5kIHRoZSBzbGlkZXJWYWx1ZSBpcyAzNywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMVxuICAgICAqIEBwYXJhbSBzbGlkZXJWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNsaWRlclxuICAgICAqIEByZXR1cm5zIHRoZSB1c2VyIHZhbHVlIGZyb20gdGhlIGdpdmVuIHNsaWRlciB2YWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoc2xpZGVyVmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtYXBUb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyKS5tYXAoKHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB4WzBdLCAuLi54WzFdIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IG1hcFRvQXJyYXkuZmluZCgoeCkgPT4gaXNJblJhbmdlKHNsaWRlclZhbHVlLCB4LmxlZnQsIHgucmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZFZhbHVlPy52YWx1ZSA/PyBzbGlkZXJWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5TGVmdCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleVJpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKGluY3JlbWVudDogYm9vbGVhbikge1xuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLnN0ZXA7XG4gICAgICAgICAgICBlbmQgKz0gdGhpcy5zdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgLT0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmhhcyhzdGFydCkgfHwgIXRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuaGFzKGVuZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0VxdWFsID0gc3RhcnQgPT09IGVuZDtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsICYmIGVuZCA9PT0gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRoaXMubWF4KS5yaWdodDtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChzdGFydCkubGVmdDtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbCkge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChlbmQpLnJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHN0YXJ0O1xuICAgICAgICB0aGlzLmVuZFZhbHVlID0gZW5kO1xuICAgICAgICB0aGlzLnNldFZhbHVlKFtzdGFydCwgZW5kXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZSBhcyBudW1iZXI7XG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgX25ld0VuZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVQYXJzZWRJblNsaWRlciA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghdmFsdWVQYXJzZWRJblNsaWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBpY2tMZWZ0ID0gdmFsdWVQYXJzZWRJblNsaWRlci5yaWdodCA8PSA1MDtcbiAgICAgICAgICAgIGlmIChwaWNrTGVmdCkge1xuICAgICAgICAgICAgICAgIF9uZXdFbmRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHZhbHVlKS5sZWZ0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfbmV3RW5kVmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh2YWx1ZSkucmlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9uZXdFbmRWYWx1ZSA8IDAgfHwgX25ld0VuZFZhbHVlID4gMTAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IF9uZXdFbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLmVuZFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBuZWVkUGFyc2VWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCAhPT0gMTAwIHx8IHRoaXMubWluICE9PSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgbmV3IHJhbmdlIGJhc2VkIG9uIHRoZSBvbGQgcmFuZ2UgYW5kIHRoZSBwb3NpdGlvbnMgY2xpY2tlZCBhbmQgZmluYWxpemVkLlxuICpcbiAqIEBwYXJhbSBvbGRTdGFydCAtIFRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgb2xkIHJhbmdlLlxuICogQHBhcmFtIG9sZEVuZCAtIFRoZSBlbmRpbmcgdmFsdWUgb2YgdGhlIG9sZCByYW5nZS5cbiAqIEBwYXJhbSBjbGlja2VkUG9zaXRpb24gLSBUaGUgcG9zaXRpb24gd2hlcmUgdGhlIGNsaWNrIG9jY3VycmVkLlxuICogQHBhcmFtIGZpbmFsUG9zaXRpb24gLSBUaGUgcG9zaXRpb24gd2hlcmUgdGhlIHJhbmdlIHNob3VsZCBlbmQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IHN0YXJ0IGFuZCBlbmQgdmFsdWVzIG9mIHRoZSByYW5nZS5cbiAqL1xuY29uc3QgY2FsY3VsYXRlTmV3UmFuZ2UgPSAob2xkU3RhcnQ6IG51bWJlciwgb2xkRW5kOiBudW1iZXIsIGNsaWNrZWRQb3NpdGlvbjogbnVtYmVyLCBmaW5hbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCByYW5nZSA9IG9sZEVuZCAtIG9sZFN0YXJ0O1xuICAgIGNvbnN0IG5ld1N0YXJ0ID0gZmluYWxQb3NpdGlvbiAtIChjbGlja2VkUG9zaXRpb24gLSBvbGRTdGFydCk7XG4gICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnQgKyByYW5nZTtcbiAgICByZXR1cm4geyBuZXdTdGFydCwgbmV3RW5kIH07XG59O1xuXG5jb25zdCBpc0luUmFuZ2UgPSAodmFsdWU6IG51bWJlciwgcmFuZ2VTdGFydDogbnVtYmVyLCByYW5nZUVuZDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgW21pbiwgbWF4XSA9IHJhbmdlU3RhcnQgPCByYW5nZUVuZCA/IFtyYW5nZVN0YXJ0LCByYW5nZUVuZF0gOiBbcmFuZ2VFbmQsIHJhbmdlU3RhcnRdO1xuICAgIHJldHVybiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4O1xufTtcblxuLyoqXG4gKiBBZGp1c3QgdGhlIGxhc3QgaXRlbSBvZiBhIG1hcHBlZCByYW5nZSB0byBmaWxsIHRoZSBnYXAgYmV0d2VlbiBpdCBhbmQgdGhlIHBlbnVsdGltYXRlIGl0ZW0uXG4gKiBUaGUgZ2FwIGlzIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3RpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGFzdCBpdGVtJ3MgcmlnaHQgYW5kIGxlZnRcbiAqIGZyb20gdGhlIGF2ZXJhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGFsbCB0aGUgcHJldmlvdXMgaXRlbXMuXG4gKlxuICogQHBhcmFtIG1hcHBlZFZhbHVlcyAtIFRoZSBtYXBwZWQgcmFuZ2UgdG8gYmUgYWRqdXN0ZWQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHdvcmtzIGJ5IGZpbmRpbmcgdGhlIGdhcCBiZXR3ZWVuIHRoZSBsYXN0IGl0ZW0gYW5kIHRoZSBwZW51bHRpbWF0ZSBpdGVtIGFuZFxuICogdGhlbiBkaXN0cmlidXRpbmcgdGhpcyBnYXAgYW1vbmcgdGhlIHByZXZpb3VzIGl0ZW1zLiBUaGUgZGlzdHJpYnV0aW9uIGlzIGRvbmUgYnkgZmluZGluZ1xuICogdGhlIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBmaXhlZCBhbmQgdGhlbiBmaXhpbmcgdGhlbSBieSBzaGlmdGluZyB0aGVpciBsZWZ0IGFuZCByaWdodFxuICogcG9zaXRpb25zLlxuICpcbiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcsIGJ1dCBpdCBtb2RpZmllcyB0aGUgbWFwcGVkVmFsdWVzIGFycmF5IGluIHBsYWNlLlxuICovXG5jb25zdCBhZGp1c3RMYXN0SXRlbSA9IChtYXBwZWRWYWx1ZXM6IHsgdmFsdWU6IG51bWJlcjsgbGVmdDogbnVtYmVyOyByaWdodDogbnVtYmVyIH1bXSkgPT4ge1xuICAgIGNvbnN0IGxhc3RJdGVtID0gbWFwcGVkVmFsdWVzW21hcHBlZFZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsYXN0RGlmZmVyZW5jZSA9IGxhc3RJdGVtLnJpZ2h0IC0gbGFzdEl0ZW0ubGVmdDtcbiAgICBjb25zdCB3aXRob3V0TGFzdEl0ZW0gPSBtYXBwZWRWYWx1ZXMuc2xpY2UoMCwgbWFwcGVkVmFsdWVzLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gd2l0aG91dExhc3RJdGVtLm1hcCgoeyBsZWZ0LCByaWdodCB9KSA9PiByaWdodCAtIGxlZnQpO1xuICAgIGNvbnN0IGF2ZXJhZ2VEaWZmZXJlbmNlID0gTWF0aC5mbG9vcihkaWZmZXJlbmNlcy5yZWR1Y2UoKHN1bSwgZGlmZikgPT4gc3VtICsgZGlmZiwgMCkgLyBkaWZmZXJlbmNlcy5sZW5ndGgpO1xuXG4gICAgY29uc3QgX2dldFJhbmRvbUluZGV4RnJvbUFycmF5ID0gPFQ+KGFycmF5OiBUW10sIHN0b3JlZENoYW5nZXM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIGlmIChzdG9yZWRDaGFuZ2VzLmxlbmd0aCA9PT0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdG9yZWRDaGFuZ2VzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyYXkubGVuZ3RoKTtcbiAgICAgICAgbGV0IHJhbmRvbUluZGV4QWxyZWFkeVN0b3JlZCA9IHN0b3JlZENoYW5nZXMuaW5jbHVkZXMocmFuZG9tSW5kZXgpO1xuICAgICAgICB3aGlsZSAocmFuZG9tSW5kZXhBbHJlYWR5U3RvcmVkKSB7XG4gICAgICAgICAgICByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHdpdGhvdXRMYXN0SXRlbS5sZW5ndGgpO1xuICAgICAgICAgICAgcmFuZG9tSW5kZXhBbHJlYWR5U3RvcmVkID0gc3RvcmVkQ2hhbmdlcy5pbmNsdWRlcyhyYW5kb21JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmVkQ2hhbmdlcy5wdXNoKHJhbmRvbUluZGV4KTtcbiAgICAgICAgcmV0dXJuIHsgcmFuZG9tSW5kZXgsIHN0b3JlZENoYW5nZXMgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgbmVlZEZpeExhc3RJdGVtID0gbGFzdERpZmZlcmVuY2UgPCBhdmVyYWdlRGlmZmVyZW5jZTtcbiAgICBsZXQgYXJyID0gW107XG4gICAgaWYgKG5lZWRGaXhMYXN0SXRlbSkge1xuICAgICAgICBjb25zdCBjYXB0dXJlSXRlbnNDb3VudCA9IGF2ZXJhZ2VEaWZmZXJlbmNlIC0gbGFzdERpZmZlcmVuY2U7XG4gICAgICAgIGxldCByYW5kb21JbmRleFN0b3JlZDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY2FwdHVyZUl0ZW5zQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgeyByYW5kb21JbmRleCwgc3RvcmVkQ2hhbmdlcyB9ID0gX2dldFJhbmRvbUluZGV4RnJvbUFycmF5KHdpdGhvdXRMYXN0SXRlbSwgcmFuZG9tSW5kZXhTdG9yZWQpO1xuICAgICAgICAgICAgcmFuZG9tSW5kZXhTdG9yZWQgPSBzdG9yZWRDaGFuZ2VzO1xuICAgICAgICAgICAgYXJyLnB1c2gocmFuZG9tSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgcmFuZG9tSXRlbSA9IHdpdGhvdXRMYXN0SXRlbVtyYW5kb21JbmRleF07XG4gICAgICAgICAgICAtLWxhc3RJdGVtLmxlZnQ7XG4gICAgICAgICAgICAtLXJhbmRvbUl0ZW0ucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgbWFwcGVkVmFsdWVzLmZvckVhY2goKG1hcHBlZFZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgX25leHQgPSBtYXBwZWRWYWx1ZXNbaW5kZXggKyAxXTtcbiAgICAgICAgICAgIGlmICghX25leHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0TGVmdCA9IF9uZXh0LmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmlnaHQgPSBtYXBwZWRWYWx1ZS5yaWdodDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UmlnaHQgIT09IGN1cnJlbnRSaWdodCArIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfbmV4dERpZmYgPSBfbmV4dC5yaWdodCAtIG5leHRMZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IF9uZXh0TGVmdCA9IGN1cnJlbnRSaWdodCArIDE7XG4gICAgICAgICAgICAgICAgX25leHQubGVmdCA9IF9uZXh0TGVmdDtcbiAgICAgICAgICAgICAgICBfbmV4dC5yaWdodCA9IF9uZXh0TGVmdCArIF9uZXh0RGlmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ==
|
|
617
|
+
const ɵ3 = getDifference;
|
|
618
|
+
export { ɵ0, ɵ1, ɵ2, ɵ3 };
|
|
619
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFjekUsSUFBYSxlQUFlLHVCQUE1QixNQUFhLGVBQWU7SUFBNUI7UUFDcUIsb0JBQWUsR0FBRyxHQUFHLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFLOUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixVQUFLLEdBQThCLENBQUMsQ0FBQztRQUdyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRzVELFNBQUksR0FBRyxDQUFDLENBQUM7UUFHVCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFFBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRzNCLFFBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBUzNCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUVuQixhQUFRLEdBQStDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxjQUFTLEdBQStDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVqRSxrQkFBYSxHQUEyQixJQUFJLENBQUM7UUFDN0Msa0NBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMscUNBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsK0NBQTBDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEQscUNBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUM7Ozs7Ozs7Ozs7V0FVRztRQUNLLDRCQUF1QixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pELG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBc05wQixnQkFBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7Z0JBQUUsT0FBTztZQUUxRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFDSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxPQUFPLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2hGLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUNsRjtnQkFDRSxPQUFPO2FBQ1Y7WUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVyRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLE9BQU8sRUFBRTtvQkFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZTt3QkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7d0JBQ3ZELENBQUMsQ0FBQyxXQUFXLENBQUM7aUJBQ3JCO3FCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUU7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWU7d0JBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO3dCQUN2RCxDQUFDLENBQUMsV0FBVyxDQUFDO2lCQUNyQjtnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBeUIsQ0FBQztnQkFFcEQsSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTyxFQUFFO29CQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7aUJBQ25DO3FCQUFNLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssRUFBRTtvQkFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNuQzthQUNKO2lCQUFNO2dCQUNILE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFlLENBQUM7Z0JBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDeEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzNILElBQUksYUFBYSxJQUFJLENBQUMscUJBQXFCLEVBQUU7b0JBQ3pDLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztnQkFDM0csSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoQztZQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFTSxjQUFTLEdBQUcsR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDakMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1osQ0FBQyxDQUFDO1FBRU0sMEJBQXFCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUM7WUFDcEUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7WUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDBDQUEwQyxDQUFDO1lBQzlELElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENBQ3hDLHFCQUFxQixFQUNyQixxQkFBcUIsR0FBRyxLQUFLLEVBQzdCLHdCQUF3QixFQUN4QixTQUFTLENBQ1osQ0FBQztZQUNGLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2xFLE9BQU87YUFDVjtZQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDaEcsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7Z0JBQ3pELElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENBQ3hDLDhCQUE4QixFQUM5Qiw4QkFBOEIsR0FBRyxVQUFVLEVBQzNDLGlDQUFpQyxFQUNqQyxlQUFlLENBQ2xCLENBQUM7Z0JBQ0YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDMUMsT0FBTztpQkFDVjtnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1RDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7YUFDMUI7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBRU0sNkJBQXdCLEdBQUcsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLDBDQUEwQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdkUsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQ25DLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQztJQWlNTixDQUFDO0lBaGdCVSxRQUFRO1FBQ1gsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFzQjtRQUNyQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDaEUsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLGVBQWUsSUFBSSxlQUFlLENBQUM7UUFDdEQsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBQ00sZUFBZTtRQUNsQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUdNLFNBQVMsQ0FBQyxNQUFxQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3BDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDO1lBQ2xELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssWUFBWSxDQUFDO1lBQ3BELElBQUksY0FBYyxFQUFFO2dCQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM3QjtpQkFBTSxJQUFJLGVBQWUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDOUI7U0FDSjtJQUNMLENBQUM7SUFFRCxJQUFXLGdCQUFnQjs7UUFDdkIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMENBQUUsUUFBUSxHQUFHLENBQUMsT0FBQyxJQUFJLENBQUMsS0FBSywwQ0FBRSxRQUFRLEVBQUUsQ0FBQztJQUMxRixDQUFDO0lBRUQsSUFBVyxjQUFjOztRQUNyQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxRQUFRLEdBQUcsQ0FBQyxPQUFDLElBQUksQ0FBQyxLQUFLLDBDQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFFTSxVQUFVLENBQUMsR0FBOEI7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDckIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQThDO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUFjO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRU0sU0FBUztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFTSxNQUFNO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVNLFlBQVksQ0FBQyxHQUFpQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDakUsT0FBTztTQUNWO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztRQUM3RixNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUM7WUFDeEgsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLGtCQUFrQixLQUFLLHFCQUFxQixFQUFFO2dCQUN0RSxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQzthQUM3QjtpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQzthQUN4QztRQUNMLENBQUMsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtZQUN4QixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUUsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLG9CQUFvQixLQUFLLHFCQUFxQixFQUFFO2dCQUN4RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZTtvQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7YUFDakM7aUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLENBQUM7YUFDMUM7UUFDTCxDQUFDLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUF5QixDQUFDO1lBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDcEYsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFO2dCQUN0QixjQUFjLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixZQUFZLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUM7WUFDRixNQUFNLDJCQUEyQixHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUUsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLEVBQUU7Z0JBQzFCLFlBQVksRUFBRSxDQUFDO2FBQ2xCO2lCQUFNLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxFQUFFO2dCQUMvQixVQUFVLEVBQUUsQ0FBQzthQUNoQjtpQkFBTSxJQUFJLDJCQUEyQixFQUFFO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sZ0NBQWdDLEdBQUcsZ0JBQWdCLEtBQUssTUFBTSxDQUFDO2dCQUNyRSxJQUFJLGdDQUFnQyxFQUFFO29CQUNsQyxZQUFZLEVBQUUsQ0FBQztpQkFDbEI7cUJBQU07b0JBQ0gsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO29CQUMzQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7b0JBQ3pDLElBQUksUUFBUSxFQUFFO3dCQUNWLFlBQVksRUFBRSxDQUFDO3FCQUNsQjt5QkFBTSxJQUFJLE1BQU0sRUFBRTt3QkFDZixVQUFVLEVBQUUsQ0FBQztxQkFDaEI7aUJBQ0o7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDcEMsWUFBWSxFQUFFLENBQUM7U0FDbEI7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEdBQWlCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakMsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4RCxJQUFJLENBQUMsMENBQTBDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQXlCLENBQUM7WUFDcEQsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7U0FDdkQ7UUFDRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ25FLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLFdBQVcsQ0FBQyxDQUFhLEVBQUUsS0FBc0I7UUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLGNBQWM7UUFDbEIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFVBQWtCLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO1lBQ2xFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQTtRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBZSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQWUsQ0FBQztTQUN4QztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBeUIsQ0FBQztnQkFDOUQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDekQsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDdkQsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDdkQsTUFBTSxnQkFBZ0IsR0FBRyx5QkFBeUIsSUFBSSx1QkFBdUIsQ0FBQztnQkFDOUUsSUFBSSx5QkFBeUIsRUFBRTtvQkFDM0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQ3JCLFdBQVcsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO2lCQUN4QztxQkFBTSxJQUFJLHVCQUF1QixFQUFFO29CQUNoQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDdkIsU0FBUyxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7aUJBQ3hDO2dCQUNELElBQUksZ0JBQWdCLEVBQUU7b0JBQ2xCLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ25EO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQWUsQ0FBQztnQkFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDM0MsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLElBQUksZ0JBQWdCLENBQUM7Z0JBQ2pFLElBQUksb0JBQW9CLEVBQUU7b0JBQ3RCLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO2lCQUNyQjtxQkFBTSxJQUFJLGdCQUFnQixFQUFFO29CQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDckI7Z0JBQ0QsSUFBSSxlQUFlLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3pCO2FBQ0o7U0FDSjtRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBK0dPLFdBQVc7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsV0FBVyxDQUFDO1NBQzNFO2FBQU07WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsSUFBSSxDQUFDLFFBQVEsV0FBVyxDQUFDO1NBQ3pEO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxvQkFBb0IsQ0FBQyxVQUFxQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ25FLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0csT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBZ0MsRUFBRSxLQUFLLEdBQUcsSUFBSTtRQUMzRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxFQUFFO1lBQy9CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBcUIsQ0FBQzthQUNoRjtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlDO1NBQ0o7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM5RCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLHNCQUFzQixDQUFDLFdBQW1CO1FBQzlDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0ksT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw0QkFBNEIsQ0FBQyxTQUFpQjtRQUNsRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO1NBQ2xEO2FBQU0sSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7U0FDOUI7UUFDRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFJLE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxZQUFZLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDOUQsSUFBSSxXQUFXLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekQ7YUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUMzQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdFO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBR08sa0JBQWtCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLHFDQUFxQyxDQUFDLFNBQWtCO1FBQzVELElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQXlCLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLFNBQVMsRUFBRTtZQUNYLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3BCO2FBQU07WUFDSCxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQjtRQUNELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN6QyxJQUFJLGdCQUFnQixJQUFJLGlCQUFpQixFQUFFO1lBQ3ZDLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ2xCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUNqQixHQUFHLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQzthQUM1QjtpQkFBTSxJQUFJLGlCQUFpQixFQUFFO2dCQUMxQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDZixLQUFLLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQzthQUM1QjtTQUNKO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixLQUFLLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pELEdBQUcsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRU8sNkJBQTZCLENBQUMsU0FBa0I7UUFDcEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQWUsQ0FBQztRQUNqQyxJQUFJLFNBQVMsRUFBRTtZQUNYLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3RCO2FBQU07WUFDSCxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztTQUN0QjtRQUNELElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDNUUsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVksZUFBZTtRQUN2QixPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbEYsQ0FBQztDQUNKLENBQUE7QUFoa0JHO0lBREMsU0FBUyxDQUFDLE9BQU8sQ0FBQzs4Q0FDTztBQUcxQjtJQURDLEtBQUssRUFBRTtpREFDZ0I7QUFHeEI7SUFEQyxLQUFLLEVBQUU7OENBQ29DO0FBRzVDO0lBREMsTUFBTSxFQUFFO29EQUMwRDtBQUduRTtJQURDLEtBQUssRUFBRTs2Q0FDUTtBQUdoQjtJQURDLEtBQUssRUFBRTtvREFDbUI7QUFHM0I7SUFEQyxLQUFLLEVBQUU7aURBQ2dCO0FBR3hCO0lBREMsS0FBSyxFQUFFOzRDQUMwQjtBQUdsQztJQURDLEtBQUssRUFBRTs0Q0FDMEI7QUFHbEM7SUFEQyxLQUFLLEVBQUU7c0RBQ3FCO0FBRzdCO0lBREMsS0FBSyxFQUFFO3NEQUNxQjtBQUc3QjtJQURDLEtBQUssRUFBRTtpREFDWTtBQW1EcEI7SUFEQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnREFXNUM7QUFsR1EsZUFBZTtJQVozQixTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsVUFBVTtRQUNwQix5dkNBQXNDO1FBRXRDLFNBQVMsRUFBRTtZQUNQO2dCQUNJLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKOztLQUNKLENBQUM7R0FDVyxlQUFlLENBb2tCM0I7U0Fwa0JZLGVBQWU7QUFza0I1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxlQUF1QixFQUFFLGFBQXFCLEVBQUUsRUFBRTtJQUMzRyxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLGFBQWEsR0FBRyxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDaEMsQ0FBQyxDQUFDOztBQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLFVBQWtCLEVBQUUsUUFBZ0IsRUFBVyxFQUFFO0lBQy9FLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNGLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3hDLENBQUMsQ0FBQzs7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQTs7QUFDRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUNqRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJzLXNsaWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc2xpZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3NsaWRlci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SQU5HRV9WQUxVRSA9IDEwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1JTl9SQU5HRV9WQUxVRSA9IDA7XG4gICAgQFZpZXdDaGlsZChcInRyYWNrXCIpXG4gICAgcHVibGljIHRyYWNrITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSA9IDA7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGVwID0gMTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGRlblRodW1iID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gdGhpcy5NSU5fUkFOR0VfVkFMVUU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXggPSB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pblZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIHB1YmxpYyBzdGFydFZhbHVlID0gMDtcbiAgICBwdWJsaWMgZW5kVmFsdWUgPSAwO1xuICAgIHB1YmxpYyBtb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcm9ncmVzc0xlZnQgPSAwO1xuICAgIHB1YmxpYyBwcm9ncmVzc1dpZHRoID0gXCJcIjtcblxuICAgIHB1YmxpYyBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuICAgIHB1YmxpYyBvblRvdWNoZWQ6ICh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIHByaXZhdGUgZHJhZ2dpbmdUaHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSAtMTtcbiAgICBwcml2YXRlIHN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgcHJpdmF0ZSByYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICBwcml2YXRlIHRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgLyoqXG4gICAgICogTWFwIG9mIHZhbGlkIHZhbHVlcyBmb3IgdmFsdWVzIGluIHJhbmdlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogd2l0aCBtaW4gPSAtMTAgYW5kIG1heCA9IDEwIHdpbGwgaGF2ZSB0aGlzIG1hcC5cbiAgICAgKiB7XG4gICAgICogICAgIC0xMDogeyAwIH0sXG4gICAgICogICAgIC05OiB7IDEwIH0sXG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgMTA6IHsgMTAgfVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBwcml2YXRlIG1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgYWN0aXZlTW91c2VEb3duID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBmb2N1c0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFVzZXJSYW5nZU1hcFZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZXNPbk1pbiA9IGNoYW5nZXMubWluICYmICFjaGFuZ2VzLm1pbi5maXJzdENoYW5nZTtcbiAgICAgICAgY29uc3QgaGFzQ2hhbmdlc09uTWF4ID0gY2hhbmdlcy5tYXggJiYgIWNoYW5nZXMubWF4LmZpcnN0Q2hhbmdlO1xuICAgICAgICBjb25zdCBoYXNDaGFuZ2VzID0gaGFzQ2hhbmdlc09uTWluIHx8IGhhc0NoYW5nZXNPbk1heDtcbiAgICAgICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlclJhbmdlTWFwVmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlVmFsdWVzKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmtleWRvd25cIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbktleWRvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzQWN0aXZlICYmICF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5TGVmdCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dMZWZ0XCI7XG4gICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5UmlnaHQgPSAkZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIjtcbiAgICAgICAgICAgIGlmIChpc0Fycm93S2V5TGVmdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJyb3dLZXlMZWZ0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyb3dLZXlSaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJyb3dLZXlSaWdodCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwU3RhcnRUZXh0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0/LnRvU3RyaW5nKCkgOiB0aGlzLnZhbHVlPy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcEVuZFRleHQoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVsxXT8udG9TdHJpbmcoKSA6IHRoaXMudmFsdWU/LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1c0luKCkge1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhY2tDbGljayhldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8IHRoaXMuYWN0aXZlTW91c2VEb3duKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2UgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2dCk7XG4gICAgICAgIGNvbnN0IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgIGNvbnN0IF90cmFja0NsaWNrVmFsaWQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICBjb25zdCBfc2V0RW5kVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkgOiB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfZW5kVmFsdWVVc2VyVmFsdWUgIT09IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSBfZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBfc2V0U3RhcnRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9zdGFydFZhbHVlVXNlclZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHRoaXMuc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgX3N0YXJ0VmFsdWVVc2VyVmFsdWUgIT09IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9zdGFydFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gX3N0YXJ0VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRTdGFydCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoc3RhcnQpIDogc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEVuZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKSA6IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IF91cGRhdGVTdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0U3RhcnRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RyYWNrQ2xpY2tQZXJjZW50YWdlLCB2YWxpZEVuZF0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt2YWxpZFN0YXJ0LCB0cmFja0NsaWNrUGVyY2VudGFnZV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrUGVyY2VudGFnZUJldHdlZW5SYW5nZSA9IGlzSW5SYW5nZShfdHJhY2tDbGlja1ZhbGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChfdHJhY2tDbGlja1ZhbGlkIDwgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RyYWNrQ2xpY2tWYWxpZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUgPSBfdHJhY2tDbGlja1ZhbGlkID09PSBtaWRkbGU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrQ2xpY2tQZXJjZW50YWdlSXNFeGFjdGlkZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFN0YXJ0ID0gX3RyYWNrQ2xpY2tWYWxpZCA8IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0RW5kID0gX3RyYWNrQ2xpY2tWYWxpZCA+IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJhY2tDbGlja1BlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgX3NldEVuZFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZ3Jlc3NNb3VzZURvd24oZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldnQpO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IHRoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Nb3VzZURvd24oXzogTW91c2VFdmVudCwgdGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmRyYWdnaW5nVGh1bWIgPSB0aHVtYjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25UaHVtYk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSYW5nZVZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgX3NldFN0YXJ0QW5kRW5kVmFsdWUgPSAoc3RhcnRWYWx1ZTogbnVtYmVyLCBlbmRWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCB1c2UgXCJtdWx0aXBsZVwiIHdpdGggdmFsdWUgYXMgYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlWzBdO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWVbMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgX3NldFN0YXJ0QW5kRW5kVmFsdWUodGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtfc3RhcnRWYWx1ZSwgX2VuZFZhbHVlXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gZ2V0RGlmZmVyZW5jZShfZW5kVmFsdWUsIF9zdGFydFZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4ID0gX2VuZFZhbHVlID4gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUlzTGVzc1RoYW5NaW4gPSBfc3RhcnRWYWx1ZSA8IHRoaXMubWluO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRVcGRhdGVWYWx1ZXMgPSBlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4IHx8IHN0YXJ0VmFsdWVJc0xlc3NUaGFuTWluO1xuICAgICAgICAgICAgICAgIGlmIChlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIF9lbmRWYWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgICAgICBfc3RhcnRWYWx1ZSA9IF9lbmRWYWx1ZSAtIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydFZhbHVlSXNMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgICAgICBfc3RhcnRWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICAgICAgICAgICAgICBfZW5kVmFsdWUgPSBfc3RhcnRWYWx1ZSArIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZXRTdGFydEFuZEVuZFZhbHVlKF9zdGFydFZhbHVlLCBfZW5kVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBfdmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUdyZWF0aGVyVGhhbk1heCA9IF92YWx1ZSA+IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlTGVzc1RoYW5NaW4gPSBfdmFsdWUgPCB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkVXBkYXRlVmFsdWUgPSB2YWx1ZUdyZWF0aGVyVGhhbk1heCB8fCB2YWx1ZUxlc3NUaGFuTWluO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUdyZWF0aGVyVGhhbk1heCkge1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB0aGlzLm1heDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlTGVzc1RoYW5NaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShfdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRodW1iTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb3ZpbmdQcm9ncmVzc0JhciB8fCAhdGhpcy5kcmFnZ2luZ1RodW1iKSByZXR1cm47XG5cbiAgICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiICYmIG5ld1Bvc2l0aW9uID4gdGhpcy5lbmRWYWx1ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIiAmJiBuZXdQb3NpdGlvbiA8IHRoaXMuc3RhcnRWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbkluVXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKG5ld1Bvc2l0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKVxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKVxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcblxuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID09PSBlbmQgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyBwb3NpdGlvbkluVXNlclJhbmdlIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0F0U2FtZVZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyBwb3NpdGlvbkluVXNlclJhbmdlID09PSB0aGlzLnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGVwID0gdGhpcy5zdGVwICE9PSAwO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWVJc1ZhbGlkQnlTdGVwID0gaGFzU3RlcCA/IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3RlcCA9PT0gX3ZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAtIHRoaXMuc3RlcCA9PT0gX3ZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoaXNBdFNhbWVWYWx1ZSAmJiAhbmV3VmFsdWVJc1ZhbGlkQnlTdGVwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCA9IHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQ7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudCA9IHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGxldCB7IG5ld1N0YXJ0LCBuZXdFbmQgfSA9IGNhbGN1bGF0ZU5ld1JhbmdlKFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ICsgcmFuZ2UsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBuZXdDZW50ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld1N0YXJ0IDwgdGhpcy5NSU5fUkFOR0VfVkFMVUUgfHwgbmV3RW5kID4gdGhpcy5NQVhfUkFOR0VfVkFMVUUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZShzdGFydFZhbHVlQmVmb3JlRXZlbnQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJVc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUobmV3Q2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50O1xuICAgICAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSArIHZhbHVlUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIGNlbnRlclVzZXJSYW5nZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGFydCA8IHRoaXMubWluIHx8IG5ld0VuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3U3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KG5ld0VuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBuZXdTdGFydDtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSBuZXdFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbdGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlXSk7XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldFByb2dyZXNzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzV2lkdGggPSBgY2FsYygke3RoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWV9JSArIDEwcHgpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NMZWZ0ID0gMDtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwZXJjZW50YWdlIG9mIGEgbW91c2UgZXZlbnQgZnJvbSB0aGUgdHJhY2sncyBsZWZ0IGVkZ2VcbiAgICAgKiBAcGFyYW0gbW91c2VFdmVudCBtb3VzZSBldmVudFxuICAgICAqIEByZXR1cm5zIHBlcmNlbnRhZ2UgZnJvbSB0aGUgbGVmdCBlZGdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQZXJjZW50YWdlQnlFdmVudChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdHJhY2tSZWN0ID0gdGhpcy50cmFjay5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbmV3TGVmdCA9IE1hdGgucm91bmQoKChtb3VzZUV2ZW50LmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGgpICogdGhpcy5NQVhfUkFOR0VfVkFMVUUpO1xuICAgICAgICBuZXdMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obmV3TGVmdCwgdGhpcy5NQVhfUkFOR0VfVkFMVUUpKTtcbiAgICAgICAgcmV0dXJuIG5ld0xlZnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSwgcGFyc2UgPSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgcGFyc2UpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh4KSA9PiB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoeCkpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMubWF4O1xuICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWF4IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pbiB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IDI7XG4gICAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE1hdGguZmxvb3IocmFuZ2UgLyB0aGlzLnN0ZXApO1xuICAgICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHZhbHVlID0gc3RhcnQ7IHZhbHVlIDw9IGVuZDsgdmFsdWUgKz0gdGhpcy5zdGVwKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gIT09IGVuZCkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9ICgodmFsdWUgLSBzdGFydCkgLyByYW5nZSkgKiB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hcHBlZC50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1hcHBlZFZhbHVlc1swXSA9IDA7XG4gICAgICAgIG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV0gPSB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLk1BWF9SQU5HRV9WQUxVRSAtIG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGVycm9yUGVyU3RlcCA9IGVycm9yIC8gc3RlcENvdW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hcHBlZFZhbHVlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIG1hcHBlZFZhbHVlc1tpXSArPSBlcnJvclBlclN0ZXA7XG4gICAgICAgICAgICBtYXBwZWRWYWx1ZXNbaV0gPSBwYXJzZUZsb2F0KG1hcHBlZFZhbHVlc1tpXS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLnNldCh2YWx1ZSwgbWFwcGVkVmFsdWVzW2luZGV4XSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVzZXIgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc2xpZGVyIHZhbHVlIGJ5IHVzaW5nIHRoZSBtYXAgb2YgcmFuZ2UgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSWYgdGhlIG1hcCBpcyAwOiB7IDAgfSwgMTogeyAxMCB9LCAyOiB7IDMwIH0sIDM6IHsgNDAgfSwgNDogeyA1MCB9XG4gICAgICogYW5kIHRoZSBzbGlkZXJWYWx1ZSBpcyAzNywgdGhlIGZ1bmN0aW9uIHJldHVybnMgM1xuICAgICAqIG9yIHRoZSBzbGlkZXIgdmFsdWUgaXMgNDAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDRcbiAgICAgKiBAcGFyYW0gc2xpZGVyVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzbGlkZXIgKHZhbHVlcyBvbmx5IGJldHdlZW4gcmFuZ2UgTUlOIGFuZCBNQVgpXG4gICAgICogQHJldHVybnMgdGhlIHVzZXIgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc2xpZGVyIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHNsaWRlclZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbWFwVG9BcnJheSA9IEFycmF5LmZyb20odGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlcikubWFwKChbdmFsdWUsIG1hcHBlZF0pID0+ICh7IHZhbHVlLCBtYXBwZWQgfSkpO1xuICAgICAgICBjb25zdCBleGFjdFZhbHVlID0gbWFwVG9BcnJheS5maW5kKCh4KSA9PiB4Lm1hcHBlZCA9PSBzbGlkZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGNsb3Nlc3QgPSBtYXBUb0FycmF5LnJlZHVjZSgocHJldiwgY3VycikgPT4gTWF0aC5hYnMoY3Vyci5tYXBwZWQgLSBzbGlkZXJWYWx1ZSkgPCBNYXRoLmFicyhwcmV2Lm1hcHBlZCAtIHNsaWRlclZhbHVlKSA/IGN1cnIgOiBwcmV2KTtcbiAgICAgICAgcmV0dXJuIGV4YWN0VmFsdWUgPyBleGFjdFZhbHVlLnZhbHVlIDogY2xvc2VzdC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGtleSBmcm9tIHRoZSBtYXAgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHVzZXJWYWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIHRoZSBjbG9zZXN0IGtleSBmb3IuICh2YWx1ZXMgb25seSBiZXR3ZWVuIDAgLSAxMDApXG4gICAgICogQHJldHVybnMgVGhlIGtleSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjbG9zZXN0IG1hcHBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIodXNlclZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtYXBUb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyKS5tYXAoKFt2YWx1ZSwgbWFwcGVkXSkgPT4gKHsgdmFsdWUsIG1hcHBlZCB9KSk7XG4gICAgICAgIGlmICh1c2VyVmFsdWUgPj0gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5W21hcFRvQXJyYXkubGVuZ3RoIC0gMV0ubWFwcGVkXG4gICAgICAgIH0gZWxzZSBpZiAodXNlclZhbHVlIDw9IHRoaXMubWluKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheVswXS5tYXBwZWRcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGFjdFZhbHVlID0gbWFwVG9BcnJheS5maW5kKCh4KSA9PiB4LnZhbHVlID09IHVzZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGNsb3Nlc3RWYWx1ZSA9IG1hcFRvQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLmFicyhjdXJyLnZhbHVlIC0gdXNlclZhbHVlKSA8IE1hdGguYWJzKHByZXYudmFsdWUgLSB1c2VyVmFsdWUpID8gY3VyciA6IHByZXYpO1xuICAgICAgICBjb25zdCBpdGVtID0gZXhhY3RWYWx1ZSB8fCBjbG9zZXN0VmFsdWU7XG4gICAgICAgIGNvbnN0IGlzRmlyc3RJdGVtID0gbWFwVG9BcnJheVswXSA9PT0gaXRlbTtcbiAgICAgICAgY29uc3QgaXNMYXN0SXRlbSA9IG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAxXSA9PT0gaXRlbTtcbiAgICAgICAgaWYgKGlzRmlyc3RJdGVtICYmIHVzZXJWYWx1ZSA+IHRoaXMubWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWlkcG9pbnQoaXRlbS5tYXBwZWQsIG1hcFRvQXJyYXlbMV0ubWFwcGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RJdGVtICYmIHVzZXJWYWx1ZSA8IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWlkcG9pbnQoaXRlbS5tYXBwZWQsIG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAyXS5tYXBwZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubWFwcGVkO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5TGVmdCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleVJpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKGluY3JlbWVudDogYm9vbGVhbikge1xuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gZ2V0RGlmZmVyZW5jZShlbmQsIHN0YXJ0KTtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IHRoaXMuc3RlcDtcbiAgICAgICAgICAgIGVuZCAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRMZXNzVGhhbk1pbiA9IHN0YXJ0IDwgdGhpcy5taW47XG4gICAgICAgIGNvbnN0IGVuZEdyZWF0ZXJUaGFuTWF4ID0gZW5kID4gdGhpcy5tYXg7XG4gICAgICAgIGlmIChzdGFydExlc3NUaGFuTWluIHx8IGVuZEdyZWF0ZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRHcmVhdGVyVGhhbk1heCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPCB0aGlzLm1pbiB8fCBlbmQgPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoW3N0YXJ0LCBlbmRdLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoc3RhcnQpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kVmFsdWUgPSBlbmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZSBhcyBudW1iZXI7XG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgX25ld0VuZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgX25ld0VuZFZhbHVlID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKF9uZXdFbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9uZXdFbmRWYWx1ZSA8IHRoaXMuTUlOX1JBTkdFX1ZBTFVFIHx8IF9uZXdFbmRWYWx1ZSA+IHRoaXMuTUFYX1JBTkdFX1ZBTFVFKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IF9uZXdFbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShfbmV3RW5kVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG5lZWRQYXJzZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4ICE9PSB0aGlzLk1BWF9SQU5HRV9WQUxVRSB8fCB0aGlzLm1pbiAhPT0gdGhpcy5NSU5fUkFOR0VfVkFMVUU7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBuZXcgcmFuZ2UgYmFzZWQgb24gdGhlIG9sZCByYW5nZSBhbmQgdGhlIHBvc2l0aW9ucyBjbGlja2VkIGFuZCBmaW5hbGl6ZWQuXG4gKlxuICogQHBhcmFtIG9sZFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gb2xkRW5kIC0gVGhlIGVuZGluZyB2YWx1ZSBvZiB0aGUgb2xkIHJhbmdlLlxuICogQHBhcmFtIGNsaWNrZWRQb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY2xpY2sgb2NjdXJyZWQuXG4gKiBAcGFyYW0gZmluYWxQb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgcmFuZ2Ugc2hvdWxkIGVuZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZXcgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgb2YgdGhlIHJhbmdlLlxuICovXG5jb25zdCBjYWxjdWxhdGVOZXdSYW5nZSA9IChvbGRTdGFydDogbnVtYmVyLCBvbGRFbmQ6IG51bWJlciwgY2xpY2tlZFBvc2l0aW9uOiBudW1iZXIsIGZpbmFsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJhbmdlID0gb2xkRW5kIC0gb2xkU3RhcnQ7XG4gICAgY29uc3QgbmV3U3RhcnQgPSBmaW5hbFBvc2l0aW9uIC0gKGNsaWNrZWRQb3NpdGlvbiAtIG9sZFN0YXJ0KTtcbiAgICBjb25zdCBuZXdFbmQgPSBuZXdTdGFydCArIHJhbmdlO1xuICAgIHJldHVybiB7IG5ld1N0YXJ0LCBuZXdFbmQgfTtcbn07XG5cbmNvbnN0IGlzSW5SYW5nZSA9ICh2YWx1ZTogbnVtYmVyLCByYW5nZVN0YXJ0OiBudW1iZXIsIHJhbmdlRW5kOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBbbWluLCBtYXhdID0gcmFuZ2VTdGFydCA8IHJhbmdlRW5kID8gW3JhbmdlU3RhcnQsIHJhbmdlRW5kXSA6IFtyYW5nZUVuZCwgcmFuZ2VTdGFydF07XG4gICAgcmV0dXJuIHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXg7XG59O1xuXG5jb25zdCBnZXRNaWRwb2ludCA9IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1pZHBvaW50ID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWlkcG9pbnQudG9GaXhlZCgyKSk7XG59XG5jb25zdCBnZXREaWZmZXJlbmNlID0gKGVuZDogbnVtYmVyLCBzdGFydDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGVuZCAtIHN0YXJ0KTtcbn1cbiJdfQ==
|