angular-l10n
Version:
Angular library to translate texts, dates and numbers
167 lines • 25.3 kB
JavaScript
import { l10nError } from './l10n-error';
export function validateLanguage(language) {
const regExp = new RegExp(/^([a-z]{2,3})(\-[A-Z][a-z]{3})?(\-[A-Z]{2})?(-u.+)?$/);
return regExp.test(language);
}
export function formatLanguage(language, format) {
if (language == null || language === '')
return '';
if (!validateLanguage(language))
throw l10nError(formatLanguage, 'Invalid language');
const [, LANGUAGE = '', SCRIPT = '', REGION = ''] = language.match(/^([a-z]{2,3})(\-[A-Z][a-z]{3})?(\-[A-Z]{2})?/) || [];
switch (format) {
case 'language':
return LANGUAGE;
case 'language-script':
return LANGUAGE + SCRIPT;
case 'language-region':
return LANGUAGE + REGION;
case 'language-script-region':
return LANGUAGE + SCRIPT + REGION;
}
}
export function parseLanguage(language) {
const groups = language.match(/^([a-z]{2,3})(\-([A-Z][a-z]{3}))?(\-([A-Z]{2}))?(-u.+)?$/);
if (groups == null)
throw l10nError(parseLanguage, 'Invalid language');
return {
language: groups[1],
script: groups[3],
region: groups[5],
extension: groups[6]
};
}
export function getBrowserLanguage(format) {
let browserLanguage = null;
if (typeof navigator !== 'undefined' && navigator.language) {
switch (format) {
case 'language-region':
case 'language-script-region':
browserLanguage = navigator.language;
break;
default:
browserLanguage = navigator.language.split('-')[0];
}
}
return browserLanguage;
}
export function getSchema(schema, language, format) {
const element = schema.find(item => formatLanguage(item.locale.language, format) === language);
return element;
}
export function getValue(key, data, keySeparator) {
if (data) {
if (keySeparator) {
return key.split(keySeparator).reduce((acc, cur) => (acc && acc[cur]) != null ? acc[cur] : null, data);
}
return data[key] != null ? data[key] : null;
}
return null;
}
export function handleParams(value, params) {
const replacedValue = value.replace(/{{\s?([^{}\s]*)\s?}}/g, (substring, parsedKey) => {
const replacer = params[parsedKey];
return replacer !== undefined ? replacer : substring;
});
return replacedValue;
}
export function mergeDeep(target, source) {
const output = Object.assign({}, target);
if (isObject(target) && isObject(source)) {
Object.keys(source).forEach((key) => {
if (isObject(source[key])) {
if (!(key in target)) {
Object.assign(output, { [key]: source[key] });
}
else {
output[key] = mergeDeep(target[key], source[key]);
}
}
else {
Object.assign(output, { [key]: source[key] });
}
});
}
return output;
}
export function toNumber(value) {
const parsedValue = typeof value === 'string' && !isNaN(+value - parseFloat(value)) ? +value : value;
return parsedValue;
}
export function toDate(value) {
if (isDate(value)) {
return value;
}
if (typeof value === 'number' && !isNaN(value)) {
return new Date(value);
}
if (typeof value === 'string') {
value = value.trim();
if (!isNaN(value - parseFloat(value))) {
return new Date(parseFloat(value));
}
if (/^(\d{4}-\d{1,2}-\d{1,2})$/.test(value)) {
const [y, m, d] = value.split('-').map((val) => +val);
return new Date(y, m - 1, d);
}
const match = value.match(/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/);
if (match) {
return isoStringToDate(match);
}
}
const date = new Date(value);
if (!isDate(date)) {
throw l10nError(toDate, 'Invalid date');
}
return date;
}
export const PARSE_DATE_STYLE = {
full: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' },
long: { year: 'numeric', month: 'long', day: 'numeric' },
medium: { year: 'numeric', month: 'short', day: 'numeric' },
short: { year: '2-digit', month: 'numeric', day: 'numeric' }
};
export const PARSE_TIME_STYLE = {
full: { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'long' },
long: { hour: 'numeric', minute: 'numeric', second: 'numeric', timeZoneName: 'short' },
medium: { hour: 'numeric', minute: 'numeric', second: 'numeric' },
short: { hour: 'numeric', minute: 'numeric' }
};
export function parseDigits(digits) {
const groups = digits.match(/^(\d+)?\.((\d+)(\-(\d+))?)?$/);
if (groups == null)
throw l10nError(parseDigits, 'Invalid digits');
return {
minimumIntegerDigits: groups[1] ? parseInt(groups[1]) : undefined,
minimumFractionDigits: groups[3] ? parseInt(groups[3]) : undefined,
maximumFractionDigits: groups[5] ? parseInt(groups[5]) : undefined,
};
}
function isObject(item) {
return typeof item === 'object' && !Array.isArray(item);
}
function isDate(value) {
return value instanceof Date && !isNaN(value.valueOf());
}
/**
* Converts a date in ISO 8601 to a Date.
*/
function isoStringToDate(match) {
const date = new Date(0);
let tzHour = 0;
let tzMin = 0;
const dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;
const timeSetter = match[8] ? date.setUTCHours : date.setHours;
if (match[9]) {
tzHour = Number(match[9] + match[10]);
tzMin = Number(match[9] + match[11]);
}
dateSetter.call(date, Number(match[1]), Number(match[2]) - 1, Number(match[3]));
const h = Number(match[4] || 0) - tzHour;
const m = Number(match[5] || 0) - tzMin;
const s = Number(match[6] || 0);
const ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
timeSetter.call(date, h, m, s, ms);
return date;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWwxMG4vc3JjL2xpYi9tb2RlbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUNsRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUFrQjtJQUMvRCxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksUUFBUSxLQUFLLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQUUsTUFBTSxTQUFTLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFckYsTUFBTSxDQUFDLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pILFFBQVEsTUFBTSxFQUFFO1FBQ1osS0FBSyxVQUFVO1lBQ1gsT0FBTyxRQUFRLENBQUM7UUFDcEIsS0FBSyxpQkFBaUI7WUFDbEIsT0FBTyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzdCLEtBQUssaUJBQWlCO1lBQ2xCLE9BQU8sUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUM3QixLQUFLLHdCQUF3QjtZQUN6QixPQUFPLFFBQVEsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0tBQ3pDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxh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TDEwblNjaGVtYSB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBsMTBuRXJyb3IgfSBmcm9tICcuL2wxMG4tZXJyb3InO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cCgvXihbYS16XXsyLDN9KShcXC1bQS1aXVthLXpdezN9KT8oXFwtW0EtWl17Mn0pPygtdS4rKT8kLyk7XHJcbiAgICByZXR1cm4gcmVnRXhwLnRlc3QobGFuZ3VhZ2UpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZywgZm9ybWF0OiBMMTBuRm9ybWF0KTogc3RyaW5nIHtcclxuICAgIGlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgaWYgKCF2YWxpZGF0ZUxhbmd1YWdlKGxhbmd1YWdlKSkgdGhyb3cgbDEwbkVycm9yKGZvcm1hdExhbmd1YWdlLCAnSW52YWxpZCBsYW5ndWFnZScpO1xyXG5cclxuICAgIGNvbnN0IFssIExBTkdVQUdFID0gJycsIFNDUklQVCA9ICcnLCBSRUdJT04gPSAnJ10gPSBsYW5ndWFnZS5tYXRjaCgvXihbYS16XXsyLDN9KShcXC1bQS1aXVthLXpdezN9KT8oXFwtW0EtWl17Mn0pPy8pIHx8IFtdO1xyXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgICBjYXNlICdsYW5ndWFnZSc6XHJcbiAgICAgICAgICAgIHJldHVybiBMQU5HVUFHRTtcclxuICAgICAgICBjYXNlICdsYW5ndWFnZS1zY3JpcHQnOlxyXG4gICAgICAgICAgICByZXR1cm4gTEFOR1VBR0UgKyBTQ1JJUFQ7XHJcbiAgICAgICAgY2FzZSAnbGFuZ3VhZ2UtcmVnaW9uJzpcclxuICAgICAgICAgICAgcmV0dXJuIExBTkdVQUdFICsgUkVHSU9OO1xyXG4gICAgICAgIGNhc2UgJ2xhbmd1YWdlLXNjcmlwdC1yZWdpb24nOlxyXG4gICAgICAgICAgICByZXR1cm4gTEFOR1VBR0UgKyBTQ1JJUFQgKyBSRUdJT047XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IGxhbmd1YWdlLm1hdGNoKC9eKFthLXpdezIsM30pKFxcLShbQS1aXVthLXpdezN9KSk/KFxcLShbQS1aXXsyfSkpPygtdS4rKT8kLyk7XHJcbiAgICBpZiAoZ3JvdXBzID09IG51bGwpIHRocm93IGwxMG5FcnJvcihwYXJzZUxhbmd1YWdlLCAnSW52YWxpZCBsYW5ndWFnZScpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbGFuZ3VhZ2U6IGdyb3Vwc1sxXSxcclxuICAgICAgICBzY3JpcHQ6IGdyb3Vwc1szXSxcclxuICAgICAgICByZWdpb246IGdyb3Vwc1s1XSxcclxuICAgICAgICBleHRlbnNpb246IGdyb3Vwc1s2XVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJMYW5ndWFnZShmb3JtYXQ6IEwxMG5Gb3JtYXQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxldCBicm93c2VyTGFuZ3VhZ2UgPSBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5sYW5ndWFnZSkge1xyXG4gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xhbmd1YWdlLXJlZ2lvbic6XHJcbiAgICAgICAgICAgIGNhc2UgJ2xhbmd1YWdlLXNjcmlwdC1yZWdpb24nOlxyXG4gICAgICAgICAgICAgICAgYnJvd3Nlckxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicm93c2VyTGFuZ3VhZ2UgPSBuYXZpZ2F0b3IubGFuZ3VhZ2Uuc3BsaXQoJy0nKVswXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hKHNjaGVtYTogTDEwblNjaGVtYVtdLCBsYW5ndWFnZTogc3RyaW5nLCBmb3JtYXQ6IEwxMG5Gb3JtYXQpOiBMMTBuU2NoZW1hIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY2hlbWEuZmluZChpdGVtID0+IGZvcm1hdExhbmd1YWdlKGl0ZW0ubG9jYWxlLmxhbmd1YWdlLCBmb3JtYXQpID09PSBsYW5ndWFnZSk7XHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlKGtleTogc3RyaW5nLCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXlTZXBhcmF0b3I6IHN0cmluZyk6IHN0cmluZyB8IGFueSB8IG51bGwge1xyXG4gICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBpZiAoa2V5U2VwYXJhdG9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkuc3BsaXQoa2V5U2VwYXJhdG9yKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjICYmIGFjY1tjdXJdKSAhPSBudWxsID8gYWNjW2N1cl0gOiBudWxsLCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGFba2V5XSAhPSBudWxsID8gZGF0YVtrZXldIDogbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGFyYW1zKHZhbHVlOiBzdHJpbmcsIHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlcGxhY2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC97e1xccz8oW157fVxcc10qKVxccz99fS9nLCAoc3Vic3RyaW5nOiBzdHJpbmcsIHBhcnNlZEtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVwbGFjZXIgPSBwYXJhbXNbcGFyc2VkS2V5XTtcclxuICAgICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZCA/IHJlcGxhY2VyIDogc3Vic3RyaW5nO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVwbGFjZWRWYWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcCh0YXJnZXQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIHNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IGFueSB7XHJcbiAgICBjb25zdCBvdXRwdXQgPSBPYmplY3QuYXNzaWduKHt9LCB0YXJnZXQpO1xyXG5cclxuICAgIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogYW55KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oK3ZhbHVlIC0gcGFyc2VGbG9hdCh2YWx1ZSkpID8gK3ZhbHVlIDogdmFsdWU7XHJcbiAgICByZXR1cm4gcGFyc2VkVmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWU6IGFueSk6IERhdGUge1xyXG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUgLSBwYXJzZUZsb2F0KHZhbHVlKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBhcnNlRmxvYXQodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKC9eKFxcZHs0fS1cXGR7MSwyfS1cXGR7MSwyfSkkLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSB2YWx1ZS5zcGxpdCgnLScpLm1hcCgodmFsOiBzdHJpbmcpID0+ICt2YWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSAtIDEsIGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFxcZHs0fSktPyhcXGRcXGQpLT8oXFxkXFxkKSg/OlQoXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86XFwuKFxcZCspKT8pPyk/KFp8KFsrLV0pKFxcZFxcZCk6PyhcXGRcXGQpKT8pPyQvKTtcclxuICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzb1N0cmluZ1RvRGF0ZShtYXRjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBhbnkpO1xyXG4gICAgaWYgKCFpc0RhdGUoZGF0ZSkpIHtcclxuICAgICAgICB0aHJvdyBsMTBuRXJyb3IodG9EYXRlLCAnSW52YWxpZCBkYXRlJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFBBUlNFX0RBVEVfU1RZTEU6IHsgW2Zvcm1hdDogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBmdWxsOiB7IHdlZWtkYXk6ICdsb25nJywgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9LFxyXG4gICAgbG9uZzogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0sXHJcbiAgICBtZWRpdW06IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfSxcclxuICAgIHNob3J0OiB7IHllYXI6ICcyLWRpZ2l0JywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFBBUlNFX1RJTUVfU1RZTEU6IHsgW2Zvcm1hdDogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBmdWxsOiB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycsIHNlY29uZDogJ251bWVyaWMnLCB0aW1lWm9uZU5hbWU6ICdsb25nJyB9LFxyXG4gICAgbG9uZzogeyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJ251bWVyaWMnLCBzZWNvbmQ6ICdudW1lcmljJywgdGltZVpvbmVOYW1lOiAnc2hvcnQnIH0sXHJcbiAgICBtZWRpdW06IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJywgc2Vjb25kOiAnbnVtZXJpYycgfSxcclxuICAgIHNob3J0OiB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKGRpZ2l0czogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBncm91cHMgPSBkaWdpdHMubWF0Y2goL14oXFxkKyk/XFwuKChcXGQrKShcXC0oXFxkKykpPyk/JC8pO1xyXG4gICAgaWYgKGdyb3VwcyA9PSBudWxsKSB0aHJvdyBsMTBuRXJyb3IocGFyc2VEaWdpdHMsICdJbnZhbGlkIGRpZ2l0cycpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbWluaW11bUludGVnZXJEaWdpdHM6IGdyb3Vwc1sxXSA/IHBhcnNlSW50KGdyb3Vwc1sxXSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBncm91cHNbM10gPyBwYXJzZUludChncm91cHNbM10pIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZ3JvdXBzWzVdID8gcGFyc2VJbnQoZ3JvdXBzWzVdKSA6IHVuZGVmaW5lZCxcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzT2JqZWN0KGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBEYXRlIHtcclxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIGRhdGUgaW4gSVNPIDg2MDEgdG8gYSBEYXRlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5KTogRGF0ZSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XHJcbiAgICBsZXQgdHpIb3VyID0gMDtcclxuICAgIGxldCB0ek1pbiA9IDA7XHJcbiAgICBjb25zdCBkYXRlU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0Z1bGxZZWFyIDogZGF0ZS5zZXRGdWxsWWVhcjtcclxuICAgIGNvbnN0IHRpbWVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDSG91cnMgOiBkYXRlLnNldEhvdXJzO1xyXG4gICAgaWYgKG1hdGNoWzldKSB7XHJcbiAgICAgICAgdHpIb3VyID0gTnVtYmVyKG1hdGNoWzldICsgbWF0Y2hbMTBdKTtcclxuICAgICAgICB0ek1pbiA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzExXSk7XHJcbiAgICB9XHJcbiAgICBkYXRlU2V0dGVyLmNhbGwoZGF0ZSwgTnVtYmVyKG1hdGNoWzFdKSwgTnVtYmVyKG1hdGNoWzJdKSAtIDEsIE51bWJlcihtYXRjaFszXSkpO1xyXG4gICAgY29uc3QgaCA9IE51bWJlcihtYXRjaFs0XSB8fCAwKSAtIHR6SG91cjtcclxuICAgIGNvbnN0IG0gPSBOdW1iZXIobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjtcclxuICAgIGNvbnN0IHMgPSBOdW1iZXIobWF0Y2hbNl0gfHwgMCk7XHJcbiAgICBjb25zdCBtcyA9IE1hdGgucm91bmQocGFyc2VGbG9hdCgnMC4nICsgKG1hdGNoWzddIHx8IDApKSAqIDEwMDApO1xyXG4gICAgdGltZVNldHRlci5jYWxsKGRhdGUsIGgsIG0sIHMsIG1zKTtcclxuICAgIHJldHVybiBkYXRlO1xyXG59XHJcbiJdfQ==