ng-timeparser
Version:
[](https://badge.fury.io/js/ng-timeparser) [](https://travis-ci.org/feeloor/ng-timeparser)
222 lines (221 loc) • 22.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
var TimeParserService = /** @class */ (function () {
function TimeParserService() {
}
/**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
TimeParserService.prototype.parseTime = /**
* Parses given time-string to a correct 4 digit time or empty if it's an invalid time
* @param {?} inputTime Time-string to parse
* @param {?=} militaryTime Use military time (24 hour format)
* @return {?}
*/
function (inputTime, militaryTime) {
if (militaryTime === void 0) { militaryTime = false; }
var /** @type {?} */ returnTime = '';
var /** @type {?} */ correctFormat = false;
var /** @type {?} */ time = inputTime;
// English (12 hours pattern)
if (!militaryTime) {
if (new RegExp(/^[2-9][0-9].*$/).test(time) && (time.match(/\d/g) || []).length !== 3) {
// Matches 22 or 22 PM but not 321 or 321 PM/AM
correctFormat = false;
time = '';
}
else if (new RegExp(/^[0-1][0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 07:30 or 07:30 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 5);
}
else if (new RegExp(/^[0-1][0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 0730 or 0730 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9]:[0-5][0-9].*$/).test(time)) {
// Matches for example 9:33 and 9:33 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 4);
}
else if (new RegExp(/^[0-9][0-5][0-9].*$/).test(time)) {
// Matches for example 933 and 933 PM/AM
correctFormat = true;
time = "0" + this.addAMorPM(time, 0, 3);
}
else if (new RegExp(/^[0-1][0-2].*$/).test(time)) {
// Matches 12 or 12 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 2);
}
else if (new RegExp(/^[0-9].*$/).test(time)) {
// Matches for example 3 and 3 PM/AM
correctFormat = true;
time = this.addAMorPM(time, 0, 1);
}
// French / Military Time (24 hours pattern)
}
else {
if (new RegExp(/^[0-2][0-9]:[0-5][0-9]$/).test(time)) {
// Matches 17:30
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9][0-5][0-9]$/).test(time)) {
// Matches 1730
correctFormat = true;
}
else if (new RegExp(/^[0-2][0-9]:[0-5]$/).test(time)) {
// Matches 22:3
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-2][0-9][0-5]$/).test(time)) {
// Matches 223
correctFormat = true;
time = time + "0";
}
else if (new RegExp(/^[0-9]:[0-5][0-9]$/).test(time)) {
// Matches 7:30
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-9][0-5][0-9]$/).test(time)) {
// Matches 730
correctFormat = true;
time = "0" + time;
}
else if (new RegExp(/^[0-2][0-9]/).test(time)) {
// Matches 19
correctFormat = true;
time = time + "00";
}
else if (new RegExp(/^[0-9]/).test(time)) {
// Matches 9
correctFormat = true;
time = "0" + time + "00";
}
}
// Create return data
if (correctFormat) {
time = time.toUpperCase();
time = this.makeTime4Digit(time);
returnTime = this.addColonIfMissing(time);
if (militaryTime) {
returnTime = returnTime.substring(0, 5);
}
}
else {
returnTime = '';
}
return returnTime;
};
/**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
TimeParserService.prototype.makeTime4Digit = /**
* Parses a valid time to a 4 digit time
* For example 4 PM to 04:00 PM or 4:30 PM to 04:30 PM
* @param {?} time Time-string to parse to 4 digit
* @return {?}
*/
function (time) {
var /** @type {?} */ preAMorPM = '';
var /** @type {?} */ parsed = time;
// Get any existing AM/PM
if (new RegExp(/PM/i).test(time)) {
preAMorPM = 'PM';
parsed = parsed.replace(/PM/i, '');
}
else if (new RegExp(/AM/i).test(time)) {
preAMorPM = 'AM';
parsed = parsed.replace(/AM/i, '');
}
parsed = parsed.replace(':', '');
parsed = parsed.replace(/ /g, '');
if (parsed.length === 1) {
parsed = "0" + parsed + "00";
}
else if (parsed.length === 2) {
parsed = parsed + "00";
}
else if (parsed.length === 3) {
if (new RegExp(/^[0-1][0-9][0-5]/).test(parsed)) {
parsed = parsed + "0";
}
else if (new RegExp(/^[0-9][0-5][0-9]/).test(parsed)) {
parsed = "0" + parsed;
}
}
return "" + parsed + (preAMorPM ? ' ' + preAMorPM : '');
};
/**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
TimeParserService.prototype.addColonIfMissing = /**
* Adds a colon if it's missing to given time-string
* For example 0400 to 04:00
* @param {?} time Time-string to add missing colon to
* @return {?}
*/
function (time) {
if (time.indexOf(':') === -1) {
return time.substring(0, 2) + ":" + time.substring(2);
}
return time;
};
/**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
TimeParserService.prototype.addAMorPM = /**
* Takes start and end of time-string and then adds correct AM/PM
* @param {?} time Time-string to add AM or PM too
* @param {?} start Where time starts in string
* @param {?} end Where time ends in string
* @return {?}
*/
function (time, start, end) {
if (new RegExp(/PM/i).test(time)) {
return time.substring(start, end) + " PM";
}
else if (new RegExp(/AM/i).test(time)) {
return time.substring(start, end) + " AM";
}
else {
return time.substring(start, end) + " PM";
}
};
TimeParserService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
TimeParserService.ctorParameters = function () { return []; };
return TimeParserService;
}());
export { TimeParserService };
function TimeParserService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TimeParserService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TimeParserService.ctorParameters;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXRpbWVwYXJzZXIvIiwic291cmNlcyI6WyJzcmMvYXBwL3RpbWUtcGFyc2VyL3NlcnZpY2VzL3RpbWUtcGFyc2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0lBS3pDO0tBQWlCOzs7Ozs7O0lBT1YscUNBQVM7Ozs7OztjQUFDLFNBQWlCLEVBQUUsWUFBNkI7UUFBN0IsNkJBQUEsRUFBQSxvQkFBNkI7UUFDL0QscUJBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFCLHFCQUFJLElBQUksR0FBRyxTQUFTLENBQUM7O1FBR3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV0RixhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFOUQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUU3RCxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ25DO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXpELGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksR0FBRyxNQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUcsQ0FBQzthQUN6QztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV4RCxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEdBQUcsTUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFHLENBQUM7YUFDekM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFbkQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFOUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuQzs7U0FFRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFckQsYUFBYSxHQUFHLElBQUksQ0FBQzthQUN0QjtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUUzRCxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQ3RCO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXZELGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksR0FBTSxJQUFJLE1BQUcsQ0FBQzthQUNuQjtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV0RCxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEdBQU0sSUFBSSxNQUFHLENBQUM7YUFDbkI7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFdkQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFHLE1BQUksSUFBTSxDQUFDO2FBQ25CO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXRELGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksR0FBRyxNQUFJLElBQU0sQ0FBQzthQUNuQjtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFaEQsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxHQUFNLElBQUksT0FBSSxDQUFDO2FBQ3BCO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUUzQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLEdBQUcsTUFBSSxJQUFJLE9BQUksQ0FBQzthQUNyQjtTQUNGOztRQUdELEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN6QztTQUNGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Ozs7Ozs7SUFRWiwwQ0FBYzs7Ozs7O2NBQUMsSUFBWTtRQUNqQyxxQkFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLHFCQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O1FBR2xCLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNqQixNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDcEM7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNwQztRQUVELE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxNQUFJLE1BQU0sT0FBSSxDQUFDO1NBQ3pCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLEdBQU0sTUFBTSxPQUFJLENBQUM7U0FDeEI7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxHQUFNLE1BQU0sTUFBRyxDQUFDO2FBQ3ZCO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxHQUFHLE1BQUksTUFBUSxDQUFDO2FBQ3ZCO1NBQ0Y7UUFFRCxNQUFNLENBQUMsS0FBRyxNQUFNLElBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQzs7Ozs7Ozs7SUFRaEQsNkNBQWlCOzs7Ozs7Y0FBQyxJQUFZO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRyxDQUFDO1NBQ3ZEO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7O0lBU04scUNBQVM7Ozs7Ozs7Y0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFDeEQsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQUssQ0FBQztTQUMzQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBSyxDQUFDO1NBQzNDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixNQUFNLENBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQUssQ0FBQztTQUMzQzs7O2dCQTdKSixVQUFVOzs7OzRCQUZYOztTQUdhLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpbWVQYXJzZXJTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZ2l2ZW4gdGltZS1zdHJpbmcgdG8gYSBjb3JyZWN0IDQgZGlnaXQgdGltZSBvciBlbXB0eSBpZiBpdCdzIGFuIGludmFsaWQgdGltZVxuICAgKiBAcGFyYW0gaW5wdXRUaW1lIFRpbWUtc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSBtaWxpdGFyeVRpbWUgVXNlIG1pbGl0YXJ5IHRpbWUgKDI0IGhvdXIgZm9ybWF0KVxuICAgKi9cbiAgcHVibGljIHBhcnNlVGltZShpbnB1dFRpbWU6IHN0cmluZywgbWlsaXRhcnlUaW1lOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGxldCByZXR1cm5UaW1lID0gJyc7XG4gICAgbGV0IGNvcnJlY3RGb3JtYXQgPSBmYWxzZTtcbiAgICBsZXQgdGltZSA9IGlucHV0VGltZTtcblxuICAgIC8vIEVuZ2xpc2ggKDEyIGhvdXJzIHBhdHRlcm4pXG4gICAgaWYgKCFtaWxpdGFyeVRpbWUpIHtcbiAgICAgIGlmIChuZXcgUmVnRXhwKC9eWzItOV1bMC05XS4qJC8pLnRlc3QodGltZSkgJiYgKHRpbWUubWF0Y2goL1xcZC9nKSB8fCBbXSkubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMjIgb3IgMjIgUE0gYnV0IG5vdCAzMjEgb3IgMzIxIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSBmYWxzZTtcbiAgICAgICAgdGltZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMV1bMC05XTpbMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDA3OjMwIG9yIDA3OjMwIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gdGhpcy5hZGRBTW9yUE0odGltZSwgMCwgNSk7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldWzAtNV1bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSAwNzMwIG9yIDA3MzAgUE0vQU1cbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSB0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA0KTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTldOlswLTVdWzAtOV0uKiQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgZm9yIGV4YW1wbGUgOTozMyBhbmQgOTozMyBQTS9BTVxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aGlzLmFkZEFNb3JQTSh0aW1lLCAwLCA0KX1gO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV1bMC01XVswLTldLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIGZvciBleGFtcGxlIDkzMyBhbmQgOTMzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RoaXMuYWRkQU1vclBNKHRpbWUsIDAsIDMpfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTJdLiokLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDEyIG9yIDEyIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gdGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMik7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XS4qJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBmb3IgZXhhbXBsZSAzIGFuZCAzIFBNL0FNXG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gdGhpcy5hZGRBTW9yUE0odGltZSwgMCwgMSk7XG4gICAgICB9XG4gICAgICAvLyBGcmVuY2ggLyBNaWxpdGFyeSBUaW1lICgyNCBob3VycyBwYXR0ZXJuKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV06WzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTc6MzBcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldWzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgMTczMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvXlswLTJdWzAtOV06WzAtNV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDIyOjNcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTBgO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtMl1bMC05XVswLTVdJC8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyAyMjNcbiAgICAgICAgY29ycmVjdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIHRpbWUgPSBgJHt0aW1lfTBgO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV06WzAtNV1bMC05XSQvKS50ZXN0KHRpbWUpKSB7XG4gICAgICAgIC8vIE1hdGNoZXMgNzozMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aW1lfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XVswLTVdWzAtOV0kLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDczMFxuICAgICAgICBjb3JyZWN0Rm9ybWF0ID0gdHJ1ZTtcbiAgICAgICAgdGltZSA9IGAwJHt0aW1lfWA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC0yXVswLTldLykudGVzdCh0aW1lKSkge1xuICAgICAgICAvLyBNYXRjaGVzIDE5XG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYCR7dGltZX0wMGA7XG4gICAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL15bMC05XS8pLnRlc3QodGltZSkpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyA5XG4gICAgICAgIGNvcnJlY3RGb3JtYXQgPSB0cnVlO1xuICAgICAgICB0aW1lID0gYDAke3RpbWV9MDBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gZGF0YVxuICAgIGlmIChjb3JyZWN0Rm9ybWF0KSB7XG4gICAgICB0aW1lID0gdGltZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgdGltZSA9IHRoaXMubWFrZVRpbWU0RGlnaXQodGltZSk7XG4gICAgICByZXR1cm5UaW1lID0gdGhpcy5hZGRDb2xvbklmTWlzc2luZyh0aW1lKTtcblxuICAgICAgaWYgKG1pbGl0YXJ5VGltZSkge1xuICAgICAgICByZXR1cm5UaW1lID0gcmV0dXJuVGltZS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblRpbWUgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB2YWxpZCB0aW1lIHRvIGEgNCBkaWdpdCB0aW1lXG4gICAqIEZvciBleGFtcGxlIDQgUE0gdG8gMDQ6MDAgUE0gb3IgNDozMCBQTSB0byAwNDozMCBQTVxuICAgKiBAcGFyYW0gdGltZSBUaW1lLXN0cmluZyB0byBwYXJzZSB0byA0IGRpZ2l0XG4gICAqL1xuICBwcml2YXRlIG1ha2VUaW1lNERpZ2l0KHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHByZUFNb3JQTSA9ICcnO1xuICAgIGxldCBwYXJzZWQgPSB0aW1lO1xuXG4gICAgLy8gR2V0IGFueSBleGlzdGluZyBBTS9QTVxuICAgIGlmIChuZXcgUmVnRXhwKC9QTS9pKS50ZXN0KHRpbWUpKSB7XG4gICAgICBwcmVBTW9yUE0gPSAnUE0nO1xuICAgICAgcGFyc2VkID0gcGFyc2VkLnJlcGxhY2UoL1BNL2ksICcnKTtcbiAgICB9IGVsc2UgaWYgKG5ldyBSZWdFeHAoL0FNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHByZUFNb3JQTSA9ICdBTSc7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQucmVwbGFjZSgvQU0vaSwgJycpO1xuICAgIH1cblxuICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKCc6JywgJycpO1xuICAgIHBhcnNlZCA9IHBhcnNlZC5yZXBsYWNlKC8gL2csICcnKTtcbiAgICBpZiAocGFyc2VkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcGFyc2VkID0gYDAke3BhcnNlZH0wMGA7XG4gICAgfSBlbHNlIGlmIChwYXJzZWQubGVuZ3RoID09PSAyKSB7XG4gICAgICBwYXJzZWQgPSBgJHtwYXJzZWR9MDBgO1xuICAgIH0gZWxzZSBpZiAocGFyc2VkLmxlbmd0aCA9PT0gMykge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoL15bMC0xXVswLTldWzAtNV0vKS50ZXN0KHBhcnNlZCkpIHtcbiAgICAgICAgcGFyc2VkID0gYCR7cGFyc2VkfTBgO1xuICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKC9eWzAtOV1bMC01XVswLTldLykudGVzdChwYXJzZWQpKSB7XG4gICAgICAgIHBhcnNlZCA9IGAwJHtwYXJzZWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cGFyc2VkfSR7cHJlQU1vclBNID8gJyAnICsgcHJlQU1vclBNIDogJyd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29sb24gaWYgaXQncyBtaXNzaW5nIHRvIGdpdmVuIHRpbWUtc3RyaW5nXG4gICAqIEZvciBleGFtcGxlIDA0MDAgdG8gMDQ6MDBcbiAgICogQHBhcmFtIHRpbWUgVGltZS1zdHJpbmcgdG8gYWRkIG1pc3NpbmcgY29sb24gdG9cbiAgICovXG4gIHByaXZhdGUgYWRkQ29sb25JZk1pc3NpbmcodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGltZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gYCR7dGltZS5zdWJzdHJpbmcoMCwgMil9OiR7dGltZS5zdWJzdHJpbmcoMil9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRpbWU7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgc3RhcnQgYW5kIGVuZCBvZiB0aW1lLXN0cmluZyBhbmQgdGhlbiBhZGRzIGNvcnJlY3QgQU0vUE1cbiAgICogQHBhcmFtIHRpbWUgVGltZS1zdHJpbmcgdG8gYWRkIEFNIG9yIFBNIHRvb1xuICAgKiBAcGFyYW0gc3RhcnQgV2hlcmUgdGltZSBzdGFydHMgaW4gc3RyaW5nXG4gICAqIEBwYXJhbSBlbmQgV2hlcmUgdGltZSBlbmRzIGluIHN0cmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRBTW9yUE0odGltZTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKG5ldyBSZWdFeHAoL1BNL2kpLnRlc3QodGltZSkpIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKX0gUE1gO1xuICAgIH0gZWxzZSBpZiAobmV3IFJlZ0V4cCgvQU0vaSkudGVzdCh0aW1lKSkge1xuICAgICAgcmV0dXJuIGAke3RpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpfSBBTWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt0aW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKX0gUE1gO1xuICAgIH1cbiAgfVxufVxuIl19