@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
- import { __assign, __decorate, __read } from "tslib";
2
- import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild, } from "@angular/core";
1
+ import { __decorate, __read } from "tslib";
2
+ import { Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from "@angular/core";
3
3
  import { NG_VALUE_ACCESSOR } from "@angular/forms";
4
4
  var SliderComponent = /** @class */ (function () {
5
5
  function SliderComponent() {
6
6
  var _this = this;
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 @@ var SliderComponent = /** @class */ (function () {
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 @@ var SliderComponent = /** @class */ (function () {
49
49
  (_this.multiple && _this.draggingThumb === "end" && newPosition < _this.startValue)) {
50
50
  return;
51
51
  }
52
- var positionInUserRange = _this.getUserValueFromSliderValueByMap(newPosition);
52
+ var 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 @@ var SliderComponent = /** @class */ (function () {
71
71
  }
72
72
  }
73
73
  else {
74
- var pickLeftValue = newPosition <= 50;
75
- var 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
+ var currentValue = _this.value;
75
+ var _value = _this.needParseValues ? positionInUserRange : newPosition;
76
+ var isAtSameValue = _this.needParseValues ? positionInUserRange === _this.value : false;
77
+ var hasStep = _this.step !== 0;
78
+ var 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 @@ var SliderComponent = /** @class */ (function () {
103
100
  var startValueBeforeEvent = _this.startValueBeforeProgressBarEvent;
104
101
  var range = _this.rangeBetweenElementsBeforeProgressBarEvent;
105
102
  var _a = calculateNewRange(startValueBeforeEvent, startValueBeforeEvent + range, startPositionBeforeEvent, newCenter), newStart = _a.newStart, newEnd = _a.newEnd;
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
- var startValueBeforeEventUserRange = _this.getUserValueFromSliderValueByMap(startValueBeforeEvent);
111
- var startPositionBeforeEventUserRange = _this.getUserValueFromSliderValueByMap(startPositionBeforeEvent);
112
- var centerUserRange = _this.getUserValueFromSliderValueByMap(newCenter);
107
+ var startValueBeforeEventUserRange = _this.getValueFromMapByValue(startValueBeforeEvent);
108
+ var startPositionBeforeEventUserRange = _this.getValueFromMapByValue(startPositionBeforeEvent);
109
+ var centerUserRange = _this.getValueFromMapByValue(newCenter);
113
110
  var valueRange = _this.totalRangeBeforeProgressBarEvent;
114
111
  var _b = calculateNewRange(startValueBeforeEventUserRange, startValueBeforeEventUserRange + valueRange, startPositionBeforeEventUserRange, centerUserRange), newStart_1 = _b.newStart, newEnd_1 = _b.newEnd;
115
112
  if (newStart_1 < _this.min || newEnd_1 > _this.max) {
116
113
  return;
117
114
  }
118
- _this.startValue = _this.mapRangeValuesForSlider.get(newStart_1).left;
119
- _this.endValue = _this.mapRangeValuesForSlider.get(newEnd_1).right;
115
+ _this.startValue = _this.mapRangeValuesForSlider.get(newStart_1);
116
+ _this.endValue = _this.mapRangeValuesForSlider.get(newEnd_1);
120
117
  }
121
118
  else {
122
119
  _this.startValue = newStart;
@@ -139,8 +136,15 @@ var SliderComponent = /** @class */ (function () {
139
136
  }
140
137
  SliderComponent_1 = SliderComponent;
141
138
  SliderComponent.prototype.ngOnInit = function () {
142
- if (this.needParseValues) {
139
+ this.setUserRangeMapValues();
140
+ };
141
+ SliderComponent.prototype.ngOnChanges = function (changes) {
142
+ var hasChangesOnMin = changes.min && !changes.min.firstChange;
143
+ var hasChangesOnMax = changes.max && !changes.max.firstChange;
144
+ var hasChanges = hasChangesOnMin || hasChangesOnMax;
145
+ if (hasChanges) {
143
146
  this.setUserRangeMapValues();
147
+ this.setRangeValues();
144
148
  }
145
149
  };
146
150
  SliderComponent.prototype.ngAfterViewInit = function () {
@@ -163,14 +167,16 @@ var SliderComponent = /** @class */ (function () {
163
167
  };
164
168
  Object.defineProperty(SliderComponent.prototype, "tooltipStartText", {
165
169
  get: function () {
166
- return (this.needParseValues ? this.getUserValueFromSliderValueByMap(this.startValue) : this.startValue).toString();
170
+ var _a, _b;
171
+ 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();
167
172
  },
168
173
  enumerable: true,
169
174
  configurable: true
170
175
  });
171
176
  Object.defineProperty(SliderComponent.prototype, "tooltipEndText", {
172
177
  get: function () {
173
- return (this.needParseValues ? this.getUserValueFromSliderValueByMap(this.endValue) : this.endValue).toString();
178
+ var _a, _b;
179
+ 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();
174
180
  },
175
181
  enumerable: true,
176
182
  configurable: true
@@ -199,11 +205,11 @@ var SliderComponent = /** @class */ (function () {
199
205
  return;
200
206
  }
201
207
  var trackClickPercentage = this.getPercentageByEvent(evt);
202
- var trackClickToUserRange = this.getUserValueFromSliderValueByMap(trackClickPercentage);
208
+ var trackClickToUserRange = this.getValueFromMapByValue(trackClickPercentage);
203
209
  var _trackClickValid = this.needParseValues ? trackClickToUserRange : trackClickPercentage;
204
210
  var _setEndValue = function () {
205
- var _endValueUserValue = _this.getUserValueFromSliderValueByMap(_this.endValue);
206
- var _endValue = _this.needParseValues ? _this.mapRangeValuesForSlider.get(trackClickToUserRange).right : trackClickPercentage;
211
+ var _endValueUserValue = _this.getValueFromMapByValue(_this.endValue);
212
+ var _endValue = _this.needParseValues ? _this.mapRangeValuesForSlider.get(trackClickToUserRange) : trackClickPercentage;
207
213
  if (_this.needParseValues && _endValueUserValue !== trackClickToUserRange) {
208
214
  _this.endValue = _endValue;
209
215
  }
@@ -212,10 +218,10 @@ var SliderComponent = /** @class */ (function () {
212
218
  }
213
219
  };
214
220
  var _setStartValue = function () {
215
- var _startValueUserValue = _this.getUserValueFromSliderValueByMap(_this.startValue);
221
+ var _startValueUserValue = _this.getValueFromMapByValue(_this.startValue);
216
222
  if (_this.needParseValues && _startValueUserValue !== trackClickToUserRange) {
217
223
  var _startValue = _this.needParseValues
218
- ? _this.mapRangeValuesForSlider.get(trackClickToUserRange).left
224
+ ? _this.mapRangeValuesForSlider.get(trackClickToUserRange)
219
225
  : trackClickPercentage;
220
226
  _this.startValue = _startValue;
221
227
  }
@@ -225,8 +231,8 @@ var SliderComponent = /** @class */ (function () {
225
231
  };
226
232
  if (this.multiple) {
227
233
  var _a = __read(this.value, 2), start = _a[0], end = _a[1];
228
- var validStart_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(start).left : start;
229
- var validEnd_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(end).right : end;
234
+ var validStart_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(start) : start;
235
+ var validEnd_1 = this.needParseValues ? this.mapRangeValuesForSlider.get(end) : end;
230
236
  var _updateStart = function () {
231
237
  _setStartValue();
232
238
  _this.setValue([trackClickPercentage, validEnd_1]);
@@ -289,11 +295,15 @@ var SliderComponent = /** @class */ (function () {
289
295
  document.addEventListener("mouseup", this.onMouseUp);
290
296
  };
291
297
  SliderComponent.prototype.setRangeValues = function () {
298
+ var _this = this;
299
+ var _setStartAndEndValue = function (startValue, endValue) {
300
+ _this.startValue = _this.getClosestValueFromMapSlider(startValue);
301
+ _this.endValue = _this.getClosestValueFromMapSlider(endValue);
302
+ };
292
303
  if (Array.isArray(this.value) && !this.multiple) {
293
304
  throw new Error('You must use "multiple" with value as array');
294
305
  }
295
- var hasRangeValues = !!(this.startValue && this.endValue);
296
- if (this.multiple && Array.isArray(this.value) && !hasRangeValues) {
306
+ if (this.multiple && Array.isArray(this.value)) {
297
307
  this.startValue = this.value[0];
298
308
  this.endValue = this.value[1];
299
309
  }
@@ -305,13 +315,40 @@ var SliderComponent = /** @class */ (function () {
305
315
  this.endValue = this.value;
306
316
  }
307
317
  if (this.needParseValues) {
308
- var isEqualAndMultiple = this.multiple && this.startValue === this.endValue;
309
- this.startValue = this.mapRangeValuesForSlider.get(this.startValue).left;
310
- if (isEqualAndMultiple) {
311
- this.endValue = this.startValue;
318
+ _setStartAndEndValue(this.startValue, this.endValue);
319
+ if (this.multiple) {
320
+ var _a = __read(this.value, 2), _startValue = _a[0], _endValue = _a[1];
321
+ var difference = getDifference(_endValue, _startValue);
322
+ var endValueIsGreatherThanMax = _endValue > this.max;
323
+ var startValueIsLessThanMin = _startValue < this.min;
324
+ var needUpdateValues = endValueIsGreatherThanMax || startValueIsLessThanMin;
325
+ if (endValueIsGreatherThanMax) {
326
+ _endValue = this.max;
327
+ _startValue = _endValue - difference;
328
+ }
329
+ else if (startValueIsLessThanMin) {
330
+ _startValue = this.min;
331
+ _endValue = _startValue + difference;
332
+ }
333
+ if (needUpdateValues) {
334
+ _setStartAndEndValue(_startValue, _endValue);
335
+ this.setValue([this.startValue, this.endValue]);
336
+ }
312
337
  }
313
338
  else {
314
- this.endValue = this.mapRangeValuesForSlider.get(this.endValue).right;
339
+ var _value = this.value;
340
+ var valueGreatherThanMax = _value > this.max;
341
+ var valueLessThanMin = _value < this.min;
342
+ var needUpdateValue = valueGreatherThanMax || valueLessThanMin;
343
+ if (valueGreatherThanMax) {
344
+ _value = this.max;
345
+ }
346
+ else if (valueLessThanMin) {
347
+ _value = this.min;
348
+ }
349
+ if (needUpdateValue) {
350
+ this.setValue(_value);
351
+ }
315
352
  }
316
353
  }
317
354
  this.setProgress();
@@ -333,22 +370,22 @@ var SliderComponent = /** @class */ (function () {
333
370
  */
334
371
  SliderComponent.prototype.getPercentageByEvent = function (mouseEvent) {
335
372
  var trackRect = this.track.nativeElement.getBoundingClientRect();
336
- var newLeft = ((mouseEvent.clientX - trackRect.left) / trackRect.width) * 100;
337
- newLeft = Math.round(newLeft / this.step) * this.step;
338
- newLeft = Math.max(0, Math.min(newLeft, 100));
373
+ var newLeft = Math.round(((mouseEvent.clientX - trackRect.left) / trackRect.width) * this.MAX_RANGE_VALUE);
374
+ newLeft = Math.max(0, Math.min(newLeft, this.MAX_RANGE_VALUE));
339
375
  return newLeft;
340
376
  };
341
- SliderComponent.prototype.setValue = function (value) {
377
+ SliderComponent.prototype.setValue = function (value, parse) {
342
378
  var _this = this;
379
+ if (parse === void 0) { parse = true; }
343
380
  if (this.disabled) {
344
381
  return;
345
382
  }
346
- if (this.needParseValues) {
383
+ if (this.needParseValues && parse) {
347
384
  if (Array.isArray(value)) {
348
- value = value.map(function (x) { return _this.getUserValueFromSliderValueByMap(x); });
385
+ value = value.map(function (x) { return _this.getValueFromMapByValue(x); });
349
386
  }
350
387
  else {
351
- value = this.getUserValueFromSliderValueByMap(value);
388
+ value = this.getValueFromMapByValue(value);
352
389
  }
353
390
  }
354
391
  this.value = value;
@@ -361,54 +398,84 @@ var SliderComponent = /** @class */ (function () {
361
398
  var _this = this;
362
399
  var start = this.min;
363
400
  var end = this.max;
364
- var forStart = 0;
365
- var forEnd = 100;
366
- this.mapRangeValuesForSlider.clear();
367
- var mappedValues = [];
368
- for (var i = start; i <= end; i++) {
369
- var valuesWithMap = [];
370
- for (var j = forStart; j <= forEnd; j++) {
371
- var sliderToUserRangeValue = this.mapSliderToUserRange(j);
372
- if (sliderToUserRangeValue !== i) {
373
- forStart = j;
374
- break;
375
- }
376
- else {
377
- valuesWithMap.push(j);
378
- }
379
- }
380
- var left = valuesWithMap[0];
381
- var right = valuesWithMap[valuesWithMap.length - 1];
382
- mappedValues.push({ value: i, left: left, right: right });
401
+ if (start > end) {
402
+ throw new Error('Max value must be greater than min value');
383
403
  }
384
- adjustLastItem(mappedValues);
385
- mappedValues.forEach(function (mappedValue) {
386
- _this.mapRangeValuesForSlider.set(mappedValue.value, __assign({}, mappedValue));
404
+ this.mapRangeValuesForSlider.clear();
405
+ var range = end - start;
406
+ var decimalPlaces = 2;
407
+ var stepCount = Math.floor(range / this.step);
408
+ var values = [];
409
+ for (var value = start; value <= end; value += this.step) {
410
+ values.push(value);
411
+ }
412
+ if (values[values.length - 1] !== end) {
413
+ values.push(end);
414
+ }
415
+ var mappedValues = values.map(function (value) {
416
+ var mapped = ((value - start) / range) * _this.MAX_RANGE_VALUE;
417
+ return parseFloat(mapped.toFixed(decimalPlaces));
418
+ });
419
+ mappedValues[0] = 0;
420
+ mappedValues[mappedValues.length - 1] = this.MAX_RANGE_VALUE;
421
+ var error = this.MAX_RANGE_VALUE - mappedValues[mappedValues.length - 1];
422
+ var errorPerStep = error / stepCount;
423
+ for (var i = 1; i < mappedValues.length - 1; i++) {
424
+ mappedValues[i] += errorPerStep;
425
+ mappedValues[i] = parseFloat(mappedValues[i].toFixed(decimalPlaces));
426
+ }
427
+ values.forEach(function (value, index) {
428
+ _this.mapRangeValuesForSlider.set(value, mappedValues[index]);
387
429
  });
388
430
  };
389
431
  /**
390
- * Maps a slider value to a user value in the range [min, max].
432
+ * Returns the user value from the given slider value by using the map of range values.
391
433
  * @example
392
- * If min = 0 and max = 10, mapSliderToUserRange(25) returns 2.5
434
+ * If the map is 0: { 0 }, 1: { 10 }, 2: { 30 }, 3: { 40 }, 4: { 50 }
435
+ * and the sliderValue is 37, the function returns 3
436
+ * or the slider value is 40, the function returns 4
437
+ * @param sliderValue the value of the slider (values only between range MIN and MAX)
438
+ * @returns the user value from the given slider value
393
439
  */
394
- SliderComponent.prototype.mapSliderToUserRange = function (sliderValue) {
395
- return Math.floor(this.min + (sliderValue / 100) * (this.max - this.min));
440
+ SliderComponent.prototype.getValueFromMapByValue = function (sliderValue) {
441
+ var mapToArray = Array.from(this.mapRangeValuesForSlider).map(function (_a) {
442
+ var _b = __read(_a, 2), value = _b[0], mapped = _b[1];
443
+ return ({ value: value, mapped: mapped });
444
+ });
445
+ var exactValue = mapToArray.find(function (x) { return x.mapped == sliderValue; });
446
+ var closest = mapToArray.reduce(function (prev, curr) { return Math.abs(curr.mapped - sliderValue) < Math.abs(prev.mapped - sliderValue) ? curr : prev; });
447
+ return exactValue ? exactValue.value : closest.value;
396
448
  };
397
449
  /**
398
- * Returns the user value from the given slider value by using the map of range values.
399
- * @example
400
- * 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}]
401
- * and the sliderValue is 37, the function returns 1
402
- * @param sliderValue the value of the slider
403
- * @returns the user value from the given slider value
450
+ * Retrieves the key from the map that is closest to the given slider value.
451
+ * @param userValue - The value to find the closest key for. (values only between 0 - 100)
452
+ * @returns The key that corresponds to the closest mapped value.
404
453
  */
405
- SliderComponent.prototype.getUserValueFromSliderValueByMap = function (sliderValue) {
406
- var _a;
407
- var mapToArray = Array.from(this.mapRangeValuesForSlider).map(function (x) {
408
- return __assign({ value: x[0] }, x[1]);
454
+ SliderComponent.prototype.getClosestValueFromMapSlider = function (userValue) {
455
+ var mapToArray = Array.from(this.mapRangeValuesForSlider).map(function (_a) {
456
+ var _b = __read(_a, 2), value = _b[0], mapped = _b[1];
457
+ return ({ value: value, mapped: mapped });
409
458
  });
410
- var mappedValue = mapToArray.find(function (x) { return isInRange(sliderValue, x.left, x.right); });
411
- return (_a = mappedValue === null || mappedValue === void 0 ? void 0 : mappedValue.value) !== null && _a !== void 0 ? _a : sliderValue;
459
+ if (userValue >= this.max) {
460
+ return mapToArray[mapToArray.length - 1].mapped;
461
+ }
462
+ else if (userValue <= this.min) {
463
+ return mapToArray[0].mapped;
464
+ }
465
+ var exactValue = mapToArray.find(function (x) { return x.value == userValue; });
466
+ var closestValue = mapToArray.reduce(function (prev, curr) { return Math.abs(curr.value - userValue) < Math.abs(prev.value - userValue) ? curr : prev; });
467
+ var item = exactValue || closestValue;
468
+ var isFirstItem = mapToArray[0] === item;
469
+ var isLastItem = mapToArray[mapToArray.length - 1] === item;
470
+ if (isFirstItem && userValue > this.min) {
471
+ return getMidpoint(item.mapped, mapToArray[1].mapped);
472
+ }
473
+ else if (isLastItem && userValue < this.max) {
474
+ return getMidpoint(item.mapped, mapToArray[mapToArray.length - 2].mapped);
475
+ }
476
+ else {
477
+ return item.mapped;
478
+ }
412
479
  };
413
480
  SliderComponent.prototype.handleArrowKeyLeft = function () {
414
481
  if (this.multiple) {
@@ -430,6 +497,7 @@ var SliderComponent = /** @class */ (function () {
430
497
  };
431
498
  SliderComponent.prototype._incrementOrDecrementStartAndEndValue = function (increment) {
432
499
  var _a = __read(this.value, 2), start = _a[0], end = _a[1];
500
+ var difference = getDifference(end, start);
433
501
  if (increment) {
434
502
  start += this.step;
435
503
  end += this.step;
@@ -438,31 +506,28 @@ var SliderComponent = /** @class */ (function () {
438
506
  start -= this.step;
439
507
  end -= this.step;
440
508
  }
441
- if (this.needParseValues) {
442
- if (!this.mapRangeValuesForSlider.has(start) || !this.mapRangeValuesForSlider.has(end)) {
443
- return;
509
+ var startLessThanMin = start < this.min;
510
+ var endGreaterThanMax = end > this.max;
511
+ if (startLessThanMin || endGreaterThanMax) {
512
+ if (startLessThanMin) {
513
+ start = this.min;
514
+ end = start + difference;
444
515
  }
445
- var isEqual = start === end;
446
- if (isEqual && end === this.max) {
447
- start = this.mapRangeValuesForSlider.get(this.max).right;
448
- end = start;
449
- }
450
- else {
451
- start = this.mapRangeValuesForSlider.get(start).left;
452
- if (isEqual) {
453
- end = start;
454
- }
455
- else {
456
- end = this.mapRangeValuesForSlider.get(end).right;
457
- }
516
+ else if (endGreaterThanMax) {
517
+ end = this.max;
518
+ start = end - difference;
458
519
  }
459
520
  }
460
- if (start < 0 || end > 100) {
521
+ if (start < this.min || end > this.max) {
461
522
  return;
462
523
  }
524
+ this.setValue([start, end], false);
525
+ if (this.needParseValues) {
526
+ start = this.getClosestValueFromMapSlider(start);
527
+ end = this.getClosestValueFromMapSlider(end);
528
+ }
463
529
  this.startValue = start;
464
530
  this.endValue = end;
465
- this.setValue([start, end]);
466
531
  };
467
532
  SliderComponent.prototype._incrementOrDecrementEndValue = function (increment) {
468
533
  var value = this.value;
@@ -474,28 +539,18 @@ var SliderComponent = /** @class */ (function () {
474
539
  }
475
540
  var _newEndValue = value;
476
541
  if (this.needParseValues) {
477
- var valueParsedInSlider = this.mapRangeValuesForSlider.get(value);
478
- if (!valueParsedInSlider) {
479
- return;
480
- }
481
- var pickLeft = valueParsedInSlider.right <= 50;
482
- if (pickLeft) {
483
- _newEndValue = this.mapRangeValuesForSlider.get(value).left;
484
- }
485
- else {
486
- _newEndValue = this.mapRangeValuesForSlider.get(value).right;
487
- }
542
+ _newEndValue = this.getClosestValueFromMapSlider(_newEndValue);
488
543
  }
489
- if (_newEndValue < 0 || _newEndValue > 100) {
544
+ if (_newEndValue < this.MIN_RANGE_VALUE || _newEndValue > this.MAX_RANGE_VALUE) {
490
545
  return;
491
546
  }
492
547
  this.endValue = _newEndValue;
493
548
  this.startValue = this.endValue;
494
- this.setValue(this.endValue);
549
+ this.setValue(_newEndValue);
495
550
  };
496
551
  Object.defineProperty(SliderComponent.prototype, "needParseValues", {
497
552
  get: function () {
498
- return this.max !== 100 || this.min !== 0;
553
+ return this.max !== this.MAX_RANGE_VALUE || this.min !== this.MIN_RANGE_VALUE;
499
554
  },
500
555
  enumerable: true,
501
556
  configurable: true
@@ -578,71 +633,14 @@ var isInRange = function (value, rangeStart, rangeEnd) {
578
633
  return value >= min && value <= max;
579
634
  };
580
635
  var ɵ1 = isInRange;
581
- /**
582
- * Adjust the last item of a mapped range to fill the gap between it and the penultimate item.
583
- * The gap is calculated by subtracting the difference between the last item's right and left
584
- * from the average difference between all the previous items.
585
- *
586
- * @param mappedValues - The mapped range to be adjusted.
587
- *
588
- * The function works by finding the gap between the last item and the penultimate item and
589
- * then distributing this gap among the previous items. The distribution is done by finding
590
- * the items that need to be fixed and then fixing them by shifting their left and right
591
- * positions.
592
- *
593
- * The function returns nothing, but it modifies the mappedValues array in place.
594
- */
595
- var adjustLastItem = function (mappedValues) {
596
- var lastItem = mappedValues[mappedValues.length - 1];
597
- var lastDifference = lastItem.right - lastItem.left;
598
- var withoutLastItem = mappedValues.slice(0, mappedValues.length - 1);
599
- var differences = withoutLastItem.map(function (_a) {
600
- var left = _a.left, right = _a.right;
601
- return right - left;
602
- });
603
- var averageDifference = Math.floor(differences.reduce(function (sum, diff) { return sum + diff; }, 0) / differences.length);
604
- var _getRandomIndexFromArray = function (array, storedChanges) {
605
- if (storedChanges.length === array.length) {
606
- storedChanges = [];
607
- }
608
- var randomIndex = Math.floor(Math.random() * array.length);
609
- var randomIndexAlreadyStored = storedChanges.includes(randomIndex);
610
- while (randomIndexAlreadyStored) {
611
- randomIndex = Math.floor(Math.random() * withoutLastItem.length);
612
- randomIndexAlreadyStored = storedChanges.includes(randomIndex);
613
- }
614
- storedChanges.push(randomIndex);
615
- return { randomIndex: randomIndex, storedChanges: storedChanges };
616
- };
617
- var needFixLastItem = lastDifference < averageDifference;
618
- var arr = [];
619
- if (needFixLastItem) {
620
- var captureItensCount = averageDifference - lastDifference;
621
- var randomIndexStored = [];
622
- for (var i = 0; i <= captureItensCount; i++) {
623
- var _a = _getRandomIndexFromArray(withoutLastItem, randomIndexStored), randomIndex = _a.randomIndex, storedChanges = _a.storedChanges;
624
- randomIndexStored = storedChanges;
625
- arr.push(randomIndex);
626
- var randomItem = withoutLastItem[randomIndex];
627
- --lastItem.left;
628
- --randomItem.right;
629
- }
630
- mappedValues.forEach(function (mappedValue, index) {
631
- var _next = mappedValues[index + 1];
632
- if (!_next) {
633
- return;
634
- }
635
- var nextLeft = _next.left;
636
- var currentRight = mappedValue.right;
637
- if (currentRight !== currentRight + 1) {
638
- var _nextDiff = _next.right - nextLeft;
639
- var _nextLeft = currentRight + 1;
640
- _next.left = _nextLeft;
641
- _next.right = _nextLeft + _nextDiff;
642
- }
643
- });
644
- }
636
+ var getMidpoint = function (start, end) {
637
+ var midpoint = (start + end) / 2;
638
+ return parseFloat(midpoint.toFixed(2));
639
+ };
640
+ var ɵ2 = getMidpoint;
641
+ var getDifference = function (end, start) {
642
+ return Math.abs(end - start);
645
643
  };
646
- var ɵ2 = adjustLastItem;
647
- export { ɵ0, ɵ1, ɵ2 };
648
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWN6RTtJQUFBO1FBQUEsaUJBMGhCQztRQXJoQlUsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixVQUFLLEdBQThCLENBQUMsQ0FBQztRQUdyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRzVELFNBQUksR0FBRyxDQUFDLENBQUM7UUFHVCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFFBQUcsR0FBRyxDQUFDLENBQUM7UUFHUixRQUFHLEdBQUcsR0FBRyxDQUFDO1FBU1YsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUViLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2Isc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLGFBQVEsR0FBK0MsY0FBTyxDQUFDLENBQUM7UUFDaEUsY0FBUyxHQUErQyxjQUFPLENBQUMsQ0FBQztRQUVoRSxrQkFBYSxHQUEyQixJQUFJLENBQUM7UUFDN0Msa0NBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMscUNBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsK0NBQTBDLEdBQUcsQ0FB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QUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7YUFDdkM7UUFDTCxDQUFDLENBQUMsQ0FBQztLQUNOO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJzLXNsaWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc2xpZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3NsaWRlci5jb21wb25lbnQuc2Nzc1wiXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgQFZpZXdDaGlsZChcInRyYWNrXCIpXG4gICAgcHVibGljIHRyYWNrITogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZTogbnVtYmVyIHwgW251bWJlciwgbnVtYmVyXSA9IDA7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdGVwID0gMTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhpZGRlblRodW1iID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IDEwMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1pblZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRhYmluZGV4ID0gMDtcblxuICAgIHB1YmxpYyBzdGFydFZhbHVlID0gMDtcbiAgICBwdWJsaWMgZW5kVmFsdWUgPSAwO1xuICAgIHB1YmxpYyBtb3ZpbmdQcm9ncmVzc0JhciA9IGZhbHNlO1xuICAgIHB1YmxpYyBwcm9ncmVzc0xlZnQgPSAwO1xuICAgIHB1YmxpYyBwcm9ncmVzc1dpZHRoID0gXCJcIjtcblxuICAgIHB1YmxpYyBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHVibGljIG9uVG91Y2hlZDogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIGRyYWdnaW5nVGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gLTE7XG4gICAgcHJpdmF0ZSBzdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIHByaXZhdGUgcmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgcHJpdmF0ZSB0b3RhbFJhbmdlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIC8qKlxuICAgICAqIE1hcCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHZhbHVlcyBpbiByYW5nZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHdpdGggbWluID0gLTEwIGFuZCBtYXggPSAxMCB3aWxsIGhhdmUgdGhpcyBtYXAuXG4gICAgICoge1xuICAgICAqICAgICAtMTA6IHsgbGVmdDogMCwgcmlnaHQ6IDEwIH0sXG4gICAgICogICAgIC05OiB7IGxlZnQ6IDExLCByaWdodDogMTkgfSxcbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAxMDogeyBsZWZ0OiA5MCwgcmlnaHQ6IDEwMCB9XG4gICAgICogfVxuICAgICAqIHRoZSBsZWZ0IHZhbHVlIHJlcHJlc2VudCB2YWx1ZSBmb3Igc3RhcnRWYWx1ZSwgdGhlIHJpZ2h0IHZhbHVlIHJlcHJlc2VudCB2YWx1ZSBmb3IgZW5kVmFsdWVcbiAgICAgKiBsZWZ0IGFuZCByaWdodCB2YWx1ZXMg4oCL4oCLYXJlIHVzZWQgd2hlbiBhcHBseWluZyBwZXJjZW50YWdlcyBpbiB0aGUgc2xpZGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBSYW5nZVZhbHVlc0ZvclNsaWRlcjogTWFwPG51bWJlciwgeyBsZWZ0OiBudW1iZXI7IHJpZ2h0OiBudW1iZXIgfT4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBhY3RpdmVNb3VzZURvd24gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZVZhbHVlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZG9jdW1lbnQ6a2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gICAgcHVibGljIG9uS2V5ZG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNBY3RpdmUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlMZWZ0ID0gJGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlSaWdodCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiO1xuICAgICAgICAgICAgaWYgKGlzQXJyb3dLZXlMZWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleUxlZnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd0tleVJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleVJpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBTdGFydFRleHQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHRoaXMuc3RhcnRWYWx1ZSkgOiB0aGlzLnN0YXJ0VmFsdWUpLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwRW5kVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5lbmRWYWx1ZSkgOiB0aGlzLmVuZFZhbHVlKS50b1N0cmluZygpO1xuICAgIH0gICAgXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzSW4oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFja0NsaWNrKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgfHwgdGhpcy5hY3RpdmVNb3VzZURvd24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUJ5RXZlbnQoZXZ0KTtcbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1RvVXNlclJhbmdlID0gdGhpcy5nZXRVc2VyVmFsdWVGcm9tU2xpZGVyVmFsdWVCeU1hcCh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgIGNvbnN0IF90cmFja0NsaWNrVmFsaWQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICBjb25zdCBfc2V0RW5kVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfZW5kVmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgX2VuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpLnJpZ2h0IDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMgJiYgX2VuZFZhbHVlVXNlclZhbHVlICE9PSB0cmFja0NsaWNrVG9Vc2VyUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gX2VuZFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgX3NldFN0YXJ0VmFsdWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodGhpcy5zdGFydFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSkubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IF9zdGFydFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkU3RhcnQgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHN0YXJ0KS5sZWZ0IDogc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEVuZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKS5yaWdodCA6IGVuZDtcbiAgICAgICAgICAgIGNvbnN0IF91cGRhdGVTdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0U3RhcnRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RyYWNrQ2xpY2tQZXJjZW50YWdlLCB2YWxpZEVuZF0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKFt2YWxpZFN0YXJ0LCB0cmFja0NsaWNrUGVyY2VudGFnZV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrUGVyY2VudGFnZUJldHdlZW5SYW5nZSA9IGlzSW5SYW5nZShfdHJhY2tDbGlja1ZhbGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChfdHJhY2tDbGlja1ZhbGlkIDwgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoX3RyYWNrQ2xpY2tWYWxpZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gKHN0YXJ0ICsgZW5kKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUgPSBfdHJhY2tDbGlja1ZhbGlkID09PSBtaWRkbGU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrQ2xpY2tQZXJjZW50YWdlSXNFeGFjdGlkZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldFN0YXJ0ID0gX3RyYWNrQ2xpY2tWYWxpZCA8IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0RW5kID0gX3RyYWNrQ2xpY2tWYWxpZCA+IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlU3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodHJhY2tDbGlja1BlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgX3NldEVuZFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFByb2dyZXNzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZ3Jlc3NNb3VzZURvd24oZXZ0OiBQb2ludGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyZXNzQmFyRXZlbnRQb3NpdGlvblN0YXJ0ID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldnQpO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IHRoaXMuZW5kVmFsdWUgLSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Nb3VzZURvd24oXzogTW91c2VFdmVudCwgdGh1bWI6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmRyYWdnaW5nVGh1bWIgPSB0aHVtYjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25UaHVtYk1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRSYW5nZVZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgdXNlIFwibXVsdGlwbGVcIiB3aXRoIHZhbHVlIGFzIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzUmFuZ2VWYWx1ZXMgPSAhISh0aGlzLnN0YXJ0VmFsdWUgJiYgdGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgIWhhc1JhbmdlVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlWzBdO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWVbMV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aXBsZSAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgaXNFcXVhbEFuZE11bHRpcGxlID0gdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnN0YXJ0VmFsdWUgPT09IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0aGlzLnN0YXJ0VmFsdWUpLmxlZnQ7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbEFuZE11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRoaXMuZW5kVmFsdWUpLnJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGh1bWJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8ICF0aGlzLmRyYWdnaW5nVGh1bWIpIHJldHVybjtcblxuICAgICAgICBsZXQgbmV3UG9zaXRpb24gPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwic3RhcnRcIiAmJiBuZXdQb3NpdGlvbiA+IHRoaXMuZW5kVmFsdWUpIHx8XG4gICAgICAgICAgICAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIgJiYgbmV3UG9zaXRpb24gPCB0aGlzLnN0YXJ0VmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25JblVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAobmV3UG9zaXRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkucmlnaHRcbiAgICAgICAgICAgICAgICAgICAgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShbdGhpcy5zdGFydFZhbHVlLCB0aGlzLmVuZFZhbHVlXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmVuZFZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA9PT0gZW5kICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwaWNrTGVmdFZhbHVlID0gbmV3UG9zaXRpb24gPD0gNTA7XG4gICAgICAgICAgICBjb25zdCBwaWNrUmlnaHRWYWx1ZSA9IG5ld1Bvc2l0aW9uID4gNTA7XG5cbiAgICAgICAgICAgIGlmIChwaWNrTGVmdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQocG9zaXRpb25JblVzZXJSYW5nZSkubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwaWNrUmlnaHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpLnJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IG51bGw7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICB9LCAxNTApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdGhpcy5nZXRQZXJjZW50YWdlQnlFdmVudChldmVudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCA9IHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQ7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudCA9IHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZUJldHdlZW5FbGVtZW50c0JlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgIGxldCB7IG5ld1N0YXJ0LCBuZXdFbmQgfSA9IGNhbGN1bGF0ZU5ld1JhbmdlKFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50LFxuICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ICsgcmFuZ2UsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBuZXdDZW50ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld1N0YXJ0IDwgMCB8fCBuZXdFbmQgPiAxMDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoc3RhcnRWYWx1ZUJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudFVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAoc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclVzZXJSYW5nZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAobmV3Q2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSB0aGlzLnRvdGFsUmFuZ2VCZWZvcmVQcm9ncmVzc0JhckV2ZW50O1xuICAgICAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VmFsdWVCZWZvcmVFdmVudFVzZXJSYW5nZSArIHZhbHVlUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50VXNlclJhbmdlLFxuICAgICAgICAgICAgICAgIGNlbnRlclVzZXJSYW5nZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGFydCA8IHRoaXMubWluIHx8IG5ld0VuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3U3RhcnQpLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3RW5kKS5yaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0O1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IG5ld0VuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0UHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzTGVmdCA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1dpZHRoID0gYGNhbGMoJHt0aGlzLmVuZFZhbHVlfSUgKyAxMHB4KWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgYSBtb3VzZSBldmVudCBmcm9tIHRoZSB0cmFjaydzIGxlZnQgZWRnZVxuICAgICAqIEBwYXJhbSBtb3VzZUV2ZW50IG1vdXNlIGV2ZW50XG4gICAgICogQHJldHVybnMgcGVyY2VudGFnZSBmcm9tIHRoZSBsZWZ0IGVkZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBlcmNlbnRhZ2VCeUV2ZW50KG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0cmFja1JlY3QgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBuZXdMZWZ0ID0gKChtb3VzZUV2ZW50LmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGgpICogMTAwO1xuICAgICAgICBuZXdMZWZ0ID0gTWF0aC5yb3VuZChuZXdMZWZ0IC8gdGhpcy5zdGVwKSAqIHRoaXMuc3RlcDtcbiAgICAgICAgbmV3TGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKG5ld0xlZnQsIDEwMCkpO1xuICAgICAgICByZXR1cm4gbmV3TGVmdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh4KSA9PiB0aGlzLmdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHgpKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0VXNlclZhbHVlRnJvbVNsaWRlclZhbHVlQnlNYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVzZXJSYW5nZU1hcFZhbHVlcygpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgIGxldCBmb3JTdGFydCA9IDA7XG4gICAgICAgIGxldCBmb3JFbmQgPSAxMDA7XG4gICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuY2xlYXIoKTtcbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWVzOiB7IHZhbHVlOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXNXaXRoTWFwID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gZm9yU3RhcnQ7IGogPD0gZm9yRW5kOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzbGlkZXJUb1VzZXJSYW5nZVZhbHVlID0gdGhpcy5tYXBTbGlkZXJUb1VzZXJSYW5nZShqKTtcbiAgICAgICAgICAgICAgICBpZiAoc2xpZGVyVG9Vc2VyUmFuZ2VWYWx1ZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBmb3JTdGFydCA9IGo7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1dpdGhNYXAucHVzaChqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gdmFsdWVzV2l0aE1hcFswXTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdmFsdWVzV2l0aE1hcFt2YWx1ZXNXaXRoTWFwLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgbWFwcGVkVmFsdWVzLnB1c2goeyB2YWx1ZTogaSwgbGVmdCwgcmlnaHQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYWRqdXN0TGFzdEl0ZW0obWFwcGVkVmFsdWVzKTtcbiAgICAgICAgbWFwcGVkVmFsdWVzLmZvckVhY2goKG1hcHBlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLnNldChtYXBwZWRWYWx1ZS52YWx1ZSwgeyAuLi5tYXBwZWRWYWx1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIHNsaWRlciB2YWx1ZSB0byBhIHVzZXIgdmFsdWUgaW4gdGhlIHJhbmdlIFttaW4sIG1heF0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiBtaW4gPSAwIGFuZCBtYXggPSAxMCwgbWFwU2xpZGVyVG9Vc2VyUmFuZ2UoMjUpIHJldHVybnMgMi41XG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXBTbGlkZXJUb1VzZXJSYW5nZShzbGlkZXJWYWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMubWluICsgKHNsaWRlclZhbHVlIC8gMTAwKSAqICh0aGlzLm1heCAtIHRoaXMubWluKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUgYnkgdXNpbmcgdGhlIG1hcCBvZiByYW5nZSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiB0aGUgbWFwIGlzIFt7dmFsdWU6IDAsIGxlZnQ6IDAsIHJpZ2h0OiAyNX0sIHt2YWx1ZTogMSwgbGVmdDogMjUsIHJpZ2h0OiA1MH0sIHt2YWx1ZTogMiwgbGVmdDogNTAsIHJpZ2h0OiA3NX0sIHt2YWx1ZTogMywgbGVmdDogNzUsIHJpZ2h0OiAxMDB9XVxuICAgICAqIGFuZCB0aGUgc2xpZGVyVmFsdWUgaXMgMzcsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDFcbiAgICAgKiBAcGFyYW0gc2xpZGVyVmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzbGlkZXJcbiAgICAgKiBAcmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFVzZXJWYWx1ZUZyb21TbGlkZXJWYWx1ZUJ5TWFwKHNsaWRlclZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbWFwVG9BcnJheSA9IEFycmF5LmZyb20odGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlcikubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogeFswXSwgLi4ueFsxXSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IGlzSW5SYW5nZShzbGlkZXJWYWx1ZSwgeC5sZWZ0LCB4LnJpZ2h0KSk7XG4gICAgICAgIHJldHVybiBtYXBwZWRWYWx1ZT8udmFsdWUgPz8gc2xpZGVyVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleUxlZnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRFbmRWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlSaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luY3JlbWVudE9yRGVjcmVtZW50U3RhcnRBbmRFbmRWYWx1ZShpbmNyZW1lbnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kICs9IHRoaXMuc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0IC09IHRoaXMuc3RlcDtcbiAgICAgICAgICAgIGVuZCAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5oYXMoc3RhcnQpIHx8ICF0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmhhcyhlbmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNFcXVhbCA9IHN0YXJ0ID09PSBlbmQ7XG4gICAgICAgICAgICBpZiAoaXNFcXVhbCAmJiBlbmQgPT09IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh0aGlzLm1heCkucmlnaHQ7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoc3RhcnQpLmxlZnQ7XG4gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQoZW5kKS5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiAxMDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IGVuZDtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbc3RhcnQsIGVuZF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUoaW5jcmVtZW50OiBib29sZWFuKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLnN0ZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSAtPSB0aGlzLnN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IF9uZXdFbmRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5uZWVkUGFyc2VWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUGFyc2VkSW5TbGlkZXIgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlUGFyc2VkSW5TbGlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwaWNrTGVmdCA9IHZhbHVlUGFyc2VkSW5TbGlkZXIucmlnaHQgPD0gNTA7XG4gICAgICAgICAgICBpZiAocGlja0xlZnQpIHtcbiAgICAgICAgICAgICAgICBfbmV3RW5kVmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldCh2YWx1ZSkubGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX25ld0VuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodmFsdWUpLnJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChfbmV3RW5kVmFsdWUgPCAwIHx8IF9uZXdFbmRWYWx1ZSA+IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5kVmFsdWUgPSBfbmV3RW5kVmFsdWU7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZW5kVmFsdWU7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmVlZFBhcnNlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXggIT09IDEwMCB8fCB0aGlzLm1pbiAhPT0gMDtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIG5ldyByYW5nZSBiYXNlZCBvbiB0aGUgb2xkIHJhbmdlIGFuZCB0aGUgcG9zaXRpb25zIGNsaWNrZWQgYW5kIGZpbmFsaXplZC5cbiAqXG4gKiBAcGFyYW0gb2xkU3RhcnQgLSBUaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIG9sZCByYW5nZS5cbiAqIEBwYXJhbSBvbGRFbmQgLSBUaGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gY2xpY2tlZFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZC5cbiAqIEBwYXJhbSBmaW5hbFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSByYW5nZSBzaG91bGQgZW5kLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgcmFuZ2UuXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZU5ld1JhbmdlID0gKG9sZFN0YXJ0OiBudW1iZXIsIG9sZEVuZDogbnVtYmVyLCBjbGlja2VkUG9zaXRpb246IG51bWJlciwgZmluYWxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPSBvbGRFbmQgLSBvbGRTdGFydDtcbiAgICBjb25zdCBuZXdTdGFydCA9IGZpbmFsUG9zaXRpb24gLSAoY2xpY2tlZFBvc2l0aW9uIC0gb2xkU3RhcnQpO1xuICAgIGNvbnN0IG5ld0VuZCA9IG5ld1N0YXJ0ICsgcmFuZ2U7XG4gICAgcmV0dXJuIHsgbmV3U3RhcnQsIG5ld0VuZCB9O1xufTtcblxuY29uc3QgaXNJblJhbmdlID0gKHZhbHVlOiBudW1iZXIsIHJhbmdlU3RhcnQ6IG51bWJlciwgcmFuZ2VFbmQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSByYW5nZVN0YXJ0IDwgcmFuZ2VFbmQgPyBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIDogW3JhbmdlRW5kLCByYW5nZVN0YXJ0XTtcbiAgICByZXR1cm4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBsYXN0IGl0ZW0gb2YgYSBtYXBwZWQgcmFuZ2UgdG8gZmlsbCB0aGUgZ2FwIGJldHdlZW4gaXQgYW5kIHRoZSBwZW51bHRpbWF0ZSBpdGVtLlxuICogVGhlIGdhcCBpcyBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3QgaXRlbSdzIHJpZ2h0IGFuZCBsZWZ0XG4gKiBmcm9tIHRoZSBhdmVyYWdlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbGwgdGhlIHByZXZpb3VzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSBtYXBwZWRWYWx1ZXMgLSBUaGUgbWFwcGVkIHJhbmdlIHRvIGJlIGFkanVzdGVkLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB3b3JrcyBieSBmaW5kaW5nIHRoZSBnYXAgYmV0d2VlbiB0aGUgbGFzdCBpdGVtIGFuZCB0aGUgcGVudWx0aW1hdGUgaXRlbSBhbmRcbiAqIHRoZW4gZGlzdHJpYnV0aW5nIHRoaXMgZ2FwIGFtb25nIHRoZSBwcmV2aW91cyBpdGVtcy4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBkb25lIGJ5IGZpbmRpbmdcbiAqIHRoZSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgZml4ZWQgYW5kIHRoZW4gZml4aW5nIHRoZW0gYnkgc2hpZnRpbmcgdGhlaXIgbGVmdCBhbmQgcmlnaHRcbiAqIHBvc2l0aW9ucy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nLCBidXQgaXQgbW9kaWZpZXMgdGhlIG1hcHBlZFZhbHVlcyBhcnJheSBpbiBwbGFjZS5cbiAqL1xuY29uc3QgYWRqdXN0TGFzdEl0ZW0gPSAobWFwcGVkVmFsdWVzOiB7IHZhbHVlOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlciB9W10pID0+IHtcbiAgICBjb25zdCBsYXN0SXRlbSA9IG1hcHBlZFZhbHVlc1ttYXBwZWRWYWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbGFzdERpZmZlcmVuY2UgPSBsYXN0SXRlbS5yaWdodCAtIGxhc3RJdGVtLmxlZnQ7XG4gICAgY29uc3Qgd2l0aG91dExhc3RJdGVtID0gbWFwcGVkVmFsdWVzLnNsaWNlKDAsIG1hcHBlZFZhbHVlcy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHdpdGhvdXRMYXN0SXRlbS5tYXAoKHsgbGVmdCwgcmlnaHQgfSkgPT4gcmlnaHQgLSBsZWZ0KTtcbiAgICBjb25zdCBhdmVyYWdlRGlmZmVyZW5jZSA9IE1hdGguZmxvb3IoZGlmZmVyZW5jZXMucmVkdWNlKChzdW0sIGRpZmYpID0+IHN1bSArIGRpZmYsIDApIC8gZGlmZmVyZW5jZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IF9nZXRSYW5kb21JbmRleEZyb21BcnJheSA9IDxUPihhcnJheTogVFtdLCBzdG9yZWRDaGFuZ2VzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkQ2hhbmdlcy5sZW5ndGggPT09IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgc3RvcmVkQ2hhbmdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFycmF5Lmxlbmd0aCk7XG4gICAgICAgIGxldCByYW5kb21JbmRleEFscmVhZHlTdG9yZWQgPSBzdG9yZWRDaGFuZ2VzLmluY2x1ZGVzKHJhbmRvbUluZGV4KTtcbiAgICAgICAgd2hpbGUgKHJhbmRvbUluZGV4QWxyZWFkeVN0b3JlZCkge1xuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB3aXRob3V0TGFzdEl0ZW0ubGVuZ3RoKTtcbiAgICAgICAgICAgIHJhbmRvbUluZGV4QWxyZWFkeVN0b3JlZCA9IHN0b3JlZENoYW5nZXMuaW5jbHVkZXMocmFuZG9tSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlZENoYW5nZXMucHVzaChyYW5kb21JbmRleCk7XG4gICAgICAgIHJldHVybiB7IHJhbmRvbUluZGV4LCBzdG9yZWRDaGFuZ2VzIH07XG4gICAgfTtcblxuICAgIGNvbnN0IG5lZWRGaXhMYXN0SXRlbSA9IGxhc3REaWZmZXJlbmNlIDwgYXZlcmFnZURpZmZlcmVuY2U7XG4gICAgbGV0IGFyciA9IFtdO1xuICAgIGlmIChuZWVkRml4TGFzdEl0ZW0pIHtcbiAgICAgICAgY29uc3QgY2FwdHVyZUl0ZW5zQ291bnQgPSBhdmVyYWdlRGlmZmVyZW5jZSAtIGxhc3REaWZmZXJlbmNlO1xuICAgICAgICBsZXQgcmFuZG9tSW5kZXhTdG9yZWQ6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNhcHR1cmVJdGVuc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmFuZG9tSW5kZXgsIHN0b3JlZENoYW5nZXMgfSA9IF9nZXRSYW5kb21JbmRleEZyb21BcnJheSh3aXRob3V0TGFzdEl0ZW0sIHJhbmRvbUluZGV4U3RvcmVkKTtcbiAgICAgICAgICAgIHJhbmRvbUluZGV4U3RvcmVkID0gc3RvcmVkQ2hhbmdlcztcbiAgICAgICAgICAgIGFyci5wdXNoKHJhbmRvbUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmRvbUl0ZW0gPSB3aXRob3V0TGFzdEl0ZW1bcmFuZG9tSW5kZXhdO1xuICAgICAgICAgICAgLS1sYXN0SXRlbS5sZWZ0O1xuICAgICAgICAgICAgLS1yYW5kb21JdGVtLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIG1hcHBlZFZhbHVlcy5mb3JFYWNoKChtYXBwZWRWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9uZXh0ID0gbWFwcGVkVmFsdWVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIV9uZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dExlZnQgPSBfbmV4dC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJpZ2h0ID0gbWFwcGVkVmFsdWUucmlnaHQ7XG4gICAgICAgICAgICBpZiAoY3VycmVudFJpZ2h0ICE9PSBjdXJyZW50UmlnaHQgKyAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX25leHREaWZmID0gX25leHQucmlnaHQgLSBuZXh0TGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBfbmV4dExlZnQgPSBjdXJyZW50UmlnaHQgKyAxO1xuICAgICAgICAgICAgICAgIF9uZXh0LmxlZnQgPSBfbmV4dExlZnQ7XG4gICAgICAgICAgICAgICAgX25leHQucmlnaHQgPSBfbmV4dExlZnQgKyBfbmV4dERpZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iXX0=
644
+ var ɵ3 = getDifference;
645
+ export { ɵ0, ɵ1, ɵ2, ɵ3 };
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWN6RTtJQUFBO1FBQUEsaUJBb2tCQztRQW5rQm9CLG9CQUFlLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBSzlCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHakIsVUFBSyxHQUE4QixDQUFDLENBQUM7UUFHckMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUc1RCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBR1QsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUdqQixRQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUczQixRQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQVMzQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFDakIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFbkIsYUFBUSxHQUErQyxjQUFRLENBQUMsQ0FBQztRQUNqRSxjQUFTLEdBQStDLGNBQVEsQ0FBQyxDQUFDO1FBRWpFLGtCQUFhLEdBQTJCLElBQUksQ0FBQztRQUM3QyxrQ0FB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QUFvRixFQUFuRixXQUFHLEVBQUUsV0FBOEUsQ0FBQztJQUMzRixPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUN4QyxDQUFDLENBQUM7O0FBRUYsSUFBTSxXQUFXLEdBQUcsVUFBQyxLQUFhLEVBQUUsR0FBVztJQUMzQyxJQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQTs7QUFDRCxJQUFNLGFBQWEsR0FBRyxVQUFDLEdBQVcsRUFBRSxLQUFhO0lBQzdDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInMtc2xpZGVyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9zbGlkZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vc2xpZGVyLmNvbXBvbmVudC5zY3NzXCJdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNsaWRlckNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTUFYX1JBTkdFX1ZBTFVFID0gMTAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgTUlOX1JBTkdFX1ZBTFVFID0gMDtcbiAgICBAVmlld0NoaWxkKFwidHJhY2tcIilcbiAgICBwdWJsaWMgdHJhY2shOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdID0gMDtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyIHwgW251bWJlciwgbnVtYmVyXT4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHN0ZXAgPSAxO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGlkZGVuVGh1bWIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW4gPSB0aGlzLk1JTl9SQU5HRV9WQUxVRTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1heCA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluVmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4VmFsdWVMYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgcHVibGljIHN0YXJ0VmFsdWUgPSAwO1xuICAgIHB1YmxpYyBlbmRWYWx1ZSA9IDA7XG4gICAgcHVibGljIG1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgcHVibGljIHByb2dyZXNzTGVmdCA9IDA7XG4gICAgcHVibGljIHByb2dyZXNzV2lkdGggPSBcIlwiO1xuXG4gICAgcHVibGljIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gICAgcHVibGljIG9uVG91Y2hlZDogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuXG4gICAgcHJpdmF0ZSBkcmFnZ2luZ1RodW1iOiBcInN0YXJ0XCIgfCBcImVuZFwiIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgIHByaXZhdGUgc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICBwcml2YXRlIHJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudCA9IC0xO1xuICAgIHByaXZhdGUgdG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAvKipcbiAgICAgKiBNYXAgb2YgdmFsaWQgdmFsdWVzIGZvciB2YWx1ZXMgaW4gcmFuZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB3aXRoIG1pbiA9IC0xMCBhbmQgbWF4ID0gMTAgd2lsbCBoYXZlIHRoaXMgbWFwLlxuICAgICAqIHtcbiAgICAgKiAgICAgLTEwOiB7IDAgfSxcbiAgICAgKiAgICAgLTk6IHsgMTAgfSxcbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAxMDogeyAxMCB9XG4gICAgICogfVxuICAgICAqL1xuICAgIHByaXZhdGUgbWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXI6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gICAgcHJpdmF0ZSBhY3RpdmVNb3VzZURvd24gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZvY3VzQWN0aXZlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0VXNlclJhbmdlTWFwVmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFzQ2hhbmdlc09uTWluID0gY2hhbmdlcy5taW4gJiYgIWNoYW5nZXMubWluLmZpcnN0Q2hhbmdlO1xuICAgICAgICBjb25zdCBoYXNDaGFuZ2VzT25NYXggPSBjaGFuZ2VzLm1heCAmJiAhY2hhbmdlcy5tYXguZmlyc3RDaGFuZ2U7XG4gICAgICAgIGNvbnN0IGhhc0NoYW5nZXMgPSBoYXNDaGFuZ2VzT25NaW4gfHwgaGFzQ2hhbmdlc09uTWF4O1xuICAgICAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyUmFuZ2VNYXBWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VWYWx1ZXMoKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKFwiZG9jdW1lbnQ6a2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gICAgcHVibGljIG9uS2V5ZG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNBY3RpdmUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlMZWZ0ID0gJGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXlSaWdodCA9ICRldmVudC5rZXkgPT09IFwiQXJyb3dSaWdodFwiO1xuICAgICAgICAgICAgaWYgKGlzQXJyb3dLZXlMZWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleUxlZnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd0tleVJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBcnJvd0tleVJpZ2h0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvb2x0aXBTdGFydFRleHQoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZVswXT8udG9TdHJpbmcoKSA6IHRoaXMudmFsdWU/LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwRW5kVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlWzFdPy50b1N0cmluZygpIDogdGhpcy52YWx1ZT8udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IG51bWJlciB8IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzSW4oKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFja0NsaWNrKGV2dDogUG9pbnRlckV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgfHwgdGhpcy5hY3RpdmVNb3VzZURvd24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUJ5RXZlbnQoZXZ0KTtcbiAgICAgICAgY29uc3QgdHJhY2tDbGlja1RvVXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHRyYWNrQ2xpY2tQZXJjZW50YWdlKTtcbiAgICAgICAgY29uc3QgX3RyYWNrQ2xpY2tWYWxpZCA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdHJhY2tDbGlja1RvVXNlclJhbmdlIDogdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgIGNvbnN0IF9zZXRFbmRWYWx1ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9lbmRWYWx1ZVVzZXJWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh0aGlzLmVuZFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IF9lbmRWYWx1ZSA9IHRoaXMubmVlZFBhcnNlVmFsdWVzID8gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQodHJhY2tDbGlja1RvVXNlclJhbmdlKSA6IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzICYmIF9lbmRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IF9lbmRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRyYWNrQ2xpY2tQZXJjZW50YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IF9zZXRTdGFydFZhbHVlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWVVc2VyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodGhpcy5zdGFydFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBfc3RhcnRWYWx1ZVVzZXJWYWx1ZSAhPT0gdHJhY2tDbGlja1RvVXNlclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3N0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHRyYWNrQ2xpY2tUb1VzZXJSYW5nZSlcbiAgICAgICAgICAgICAgICAgICAgOiB0cmFja0NsaWNrUGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBfc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdHJhY2tDbGlja1BlcmNlbnRhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgICAgICBjb25zdCB2YWxpZFN0YXJ0ID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChzdGFydCkgOiBzdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkRW5kID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChlbmQpIDogZW5kO1xuICAgICAgICAgICAgY29uc3QgX3VwZGF0ZVN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRTdGFydFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShbdHJhY2tDbGlja1BlcmNlbnRhZ2UsIHZhbGlkRW5kXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBfdXBkYXRlRW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9zZXRFbmRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3ZhbGlkU3RhcnQsIHRyYWNrQ2xpY2tQZXJjZW50YWdlXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2xpY2tQZXJjZW50YWdlQmV0d2VlblJhbmdlID0gaXNJblJhbmdlKF90cmFja0NsaWNrVmFsaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKF90cmFja0NsaWNrVmFsaWQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfdHJhY2tDbGlja1ZhbGlkID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGlja1BlcmNlbnRhZ2VCZXR3ZWVuUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWRkbGUgPSAoc3RhcnQgKyBlbmQpIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFja0NsaWNrUGVyY2VudGFnZUlzRXhhY3RpZGRsZSA9IF90cmFja0NsaWNrVmFsaWQgPT09IG1pZGRsZTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tDbGlja1BlcmNlbnRhZ2VJc0V4YWN0aWRkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0U3RhcnQgPSBfdHJhY2tDbGlja1ZhbGlkIDwgbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRFbmQgPSBfdHJhY2tDbGlja1ZhbGlkID4gbWlkZGxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVTdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldEVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZUVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0cmFja0NsaWNrUGVyY2VudGFnZSk7XG4gICAgICAgICAgICBfc2V0RW5kVmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qcm9ncmVzc01vdXNlRG93bihldnQ6IFBvaW50ZXJFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJFdmVudFBvc2l0aW9uU3RhcnQgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2dCk7XG4gICAgICAgIHRoaXMuc3RhcnRWYWx1ZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSB0aGlzLnN0YXJ0VmFsdWU7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gdGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMudmFsdWUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSBlbmQgLSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5oYW5kbGVQcm9ncmVzc0Jhck1vdmVFbmQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1vdXNlRG93bihfOiBNb3VzZUV2ZW50LCB0aHVtYjogXCJzdGFydFwiIHwgXCJlbmRcIik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZHJhZ2dpbmdUaHVtYiA9IHRodW1iO1xuICAgICAgICB0aGlzLmFjdGl2ZU1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vblRodW1iTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJhbmdlVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBfc2V0U3RhcnRBbmRFbmRWYWx1ZSA9IChzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMuZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcihzdGFydFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoZW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmICF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHVzZSBcIm11bHRpcGxlXCIgd2l0aCB2YWx1ZSBhcyBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWVbMF07XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy52YWx1ZVsxXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBfc2V0U3RhcnRBbmRFbmRWYWx1ZSh0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgW19zdGFydFZhbHVlLCBfZW5kVmFsdWVdID0gdGhpcy52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBnZXREaWZmZXJlbmNlKF9lbmRWYWx1ZSwgX3N0YXJ0VmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXggPSBfZW5kVmFsdWUgPiB0aGlzLm1heDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFZhbHVlSXNMZXNzVGhhbk1pbiA9IF9zdGFydFZhbHVlIDwgdGhpcy5taW47XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZFVwZGF0ZVZhbHVlcyA9IGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXggfHwgc3RhcnRWYWx1ZUlzTGVzc1RoYW5NaW47XG4gICAgICAgICAgICAgICAgaWYgKGVuZFZhbHVlSXNHcmVhdGhlclRoYW5NYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgX2VuZFZhbHVlID0gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgICAgIF9zdGFydFZhbHVlID0gX2VuZFZhbHVlIC0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0VmFsdWVJc0xlc3NUaGFuTWluKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zdGFydFZhbHVlID0gdGhpcy5taW47XG4gICAgICAgICAgICAgICAgICAgIF9lbmRWYWx1ZSA9IF9zdGFydFZhbHVlICsgZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgX3NldFN0YXJ0QW5kRW5kVmFsdWUoX3N0YXJ0VmFsdWUsIF9lbmRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IF92YWx1ZSA9IHRoaXMudmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlR3JlYXRoZXJUaGFuTWF4ID0gX3ZhbHVlID4gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVMZXNzVGhhbk1pbiA9IF92YWx1ZSA8IHRoaXMubWluO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRVcGRhdGVWYWx1ZSA9IHZhbHVlR3JlYXRoZXJUaGFuTWF4IHx8IHZhbHVlTGVzc1RoYW5NaW47XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlR3JlYXRoZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVMZXNzVGhhbk1pbikge1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRVcGRhdGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKF92YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uVGh1bWJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1vdmluZ1Byb2dyZXNzQmFyIHx8ICF0aGlzLmRyYWdnaW5nVGh1bWIpIHJldHVybjtcblxuICAgICAgICBsZXQgbmV3UG9zaXRpb24gPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIgJiYgbmV3UG9zaXRpb24gPiB0aGlzLmVuZFZhbHVlKSB8fFxuICAgICAgICAgICAgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kcmFnZ2luZ1RodW1iID09PSBcImVuZFwiICYmIG5ld1Bvc2l0aW9uIDwgdGhpcy5zdGFydFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUobmV3UG9zaXRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZ1RodW1iID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJlbmRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuZ2V0KHBvc2l0aW9uSW5Vc2VyUmFuZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogbmV3UG9zaXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoW3RoaXMuc3RhcnRWYWx1ZSwgdGhpcy5lbmRWYWx1ZV0pO1xuXG4gICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kICYmIHRoaXMuZHJhZ2dpbmdUaHVtYiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPT09IGVuZCAmJiB0aGlzLmRyYWdnaW5nVGh1bWIgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5zdGFydFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSBhcyBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgOiBuZXdQb3NpdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRTYW1lVmFsdWUgPSB0aGlzLm5lZWRQYXJzZVZhbHVlcyA/IHBvc2l0aW9uSW5Vc2VyUmFuZ2UgPT09IHRoaXMudmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0ZXAgPSB0aGlzLnN0ZXAgIT09IDA7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZUlzVmFsaWRCeVN0ZXAgPSBoYXNTdGVwID8gY3VycmVudFZhbHVlICsgdGhpcy5zdGVwID09PSBfdmFsdWUgfHwgY3VycmVudFZhbHVlIC0gdGhpcy5zdGVwID09PSBfdmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpc0F0U2FtZVZhbHVlICYmICFuZXdWYWx1ZUlzVmFsaWRCeVN0ZXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5uZWVkUGFyc2VWYWx1ZXMgPyB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChwb3NpdGlvbkluVXNlclJhbmdlKSA6IG5ld1Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5zdGFydFZhbHVlID0gdGhpcy5lbmRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy5lbmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZ1RodW1iID0gbnVsbDtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm9uVGh1bWJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubW92aW5nUHJvZ3Jlc3NCYXIgPSB0cnVlO1xuICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSB0aGlzLmdldFBlcmNlbnRhZ2VCeUV2ZW50KGV2ZW50KTtcbiAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50ID0gdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydDtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50ID0gdGhpcy5zdGFydFZhbHVlQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlQmV0d2VlbkVsZW1lbnRzQmVmb3JlUHJvZ3Jlc3NCYXJFdmVudDtcbiAgICAgICAgbGV0IHsgbmV3U3RhcnQsIG5ld0VuZCB9ID0gY2FsY3VsYXRlTmV3UmFuZ2UoXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQsXG4gICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnQgKyByYW5nZSxcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb25CZWZvcmVFdmVudCxcbiAgICAgICAgICAgIG5ld0NlbnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAobmV3U3RhcnQgPCB0aGlzLk1JTl9SQU5HRV9WQUxVRSB8fCBuZXdFbmQgPiB0aGlzLk1BWF9SQU5HRV9WQUxVRSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlID0gdGhpcy5nZXRWYWx1ZUZyb21NYXBCeVZhbHVlKHN0YXJ0VmFsdWVCZWZvcmVFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnRVc2VyUmFuZ2UgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoc3RhcnRQb3NpdGlvbkJlZm9yZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclVzZXJSYW5nZSA9IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZShuZXdDZW50ZXIpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVSYW5nZSA9IHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQ7XG4gICAgICAgICAgICBsZXQgeyBuZXdTdGFydCwgbmV3RW5kIH0gPSBjYWxjdWxhdGVOZXdSYW5nZShcbiAgICAgICAgICAgICAgICBzdGFydFZhbHVlQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgc3RhcnRWYWx1ZUJlZm9yZUV2ZW50VXNlclJhbmdlICsgdmFsdWVSYW5nZSxcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uQmVmb3JlRXZlbnRVc2VyUmFuZ2UsXG4gICAgICAgICAgICAgICAgY2VudGVyVXNlclJhbmdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG5ld1N0YXJ0IDwgdGhpcy5taW4gfHwgbmV3RW5kID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyLmdldChuZXdTdGFydCk7XG4gICAgICAgICAgICB0aGlzLmVuZFZhbHVlID0gdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5nZXQobmV3RW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRWYWx1ZSA9IG5ld1N0YXJ0O1xuICAgICAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IG5ld0VuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbHVlKFt0aGlzLnN0YXJ0VmFsdWUsIHRoaXMuZW5kVmFsdWVdKTtcbiAgICAgICAgdGhpcy5zZXRQcm9ncmVzcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb2dyZXNzQmFyTW92ZUVuZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckV2ZW50UG9zaXRpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWVCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMucmFuZ2VCZXR3ZWVuRWxlbWVudHNCZWZvcmVQcm9ncmVzc0JhckV2ZW50ID0gLTE7XG4gICAgICAgIHRoaXMudG90YWxSYW5nZUJlZm9yZVByb2dyZXNzQmFyRXZlbnQgPSAtMTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZVByb2dyZXNzQmFyTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuaGFuZGxlUHJvZ3Jlc3NCYXJNb3ZlRW5kKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ1Byb2dyZXNzQmFyID0gZmFsc2U7XG4gICAgICAgIH0sIDE1MCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0UHJvZ3Jlc3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzTGVmdCA9IHRoaXMuc3RhcnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NXaWR0aCA9IGBjYWxjKCR7dGhpcy5lbmRWYWx1ZSAtIHRoaXMuc3RhcnRWYWx1ZX0lICsgMTBweClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0xlZnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1dpZHRoID0gYGNhbGMoJHt0aGlzLmVuZFZhbHVlfSUgKyAxMHB4KWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBlcmNlbnRhZ2Ugb2YgYSBtb3VzZSBldmVudCBmcm9tIHRoZSB0cmFjaydzIGxlZnQgZWRnZVxuICAgICAqIEBwYXJhbSBtb3VzZUV2ZW50IG1vdXNlIGV2ZW50XG4gICAgICogQHJldHVybnMgcGVyY2VudGFnZSBmcm9tIHRoZSBsZWZ0IGVkZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFBlcmNlbnRhZ2VCeUV2ZW50KG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0cmFja1JlY3QgPSB0aGlzLnRyYWNrLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBuZXdMZWZ0ID0gTWF0aC5yb3VuZCgoKG1vdXNlRXZlbnQuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aCkgKiB0aGlzLk1BWF9SQU5HRV9WQUxVRSk7XG4gICAgICAgIG5ld0xlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuZXdMZWZ0LCB0aGlzLk1BWF9SQU5HRV9WQUxVRSkpO1xuICAgICAgICByZXR1cm4gbmV3TGVmdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZhbHVlKHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyLCBudW1iZXJdLCBwYXJzZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRQYXJzZVZhbHVlcyAmJiBwYXJzZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoKHgpID0+IHRoaXMuZ2V0VmFsdWVGcm9tTWFwQnlWYWx1ZSh4KSkgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbU1hcEJ5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFVzZXJSYW5nZU1hcFZhbHVlcygpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXggdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXBSYW5nZVZhbHVlc0ZvclNsaWRlci5jbGVhcigpO1xuICAgICAgICBjb25zdCByYW5nZSA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gMjtcbiAgICAgICAgY29uc3Qgc3RlcENvdW50ID0gTWF0aC5mbG9vcihyYW5nZSAvIHRoaXMuc3RlcCk7XG4gICAgICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdmFsdWUgPSBzdGFydDsgdmFsdWUgPD0gZW5kOyB2YWx1ZSArPSB0aGlzLnN0ZXApIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSAhPT0gZW5kKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gKCh2YWx1ZSAtIHN0YXJ0KSAvIHJhbmdlKSAqIHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWFwcGVkLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWFwcGVkVmFsdWVzWzBdID0gMDtcbiAgICAgICAgbWFwcGVkVmFsdWVzW21hcHBlZFZhbHVlcy5sZW5ndGggLSAxXSA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFO1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuTUFYX1JBTkdFX1ZBTFVFIC0gbWFwcGVkVmFsdWVzW21hcHBlZFZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZXJyb3JQZXJTdGVwID0gZXJyb3IgLyBzdGVwQ291bnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWFwcGVkVmFsdWVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgbWFwcGVkVmFsdWVzW2ldICs9IGVycm9yUGVyU3RlcDtcbiAgICAgICAgICAgIG1hcHBlZFZhbHVlc1tpXSA9IHBhcnNlRmxvYXQobWFwcGVkVmFsdWVzW2ldLnRvRml4ZWQoZGVjaW1hbFBsYWNlcykpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIuc2V0KHZhbHVlLCBtYXBwZWRWYWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWUgYnkgdXNpbmcgdGhlIG1hcCBvZiByYW5nZSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBJZiB0aGUgbWFwIGlzIDA6IHsgMCB9LCAxOiB7IDEwIH0sIDI6IHsgMzAgfSwgMzogeyA0MCB9LCA0OiB7IDUwIH1cbiAgICAgKiBhbmQgdGhlIHNsaWRlclZhbHVlIGlzIDM3LCB0aGUgZnVuY3Rpb24gcmV0dXJucyAzXG4gICAgICogb3IgdGhlIHNsaWRlciB2YWx1ZSBpcyA0MCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgNFxuICAgICAqIEBwYXJhbSBzbGlkZXJWYWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNsaWRlciAodmFsdWVzIG9ubHkgYmV0d2VlbiByYW5nZSBNSU4gYW5kIE1BWClcbiAgICAgKiBAcmV0dXJucyB0aGUgdXNlciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzbGlkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhbHVlRnJvbU1hcEJ5VmFsdWUoc2xpZGVyVmFsdWU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtYXBUb0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1hcFJhbmdlVmFsdWVzRm9yU2xpZGVyKS5tYXAoKFt2YWx1ZSwgbWFwcGVkXSkgPT4gKHsgdmFsdWUsIG1hcHBlZCB9KSk7XG4gICAgICAgIGNvbnN0IGV4YWN0VmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IHgubWFwcGVkID09IHNsaWRlclZhbHVlKTtcbiAgICAgICAgY29uc3QgY2xvc2VzdCA9IG1hcFRvQXJyYXkucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBNYXRoLmFicyhjdXJyLm1hcHBlZCAtIHNsaWRlclZhbHVlKSA8IE1hdGguYWJzKHByZXYubWFwcGVkIC0gc2xpZGVyVmFsdWUpID8gY3VyciA6IHByZXYpO1xuICAgICAgICByZXR1cm4gZXhhY3RWYWx1ZSA/IGV4YWN0VmFsdWUudmFsdWUgOiBjbG9zZXN0LnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUga2V5IGZyb20gdGhlIG1hcCB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIHNsaWRlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdXNlclZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgdGhlIGNsb3Nlc3Qga2V5IGZvci4gKHZhbHVlcyBvbmx5IGJldHdlZW4gMCAtIDEwMClcbiAgICAgKiBAcmV0dXJucyBUaGUga2V5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsb3Nlc3QgbWFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcih1c2VyVmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1hcFRvQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMubWFwUmFuZ2VWYWx1ZXNGb3JTbGlkZXIpLm1hcCgoW3ZhbHVlLCBtYXBwZWRdKSA9PiAoeyB2YWx1ZSwgbWFwcGVkIH0pKTtcbiAgICAgICAgaWYgKHVzZXJWYWx1ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFRvQXJyYXlbbWFwVG9BcnJheS5sZW5ndGggLSAxXS5tYXBwZWRcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyVmFsdWUgPD0gdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5WzBdLm1hcHBlZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4YWN0VmFsdWUgPSBtYXBUb0FycmF5LmZpbmQoKHgpID0+IHgudmFsdWUgPT0gdXNlclZhbHVlKTtcbiAgICAgICAgY29uc3QgY2xvc2VzdFZhbHVlID0gbWFwVG9BcnJheS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IE1hdGguYWJzKGN1cnIudmFsdWUgLSB1c2VyVmFsdWUpIDwgTWF0aC5hYnMocHJldi52YWx1ZSAtIHVzZXJWYWx1ZSkgPyBjdXJyIDogcHJldik7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBleGFjdFZhbHVlIHx8IGNsb3Nlc3RWYWx1ZTtcbiAgICAgICAgY29uc3QgaXNGaXJzdEl0ZW0gPSBtYXBUb0FycmF5WzBdID09PSBpdGVtO1xuICAgICAgICBjb25zdCBpc0xhc3RJdGVtID0gbWFwVG9BcnJheVttYXBUb0FycmF5Lmxlbmd0aCAtIDFdID09PSBpdGVtO1xuICAgICAgICBpZiAoaXNGaXJzdEl0ZW0gJiYgdXNlclZhbHVlID4gdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRNaWRwb2ludChpdGVtLm1hcHBlZCwgbWFwVG9BcnJheVsxXS5tYXBwZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTGFzdEl0ZW0gJiYgdXNlclZhbHVlIDwgdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRNaWRwb2ludChpdGVtLm1hcHBlZCwgbWFwVG9BcnJheVttYXBUb0FycmF5Lmxlbmd0aCAtIDJdLm1hcHBlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5tYXBwZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgaGFuZGxlQXJyb3dLZXlMZWZ0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50T3JEZWNyZW1lbnRTdGFydEFuZEVuZFZhbHVlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudE9yRGVjcmVtZW50RW5kVmFsdWUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5UmlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbmNyZW1lbnRPckRlY3JlbWVudFN0YXJ0QW5kRW5kVmFsdWUoaW5jcmVtZW50OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLnZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPSBnZXREaWZmZXJlbmNlKGVuZCwgc3RhcnQpO1xuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLnN0ZXA7XG4gICAgICAgICAgICBlbmQgKz0gdGhpcy5zdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgLT0gdGhpcy5zdGVwO1xuICAgICAgICAgICAgZW5kIC09IHRoaXMuc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydExlc3NUaGFuTWluID0gc3RhcnQgPCB0aGlzLm1pbjtcbiAgICAgICAgY29uc3QgZW5kR3JlYXRlclRoYW5NYXggPSBlbmQgPiB0aGlzLm1heDtcbiAgICAgICAgaWYgKHN0YXJ0TGVzc1RoYW5NaW4gfHwgZW5kR3JlYXRlclRoYW5NYXgpIHtcbiAgICAgICAgICAgIGlmIChzdGFydExlc3NUaGFuTWluKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIGRpZmZlcmVuY2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuZEdyZWF0ZXJUaGFuTWF4KSB7XG4gICAgICAgICAgICAgICAgZW5kID0gdGhpcy5tYXg7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCA8IHRoaXMubWluIHx8IGVuZCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRWYWx1ZShbc3RhcnQsIGVuZF0sIGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBzdGFydCA9IHRoaXMuZ2V0Q2xvc2VzdFZhbHVlRnJvbU1hcFNsaWRlcihzdGFydCk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmRWYWx1ZSA9IGVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbmNyZW1lbnRPckRlY3JlbWVudEVuZFZhbHVlKGluY3JlbWVudDogYm9vbGVhbikge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5zdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgLT0gdGhpcy5zdGVwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfbmV3RW5kVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubmVlZFBhcnNlVmFsdWVzKSB7XG4gICAgICAgICAgICBfbmV3RW5kVmFsdWUgPSB0aGlzLmdldENsb3Nlc3RWYWx1ZUZyb21NYXBTbGlkZXIoX25ld0VuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX25ld0VuZFZhbHVlIDwgdGhpcy5NSU5fUkFOR0VfVkFMVUUgfHwgX25ld0VuZFZhbHVlID4gdGhpcy5NQVhfUkFOR0VfVkFMVUUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuZFZhbHVlID0gX25ld0VuZFZhbHVlO1xuICAgICAgICB0aGlzLnN0YXJ0VmFsdWUgPSB0aGlzLmVuZFZhbHVlO1xuICAgICAgICB0aGlzLnNldFZhbHVlKF9uZXdFbmRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbmVlZFBhcnNlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXggIT09IHRoaXMuTUFYX1JBTkdFX1ZBTFVFIHx8IHRoaXMubWluICE9PSB0aGlzLk1JTl9SQU5HRV9WQUxVRTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIG5ldyByYW5nZSBiYXNlZCBvbiB0aGUgb2xkIHJhbmdlIGFuZCB0aGUgcG9zaXRpb25zIGNsaWNrZWQgYW5kIGZpbmFsaXplZC5cbiAqXG4gKiBAcGFyYW0gb2xkU3RhcnQgLSBUaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIG9sZCByYW5nZS5cbiAqIEBwYXJhbSBvbGRFbmQgLSBUaGUgZW5kaW5nIHZhbHVlIG9mIHRoZSBvbGQgcmFuZ2UuXG4gKiBAcGFyYW0gY2xpY2tlZFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBjbGljayBvY2N1cnJlZC5cbiAqIEBwYXJhbSBmaW5hbFBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHdoZXJlIHRoZSByYW5nZSBzaG91bGQgZW5kLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5ldyBzdGFydCBhbmQgZW5kIHZhbHVlcyBvZiB0aGUgcmFuZ2UuXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZU5ld1JhbmdlID0gKG9sZFN0YXJ0OiBudW1iZXIsIG9sZEVuZDogbnVtYmVyLCBjbGlja2VkUG9zaXRpb246IG51bWJlciwgZmluYWxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPSBvbGRFbmQgLSBvbGRTdGFydDtcbiAgICBjb25zdCBuZXdTdGFydCA9IGZpbmFsUG9zaXRpb24gLSAoY2xpY2tlZFBvc2l0aW9uIC0gb2xkU3RhcnQpO1xuICAgIGNvbnN0IG5ld0VuZCA9IG5ld1N0YXJ0ICsgcmFuZ2U7XG4gICAgcmV0dXJuIHsgbmV3U3RhcnQsIG5ld0VuZCB9O1xufTtcblxuY29uc3QgaXNJblJhbmdlID0gKHZhbHVlOiBudW1iZXIsIHJhbmdlU3RhcnQ6IG51bWJlciwgcmFuZ2VFbmQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSByYW5nZVN0YXJ0IDwgcmFuZ2VFbmQgPyBbcmFuZ2VTdGFydCwgcmFuZ2VFbmRdIDogW3JhbmdlRW5kLCByYW5nZVN0YXJ0XTtcbiAgICByZXR1cm4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbn07XG5cbmNvbnN0IGdldE1pZHBvaW50ID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbWlkcG9pbnQgPSAoc3RhcnQgKyBlbmQpIC8gMjtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChtaWRwb2ludC50b0ZpeGVkKDIpKTtcbn1cbmNvbnN0IGdldERpZmZlcmVuY2UgPSAoZW5kOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gTWF0aC5hYnMoZW5kIC0gc3RhcnQpO1xufVxuIl19