@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.
@@ -1,17 +1,19 @@
1
1
  var SliderComponent_1;
2
2
  import { __decorate } from "tslib";
3
- import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild, } from "@angular/core";
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 = 0;
14
- this.max = 100;
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: { left: 0, right: 10 },
34
- * -9: { left: 11, right: 19 },
35
+ * -10: { 0 },
36
+ * -9: { 10 },
35
37
  * ...
36
- * 10: { left: 90, right: 100 }
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.getUserValueFromSliderValueByMap(newPosition);
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).left
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).right
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 pickLeftValue = newPosition <= 50;
75
- const pickRightValue = newPosition > 50;
76
- if (pickLeftValue) {
77
- this.endValue = this.needParseValues
78
- ? this.mapRangeValuesForSlider.get(positionInUserRange).left
79
- : newPosition;
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 < 0 || newEnd > 100) {
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.getUserValueFromSliderValueByMap(startValueBeforeEvent);
111
- const startPositionBeforeEventUserRange = this.getUserValueFromSliderValueByMap(startPositionBeforeEvent);
112
- const centerUserRange = this.getUserValueFromSliderValueByMap(newCenter);
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).left;
119
- this.endValue = this.mapRangeValuesForSlider.get(newEnd).right;
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
- if (this.needParseValues) {
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
- return (this.needParseValues ? this.getUserValueFromSliderValueByMap(this.startValue) : this.startValue).toString();
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
- return (this.needParseValues ? this.getUserValueFromSliderValueByMap(this.endValue) : this.endValue).toString();
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.getUserValueFromSliderValueByMap(trackClickPercentage);
197
+ const trackClickToUserRange = this.getValueFromMapByValue(trackClickPercentage);
192
198
  const _trackClickValid = this.needParseValues ? trackClickToUserRange : trackClickPercentage;
193
199
  const _setEndValue = () => {
194
- const _endValueUserValue = this.getUserValueFromSliderValueByMap(this.endValue);
195
- const _endValue = this.needParseValues ? this.mapRangeValuesForSlider.get(trackClickToUserRange).right : trackClickPercentage;
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.getUserValueFromSliderValueByMap(this.startValue);
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).left
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).left : start;
218
- const validEnd = this.needParseValues ? this.mapRangeValuesForSlider.get(end).right : 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
- const hasRangeValues = !!(this.startValue && this.endValue);
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
- const isEqualAndMultiple = this.multiple && this.startValue === this.endValue;
298
- this.startValue = this.mapRangeValuesForSlider.get(this.startValue).left;
299
- if (isEqualAndMultiple) {
300
- this.endValue = this.startValue;
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
- this.endValue = this.mapRangeValuesForSlider.get(this.endValue).right;
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) * 100;
326
- newLeft = Math.round(newLeft / this.step) * this.step;
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.getUserValueFromSliderValueByMap(x));
371
+ value = value.map((x) => this.getValueFromMapByValue(x));
337
372
  }
338
373
  else {
339
- value = this.getUserValueFromSliderValueByMap(value);
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
- let forStart = 0;
352
- let forEnd = 100;
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
- adjustLastItem(mappedValues);
372
- mappedValues.forEach((mappedValue) => {
373
- this.mapRangeValuesForSlider.set(mappedValue.value, Object.assign({}, mappedValue));
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
- * Maps a slider value to a user value in the range [min, max].
417
+ * Returns the user value from the given slider value by using the map of range values.
378
418
  * @example
379
- * If min = 0 and max = 10, mapSliderToUserRange(25) returns 2.5
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
- mapSliderToUserRange(sliderValue) {
382
- return Math.floor(this.min + (sliderValue / 100) * (this.max - this.min));
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
- * Returns the user value from the given slider value by using the map of range values.
386
- * @example
387
- * If the map is [{value: 0, left: 0, right: 25}, {value: 1, left: 25, right: 50}, {value: 2, left: 50, right: 75}, {value: 3, left: 75, right: 100}]
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
- getUserValueFromSliderValueByMap(sliderValue) {
393
- var _a;
394
- const mapToArray = Array.from(this.mapRangeValuesForSlider).map((x) => {
395
- return Object.assign({ value: x[0] }, x[1]);
396
- });
397
- const mappedValue = mapToArray.find((x) => isInRange(sliderValue, x.left, x.right));
398
- return (_a = mappedValue === null || mappedValue === void 0 ? void 0 : mappedValue.value) !== null && _a !== void 0 ? _a : sliderValue;
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
- if (this.needParseValues) {
429
- if (!this.mapRangeValuesForSlider.has(start) || !this.mapRangeValuesForSlider.has(end)) {
430
- return;
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
- const isEqual = start === end;
433
- if (isEqual && end === this.max) {
434
- start = this.mapRangeValuesForSlider.get(this.max).right;
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 < 0 || end > 100) {
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
- const valueParsedInSlider = this.mapRangeValuesForSlider.get(value);
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 < 0 || _newEndValue > 100) {
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(this.endValue);
528
+ this.setValue(_newEndValue);
482
529
  }
483
530
  get needParseValues() {
484
- return this.max !== 100 || this.min !== 0;
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
- * Adjust the last item of a mapped range to fill the gap between it and the penultimate item.
564
- * The gap is calculated by subtracting the difference between the last item's right and left
565
- * from the average difference between all the previous items.
566
- *
567
- * @param mappedValues - The mapped range to be adjusted.
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 ɵ2 = adjustLastItem;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFjekUsSUFBYSxlQUFlLHVCQUE1QixNQUFhLGVBQWU7SUFBNUI7UUFDcUIsb0JBQWUsR0FBRyxHQUFHLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFLOUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixVQUFLLEdBQThCLENBQUMsQ0FBQztRQUdyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRzVELFNBQUksR0FBRyxDQUFDLENBQUM7UUFHVCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFFBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRzNCLFFBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBUzNCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUVuQixhQUFRLEdBQStDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxjQUFTLEdBQStDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVq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Q0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNGLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3hDLENBQUMsQ0FBQzs7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQTs7QUFDRCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUNqRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJzLXNsaWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc2xpZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3NsaWRlci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SQU5HRV9WQUxVRSA9IDEwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1JTl9SQU5HRV9WQUxVRSA9IDA7XG4gICAgQFZpZXdDaGlsZChcInRyYWNrXCIpXG4gICAgcHVibGljIHRyYWNrITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSA9IDA7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGVwID0gMTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGRlblRodW1iID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gdGhpcy5NSU5fUkFOR0VfVkFMVUU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXggPSB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pblZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIHB1YmxpYyBzdGFydFZhbHVlID0gMDtcbiAgICBwdWJsaWMgZW5kVmFsdWUgPSAwO1xuICAgIHB1YmxpYyBtb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcm9ncmVzc0xlZnQgPSAwO1xuICAgIHB1YmxpYyBwcm9ncmVzc1dpZHRoID0gXCJcIjtcblxuICAgIHB1YmxpYyBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuICAgIHB1YmxpYyBvblRvdWNoZWQ6ICh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIHByaXZhdGUgZHJhZ2dpbmdUaHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSAtMTtcbiAgICBwcml2YXRlIHN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgcHJpdmF0ZSByYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICBwcml2YXRlIHRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgLyoqXG4gICAgICogTWFwIG9mIHZhbGlkIHZhbHVlcyBmb3IgdmFsdWVzIGluIHJhbmdlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogd2l0aCBtaW4gPSAtMTAgYW5kIG1heCA9IDEwIHdpbGwgaGF2ZSB0aGlzIG1hcC5cbiAgICAgKiB7XG4gICAgICogICAgIC0xMDogeyAwIH0sXG4gICAgICogICAgIC05OiB7IDEwIH0sXG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgMTA6IHsgMTAgfVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBwcml2YXRlIG1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgYWN0aXZlTW91c2VEb3duID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBmb2N1c0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFVzZXJSYW5nZU1hcFZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZXNPbk1pbiA9IGNoYW5nZXMubWluICYmICFjaGFuZ2VzLm1pbi5maXJzdENoYW5nZTtcbiAgICAgICAgY29uc3QgaGFzQ2hhbmdlc09uTWF4ID0gY2hhbmdlcy5tYXggJiYgIWNoYW5nZXMubWF4LmZpcnN0Q2hhbmdlO1xuICAgICAgICBjb25zdCBoYXNDaGFuZ2VzID0gaGFzQ2hhbmdlc09uTWluIHx8IGhhc0NoYW5nZXNPbk1heDtcbiAgICAgICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlclJhbmdlTWFwVmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlVmFsdWVzKCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmtleWRvd25cIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbktleWRvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzQWN0aXZlICYmICF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5TGVmdCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dMZWZ0XCI7XG4gICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5UmlnaHQgPSAkZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIjtcbiAgICAgICAgICAgIGlmIChpc0Fycm93S2V5TGVmdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJyb3dLZXlMZWZ0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyb3dLZXlSaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQXJyb3dLZXlSaWdodCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwU3RhcnRUZXh0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWVbMF0/LnRvU3RyaW5nKCkgOiB0aGlzLnZhbHVlPy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcEVuZFRleHQoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVsxXT8udG9TdHJpbmcoKSA6IHRoaXMudmFsdWU/LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1c0luKCkge1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhY2tDbGljayhldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8IHRoaXMuYWN0aXZlTW91c2VEb3duKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2UgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2dCk7XG4gICAgICAgIGNvbnN0IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgIGNvbnN0IF90cmFja0NsaWNrVmFsaWQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICBjb25zdCBfc2V0RW5kVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkgOiB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfZW5kVmFsdWVVc2VyVmFsdWUgIT09IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSBfZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBfc2V0U3RhcnRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9zdGFydFZhbHVlVXNlclZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHRoaXMuc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgX3N0YXJ0VmFsdWVVc2VyVmFsdWUgIT09IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9zdGFydFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gX3N0YXJ0VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRTdGFydCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoc3RhcnQpIDogc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEVuZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKSA6IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IF91cGRhdGVTdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0U3RhcnRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RyYWNrQ2xpY2tQZXJjZW50YWdlLCB2YWxpZEVuZF0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt2YWxpZFN0YXJ0LCB0cmFja0NsaWNrUGVyY2VudGFnZV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrUGVyY2VudGFnZUJldHdlZW5SYW5nZSA9IGlzSW5SYW5nZShfdHJhY2tDbGlja1ZhbGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChfdHJhY2tDbGlja1ZhbGlkIDwgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RyYWNrQ2xpY2tWYWxpZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUgPSBfdHJhY2tDbGlja1ZhbGlkID09PSBtaWRkbGU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrQ2xpY2tQZXJjZW50YWdlSXNFeGFjdGlkZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFN0YXJ0ID0gX3RyYWNrQ2xpY2tWYWxpZCA8IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0RW5kID0gX3RyYWNrQ2xpY2tWYWxpZCA+IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJhY2tDbGlja1BlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgX3NldEVuZFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZ3Jlc3NNb3VzZURvd24oZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldnQpO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IHRoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Nb3VzZURvd24oXzogTW91c2VFdmVudCwgdGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmRyYWdnaW5nVGh1bWIgPSB0aHVtYjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25UaHVtYk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSYW5nZVZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgX3NldFN0YXJ0QW5kRW5kVmFsdWUgPSAoc3RhcnRWYWx1ZTogbnVtYmVyLCBlbmRWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoc3RhcnRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCB1c2UgXCJtdWx0aXBsZVwiIHdpdGggdmFsdWUgYXMgYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlWzBdO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWVbMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgX3NldFN0YXJ0QW5kRW5kVmFsdWUodGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtfc3RhcnRWYWx1ZSwgX2VuZFZhbHVlXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gZ2V0RGlmZmVyZW5jZShfZW5kVmFsdWUsIF9zdGFydFZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4ID0gX2VuZFZhbHVlID4gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUlzTGVzc1RoYW5NaW4gPSBfc3RhcnRWYWx1ZSA8IHRoaXMubWluO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRVcGRhdGVWYWx1ZXMgPSBlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4IHx8IHN0YXJ0VmFsdWVJc0xlc3NUaGFuTWluO1xuICAgICAgICAgICAgICAgIGlmIChlbmRWYWx1ZUlzR3JlYXRoZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIF9lbmRWYWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgICAgICBfc3RhcnRWYWx1ZSA9IF9lbmRWYWx1ZSAtIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydFZhbHVlSXNMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgICAgICBfc3RhcnRWYWx1ZSA9IHRoaXMubWluO1xuICAgICAgICAgICAgICAgICAgICBfZW5kVmFsdWUgPSBfc3RhcnRWYWx1ZSArIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZXRTdGFydEFuZEVuZFZhbHVlKF9zdGFydFZhbHVlLCBfZW5kVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBfdmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUdyZWF0aGVyVGhhbk1heCA9IF92YWx1ZSA+IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlTGVzc1RoYW5NaW4gPSBfdmFsdWUgPCB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkVXBkYXRlVmFsdWUgPSB2YWx1ZUdyZWF0aGVyVGhhbk1heCB8fCB2YWx1ZUxlc3NUaGFuTWluO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUdyZWF0aGVyVGhhbk1heCkge1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB0aGlzLm1heDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlTGVzc1RoYW5NaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkVXBkYXRlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShfdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRodW1iTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb3ZpbmdQcm9ncmVzc0JhciB8fCAhdGhpcy5kcmFnZ2luZ1RodW1iKSByZXR1cm47XG5cbiAgICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiICYmIG5ld1Bvc2l0aW9uID4gdGhpcy5lbmRWYWx1ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIiAmJiBuZXdQb3NpdGlvbiA8IHRoaXMuc3RhcnRWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbkluVXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKG5ld1Bvc2l0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKVxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKVxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcblxuICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID09PSBlbmQgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyBwb3NpdGlvbkluVXNlclJhbmdlIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICBjb25zdCBpc0F0U2FtZVZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyBwb3NpdGlvbkluVXNlclJhbmdlID09PSB0aGlzLnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGVwID0gdGhpcy5zdGVwICE9PSAwO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWVJc1ZhbGlkQnlTdGVwID0gaGFzU3RlcCA/IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3RlcCA9PT0gX3ZhbHVlIHx8IGN1cnJlbnRWYWx1ZSAtIHRoaXMuc3RlcCA9PT0gX3ZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoaXNBdFNhbWVWYWx1ZSAmJiAhbmV3VmFsdWVJc1ZhbGlkQnlTdGVwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCA9IHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQ7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudCA9IHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGxldCB7IG5ld1N0YXJ0LCBuZXdFbmQgfSA9IGNhbGN1bGF0ZU5ld1JhbmdlKFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ICsgcmFuZ2UsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBuZXdDZW50ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld1N0YXJ0IDwgdGhpcy5NSU5fUkFOR0VfVkFMVUUgfHwgbmV3RW5kID4gdGhpcy5NQVhfUkFOR0VfVkFMVUUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZShzdGFydFZhbHVlQmVmb3JlRXZlbnQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJVc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUobmV3Q2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50O1xuICAgICAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSArIHZhbHVlUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIGNlbnRlclVzZXJSYW5nZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGFydCA8IHRoaXMubWluIHx8IG5ld0VuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3U3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KG5ld0VuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBuZXdTdGFydDtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSBuZXdFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbdGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlXSk7XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmUpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldFByb2dyZXNzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzV2lkdGggPSBgY2FsYygke3RoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWV9JSArIDEwcHgpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NMZWZ0ID0gMDtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwZXJjZW50YWdlIG9mIGEgbW91c2UgZXZlbnQgZnJvbSB0aGUgdHJhY2sncyBsZWZ0IGVkZ2VcbiAgICAgKiBAcGFyYW0gbW91c2VFdmVudCBtb3VzZSBldmVudFxuICAgICAqIEByZXR1cm5zIHBlcmNlbnRhZ2UgZnJvbSB0aGUgbGVmdCBlZGdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRQZXJjZW50YWdlQnlFdmVudChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdHJhY2tSZWN0ID0gdGhpcy50cmFjay5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbmV3TGVmdCA9IE1hdGgucm91bmQoKChtb3VzZUV2ZW50LmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGgpICogdGhpcy5NQVhfUkFOR0VfVkFMVUUpO1xuICAgICAgICBuZXdMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obmV3TGVmdCwgdGhpcy5NQVhfUkFOR0VfVkFMVUUpKTtcbiAgICAgICAgcmV0dXJuIG5ld0xlZnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSwgcGFyc2UgPSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgcGFyc2UpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh4KSA9PiB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoeCkpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMubWF4O1xuICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWF4IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pbiB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IDI7XG4gICAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE1hdGguZmxvb3IocmFuZ2UgLyB0aGlzLnN0ZXApO1xuICAgICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IHZhbHVlID0gc3RhcnQ7IHZhbHVlIDw9IGVuZDsgdmFsdWUgKz0gdGhpcy5zdGVwKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gIT09IGVuZCkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9ICgodmFsdWUgLSBzdGFydCkgLyByYW5nZSkgKiB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hcHBlZC50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1hcHBlZFZhbHVlc1swXSA9IDA7XG4gICAgICAgIG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV0gPSB0aGlzLk1BWF9SQU5HRV9WQUxVRTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLk1BWF9SQU5HRV9WQUxVRSAtIG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGVycm9yUGVyU3RlcCA9IGVycm9yIC8gc3RlcENvdW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hcHBlZFZhbHVlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIG1hcHBlZFZhbHVlc1tpXSArPSBlcnJvclBlclN0ZXA7XG4gICAgICAgICAgICBtYXBwZWRWYWx1ZXNbaV0gPSBwYXJzZUZsb2F0KG1hcHBlZFZhbHVlc1tpXS50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLnNldCh2YWx1ZSwgbWFwcGVkVmFsdWVzW2luZGV4XSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVzZXIgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc2xpZGVyIHZhbHVlIGJ5IHVzaW5nIHRoZSBtYXAgb2YgcmFuZ2UgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSWYgdGhlIG1hcCBpcyAwOiB7IDAgfSwgMTogeyAxMCB9LCAyOiB7IDMwIH0sIDM6IHsgNDAgfSwgNDogeyA1MCB9XG4gICAgICogYW5kIHRoZSBzbGlkZXJWYWx1ZSBpcyAzNywgdGhlIGZ1bmN0aW9uIHJldHVybnMgM1xuICAgICAqIG9yIHRoZSBzbGlkZXIgdmFsdWUgaXMgNDAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDRcbiAgICAgKiBAcGFyYW0gc2xpZGVyVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzbGlkZXIgKHZhbHVlcyBvbmx5IGJldHdlZW4gcmFuZ2UgTUlOIGFuZCBNQVgpXG4gICAgICogQHJldHVybnMgdGhlIHVzZXIgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc2xpZGVyIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHNsaWRlclZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbWFwVG9BcnJheSA9IEFycmF5LmZyb20odGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlcikubWFwKChbdmFsdWUsIG1hcHBlZF0pID0+ICh7IHZhbHVlLCBtYXBwZWQgfSkpO1xuICAgICAgICBjb25zdCBleGFjdFZhbHVlID0gbWFwVG9BcnJheS5maW5kKCh4KSA9PiB4Lm1hcHBlZCA9PSBzbGlkZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGNsb3Nlc3QgPSBtYXBUb0FycmF5LnJlZHVjZSgocHJldiwgY3VycikgPT4gTWF0aC5hYnMoY3Vyci5tYXBwZWQgLSBzbGlkZXJWYWx1ZSkgPCBNYXRoLmFicyhwcmV2Lm1hcHBlZCAtIHNsaWRlclZhbHVlKSA/IGN1cnIgOiBwcmV2KTtcbiAgICAgICAgcmV0dXJuIGV4YWN0VmFsdWUgPyBleGFjdFZhbHVlLnZhbHVlIDogY2xvc2VzdC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGtleSBmcm9tIHRoZSBtYXAgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHVzZXJWYWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIHRoZSBjbG9zZXN0IGtleSBmb3IuICh2YWx1ZXMgb25seSBiZXR3ZWVuIDAgLSAxMDApXG4gICAgICogQHJldHVybnMgVGhlIGtleSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjbG9zZXN0IG1hcHBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIodXNlclZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtYXBUb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyKS5tYXAoKFt2YWx1ZSwgbWFwcGVkXSkgPT4gKHsgdmFsdWUsIG1hcHBlZCB9KSk7XG4gICAgICAgIGlmICh1c2VyVmFsdWUgPj0gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5W21hcFRvQXJyYXkubGVuZ3RoIC0gMV0ubWFwcGVkXG4gICAgICAgIH0gZWxzZSBpZiAodXNlclZhbHVlIDw9IHRoaXMubWluKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheVswXS5tYXBwZWRcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGFjdFZhbHVlID0gbWFwVG9BcnJheS5maW5kKCh4KSA9PiB4LnZhbHVlID09IHVzZXJWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGNsb3Nlc3RWYWx1ZSA9IG1hcFRvQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLmFicyhjdXJyLnZhbHVlIC0gdXNlclZhbHVlKSA8IE1hdGguYWJzKHByZXYudmFsdWUgLSB1c2VyVmFsdWUpID8gY3VyciA6IHByZXYpO1xuICAgICAgICBjb25zdCBpdGVtID0gZXhhY3RWYWx1ZSB8fCBjbG9zZXN0VmFsdWU7XG4gICAgICAgIGNvbnN0IGlzRmlyc3RJdGVtID0gbWFwVG9BcnJheVswXSA9PT0gaXRlbTtcbiAgICAgICAgY29uc3QgaXNMYXN0SXRlbSA9IG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAxXSA9PT0gaXRlbTtcbiAgICAgICAgaWYgKGlzRmlyc3RJdGVtICYmIHVzZXJWYWx1ZSA+IHRoaXMubWluKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWlkcG9pbnQoaXRlbS5tYXBwZWQsIG1hcFRvQXJyYXlbMV0ubWFwcGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RJdGVtICYmIHVzZXJWYWx1ZSA8IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TWlkcG9pbnQoaXRlbS5tYXBwZWQsIG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAyXS5tYXBwZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubWFwcGVkO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5TGVmdCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleVJpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKGluY3JlbWVudDogYm9vbGVhbikge1xuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gZ2V0RGlmZmVyZW5jZShlbmQsIHN0YXJ0KTtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IHRoaXMuc3RlcDtcbiAgICAgICAgICAgIGVuZCAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnRMZXNzVGhhbk1pbiA9IHN0YXJ0IDwgdGhpcy5taW47XG4gICAgICAgIGNvbnN0IGVuZEdyZWF0ZXJUaGFuTWF4ID0gZW5kID4gdGhpcy5tYXg7XG4gICAgICAgIGlmIChzdGFydExlc3NUaGFuTWluIHx8IGVuZEdyZWF0ZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRHcmVhdGVyVGhhbk1heCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPCB0aGlzLm1pbiB8fCBlbmQgPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoW3N0YXJ0LCBlbmRdLCBmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoc3RhcnQpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kVmFsdWUgPSBlbmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZSBhcyBudW1iZXI7XG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgX25ld0VuZFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgX25ld0VuZFZhbHVlID0gdGhpcy5nZXRDbG9zZXN0VmFsdWVGcm9tTWFwU2xpZGVyKF9uZXdFbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9uZXdFbmRWYWx1ZSA8IHRoaXMuTUlOX1JBTkdFX1ZBTFVFIHx8IF9uZXdFbmRWYWx1ZSA+IHRoaXMuTUFYX1JBTkdFX1ZBTFVFKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IF9uZXdFbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShfbmV3RW5kVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG5lZWRQYXJzZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4ICE9PSB0aGlzLk1BWF9SQU5HRV9WQUxVRSB8fCB0aGlzLm1pbiAhPT0gdGhpcy5NSU5fUkFOR0VfVkFMVUU7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBuZXcgcmFuZ2UgYmFzZWQgb24gdGhlIG9sZCByYW5nZSBhbmQgdGhlIHBvc2l0aW9ucyBjbGlja2VkIGFuZCBmaW5hbGl6ZWQuXG4gKlxuICogQHBhcmFtIG9sZFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gb2xkRW5kIC0gVGhlIGVuZGluZyB2YWx1ZSBvZiB0aGUgb2xkIHJhbmdlLlxuICogQHBhcmFtIGNsaWNrZWRQb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY2xpY2sgb2NjdXJyZWQuXG4gKiBAcGFyYW0gZmluYWxQb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgcmFuZ2Ugc2hvdWxkIGVuZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZXcgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgb2YgdGhlIHJhbmdlLlxuICovXG5jb25zdCBjYWxjdWxhdGVOZXdSYW5nZSA9IChvbGRTdGFydDogbnVtYmVyLCBvbGRFbmQ6IG51bWJlciwgY2xpY2tlZFBvc2l0aW9uOiBudW1iZXIsIGZpbmFsUG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJhbmdlID0gb2xkRW5kIC0gb2xkU3RhcnQ7XG4gICAgY29uc3QgbmV3U3RhcnQgPSBmaW5hbFBvc2l0aW9uIC0gKGNsaWNrZWRQb3NpdGlvbiAtIG9sZFN0YXJ0KTtcbiAgICBjb25zdCBuZXdFbmQgPSBuZXdTdGFydCArIHJhbmdlO1xuICAgIHJldHVybiB7IG5ld1N0YXJ0LCBuZXdFbmQgfTtcbn07XG5cbmNvbnN0IGlzSW5SYW5nZSA9ICh2YWx1ZTogbnVtYmVyLCByYW5nZVN0YXJ0OiBudW1iZXIsIHJhbmdlRW5kOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBbbWluLCBtYXhdID0gcmFuZ2VTdGFydCA8IHJhbmdlRW5kID8gW3JhbmdlU3RhcnQsIHJhbmdlRW5kXSA6IFtyYW5nZUVuZCwgcmFuZ2VTdGFydF07XG4gICAgcmV0dXJuIHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXg7XG59O1xuXG5jb25zdCBnZXRNaWRwb2ludCA9IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG1pZHBvaW50ID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWlkcG9pbnQudG9GaXhlZCgyKSk7XG59XG5jb25zdCBnZXREaWZmZXJlbmNlID0gKGVuZDogbnVtYmVyLCBzdGFydDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGVuZCAtIHN0YXJ0KTtcbn1cbiJdfQ==