UNPKG

45 kBJavaScriptView Raw
1/******/ (() => { // webpackBootstrap
2/******/ "use strict";
3/******/ var __webpack_modules__ = ({
4
5/***/ "./conversion.ts":
6/*!***********************!*\
7 !*** ./conversion.ts ***!
8 \***********************/
9/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
10
11
12
13Object.defineProperty(exports, "__esModule", ({
14 value: true
15}));
16exports.isLocalDateLike = isLocalDateLike;
17exports.isLocalTimeLike = isLocalTimeLike;
18exports.toDate = toDate;
19exports.toEpochDay = toEpochDay;
20exports.toLocalDate = toLocalDate;
21exports.toLocalDateTime = toLocalDateTime;
22exports.toLocalTime = toLocalTime;
23
24var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
25
26function isLocalDateLike(date) {
27 return date !== null && date !== undefined && typeof date === 'object' && typeof date._year !== 'undefined' && typeof date._month !== 'undefined' && typeof date._day !== 'undefined';
28}
29
30function isLocalTimeLike(time) {
31 return time !== null && time !== undefined && typeof time === 'object' && typeof time._hour !== 'undefined' && typeof time._minute !== 'undefined' && typeof time._second !== 'undefined' && typeof time._nano !== 'undefined';
32} // const iso8601Regex = /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
33
34
35const iso8601DateOnly = /^\d{4}-\d{2}-\d{2}$/;
36const iso8601ContainsZone = /(Z|[+-]\d{2}:\d{2})$/;
37const iso8601TimeOnly = /^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?$/;
38
39function toLocalDate(date, zone = _core.ZoneId.SYSTEM) {
40 if (date instanceof _core.LocalDate) {
41 return date;
42 }
43
44 if (date instanceof _core.LocalDateTime) {
45 // This chops the time off, because 'local' datetime === 'local date.
46 return date.toLocalDate();
47 }
48
49 if (date instanceof _core.ZonedDateTime) {
50 // Unsure of this
51 return date.toLocalDate();
52 }
53
54 if (typeof date === 'number') {
55 return _core.LocalDate.ofEpochDay(date);
56 }
57
58 if (date instanceof Date) {
59 // Javascript dates are evil. They assume you are in SYSTEM zone when reading, but can set as any zone.
60 return _core.LocalDate.from((0, _core.nativeJs)(date, zone));
61 }
62
63 if (isLocalDateLike(date)) {
64 // eslint-disable-next-line no-underscore-dangle
65 return _core.LocalDate.of(date._year, date._month, date._day);
66 }
67
68 if (typeof date === 'string') {
69 if (iso8601DateOnly.test(date)) {
70 return _core.LocalDate.parse(date);
71 }
72
73 if (iso8601ContainsZone.test(date)) {
74 return _core.ZonedDateTime.parse(date).toLocalDate();
75 }
76
77 return _core.LocalDateTime.parse(date).toLocalDate();
78 }
79
80 throw new Error('Cannot convert value to LocalDate');
81}
82
83function toEpochDay(date, zone = _core.ZoneId.SYSTEM) {
84 if (typeof date === 'number') {
85 return date;
86 }
87
88 if (date instanceof _core.LocalDate) {
89 return date.toEpochDay();
90 }
91
92 if (date instanceof _core.LocalDateTime || date instanceof _core.ZonedDateTime || date instanceof Date || isLocalDateLike(date) || typeof date === 'string') {
93 return toLocalDate(date, zone).toEpochDay();
94 }
95
96 throw new Error('Cannot convert value to epoch integer');
97}
98
99function toLocalDateTime(date, zone = _core.ZoneId.SYSTEM) {
100 if (date instanceof _core.LocalDateTime) {
101 return date;
102 }
103
104 if (date instanceof _core.ZonedDateTime) {
105 return date.toLocalDateTime();
106 }
107
108 if (date instanceof Date) {
109 return _core.LocalDateTime.from((0, _core.nativeJs)(date, zone));
110 }
111
112 if (date instanceof _core.LocalDate || isLocalDateLike(date) || typeof date === 'number') {
113 const localDate = toLocalDate(date);
114 return _core.LocalDateTime.of(localDate.year(), localDate.monthValue(), localDate.dayOfMonth(), 0, 0, 0, 0);
115 }
116
117 if (typeof date === 'string') {
118 if (iso8601DateOnly.test(date)) {
119 return toLocalDateTime(_core.LocalDate.parse(date));
120 }
121
122 if (iso8601ContainsZone.test(date)) {
123 return _core.ZonedDateTime.parse(date).toLocalDateTime();
124 }
125
126 return _core.LocalDateTime.parse(date);
127 }
128
129 throw new Error('Cannot convert value to LocalDateTime');
130}
131
132function toDate(date) {
133 if (date instanceof Date) {
134 return date;
135 }
136
137 if (date instanceof _core.LocalDate || date instanceof _core.ZonedDateTime) {
138 return new Date(date.year(), date.monthValue() - 1, date.dayOfMonth());
139 }
140
141 if (date instanceof _core.LocalDateTime) {
142 return new Date(date.year(), date.monthValue() - 1, date.dayOfMonth(), date.hour(), date.minute(), date.second(), date.nano() / 1000000);
143 }
144
145 if (date instanceof _core.LocalTime) {
146 return new Date(1970, 1, 1, date.hour(), date.minute(), date.second(), date.nano() / 1000000);
147 }
148
149 if (typeof date === 'number' || isLocalDateLike(date)) {
150 return toDate(toLocalDate(date));
151 }
152
153 if (typeof date === 'string') {
154 return new Date(date);
155 }
156
157 throw new Error('Cannot convert value to Date');
158}
159
160function toLocalTime(time, zone = _core.ZoneId.SYSTEM) {
161 if (time instanceof _core.LocalTime) {
162 return time;
163 }
164
165 if (time instanceof _core.LocalDateTime) {
166 return time.toLocalTime();
167 }
168
169 if (time instanceof _core.ZonedDateTime) {
170 return time.toLocalTime();
171 }
172
173 if (time instanceof Date) {
174 return _core.LocalTime.from((0, _core.nativeJs)(time, zone));
175 }
176
177 if (isLocalTimeLike(time)) {
178 // eslint-disable-next-line no-underscore-dangle
179 return _core.LocalTime.of(time._hour, time._minute, time._second, time._nano);
180 }
181
182 if (typeof time === 'number') {
183 return _core.LocalTime.ofSecondOfDay(time);
184 }
185
186 if (typeof time === 'string') {
187 if (iso8601TimeOnly.test(time)) {
188 return _core.LocalTime.parse(time);
189 }
190
191 return toLocalDateTime(time, zone).toLocalTime();
192 }
193
194 throw new Error('Cannot convert value to LocalTime');
195}
196
197/***/ }),
198
199/***/ "./formatDate.ts":
200/*!***********************!*\
201 !*** ./formatDate.ts ***!
202 \***********************/
203/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
204
205
206
207Object.defineProperty(exports, "__esModule", ({
208 value: true
209}));
210exports.FormatDateType = void 0;
211exports.formatDate = formatDate;
212
213var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
214
215var _locale_en = __webpack_require__(/*! @js-joda/locale_en */ "@js-joda/locale_en");
216
217__webpack_require__(/*! @js-joda/timezone */ "@js-joda/timezone");
218
219var _conversion = __webpack_require__(/*! ./conversion */ "./conversion.ts");
220
221let FormatDateType;
222exports.FormatDateType = FormatDateType;
223
224(function (FormatDateType) {
225 FormatDateType["short"] = "short";
226 FormatDateType["medium"] = "medium";
227 FormatDateType["long"] = "long";
228})(FormatDateType || (exports.FormatDateType = FormatDateType = {}));
229
230/**
231 * Formats a date to a string
232 * @param obj
233 * @param params
234 * @param zone
235 */
236function formatDate(obj, {
237 type = FormatDateType.short,
238 time = false,
239 date = true,
240 format
241} = {
242 type: FormatDateType.short,
243 time: false,
244 date: true
245}, zone = _core.ZoneId.SYSTEM) {
246 let l;
247 if (!obj) return '';
248 if (typeof obj === 'number') l = (0, _conversion.toLocalDate)(obj);
249 if (typeof obj === 'string' && time === false) l = (0, _conversion.toLocalDate)(obj);
250 if (typeof obj === 'string') l = (0, _conversion.toLocalDateTime)(obj);
251 if ((0, _conversion.isLocalDateLike)(obj)) l = (0, _conversion.toLocalDate)(obj);
252 if (obj instanceof Date) l = (0, _conversion.toLocalDateTime)(obj, zone);
253 if (obj instanceof _core.LocalDate) l = obj;
254 if (obj instanceof _core.LocalDateTime) l = obj;
255 if (obj instanceof _core.LocalTime) l = obj;
256 if (obj instanceof _core.ZonedDateTime) l = obj;
257 if (!l) throw new Error('Date could not be converted to a js-joda date');
258 let dateFormat;
259 let timeFormat;
260
261 switch (type) {
262 case FormatDateType.medium:
263 dateFormat = 'MMM d, yyyy';
264 timeFormat = 'h:mm a';
265 break;
266
267 case FormatDateType.long:
268 dateFormat = 'MMMM d, yyyy';
269 timeFormat = 'h:mm a';
270 break;
271
272 case FormatDateType.short:
273 default:
274 dateFormat = 'M/d/yyyy';
275 timeFormat = 'h:mm a';
276 break;
277 }
278
279 if (l instanceof _core.LocalDate) timeFormat = '';
280 if (l instanceof _core.LocalTime) dateFormat = '';
281 let formatString = !date ? '' : dateFormat;
282
283 if (time) {
284 formatString = `${formatString} ${timeFormat}`.trim();
285 }
286
287 const formatter = _core.DateTimeFormatter.ofPattern(format || formatString).withLocale(_locale_en.Locale.ENGLISH);
288
289 return l.format(formatter).replace(/AM|PM/, x => x.toLowerCase());
290}
291
292/***/ }),
293
294/***/ "./getMonthNames.ts":
295/*!**************************!*\
296 !*** ./getMonthNames.ts ***!
297 \**************************/
298/***/ ((__unused_webpack_module, exports) => {
299
300
301
302Object.defineProperty(exports, "__esModule", ({
303 value: true
304}));
305exports.getMonthNames = getMonthNames;
306
307/**
308 * Returns an array of month name strings up to the current month.
309 * @param year: {number}, The year to get the months for.
310 * @param limitToCurrentMonth = false: {boolean}, If set to true returns all the months for the current year.
311 */
312function getMonthNames({
313 year,
314 limitToCurrentMonth = true
315} = {}) {
316 const array = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
317 const date = new Date();
318 const currentYear = date.getFullYear();
319 const currentMonth = date.getMonth();
320
321 if (year) {
322 if (year > currentYear) return [];
323
324 if (year === currentYear && limitToCurrentMonth) {
325 return array.slice(0, currentMonth + 1);
326 }
327 }
328
329 return array;
330}
331
332/***/ }),
333
334/***/ "./getNumberOfDaysInMonth.ts":
335/*!***********************************!*\
336 !*** ./getNumberOfDaysInMonth.ts ***!
337 \***********************************/
338/***/ ((__unused_webpack_module, exports) => {
339
340
341
342Object.defineProperty(exports, "__esModule", ({
343 value: true
344}));
345exports.getNumberOfDaysInMonth = getNumberOfDaysInMonth;
346
347/**
348 * Returns the number of days in a given month.
349 * @param month: {number}, The number of the month to get where January = 1.
350 * @param limitToCurrentDay = false: {boolean}, If set to true, returns number of days up to current day.
351 * @param asArray = false: {boolean}, If set to true, returns array of days.
352 */
353function getNumberOfDaysInMonth({
354 month,
355 limitToCurrentDay = false,
356 asArray = false
357}) {
358 const days = limitToCurrentDay && month === new Date().getMonth() + 1 ? new Date().getDate() : new Date(2019, month, 0).getDate();
359 if (!asArray) return days;
360 const daysArray = [];
361
362 for (let i = 1; i <= days; i++) {
363 daysArray.push(i);
364 }
365
366 return daysArray;
367}
368
369/***/ }),
370
371/***/ "./specialFormats.ts":
372/*!***************************!*\
373 !*** ./specialFormats.ts ***!
374 \***************************/
375/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
376
377
378
379Object.defineProperty(exports, "__esModule", ({
380 value: true
381}));
382exports.getTimeOfDay = getTimeOfDay;
383
384var _core = __webpack_require__(/*! @js-joda/core */ "@js-joda/core");
385
386function getTimeOfDay(time) {
387 return {
388 time: time.get(_core.ChronoField.CLOCK_HOUR_OF_AMPM).toString().concat(':', time.minute() < 10 ? '0' : '', time.minute().toString()),
389 timeOfDay: time.hour() < 12 ? 'morning' : 'afternoon'
390 };
391}
392
393/***/ }),
394
395/***/ "@js-joda/core":
396/*!********************************!*\
397 !*** external "@js-joda/core" ***!
398 \********************************/
399/***/ ((module) => {
400
401module.exports = require("@js-joda/core");
402
403/***/ }),
404
405/***/ "@js-joda/locale_en":
406/*!*************************************!*\
407 !*** external "@js-joda/locale_en" ***!
408 \*************************************/
409/***/ ((module) => {
410
411module.exports = require("@js-joda/locale_en");
412
413/***/ }),
414
415/***/ "@js-joda/timezone":
416/*!************************************!*\
417 !*** external "@js-joda/timezone" ***!
418 \************************************/
419/***/ ((module) => {
420
421module.exports = require("@js-joda/timezone");
422
423/***/ })
424
425/******/ });
426/************************************************************************/
427/******/ // The module cache
428/******/ var __webpack_module_cache__ = {};
429/******/
430/******/ // The require function
431/******/ function __webpack_require__(moduleId) {
432/******/ // Check if module is in cache
433/******/ var cachedModule = __webpack_module_cache__[moduleId];
434/******/ if (cachedModule !== undefined) {
435/******/ return cachedModule.exports;
436/******/ }
437/******/ // Create a new module (and put it into the cache)
438/******/ var module = __webpack_module_cache__[moduleId] = {
439/******/ // no module.id needed
440/******/ // no module.loaded needed
441/******/ exports: {}
442/******/ };
443/******/
444/******/ // Execute the module function
445/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
446/******/
447/******/ // Return the exports of the module
448/******/ return module.exports;
449/******/ }
450/******/
451/************************************************************************/
452var __webpack_exports__ = {};
453// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
454(() => {
455var exports = __webpack_exports__;
456/*!******************!*\
457 !*** ./index.ts ***!
458 \******************/
459
460
461Object.defineProperty(exports, "__esModule", ({
462 value: true
463}));
464Object.defineProperty(exports, "FormatDateType", ({
465 enumerable: true,
466 get: function () {
467 return _formatDate.FormatDateType;
468 }
469}));
470Object.defineProperty(exports, "formatDate", ({
471 enumerable: true,
472 get: function () {
473 return _formatDate.formatDate;
474 }
475}));
476Object.defineProperty(exports, "getMonthNames", ({
477 enumerable: true,
478 get: function () {
479 return _getMonthNames.getMonthNames;
480 }
481}));
482Object.defineProperty(exports, "getNumberOfDaysInMonth", ({
483 enumerable: true,
484 get: function () {
485 return _getNumberOfDaysInMonth.getNumberOfDaysInMonth;
486 }
487}));
488Object.defineProperty(exports, "getTimeOfDay", ({
489 enumerable: true,
490 get: function () {
491 return _specialFormats.getTimeOfDay;
492 }
493}));
494Object.defineProperty(exports, "toDate", ({
495 enumerable: true,
496 get: function () {
497 return _conversion.toDate;
498 }
499}));
500Object.defineProperty(exports, "toEpochDay", ({
501 enumerable: true,
502 get: function () {
503 return _conversion.toEpochDay;
504 }
505}));
506Object.defineProperty(exports, "toLocalDate", ({
507 enumerable: true,
508 get: function () {
509 return _conversion.toLocalDate;
510 }
511}));
512Object.defineProperty(exports, "toLocalDateTime", ({
513 enumerable: true,
514 get: function () {
515 return _conversion.toLocalDateTime;
516 }
517}));
518Object.defineProperty(exports, "toLocalTime", ({
519 enumerable: true,
520 get: function () {
521 return _conversion.toLocalTime;
522 }
523}));
524
525var _formatDate = __webpack_require__(/*! ./formatDate */ "./formatDate.ts");
526
527var _getMonthNames = __webpack_require__(/*! ./getMonthNames */ "./getMonthNames.ts");
528
529var _getNumberOfDaysInMonth = __webpack_require__(/*! ./getNumberOfDaysInMonth */ "./getNumberOfDaysInMonth.ts");
530
531var _conversion = __webpack_require__(/*! ./conversion */ "./conversion.ts");
532
533var _specialFormats = __webpack_require__(/*! ./specialFormats */ "./specialFormats.ts");
534})();
535
536module.exports = __webpack_exports__;
537/******/ })()
538;
539//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxJQUFJSCxJQUFyQixFQUEyQkcsQ0FBQyxFQUE1QixFQUFnQztBQUMvQkQsSUFBQUEsU0FBUyxDQUFDRSxJQUFWLENBQWVELENBQWY7QUFDQTs7QUFDRCxTQUFPRCxTQUFQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEJEOztBQU9PLFNBQVNHLFlBQVQsQ0FBc0IzRSxJQUF0QixFQUFrRDtBQUN4RCxTQUFPO0FBQ05BLElBQUFBLElBQUksRUFBRUEsSUFBSSxDQUNSNEUsR0FESSxDQUNBQyxrQkFBWUMsa0JBRFosRUFFSkMsUUFGSSxHQUdKQyxNQUhJLENBR0csR0FISCxFQUdRaEYsSUFBSSxDQUFDOEIsTUFBTCxLQUFnQixFQUFoQixHQUFxQixHQUFyQixHQUEyQixFQUhuQyxFQUd1QzlCLElBQUksQ0FBQzhCLE1BQUwsR0FBY2lELFFBQWQsRUFIdkMsQ0FEQTtBQUtORSxJQUFBQSxTQUFTLEVBQUVqRixJQUFJLENBQUM2QixJQUFMLEtBQWMsRUFBZCxHQUFtQixTQUFuQixHQUErQjtBQUxwQyxHQUFQO0FBT0E7Ozs7Ozs7Ozs7QUNmRDs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0EseUYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9jb252ZXJzaW9uLnRzIiwid2VicGFjazovLy8uL2Zvcm1hdERhdGUudHMiLCJ3ZWJwYWNrOi8vLy4vZ2V0TW9udGhOYW1lcy50cyIsIndlYnBhY2s6Ly8vLi9nZXROdW1iZXJPZkRheXNJbk1vbnRoLnRzIiwid2VicGFjazovLy8uL3NwZWNpYWxGb3JtYXRzLnRzIiwid2VicGFjazovLy9leHRlcm5hbCBjb21tb25qcyBcIkBqcy1qb2RhL2NvcmVcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgY29tbW9uanMgXCJAanMtam9kYS9sb2NhbGVfZW5cIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgY29tbW9uanMgXCJAanMtam9kYS90aW1lem9uZVwiIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvY2FsRGF0ZSwgTG9jYWxEYXRlVGltZSwgbmF0aXZlSnMsIFpvbmVkRGF0ZVRpbWUsIFpvbmVJZCwgTG9jYWxUaW1lfSBmcm9tICdAanMtam9kYS9jb3JlJztcblxuLypcbiAgUG9zc2libGUgRGF0ZSBUeXBlc1xuXG4gIExvY2FsRGF0ZSAtIGpzLWpvZGEgZGF0ZSB3aXRoIG5vIHRpbWVcbiAgT2JqZWN0IC0gT2JqZWN0IHdpdGggZmllbGRzIHRoYXQgbG9vayBsaWtlIExvY2FsRGF0ZSBpbnRlcm5hbHMuIFNlZSBJTG9jYWxEYXRlTGlrZSBiZWxvdy5cbiAgRXBvY2ggRGF5cyAtIGpzLWpvZGEgbnVtYmVyIG9mIGRheXMgc2luY2UgZXBvY2ggKEphbiAxLCAxOTcwKVxuICBMb2NhbERhdGVUaW1lIC0ganMtam9kYSBkYXRlIHdpdGggdGltZSAobm8gem9uZSlcbiAgWm9uZWREYXRlVGltZSAtIGpzLWpvZGEgZGF0ZSB3aXRoIHRpbWUgYW5kIHpvbmVcbiAgRGF0ZSAtIGphdmFzY3JpcHQgZGF0ZSB3aXRoIHRpbWUgKG5vIHpvbmUpXG4gIFN0cmluZyAtIElTTzg2MDEgZGF0ZSBzdHJpbmcgKHdpdGhvdXQgdGltZSwgd2l0aCB0aW1lLCB3aXRoIHRpbWUgYW5kIHpvbmUpXG4gIExvY2FsVGltZSAtIGpzLWpvZGEgdGltZSAobm8gem9uZSlcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2NhbERhdGVMaWtlIHtcblx0X3llYXI6IG51bWJlcjtcblx0X21vbnRoOiBudW1iZXI7XG5cdF9kYXk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxEYXRlTGlrZShkYXRlOiBhbnkpOiBkYXRlIGlzIElMb2NhbERhdGVMaWtlIHtcblx0cmV0dXJuIChcblx0XHRkYXRlICE9PSBudWxsICYmXG5cdFx0ZGF0ZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0dHlwZW9mIGRhdGUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIGRhdGUuX3llYXIgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0dHlwZW9mIGRhdGUuX21vbnRoICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdHR5cGVvZiBkYXRlLl9kYXkgIT09ICd1bmRlZmluZWQnXG5cdCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvY2FsVGltZUxpa2Uge1xuXHRfaG91cjogbnVtYmVyO1xuXHRfbWludXRlOiBudW1iZXI7XG5cdF9zZWNvbmQ6IG51bWJlcjtcblx0X25hbm86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxUaW1lTGlrZSh0aW1lOiBhbnkpOiB0aW1lIGlzIElMb2NhbFRpbWVMaWtlIHtcblx0cmV0dXJuIChcblx0XHR0aW1lICE9PSBudWxsICYmXG5cdFx0dGltZSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0dHlwZW9mIHRpbWUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIHRpbWUuX2hvdXIgIT09ICd1bmRlZmluZWQnICYmXG5cdFx0dHlwZW9mIHRpbWUuX21pbnV0ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0XHR0eXBlb2YgdGltZS5fc2Vjb25kICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdHR5cGVvZiB0aW1lLl9uYW5vICE9PSAndW5kZWZpbmVkJ1xuXHQpO1xufVxuXG4vLyBjb25zdCBpc284NjAxUmVnZXggPSAvXihbKy1dP1xcZHs0fSg/IVxcZHsyfVxcYikpKCgtPykoKDBbMS05XXwxWzAtMl0pKFxcMyhbMTJdXFxkfDBbMS05XXwzWzAxXSkpP3xXKFswLTRdXFxkfDVbMC0yXSkoLT9bMS03XSk/fCgwMFsxLTldfDBbMS05XVxcZHxbMTJdXFxkezJ9fDMoWzAtNV1cXGR8NlsxLTZdKSkpKFtUXFxzXSgoKFswMV1cXGR8MlswLTNdKSgoOj8pWzAtNV1cXGQpP3wyNDo/MDApKFsuLF1cXGQrKD8hOikpPyk/KFxcMTdbMC01XVxcZChbLixdXFxkKyk/KT8oW3paXXwoWystXSkoWzAxXVxcZHwyWzAtM10pOj8oWzAtNV1cXGQpPyk/KT8pPyQvO1xuY29uc3QgaXNvODYwMURhdGVPbmx5ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuY29uc3QgaXNvODYwMUNvbnRhaW5zWm9uZSA9IC8oWnxbKy1dXFxkezJ9OlxcZHsyfSkkLztcbmNvbnN0IGlzbzg2MDFUaW1lT25seSA9IC9eXFxkezJ9OlxcZHsyfSg6XFxkezJ9KFxcLlxcZHsxLDl9KT8pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2NhbERhdGUoZGF0ZTogYW55LCB6b25lOiBab25lSWQgPSBab25lSWQuU1lTVEVNKTogTG9jYWxEYXRlIHtcblx0aWYgKGRhdGUgaW5zdGFuY2VvZiBMb2NhbERhdGUpIHtcblx0XHRyZXR1cm4gZGF0ZTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHQvLyBUaGlzIGNob3BzIHRoZSB0aW1lIG9mZiwgYmVjYXVzZSAnbG9jYWwnIGRhdGV0aW1lID09PSAnbG9jYWwgZGF0ZS5cblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsRGF0ZSgpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgWm9uZWREYXRlVGltZSkge1xuXHRcdC8vIFVuc3VyZSBvZiB0aGlzXG5cdFx0cmV0dXJuIGRhdGUudG9Mb2NhbERhdGUoKTtcblx0fVxuXHRpZiAodHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG5cdFx0cmV0dXJuIExvY2FsRGF0ZS5vZkVwb2NoRGF5KGRhdGUpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdC8vIEphdmFzY3JpcHQgZGF0ZXMgYXJlIGV2aWwuIFRoZXkgYXNzdW1lIHlvdSBhcmUgaW4gU1lTVEVNIHpvbmUgd2hlbiByZWFkaW5nLCBidXQgY2FuIHNldCBhcyBhbnkgem9uZS5cblx0XHRyZXR1cm4gTG9jYWxEYXRlLmZyb20obmF0aXZlSnMoZGF0ZSwgem9uZSkpO1xuXHR9XG5cdGlmIChpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcblx0XHRyZXR1cm4gTG9jYWxEYXRlLm9mKGRhdGUuX3llYXIsIGRhdGUuX21vbnRoLCBkYXRlLl9kYXkpO1xuXHR9XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRpZiAoaXNvODYwMURhdGVPbmx5LnRlc3QoZGF0ZSkpIHtcblx0XHRcdHJldHVybiBMb2NhbERhdGUucGFyc2UoZGF0ZSk7XG5cdFx0fVxuXHRcdGlmIChpc284NjAxQ29udGFpbnNab25lLnRlc3QoZGF0ZSkpIHtcblx0XHRcdHJldHVybiBab25lZERhdGVUaW1lLnBhcnNlKGRhdGUpLnRvTG9jYWxEYXRlKCk7XG5cdFx0fVxuXHRcdHJldHVybiBMb2NhbERhdGVUaW1lLnBhcnNlKGRhdGUpLnRvTG9jYWxEYXRlKCk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCB2YWx1ZSB0byBMb2NhbERhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRXBvY2hEYXkoZGF0ZTogYW55LCB6b25lOiBab25lSWQgPSBab25lSWQuU1lTVEVNKTogbnVtYmVyIHtcblx0aWYgKHR5cGVvZiBkYXRlID09PSAnbnVtYmVyJykge1xuXHRcdHJldHVybiBkYXRlO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlKSB7XG5cdFx0cmV0dXJuIGRhdGUudG9FcG9jaERheSgpO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlVGltZSB8fCBkYXRlIGluc3RhbmNlb2YgWm9uZWREYXRlVGltZSB8fCBkYXRlIGluc3RhbmNlb2YgRGF0ZSB8fCBpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkgfHwgdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHRvTG9jYWxEYXRlKGRhdGUsIHpvbmUpLnRvRXBvY2hEYXkoKTtcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gZXBvY2ggaW50ZWdlcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Mb2NhbERhdGVUaW1lKGRhdGU6IGFueSwgem9uZTogWm9uZUlkID0gWm9uZUlkLlNZU1RFTSk6IExvY2FsRGF0ZVRpbWUge1xuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0ZTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIFpvbmVkRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gZGF0ZS50b0xvY2FsRGF0ZVRpbWUoKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRyZXR1cm4gTG9jYWxEYXRlVGltZS5mcm9tKG5hdGl2ZUpzKGRhdGUsIHpvbmUpKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZSB8fCBpc0xvY2FsRGF0ZUxpa2UoZGF0ZSkgfHwgdHlwZW9mIGRhdGUgPT09ICdudW1iZXInKSB7XG5cdFx0Y29uc3QgbG9jYWxEYXRlID0gdG9Mb2NhbERhdGUoZGF0ZSk7XG5cdFx0cmV0dXJuIExvY2FsRGF0ZVRpbWUub2YobG9jYWxEYXRlLnllYXIoKSwgbG9jYWxEYXRlLm1vbnRoVmFsdWUoKSwgbG9jYWxEYXRlLmRheU9mTW9udGgoKSwgMCwgMCwgMCwgMCk7XG5cdH1cblx0aWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc284NjAxRGF0ZU9ubHkudGVzdChkYXRlKSkge1xuXHRcdFx0cmV0dXJuIHRvTG9jYWxEYXRlVGltZShMb2NhbERhdGUucGFyc2UoZGF0ZSkpO1xuXHRcdH1cblx0XHRpZiAoaXNvODYwMUNvbnRhaW5zWm9uZS50ZXN0KGRhdGUpKSB7XG5cdFx0XHRyZXR1cm4gWm9uZWREYXRlVGltZS5wYXJzZShkYXRlKS50b0xvY2FsRGF0ZVRpbWUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIExvY2FsRGF0ZVRpbWUucGFyc2UoZGF0ZSk7XG5cdH1cblx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCB2YWx1ZSB0byBMb2NhbERhdGVUaW1lJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUoZGF0ZTogYW55KTogRGF0ZSB7XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdHJldHVybiBkYXRlO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxEYXRlIHx8IGRhdGUgaW5zdGFuY2VvZiBab25lZERhdGVUaW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGRhdGUueWVhcigpLCBkYXRlLm1vbnRoVmFsdWUoKSAtIDEsIGRhdGUuZGF5T2ZNb250aCgpKTtcblx0fVxuXHRpZiAoZGF0ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gbmV3IERhdGUoZGF0ZS55ZWFyKCksIGRhdGUubW9udGhWYWx1ZSgpIC0gMSwgZGF0ZS5kYXlPZk1vbnRoKCksIGRhdGUuaG91cigpLCBkYXRlLm1pbnV0ZSgpLCBkYXRlLnNlY29uZCgpLCBkYXRlLm5hbm8oKSAvIDEwMDAwMDApO1xuXHR9XG5cdGlmIChkYXRlIGluc3RhbmNlb2YgTG9jYWxUaW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKDE5NzAsIDEsIDEsIGRhdGUuaG91cigpLCBkYXRlLm1pbnV0ZSgpLCBkYXRlLnNlY29uZCgpLCBkYXRlLm5hbm8oKSAvIDEwMDAwMDApO1xuXHR9XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicgfHwgaXNMb2NhbERhdGVMaWtlKGRhdGUpKSB7XG5cdFx0cmV0dXJuIHRvRGF0ZSh0b0xvY2FsRGF0ZShkYXRlKSk7XG5cdH1cblx0aWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblx0fVxuXHR0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHZhbHVlIHRvIERhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvTG9jYWxUaW1lKHRpbWU6IGFueSwgem9uZTogWm9uZUlkID0gWm9uZUlkLlNZU1RFTSk6IExvY2FsVGltZSB7XG5cdGlmICh0aW1lIGluc3RhbmNlb2YgTG9jYWxUaW1lKSB7XG5cdFx0cmV0dXJuIHRpbWU7XG5cdH1cblx0aWYgKHRpbWUgaW5zdGFuY2VvZiBMb2NhbERhdGVUaW1lKSB7XG5cdFx0cmV0dXJuIHRpbWUudG9Mb2NhbFRpbWUoKTtcblx0fVxuXHRpZiAodGltZSBpbnN0YW5jZW9mIFpvbmVkRGF0ZVRpbWUpIHtcblx0XHRyZXR1cm4gdGltZS50b0xvY2FsVGltZSgpO1xuXHR9XG5cdGlmICh0aW1lIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdHJldHVybiBMb2NhbFRpbWUuZnJvbShuYXRpdmVKcyh0aW1lLCB6b25lKSk7XG5cdH1cblx0aWYgKGlzTG9jYWxUaW1lTGlrZSh0aW1lKSkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuXHRcdHJldHVybiBMb2NhbFRpbWUub2YodGltZS5faG91ciwgdGltZS5fbWludXRlLCB0aW1lLl9zZWNvbmQsIHRpbWUuX25hbm8pO1xuXHR9XG5cdGlmICh0eXBlb2YgdGltZSA9PT0gJ251bWJlcicpIHtcblx0XHRyZXR1cm4gTG9jYWxUaW1lLm9mU2Vjb25kT2ZEYXkodGltZSk7XG5cdH1cblx0aWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuXHRcdGlmIChpc284NjAxVGltZU9ubHkudGVzdCh0aW1lKSkge1xuXHRcdFx0cmV0dXJuIExvY2FsVGltZS5wYXJzZSh0aW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRvTG9jYWxEYXRlVGltZSh0aW1lLCB6b25lKS50b0xvY2FsVGltZSgpO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgdmFsdWUgdG8gTG9jYWxUaW1lJyk7XG59XG4iLCJpbXBvcnQge0RhdGVUaW1lRm9ybWF0dGVyLCBMb2NhbERhdGUsIExvY2FsRGF0ZVRpbWUsIExvY2FsVGltZSwgWm9uZWREYXRlVGltZSwgWm9uZUlkfSBmcm9tICdAanMtam9kYS9jb3JlJztcbmltcG9ydCB7TG9jYWxlfSBmcm9tICdAanMtam9kYS9sb2NhbGVfZW4nO1xuaW1wb3J0ICdAanMtam9kYS90aW1lem9uZSc7XG5pbXBvcnQge3RvTG9jYWxEYXRlLCB0b0xvY2FsRGF0ZVRpbWUsIElMb2NhbERhdGVMaWtlLCBpc0xvY2FsRGF0ZUxpa2V9IGZyb20gJy4vY29udmVyc2lvbic7XG5cbmV4cG9ydCBlbnVtIEZvcm1hdERhdGVUeXBlIHtcblx0c2hvcnQgPSAnc2hvcnQnLFxuXHRtZWRpdW0gPSAnbWVkaXVtJyxcblx0bG9uZyA9ICdsb25nJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXREYXRlUGFyYW1zIHtcblx0dHlwZT86IEZvcm1hdERhdGVUeXBlIHwgJ3Nob3J0JyB8ICdtZWRpdW0nIHwgJ2xvbmcnO1xuXHR0aW1lPzogYm9vbGVhbjtcblx0ZGF0ZT86IGJvb2xlYW47XG5cdGZvcm1hdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIGEgZGF0ZSB0byBhIHN0cmluZ1xuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIHpvbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoXG5cdG9iajogSUxvY2FsRGF0ZUxpa2UgfCBEYXRlIHwgTG9jYWxEYXRlIHwgbnVtYmVyIHwgc3RyaW5nIHwgTG9jYWxEYXRlVGltZSB8IExvY2FsVGltZSB8IFpvbmVkRGF0ZVRpbWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHR7dHlwZSA9IEZvcm1hdERhdGVUeXBlLnNob3J0LCB0aW1lID0gZmFsc2UsIGRhdGUgPSB0cnVlLCBmb3JtYXR9OiBGb3JtYXREYXRlUGFyYW1zID0ge3R5cGU6IEZvcm1hdERhdGVUeXBlLnNob3J0LCB0aW1lOiBmYWxzZSwgZGF0ZTogdHJ1ZX0sXG5cdHpvbmU6IFpvbmVJZCA9IFpvbmVJZC5TWVNURU0sXG4pIHtcblx0bGV0IGw6IExvY2FsRGF0ZSB8IExvY2FsRGF0ZVRpbWUgfCBMb2NhbFRpbWUgfCBab25lZERhdGVUaW1lIHwgdW5kZWZpbmVkO1xuXHRpZiAoIW9iaikgcmV0dXJuICcnO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIGwgPSB0b0xvY2FsRGF0ZShvYmopO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgJiYgdGltZSA9PT0gZmFsc2UpIGwgPSB0b0xvY2FsRGF0ZShvYmopO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIGwgPSB0b0xvY2FsRGF0ZVRpbWUob2JqKTtcblx0aWYgKGlzTG9jYWxEYXRlTGlrZShvYmopKSBsID0gdG9Mb2NhbERhdGUob2JqKTtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIGwgPSB0b0xvY2FsRGF0ZVRpbWUob2JqLCB6b25lKTtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsRGF0ZSkgbCA9IG9iajtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIGwgPSBvYmo7XG5cdGlmIChvYmogaW5zdGFuY2VvZiBMb2NhbFRpbWUpIGwgPSBvYmo7XG5cdGlmIChvYmogaW5zdGFuY2VvZiBab25lZERhdGVUaW1lKSBsID0gb2JqO1xuXHRpZiAoIWwpIHRocm93IG5ldyBFcnJvcignRGF0ZSBjb3VsZCBub3QgYmUgY29udmVydGVkIHRvIGEganMtam9kYSBkYXRlJyk7XG5cblx0bGV0IGRhdGVGb3JtYXQ6IHN0cmluZztcblx0bGV0IHRpbWVGb3JtYXQ6IHN0cmluZztcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBGb3JtYXREYXRlVHlwZS5tZWRpdW06XG5cdFx0XHRkYXRlRm9ybWF0ID0gJ01NTSBkLCB5eXl5Jztcblx0XHRcdHRpbWVGb3JtYXQgPSAnaDptbSBhJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRm9ybWF0RGF0ZVR5cGUubG9uZzpcblx0XHRcdGRhdGVGb3JtYXQgPSAnTU1NTSBkLCB5eXl5Jztcblx0XHRcdHRpbWVGb3JtYXQgPSAnaDptbSBhJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgRm9ybWF0RGF0ZVR5cGUuc2hvcnQ6XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRhdGVGb3JtYXQgPSAnTS9kL3l5eXknO1xuXHRcdFx0dGltZUZvcm1hdCA9ICdoOm1tIGEnO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAobCBpbnN0YW5jZW9mIExvY2FsRGF0ZSkgdGltZUZvcm1hdCA9ICcnO1xuXHRpZiAobCBpbnN0YW5jZW9mIExvY2FsVGltZSkgZGF0ZUZvcm1hdCA9ICcnO1xuXG5cdGxldCBmb3JtYXRTdHJpbmcgPSAhZGF0ZSA/ICcnIDogZGF0ZUZvcm1hdDtcblx0aWYgKHRpbWUpIHtcblx0XHRmb3JtYXRTdHJpbmcgPSBgJHtmb3JtYXRTdHJpbmd9ICR7dGltZUZvcm1hdH1gLnRyaW0oKTtcblx0fVxuXG5cdGNvbnN0IGZvcm1hdHRlciA9IERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybihmb3JtYXQgfHwgZm9ybWF0U3RyaW5nKS53aXRoTG9jYWxlKExvY2FsZS5FTkdMSVNIKTtcblxuXHRyZXR1cm4gbC5mb3JtYXQoZm9ybWF0dGVyKS5yZXBsYWNlKC9BTXxQTS8sIHggPT4geC50b0xvd2VyQ2FzZSgpKTtcbn1cbiIsImludGVyZmFjZSBHZXRNb250aE5hbWVQYXJhbXMge1xuXHR5ZWFyPzogbnVtYmVyO1xuXHRsaW1pdFRvQ3VycmVudE1vbnRoPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vbnRoIG5hbWUgc3RyaW5ncyB1cCB0byB0aGUgY3VycmVudCBtb250aC5cbiAqIEBwYXJhbSB5ZWFyOiB7bnVtYmVyfSwgVGhlIHllYXIgdG8gZ2V0IHRoZSBtb250aHMgZm9yLlxuICogQHBhcmFtIGxpbWl0VG9DdXJyZW50TW9udGggPSBmYWxzZToge2Jvb2xlYW59LCBJZiBzZXQgdG8gdHJ1ZSByZXR1cm5zIGFsbCB0aGUgbW9udGhzIGZvciB0aGUgY3VycmVudCB5ZWFyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9udGhOYW1lcyh7eWVhciwgbGltaXRUb0N1cnJlbnRNb250aCA9IHRydWV9OiBHZXRNb250aE5hbWVQYXJhbXMgPSB7fSk6IHN0cmluZ1tdIHtcblx0Y29uc3QgYXJyYXkgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcblx0Y29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cdGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRjb25zdCBjdXJyZW50TW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG5cblx0aWYgKHllYXIpIHtcblx0XHRpZiAoeWVhciA+IGN1cnJlbnRZZWFyKSByZXR1cm4gW107XG5cdFx0aWYgKHllYXIgPT09IGN1cnJlbnRZZWFyICYmIGxpbWl0VG9DdXJyZW50TW9udGgpIHtcblx0XHRcdHJldHVybiBhcnJheS5zbGljZSgwLCBjdXJyZW50TW9udGggKyAxKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFycmF5O1xufVxuIiwiaW50ZXJmYWNlIEdldE1vbnRoRGF5c1BhcmFtcyB7XG5cdG1vbnRoOiBudW1iZXI7XG5cdGxpbWl0VG9DdXJyZW50RGF5PzogYm9vbGVhbjtcblx0YXNBcnJheT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBnaXZlbiBtb250aC5cbiAqIEBwYXJhbSBtb250aDoge251bWJlcn0sIFRoZSBudW1iZXIgb2YgdGhlIG1vbnRoIHRvIGdldCB3aGVyZSBKYW51YXJ5ID0gMS5cbiAqIEBwYXJhbSBsaW1pdFRvQ3VycmVudERheSA9IGZhbHNlOiB7Ym9vbGVhbn0sIElmIHNldCB0byB0cnVlLCByZXR1cm5zIG51bWJlciBvZiBkYXlzIHVwIHRvIGN1cnJlbnQgZGF5LlxuICogQHBhcmFtIGFzQXJyYXkgPSBmYWxzZToge2Jvb2xlYW59LCBJZiBzZXQgdG8gdHJ1ZSwgcmV0dXJucyBhcnJheSBvZiBkYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyT2ZEYXlzSW5Nb250aCh7bW9udGgsIGxpbWl0VG9DdXJyZW50RGF5ID0gZmFsc2UsIGFzQXJyYXkgPSBmYWxzZX06IEdldE1vbnRoRGF5c1BhcmFtcykge1xuXHRjb25zdCBkYXlzID0gbGltaXRUb0N1cnJlbnREYXkgJiYgbW9udGggPT09IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDEgPyBuZXcgRGF0ZSgpLmdldERhdGUoKSA6IG5ldyBEYXRlKDIwMTksIG1vbnRoLCAwKS5nZXREYXRlKCk7XG5cblx0aWYgKCFhc0FycmF5KSByZXR1cm4gZGF5cztcblxuXHRjb25zdCBkYXlzQXJyYXk6IG51bWJlcltdID0gW107XG5cdGZvciAobGV0IGkgPSAxOyBpIDw9IGRheXM7IGkrKykge1xuXHRcdGRheXNBcnJheS5wdXNoKGkpO1xuXHR9XG5cdHJldHVybiBkYXlzQXJyYXk7XG59XG4iLCJpbXBvcnQge0Nocm9ub0ZpZWxkLCBMb2NhbFRpbWV9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnO1xuXG5pbnRlcmZhY2UgVGltZU9mRGF5IHtcblx0dGltZTogc3RyaW5nO1xuXHR0aW1lT2ZEYXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVPZkRheSh0aW1lOiBMb2NhbFRpbWUpOiBUaW1lT2ZEYXkge1xuXHRyZXR1cm4ge1xuXHRcdHRpbWU6IHRpbWVcblx0XHRcdC5nZXQoQ2hyb25vRmllbGQuQ0xPQ0tfSE9VUl9PRl9BTVBNKVxuXHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdC5jb25jYXQoJzonLCB0aW1lLm1pbnV0ZSgpIDwgMTAgPyAnMCcgOiAnJywgdGltZS5taW51dGUoKS50b1N0cmluZygpKSxcblx0XHR0aW1lT2ZEYXk6IHRpbWUuaG91cigpIDwgMTIgPyAnbW9ybmluZycgOiAnYWZ0ZXJub29uJyxcblx0fTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBqcy1qb2RhL2NvcmVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGpzLWpvZGEvbG9jYWxlX2VuXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBqcy1qb2RhL3RpbWV6b25lXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCJleHBvcnQge2Zvcm1hdERhdGUsIEZvcm1hdERhdGVUeXBlfSBmcm9tICcuL2Zvcm1hdERhdGUnO1xuZXhwb3J0IHtnZXRNb250aE5hbWVzfSBmcm9tICcuL2dldE1vbnRoTmFtZXMnO1xuZXhwb3J0IHtnZXROdW1iZXJPZkRheXNJbk1vbnRofSBmcm9tICcuL2dldE51bWJlck9mRGF5c0luTW9udGgnO1xuZXhwb3J0IHt0b0xvY2FsRGF0ZSwgdG9Mb2NhbERhdGVUaW1lLCB0b0RhdGUsIHRvRXBvY2hEYXksIHRvTG9jYWxUaW1lfSBmcm9tICcuL2NvbnZlcnNpb24nO1xuZXhwb3J0IHtnZXRUaW1lT2ZEYXl9IGZyb20gJy4vc3BlY2lhbEZvcm1hdHMnO1xuIl0sIm5hbWVzIjpbImlzTG9jYWxEYXRlTGlrZSIsImRhdGUiLCJ1bmRlZmluZWQiLCJfeWVhciIsIl9tb250aCIsIl9kYXkiLCJpc0xvY2FsVGltZUxpa2UiLCJ0aW1lIiwiX2hvdXIiLCJfbWludXRlIiwiX3NlY29uZCIsIl9uYW5vIiwiaXNvODYwMURhdGVPbmx5IiwiaXNvODYwMUNvbnRhaW5zWm9uZSIsImlzbzg2MDFUaW1lT25seSIsInRvTG9jYWxEYXRlIiwiem9uZSIsIlpvbmVJZCIsIlNZU1RFTSIsIkxvY2FsRGF0ZSIsIkxvY2FsRGF0ZVRpbWUiLCJab25lZERhdGVUaW1lIiwib2ZFcG9jaERheSIsIkRhdGUiLCJmcm9tIiwib2YiLCJ0ZXN0IiwicGFyc2UiLCJFcnJvciIsInRvRXBvY2hEYXkiLCJ0b0xvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGUiLCJ5ZWFyIiwibW9udGhWYWx1ZSIsImRheU9mTW9udGgiLCJ0b0RhdGUiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibmFubyIsIkxvY2FsVGltZSIsInRvTG9jYWxUaW1lIiwib2ZTZWNvbmRPZkRheSIsIkZvcm1hdERhdGVUeXBlIiwiZm9ybWF0RGF0ZSIsIm9iaiIsInR5cGUiLCJzaG9ydCIsImZvcm1hdCIsImwiLCJkYXRlRm9ybWF0IiwidGltZUZvcm1hdCIsIm1lZGl1bSIsImxvbmciLCJmb3JtYXRTdHJpbmciLCJ0cmltIiwiZm9ybWF0dGVyIiwiRGF0ZVRpbWVGb3JtYXR0ZXIiLCJvZlBhdHRlcm4iLCJ3aXRoTG9jYWxlIiwiTG9jYWxlIiwiRU5HTElTSCIsInJlcGxhY2UiLCJ4IiwidG9Mb3dlckNhc2UiLCJnZXRNb250aE5hbWVzIiwibGltaXRUb0N1cnJlbnRNb250aCIsImFycmF5IiwiY3VycmVudFllYXIiLCJnZXRGdWxsWWVhciIsImN1cnJlbnRNb250aCIsImdldE1vbnRoIiwic2xpY2UiLCJnZXROdW1iZXJPZkRheXNJbk1vbnRoIiwibW9udGgiLCJsaW1pdFRvQ3VycmVudERheSIsImFzQXJyYXkiLCJkYXlzIiwiZ2V0RGF0ZSIsImRheXNBcnJheSIsImkiLCJwdXNoIiwiZ2V0VGltZU9mRGF5IiwiZ2V0IiwiQ2hyb25vRmllbGQiLCJDTE9DS19IT1VSX09GX0FNUE0iLCJ0b1N0cmluZyIsImNvbmNhdCIsInRpbWVPZkRheSJdLCJzb3VyY2VSb290IjoiIn0=
\No newline at end of file