mis-crystal-design-system 18.0.24 → 18.1.0-signal-test

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.
Files changed (163) hide show
  1. package/action-list/action-list.component.d.ts +17 -15
  2. package/async-search-dropdown/async-dropdown.component.d.ts +43 -61
  3. package/button/button.component.d.ts +35 -13
  4. package/button/button.directive.d.ts +10 -8
  5. package/checkbox/checkbox.component.d.ts +15 -12
  6. package/chip/chip.component.d.ts +9 -11
  7. package/datepicker_v2/models/dp-config.model.d.ts +1 -0
  8. package/datepicker_v2/tz-datepicker.directive.d.ts +15 -18
  9. package/datepicker_v2/tz-dp-container/tz-dp-container.component.d.ts +42 -21
  10. package/daterangepicker_v2/tz-daterangepicker.directive.d.ts +12 -14
  11. package/daterangepicker_v2/tz-drp-container/tz-drp-container.component.d.ts +46 -23
  12. package/drawer/drawer-body/drawer-body.component.d.ts +2 -2
  13. package/dropdown/calculate-container-height.directive.d.ts +7 -8
  14. package/dropdown/dropdown.component.d.ts +41 -49
  15. package/dynamic-form/dynamic-form.component.d.ts +20 -16
  16. package/esm2022/action-list/action-list.component.mjs +112 -89
  17. package/esm2022/async-search-dropdown/async-dropdown.component.mjs +256 -326
  18. package/esm2022/button/button.component.mjs +55 -48
  19. package/esm2022/button/button.directive.mjs +36 -40
  20. package/esm2022/checkbox/checkbox.component.mjs +75 -70
  21. package/esm2022/chip/chip.component.mjs +20 -33
  22. package/esm2022/datepicker_v2/models/dp-config.model.mjs +1 -1
  23. package/esm2022/datepicker_v2/tz-datepicker.directive.mjs +42 -71
  24. package/esm2022/datepicker_v2/tz-dp-container/tz-dp-container.component.mjs +202 -172
  25. package/esm2022/datepicker_v2/utils/index.mjs +2 -1
  26. package/esm2022/daterangepicker_v2/tz-daterangepicker.directive.mjs +26 -51
  27. package/esm2022/daterangepicker_v2/tz-drp-container/tz-drp-container.component.mjs +282 -235
  28. package/esm2022/drawer/drawer-body/drawer-body.component.mjs +8 -7
  29. package/esm2022/dropdown/calculate-container-height.directive.mjs +25 -22
  30. package/esm2022/dropdown/dropdown.component.mjs +162 -186
  31. package/esm2022/dynamic-form/dynamic-form.component.mjs +118 -72
  32. package/esm2022/fab/fab.component.mjs +29 -33
  33. package/esm2022/filter/filter-panel/filter-panel.component.mjs +60 -58
  34. package/esm2022/input/directives/input/input.directive.mjs +22 -26
  35. package/esm2022/input/mis-input.component.mjs +41 -45
  36. package/esm2022/input-stepper/input-stepper/input-stepper.component.mjs +40 -50
  37. package/esm2022/loader/loader.component.mjs +8 -11
  38. package/esm2022/mobile-filter/mobile-filter.component.mjs +61 -61
  39. package/esm2022/modal/module-wrapper/module-wrapper.component.mjs +11 -9
  40. package/esm2022/multi-select-dropdown/multi-select-dropdown.component.mjs +235 -281
  41. package/esm2022/nested-multi-select-dropdown/nested-multi-select-dropdown.component.mjs +250 -287
  42. package/esm2022/phone-input/phone-input.component.mjs +21 -43
  43. package/esm2022/radio-button/radio-button.component.mjs +15 -27
  44. package/esm2022/ske-loader/ske-loader.component.mjs +15 -29
  45. package/esm2022/slider/slider.component.mjs +23 -33
  46. package/esm2022/slider/slider.module.mjs +4 -11
  47. package/esm2022/snackbar/snackbar/snackbar.component.mjs +21 -15
  48. package/esm2022/snackbar/snackbar.service.mjs +3 -2
  49. package/esm2022/specificdatepicker/tz-sdp-container/tz-sdp-container.component.mjs +230 -343
  50. package/esm2022/specificdatepicker/tz-specificdatepicker.directive.mjs +77 -105
  51. package/esm2022/star-rating/star-rating.component.mjs +57 -71
  52. package/esm2022/switch/switch.component.mjs +34 -36
  53. package/esm2022/table/actions-cell/actions-cell.component.mjs +55 -54
  54. package/esm2022/table/custom-table-cell.directive.mjs +22 -18
  55. package/esm2022/table/filter/filter.component.mjs +60 -42
  56. package/esm2022/table/sort-icons.directive.mjs +16 -8
  57. package/esm2022/table/sub-table/sub-table.component.mjs +41 -44
  58. package/esm2022/table/table.component.mjs +181 -165
  59. package/esm2022/timepicker/timepicker.component.mjs +244 -159
  60. package/esm2022/timepicker/timepicker.directive.mjs +3 -2
  61. package/esm2022/timerangepicker/timerangepicker.component.mjs +200 -159
  62. package/esm2022/toast/toast.component.mjs +6 -7
  63. package/esm2022/toast/toast.data.service.mjs +15 -9
  64. package/esm2022/tooltip/tooltip-container/tooltip.component.mjs +12 -12
  65. package/esm2022/tooltip/tooltip.directive.mjs +4 -4
  66. package/esm2022/virtual-scroll/virtual-scroll.component.mjs +57 -59
  67. package/fab/fab.component.d.ts +12 -8
  68. package/fesm2022/mis-crystal-design-system-action-list.mjs +111 -88
  69. package/fesm2022/mis-crystal-design-system-action-list.mjs.map +1 -1
  70. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs +253 -324
  71. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs.map +1 -1
  72. package/fesm2022/mis-crystal-design-system-button.mjs +88 -85
  73. package/fesm2022/mis-crystal-design-system-button.mjs.map +1 -1
  74. package/fesm2022/mis-crystal-design-system-checkbox.mjs +74 -69
  75. package/fesm2022/mis-crystal-design-system-checkbox.mjs.map +1 -1
  76. package/fesm2022/mis-crystal-design-system-chip.mjs +19 -32
  77. package/fesm2022/mis-crystal-design-system-chip.mjs.map +1 -1
  78. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs +242 -240
  79. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs.map +1 -1
  80. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs +305 -283
  81. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs.map +1 -1
  82. package/fesm2022/mis-crystal-design-system-drawer.mjs +7 -6
  83. package/fesm2022/mis-crystal-design-system-drawer.mjs.map +1 -1
  84. package/fesm2022/mis-crystal-design-system-dropdown.mjs +183 -204
  85. package/fesm2022/mis-crystal-design-system-dropdown.mjs.map +1 -1
  86. package/fesm2022/mis-crystal-design-system-dynamic-form.mjs +118 -72
  87. package/fesm2022/mis-crystal-design-system-dynamic-form.mjs.map +1 -1
  88. package/fesm2022/mis-crystal-design-system-fab.mjs +28 -32
  89. package/fesm2022/mis-crystal-design-system-fab.mjs.map +1 -1
  90. package/fesm2022/mis-crystal-design-system-filter.mjs +59 -57
  91. package/fesm2022/mis-crystal-design-system-filter.mjs.map +1 -1
  92. package/fesm2022/mis-crystal-design-system-input-stepper.mjs +39 -49
  93. package/fesm2022/mis-crystal-design-system-input-stepper.mjs.map +1 -1
  94. package/fesm2022/mis-crystal-design-system-input.mjs +62 -71
  95. package/fesm2022/mis-crystal-design-system-input.mjs.map +1 -1
  96. package/fesm2022/mis-crystal-design-system-loader.mjs +7 -10
  97. package/fesm2022/mis-crystal-design-system-loader.mjs.map +1 -1
  98. package/fesm2022/mis-crystal-design-system-mobile-filter.mjs +60 -60
  99. package/fesm2022/mis-crystal-design-system-mobile-filter.mjs.map +1 -1
  100. package/fesm2022/mis-crystal-design-system-modal.mjs +10 -8
  101. package/fesm2022/mis-crystal-design-system-modal.mjs.map +1 -1
  102. package/fesm2022/mis-crystal-design-system-multi-select-dropdown.mjs +233 -279
  103. package/fesm2022/mis-crystal-design-system-multi-select-dropdown.mjs.map +1 -1
  104. package/fesm2022/mis-crystal-design-system-nested-multi-select-dropdown.mjs +249 -286
  105. package/fesm2022/mis-crystal-design-system-nested-multi-select-dropdown.mjs.map +1 -1
  106. package/fesm2022/mis-crystal-design-system-phone-input.mjs +20 -42
  107. package/fesm2022/mis-crystal-design-system-phone-input.mjs.map +1 -1
  108. package/fesm2022/mis-crystal-design-system-radio-button.mjs +14 -26
  109. package/fesm2022/mis-crystal-design-system-radio-button.mjs.map +1 -1
  110. package/fesm2022/mis-crystal-design-system-ske-loader.mjs +14 -28
  111. package/fesm2022/mis-crystal-design-system-ske-loader.mjs.map +1 -1
  112. package/fesm2022/mis-crystal-design-system-slider.mjs +25 -42
  113. package/fesm2022/mis-crystal-design-system-slider.mjs.map +1 -1
  114. package/fesm2022/mis-crystal-design-system-snackbar.mjs +22 -15
  115. package/fesm2022/mis-crystal-design-system-snackbar.mjs.map +1 -1
  116. package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs +304 -445
  117. package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs.map +1 -1
  118. package/fesm2022/mis-crystal-design-system-star-rating.mjs +56 -70
  119. package/fesm2022/mis-crystal-design-system-star-rating.mjs.map +1 -1
  120. package/fesm2022/mis-crystal-design-system-switch.mjs +33 -35
  121. package/fesm2022/mis-crystal-design-system-switch.mjs.map +1 -1
  122. package/fesm2022/mis-crystal-design-system-table.mjs +365 -321
  123. package/fesm2022/mis-crystal-design-system-table.mjs.map +1 -1
  124. package/fesm2022/mis-crystal-design-system-timepicker.mjs +245 -159
  125. package/fesm2022/mis-crystal-design-system-timepicker.mjs.map +1 -1
  126. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs +199 -158
  127. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs.map +1 -1
  128. package/fesm2022/mis-crystal-design-system-toast.mjs +18 -13
  129. package/fesm2022/mis-crystal-design-system-toast.mjs.map +1 -1
  130. package/fesm2022/mis-crystal-design-system-tooltip.mjs +14 -14
  131. package/fesm2022/mis-crystal-design-system-tooltip.mjs.map +1 -1
  132. package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs +57 -59
  133. package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs.map +1 -1
  134. package/filter/filter-panel/filter-panel.component.d.ts +14 -14
  135. package/input/directives/input/input.directive.d.ts +6 -10
  136. package/input/mis-input.component.d.ts +12 -13
  137. package/input-stepper/input-stepper/input-stepper.component.d.ts +8 -7
  138. package/loader/loader.component.d.ts +3 -6
  139. package/mobile-filter/mobile-filter.component.d.ts +15 -15
  140. package/modal/module-wrapper/module-wrapper.component.d.ts +2 -3
  141. package/multi-select-dropdown/multi-select-dropdown.component.d.ts +89 -51
  142. package/nested-multi-select-dropdown/nested-multi-select-dropdown.component.d.ts +99 -56
  143. package/package.json +17 -17
  144. package/phone-input/phone-input.component.d.ts +16 -18
  145. package/radio-button/radio-button.component.d.ts +9 -11
  146. package/ske-loader/ske-loader.component.d.ts +8 -11
  147. package/slider/slider.component.d.ts +8 -11
  148. package/slider/slider.module.d.ts +1 -2
  149. package/snackbar/snackbar/snackbar.component.d.ts +3 -3
  150. package/specificdatepicker/tz-sdp-container/tz-sdp-container.component.d.ts +35 -35
  151. package/specificdatepicker/tz-specificdatepicker.directive.d.ts +24 -28
  152. package/star-rating/star-rating.component.d.ts +18 -18
  153. package/switch/switch.component.d.ts +8 -10
  154. package/table/actions-cell/actions-cell.component.d.ts +14 -14
  155. package/table/custom-table-cell.directive.d.ts +3 -3
  156. package/table/filter/filter.component.d.ts +9 -9
  157. package/table/sub-table/sub-table.component.d.ts +5 -5
  158. package/table/table.component.d.ts +38 -35
  159. package/timepicker/timepicker.component.d.ts +29 -28
  160. package/timerangepicker/timerangepicker.component.d.ts +36 -33
  161. package/toast/toast.data.service.d.ts +1 -1
  162. package/tooltip/tooltip-container/tooltip.component.d.ts +4 -4
  163. package/virtual-scroll/virtual-scroll.component.d.ts +8 -9
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild, ViewChildren } from "@angular/core";
1
+ import { Component, ViewChild, ViewChildren, input, output, signal, effect, untracked } from "@angular/core";
2
2
  import { TimepickerDirective } from "./timepicker.directive";
3
3
  import { ToolTipDirective } from "mis-crystal-design-system/tooltip";
4
4
  import dayjs from 'dayjs';
@@ -32,11 +32,11 @@ function TimePickerComponent_ng_template_3_div_0_li_3_Template(rf, ctx) { if (rf
32
32
  const interval_r3 = ctx.$implicit;
33
33
  const i_r5 = ctx.index;
34
34
  const ctx_r3 = i0.ɵɵnextContext(3);
35
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(3, _c6, i_r5 === ctx_r3.isHighlighted));
35
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(3, _c6, i_r5 === ctx_r3.isHighlighted()));
36
36
  i0.ɵɵadvance(2);
37
37
  i0.ɵɵtextInterpolate1(" ", interval_r3, " ");
38
38
  i0.ɵɵadvance();
39
- i0.ɵɵproperty("ngIf", interval_r3 === ctx_r3.chosenTime);
39
+ i0.ɵɵproperty("ngIf", interval_r3 === ctx_r3.chosenTime());
40
40
  } }
41
41
  function TimePickerComponent_ng_template_3_div_0_Template(rf, ctx) { if (rf & 1) {
42
42
  i0.ɵɵelementStart(0, "div", 8)(1, "ul", null, 2);
@@ -44,15 +44,15 @@ function TimePickerComponent_ng_template_3_div_0_Template(rf, ctx) { if (rf & 1)
44
44
  i0.ɵɵelementEnd()();
45
45
  } if (rf & 2) {
46
46
  const ctx_r3 = i0.ɵɵnextContext(2);
47
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(2, _c5, ctx_r3.dropdownWidth || ctx_r3.inputWidth));
47
+ i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(2, _c5, ctx_r3.dropdownWidth() || ctx_r3.inputWidth()));
48
48
  i0.ɵɵadvance(3);
49
- i0.ɵɵproperty("ngForOf", ctx_r3.timeIntervals);
49
+ i0.ɵɵproperty("ngForOf", ctx_r3.timeIntervals());
50
50
  } }
51
51
  function TimePickerComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
52
52
  i0.ɵɵtemplate(0, TimePickerComponent_ng_template_3_div_0_Template, 4, 4, "div", 7);
53
53
  } if (rf & 2) {
54
54
  const ctx_r3 = i0.ɵɵnextContext();
55
- i0.ɵɵproperty("ngIf", ctx_r3.openStatus);
55
+ i0.ɵɵproperty("ngIf", ctx_r3.openStatus());
56
56
  } }
57
57
  dayjs.extend(utc);
58
58
  dayjs.extend(timezone);
@@ -68,64 +68,152 @@ export class TimePickerComponent {
68
68
  });
69
69
  }
70
70
  constructor() {
71
- this.openStatus = false;
72
- this.isHighlighted = 0;
73
- this.isInvalid = false;
74
- this.timeIntervals = [];
75
- this.shouldScroll = false;
76
- this.userInputFlag = false;
77
- this.givenTimeFlag = true;
78
- this.clockFormat = 12;
79
- this.timezone = "Asia/Kolkata";
80
- this.height = "max-content";
81
- this.inputWidth = "100px";
82
- this.interval = 15;
83
- this.dateAsEpoch = dayjs.tz(dayjs(), this.timezone).valueOf();
84
- this.rangeValidity = true;
85
- this.showTooltip = true;
86
- this.dispayToolTip = this.showTooltip;
87
- this.triggerChange = true;
88
- this.disable = false;
89
- this.timeEmitter = new EventEmitter();
71
+ // Convert to signals for better performance and change detection
72
+ this.currTime = signal('');
73
+ this.chosenTime = signal('');
74
+ this.openStatus = signal(false);
75
+ this.isHighlighted = signal(0);
76
+ this.isInvalid = signal(false);
77
+ this.timeIntervals = signal([]);
78
+ this.shouldScroll = signal(false);
79
+ this.userInputFlag = signal(false);
80
+ this.givenTimeFlag = signal(true);
81
+ // Signal-based inputs with backward compatibility
82
+ this.clockFormat = input(12);
83
+ this.timezone = input("Asia/Kolkata");
84
+ this.height = input("max-content");
85
+ this.inputWidth = input("100px");
86
+ this.dropdownWidth = input(undefined);
87
+ this.interval = input(15);
88
+ this.dateAsEpoch = input(dayjs.tz(dayjs(), "Asia/Kolkata").valueOf());
89
+ this.firstInterval = input();
90
+ this.rangeValidity = input(true);
91
+ this.showTooltip = input(true);
92
+ this.dispayToolTip = this.showTooltip();
93
+ this.givenTime = input();
94
+ this.minTime = input(undefined);
95
+ this.triggerChange = input(true);
96
+ this.disable = input(false);
97
+ // Internal state for computed first interval
98
+ this.computedFirstInterval = null;
99
+ this._isInitializing = false;
100
+ // Signal-based output with backward compatibility
101
+ this.timeEmitter = output();
102
+ // Effect to handle triggerChange from parent component (timerangepicker)
103
+ effect(() => {
104
+ const triggerValue = this.triggerChange();
105
+ const firstIntervalValue = this.firstInterval();
106
+ // Only update if not during user input and firstInterval is provided
107
+ if (!untracked(() => this.userInputFlag()) && firstIntervalValue && !this._isInitializing) {
108
+ const newTime = dayjs.tz(firstIntervalValue, untracked(() => this.timezone())).format(this.timeFormat);
109
+ // Only update if the time actually changed
110
+ if (untracked(() => this.chosenTime()) !== newTime) {
111
+ // Use setTimeout to defer signal writes and avoid circular dependencies
112
+ setTimeout(() => {
113
+ this.chosenTime.set(newTime);
114
+ this.isInvalid.set(!this.checkTimeValidity(newTime.trim()));
115
+ // CRITICAL FIX: Repopulate dropdown when firstInterval changes
116
+ this.populateDropdown();
117
+ // Recalculate closest interval
118
+ this.calculateClosestInterval(newTime);
119
+ // Emit the updated time
120
+ const timedayjs = this.getdayjs(newTime);
121
+ this.emitTime({
122
+ valid: !this.isInvalid(),
123
+ time: newTime,
124
+ epoch: timedayjs.valueOf()
125
+ });
126
+ }, 0);
127
+ }
128
+ }
129
+ });
90
130
  }
91
131
  ngOnInit() {
92
- if (!this.givenTime && !this.minTime) {
93
- this.chosenTime = dayjs.tz(this.firstInterval, this.timezone).format(this.timeFormat);
94
- let chosenTimedayjs = this.getdayjs(this.chosenTime);
95
- this.emitTime({
96
- valid: !this.isInvalid,
97
- time: this.chosenTime,
98
- epoch: chosenTimedayjs.valueOf()
99
- });
100
- }
101
- }
102
- ngOnChanges() {
103
- this.timeFormat = this.clockFormat === 12 ? "hh:mm a" : "HH:mm";
104
- if (this.timeFormat) {
105
- let chosenTimedayjs = this.getdayjs(this.chosenTime);
106
- // if the first interval is >= the chosen time
107
- // then only update the value of chosen time
108
- // else it remains the same
109
- if (this.firstInterval >= chosenTimedayjs.valueOf() && this.rangeValidity && !this.userInputFlag) {
110
- this.chosenTime = dayjs.tz(this.firstInterval, this.timezone).format(this.timeFormat);
111
- chosenTimedayjs = this.getdayjs(this.chosenTime);
132
+ this._isInitializing = true;
133
+ // Ensure timeFormat is set before initialization
134
+ this.timeFormat = this.clockFormat() === 12 ? "hh:mm a" : "HH:mm";
135
+ // Initialize chosenTime - use firstInterval from parent if available, otherwise calculate
136
+ if (!this.givenTime() && !this.minTime()) {
137
+ let initialTime;
138
+ // If firstInterval is provided by parent (timerangepicker), use it
139
+ if (this.firstInterval()) {
140
+ initialTime = dayjs.tz(this.firstInterval(), this.timezone()).format(this.timeFormat);
112
141
  }
113
- if ((this.givenTimeFlag && this.givenTime) || this.minTime) {
114
- this.chosenTime = dayjs.tz(this.minTime || this.givenTime, this.timezone).format(this.timeFormat);
142
+ else {
143
+ // Get current time and round to nearest interval using original logic
144
+ const now = dayjs.tz(dayjs(), this.timezone());
145
+ const interval = this.interval();
146
+ const minutes = now.minute();
147
+ const offset = interval - (minutes % interval);
148
+ // Round to next interval if we're past halfway point
149
+ const roundedTime = offset >= interval / 2
150
+ ? now.add(offset, "m").second(0).millisecond(0)
151
+ : now.subtract(interval - offset, "m").second(0).millisecond(0);
152
+ initialTime = roundedTime.format(this.timeFormat);
115
153
  }
116
- chosenTimedayjs = this.getdayjs(this.chosenTime);
117
- if (!this.userInputFlag)
118
- this.populateDropdown();
119
- this.userInputFlag = false;
120
- if (this.chosenTime) {
121
- this.isInvalid = !this.checkTimeValidity(this.chosenTime.trim());
154
+ this.chosenTime.set(initialTime);
155
+ // Set userInputFlag to false to avoid validation issues during initialization
156
+ this.userInputFlag.set(false);
157
+ // Populate dropdown first to compute the first interval
158
+ this.populateDropdown();
159
+ // Now validate with the computed first interval
160
+ this.isInvalid.set(!this.checkTimeValidity(this.chosenTime().trim()));
161
+ let chosenTimedayjs = this.getdayjs(this.chosenTime());
162
+ // Defer emission to avoid ExpressionChangedAfterItHasBeenCheckedError
163
+ setTimeout(() => {
122
164
  this.emitTime({
123
- valid: !this.isInvalid,
124
- time: this.chosenTime,
165
+ valid: !this.isInvalid(),
166
+ time: this.chosenTime(),
125
167
  epoch: chosenTimedayjs.valueOf()
126
168
  });
127
- this.calculateClosestInterval(this.chosenTime);
128
- }
169
+ }, 0);
170
+ // Calculate closest interval
171
+ this.calculateClosestInterval(this.chosenTime());
172
+ this._isInitializing = false;
173
+ }
174
+ else if (this.givenTime()) {
175
+ // When givenTime is present, use the given time as the initial value
176
+ // but the dropdown will start from 12:00 AM
177
+ this.chosenTime.set(dayjs.tz(this.givenTime(), this.timezone()).format(this.timeFormat));
178
+ this.userInputFlag.set(false);
179
+ // Populate dropdown first to compute the first interval
180
+ this.populateDropdown();
181
+ // Now validate with the computed first interval
182
+ this.isInvalid.set(!this.checkTimeValidity(this.chosenTime().trim()));
183
+ let chosenTimedayjs = this.getdayjs(this.chosenTime());
184
+ // Defer emission to avoid ExpressionChangedAfterItHasBeenCheckedError
185
+ setTimeout(() => {
186
+ this.emitTime({
187
+ valid: !this.isInvalid(),
188
+ time: this.chosenTime(),
189
+ epoch: chosenTimedayjs.valueOf()
190
+ });
191
+ }, 0);
192
+ // Calculate closest interval
193
+ this.calculateClosestInterval(this.chosenTime());
194
+ this._isInitializing = false;
195
+ }
196
+ else if (this.minTime()) {
197
+ // Use min time directly - this matches original behavior
198
+ this.chosenTime.set(dayjs.tz(this.minTime(), this.timezone()).format(this.timeFormat));
199
+ this.userInputFlag.set(false);
200
+ // Populate dropdown first to compute the first interval
201
+ this.populateDropdown();
202
+ // For minTime, validation should only check format, not time comparison
203
+ // This matches the original logic where minTime bypasses time validation
204
+ this.isInvalid.set(!this.checkTimeValidity(this.chosenTime().trim()));
205
+ let chosenTimedayjs = this.getdayjs(this.chosenTime());
206
+ // Defer emission to avoid ExpressionChangedAfterItHasBeenCheckedError
207
+ setTimeout(() => {
208
+ this.emitTime({
209
+ valid: !this.isInvalid(),
210
+ time: this.chosenTime(),
211
+ epoch: chosenTimedayjs.valueOf()
212
+ });
213
+ }, 0);
214
+ // Calculate closest interval
215
+ this.calculateClosestInterval(this.chosenTime());
216
+ this._isInitializing = false;
129
217
  }
130
218
  }
131
219
  emitTime(data) {
@@ -133,13 +221,12 @@ export class TimePickerComponent {
133
221
  }
134
222
  // function to get dayjs object when time is given in string
135
223
  getdayjs(time = '00:00') {
136
- ;
137
224
  if (!time || typeof time !== 'string') {
138
225
  throw new Error('Time must be a string');
139
226
  }
140
227
  let hours;
141
228
  let minutes;
142
- if (this.clockFormat === 24) {
229
+ if (this.clockFormat() === 24) {
143
230
  hours = parseInt(time.split(':')[0]);
144
231
  minutes = parseInt(time.split(':')[1]);
145
232
  }
@@ -155,70 +242,88 @@ export class TimePickerComponent {
155
242
  hours = 0;
156
243
  }
157
244
  }
158
- return dayjs.tz(this.dateAsEpoch, this.timezone).add(hours, 'h').add(minutes, 'm');
245
+ // Use the date from dateAsEpoch but set the time to the parsed hours and minutes
246
+ const baseDate = dayjs.tz(this.dateAsEpoch(), this.timezone());
247
+ const result = baseDate.hour(hours).minute(minutes).second(0).millisecond(0);
248
+ return result;
159
249
  }
160
250
  closeDropdown() {
161
251
  this.dispayToolTip = false;
162
- this.userInputFlag = false;
163
- this.openStatus = false;
252
+ this.userInputFlag.set(false);
253
+ this.openStatus.set(false);
164
254
  if (this.timepickerDirective)
165
255
  this.timepickerDirective.destroyOverlay();
166
256
  }
167
257
  // toggle timepicker dropdown
168
258
  openDropdown() {
169
259
  this.dispayToolTip = true;
170
- this.openStatus = true;
260
+ this.openStatus.set(true);
171
261
  }
172
262
  checkTimeValidity(time) {
173
263
  const RE12 = /^(([0][1-9]|1[0-2]):([0-5][0-9])( )?(am|pm|AM|PM))$/i;
174
264
  const RE24 = /^([01][0-9]|2[0-3]):[0-5][0-9]$/;
175
- const RE = this.clockFormat === 12 ? RE12 : RE24;
265
+ const RE = this.clockFormat() === 12 ? RE12 : RE24;
266
+ // Check if the time format is valid first
267
+ if (!time.match(RE)) {
268
+ return false;
269
+ }
270
+ // Restore proper validation logic
176
271
  const timedayjs = this.getdayjs(time);
177
272
  let flag = false;
178
- // if the first interval is set to the start of the day
179
- // or a time is already provided to the component to show
180
- // then we don't check its validity against the current time
181
- if (this.minTime ||
182
- this.givenTime ||
183
- (this.firstInterval &&
184
- dayjs.tz(this.firstInterval, this.timezone).format(this.timeFormat).valueOf() === dayjs.tz(dayjs(), this.timezone).startOf("day").format(this.timeFormat).valueOf())) {
273
+ // Original logic: if minTime, givenTime, or firstInterval is start of day, only check format
274
+ if (this.minTime() ||
275
+ this.givenTime() ||
276
+ (this.firstInterval() &&
277
+ dayjs.tz(this.firstInterval(), this.timezone()).format(this.timeFormat).valueOf() === dayjs.tz(dayjs(), this.timezone()).startOf("day").format(this.timeFormat).valueOf())) {
278
+ // Only check format validation, not time comparison
185
279
  flag = time.match(RE) ? true : false;
186
280
  }
187
281
  else {
188
- flag = time.match(RE) && timedayjs.diff(dayjs.tz(dayjs(), this.timezone), "m") >= 0 ? true : false;
282
+ // Check against current time for normal cases
283
+ const currentTime = dayjs.tz(dayjs(), this.timezone());
284
+ const timeDiff = timedayjs.diff(currentTime, "m");
285
+ flag = timeDiff >= 0;
189
286
  }
190
287
  return flag;
191
288
  }
192
289
  // update chosen time as soon as the user clicks on an interval
193
290
  onTimeSelect(time) {
194
- this.isInvalid = !this.checkTimeValidity(time.trim());
195
- if (!this.isInvalid) {
196
- this.chosenTime = time;
197
- this.calculateClosestInterval(this.chosenTime);
291
+ this.isInvalid.set(!this.checkTimeValidity(time.trim()));
292
+ if (!this.isInvalid()) {
293
+ this.chosenTime.set(time);
294
+ this.calculateClosestInterval(this.chosenTime());
198
295
  }
199
296
  const timedayjs = this.getdayjs(time);
200
297
  this.emitTime({
201
- valid: !this.isInvalid,
298
+ valid: !this.isInvalid(),
202
299
  time: time,
203
300
  epoch: timedayjs.valueOf()
204
301
  });
205
- this.openStatus = false;
302
+ this.openStatus.set(false);
206
303
  if (this.timepickerDirective)
207
304
  this.timepickerDirective.destroyOverlay();
208
305
  }
209
306
  // checks validity of time on input change and calculates the closest interval
210
307
  onTimeChange(time) {
211
- this.isInvalid = !this.checkTimeValidity(time.trim());
212
- if (!this.isInvalid) {
213
- this.userInputFlag = true;
214
- this.openStatus = false;
308
+ // Set user input flag to prevent effects from overriding
309
+ this.userInputFlag.set(true);
310
+ // Update the chosenTime signal
311
+ this.chosenTime.set(time);
312
+ const isValid = this.checkTimeValidity(time.trim());
313
+ this.isInvalid.set(!isValid);
314
+ // Clear user input flag after a delay to allow effects to work again
315
+ setTimeout(() => {
316
+ this.userInputFlag.set(false);
317
+ }, 1000); // 1 second delay
318
+ if (!this.isInvalid()) {
319
+ this.openStatus.set(false);
215
320
  if (this.timepickerDirective)
216
321
  this.timepickerDirective.destroyOverlay();
217
322
  this.calculateClosestInterval(time);
218
323
  }
219
324
  const timedayjs = this.getdayjs(time);
220
325
  this.emitTime({
221
- valid: !this.isInvalid,
326
+ valid: !this.isInvalid(),
222
327
  time: time,
223
328
  epoch: timedayjs.valueOf()
224
329
  });
@@ -226,67 +331,79 @@ export class TimePickerComponent {
226
331
  calculateClosestInterval(time) {
227
332
  let roundedEpoch;
228
333
  // Converting time and date to a dayjs object
229
- const chosenDate = dayjs.tz(this.dateAsEpoch, this.timezone).format("DD-MM-YYYY"); // 05-01-2024
230
- const parsedTimeWithDate = dayjs.tz(`${chosenDate} ${time}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone);
334
+ const chosenDate = dayjs.tz(this.dateAsEpoch(), this.timezone()).format("DD-MM-YYYY"); // 05-01-2024
335
+ const parsedTimeWithDate = dayjs.tz(`${chosenDate} ${time}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone());
231
336
  // Converting dayjs object to epoch
232
337
  const chosenTimeEpoch = parsedTimeWithDate.valueOf();
233
- const offset = this.interval - (dayjs.tz(chosenTimeEpoch, this.timezone).minute() % this.interval);
234
- if (this.minTime && !this.givenTime) {
235
- this.isHighlighted = 0;
338
+ const offset = this.interval() - (dayjs.tz(chosenTimeEpoch, this.timezone()).minute() % this.interval());
339
+ if (this.minTime() && !this.givenTime()) {
340
+ this.isHighlighted.set(0);
236
341
  return;
237
342
  }
238
- roundedEpoch = offset >= this.interval / 2 ? (dayjs.tz(chosenTimeEpoch, this.timezone).subtract(this.interval - offset, "m")).valueOf() : (dayjs.tz(chosenTimeEpoch, this.timezone).add(offset, "m")).valueOf();
343
+ roundedEpoch = offset >= this.interval() / 2 ? (dayjs.tz(chosenTimeEpoch, this.timezone()).subtract(this.interval() - offset, "m")).valueOf() : (dayjs.tz(chosenTimeEpoch, this.timezone()).add(offset, "m")).valueOf();
239
344
  // finding the index of element that needs to be highlighted
240
- if (chosenTimeEpoch > dayjs.tz(this.dateAsEpoch, this.timezone).endOf("day").subtract(this.interval, "m").valueOf()) {
241
- this.isHighlighted = this.timeIntervals.length - 1;
345
+ if (chosenTimeEpoch > dayjs.tz(this.dateAsEpoch(), this.timezone()).endOf("day").subtract(this.interval(), "m").valueOf()) {
346
+ this.isHighlighted.set(this.timeIntervals().length - 1);
242
347
  }
243
348
  else {
244
- const roundedEpochdayjs = dayjs.tz(roundedEpoch, this.timezone);
245
- this.isHighlighted = this.timeIntervals.findIndex(interval => {
246
- const intervalObj = dayjs.tz(`${chosenDate} ${interval}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone);
349
+ const roundedEpochdayjs = dayjs.tz(roundedEpoch, this.timezone());
350
+ this.isHighlighted.set(this.timeIntervals().findIndex(interval => {
351
+ const intervalObj = dayjs.tz(`${chosenDate} ${interval}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone());
247
352
  return intervalObj.isSame(roundedEpochdayjs);
248
- });
353
+ }));
249
354
  }
250
355
  }
251
356
  // populates the dropdown according to the first interval received
252
357
  populateDropdown() {
253
- this.timeIntervals = [];
358
+ this.timeIntervals.set([]);
359
+ // Compute the effective first interval
360
+ let effectiveFirstInterval = this.firstInterval();
254
361
  // if picker is used as an individual component
255
- if (!this.firstInterval) {
362
+ if (!effectiveFirstInterval) {
256
363
  // firstInterval is initialised according to the current time
257
364
  // if the date is same as the current date
258
- if (dayjs.tz(this.dateAsEpoch, this.timezone).format("DD-MM-YYYY") === dayjs.tz(dayjs(), this.timezone).format("DD-MM-YYYY") && !this.minTime) {
259
- const offset = this.interval - (dayjs.tz(dayjs(), this.timezone).minute() % this.interval);
260
- this.firstInterval = dayjs.tz(dayjs(), this.timezone).add(offset, "m").valueOf();
365
+ if (dayjs.tz(this.dateAsEpoch(), this.timezone()).format("DD-MM-YYYY") === dayjs.tz(dayjs(), this.timezone()).format("DD-MM-YYYY") && !this.minTime()) {
366
+ const offset = this.interval() - (dayjs.tz(dayjs(), this.timezone()).minute() % this.interval());
367
+ effectiveFirstInterval = dayjs.tz(dayjs(), this.timezone()).add(offset, "m").valueOf();
261
368
  }
262
369
  // if minimum time to show is provided
263
- else if (this.minTime) {
264
- const offset = this.interval - (dayjs.tz(this.minTime, this.timezone).minute() % this.interval);
265
- this.firstInterval = dayjs.tz(this.minTime, this.timezone).add(offset, "m").valueOf();
370
+ else if (this.minTime()) {
371
+ const minTimeDayjs = dayjs.tz(this.minTime(), this.timezone());
372
+ const offset = this.interval() - (minTimeDayjs.minute() % this.interval());
373
+ effectiveFirstInterval = minTimeDayjs.add(offset, "m").valueOf();
266
374
  }
267
375
  // else the firstInterval is initialised as start of day
268
376
  else {
269
- this.firstInterval = dayjs.tz(dayjs(), this.timezone).startOf("day").valueOf();
377
+ effectiveFirstInterval = dayjs.tz(dayjs(), this.timezone()).startOf("day").valueOf();
270
378
  }
271
379
  }
272
- if (this.givenTime && this.givenTimeFlag) {
273
- this.firstInterval = dayjs.tz(this.givenTime, this.timezone).startOf('d').valueOf();
274
- this.givenTimeFlag = false;
380
+ if (this.givenTime()) {
381
+ // When givenTime is present, always start from 12:00 AM (start of day)
382
+ // regardless of whether the time has passed or not
383
+ effectiveFirstInterval = dayjs.tz(this.dateAsEpoch(), this.timezone()).startOf('day').valueOf();
384
+ this.givenTimeFlag.set(false);
275
385
  }
276
- const dateAsString = dayjs.tz(this.dateAsEpoch, this.timezone).format('DD-MM-YYYY');
277
- const intervalAsString = dayjs.tz(this.firstInterval, this.timezone).format(this.timeFormat);
278
- let start = dayjs.tz(`${dateAsString} ${intervalAsString}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone);
279
- const end = dayjs.tz(this.dateAsEpoch, this.timezone).endOf('d');
386
+ // Store the computed first interval for later use
387
+ this.computedFirstInterval = effectiveFirstInterval;
388
+ const dateAsString = dayjs.tz(this.dateAsEpoch(), this.timezone()).format('DD-MM-YYYY');
389
+ const intervalAsString = dayjs.tz(effectiveFirstInterval, this.timezone()).format(this.timeFormat);
390
+ let start = dayjs.tz(`${dateAsString} ${intervalAsString}`, `DD-MM-YYYY ${this.timeFormat}`, this.timezone());
391
+ const end = dayjs.tz(this.dateAsEpoch(), this.timezone()).endOf('d');
280
392
  while (start.valueOf() < end.valueOf()) {
281
- this.timeIntervals.push(start.format(this.timeFormat));
282
- start = start.add(this.interval, "m");
393
+ this.timeIntervals.update(intervals => [...intervals, start.format(this.timeFormat)]);
394
+ start = start.add(this.interval(), "m");
283
395
  }
284
- // if the start time is equal to the interval just before midnight
285
- // and the start date = end date
286
- // push 11:59pm only
287
- if (this.timeIntervals.length === 0) {
288
- this.chosenTime = dayjs.tz(dayjs(), this.timezone).endOf("d").format(this.timeFormat);
289
- this.timeIntervals.push(dayjs.tz(dayjs(), this.timezone).endOf("d").format(this.timeFormat));
396
+ // NEW: Handle end-of-day case - if firstInterval is at or very close to end of day
397
+ // and we're on the same date, show only 11:59 PM
398
+ const endOfDay = dayjs.tz(this.dateAsEpoch(), this.timezone()).endOf("d");
399
+ const firstIntervalDayjs = dayjs.tz(effectiveFirstInterval, this.timezone());
400
+ // Check if firstInterval is at or very close to end of day (within 1 minute)
401
+ const isAtEndOfDay = firstIntervalDayjs.isSame(endOfDay, 'day') &&
402
+ firstIntervalDayjs.diff(endOfDay, 'minute') >= -1;
403
+ if (isAtEndOfDay || this.timeIntervals().length === 0) {
404
+ // Clear existing intervals and add only 11:59 PM
405
+ this.timeIntervals.set([]);
406
+ this.timeIntervals.update(intervals => [...intervals, endOfDay.format(this.timeFormat)]);
290
407
  }
291
408
  }
292
409
  ngOnDestroy() {
@@ -305,59 +422,27 @@ export class TimePickerComponent {
305
422
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timepickerDirective = _t.first);
306
423
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tooltipDirective = _t.first);
307
424
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.timeIntervalRefs = _t);
308
- } }, inputs: { clockFormat: "clockFormat", timezone: "timezone", height: "height", inputWidth: "inputWidth", dropdownWidth: "dropdownWidth", interval: "interval", dateAsEpoch: "dateAsEpoch", firstInterval: "firstInterval", rangeValidity: "rangeValidity", showTooltip: "showTooltip", givenTime: "givenTime", minTime: "minTime", triggerChange: "triggerChange", disable: "disable" }, outputs: { timeEmitter: "timeEmitter" }, features: [i0.ɵɵNgOnChangesFeature], decls: 5, vars: 19, consts: [["input", ""], ["dropdownContainer", ""], ["dropdown", ""], ["timeInterval", ""], [1, "timepicker-container", 3, "ngStyle", "ngClass"], ["type", "text", "misToolTip", "", "cdkOverlayOrigin", "", 1, "h7", 3, "ngModelChange", "click", "ngModel", "ngClass", "ngStyle", "showToolTip", "text", "position", "showOnHover"], ["libDropdownScroll", "", "libTimepicker", "", 3, "statusEmitter", "originEl", "openStatus"], ["class", "timepicker-dropdown", 3, "ngStyle", 4, "ngIf"], [1, "timepicker-dropdown", 3, "ngStyle"], [3, "ngClass", "click", 4, "ngFor", "ngForOf"], [3, "click", "ngClass"], ["class", "ic-ui-check-24 selected-icon", 4, "ngIf"], [1, "ic-ui-check-24", "selected-icon"]], template: function TimePickerComponent_Template(rf, ctx) { if (rf & 1) {
425
+ } }, inputs: { clockFormat: [1, "clockFormat"], timezone: [1, "timezone"], height: [1, "height"], inputWidth: [1, "inputWidth"], dropdownWidth: [1, "dropdownWidth"], interval: [1, "interval"], dateAsEpoch: [1, "dateAsEpoch"], firstInterval: [1, "firstInterval"], rangeValidity: [1, "rangeValidity"], showTooltip: [1, "showTooltip"], givenTime: [1, "givenTime"], minTime: [1, "minTime"], triggerChange: [1, "triggerChange"], disable: [1, "disable"] }, outputs: { timeEmitter: "timeEmitter" }, decls: 5, vars: 19, consts: [["input", ""], ["dropdownContainer", ""], ["dropdown", ""], ["timeInterval", ""], [1, "timepicker-container", 3, "ngStyle", "ngClass"], ["type", "text", "misToolTip", "", "cdkOverlayOrigin", "", 1, "h7", 3, "ngModelChange", "click", "ngModel", "ngClass", "ngStyle", "showToolTip", "text", "position", "showOnHover"], ["libTimepicker", "", 3, "statusEmitter", "originEl", "openStatus"], ["class", "timepicker-dropdown", 3, "ngStyle", 4, "ngIf"], [1, "timepicker-dropdown", 3, "ngStyle"], [3, "ngClass", "click", 4, "ngFor", "ngForOf"], [3, "click", "ngClass"], ["class", "ic-ui-check-24 selected-icon", 4, "ngIf"], [1, "ic-ui-check-24", "selected-icon"]], template: function TimePickerComponent_Template(rf, ctx) { if (rf & 1) {
309
426
  const _r1 = i0.ɵɵgetCurrentView();
310
427
  i0.ɵɵelementStart(0, "div", 4)(1, "input", 5, 0);
311
- i0.ɵɵtwoWayListener("ngModelChange", function TimePickerComponent_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.chosenTime, $event) || (ctx.chosenTime = $event); return i0.ɵɵresetView($event); });
312
- i0.ɵɵlistener("ngModelChange", function TimePickerComponent_Template_input_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onTimeChange(ctx.chosenTime)); })("click", function TimePickerComponent_Template_input_click_1_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.openDropdown()); });
428
+ i0.ɵɵlistener("ngModelChange", function TimePickerComponent_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onTimeChange($event)); })("click", function TimePickerComponent_Template_input_click_1_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.openDropdown()); });
313
429
  i0.ɵɵelementEnd();
314
430
  i0.ɵɵtemplate(3, TimePickerComponent_ng_template_3_Template, 1, 1, "ng-template", 6, 1, i0.ɵɵtemplateRefExtractor);
315
431
  i0.ɵɵlistener("statusEmitter", function TimePickerComponent_Template_ng_template_statusEmitter_3_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.closeDropdown()); });
316
432
  i0.ɵɵelementEnd();
317
433
  } if (rf & 2) {
318
434
  const input_r6 = i0.ɵɵreference(2);
319
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(11, _c2, ctx.height))("ngClass", i0.ɵɵpureFunction1(13, _c3, ctx.disable));
435
+ i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(11, _c2, ctx.height()))("ngClass", i0.ɵɵpureFunction1(13, _c3, ctx.disable()));
320
436
  i0.ɵɵadvance();
321
- i0.ɵɵtwoWayProperty("ngModel", ctx.chosenTime);
322
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(15, _c4, ctx.isInvalid || !ctx.rangeValidity))("ngStyle", i0.ɵɵpureFunction1(17, _c5, ctx.inputWidth))("showToolTip", ctx.showTooltip && (ctx.isInvalid || !ctx.rangeValidity) && ctx.dispayToolTip)("text", "Invalid Time")("position", "top")("showOnHover", false);
437
+ i0.ɵɵproperty("ngModel", ctx.chosenTime())("ngClass", i0.ɵɵpureFunction1(15, _c4, ctx.isInvalid() || !ctx.rangeValidity()))("ngStyle", i0.ɵɵpureFunction1(17, _c5, ctx.inputWidth()))("showToolTip", ctx.showTooltip() && (ctx.isInvalid() || !ctx.rangeValidity()) && ctx.dispayToolTip)("text", "Invalid Time")("position", "top")("showOnHover", false);
323
438
  i0.ɵɵadvance(2);
324
- i0.ɵɵproperty("originEl", input_r6)("openStatus", ctx.openStatus);
439
+ i0.ɵɵproperty("originEl", input_r6)("openStatus", ctx.openStatus());
325
440
  } }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i1.NgStyle, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.ToolTipDirective, i4.CdkOverlayOrigin, i5.TimepickerDirective], styles: [".h1[_ngcontent-%COMP%]{font-size:40px;font-weight:400;letter-spacing:0px;line-height:48px}.h2[_ngcontent-%COMP%]{font-size:32px;font-weight:400;letter-spacing:0px;line-height:40px}.h3[_ngcontent-%COMP%]{font-size:28px;font-weight:400;letter-spacing:0px;line-height:36px}.h4[_ngcontent-%COMP%]{font-size:24px;font-weight:400;letter-spacing:0px;line-height:32px}.h5-b[_ngcontent-%COMP%]{font-size:20px;font-weight:700;letter-spacing:.25px;line-height:28px}.h5[_ngcontent-%COMP%]{font-size:20px;font-weight:400;letter-spacing:.15px;line-height:28px}.h6-b[_ngcontent-%COMP%]{font-size:16px;font-weight:700;letter-spacing:0px;line-height:24px}.h6[_ngcontent-%COMP%]{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.p[_ngcontent-%COMP%]{font-size:16px;font-weight:400;letter-spacing:0px;line-height:180%}.h7-b[_ngcontent-%COMP%]{font-size:14px;font-weight:700;letter-spacing:.25px;line-height:20px}.h7[_ngcontent-%COMP%]{font-size:14px;font-weight:400;letter-spacing:.2px;line-height:20px}.h8-b[_ngcontent-%COMP%]{font-size:12px;font-weight:700;letter-spacing:.25px;line-height:18px}.h8[_ngcontent-%COMP%]{font-size:12px;font-weight:400;letter-spacing:.2px;line-height:18px}.h9[_ngcontent-%COMP%]{font-size:10px;font-weight:400;letter-spacing:0px;line-height:15px}.btn-lg-b[_ngcontent-%COMP%]{font-size:16px;font-weight:700;letter-spacing:.5px;line-height:24px}.btn-lg[_ngcontent-%COMP%]{font-size:16px;font-weight:400;letter-spacing:.2px;line-height:24px}.btn-sm[_ngcontent-%COMP%]{font-size:14px;font-weight:400;letter-spacing:.25px;line-height:20px}.btn-link[_ngcontent-%COMP%]{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.display-1[_ngcontent-%COMP%]{font-size:48px;font-weight:400;letter-spacing:0px;line-height:56px}.display-2[_ngcontent-%COMP%]{font-size:14px;font-weight:400;letter-spacing:.5px;line-height:20px}*[_ngcontent-%COMP%]{box-sizing:border-box;font-family:Lato}.timepicker-container[_ngcontent-%COMP%]{display:inline-block;position:relative}input[_ngcontent-%COMP%]{text-align:center;border:none;border-bottom:1px solid #e0e0e0;outline:none;height:100%;width:100px;padding:4px 16px}input[_ngcontent-%COMP%]:hover{background:#f5f7fc}input[_ngcontent-%COMP%]:focus, input[_ngcontent-%COMP%]:active{background:#e6ebf7;border-bottom:1px solid #0937b2}.timepicker-dropdown[_ngcontent-%COMP%]{position:absolute;top:calc(100% + 4px);left:0;max-height:200px;overflow-y:auto;border:1px solid #e0e0e0;box-shadow:0 12px 24px #0000001f,0 4px 8px #0000001f;border-radius:4px;padding:8px;background:#fff}.timepicker-dropdown[_ngcontent-%COMP%]::-webkit-scrollbar{display:none}.timepicker-dropdown[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{margin:0;padding:0}.timepicker-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{text-align:start;list-style:none;padding:6px 12px;cursor:pointer;font-size:14px;color:#181f33;display:flex;justify-content:space-between;align-items:center}.timepicker-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover{background:#f5f7fc;border-radius:6px}.timepicker-dropdown[_ngcontent-%COMP%] li[_ngcontent-%COMP%] .selected-icon[_ngcontent-%COMP%]{font-weight:900}.highlight[_ngcontent-%COMP%]{background-color:#f5f7fc;border-radius:6px}.invalid[_ngcontent-%COMP%]{background:#fae1ea!important;border-bottom:1px solid #b00020!important}.disable[_ngcontent-%COMP%]{pointer-events:none!important;opacity:.5!important}"] }); }
326
441
  }
327
442
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TimePickerComponent, [{
328
443
  type: Component,
329
- args: [{ selector: "mis-timepicker", template: "<div class=\"timepicker-container\" [ngStyle]=\"{ height: height }\" [ngClass]=\"{'disable': disable}\">\n <input\n type=\"text\"\n [(ngModel)]=\"chosenTime\"\n (ngModelChange)=\"onTimeChange(chosenTime)\"\n [ngClass]=\"{ invalid: isInvalid || !rangeValidity }\"\n [ngStyle]=\"{ width: inputWidth }\"\n (click)=\"openDropdown()\"\n misToolTip\n [showToolTip]=\"showTooltip && (isInvalid || !rangeValidity) && dispayToolTip\"\n [text]=\"'Invalid Time'\"\n [position]=\"'top'\"\n [showOnHover]=\"false\"\n #input\n cdkOverlayOrigin\n class=\"h7\"\n />\n\n <ng-template #dropdownContainer libDropdownScroll libTimepicker [originEl]=\"input\" [openStatus]=\"openStatus\" (statusEmitter)=\"closeDropdown()\">\n <div *ngIf=\"openStatus\" class=\"timepicker-dropdown\" [ngStyle]=\"{ width: dropdownWidth || inputWidth }\">\n <ul #dropdown>\n <li #timeInterval (click)=\"onTimeSelect(interval)\" *ngFor=\"let interval of timeIntervals; index as i\" [ngClass]=\"{ highlight: i === isHighlighted }\">\n {{ interval }}\n <div class=\"ic-ui-check-24 selected-icon\" *ngIf=\"interval === chosenTime\"></div>\n </li>\n </ul>\n </div>\n </ng-template>\n</div>\n", styles: [".h1{font-size:40px;font-weight:400;letter-spacing:0px;line-height:48px}.h2{font-size:32px;font-weight:400;letter-spacing:0px;line-height:40px}.h3{font-size:28px;font-weight:400;letter-spacing:0px;line-height:36px}.h4{font-size:24px;font-weight:400;letter-spacing:0px;line-height:32px}.h5-b{font-size:20px;font-weight:700;letter-spacing:.25px;line-height:28px}.h5{font-size:20px;font-weight:400;letter-spacing:.15px;line-height:28px}.h6-b{font-size:16px;font-weight:700;letter-spacing:0px;line-height:24px}.h6{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.p{font-size:16px;font-weight:400;letter-spacing:0px;line-height:180%}.h7-b{font-size:14px;font-weight:700;letter-spacing:.25px;line-height:20px}.h7{font-size:14px;font-weight:400;letter-spacing:.2px;line-height:20px}.h8-b{font-size:12px;font-weight:700;letter-spacing:.25px;line-height:18px}.h8{font-size:12px;font-weight:400;letter-spacing:.2px;line-height:18px}.h9{font-size:10px;font-weight:400;letter-spacing:0px;line-height:15px}.btn-lg-b{font-size:16px;font-weight:700;letter-spacing:.5px;line-height:24px}.btn-lg{font-size:16px;font-weight:400;letter-spacing:.2px;line-height:24px}.btn-sm{font-size:14px;font-weight:400;letter-spacing:.25px;line-height:20px}.btn-link{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.display-1{font-size:48px;font-weight:400;letter-spacing:0px;line-height:56px}.display-2{font-size:14px;font-weight:400;letter-spacing:.5px;line-height:20px}*{box-sizing:border-box;font-family:Lato}.timepicker-container{display:inline-block;position:relative}input{text-align:center;border:none;border-bottom:1px solid #e0e0e0;outline:none;height:100%;width:100px;padding:4px 16px}input:hover{background:#f5f7fc}input:focus,input:active{background:#e6ebf7;border-bottom:1px solid #0937b2}.timepicker-dropdown{position:absolute;top:calc(100% + 4px);left:0;max-height:200px;overflow-y:auto;border:1px solid #e0e0e0;box-shadow:0 12px 24px #0000001f,0 4px 8px #0000001f;border-radius:4px;padding:8px;background:#fff}.timepicker-dropdown::-webkit-scrollbar{display:none}.timepicker-dropdown ul{margin:0;padding:0}.timepicker-dropdown li{text-align:start;list-style:none;padding:6px 12px;cursor:pointer;font-size:14px;color:#181f33;display:flex;justify-content:space-between;align-items:center}.timepicker-dropdown li:hover{background:#f5f7fc;border-radius:6px}.timepicker-dropdown li .selected-icon{font-weight:900}.highlight{background-color:#f5f7fc;border-radius:6px}.invalid{background:#fae1ea!important;border-bottom:1px solid #b00020!important}.disable{pointer-events:none!important;opacity:.5!important}\n"] }]
330
- }], () => [], { clockFormat: [{
331
- type: Input
332
- }], timezone: [{
333
- type: Input
334
- }], height: [{
335
- type: Input
336
- }], inputWidth: [{
337
- type: Input
338
- }], dropdownWidth: [{
339
- type: Input
340
- }], interval: [{
341
- type: Input
342
- }], dateAsEpoch: [{
343
- type: Input
344
- }], firstInterval: [{
345
- type: Input
346
- }], rangeValidity: [{
347
- type: Input
348
- }], showTooltip: [{
349
- type: Input
350
- }], givenTime: [{
351
- type: Input
352
- }], minTime: [{
353
- type: Input
354
- }], triggerChange: [{
355
- type: Input
356
- }], disable: [{
357
- type: Input
358
- }], timeEmitter: [{
359
- type: Output
360
- }], input: [{
444
+ args: [{ selector: "mis-timepicker", template: "<div class=\"timepicker-container\" [ngStyle]=\"{ height: height() }\" [ngClass]=\"{'disable': disable()}\">\n <input\n type=\"text\"\n [ngModel]=\"chosenTime()\"\n (ngModelChange)=\"onTimeChange($event)\"\n [ngClass]=\"{ invalid: isInvalid() || !rangeValidity() }\"\n [ngStyle]=\"{ width: inputWidth() }\"\n (click)=\"openDropdown()\"\n misToolTip\n [showToolTip]=\"showTooltip() && (isInvalid() || !rangeValidity()) && dispayToolTip\"\n [text]=\"'Invalid Time'\"\n [position]=\"'top'\"\n [showOnHover]=\"false\"\n #input\n cdkOverlayOrigin\n class=\"h7\"\n />\n\n <ng-template #dropdownContainer libTimepicker [originEl]=\"input\" [openStatus]=\"openStatus()\" (statusEmitter)=\"closeDropdown()\">\n <div *ngIf=\"openStatus()\" class=\"timepicker-dropdown\" [ngStyle]=\"{ width: dropdownWidth() || inputWidth() }\">\n <ul #dropdown>\n <li #timeInterval (click)=\"onTimeSelect(interval)\" *ngFor=\"let interval of timeIntervals(); index as i\" [ngClass]=\"{ highlight: i === isHighlighted() }\">\n {{ interval }}\n <div class=\"ic-ui-check-24 selected-icon\" *ngIf=\"interval === chosenTime()\"></div>\n </li>\n </ul>\n </div>\n </ng-template>\n</div>\n", styles: [".h1{font-size:40px;font-weight:400;letter-spacing:0px;line-height:48px}.h2{font-size:32px;font-weight:400;letter-spacing:0px;line-height:40px}.h3{font-size:28px;font-weight:400;letter-spacing:0px;line-height:36px}.h4{font-size:24px;font-weight:400;letter-spacing:0px;line-height:32px}.h5-b{font-size:20px;font-weight:700;letter-spacing:.25px;line-height:28px}.h5{font-size:20px;font-weight:400;letter-spacing:.15px;line-height:28px}.h6-b{font-size:16px;font-weight:700;letter-spacing:0px;line-height:24px}.h6{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.p{font-size:16px;font-weight:400;letter-spacing:0px;line-height:180%}.h7-b{font-size:14px;font-weight:700;letter-spacing:.25px;line-height:20px}.h7{font-size:14px;font-weight:400;letter-spacing:.2px;line-height:20px}.h8-b{font-size:12px;font-weight:700;letter-spacing:.25px;line-height:18px}.h8{font-size:12px;font-weight:400;letter-spacing:.2px;line-height:18px}.h9{font-size:10px;font-weight:400;letter-spacing:0px;line-height:15px}.btn-lg-b{font-size:16px;font-weight:700;letter-spacing:.5px;line-height:24px}.btn-lg{font-size:16px;font-weight:400;letter-spacing:.2px;line-height:24px}.btn-sm{font-size:14px;font-weight:400;letter-spacing:.25px;line-height:20px}.btn-link{font-size:16px;font-weight:400;letter-spacing:0px;line-height:24px}.display-1{font-size:48px;font-weight:400;letter-spacing:0px;line-height:56px}.display-2{font-size:14px;font-weight:400;letter-spacing:.5px;line-height:20px}*{box-sizing:border-box;font-family:Lato}.timepicker-container{display:inline-block;position:relative}input{text-align:center;border:none;border-bottom:1px solid #e0e0e0;outline:none;height:100%;width:100px;padding:4px 16px}input:hover{background:#f5f7fc}input:focus,input:active{background:#e6ebf7;border-bottom:1px solid #0937b2}.timepicker-dropdown{position:absolute;top:calc(100% + 4px);left:0;max-height:200px;overflow-y:auto;border:1px solid #e0e0e0;box-shadow:0 12px 24px #0000001f,0 4px 8px #0000001f;border-radius:4px;padding:8px;background:#fff}.timepicker-dropdown::-webkit-scrollbar{display:none}.timepicker-dropdown ul{margin:0;padding:0}.timepicker-dropdown li{text-align:start;list-style:none;padding:6px 12px;cursor:pointer;font-size:14px;color:#181f33;display:flex;justify-content:space-between;align-items:center}.timepicker-dropdown li:hover{background:#f5f7fc;border-radius:6px}.timepicker-dropdown li .selected-icon{font-weight:900}.highlight{background-color:#f5f7fc;border-radius:6px}.invalid{background:#fae1ea!important;border-bottom:1px solid #b00020!important}.disable{pointer-events:none!important;opacity:.5!important}\n"] }]
445
+ }], () => [], { input: [{
361
446
  type: ViewChild,
362
447
  args: ["input", { static: true }]
363
448
  }], timepickerDirective: [{
@@ -371,4 +456,4 @@ export class TimePickerComponent {
371
456
  args: ["timeInterval"]
372
457
  }] }); })();
373
458
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TimePickerComponent, { className: "TimePickerComponent" }); })();
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9taXMtY29tcG9uZW50cy90aW1lcGlja2VyL3RpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvdGltZXBpY2tlci90aW1lcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUksT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFckUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUE7Ozs7Ozs7Ozs7Ozs7OztJQ2VwRCwwQkFBZ0Y7Ozs7SUFGbEYsaUNBQXFKO0lBQW5JLDZOQUFTLGdDQUFzQixLQUFDO0lBQ2hELFlBQ0E7SUFBQSw4RkFBMEU7SUFDNUUsaUJBQUs7Ozs7O0lBSGlHLG1GQUE4QztJQUNsSixlQUNBO0lBREEsNENBQ0E7SUFBMkMsY0FBNkI7SUFBN0Isd0RBQTZCOzs7SUFINUUsQUFERiw4QkFBdUcsa0JBQ3ZGO0lBQ1osc0ZBQXFKO0lBS3pKLEFBREUsaUJBQUssRUFDRDs7O0lBUDhDLCtGQUFrRDtJQUUxQixlQUFrQjtJQUFsQiw4Q0FBa0I7OztJQUY5RixrRkFBdUc7OztJQUFqRyx3Q0FBZ0I7O0FEVDFCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFRaEMsTUFBTSxPQUFPLG1CQUFtQjtJQWdDOUIsb0ZBQW9GO0lBQ3BGLElBQWtDLGdCQUFnQixDQUFDLFNBQVM7UUFDMUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO2dCQUMzQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEO1FBdkNBLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixrQkFBYSxHQUFhLEVBQUUsQ0FBQztRQUM3QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixrQkFBYSxHQUFZLElBQUksQ0FBQztRQUNyQixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUd6QixhQUFRLEdBQVcsY0FBYyxDQUFDO1FBQ2xDLFdBQU0sR0FBVyxhQUFhLENBQUM7UUFDL0IsZUFBVSxHQUFXLE9BQU8sQ0FBQztRQUU3QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGdCQUFXLEdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFakUsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFDckMsa0JBQWEsR0FBWSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBR2pDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQzlCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBZXBDLENBQUM7SUFDZixRQUFRO1FBQ04sSUFBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEYsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUNyQixLQUFLLEVBQUUsZUFBZSxDQUFDLE9BQU8sRUFBRTthQUNqQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVoRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVyRCw4Q0FBOEM7WUFDOUMsNENBQTRDO1lBQzVDLDJCQUEyQjtZQUMzQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ2pHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RixlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbEQsQ0FBQztZQUVELElBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFHLENBQUM7Z0JBQzNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7Z0JBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFFM0IsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUNaLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTO29CQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQ3JCLEtBQUssRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFO2lCQUNqQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsSUFBVztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsNERBQTREO0lBQzVELFFBQVEsQ0FBQyxPQUFlLE9BQU87UUFBRSxDQUFDO1FBQ2hDLElBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLE9BQWUsQ0FBQztRQUVwQixJQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDM0IsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLEtBQUssR0FBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFcEQsSUFBRyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDakQsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNkLENBQUM7aUJBQU0sSUFBRyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDeEQsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLG1CQUFtQjtZQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLFlBQVk7UUFDVixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBWTtRQUM1QixNQUFNLElBQUksR0FBRyxzREFBc0QsQ0FBQztRQUNwRSxNQUFNLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztRQUMvQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBWSxLQUFLLENBQUM7UUFFMUIsdURBQXVEO1FBQ3ZELHlEQUF5RDtRQUN6RCw0REFBNEQ7UUFDNUQsSUFDRSxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxTQUFTO1lBQ2QsQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDbkIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQ3BLLENBQUM7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDcEcsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxZQUFZLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDdEIsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRTtTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxtQkFBbUI7WUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxZQUFZLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CO2dCQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ3RCLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUU7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QixDQUFDLElBQVk7UUFDbkMsSUFBSSxZQUFvQixDQUFDO1FBQ3pCLDhDQUE4QztRQUM5QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDaEcsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxJQUFJLElBQUksRUFBRSxFQUFFLGNBQWMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RyxtQ0FBbUM7UUFDbkMsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkcsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsWUFBWSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVqTiw0REFBNEQ7UUFDNUQsSUFBSyxlQUFlLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNySCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzNELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQUUsY0FBYyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxRyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBR0Qsa0VBQWtFO0lBQ2xFLGdCQUFnQjtRQUNkLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXhCLCtDQUErQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLDZEQUE2RDtZQUM3RCwwQ0FBMEM7WUFDMUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzlJLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuRixDQUFDO1lBQ0Qsc0NBQXNDO2lCQUNqQyxJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQztnQkFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNoRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4RixDQUFDO1lBQ0Qsd0RBQXdEO2lCQUNuRCxDQUFDO2dCQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pGLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsY0FBYyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdkQsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLGdDQUFnQztRQUNoQyxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pFLENBQUM7b0hBL1FVLG1CQUFtQjtvRUFBbkIsbUJBQW1COzsyQkE2Qm5CLG1CQUFtQjsyQkFDbkIsZ0JBQWdCOzs7Ozs7Ozs7O1lDakQzQixBQURGLDhCQUFrRyxrQkFnQjlGO1lBYkEsd1BBQXdCO1lBSXhCLEFBSEEscUpBQWlCLGdDQUF3QixLQUFDLHdIQUdqQyxrQkFBYyxLQUFDO1lBTjFCLGlCQWVFO1lBRUYsa0hBQStJO1lBQWxDLDJKQUFpQixtQkFBZSxLQUFDO1lBVWhKLGlCQUFNOzs7WUE1QjJELEFBQS9CLGlFQUE4QixxREFBaUM7WUFHN0YsY0FBd0I7WUFBeEIsOENBQXdCO1lBU3hCLEFBREEsQUFEQSxBQURBLEFBSEEsQUFEQSwwRkFBb0Qsd0RBQ25CLDhGQUc0Qyx3QkFDdEQsbUJBQ0wsc0JBQ0c7WUFNeUMsZUFBa0I7WUFBQyxBQUFuQixtQ0FBa0IsOEJBQTBCOzs7aUZERWpHLG1CQUFtQjtjQUwvQixTQUFTOzJCQUNFLGdCQUFnQjtvQkFjakIsV0FBVztrQkFBbkIsS0FBSztZQUdHLFFBQVE7a0JBQWhCLEtBQUs7WUFDRyxNQUFNO2tCQUFkLEtBQUs7WUFDRyxVQUFVO2tCQUFsQixLQUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSztZQUNHLFFBQVE7a0JBQWhCLEtBQUs7WUFDRyxXQUFXO2tCQUFuQixLQUFLO1lBQ0csYUFBYTtrQkFBckIsS0FBSztZQUNHLGFBQWE7a0JBQXJCLEtBQUs7WUFDRyxXQUFXO2tCQUFuQixLQUFLO1lBRUcsU0FBUztrQkFBakIsS0FBSztZQUNHLE9BQU87a0JBQWYsS0FBSztZQUNHLGFBQWE7a0JBQXJCLEtBQUs7WUFDRyxPQUFPO2tCQUFmLEtBQUs7WUFDSSxXQUFXO2tCQUFwQixNQUFNO1lBQytCLEtBQUs7a0JBQTFDLFNBQVM7bUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNKLG1CQUFtQjtrQkFBbEQsU0FBUzttQkFBQyxtQkFBbUI7WUFDRCxnQkFBZ0I7a0JBQTVDLFNBQVM7bUJBQUMsZ0JBQWdCO1lBR08sZ0JBQWdCO2tCQUFqRCxZQUFZO21CQUFDLGNBQWM7O2tGQWpDakIsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IElUaW1lIH0gZnJvbSBcIi4vdGltZS5uYW1lc3BhY2VcIjtcbmltcG9ydCB7IFRpbWVwaWNrZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi90aW1lcGlja2VyLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgVG9vbFRpcERpcmVjdGl2ZSB9IGZyb20gXCJtaXMtY3J5c3RhbC1kZXNpZ24tc3lzdGVtL3Rvb2x0aXBcIjtcblxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcbmltcG9ydCBjdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnXG5cbmRheWpzLmV4dGVuZCh1dGMpO1xuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1pcy10aW1lcGlja2VyXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGltZXBpY2tlci5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIGN1cnJUaW1lITogc3RyaW5nO1xuICBjaG9zZW5UaW1lOiBzdHJpbmc7XG4gIG9wZW5TdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNIaWdobGlnaHRlZDogbnVtYmVyID0gMDtcbiAgaXNJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gIHRpbWVJbnRlcnZhbHM6IHN0cmluZ1tdID0gW107XG4gIHNob3VsZFNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xuICB1c2VySW5wdXRGbGFnOiBib29sZWFuID0gZmFsc2U7XG4gIGdpdmVuVGltZUZsYWc6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBjbG9ja0Zvcm1hdDogbnVtYmVyID0gMTI7XG4gIHRpbWVGb3JtYXQhOiBzdHJpbmc7XG4gIFxuICBASW5wdXQoKSB0aW1lem9uZTogc3RyaW5nID0gXCJBc2lhL0tvbGthdGFcIjtcbiAgQElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSBcIm1heC1jb250ZW50XCI7XG4gIEBJbnB1dCgpIGlucHV0V2lkdGg6IHN0cmluZyA9IFwiMTAwcHhcIjtcbiAgQElucHV0KCkgZHJvcGRvd25XaWR0aD86IHN0cmluZztcbiAgQElucHV0KCkgaW50ZXJ2YWw6IG51bWJlciA9IDE1O1xuICBASW5wdXQoKSBkYXRlQXNFcG9jaDogbnVtYmVyID0gZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSkudmFsdWVPZigpO1xuICBASW5wdXQoKSBmaXJzdEludGVydmFsITogbnVtYmVyO1xuICBASW5wdXQoKSByYW5nZVZhbGlkaXR5OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd1Rvb2x0aXA6IGJvb2xlYW4gPSB0cnVlO1xuICBkaXNwYXlUb29sVGlwOiBib29sZWFuID0gdGhpcy5zaG93VG9vbHRpcDtcbiAgQElucHV0KCkgZ2l2ZW5UaW1lOiBudW1iZXI7XG4gIEBJbnB1dCgpIG1pblRpbWU/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHRyaWdnZXJDaGFuZ2U6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBkaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSB0aW1lRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8SVRpbWU+KCk7XG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZChUaW1lcGlja2VyRGlyZWN0aXZlKSB0aW1lcGlja2VyRGlyZWN0aXZlOiBUaW1lcGlja2VyRGlyZWN0aXZlO1xuICBAVmlld0NoaWxkKFRvb2xUaXBEaXJlY3RpdmUpIHRvb2x0aXBEaXJlY3RpdmU6IFRvb2xUaXBEaXJlY3RpdmU7XG5cbiAgLy8gZ2V0cyBhbGwgdGhlIGxpIGVsZW1lbnRzIGZyb20gdGhlIGRyb3Bkb3duIGFuZCBzY3JvbGxzIHRvIHRoZSBoaWdobGlnaHRlZCBlbGVtZW50XG4gIEBWaWV3Q2hpbGRyZW4oXCJ0aW1lSW50ZXJ2YWxcIikgc2V0IHRpbWVJbnRlcnZhbFJlZnMoaW50ZXJ2YWxzKSB7XG4gICAgaW50ZXJ2YWxzLmZvckVhY2goaW50ZXJ2YWwgPT4ge1xuICAgICAgaWYgKGludGVydmFsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0WzBdID09PSBcImhpZ2hsaWdodFwiKSB7XG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkID0gaW50ZXJ2YWwubmF0aXZlRWxlbWVudDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBoaWdobGlnaHRlZC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiBcImNlbnRlclwiIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCl7fVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5naXZlblRpbWUgJiYgIXRoaXMubWluVGltZSkge1xuICAgICAgdGhpcy5jaG9zZW5UaW1lID0gZGF5anMudHoodGhpcy5maXJzdEludGVydmFsLCB0aGlzLnRpbWV6b25lKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KTtcbiAgICAgIGxldCBjaG9zZW5UaW1lZGF5anMgPSB0aGlzLmdldGRheWpzKHRoaXMuY2hvc2VuVGltZSk7XG4gICAgICB0aGlzLmVtaXRUaW1lKHtcbiAgICAgICAgdmFsaWQ6ICF0aGlzLmlzSW52YWxpZCxcbiAgICAgICAgdGltZTogdGhpcy5jaG9zZW5UaW1lLFxuICAgICAgICBlcG9jaDogY2hvc2VuVGltZWRheWpzLnZhbHVlT2YoKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRm9ybWF0ID0gdGhpcy5jbG9ja0Zvcm1hdCA9PT0gMTIgPyBcImhoOm1tIGFcIiA6IFwiSEg6bW1cIjtcblxuICAgIGlmICh0aGlzLnRpbWVGb3JtYXQpIHtcbiAgICAgIGxldCBjaG9zZW5UaW1lZGF5anMgPSB0aGlzLmdldGRheWpzKHRoaXMuY2hvc2VuVGltZSk7XG4gICAgXG4gICAgICAvLyBpZiB0aGUgZmlyc3QgaW50ZXJ2YWwgaXMgPj0gdGhlIGNob3NlbiB0aW1lXG4gICAgICAvLyB0aGVuIG9ubHkgdXBkYXRlIHRoZSB2YWx1ZSBvZiBjaG9zZW4gdGltZVxuICAgICAgLy8gZWxzZSBpdCByZW1haW5zIHRoZSBzYW1lXG4gICAgICBpZiAodGhpcy5maXJzdEludGVydmFsID49IGNob3NlblRpbWVkYXlqcy52YWx1ZU9mKCkgJiYgdGhpcy5yYW5nZVZhbGlkaXR5ICYmICF0aGlzLnVzZXJJbnB1dEZsYWcpIHtcbiAgICAgICAgdGhpcy5jaG9zZW5UaW1lID0gZGF5anMudHoodGhpcy5maXJzdEludGVydmFsLCB0aGlzLnRpbWV6b25lKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KTtcbiAgICAgICAgY2hvc2VuVGltZWRheWpzID0gdGhpcy5nZXRkYXlqcyh0aGlzLmNob3NlblRpbWUpXG4gICAgICB9XG5cbiAgICAgIGlmKCh0aGlzLmdpdmVuVGltZUZsYWcgJiYgdGhpcy5naXZlblRpbWUpIHx8IHRoaXMubWluVGltZSApIHtcbiAgICAgICAgdGhpcy5jaG9zZW5UaW1lID0gZGF5anMudHoodGhpcy5taW5UaW1lIHx8IHRoaXMuZ2l2ZW5UaW1lLCB0aGlzLnRpbWV6b25lKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KTtcbiAgICAgIH1cbiAgICAgIGNob3NlblRpbWVkYXlqcyA9IHRoaXMuZ2V0ZGF5anModGhpcy5jaG9zZW5UaW1lKVxuXG4gICAgICBpZiAoIXRoaXMudXNlcklucHV0RmxhZykgdGhpcy5wb3B1bGF0ZURyb3Bkb3duKCk7XG4gICAgICB0aGlzLnVzZXJJbnB1dEZsYWcgPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYodGhpcy5jaG9zZW5UaW1lKSB7XG4gICAgICAgIHRoaXMuaXNJbnZhbGlkID0gIXRoaXMuY2hlY2tUaW1lVmFsaWRpdHkodGhpcy5jaG9zZW5UaW1lLnRyaW0oKSk7XG4gICAgICAgIHRoaXMuZW1pdFRpbWUoe1xuICAgICAgICAgIHZhbGlkOiAhdGhpcy5pc0ludmFsaWQsXG4gICAgICAgICAgdGltZTogdGhpcy5jaG9zZW5UaW1lLFxuICAgICAgICAgIGVwb2NoOiBjaG9zZW5UaW1lZGF5anMudmFsdWVPZigpXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb3Nlc3RJbnRlcnZhbCh0aGlzLmNob3NlblRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXRUaW1lKGRhdGE6IElUaW1lKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRW1pdHRlci5lbWl0KGRhdGEpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gZ2V0IGRheWpzIG9iamVjdCB3aGVuIHRpbWUgaXMgZ2l2ZW4gaW4gc3RyaW5nXG4gIGdldGRheWpzKHRpbWU6IHN0cmluZyA9ICcwMDowMCcpeztcbiAgICBpZighdGltZSB8fCB0eXBlb2YgdGltZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGltZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgbGV0IGhvdXJzOiBudW1iZXI7XG4gICAgbGV0IG1pbnV0ZXM6IG51bWJlcjtcblxuICAgIGlmKHRoaXMuY2xvY2tGb3JtYXQgPT09IDI0KSB7XG4gICAgICBob3VycyA9IHBhcnNlSW50KHRpbWUuc3BsaXQoJzonKVswXSk7XG4gICAgICBtaW51dGVzID0gcGFyc2VJbnQodGltZS5zcGxpdCgnOicpWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGltZVBhcnRzID0gdGltZS5zcGxpdCgnICcpO1xuICAgICAgY29uc3QgQU1fUE0gPSB0aW1lUGFydHM/LlsxXTtcbiAgICAgIGhvdXJzID0gIHBhcnNlSW50KHRpbWVQYXJ0cz8uWzBdPy5zcGxpdCgnOicpPy5bMF0pO1xuICAgICAgbWludXRlcyA9IHBhcnNlSW50KHRpbWVQYXJ0cz8uWzBdPy5zcGxpdCgnOicpPy5bMV0pO1xuXG4gICAgICBpZihBTV9QTT8udG9VcHBlckNhc2UoKSA9PT0gJ1BNJyAmJiBob3VycyAhPT0gMTIpIHtcbiAgICAgICAgaG91cnMgKz0gMTI7XG4gICAgICB9IGVsc2UgaWYoQU1fUE0/LnRvVXBwZXJDYXNlKCkgPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSB7XG4gICAgICAgIGhvdXJzID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCwgdGhpcy50aW1lem9uZSkuYWRkKGhvdXJzLCAnaCcpLmFkZChtaW51dGVzLCAnbScpO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLmRpc3BheVRvb2xUaXAgPSBmYWxzZTtcbiAgICB0aGlzLnVzZXJJbnB1dEZsYWcgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5TdGF0dXMgPSBmYWxzZTtcbiAgICBpZiAodGhpcy50aW1lcGlja2VyRGlyZWN0aXZlKSB0aGlzLnRpbWVwaWNrZXJEaXJlY3RpdmUuZGVzdHJveU92ZXJsYXkoKTtcbiAgfVxuXG4gIC8vIHRvZ2dsZSB0aW1lcGlja2VyIGRyb3Bkb3duXG4gIG9wZW5Ecm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BheVRvb2xUaXAgPSB0cnVlO1xuICAgIHRoaXMub3BlblN0YXR1cyA9IHRydWU7XG4gIH1cblxuICBjaGVja1RpbWVWYWxpZGl0eSh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBSRTEyID0gL14oKFswXVsxLTldfDFbMC0yXSk6KFswLTVdWzAtOV0pKCApPyhhbXxwbXxBTXxQTSkpJC9pO1xuICAgIGNvbnN0IFJFMjQgPSAvXihbMDFdWzAtOV18MlswLTNdKTpbMC01XVswLTldJC87XG4gICAgY29uc3QgUkUgPSB0aGlzLmNsb2NrRm9ybWF0ID09PSAxMiA/IFJFMTIgOiBSRTI0O1xuXG4gICAgY29uc3QgdGltZWRheWpzID0gdGhpcy5nZXRkYXlqcyh0aW1lKTtcbiAgICBsZXQgZmxhZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gaWYgdGhlIGZpcnN0IGludGVydmFsIGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGRheVxuICAgIC8vIG9yIGEgdGltZSBpcyBhbHJlYWR5IHByb3ZpZGVkIHRvIHRoZSBjb21wb25lbnQgdG8gc2hvd1xuICAgIC8vIHRoZW4gd2UgZG9uJ3QgY2hlY2sgaXRzIHZhbGlkaXR5IGFnYWluc3QgdGhlIGN1cnJlbnQgdGltZVxuICAgIGlmIChcbiAgICAgIHRoaXMubWluVGltZSB8fCBcbiAgICAgIHRoaXMuZ2l2ZW5UaW1lIHx8XG4gICAgICAodGhpcy5maXJzdEludGVydmFsICYmXG4gICAgICBkYXlqcy50eih0aGlzLmZpcnN0SW50ZXJ2YWwsIHRoaXMudGltZXpvbmUpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpLnZhbHVlT2YoKSA9PT0gZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSkuc3RhcnRPZihcImRheVwiKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KS52YWx1ZU9mKCkpXG4gICAgKSB7XG4gICAgICBmbGFnID0gdGltZS5tYXRjaChSRSkgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYWcgPSB0aW1lLm1hdGNoKFJFKSAmJiB0aW1lZGF5anMuZGlmZihkYXlqcy50eihkYXlqcygpLCB0aGlzLnRpbWV6b25lKSwgXCJtXCIpID49IDAgPyB0cnVlOiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhZztcbiAgfVxuXG4gIC8vIHVwZGF0ZSBjaG9zZW4gdGltZSBhcyBzb29uIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiBhbiBpbnRlcnZhbFxuICBvblRpbWVTZWxlY3QodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0ludmFsaWQgPSAhdGhpcy5jaGVja1RpbWVWYWxpZGl0eSh0aW1lLnRyaW0oKSk7XG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZCkge1xuICAgICAgdGhpcy5jaG9zZW5UaW1lID0gdGltZTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvc2VzdEludGVydmFsKHRoaXMuY2hvc2VuVGltZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZWRheWpzID0gdGhpcy5nZXRkYXlqcyh0aW1lKTtcbiAgICB0aGlzLmVtaXRUaW1lKHtcbiAgICAgIHZhbGlkOiAhdGhpcy5pc0ludmFsaWQsXG4gICAgICB0aW1lOiB0aW1lLFxuICAgICAgZXBvY2g6IHRpbWVkYXlqcy52YWx1ZU9mKCkgXG4gICAgfSk7XG4gICAgdGhpcy5vcGVuU3RhdHVzID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudGltZXBpY2tlckRpcmVjdGl2ZSkgdGhpcy50aW1lcGlja2VyRGlyZWN0aXZlLmRlc3Ryb3lPdmVybGF5KCk7XG4gIH1cblxuICAvLyBjaGVja3MgdmFsaWRpdHkgb2YgdGltZSBvbiBpbnB1dCBjaGFuZ2UgYW5kIGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgaW50ZXJ2YWxcbiAgb25UaW1lQ2hhbmdlKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNJbnZhbGlkID0gIXRoaXMuY2hlY2tUaW1lVmFsaWRpdHkodGltZS50cmltKCkpO1xuXG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZCkge1xuICAgICAgdGhpcy51c2VySW5wdXRGbGFnID0gdHJ1ZTtcbiAgICAgIHRoaXMub3BlblN0YXR1cyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMudGltZXBpY2tlckRpcmVjdGl2ZSkgdGhpcy50aW1lcGlja2VyRGlyZWN0aXZlLmRlc3Ryb3lPdmVybGF5KCk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUNsb3Nlc3RJbnRlcnZhbCh0aW1lKTtcbiAgICB9XG4gICAgY29uc3QgdGltZWRheWpzID0gdGhpcy5nZXRkYXlqcyh0aW1lKTtcbiAgICB0aGlzLmVtaXRUaW1lKHtcbiAgICAgIHZhbGlkOiAhdGhpcy5pc0ludmFsaWQsXG4gICAgICB0aW1lOiB0aW1lLFxuICAgICAgZXBvY2g6IHRpbWVkYXlqcy52YWx1ZU9mKCkgXG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVDbG9zZXN0SW50ZXJ2YWwodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHJvdW5kZWRFcG9jaDogbnVtYmVyO1xuICAgIC8vIENvbnZlcnRpbmcgdGltZSBhbmQgZGF0ZSB0byBhIGRheWpzIG9iamVjdCBcbiAgICBjb25zdCBjaG9zZW5EYXRlID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCwgdGhpcy50aW1lem9uZSkuZm9ybWF0KFwiREQtTU0tWVlZWVwiKTsgLy8gMDUtMDEtMjAyNFxuICAgIGNvbnN0IHBhcnNlZFRpbWVXaXRoRGF0ZSA9IGRheWpzLnR6KGAke2Nob3NlbkRhdGV9ICR7dGltZX1gLCBgREQtTU0tWVlZWSAke3RoaXMudGltZUZvcm1hdH1gLCB0aGlzLnRpbWV6b25lKTtcbiAgICAvLyBDb252ZXJ0aW5nIGRheWpzIG9iamVjdCB0byBlcG9jaFxuICAgIGNvbnN0IGNob3NlblRpbWVFcG9jaCA9IHBhcnNlZFRpbWVXaXRoRGF0ZS52YWx1ZU9mKCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCAtIChkYXlqcy50eihjaG9zZW5UaW1lRXBvY2gsIHRoaXMudGltZXpvbmUpLm1pbnV0ZSgpICUgdGhpcy5pbnRlcnZhbCk7XG5cbiAgICBpZiAodGhpcy5taW5UaW1lICYmICF0aGlzLmdpdmVuVGltZSkge1xuICAgICAgdGhpcy5pc0hpZ2hsaWdodGVkID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm91bmRlZEVwb2NoID0gb2Zmc2V0ID49IHRoaXMuaW50ZXJ2YWwgLyAyID8gKGRheWpzLnR6KGNob3NlblRpbWVFcG9jaCwgdGhpcy50aW1lem9uZSkuc3VidHJhY3QodGhpcy5pbnRlcnZhbCAtIG9mZnNldCwgXCJtXCIpKS52YWx1ZU9mKCkgOiAoZGF5anMudHooY2hvc2VuVGltZUVwb2NoLCB0aGlzLnRpbWV6b25lKS5hZGQoIG9mZnNldCwgXCJtXCIpKS52YWx1ZU9mKCk7XG5cbiAgICAvLyBmaW5kaW5nIHRoZSBpbmRleCBvZiBlbGVtZW50IHRoYXQgbmVlZHMgdG8gYmUgaGlnaGxpZ2h0ZWRcbiAgICBpZiAoIGNob3NlblRpbWVFcG9jaCA+IGRheWpzLnR6KHRoaXMuZGF0ZUFzRXBvY2gsIHRoaXMudGltZXpvbmUpLmVuZE9mKFwiZGF5XCIpLnN1YnRyYWN0KHRoaXMuaW50ZXJ2YWwsIFwibVwiKS52YWx1ZU9mKCkpIHtcbiAgICAgIHRoaXMuaXNIaWdobGlnaHRlZCA9IHRoaXMudGltZUludGVydmFscy5sZW5ndGggLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByb3VuZGVkRXBvY2hkYXlqcyA9IGRheWpzLnR6KHJvdW5kZWRFcG9jaCwgdGhpcy50aW1lem9uZSk7XG4gICAgICB0aGlzLmlzSGlnaGxpZ2h0ZWQgPSB0aGlzLnRpbWVJbnRlcnZhbHMuZmluZEluZGV4KGludGVydmFsID0+IHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxPYmogPSBkYXlqcy50eihgJHtjaG9zZW5EYXRlfSAke2ludGVydmFsfWAsIGBERC1NTS1ZWVlZICR7dGhpcy50aW1lRm9ybWF0fWAsIHRoaXMudGltZXpvbmUpO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWxPYmouaXNTYW1lKHJvdW5kZWRFcG9jaGRheWpzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gcG9wdWxhdGVzIHRoZSBkcm9wZG93biBhY2NvcmRpbmcgdG8gdGhlIGZpcnN0IGludGVydmFsIHJlY2VpdmVkXG4gIHBvcHVsYXRlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy50aW1lSW50ZXJ2YWxzID0gW107XG5cbiAgICAvLyBpZiBwaWNrZXIgaXMgdXNlZCBhcyBhbiBpbmRpdmlkdWFsIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5maXJzdEludGVydmFsKSB7XG4gICAgICAvLyBmaXJzdEludGVydmFsIGlzIGluaXRpYWxpc2VkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCB0aW1lXG4gICAgICAvLyBpZiB0aGUgZGF0ZSBpcyBzYW1lIGFzIHRoZSBjdXJyZW50IGRhdGVcbiAgICAgIGlmIChkYXlqcy50eih0aGlzLmRhdGVBc0Vwb2NoLCB0aGlzLnRpbWV6b25lKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpID09PSBkYXlqcy50eihkYXlqcygpLCB0aGlzLnRpbWV6b25lKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpICYmICF0aGlzLm1pblRpbWUpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCAtIChkYXlqcy50eihkYXlqcygpLCB0aGlzLnRpbWV6b25lKS5taW51dGUoKSAlIHRoaXMuaW50ZXJ2YWwpO1xuICAgICAgICB0aGlzLmZpcnN0SW50ZXJ2YWwgPSBkYXlqcy50eihkYXlqcygpLCB0aGlzLnRpbWV6b25lKS5hZGQob2Zmc2V0LCBcIm1cIikudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgLy8gaWYgbWluaW11bSB0aW1lIHRvIHNob3cgaXMgcHJvdmlkZWRcbiAgICAgIGVsc2UgaWYodGhpcy5taW5UaW1lKXtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCAtIChkYXlqcy50eih0aGlzLm1pblRpbWUsIHRoaXMudGltZXpvbmUpLm1pbnV0ZSgpICUgdGhpcy5pbnRlcnZhbCk7XG4gICAgICAgIHRoaXMuZmlyc3RJbnRlcnZhbCA9IGRheWpzLnR6KHRoaXMubWluVGltZSwgdGhpcy50aW1lem9uZSkuYWRkKG9mZnNldCwgXCJtXCIpLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgdGhlIGZpcnN0SW50ZXJ2YWwgaXMgaW5pdGlhbGlzZWQgYXMgc3RhcnQgb2YgZGF5XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5maXJzdEludGVydmFsID0gZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYodGhpcy5naXZlblRpbWUgJiYgdGhpcy5naXZlblRpbWVGbGFnKXtcbiAgICAgIHRoaXMuZmlyc3RJbnRlcnZhbCA9IGRheWpzLnR6KHRoaXMuZ2l2ZW5UaW1lLCB0aGlzLnRpbWV6b25lKS5zdGFydE9mKCdkJykudmFsdWVPZigpO1xuICAgICAgdGhpcy5naXZlblRpbWVGbGFnID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZUFzU3RyaW5nID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCwgdGhpcy50aW1lem9uZSkuZm9ybWF0KCdERC1NTS1ZWVlZJyk7XG4gICAgY29uc3QgaW50ZXJ2YWxBc1N0cmluZyA9IGRheWpzLnR6KHRoaXMuZmlyc3RJbnRlcnZhbCwgdGhpcy50aW1lem9uZSkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCk7XG4gICAgbGV0IHN0YXJ0ID0gZGF5anMudHooYCR7ZGF0ZUFzU3RyaW5nfSAke2ludGVydmFsQXNTdHJpbmd9YCwgYERELU1NLVlZWVkgJHt0aGlzLnRpbWVGb3JtYXR9YCwgdGhpcy50aW1lem9uZSk7XG4gICAgY29uc3QgZW5kID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCwgdGhpcy50aW1lem9uZSkuZW5kT2YoJ2QnKTtcbiAgICB3aGlsZSAoc3RhcnQudmFsdWVPZigpIDwgZW5kLnZhbHVlT2YoKSkge1xuICAgICAgdGhpcy50aW1lSW50ZXJ2YWxzLnB1c2goc3RhcnQuZm9ybWF0KHRoaXMudGltZUZvcm1hdCkpO1xuICAgICAgc3RhcnQgPSBzdGFydC5hZGQodGhpcy5pbnRlcnZhbCwgXCJtXCIpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBzdGFydCB0aW1lIGlzIGVxdWFsIHRvIHRoZSBpbnRlcnZhbCBqdXN0IGJlZm9yZSBtaWRuaWdodFxuICAgIC8vIGFuZCB0aGUgc3RhcnQgZGF0ZSA9IGVuZCBkYXRlXG4gICAgLy8gcHVzaCAxMTo1OXBtIG9ubHlcbiAgICBpZiAodGhpcy50aW1lSW50ZXJ2YWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jaG9zZW5UaW1lID0gZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSkuZW5kT2YoXCJkXCIpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgdGhpcy50aW1lSW50ZXJ2YWxzLnB1c2goZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSkuZW5kT2YoXCJkXCIpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlKSB0aGlzLnRvb2x0aXBEaXJlY3RpdmUuaGlkZVRvb2xUaXAoKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwidGltZXBpY2tlci1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGhlaWdodDogaGVpZ2h0IH1cIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUnOiBkaXNhYmxlfVwiPlxuICA8aW5wdXRcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgWyhuZ01vZGVsKV09XCJjaG9zZW5UaW1lXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVDaGFuZ2UoY2hvc2VuVGltZSlcIlxuICAgIFtuZ0NsYXNzXT1cInsgaW52YWxpZDogaXNJbnZhbGlkIHx8ICFyYW5nZVZhbGlkaXR5IH1cIlxuICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IGlucHV0V2lkdGggfVwiXG4gICAgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bigpXCJcbiAgICBtaXNUb29sVGlwXG4gICAgW3Nob3dUb29sVGlwXT1cInNob3dUb29sdGlwICYmIChpc0ludmFsaWQgfHwgIXJhbmdlVmFsaWRpdHkpICYmIGRpc3BheVRvb2xUaXBcIlxuICAgIFt0ZXh0XT1cIidJbnZhbGlkIFRpbWUnXCJcbiAgICBbcG9zaXRpb25dPVwiJ3RvcCdcIlxuICAgIFtzaG93T25Ib3Zlcl09XCJmYWxzZVwiXG4gICAgI2lucHV0XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgIGNsYXNzPVwiaDdcIlxuICAvPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25Db250YWluZXIgbGliRHJvcGRvd25TY3JvbGwgbGliVGltZXBpY2tlciBbb3JpZ2luRWxdPVwiaW5wdXRcIiBbb3BlblN0YXR1c109XCJvcGVuU3RhdHVzXCIgKHN0YXR1c0VtaXR0ZXIpPVwiY2xvc2VEcm9wZG93bigpXCI+XG4gICAgPGRpdiAqbmdJZj1cIm9wZW5TdGF0dXNcIiBjbGFzcz1cInRpbWVwaWNrZXItZHJvcGRvd25cIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBkcm9wZG93bldpZHRoIHx8IGlucHV0V2lkdGggfVwiPlxuICAgICAgPHVsICNkcm9wZG93bj5cbiAgICAgICAgPGxpICN0aW1lSW50ZXJ2YWwgKGNsaWNrKT1cIm9uVGltZVNlbGVjdChpbnRlcnZhbClcIiAqbmdGb3I9XCJsZXQgaW50ZXJ2YWwgb2YgdGltZUludGVydmFsczsgaW5kZXggYXMgaVwiIFtuZ0NsYXNzXT1cInsgaGlnaGxpZ2h0OiBpID09PSBpc0hpZ2hsaWdodGVkIH1cIj5cbiAgICAgICAgICB7eyBpbnRlcnZhbCB9fVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpYy11aS1jaGVjay0yNCBzZWxlY3RlZC1pY29uXCIgKm5nSWY9XCJpbnRlcnZhbCA9PT0gY2hvc2VuVGltZVwiPjwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9taXMtY29tcG9uZW50cy90aW1lcGlja2VyL3RpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvdGltZXBpY2tlci90aW1lcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQThELFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQVksTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuTCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVyRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFDbkMsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7O0lDZXBELDBCQUFrRjs7OztJQUZwRixpQ0FBeUo7SUFBdkksNk5BQVMsZ0NBQXNCLEtBQUM7SUFDaEQsWUFDQTtJQUFBLDhGQUE0RTtJQUM5RSxpQkFBSzs7Ozs7SUFIbUcscUZBQWdEO0lBQ3RKLGVBQ0E7SUFEQSw0Q0FDQTtJQUEyQyxjQUErQjtJQUEvQiwwREFBK0I7OztJQUg5RSxBQURGLDhCQUE2RyxrQkFDN0Y7SUFDWixzRkFBeUo7SUFLN0osQUFERSxpQkFBSyxFQUNEOzs7SUFQZ0QsbUdBQXNEO0lBRWhDLGVBQW9CO0lBQXBCLGdEQUFvQjs7O0lBRmhHLGtGQUE2Rzs7O0lBQXZHLDBDQUFrQjs7QURUNUIsS0FBSyxDQUFDLE1BQU0sQ0FB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QUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRSxDQUFDO29IQTlaVSxtQkFBbUI7b0VBQW5CLG1CQUFtQjs7MkJBcUNuQixtQkFBbUI7MkJBQ25CLGdCQUFnQjs7Ozs7Ozs7OztZQ3pEM0IsQUFERiw4QkFBc0csa0JBZ0JsRztZQVRBLEFBSEEsMkpBQWlCLHdCQUFvQixLQUFDLHdIQUc3QixrQkFBYyxLQUFDO1lBTjFCLGlCQWVFO1lBRUYsa0hBQStIO1lBQWxDLDJKQUFpQixtQkFBZSxLQUFDO1lBVWhJLGlCQUFNOzs7WUE1QjZELEFBQWpDLG1FQUFnQyx1REFBbUM7WUFHakcsY0FBd0I7WUFTeEIsQUFEQSxBQURBLEFBREEsQUFIQSxBQURBLEFBRkEsMENBQXdCLGlGQUVnQywwREFDckIsb0dBR2dELHdCQUM1RCxtQkFDTCxzQkFDRztZQU11QixlQUFrQjtZQUFDLEFBQW5CLG1DQUFrQixnQ0FBNEI7OztpRkRFakYsbUJBQW1CO2NBTC9CLFNBQVM7MkJBQ0UsZ0JBQWdCO29CQXdDWSxLQUFLO2tCQUExQyxTQUFTO21CQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFDSixtQkFBbUI7a0JBQWxELFNBQVM7bUJBQUMsbUJBQW1CO1lBQ0QsZ0JBQWdCO2tCQUE1QyxTQUFTO21CQUFDLGdCQUFnQjtZQUdPLGdCQUFnQjtrQkFBakQsWUFBWTttQkFBQyxjQUFjOztrRkF6Q2pCLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCwgdW50cmFja2VkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IElUaW1lIH0gZnJvbSBcIi4vdGltZS5uYW1lc3BhY2VcIjtcbmltcG9ydCB7IFRpbWVwaWNrZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi90aW1lcGlja2VyLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgVG9vbFRpcERpcmVjdGl2ZSB9IGZyb20gXCJtaXMtY3J5c3RhbC1kZXNpZ24tc3lzdGVtL3Rvb2x0aXBcIjtcblxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcbmltcG9ydCBjdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnXG5cbmRheWpzLmV4dGVuZCh1dGMpO1xuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1pcy10aW1lcGlja2VyXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGltZXBpY2tlci5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBDb252ZXJ0IHRvIHNpZ25hbHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgY2hhbmdlIGRldGVjdGlvblxuICBjdXJyVGltZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgY2hvc2VuVGltZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgb3BlblN0YXR1cyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIGlzSGlnaGxpZ2h0ZWQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgaXNJbnZhbGlkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgdGltZUludGVydmFscyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBzaG91bGRTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICB1c2VySW5wdXRGbGFnID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgZ2l2ZW5UaW1lRmxhZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2lnbmFsLWJhc2VkIGlucHV0cyB3aXRoIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgY2xvY2tGb3JtYXQgPSBpbnB1dDxudW1iZXI+KDEyKTtcbiAgdGltZUZvcm1hdCE6IHN0cmluZztcbiAgXG4gIHRpbWV6b25lID0gaW5wdXQ8c3RyaW5nPihcIkFzaWEvS29sa2F0YVwiKTtcbiAgaGVpZ2h0ID0gaW5wdXQ8c3RyaW5nPihcIm1heC1jb250ZW50XCIpO1xuICBpbnB1dFdpZHRoID0gaW5wdXQ8c3RyaW5nPihcIjEwMHB4XCIpO1xuICBkcm9wZG93bldpZHRoID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBpbnRlcnZhbCA9IGlucHV0PG51bWJlcj4oMTUpO1xuICBkYXRlQXNFcG9jaCA9IGlucHV0PG51bWJlcj4oZGF5anMudHooZGF5anMoKSwgXCJBc2lhL0tvbGthdGFcIikudmFsdWVPZigpKTtcbiAgZmlyc3RJbnRlcnZhbCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmFuZ2VWYWxpZGl0eSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICBzaG93VG9vbHRpcCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICBkaXNwYXlUb29sVGlwOiBib29sZWFuID0gdGhpcy5zaG93VG9vbHRpcCgpO1xuICBnaXZlblRpbWUgPSBpbnB1dDxudW1iZXI+KCk7XG4gIG1pblRpbWUgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRyaWdnZXJDaGFuZ2UgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgXG4gIC8vIEludGVybmFsIHN0YXRlIGZvciBjb21wdXRlZCBmaXJzdCBpbnRlcnZhbFxuICBwcml2YXRlIGNvbXB1dGVkRmlyc3RJbnRlcnZhbDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gIFxuICAvLyBTaWduYWwtYmFzZWQgb3V0cHV0IHdpdGggYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICB0aW1lRW1pdHRlciA9IG91dHB1dDxJVGltZT4oKTtcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFRpbWVwaWNrZXJEaXJlY3RpdmUpIHRpbWVwaWNrZXJEaXJlY3RpdmU6IFRpbWVwaWNrZXJEaXJlY3RpdmU7XG4gIEBWaWV3Q2hpbGQoVG9vbFRpcERpcmVjdGl2ZSkgdG9vbHRpcERpcmVjdGl2ZTogVG9vbFRpcERpcmVjdGl2ZTtcblxuICAvLyBnZXRzIGFsbCB0aGUgbGkgZWxlbWVudHMgZnJvbSB0aGUgZHJvcGRvd24gYW5kIHNjcm9sbHMgdG8gdGhlIGhpZ2hsaWdodGVkIGVsZW1lbnRcbiAgQFZpZXdDaGlsZHJlbihcInRpbWVJbnRlcnZhbFwiKSBzZXQgdGltZUludGVydmFsUmVmcyhpbnRlcnZhbHMpIHtcbiAgICBpbnRlcnZhbHMuZm9yRWFjaChpbnRlcnZhbCA9PiB7XG4gICAgICBpZiAoaW50ZXJ2YWwubmF0aXZlRWxlbWVudC5jbGFzc0xpc3RbMF0gPT09IFwiaGlnaGxpZ2h0XCIpIHtcbiAgICAgICAgY29uc3QgaGlnaGxpZ2h0ZWQgPSBpbnRlcnZhbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGhpZ2hsaWdodGVkLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6IFwiY2VudGVyXCIgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKXtcbiAgICAvLyBFZmZlY3QgdG8gaGFuZGxlIHRyaWdnZXJDaGFuZ2UgZnJvbSBwYXJlbnQgY29tcG9uZW50ICh0aW1lcmFuZ2VwaWNrZXIpXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRyaWdnZXJWYWx1ZSA9IHRoaXMudHJpZ2dlckNoYW5nZSgpO1xuICAgICAgY29uc3QgZmlyc3RJbnRlcnZhbFZhbHVlID0gdGhpcy5maXJzdEludGVydmFsKCk7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIG5vdCBkdXJpbmcgdXNlciBpbnB1dCBhbmQgZmlyc3RJbnRlcnZhbCBpcyBwcm92aWRlZFxuICAgICAgaWYgKCF1bnRyYWNrZWQoKCkgPT4gdGhpcy51c2VySW5wdXRGbGFnKCkpICYmIGZpcnN0SW50ZXJ2YWxWYWx1ZSAmJiAhdGhpcy5faXNJbml0aWFsaXppbmcpIHtcbiAgICAgICAgY29uc3QgbmV3VGltZSA9IGRheWpzLnR6KGZpcnN0SW50ZXJ2YWxWYWx1ZSwgdW50cmFja2VkKCgpID0+IHRoaXMudGltZXpvbmUoKSkpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgICBcbiAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgdGhlIHRpbWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAodW50cmFja2VkKCgpID0+IHRoaXMuY2hvc2VuVGltZSgpKSAhPT0gbmV3VGltZSkge1xuICAgICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGRlZmVyIHNpZ25hbCB3cml0ZXMgYW5kIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5UaW1lLnNldChuZXdUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuaXNJbnZhbGlkLnNldCghdGhpcy5jaGVja1RpbWVWYWxpZGl0eShuZXdUaW1lLnRyaW0oKSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDUklUSUNBTCBGSVg6IFJlcG9wdWxhdGUgZHJvcGRvd24gd2hlbiBmaXJzdEludGVydmFsIGNoYW5nZXNcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEcm9wZG93bigpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSBjbG9zZXN0IGludGVydmFsXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb3Nlc3RJbnRlcnZhbChuZXdUaW1lKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRW1pdCB0aGUgdXBkYXRlZCB0aW1lXG4gICAgICAgICAgICBjb25zdCB0aW1lZGF5anMgPSB0aGlzLmdldGRheWpzKG5ld1RpbWUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0VGltZSh7XG4gICAgICAgICAgICAgIHZhbGlkOiAhdGhpcy5pc0ludmFsaWQoKSxcbiAgICAgICAgICAgICAgdGltZTogbmV3VGltZSxcbiAgICAgICAgICAgICAgZXBvY2g6IHRpbWVkYXlqcy52YWx1ZU9mKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gdHJ1ZTtcbiAgICAvLyBFbnN1cmUgdGltZUZvcm1hdCBpcyBzZXQgYmVmb3JlIGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy50aW1lRm9ybWF0ID0gdGhpcy5jbG9ja0Zvcm1hdCgpID09PSAxMiA/IFwiaGg6bW0gYVwiIDogXCJISDptbVwiO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY2hvc2VuVGltZSAtIHVzZSBmaXJzdEludGVydmFsIGZyb20gcGFyZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNhbGN1bGF0ZVxuICAgIGlmICghdGhpcy5naXZlblRpbWUoKSAmJiAhdGhpcy5taW5UaW1lKCkpIHtcbiAgICAgIGxldCBpbml0aWFsVGltZTtcbiAgICAgIFxuICAgICAgLy8gSWYgZmlyc3RJbnRlcnZhbCBpcyBwcm92aWRlZCBieSBwYXJlbnQgKHRpbWVyYW5nZXBpY2tlciksIHVzZSBpdFxuICAgICAgaWYgKHRoaXMuZmlyc3RJbnRlcnZhbCgpKSB7XG4gICAgICAgIGluaXRpYWxUaW1lID0gZGF5anMudHoodGhpcy5maXJzdEludGVydmFsKCksIHRoaXMudGltZXpvbmUoKSkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHZXQgY3VycmVudCB0aW1lIGFuZCByb3VuZCB0byBuZWFyZXN0IGludGVydmFsIHVzaW5nIG9yaWdpbmFsIGxvZ2ljXG4gICAgICAgIGNvbnN0IG5vdyA9IGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSk7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5pbnRlcnZhbCgpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gbm93Lm1pbnV0ZSgpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBpbnRlcnZhbCAtIChtaW51dGVzICUgaW50ZXJ2YWwpO1xuICAgICAgICBcbiAgICAgICAgLy8gUm91bmQgdG8gbmV4dCBpbnRlcnZhbCBpZiB3ZSdyZSBwYXN0IGhhbGZ3YXkgcG9pbnRcbiAgICAgICAgY29uc3Qgcm91bmRlZFRpbWUgPSBvZmZzZXQgPj0gaW50ZXJ2YWwgLyAyIFxuICAgICAgICAgID8gbm93LmFkZChvZmZzZXQsIFwibVwiKS5zZWNvbmQoMCkubWlsbGlzZWNvbmQoMClcbiAgICAgICAgICA6IG5vdy5zdWJ0cmFjdChpbnRlcnZhbCAtIG9mZnNldCwgXCJtXCIpLnNlY29uZCgwKS5taWxsaXNlY29uZCgwKTtcbiAgICAgICAgXG4gICAgICAgIGluaXRpYWxUaW1lID0gcm91bmRlZFRpbWUuZm9ybWF0KHRoaXMudGltZUZvcm1hdCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuY2hvc2VuVGltZS5zZXQoaW5pdGlhbFRpbWUpO1xuICAgICAgXG4gICAgICAvLyBTZXQgdXNlcklucHV0RmxhZyB0byBmYWxzZSB0byBhdm9pZCB2YWxpZGF0aW9uIGlzc3VlcyBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiAgICAgIHRoaXMudXNlcklucHV0RmxhZy5zZXQoZmFsc2UpO1xuICAgICAgXG4gICAgICAvLyBQb3B1bGF0ZSBkcm9wZG93biBmaXJzdCB0byBjb21wdXRlIHRoZSBmaXJzdCBpbnRlcnZhbFxuICAgICAgdGhpcy5wb3B1bGF0ZURyb3Bkb3duKCk7XG4gICAgICBcbiAgICAgIC8vIE5vdyB2YWxpZGF0ZSB3aXRoIHRoZSBjb21wdXRlZCBmaXJzdCBpbnRlcnZhbFxuICAgICAgdGhpcy5pc0ludmFsaWQuc2V0KCF0aGlzLmNoZWNrVGltZVZhbGlkaXR5KHRoaXMuY2hvc2VuVGltZSgpLnRyaW0oKSkpO1xuICAgICAgXG4gICAgICBsZXQgY2hvc2VuVGltZWRheWpzID0gdGhpcy5nZXRkYXlqcyh0aGlzLmNob3NlblRpbWUoKSk7XG4gICAgICAvLyBEZWZlciBlbWlzc2lvbiB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0VGltZSh7XG4gICAgICAgICAgdmFsaWQ6ICF0aGlzLmlzSW52YWxpZCgpLFxuICAgICAgICAgIHRpbWU6IHRoaXMuY2hvc2VuVGltZSgpLFxuICAgICAgICAgIGVwb2NoOiBjaG9zZW5UaW1lZGF5anMudmFsdWVPZigpXG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgICBcbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9zZXN0IGludGVydmFsXG4gICAgICB0aGlzLmNhbGN1bGF0ZUNsb3Nlc3RJbnRlcnZhbCh0aGlzLmNob3NlblRpbWUoKSk7XG4gICAgICBcbiAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdpdmVuVGltZSgpKSB7XG4gICAgICAvLyBXaGVuIGdpdmVuVGltZSBpcyBwcmVzZW50LCB1c2UgdGhlIGdpdmVuIHRpbWUgYXMgdGhlIGluaXRpYWwgdmFsdWVcbiAgICAgIC8vIGJ1dCB0aGUgZHJvcGRvd24gd2lsbCBzdGFydCBmcm9tIDEyOjAwIEFNXG4gICAgICB0aGlzLmNob3NlblRpbWUuc2V0KGRheWpzLnR6KHRoaXMuZ2l2ZW5UaW1lKCksIHRoaXMudGltZXpvbmUoKSkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCkpO1xuICAgICAgdGhpcy51c2VySW5wdXRGbGFnLnNldChmYWxzZSk7XG4gICAgICBcbiAgICAgIC8vIFBvcHVsYXRlIGRyb3Bkb3duIGZpcnN0IHRvIGNvbXB1dGUgdGhlIGZpcnN0IGludGVydmFsXG4gICAgICB0aGlzLnBvcHVsYXRlRHJvcGRvd24oKTtcbiAgICAgIFxuICAgICAgLy8gTm93IHZhbGlkYXRlIHdpdGggdGhlIGNvbXB1dGVkIGZpcnN0IGludGVydmFsXG4gICAgICB0aGlzLmlzSW52YWxpZC5zZXQoIXRoaXMuY2hlY2tUaW1lVmFsaWRpdHkodGhpcy5jaG9zZW5UaW1lKCkudHJpbSgpKSk7XG4gICAgICBcbiAgICAgIGxldCBjaG9zZW5UaW1lZGF5anMgPSB0aGlzLmdldGRheWpzKHRoaXMuY2hvc2VuVGltZSgpKTtcbiAgICAgIC8vIERlZmVyIGVtaXNzaW9uIHRvIGF2b2lkIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRUaW1lKHtcbiAgICAgICAgICB2YWxpZDogIXRoaXMuaXNJbnZhbGlkKCksXG4gICAgICAgICAgdGltZTogdGhpcy5jaG9zZW5UaW1lKCksXG4gICAgICAgICAgZXBvY2g6IGNob3NlblRpbWVkYXlqcy52YWx1ZU9mKClcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIGNsb3Nlc3QgaW50ZXJ2YWxcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvc2VzdEludGVydmFsKHRoaXMuY2hvc2VuVGltZSgpKTtcbiAgICAgIFxuICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWluVGltZSgpKSB7XG4gICAgICAvLyBVc2UgbWluIHRpbWUgZGlyZWN0bHkgLSB0aGlzIG1hdGNoZXMgb3JpZ2luYWwgYmVoYXZpb3JcbiAgICAgIHRoaXMuY2hvc2VuVGltZS5zZXQoZGF5anMudHoodGhpcy5taW5UaW1lKCksIHRoaXMudGltZXpvbmUoKSkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCkpO1xuICAgICAgdGhpcy51c2VySW5wdXRGbGFnLnNldChmYWxzZSk7XG4gICAgICBcbiAgICAgIC8vIFBvcHVsYXRlIGRyb3Bkb3duIGZpcnN0IHRvIGNvbXB1dGUgdGhlIGZpcnN0IGludGVydmFsXG4gICAgICB0aGlzLnBvcHVsYXRlRHJvcGRvd24oKTtcbiAgICAgIFxuICAgICAgLy8gRm9yIG1pblRpbWUsIHZhbGlkYXRpb24gc2hvdWxkIG9ubHkgY2hlY2sgZm9ybWF0LCBub3QgdGltZSBjb21wYXJpc29uXG4gICAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIG9yaWdpbmFsIGxvZ2ljIHdoZXJlIG1pblRpbWUgYnlwYXNzZXMgdGltZSB2YWxpZGF0aW9uXG4gICAgICB0aGlzLmlzSW52YWxpZC5zZXQoIXRoaXMuY2hlY2tUaW1lVmFsaWRpdHkodGhpcy5jaG9zZW5UaW1lKCkudHJpbSgpKSk7XG4gICAgICBcbiAgICAgIGxldCBjaG9zZW5UaW1lZGF5anMgPSB0aGlzLmdldGRheWpzKHRoaXMuY2hvc2VuVGltZSgpKTtcbiAgICAgIC8vIERlZmVyIGVtaXNzaW9uIHRvIGF2b2lkIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRUaW1lKHtcbiAgICAgICAgICB2YWxpZDogIXRoaXMuaXNJbnZhbGlkKCksXG4gICAgICAgICAgdGltZTogdGhpcy5jaG9zZW5UaW1lKCksXG4gICAgICAgICAgZXBvY2g6IGNob3NlblRpbWVkYXlqcy52YWx1ZU9mKClcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIGNsb3Nlc3QgaW50ZXJ2YWxcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvc2VzdEludGVydmFsKHRoaXMuY2hvc2VuVGltZSgpKTtcbiAgICAgIFxuICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuXG4gIGVtaXRUaW1lKGRhdGE6IElUaW1lKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRW1pdHRlci5lbWl0KGRhdGEpO1xuICB9XG5cbiAgLy8gZnVuY3Rpb24gdG8gZ2V0IGRheWpzIG9iamVjdCB3aGVuIHRpbWUgaXMgZ2l2ZW4gaW4gc3RyaW5nXG4gIGdldGRheWpzKHRpbWU6IHN0cmluZyA9ICcwMDowMCcpe1xuICAgIGlmKCF0aW1lIHx8IHR5cGVvZiB0aW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaW1lIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBsZXQgaG91cnM6IG51bWJlcjtcbiAgICBsZXQgbWludXRlczogbnVtYmVyO1xuXG4gICAgaWYodGhpcy5jbG9ja0Zvcm1hdCgpID09PSAyNCkge1xuICAgICAgaG91cnMgPSBwYXJzZUludCh0aW1lLnNwbGl0KCc6JylbMF0pO1xuICAgICAgbWludXRlcyA9IHBhcnNlSW50KHRpbWUuc3BsaXQoJzonKVsxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRpbWVQYXJ0cyA9IHRpbWUuc3BsaXQoJyAnKTtcbiAgICAgIGNvbnN0IEFNX1BNID0gdGltZVBhcnRzPy5bMV07XG4gICAgICBob3VycyA9ICBwYXJzZUludCh0aW1lUGFydHM/LlswXT8uc3BsaXQoJzonKT8uWzBdKTtcbiAgICAgIG1pbnV0ZXMgPSBwYXJzZUludCh0aW1lUGFydHM/LlswXT8uc3BsaXQoJzonKT8uWzFdKTtcblxuICAgICAgaWYoQU1fUE0/LnRvVXBwZXJDYXNlKCkgPT09ICdQTScgJiYgaG91cnMgIT09IDEyKSB7XG4gICAgICAgIGhvdXJzICs9IDEyO1xuICAgICAgfSBlbHNlIGlmKEFNX1BNPy50b1VwcGVyQ2FzZSgpID09PSAnQU0nICYmIGhvdXJzID09PSAxMikge1xuICAgICAgICBob3VycyA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBkYXRlIGZyb20gZGF0ZUFzRXBvY2ggYnV0IHNldCB0aGUgdGltZSB0byB0aGUgcGFyc2VkIGhvdXJzIGFuZCBtaW51dGVzXG4gICAgY29uc3QgYmFzZURhdGUgPSBkYXlqcy50eih0aGlzLmRhdGVBc0Vwb2NoKCksIHRoaXMudGltZXpvbmUoKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYmFzZURhdGUuaG91cihob3VycykubWludXRlKG1pbnV0ZXMpLnNlY29uZCgwKS5taWxsaXNlY29uZCgwKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLmRpc3BheVRvb2xUaXAgPSBmYWxzZTtcbiAgICB0aGlzLnVzZXJJbnB1dEZsYWcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm9wZW5TdGF0dXMuc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy50aW1lcGlja2VyRGlyZWN0aXZlKSB0aGlzLnRpbWVwaWNrZXJEaXJlY3RpdmUuZGVzdHJveU92ZXJsYXkoKTtcbiAgfVxuXG4gIC8vIHRvZ2dsZSB0aW1lcGlja2VyIGRyb3Bkb3duXG4gIG9wZW5Ecm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BheVRvb2xUaXAgPSB0cnVlO1xuICAgIHRoaXMub3BlblN0YXR1cy5zZXQodHJ1ZSk7XG4gIH1cblxuICBjaGVja1RpbWVWYWxpZGl0eSh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBSRTEyID0gL14oKFswXVsxLTldfDFbMC0yXSk6KFswLTVdWzAtOV0pKCApPyhhbXxwbXxBTXxQTSkpJC9pO1xuICAgIGNvbnN0IFJFMjQgPSAvXihbMDFdWzAtOV18MlswLTNdKTpbMC01XVswLTldJC87XG4gICAgY29uc3QgUkUgPSB0aGlzLmNsb2NrRm9ybWF0KCkgPT09IDEyID8gUkUxMiA6IFJFMjQ7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGltZSBmb3JtYXQgaXMgdmFsaWQgZmlyc3RcbiAgICBpZiAoIXRpbWUubWF0Y2goUkUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBwcm9wZXIgdmFsaWRhdGlvbiBsb2dpY1xuICAgIGNvbnN0IHRpbWVkYXlqcyA9IHRoaXMuZ2V0ZGF5anModGltZSk7XG4gICAgbGV0IGZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIE9yaWdpbmFsIGxvZ2ljOiBpZiBtaW5UaW1lLCBnaXZlblRpbWUsIG9yIGZpcnN0SW50ZXJ2YWwgaXMgc3RhcnQgb2YgZGF5LCBvbmx5IGNoZWNrIGZvcm1hdFxuICAgIGlmIChcbiAgICAgIHRoaXMubWluVGltZSgpIHx8IFxuICAgICAgdGhpcy5naXZlblRpbWUoKSB8fFxuICAgICAgKHRoaXMuZmlyc3RJbnRlcnZhbCgpICYmXG4gICAgICBkYXlqcy50eih0aGlzLmZpcnN0SW50ZXJ2YWwoKSwgdGhpcy50aW1lem9uZSgpKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KS52YWx1ZU9mKCkgPT09IGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSkuc3RhcnRPZihcImRheVwiKS5mb3JtYXQodGhpcy50aW1lRm9ybWF0KS52YWx1ZU9mKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICkge1xuICAgICAgLy8gT25seSBjaGVjayBmb3JtYXQgdmFsaWRhdGlvbiwgbm90IHRpbWUgY29tcGFyaXNvblxuICAgICAgZmxhZyA9IHRpbWUubWF0Y2goUkUpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayBhZ2FpbnN0IGN1cnJlbnQgdGltZSBmb3Igbm9ybWFsIGNhc2VzXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSk7XG4gICAgICBjb25zdCB0aW1lRGlmZiA9IHRpbWVkYXlqcy5kaWZmKGN1cnJlbnRUaW1lLCBcIm1cIik7XG4gICAgICBmbGFnID0gdGltZURpZmYgPj0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhZztcbiAgfVxuXG4gIC8vIHVwZGF0ZSBjaG9zZW4gdGltZSBhcyBzb29uIGFzIHRoZSB1c2VyIGNsaWNrcyBvbiBhbiBpbnRlcnZhbFxuICBvblRpbWVTZWxlY3QodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0ludmFsaWQuc2V0KCF0aGlzLmNoZWNrVGltZVZhbGlkaXR5KHRpbWUudHJpbSgpKSk7XG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZCgpKSB7XG4gICAgICB0aGlzLmNob3NlblRpbWUuc2V0KHRpbWUpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVDbG9zZXN0SW50ZXJ2YWwodGhpcy5jaG9zZW5UaW1lKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVkYXlqcyA9IHRoaXMuZ2V0ZGF5anModGltZSk7XG4gICAgdGhpcy5lbWl0VGltZSh7XG4gICAgICB2YWxpZDogIXRoaXMuaXNJbnZhbGlkKCksXG4gICAgICB0aW1lOiB0aW1lLFxuICAgICAgZXBvY2g6IHRpbWVkYXlqcy52YWx1ZU9mKCkgXG4gICAgfSk7XG4gICAgdGhpcy5vcGVuU3RhdHVzLnNldChmYWxzZSk7XG4gICAgaWYgKHRoaXMudGltZXBpY2tlckRpcmVjdGl2ZSkgdGhpcy50aW1lcGlja2VyRGlyZWN0aXZlLmRlc3Ryb3lPdmVybGF5KCk7XG4gIH1cblxuICAvLyBjaGVja3MgdmFsaWRpdHkgb2YgdGltZSBvbiBpbnB1dCBjaGFuZ2UgYW5kIGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgaW50ZXJ2YWxcbiAgb25UaW1lQ2hhbmdlKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNldCB1c2VyIGlucHV0IGZsYWcgdG8gcHJldmVudCBlZmZlY3RzIGZyb20gb3ZlcnJpZGluZ1xuICAgIHRoaXMudXNlcklucHV0RmxhZy5zZXQodHJ1ZSk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHRoZSBjaG9zZW5UaW1lIHNpZ25hbFxuICAgIHRoaXMuY2hvc2VuVGltZS5zZXQodGltZSk7XG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuY2hlY2tUaW1lVmFsaWRpdHkodGltZS50cmltKCkpO1xuICAgIHRoaXMuaXNJbnZhbGlkLnNldCghaXNWYWxpZCk7XG5cbiAgICAvLyBDbGVhciB1c2VyIGlucHV0IGZsYWcgYWZ0ZXIgYSBkZWxheSB0byBhbGxvdyBlZmZlY3RzIHRvIHdvcmsgYWdhaW5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXNlcklucHV0RmxhZy5zZXQoZmFsc2UpO1xuICAgIH0sIDEwMDApOyAvLyAxIHNlY29uZCBkZWxheVxuXG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZCgpKSB7XG4gICAgICB0aGlzLm9wZW5TdGF0dXMuc2V0KGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLnRpbWVwaWNrZXJEaXJlY3RpdmUpIHRoaXMudGltZXBpY2tlckRpcmVjdGl2ZS5kZXN0cm95T3ZlcmxheSgpO1xuICAgICAgdGhpcy5jYWxjdWxhdGVDbG9zZXN0SW50ZXJ2YWwodGltZSk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVkYXlqcyA9IHRoaXMuZ2V0ZGF5anModGltZSk7XG4gICAgdGhpcy5lbWl0VGltZSh7XG4gICAgICB2YWxpZDogIXRoaXMuaXNJbnZhbGlkKCksXG4gICAgICB0aW1lOiB0aW1lLFxuICAgICAgZXBvY2g6IHRpbWVkYXlqcy52YWx1ZU9mKCkgXG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVDbG9zZXN0SW50ZXJ2YWwodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHJvdW5kZWRFcG9jaDogbnVtYmVyO1xuICAgIC8vIENvbnZlcnRpbmcgdGltZSBhbmQgZGF0ZSB0byBhIGRheWpzIG9iamVjdCBcbiAgICBjb25zdCBjaG9zZW5EYXRlID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCgpLCB0aGlzLnRpbWV6b25lKCkpLmZvcm1hdChcIkRELU1NLVlZWVlcIik7IC8vIDA1LTAxLTIwMjRcbiAgICBjb25zdCBwYXJzZWRUaW1lV2l0aERhdGUgPSBkYXlqcy50eihgJHtjaG9zZW5EYXRlfSAke3RpbWV9YCwgYERELU1NLVlZWVkgJHt0aGlzLnRpbWVGb3JtYXR9YCwgdGhpcy50aW1lem9uZSgpKTtcbiAgICAvLyBDb252ZXJ0aW5nIGRheWpzIG9iamVjdCB0byBlcG9jaFxuICAgIGNvbnN0IGNob3NlblRpbWVFcG9jaCA9IHBhcnNlZFRpbWVXaXRoRGF0ZS52YWx1ZU9mKCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCgpIC0gKGRheWpzLnR6KGNob3NlblRpbWVFcG9jaCwgdGhpcy50aW1lem9uZSgpKS5taW51dGUoKSAlIHRoaXMuaW50ZXJ2YWwoKSk7XG5cbiAgICBpZiAodGhpcy5taW5UaW1lKCkgJiYgIXRoaXMuZ2l2ZW5UaW1lKCkpIHtcbiAgICAgIHRoaXMuaXNIaWdobGlnaHRlZC5zZXQoMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvdW5kZWRFcG9jaCA9IG9mZnNldCA+PSB0aGlzLmludGVydmFsKCkgLyAyID8gKGRheWpzLnR6KGNob3NlblRpbWVFcG9jaCwgdGhpcy50aW1lem9uZSgpKS5zdWJ0cmFjdCh0aGlzLmludGVydmFsKCkgLSBvZmZzZXQsIFwibVwiKSkudmFsdWVPZigpIDogKGRheWpzLnR6KGNob3NlblRpbWVFcG9jaCwgdGhpcy50aW1lem9uZSgpKS5hZGQoIG9mZnNldCwgXCJtXCIpKS52YWx1ZU9mKCk7XG5cbiAgICAvLyBmaW5kaW5nIHRoZSBpbmRleCBvZiBlbGVtZW50IHRoYXQgbmVlZHMgdG8gYmUgaGlnaGxpZ2h0ZWRcbiAgICBpZiAoIGNob3NlblRpbWVFcG9jaCA+IGRheWpzLnR6KHRoaXMuZGF0ZUFzRXBvY2goKSwgdGhpcy50aW1lem9uZSgpKS5lbmRPZihcImRheVwiKS5zdWJ0cmFjdCh0aGlzLmludGVydmFsKCksIFwibVwiKS52YWx1ZU9mKCkpIHtcbiAgICAgIHRoaXMuaXNIaWdobGlnaHRlZC5zZXQodGhpcy50aW1lSW50ZXJ2YWxzKCkubGVuZ3RoIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvdW5kZWRFcG9jaGRheWpzID0gZGF5anMudHoocm91bmRlZEVwb2NoLCB0aGlzLnRpbWV6b25lKCkpO1xuICAgICAgdGhpcy5pc0hpZ2hsaWdodGVkLnNldCh0aGlzLnRpbWVJbnRlcnZhbHMoKS5maW5kSW5kZXgoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBjb25zdCBpbnRlcnZhbE9iaiA9IGRheWpzLnR6KGAke2Nob3NlbkRhdGV9ICR7aW50ZXJ2YWx9YCwgYERELU1NLVlZWVkgJHt0aGlzLnRpbWVGb3JtYXR9YCwgdGhpcy50aW1lem9uZSgpKTtcbiAgICAgICAgcmV0dXJuIGludGVydmFsT2JqLmlzU2FtZShyb3VuZGVkRXBvY2hkYXlqcyk7XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cblxuICAvLyBwb3B1bGF0ZXMgdGhlIGRyb3Bkb3duIGFjY29yZGluZyB0byB0aGUgZmlyc3QgaW50ZXJ2YWwgcmVjZWl2ZWRcbiAgcG9wdWxhdGVEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVJbnRlcnZhbHMuc2V0KFtdKTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGVmZmVjdGl2ZSBmaXJzdCBpbnRlcnZhbFxuICAgIGxldCBlZmZlY3RpdmVGaXJzdEludGVydmFsID0gdGhpcy5maXJzdEludGVydmFsKCk7XG5cbiAgICAvLyBpZiBwaWNrZXIgaXMgdXNlZCBhcyBhbiBpbmRpdmlkdWFsIGNvbXBvbmVudFxuICAgIGlmICghZWZmZWN0aXZlRmlyc3RJbnRlcnZhbCkge1xuICAgICAgLy8gZmlyc3RJbnRlcnZhbCBpcyBpbml0aWFsaXNlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdGltZVxuICAgICAgLy8gaWYgdGhlIGRhdGUgaXMgc2FtZSBhcyB0aGUgY3VycmVudCBkYXRlXG4gICAgICBpZiAoZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCgpLCB0aGlzLnRpbWV6b25lKCkpLmZvcm1hdChcIkRELU1NLVlZWVlcIikgPT09IGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSkuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSAmJiAhdGhpcy5taW5UaW1lKCkpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCgpIC0gKGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSkubWludXRlKCkgJSB0aGlzLmludGVydmFsKCkpO1xuICAgICAgICBlZmZlY3RpdmVGaXJzdEludGVydmFsID0gZGF5anMudHooZGF5anMoKSwgdGhpcy50aW1lem9uZSgpKS5hZGQob2Zmc2V0LCBcIm1cIikudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgLy8gaWYgbWluaW11bSB0aW1lIHRvIHNob3cgaXMgcHJvdmlkZWRcbiAgICAgIGVsc2UgaWYodGhpcy5taW5UaW1lKCkpe1xuICAgICAgICBjb25zdCBtaW5UaW1lRGF5anMgPSBkYXlqcy50eih0aGlzLm1pblRpbWUoKSwgdGhpcy50aW1lem9uZSgpKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnRlcnZhbCgpIC0gKG1pblRpbWVEYXlqcy5taW51dGUoKSAlIHRoaXMuaW50ZXJ2YWwoKSk7XG4gICAgICAgIGVmZmVjdGl2ZUZpcnN0SW50ZXJ2YWwgPSBtaW5UaW1lRGF5anMuYWRkKG9mZnNldCwgXCJtXCIpLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgdGhlIGZpcnN0SW50ZXJ2YWwgaXMgaW5pdGlhbGlzZWQgYXMgc3RhcnQgb2YgZGF5XG4gICAgICBlbHNlIHtcbiAgICAgICAgZWZmZWN0aXZlRmlyc3RJbnRlcnZhbCA9IGRheWpzLnR6KGRheWpzKCksIHRoaXMudGltZXpvbmUoKSkuc3RhcnRPZihcImRheVwiKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYodGhpcy5naXZlblRpbWUoKSl7XG4gICAgICAvLyBXaGVuIGdpdmVuVGltZSBpcyBwcmVzZW50LCBhbHdheXMgc3RhcnQgZnJvbSAxMjowMCBBTSAoc3RhcnQgb2YgZGF5KVxuICAgICAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB0aW1lIGhhcyBwYXNzZWQgb3Igbm90XG4gICAgICBlZmZlY3RpdmVGaXJzdEludGVydmFsID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCgpLCB0aGlzLnRpbWV6b25lKCkpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcbiAgICAgIHRoaXMuZ2l2ZW5UaW1lRmxhZy5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSBjb21wdXRlZCBmaXJzdCBpbnRlcnZhbCBmb3IgbGF0ZXIgdXNlXG4gICAgdGhpcy5jb21wdXRlZEZpcnN0SW50ZXJ2YWwgPSBlZmZlY3RpdmVGaXJzdEludGVydmFsO1xuXG4gICAgY29uc3QgZGF0ZUFzU3RyaW5nID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCgpLCB0aGlzLnRpbWV6b25lKCkpLmZvcm1hdCgnREQtTU0tWVlZWScpO1xuICAgIGNvbnN0IGludGVydmFsQXNTdHJpbmcgPSBkYXlqcy50eihlZmZlY3RpdmVGaXJzdEludGVydmFsLCB0aGlzLnRpbWV6b25lKCkpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpO1xuICAgIGxldCBzdGFydCA9IGRheWpzLnR6KGAke2RhdGVBc1N0cmluZ30gJHtpbnRlcnZhbEFzU3RyaW5nfWAsIGBERC1NTS1ZWVlZICR7dGhpcy50aW1lRm9ybWF0fWAsIHRoaXMudGltZXpvbmUoKSk7XG4gICAgY29uc3QgZW5kID0gZGF5anMudHoodGhpcy5kYXRlQXNFcG9jaCgpLCB0aGlzLnRpbWV6b25lKCkpLmVuZE9mKCdkJyk7XG4gICAgXG4gICAgd2hpbGUgKHN0YXJ0LnZhbHVlT2YoKSA8IGVuZC52YWx1ZU9mKCkpIHtcbiAgICAgIHRoaXMudGltZUludGVydmFscy51cGRhdGUoaW50ZXJ2YWxzID0+IFsuLi5pbnRlcnZhbHMsIHN0YXJ0LmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpXSk7XG4gICAgICBzdGFydCA9IHN0YXJ0LmFkZCh0aGlzLmludGVydmFsKCksIFwibVwiKTtcbiAgICB9XG5cbiAgICAvLyBORVc6IEhhbmRsZSBlbmQtb2YtZGF5IGNhc2UgLSBpZiBmaXJzdEludGVydmFsIGlzIGF0IG9yIHZlcnkgY2xvc2UgdG8gZW5kIG9mIGRheVxuICAgIC8vIGFuZCB3ZSdyZSBvbiB0aGUgc2FtZSBkYXRlLCBzaG93IG9ubHkgMTE6NTkgUE1cbiAgICBjb25zdCBlbmRPZkRheSA9IGRheWpzLnR6KHRoaXMuZGF0ZUFzRXBvY2goKSwgdGhpcy50aW1lem9uZSgpKS5lbmRPZihcImRcIik7XG4gICAgY29uc3QgZmlyc3RJbnRlcnZhbERheWpzID0gZGF5anMudHooZWZmZWN0aXZlRmlyc3RJbnRlcnZhbCwgdGhpcy50aW1lem9uZSgpKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBmaXJzdEludGVydmFsIGlzIGF0IG9yIHZlcnkgY2xvc2UgdG8gZW5kIG9mIGRheSAod2l0aGluIDEgbWludXRlKVxuICAgIGNvbnN0IGlzQXRFbmRPZkRheSA9IGZpcnN0SW50ZXJ2YWxEYXlqcy5pc1NhbWUoZW5kT2ZEYXksICdkYXknKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW50ZXJ2YWxEYXlqcy5kaWZmKGVuZE9mRGF5LCAnbWludXRlJykgPj0gLTE7XG4gICAgXG4gICAgaWYgKGlzQXRFbmRPZkRheSB8fCB0aGlzLnRpbWVJbnRlcnZhbHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIENsZWFyIGV4aXN0aW5nIGludGVydmFscyBhbmQgYWRkIG9ubHkgMTE6NTkgUE1cbiAgICAgIHRoaXMudGltZUludGVydmFscy5zZXQoW10pO1xuICAgICAgdGhpcy50aW1lSW50ZXJ2YWxzLnVwZGF0ZShpbnRlcnZhbHMgPT4gWy4uLmludGVydmFscywgZW5kT2ZEYXkuZm9ybWF0KHRoaXMudGltZUZvcm1hdCldKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlKSB0aGlzLnRvb2x0aXBEaXJlY3RpdmUuaGlkZVRvb2xUaXAoKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwidGltZXBpY2tlci1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGhlaWdodDogaGVpZ2h0KCkgfVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZSc6IGRpc2FibGUoKX1cIj5cbiAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIFtuZ01vZGVsXT1cImNob3NlblRpbWUoKVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCRldmVudClcIlxuICAgIFtuZ0NsYXNzXT1cInsgaW52YWxpZDogaXNJbnZhbGlkKCkgfHwgIXJhbmdlVmFsaWRpdHkoKSB9XCJcbiAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBpbnB1dFdpZHRoKCkgfVwiXG4gICAgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bigpXCJcbiAgICBtaXNUb29sVGlwXG4gICAgW3Nob3dUb29sVGlwXT1cInNob3dUb29sdGlwKCkgJiYgKGlzSW52YWxpZCgpIHx8ICFyYW5nZVZhbGlkaXR5KCkpICYmIGRpc3BheVRvb2xUaXBcIlxuICAgIFt0ZXh0XT1cIidJbnZhbGlkIFRpbWUnXCJcbiAgICBbcG9zaXRpb25dPVwiJ3RvcCdcIlxuICAgIFtzaG93T25Ib3Zlcl09XCJmYWxzZVwiXG4gICAgI2lucHV0XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgIGNsYXNzPVwiaDdcIlxuICAvPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd25Db250YWluZXIgbGliVGltZXBpY2tlciBbb3JpZ2luRWxdPVwiaW5wdXRcIiBbb3BlblN0YXR1c109XCJvcGVuU3RhdHVzKClcIiAoc3RhdHVzRW1pdHRlcik9XCJjbG9zZURyb3Bkb3duKClcIj5cbiAgICA8ZGl2ICpuZ0lmPVwib3BlblN0YXR1cygpXCIgY2xhc3M9XCJ0aW1lcGlja2VyLWRyb3Bkb3duXCIgW25nU3R5bGVdPVwieyB3aWR0aDogZHJvcGRvd25XaWR0aCgpIHx8IGlucHV0V2lkdGgoKSB9XCI+XG4gICAgICA8dWwgI2Ryb3Bkb3duPlxuICAgICAgICA8bGkgI3RpbWVJbnRlcnZhbCAoY2xpY2spPVwib25UaW1lU2VsZWN0KGludGVydmFsKVwiICpuZ0Zvcj1cImxldCBpbnRlcnZhbCBvZiB0aW1lSW50ZXJ2YWxzKCk7IGluZGV4IGFzIGlcIiBbbmdDbGFzc109XCJ7IGhpZ2hsaWdodDogaSA9PT0gaXNIaWdobGlnaHRlZCgpIH1cIj5cbiAgICAgICAgICB7eyBpbnRlcnZhbCB9fVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpYy11aS1jaGVjay0yNCBzZWxlY3RlZC1pY29uXCIgKm5nSWY9XCJpbnRlcnZhbCA9PT0gY2hvc2VuVGltZSgpXCI+PC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=