nxt-pick-datetime 10.0.0 → 13.0.0

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 (124) hide show
  1. package/{esm2015/lib/class/date-time-adapter.class.js → esm2020/lib/class/date-time-adapter.class.mjs} +0 -0
  2. package/{esm2015/lib/class/date-time-format.class.js → esm2020/lib/class/date-time-format.class.mjs} +1 -1
  3. package/esm2020/lib/class/date-time.class.mjs +161 -0
  4. package/{esm2015/lib/class/dialog-config.class.js → esm2020/lib/class/dialog-config.class.mjs} +0 -0
  5. package/esm2020/lib/class/dialog-ref.class.mjs +121 -0
  6. package/esm2020/lib/date-time/calendar/calendar.component.mjs +345 -0
  7. package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +145 -0
  8. package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +438 -0
  9. package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
  10. package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +369 -0
  11. package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +264 -0
  12. package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +529 -0
  13. package/{esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.animations.js → esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs} +1 -1
  14. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
  15. package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +624 -0
  16. package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +61 -0
  17. package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +68 -0
  18. package/esm2020/lib/date-time/date-time.module.mjs +88 -0
  19. package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +25 -0
  20. package/esm2020/lib/date-time/timer/timer.component.mjs +292 -0
  21. package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +88 -0
  22. package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +243 -0
  23. package/esm2020/lib/dialog/dialog.module.mjs +34 -0
  24. package/esm2020/lib/dialog/dialog.service.mjs +240 -0
  25. package/{esm2015/lib/utils/object.js → esm2020/lib/utils/object.mjs} +0 -0
  26. package/esm2020/moment-adapter/date-time-adapter.class.mjs +215 -0
  27. package/{esm2015/moment-adapter/date-time-format.class.js → esm2020/moment-adapter/date-time-format.class.mjs} +0 -0
  28. package/esm2020/moment-adapter/moment-adapter.module.mjs +41 -0
  29. package/esm2020/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +5 -0
  30. package/{esm2015/moment-adapter/public-api.js → esm2020/moment-adapter/public-api.mjs} +0 -0
  31. package/esm2020/native-adapter/date-time-adapter.class.mjs +344 -0
  32. package/{esm2015/native-adapter/date-time-format.class.js → esm2020/native-adapter/date-time-format.class.mjs} +0 -0
  33. package/esm2020/native-adapter/native-adapter.module.mjs +35 -0
  34. package/esm2020/native-adapter/nxt-pick-datetime-native-adapter.mjs +5 -0
  35. package/{esm2015/native-adapter/public-api.js → esm2020/native-adapter/public-api.mjs} +0 -0
  36. package/esm2020/nxt-pick-datetime.mjs +5 -0
  37. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  38. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +269 -0
  39. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
  40. package/fesm2015/{nxt-pick-datetime-native-adapter.js → nxt-pick-datetime-native-adapter.mjs} +41 -27
  41. package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +1 -0
  42. package/fesm2015/nxt-pick-datetime.mjs +4974 -0
  43. package/fesm2015/nxt-pick-datetime.mjs.map +1 -0
  44. package/{fesm2015/nxt-pick-datetime-moment-adapter.js → fesm2020/nxt-pick-datetime-moment-adapter.mjs} +48 -27
  45. package/fesm2020/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
  46. package/fesm2020/nxt-pick-datetime-native-adapter.mjs +390 -0
  47. package/fesm2020/nxt-pick-datetime-native-adapter.mjs.map +1 -0
  48. package/{fesm2015/nxt-pick-datetime.js → fesm2020/nxt-pick-datetime.mjs} +2207 -1967
  49. package/fesm2020/nxt-pick-datetime.mjs.map +1 -0
  50. package/lib/class/date-time.class.d.ts +3 -0
  51. package/lib/class/dialog-ref.class.d.ts +2 -0
  52. package/lib/date-time/calendar/calendar.component.d.ts +3 -0
  53. package/lib/date-time/calendar-body/calendar-body.component.d.ts +3 -0
  54. package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +3 -0
  55. package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +3 -0
  56. package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +3 -0
  57. package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +3 -0
  58. package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +3 -0
  59. package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +3 -0
  60. package/lib/date-time/date-time-picker-input.directive.d.ts +3 -0
  61. package/lib/date-time/date-time-picker-intl.service.d.ts +3 -0
  62. package/lib/date-time/date-time-picker-trigger.directive.d.ts +3 -0
  63. package/lib/date-time/date-time.module.d.ts +21 -0
  64. package/lib/date-time/number-fixed-len.pipe.d.ts +3 -0
  65. package/lib/date-time/timer/timer.component.d.ts +3 -0
  66. package/lib/date-time/timer-box/timer-box.component.d.ts +3 -0
  67. package/lib/dialog/dialog-container/dialog-container.component.d.ts +5 -2
  68. package/lib/dialog/dialog.module.d.ts +9 -0
  69. package/lib/dialog/dialog.service.d.ts +6 -2
  70. package/moment-adapter/date-time-adapter.class.d.ts +3 -0
  71. package/moment-adapter/moment-adapter.module.d.ts +7 -0
  72. package/moment-adapter/nxt-pick-datetime-moment-adapter.d.ts +1 -3
  73. package/moment-adapter/package.json +6 -7
  74. package/native-adapter/date-time-adapter.class.d.ts +3 -0
  75. package/native-adapter/native-adapter.module.d.ts +8 -0
  76. package/native-adapter/nxt-pick-datetime-native-adapter.d.ts +1 -3
  77. package/native-adapter/package.json +6 -7
  78. package/nxt-pick-datetime.d.ts +1 -14
  79. package/package.json +48 -13
  80. package/bundles/nxt-pick-datetime-moment-adapter.umd.js +0 -577
  81. package/bundles/nxt-pick-datetime-moment-adapter.umd.js.map +0 -1
  82. package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js +0 -17
  83. package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js.map +0 -1
  84. package/bundles/nxt-pick-datetime-native-adapter.umd.js +0 -706
  85. package/bundles/nxt-pick-datetime-native-adapter.umd.js.map +0 -1
  86. package/bundles/nxt-pick-datetime-native-adapter.umd.min.js +0 -16
  87. package/bundles/nxt-pick-datetime-native-adapter.umd.min.js.map +0 -1
  88. package/bundles/nxt-pick-datetime.umd.js +0 -5809
  89. package/bundles/nxt-pick-datetime.umd.js.map +0 -1
  90. package/bundles/nxt-pick-datetime.umd.min.js +0 -17
  91. package/bundles/nxt-pick-datetime.umd.min.js.map +0 -1
  92. package/esm2015/lib/class/date-time.class.js +0 -151
  93. package/esm2015/lib/class/dialog-ref.class.js +0 -113
  94. package/esm2015/lib/date-time/calendar/calendar.component.js +0 -331
  95. package/esm2015/lib/date-time/calendar-body/calendar-body.component.js +0 -144
  96. package/esm2015/lib/date-time/calendar-month-view/calendar-month-view.component.js +0 -425
  97. package/esm2015/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.js +0 -347
  98. package/esm2015/lib/date-time/calendar-year-view/calendar-year-view.component.js +0 -356
  99. package/esm2015/lib/date-time/date-time-inline/date-time-inline.component.js +0 -246
  100. package/esm2015/lib/date-time/date-time-picker/date-time-picker.component.js +0 -511
  101. package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.component.js +0 -373
  102. package/esm2015/lib/date-time/date-time-picker-input.directive.js +0 -592
  103. package/esm2015/lib/date-time/date-time-picker-intl.service.js +0 -59
  104. package/esm2015/lib/date-time/date-time-picker-trigger.directive.js +0 -63
  105. package/esm2015/lib/date-time/date-time.module.js +0 -60
  106. package/esm2015/lib/date-time/number-fixed-len.pipe.js +0 -21
  107. package/esm2015/lib/date-time/timer/timer.component.js +0 -287
  108. package/esm2015/lib/date-time/timer-box/timer-box.component.js +0 -77
  109. package/esm2015/lib/dialog/dialog-container/dialog-container.component.js +0 -202
  110. package/esm2015/lib/dialog/dialog.module.js +0 -26
  111. package/esm2015/lib/dialog/dialog.service.js +0 -225
  112. package/esm2015/moment-adapter/date-time-adapter.class.js +0 -206
  113. package/esm2015/moment-adapter/moment-adapter.module.js +0 -28
  114. package/esm2015/moment-adapter/nxt-pick-datetime-moment-adapter.js +0 -8
  115. package/esm2015/native-adapter/date-time-adapter.class.js +0 -342
  116. package/esm2015/native-adapter/native-adapter.module.js +0 -26
  117. package/esm2015/native-adapter/nxt-pick-datetime-native-adapter.js +0 -8
  118. package/esm2015/nxt-pick-datetime.js +0 -19
  119. package/fesm2015/nxt-pick-datetime-moment-adapter.js.map +0 -1
  120. package/fesm2015/nxt-pick-datetime-native-adapter.js.map +0 -1
  121. package/fesm2015/nxt-pick-datetime.js.map +0 -1
  122. package/moment-adapter/nxt-pick-datetime-moment-adapter.metadata.json +0 -1
  123. package/native-adapter/nxt-pick-datetime-native-adapter.metadata.json +0 -1
  124. package/nxt-pick-datetime.metadata.json +0 -1
@@ -1,592 +0,0 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { DOWN_ARROW } from '@angular/cdk/keycodes';
3
- import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Optional, Output, Renderer2 } from '@angular/core';
4
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
5
- import { Subscription } from 'rxjs';
6
- import { DateTimeAdapter } from '../class/date-time-adapter.class';
7
- import { OWL_DATE_TIME_FORMATS } from '../class/date-time-format.class';
8
- import { OwlDateTimeComponent } from './date-time-picker/date-time-picker.component';
9
- export const OWL_DATETIME_VALUE_ACCESSOR = {
10
- provide: NG_VALUE_ACCESSOR,
11
- useExisting: forwardRef(() => OwlDateTimeInputDirective),
12
- multi: true
13
- };
14
- export const OWL_DATETIME_VALIDATORS = {
15
- provide: NG_VALIDATORS,
16
- useExisting: forwardRef(() => OwlDateTimeInputDirective),
17
- multi: true
18
- };
19
- export class OwlDateTimeInputDirective {
20
- constructor(elmRef, renderer, dateTimeAdapter, dateTimeFormats) {
21
- this.elmRef = elmRef;
22
- this.renderer = renderer;
23
- this.dateTimeAdapter = dateTimeAdapter;
24
- this.dateTimeFormats = dateTimeFormats;
25
- /**
26
- * The picker's select mode
27
- */
28
- this._selectMode = 'single';
29
- /**
30
- * The character to separate the 'from' and 'to' in input value
31
- */
32
- this.rangeSeparator = '~';
33
- this._values = [];
34
- /**
35
- * Callback to invoke when `change` event is fired on this `<input>`
36
- * */
37
- this.dateTimeChange = new EventEmitter();
38
- /**
39
- * Callback to invoke when an `input` event is fired on this `<input>`.
40
- * */
41
- this.dateTimeInput = new EventEmitter();
42
- this.dtPickerSub = Subscription.EMPTY;
43
- this.localeSub = Subscription.EMPTY;
44
- this.lastValueValid = true;
45
- this.onModelChange = () => { };
46
- this.onModelTouched = () => { };
47
- this.validatorOnChange = () => { };
48
- /** The form control validator for whether the input parses. */
49
- this.parseValidator = () => {
50
- return this.lastValueValid
51
- ? null
52
- : { owlDateTimeParse: { text: this.elmRef.nativeElement.value } };
53
- };
54
- /** The form control validator for the min date. */
55
- this.minValidator = (control) => {
56
- if (this.isInSingleMode) {
57
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
58
- return !this.min ||
59
- !controlValue ||
60
- this.dateTimeAdapter.compare(this.min, controlValue) <= 0
61
- ? null
62
- : { owlDateTimeMin: { min: this.min, actual: controlValue } };
63
- }
64
- else if (this.isInRangeMode && control.value) {
65
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
66
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
67
- return !this.min ||
68
- !controlValueFrom ||
69
- !controlValueTo ||
70
- this.dateTimeAdapter.compare(this.min, controlValueFrom) <= 0
71
- ? null
72
- : {
73
- owlDateTimeMin: {
74
- min: this.min,
75
- actual: [controlValueFrom, controlValueTo]
76
- }
77
- };
78
- }
79
- };
80
- /** The form control validator for the max date. */
81
- this.maxValidator = (control) => {
82
- if (this.isInSingleMode) {
83
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
84
- return !this.max ||
85
- !controlValue ||
86
- this.dateTimeAdapter.compare(this.max, controlValue) >= 0
87
- ? null
88
- : { owlDateTimeMax: { max: this.max, actual: controlValue } };
89
- }
90
- else if (this.isInRangeMode && control.value) {
91
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
92
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
93
- return !this.max ||
94
- !controlValueFrom ||
95
- !controlValueTo ||
96
- this.dateTimeAdapter.compare(this.max, controlValueTo) >= 0
97
- ? null
98
- : {
99
- owlDateTimeMax: {
100
- max: this.max,
101
- actual: [controlValueFrom, controlValueTo]
102
- }
103
- };
104
- }
105
- };
106
- /** The form control validator for the date filter. */
107
- this.filterValidator = (control) => {
108
- const controlValue = this.getValidDate(this.dateTimeAdapter.deserialize(control.value));
109
- return !this._dateTimeFilter ||
110
- !controlValue ||
111
- this._dateTimeFilter(controlValue)
112
- ? null
113
- : { owlDateTimeFilter: true };
114
- };
115
- /**
116
- * The form control validator for the range.
117
- * Check whether the 'before' value is before the 'to' value
118
- * */
119
- this.rangeValidator = (control) => {
120
- if (this.isInSingleMode || !control.value) {
121
- return null;
122
- }
123
- const controlValueFrom = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[0]));
124
- const controlValueTo = this.getValidDate(this.dateTimeAdapter.deserialize(control.value[1]));
125
- return !controlValueFrom ||
126
- !controlValueTo ||
127
- this.dateTimeAdapter.compare(controlValueFrom, controlValueTo) <= 0
128
- ? null
129
- : { owlDateTimeRange: true };
130
- };
131
- /** The combined form control validator for this input. */
132
- this.validator = Validators.compose([
133
- this.parseValidator,
134
- this.minValidator,
135
- this.maxValidator,
136
- this.filterValidator,
137
- this.rangeValidator
138
- ]);
139
- /** Emits when the value changes (either due to user input or programmatic change). */
140
- this.valueChange = new EventEmitter();
141
- /** Emits when the disabled state has changed */
142
- this.disabledChange = new EventEmitter();
143
- if (!this.dateTimeAdapter) {
144
- throw Error(`OwlDateTimePicker: No provider found for DateTimePicker. You must import one of the following ` +
145
- `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
146
- `custom implementation.`);
147
- }
148
- if (!this.dateTimeFormats) {
149
- throw Error(`OwlDateTimePicker: No provider found for OWL_DATE_TIME_FORMATS. You must import one of the following ` +
150
- `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
151
- `custom implementation.`);
152
- }
153
- this.localeSub = this.dateTimeAdapter.localeChanges.subscribe(() => {
154
- this.value = this.value;
155
- });
156
- }
157
- /**
158
- * The date time picker that this input is associated with.
159
- * */
160
- set owlDateTime(value) {
161
- this.registerDateTimePicker(value);
162
- }
163
- /**
164
- * A function to filter date time
165
- */
166
- set owlDateTimeFilter(filter) {
167
- this._dateTimeFilter = filter;
168
- this.validatorOnChange();
169
- }
170
- get dateTimeFilter() {
171
- return this._dateTimeFilter;
172
- }
173
- get disabled() {
174
- return !!this._disabled;
175
- }
176
- set disabled(value) {
177
- const newValue = coerceBooleanProperty(value);
178
- const element = this.elmRef.nativeElement;
179
- if (this._disabled !== newValue) {
180
- this._disabled = newValue;
181
- this.disabledChange.emit(newValue);
182
- }
183
- // We need to null check the `blur` method, because it's undefined during SSR.
184
- if (newValue && element.blur) {
185
- // Normally, native input elements automatically blur if they turn disabled. This behavior
186
- // is problematic, because it would mean that it triggers another change detection cycle,
187
- // which then causes a changed after checked error if the input element was focused before.
188
- element.blur();
189
- }
190
- }
191
- get min() {
192
- return this._min;
193
- }
194
- set min(value) {
195
- this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
196
- this.validatorOnChange();
197
- }
198
- get max() {
199
- return this._max;
200
- }
201
- set max(value) {
202
- this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
203
- this.validatorOnChange();
204
- }
205
- get selectMode() {
206
- return this._selectMode;
207
- }
208
- set selectMode(mode) {
209
- if (mode !== 'single' &&
210
- mode !== 'range' &&
211
- mode !== 'rangeFrom' &&
212
- mode !== 'rangeTo') {
213
- throw Error('OwlDateTime Error: invalid selectMode value!');
214
- }
215
- this._selectMode = mode;
216
- }
217
- get value() {
218
- return this._value;
219
- }
220
- set value(value) {
221
- value = this.dateTimeAdapter.deserialize(value);
222
- this.lastValueValid = !value || this.dateTimeAdapter.isValid(value);
223
- value = this.getValidDate(value);
224
- const oldDate = this._value;
225
- this._value = value;
226
- // set the input property 'value'
227
- this.formatNativeInputValue();
228
- // check if the input value changed
229
- if (!this.dateTimeAdapter.isEqual(oldDate, value)) {
230
- this.valueChange.emit(value);
231
- }
232
- }
233
- get values() {
234
- return this._values;
235
- }
236
- set values(values) {
237
- if (values && values.length > 0) {
238
- this._values = values.map(v => {
239
- v = this.dateTimeAdapter.deserialize(v);
240
- return this.getValidDate(v);
241
- });
242
- this.lastValueValid =
243
- (!this._values[0] ||
244
- this.dateTimeAdapter.isValid(this._values[0])) &&
245
- (!this._values[1] ||
246
- this.dateTimeAdapter.isValid(this._values[1]));
247
- }
248
- else {
249
- this._values = [];
250
- this.lastValueValid = true;
251
- }
252
- // set the input property 'value'
253
- this.formatNativeInputValue();
254
- this.valueChange.emit(this._values);
255
- }
256
- get elementRef() {
257
- return this.elmRef;
258
- }
259
- get isInSingleMode() {
260
- return this._selectMode === 'single';
261
- }
262
- get isInRangeMode() {
263
- return (this._selectMode === 'range' ||
264
- this._selectMode === 'rangeFrom' ||
265
- this._selectMode === 'rangeTo');
266
- }
267
- get owlDateTimeInputAriaHaspopup() {
268
- return true;
269
- }
270
- get owlDateTimeInputAriaOwns() {
271
- return (this.dtPicker.opened && this.dtPicker.id) || null;
272
- }
273
- get minIso8601() {
274
- return this.min ? this.dateTimeAdapter.toIso8601(this.min) : null;
275
- }
276
- get maxIso8601() {
277
- return this.max ? this.dateTimeAdapter.toIso8601(this.max) : null;
278
- }
279
- get owlDateTimeInputDisabled() {
280
- return this.disabled;
281
- }
282
- ngOnInit() {
283
- if (!this.dtPicker) {
284
- throw Error(`OwlDateTimePicker: the picker input doesn't have any associated owl-date-time component`);
285
- }
286
- }
287
- ngAfterContentInit() {
288
- this.dtPickerSub = this.dtPicker.confirmSelectedChange.subscribe((selecteds) => {
289
- if (Array.isArray(selecteds)) {
290
- this.values = selecteds;
291
- }
292
- else {
293
- this.value = selecteds;
294
- }
295
- this.onModelChange(selecteds);
296
- this.onModelTouched();
297
- this.dateTimeChange.emit({
298
- source: this,
299
- value: selecteds,
300
- input: this.elmRef.nativeElement
301
- });
302
- this.dateTimeInput.emit({
303
- source: this,
304
- value: selecteds,
305
- input: this.elmRef.nativeElement
306
- });
307
- });
308
- }
309
- ngOnDestroy() {
310
- this.dtPickerSub.unsubscribe();
311
- this.localeSub.unsubscribe();
312
- this.valueChange.complete();
313
- this.disabledChange.complete();
314
- }
315
- writeValue(value) {
316
- if (this.isInSingleMode) {
317
- this.value = value;
318
- }
319
- else {
320
- this.values = value;
321
- }
322
- }
323
- registerOnChange(fn) {
324
- this.onModelChange = fn;
325
- }
326
- registerOnTouched(fn) {
327
- this.onModelTouched = fn;
328
- }
329
- setDisabledState(isDisabled) {
330
- this.disabled = isDisabled;
331
- }
332
- validate(c) {
333
- return this.validator ? this.validator(c) : null;
334
- }
335
- registerOnValidatorChange(fn) {
336
- this.validatorOnChange = fn;
337
- }
338
- /**
339
- * Open the picker when user hold alt + DOWN_ARROW
340
- * */
341
- handleKeydownOnHost(event) {
342
- if (event.altKey && event.keyCode === DOWN_ARROW) {
343
- this.dtPicker.open();
344
- event.preventDefault();
345
- }
346
- }
347
- handleBlurOnHost(_event) {
348
- this.onModelTouched();
349
- }
350
- handleInputOnHost(event) {
351
- const value = event.target.value;
352
- if (this._selectMode === 'single') {
353
- this.changeInputInSingleMode(value);
354
- }
355
- else if (this._selectMode === 'range') {
356
- this.changeInputInRangeMode(value);
357
- }
358
- else {
359
- this.changeInputInRangeFromToMode(value);
360
- }
361
- }
362
- handleChangeOnHost(_event) {
363
- let v;
364
- if (this.isInSingleMode) {
365
- v = this.value;
366
- }
367
- else if (this.isInRangeMode) {
368
- v = this.values;
369
- }
370
- this.dateTimeChange.emit({
371
- source: this,
372
- value: v,
373
- input: this.elmRef.nativeElement
374
- });
375
- }
376
- /**
377
- * Set the native input property 'value'
378
- */
379
- formatNativeInputValue() {
380
- if (this.isInSingleMode) {
381
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', this._value
382
- ? this.dateTimeAdapter.format(this._value, this.dtPicker.formatString)
383
- : '');
384
- }
385
- else if (this.isInRangeMode) {
386
- if (this._values && this.values.length > 0) {
387
- const from = this._values[0];
388
- const to = this._values[1];
389
- const fromFormatted = from
390
- ? this.dateTimeAdapter.format(from, this.dtPicker.formatString)
391
- : '';
392
- const toFormatted = to
393
- ? this.dateTimeAdapter.format(to, this.dtPicker.formatString)
394
- : '';
395
- if (!fromFormatted && !toFormatted) {
396
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', null);
397
- }
398
- else {
399
- if (this._selectMode === 'range') {
400
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted +
401
- ' ' +
402
- this.rangeSeparator +
403
- ' ' +
404
- toFormatted);
405
- }
406
- else if (this._selectMode === 'rangeFrom') {
407
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', fromFormatted);
408
- }
409
- else if (this._selectMode === 'rangeTo') {
410
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', toFormatted);
411
- }
412
- }
413
- }
414
- else {
415
- this.renderer.setProperty(this.elmRef.nativeElement, 'value', '');
416
- }
417
- }
418
- return;
419
- }
420
- /**
421
- * Register the relationship between this input and its picker component
422
- */
423
- registerDateTimePicker(picker) {
424
- if (picker) {
425
- this.dtPicker = picker;
426
- this.dtPicker.registerInput(this);
427
- }
428
- }
429
- /**
430
- * Convert a given obj to a valid date object
431
- */
432
- getValidDate(obj) {
433
- return this.dateTimeAdapter.isDateInstance(obj) &&
434
- this.dateTimeAdapter.isValid(obj)
435
- ? obj
436
- : null;
437
- }
438
- /**
439
- * Convert a time string to a date-time string
440
- * When pickerType is 'timer', the value in the picker's input is a time string.
441
- * The dateTimeAdapter parse fn could not parse a time string to a Date Object.
442
- * Therefore we need this fn to convert a time string to a date-time string.
443
- */
444
- convertTimeStringToDateTimeString(timeString, dateTime) {
445
- if (timeString) {
446
- const v = dateTime || this.dateTimeAdapter.now();
447
- const dateString = this.dateTimeAdapter.format(v, this.dateTimeFormats.datePickerInput);
448
- return dateString + ' ' + timeString;
449
- }
450
- else {
451
- return null;
452
- }
453
- }
454
- /**
455
- * Handle input change in single mode
456
- */
457
- changeInputInSingleMode(inputValue) {
458
- let value = inputValue;
459
- if (this.dtPicker.pickerType === 'timer') {
460
- value = this.convertTimeStringToDateTimeString(value, this.value);
461
- }
462
- let result = this.dateTimeAdapter.parse(value, this.dateTimeFormats.parseInput);
463
- this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
464
- result = this.getValidDate(result);
465
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
466
- // result equals to null means there is input event, but the input value is invalid
467
- if (!this.isSameValue(result, this._value) || result === null) {
468
- this._value = result;
469
- this.valueChange.emit(result);
470
- this.onModelChange(result);
471
- this.dateTimeInput.emit({
472
- source: this,
473
- value: result,
474
- input: this.elmRef.nativeElement
475
- });
476
- }
477
- }
478
- /**
479
- * Handle input change in rangeFrom or rangeTo mode
480
- */
481
- changeInputInRangeFromToMode(inputValue) {
482
- const originalValue = this._selectMode === 'rangeFrom'
483
- ? this._values[0]
484
- : this._values[1];
485
- if (this.dtPicker.pickerType === 'timer') {
486
- inputValue = this.convertTimeStringToDateTimeString(inputValue, originalValue);
487
- }
488
- let result = this.dateTimeAdapter.parse(inputValue, this.dateTimeFormats.parseInput);
489
- this.lastValueValid = !result || this.dateTimeAdapter.isValid(result);
490
- result = this.getValidDate(result);
491
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
492
- if ((this._selectMode === 'rangeFrom' &&
493
- this.isSameValue(result, this._values[0]) &&
494
- result) ||
495
- (this._selectMode === 'rangeTo' &&
496
- this.isSameValue(result, this._values[1]) &&
497
- result)) {
498
- return;
499
- }
500
- this._values =
501
- this._selectMode === 'rangeFrom'
502
- ? [result, this._values[1]]
503
- : [this._values[0], result];
504
- this.valueChange.emit(this._values);
505
- this.onModelChange(this._values);
506
- this.dateTimeInput.emit({
507
- source: this,
508
- value: this._values,
509
- input: this.elmRef.nativeElement
510
- });
511
- }
512
- /**
513
- * Handle input change in range mode
514
- */
515
- changeInputInRangeMode(inputValue) {
516
- const selecteds = inputValue.split(this.rangeSeparator);
517
- let fromString = selecteds[0];
518
- let toString = selecteds[1];
519
- if (this.dtPicker.pickerType === 'timer') {
520
- fromString = this.convertTimeStringToDateTimeString(fromString, this.values[0]);
521
- toString = this.convertTimeStringToDateTimeString(toString, this.values[1]);
522
- }
523
- let from = this.dateTimeAdapter.parse(fromString, this.dateTimeFormats.parseInput);
524
- let to = this.dateTimeAdapter.parse(toString, this.dateTimeFormats.parseInput);
525
- this.lastValueValid =
526
- (!from || this.dateTimeAdapter.isValid(from)) &&
527
- (!to || this.dateTimeAdapter.isValid(to));
528
- from = this.getValidDate(from);
529
- to = this.getValidDate(to);
530
- // if the newValue is the same as the oldValue, we intend to not fire the valueChange event
531
- if (!this.isSameValue(from, this._values[0]) ||
532
- !this.isSameValue(to, this._values[1]) ||
533
- (from === null && to === null)) {
534
- this._values = [from, to];
535
- this.valueChange.emit(this._values);
536
- this.onModelChange(this._values);
537
- this.dateTimeInput.emit({
538
- source: this,
539
- value: this._values,
540
- input: this.elmRef.nativeElement
541
- });
542
- }
543
- }
544
- /**
545
- * Check if the two value is the same
546
- */
547
- isSameValue(first, second) {
548
- if (first && second) {
549
- return this.dateTimeAdapter.compare(first, second) === 0;
550
- }
551
- return first == second;
552
- }
553
- }
554
- OwlDateTimeInputDirective.decorators = [
555
- { type: Directive, args: [{
556
- selector: 'input[owlDateTime]',
557
- exportAs: 'owlDateTimeInput',
558
- providers: [
559
- OWL_DATETIME_VALUE_ACCESSOR,
560
- OWL_DATETIME_VALIDATORS
561
- ]
562
- },] }
563
- ];
564
- OwlDateTimeInputDirective.ctorParameters = () => [
565
- { type: ElementRef },
566
- { type: Renderer2 },
567
- { type: DateTimeAdapter, decorators: [{ type: Optional }] },
568
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OWL_DATE_TIME_FORMATS,] }] }
569
- ];
570
- OwlDateTimeInputDirective.propDecorators = {
571
- owlDateTime: [{ type: Input }],
572
- owlDateTimeFilter: [{ type: Input }],
573
- _disabled: [{ type: Input }],
574
- min: [{ type: Input }],
575
- max: [{ type: Input }],
576
- selectMode: [{ type: Input }],
577
- rangeSeparator: [{ type: Input }],
578
- value: [{ type: Input }],
579
- values: [{ type: Input }],
580
- dateTimeChange: [{ type: Output }],
581
- dateTimeInput: [{ type: Output }],
582
- owlDateTimeInputAriaHaspopup: [{ type: HostBinding, args: ['attr.aria-haspopup',] }],
583
- owlDateTimeInputAriaOwns: [{ type: HostBinding, args: ['attr.aria-owns',] }],
584
- minIso8601: [{ type: HostBinding, args: ['attr.min',] }],
585
- maxIso8601: [{ type: HostBinding, args: ['attr.max',] }],
586
- owlDateTimeInputDisabled: [{ type: HostBinding, args: ['disabled',] }],
587
- handleKeydownOnHost: [{ type: HostListener, args: ['keydown', ['$event'],] }],
588
- handleBlurOnHost: [{ type: HostListener, args: ['blur', ['$event'],] }],
589
- handleInputOnHost: [{ type: HostListener, args: ['input', ['$event'],] }],
590
- handleChangeOnHost: [{ type: HostListener, args: ['change', ['$event'],] }]
591
- };
592
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMzTCxPQUFPLEVBQXlDLGFBQWEsRUFBRSxpQkFBaUIsRUFBNEMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDOUosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFDbEUsT0FBTyxFQUFzQixxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRTNGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtDQUErQyxDQUFBO0FBRXBGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFRO0lBQzVDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztJQUN4RCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBUTtJQUN4QyxPQUFPLEVBQUUsYUFBYTtJQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdB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QUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUMzRDtRQUVELE9BQU8sS0FBSyxJQUFJLE1BQU0sQ0FBQTtJQUMxQixDQUFDOzs7WUEvdUJKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixTQUFTLEVBQUU7b0JBQ1AsMkJBQTJCO29CQUMzQix1QkFBdUI7aUJBQzFCO2FBQ0o7OztZQTNCcUMsVUFBVTtZQUEyRyxTQUFTO1lBRzNKLGVBQWUsdUJBeVhmLFFBQVE7NENBQ1IsUUFBUSxZQUFJLE1BQU0sU0FBQyxxQkFBcUI7OzswQkF2VjVDLEtBQUs7Z0NBUUwsS0FBSzt3QkFZTCxLQUFLO2tCQTBCTCxLQUFLO2tCQVlMLEtBQUs7eUJBY0wsS0FBSzs2QkFxQkwsS0FBSztvQkFJTCxLQUFLO3FCQXNCTCxLQUFLOzZCQThCTCxNQUFNOzRCQU1OLE1BQU07MkNBZ0tOLFdBQVcsU0FBQyxvQkFBb0I7dUNBS2hDLFdBQVcsU0FBQyxnQkFBZ0I7eUJBSzVCLFdBQVcsU0FBQyxVQUFVO3lCQUt0QixXQUFXLFNBQUMsVUFBVTt1Q0FLdEIsV0FBVyxTQUFDLFVBQVU7a0NBcUd0QixZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOytCQVFsQyxZQUFZLFNBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dDQUsvQixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2lDQVloQyxZQUFZLFNBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJ1xuaW1wb3J0IHsgRE9XTl9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2RlcydcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vY2xhc3MvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnXG5pbXBvcnQgeyBPd2xEYXRlVGltZUZvcm1hdHMsIE9XTF9EQVRFX1RJTUVfRk9STUFUUyB9IGZyb20gJy4uL2NsYXNzL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnXG5pbXBvcnQgeyBTZWxlY3RNb2RlIH0gZnJvbSAnLi4vY2xhc3MvZGF0ZS10aW1lLmNsYXNzJ1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQnXG5cbmV4cG9ydCBjb25zdCBPV0xfREFURVRJTUVfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPd2xEYXRlVGltZUlucHV0RGlyZWN0aXZlKSxcbiAgICBtdWx0aTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgT1dMX0RBVEVUSU1FX1ZBTElEQVRPUlM6IGFueSA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE93bERhdGVUaW1lSW5wdXREaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG59XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbb3dsRGF0ZVRpbWVdJyxcbiAgICBleHBvcnRBczogJ293bERhdGVUaW1lSW5wdXQnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBPV0xfREFURVRJTUVfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgIE9XTF9EQVRFVElNRV9WQUxJREFUT1JTXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBPd2xEYXRlVGltZUlucHV0RGlyZWN0aXZlPFQ+XG4gICAgaW1wbGVtZW50c1xuICAgIE9uSW5pdCxcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBWYWxpZGF0b3Ige1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRpbWUgcGlja2VyIHRoYXQgdGhpcyBpbnB1dCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgICogKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBvd2xEYXRlVGltZSh2YWx1ZTogT3dsRGF0ZVRpbWVDb21wb25lbnQ8VD4pIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRhdGVUaW1lUGlja2VyKHZhbHVlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdG8gZmlsdGVyIGRhdGUgdGltZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG93bERhdGVUaW1lRmlsdGVyKGZpbHRlcjogKGRhdGU6IFQgfCBudWxsKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RhdGVUaW1lRmlsdGVyID0gZmlsdGVyXG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHByaXZhdGUgX2RhdGVUaW1lRmlsdGVyOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW5cbiAgICBnZXQgZGF0ZVRpbWVGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZUZpbHRlclxuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBkYXRlIHRpbWUgcGlja2VyJ3MgaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhblxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGlzYWJsZWRcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG5cbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENoYW5nZS5lbWl0KG5ld1ZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBudWxsIGNoZWNrIHRoZSBgYmx1cmAgbWV0aG9kLCBiZWNhdXNlIGl0J3MgdW5kZWZpbmVkIGR1cmluZyBTU1IuXG4gICAgICAgIGlmIChuZXdWYWx1ZSAmJiBlbGVtZW50LmJsdXIpIHtcbiAgICAgICAgICAgIC8vIE5vcm1hbGx5LCBuYXRpdmUgaW5wdXQgZWxlbWVudHMgYXV0b21hdGljYWxseSBibHVyIGlmIHRoZXkgdHVybiBkaXNhYmxlZC4gVGhpcyBiZWhhdmlvclxuICAgICAgICAgICAgLy8gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgaXQgd291bGQgbWVhbiB0aGF0IGl0IHRyaWdnZXJzIGFub3RoZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSxcbiAgICAgICAgICAgIC8vIHdoaWNoIHRoZW4gY2F1c2VzIGEgY2hhbmdlZCBhZnRlciBjaGVja2VkIGVycm9yIGlmIHRoZSBpbnB1dCBlbGVtZW50IHdhcyBmb2N1c2VkIGJlZm9yZS5cbiAgICAgICAgICAgIGVsZW1lbnQuYmx1cigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gKi9cbiAgICBwcml2YXRlIF9taW46IFQgfCBudWxsXG4gICAgQElucHV0KClcbiAgICBnZXQgbWluKCk6IFQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblxuICAgIH1cblxuICAgIHNldCBtaW4odmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX21pbiA9IHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSlcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSgpXG4gICAgfVxuXG4gICAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gICAgcHJpdmF0ZSBfbWF4OiBUIHwgbnVsbFxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1heCgpOiBUIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhcbiAgICB9XG5cbiAgICBzZXQgbWF4KHZhbHVlOiBUIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpXG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwaWNrZXIncyBzZWxlY3QgbW9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NlbGVjdE1vZGU6IFNlbGVjdE1vZGUgPSAnc2luZ2xlJ1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlbGVjdE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlXG4gICAgfVxuXG4gICAgc2V0IHNlbGVjdE1vZGUobW9kZTogU2VsZWN0TW9kZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtb2RlICE9PSAnc2luZ2xlJyAmJlxuICAgICAgICAgICAgbW9kZSAhPT0gJ3JhbmdlJyAmJlxuICAgICAgICAgICAgbW9kZSAhPT0gJ3JhbmdlRnJvbScgJiZcbiAgICAgICAgICAgIG1vZGUgIT09ICdyYW5nZVRvJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdPd2xEYXRlVGltZSBFcnJvcjogaW52YWxpZCBzZWxlY3RNb2RlIHZhbHVlIScpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID0gbW9kZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjaGFyYWN0ZXIgdG8gc2VwYXJhdGUgdGhlICdmcm9tJyBhbmQgJ3RvJyBpbiBpbnB1dCB2YWx1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmFuZ2VTZXBhcmF0b3IgPSAnfidcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBUIHwgbnVsbFxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhdmFsdWUgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh2YWx1ZSlcbiAgICAgICAgdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSlcbiAgICAgICAgY29uc3Qgb2xkRGF0ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcblxuICAgICAgICAvLyBzZXQgdGhlIGlucHV0IHByb3BlcnR5ICd2YWx1ZSdcbiAgICAgICAgdGhpcy5mb3JtYXROYXRpdmVJbnB1dFZhbHVlKClcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlZFxuICAgICAgICBpZiAoIXRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzRXF1YWwob2xkRGF0ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWx1ZXM6IFRbXSA9IFtdXG4gICAgQElucHV0KClcbiAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzXG4gICAgfVxuXG4gICAgc2V0IHZhbHVlcyh2YWx1ZXM6IFRbXSkge1xuICAgICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXMubWFwKHYgPT4ge1xuICAgICAgICAgICAgICAgIHYgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZSh2KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPVxuICAgICAgICAgICAgICAgICghdGhpcy5fdmFsdWVzWzBdIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5fdmFsdWVzWzBdKSkgJiZcbiAgICAgICAgICAgICAgICAoIXRoaXMuX3ZhbHVlc1sxXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuX3ZhbHVlc1sxXSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXVxuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCB0aGUgaW5wdXQgcHJvcGVydHkgJ3ZhbHVlJ1xuICAgICAgICB0aGlzLmZvcm1hdE5hdGl2ZUlucHV0VmFsdWUoKVxuXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZXMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYGNoYW5nZWAgZXZlbnQgaXMgZmlyZWQgb24gdGhpcyBgPGlucHV0PmBcbiAgICAgKiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGRhdGVUaW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGFuIGBpbnB1dGAgZXZlbnQgaXMgZmlyZWQgb24gdGhpcyBgPGlucHV0PmAuXG4gICAgICogKi9cbiAgICBAT3V0cHV0KClcbiAgICBkYXRlVGltZUlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcblxuICAgIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy5lbG1SZWZcbiAgICB9XG5cbiAgICBnZXQgaXNJblNpbmdsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlID09PSAnc2luZ2xlJ1xuICAgIH1cblxuICAgIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScgfHxcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZVRvJ1xuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqIFRoZSBkYXRlLXRpbWUtcGlja2VyIHRoYXQgdGhpcyBpbnB1dCBpcyBhc3NvY2lhdGVkIHdpdGguICovXG4gICAgcHVibGljIGR0UGlja2VyOiBPd2xEYXRlVGltZUNvbXBvbmVudDxUPlxuXG4gICAgcHJpdmF0ZSBkdFBpY2tlclN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZXG4gICAgcHJpdmF0ZSBsb2NhbGVTdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWVxuXG4gICAgcHJpdmF0ZSBsYXN0VmFsdWVWYWxpZCA9IHRydWVcblxuICAgIHByaXZhdGUgb25Nb2RlbENoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7IH1cbiAgICBwcml2YXRlIG9uTW9kZWxUb3VjaGVkOiBGdW5jdGlvbiA9ICgpID0+IHsgfVxuICAgIHByaXZhdGUgdmFsaWRhdG9yT25DaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4geyB9XG5cbiAgICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHdoZXRoZXIgdGhlIGlucHV0IHBhcnNlcy4gKi9cbiAgICBwcml2YXRlIHBhcnNlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9ICgpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWYWx1ZVZhbGlkXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBvd2xEYXRlVGltZVBhcnNlOiB7IHRleHQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgfSB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgbWluIGRhdGUuICovXG4gICAgcHJpdmF0ZSBtaW5WYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm1pbiB8fFxuICAgICAgICAgICAgICAgICFjb250cm9sVmFsdWUgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWluLCBjb250cm9sVmFsdWUpIDw9IDBcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IHsgb3dsRGF0ZVRpbWVNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0luUmFuZ2VNb2RlICYmIGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZUZyb20gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlVG8gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzFdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm1pbiB8fFxuICAgICAgICAgICAgICAgICFjb250cm9sVmFsdWVGcm9tIHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZVRvIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZSh0aGlzLm1pbiwgY29udHJvbFZhbHVlRnJvbSkgPD0gMFxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICBvd2xEYXRlVGltZU1pbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogW2NvbnRyb2xWYWx1ZUZyb20sIGNvbnRyb2xWYWx1ZVRvXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgbWF4IGRhdGUuICovXG4gICAgcHJpdmF0ZSBtYXhWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm1heCB8fFxuICAgICAgICAgICAgICAgICFjb250cm9sVmFsdWUgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMubWF4LCBjb250cm9sVmFsdWUpID49IDBcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IHsgb3dsRGF0ZVRpbWVNYXg6IHsgbWF4OiB0aGlzLm1heCwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0luUmFuZ2VNb2RlICYmIGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZUZyb20gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlVG8gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlWzFdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm1heCB8fFxuICAgICAgICAgICAgICAgICFjb250cm9sVmFsdWVGcm9tIHx8XG4gICAgICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZVRvIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZSh0aGlzLm1heCwgY29udHJvbFZhbHVlVG8pID49IDBcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgb3dsRGF0ZVRpbWVNYXg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IFtjb250cm9sVmFsdWVGcm9tLCBjb250cm9sVmFsdWVUb11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIGRhdGUgZmlsdGVyLiAqL1xuICAgIHByaXZhdGUgZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChcbiAgICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuICF0aGlzLl9kYXRlVGltZUZpbHRlciB8fFxuICAgICAgICAgICAgIWNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVGaWx0ZXIoY29udHJvbFZhbHVlKVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgb3dsRGF0ZVRpbWVGaWx0ZXI6IHRydWUgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgcmFuZ2UuXG4gICAgICogQ2hlY2sgd2hldGhlciB0aGUgJ2JlZm9yZScgdmFsdWUgaXMgYmVmb3JlIHRoZSAndG8nIHZhbHVlXG4gICAgICogKi9cbiAgICBwcml2YXRlIHJhbmdlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChcbiAgICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZUZyb20gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMF0pXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlVG8gPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWVbMV0pXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gIWNvbnRyb2xWYWx1ZUZyb20gfHxcbiAgICAgICAgICAgICFjb250cm9sVmFsdWVUbyB8fFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShjb250cm9sVmFsdWVGcm9tLCBjb250cm9sVmFsdWVUbykgPD0gMFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsgb3dsRGF0ZVRpbWVSYW5nZTogdHJ1ZSB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBjb21iaW5lZCBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGlzIGlucHV0LiAqL1xuICAgIHByaXZhdGUgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiB8IG51bGwgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICB0aGlzLnBhcnNlVmFsaWRhdG9yLFxuICAgICAgICB0aGlzLm1pblZhbGlkYXRvcixcbiAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IsXG4gICAgICAgIHRoaXMuZmlsdGVyVmFsaWRhdG9yLFxuICAgICAgICB0aGlzLnJhbmdlVmFsaWRhdG9yXG4gICAgXSlcblxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzIChlaXRoZXIgZHVlIHRvIHVzZXIgaW5wdXQgb3IgcHJvZ3JhbW1hdGljIGNoYW5nZSkuICovXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10gfCBUIHwgbnVsbD4oKVxuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGhhcyBjaGFuZ2VkICovXG4gICAgcHVibGljIGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpXG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gICAgZ2V0IG93bERhdGVUaW1lSW5wdXRBcmlhSGFzcG9wdXAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtb3ducycpXG4gICAgZ2V0IG93bERhdGVUaW1lSW5wdXRBcmlhT3ducygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHRoaXMuZHRQaWNrZXIub3BlbmVkICYmIHRoaXMuZHRQaWNrZXIuaWQpIHx8IG51bGxcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIubWluJylcbiAgICBnZXQgbWluSXNvODYwMSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4gPyB0aGlzLmRhdGVUaW1lQWRhcHRlci50b0lzbzg2MDEodGhpcy5taW4pIDogbnVsbFxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5tYXgnKVxuICAgIGdldCBtYXhJc284NjAxKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heCA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLnRvSXNvODYwMSh0aGlzLm1heCkgOiBudWxsXG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdkaXNhYmxlZCcpXG4gICAgZ2V0IG93bERhdGVUaW1lSW5wdXREaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsbVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE9XTF9EQVRFX1RJTUVfRk9STUFUUykgcHJpdmF0ZSBkYXRlVGltZUZvcm1hdHM6IE93bERhdGVUaW1lRm9ybWF0cykge1xuICAgICAgICBpZiAoIXRoaXMuZGF0ZVRpbWVBZGFwdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBgT3dsRGF0ZVRpbWVQaWNrZXI6IE5vIHByb3ZpZGVyIGZvdW5kIGZvciBEYXRlVGltZVBpY2tlci4gWW91IG11c3QgaW1wb3J0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGAgK1xuICAgICAgICAgICAgICAgIGBtb2R1bGVzIGF0IHlvdXIgYXBwbGljYXRpb24gcm9vdDogT3dsTmF0aXZlRGF0ZVRpbWVNb2R1bGUsIE93bE1vbWVudERhdGVUaW1lTW9kdWxlLCBvciBwcm92aWRlIGEgYCArXG4gICAgICAgICAgICAgICAgYGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5gXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZGF0ZVRpbWVGb3JtYXRzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBgT3dsRGF0ZVRpbWVQaWNrZXI6IE5vIHByb3ZpZGVyIGZvdW5kIGZvciBPV0xfREFURV9USU1FX0ZPUk1BVFMuIFlvdSBtdXN0IGltcG9ydCBvbmUgb2YgdGhlIGZvbGxvd2luZyBgICtcbiAgICAgICAgICAgICAgICBgbW9kdWxlcyBhdCB5b3VyIGFwcGxpY2F0aW9uIHJvb3Q6IE93bE5hdGl2ZURhdGVUaW1lTW9kdWxlLCBPd2xNb21lbnREYXRlVGltZU1vZHVsZSwgb3IgcHJvdmlkZSBhIGAgK1xuICAgICAgICAgICAgICAgIGBjdXN0b20gaW1wbGVtZW50YXRpb24uYFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2NhbGVTdWIgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmR0UGlja2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBgT3dsRGF0ZVRpbWVQaWNrZXI6IHRoZSBwaWNrZXIgaW5wdXQgZG9lc24ndCBoYXZlIGFueSBhc3NvY2lhdGVkIG93bC1kYXRlLXRpbWUgY29tcG9uZW50YFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kdFBpY2tlclN1YiA9IHRoaXMuZHRQaWNrZXIuY29uZmlybVNlbGVjdGVkQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgICAgICAgIChzZWxlY3RlZHM6IFRbXSB8IFQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gc2VsZWN0ZWRzXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZShzZWxlY3RlZHMpXG4gICAgICAgICAgICAgICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0LmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZHMsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kdFBpY2tlclN1Yi51bnN1YnNjcmliZSgpXG4gICAgICAgIHRoaXMubG9jYWxlU3ViLnVuc3Vic2NyaWJlKClcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5jb21wbGV0ZSgpXG4gICAgICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuY29tcGxldGUoKVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmblxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbFRvdWNoZWQgPSBmblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoYzogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRvciA/IHRoaXMudmFsaWRhdG9yKGMpIDogbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UgPSBmblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gdGhlIHBpY2tlciB3aGVuIHVzZXIgaG9sZCBhbHQgKyBET1dOX0FSUk9XXG4gICAgICogKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bk9uSG9zdChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IERPV05fQVJST1cpIHtcbiAgICAgICAgICAgIHRoaXMuZHRQaWNrZXIub3BlbigpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgaGFuZGxlQmx1ck9uSG9zdChfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbFRvdWNoZWQoKVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgaGFuZGxlSW5wdXRPbkhvc3QoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlSW5wdXRJblNpbmdsZU1vZGUodmFsdWUpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VJbnB1dEluUmFuZ2VNb2RlKHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VJbnB1dEluUmFuZ2VGcm9tVG9Nb2RlKHZhbHVlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgaGFuZGxlQ2hhbmdlT25Ib3N0KF9ldmVudDogYW55KTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHZcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIHYgPSB0aGlzLnZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0luUmFuZ2VNb2RlKSB7XG4gICAgICAgICAgICB2ID0gdGhpcy52YWx1ZXNcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBuYXRpdmUgaW5wdXQgcHJvcGVydHkgJ3ZhbHVlJ1xuICAgICAqL1xuICAgIHB1YmxpYyBmb3JtYXROYXRpdmVJbnB1dFZhbHVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHRQaWNrZXIuZm9ybWF0U3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlcyAmJiB0aGlzLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuX3ZhbHVlc1swXVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvID0gdGhpcy5fdmFsdWVzWzFdXG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tRm9ybWF0dGVkID0gZnJvbVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR0UGlja2VyLmZvcm1hdFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICBjb25zdCB0b0Zvcm1hdHRlZCA9IHRvXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR0UGlja2VyLmZvcm1hdFN0cmluZ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogJydcblxuICAgICAgICAgICAgICAgIGlmICghZnJvbUZvcm1hdHRlZCAmJiAhdG9Gb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Gb3JtYXR0ZWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0Zvcm1hdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRm9ybWF0dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0Zvcm1hdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGlucHV0IGFuZCBpdHMgcGlja2VyIGNvbXBvbmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVnaXN0ZXJEYXRlVGltZVBpY2tlcihwaWNrZXI6IE93bERhdGVUaW1lQ29tcG9uZW50PFQ+KSB7XG4gICAgICAgIGlmIChwaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZHRQaWNrZXIgPSBwaWNrZXJcbiAgICAgICAgICAgIHRoaXMuZHRQaWNrZXIucmVnaXN0ZXJJbnB1dCh0aGlzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGdpdmVuIG9iaiB0byBhIHZhbGlkIGRhdGUgb2JqZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYWxpZERhdGUob2JqOiBhbnkpOiBUIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKG9iailcbiAgICAgICAgICAgID8gb2JqXG4gICAgICAgICAgICA6IG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgdGltZSBzdHJpbmcgdG8gYSBkYXRlLXRpbWUgc3RyaW5nXG4gICAgICogV2hlbiBwaWNrZXJUeXBlIGlzICd0aW1lcicsIHRoZSB2YWx1ZSBpbiB0aGUgcGlja2VyJ3MgaW5wdXQgaXMgYSB0aW1lIHN0cmluZy5cbiAgICAgKiBUaGUgZGF0ZVRpbWVBZGFwdGVyIHBhcnNlIGZuIGNvdWxkIG5vdCBwYXJzZSBhIHRpbWUgc3RyaW5nIHRvIGEgRGF0ZSBPYmplY3QuXG4gICAgICogVGhlcmVmb3JlIHdlIG5lZWQgdGhpcyBmbiB0byBjb252ZXJ0IGEgdGltZSBzdHJpbmcgdG8gYSBkYXRlLXRpbWUgc3RyaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29udmVydFRpbWVTdHJpbmdUb0RhdGVUaW1lU3RyaW5nKFxuICAgICAgICB0aW1lU3RyaW5nOiBzdHJpbmcsXG4gICAgICAgIGRhdGVUaW1lOiBUXG4gICAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aW1lU3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gZGF0ZVRpbWUgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KClcbiAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQoXG4gICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5kYXRlUGlja2VySW5wdXRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBkYXRlU3RyaW5nICsgJyAnICsgdGltZVN0cmluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgaW4gc2luZ2xlIG1vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNoYW5nZUlucHV0SW5TaW5nbGVNb2RlKGlucHV0VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgdmFsdWUgPSBpbnB1dFZhbHVlXG4gICAgICAgIGlmICh0aGlzLmR0UGlja2VyLnBpY2tlclR5cGUgPT09ICd0aW1lcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb252ZXJ0VGltZVN0cmluZ1RvRGF0ZVRpbWVTdHJpbmcodmFsdWUsIHRoaXMudmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLnBhcnNlSW5wdXRcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gIXJlc3VsdCB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHJlc3VsdClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRWYWxpZERhdGUocmVzdWx0KVxuXG4gICAgICAgIC8vIGlmIHRoZSBuZXdWYWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkVmFsdWUsIHdlIGludGVuZCB0byBub3QgZmlyZSB0aGUgdmFsdWVDaGFuZ2UgZXZlbnRcbiAgICAgICAgLy8gcmVzdWx0IGVxdWFscyB0byBudWxsIG1lYW5zIHRoZXJlIGlzIGlucHV0IGV2ZW50LCBidXQgdGhlIGlucHV0IHZhbHVlIGlzIGludmFsaWRcbiAgICAgICAgaWYgKCF0aGlzLmlzU2FtZVZhbHVlKHJlc3VsdCwgdGhpcy5fdmFsdWUpIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSByZXN1bHRcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChyZXN1bHQpXG4gICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UocmVzdWx0KVxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0LmVtaXQoe1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGlucHV0IGNoYW5nZSBpbiByYW5nZUZyb20gb3IgcmFuZ2VUbyBtb2RlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGFuZ2VJbnB1dEluUmFuZ2VGcm9tVG9Nb2RlKGlucHV0VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID1cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nXG4gICAgICAgICAgICAgICAgPyB0aGlzLl92YWx1ZXNbMF1cbiAgICAgICAgICAgICAgICA6IHRoaXMuX3ZhbHVlc1sxXVxuXG4gICAgICAgIGlmICh0aGlzLmR0UGlja2VyLnBpY2tlclR5cGUgPT09ICd0aW1lcicpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmNvbnZlcnRUaW1lU3RyaW5nVG9EYXRlVGltZVN0cmluZyhcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5wYXJzZShcbiAgICAgICAgICAgIGlucHV0VmFsdWUsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5wYXJzZUlucHV0XG4gICAgICAgIClcbiAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9ICFyZXN1bHQgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZChyZXN1bHQpXG4gICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHJlc3VsdClcblxuICAgICAgICAvLyBpZiB0aGUgbmV3VmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZFZhbHVlLCB3ZSBpbnRlbmQgdG8gbm90IGZpcmUgdGhlIHZhbHVlQ2hhbmdlIGV2ZW50XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNTYW1lVmFsdWUocmVzdWx0LCB0aGlzLl92YWx1ZXNbMF0pICYmXG4gICAgICAgICAgICAgICAgcmVzdWx0KSB8fFxuICAgICAgICAgICAgKHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZVRvJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNTYW1lVmFsdWUocmVzdWx0LCB0aGlzLl92YWx1ZXNbMV0pICYmXG4gICAgICAgICAgICAgICAgcmVzdWx0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmFsdWVzID1cbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nXG4gICAgICAgICAgICAgICAgPyBbcmVzdWx0LCB0aGlzLl92YWx1ZXNbMV1dXG4gICAgICAgICAgICAgICAgOiBbdGhpcy5fdmFsdWVzWzBdLCByZXN1bHRdXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZXMpXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZXMpXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dC5lbWl0KHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZXMsXG4gICAgICAgICAgICBpbnB1dDogdGhpcy5lbG1SZWYubmF0aXZlRWxlbWVudFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgaW4gcmFuZ2UgbW9kZVxuICAgICAqL1xuICAgIHByaXZhdGUgY2hhbmdlSW5wdXRJblJhbmdlTW9kZShpbnB1dFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRzID0gaW5wdXRWYWx1ZS5zcGxpdCh0aGlzLnJhbmdlU2VwYXJhdG9yKVxuICAgICAgICBsZXQgZnJvbVN0cmluZyA9IHNlbGVjdGVkc1swXVxuICAgICAgICBsZXQgdG9TdHJpbmcgPSBzZWxlY3RlZHNbMV1cblxuICAgICAgICBpZiAodGhpcy5kdFBpY2tlci5waWNrZXJUeXBlID09PSAndGltZXInKSB7XG4gICAgICAgICAgICBmcm9tU3RyaW5nID0gdGhpcy5jb252ZXJ0VGltZVN0cmluZ1RvRGF0ZVRpbWVTdHJpbmcoXG4gICAgICAgICAgICAgICAgZnJvbVN0cmluZyxcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc1swXVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgdG9TdHJpbmcgPSB0aGlzLmNvbnZlcnRUaW1lU3RyaW5nVG9EYXRlVGltZVN0cmluZyhcbiAgICAgICAgICAgICAgICB0b1N0cmluZyxcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlc1sxXVxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5wYXJzZShcbiAgICAgICAgICAgIGZyb21TdHJpbmcsXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0cy5wYXJzZUlucHV0XG4gICAgICAgIClcbiAgICAgICAgbGV0IHRvID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIucGFyc2UoXG4gICAgICAgICAgICB0b1N0cmluZyxcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRzLnBhcnNlSW5wdXRcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID1cbiAgICAgICAgICAgICghZnJvbSB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKGZyb20pKSAmJlxuICAgICAgICAgICAgKCF0byB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRvKSlcbiAgICAgICAgZnJvbSA9IHRoaXMuZ2V0VmFsaWREYXRlKGZyb20pXG4gICAgICAgIHRvID0gdGhpcy5nZXRWYWxpZERhdGUodG8pXG5cbiAgICAgICAgLy8gaWYgdGhlIG5ld1ZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGRWYWx1ZSwgd2UgaW50ZW5kIHRvIG5vdCBmaXJlIHRoZSB2YWx1ZUNoYW5nZSBldmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5pc1NhbWVWYWx1ZShmcm9tLCB0aGlzLl92YWx1ZXNbMF0pIHx8XG4gICAgICAgICAgICAhdGhpcy5pc1NhbWVWYWx1ZSh0bywgdGhpcy5fdmFsdWVzWzFdKSB8fFxuICAgICAgICAgICAgKGZyb20gPT09IG51bGwgJiYgdG8gPT09IG51bGwpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW2Zyb20sIHRvXVxuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlcylcbiAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLl92YWx1ZXMpXG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXQuZW1pdCh7XG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZXMsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgdHdvIHZhbHVlIGlzIHRoZSBzYW1lXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc1NhbWVWYWx1ZShmaXJzdDogVCB8IG51bGwsIHNlY29uZDogVCB8IG51bGwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZmlyc3QsIHNlY29uZCkgPT09IDBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaXJzdCA9PSBzZWNvbmRcbiAgICB9XG59XG4iXX0=