UNPKG

@singleton-i18n/angular-client

Version:

Singleton client code for Angular 10.

185 lines 21.8 kB
/* * Copyright 2019-2021 VMware, Inc. * SPDX-License-Identifier: EPL-2.0 */ /** * verify value if undefined or null */ export function isDefined(value) { return value !== undefined && value !== null && value !== ''; } /** * Format translation string, e.g. 'No custom buckets specified for {0}' */ export function format(message, args) { const templateMatcher = /{\s?([\d]*)\s?}/g; for (let i = 0; i < args.length; i += 1) { message = message.replace(templateMatcher, (substring, b) => { return (b.trim() === i.toString() && isDefined(args[i])) ? args[i] : substring; }); } return message; } export function mergeObject(a, b) { a = a instanceof Object ? a : {}; b = b instanceof Object ? b : {}; // Merge the sub objects with the same key. Object.keys(a).forEach((key) => { if (b[key]) { if ((b[key] instanceof Object) && (a[key] instanceof Object)) { Object.assign(b[key], a[key]); } } }); return Object.assign(a, b); } export function equals(o1, o2) { if (o1 === o2) { return true; } if (o1 === null || o2 === null) { return false; } if (o1 !== o1 && o2 !== o2) { return true; } // NaN === NaN const t1 = typeof o1, t2 = typeof o2; let length, key, keySet; if (t1 === t2 && t1 === 'object') { if (Array.isArray(o1)) { if (!Array.isArray(o2)) { return false; } if ((length = o1.length) === o2.length) { for (key = 0; key < length; key++) { if (!equals(o1[key], o2[key])) { return false; } } return true; } } else { if (Array.isArray(o2)) { return false; } // Dealing with the Date object without any key, but the actual value is different. if (o1 instanceof Date && o2 instanceof Date) { return o1.getTime() === o2.getTime(); } keySet = Object.create(null); for (key in o1) { if (!equals(o1[key], o2[key])) { return false; } else { keySet[key] = true; } } for (key in o2) { if (!(key in keySet) && typeof o2[key] !== 'undefined') { return false; } } return true; } } return false; } /* * Mixin class decorator * * Based on * https://medium.com/@dmyl/mixins-as-class-decorators-in-typescript-angular2-8e09f1bc1f02 * * with minor modifications to support an opaque data object * stored in the object prototype as `mixinData` */ export function Mixin(baseCtors, data) { return function (derivedCtor) { derivedCtor.prototype.mixinData = data; baseCtors.forEach(baseCtor => { Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => { const descriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name); if (name === 'constructor') { return; } if (descriptor && (!descriptor.writable || !descriptor.configurable || !descriptor.enumerable || descriptor.get || descriptor.set)) { Object.defineProperty(derivedCtor.prototype, name, descriptor); } else { derivedCtor.prototype[name] = baseCtor.prototype[name]; } }); }); }; } /** * Returns the culture language code name from the browser, e.g. "de-DE" * @returns string */ export function getBrowserCultureLang() { if (window === undefined || window.navigator === undefined) { return undefined; } let browserCultureLang = window.navigator.languages ? window.navigator.languages[0] : null; browserCultureLang = browserCultureLang || window.navigator.language || window.navigator.browserLanguage || window.navigator.userLanguage; return browserCultureLang; } export function deprecatedWarn(name, version, substitute) { console.warn(`${name} is deprecated, will be removed in ${version}, Please use ${substitute} instead.`); } /** * Merge the key-value pair which defined in each object and * check whether the key is globally unique * TODO: Support object directly * @param target Target object contains all strings * @param source A set of source objects */ export function assign(target, source) { let s; let i; let props; const isObject = (obj) => { return obj && typeof obj === 'object'; }; if (!isObject(target)) { throw new TypeError('Target must be an object'); } for (s = 0; s < source.length; ++s) { let sub; sub = source[s]; if (!isObject(sub)) { throw new TypeError('Source must be an object'); } props = Object.keys(Object(sub)); for (i = 0; i < props.length; ++i) { if (target.hasOwnProperty(props[i])) { console.warn('Duplicate message key:', props[i]); } target[props[i]] = sub[props[i]]; } } return target; } export function isEmptyObject(obj) { if (!isDefined(obj)) { return true; } return Object.keys(obj).length === 0; } export function parseOption(name, range, a) { const res = parseInt(a); if (isNaN(res)) { throw Error(`${name} is not a number`); } if (res < range[0] || res > range[1]) { throw Error(`${name} value is out of range.`); } return res; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ybGlnZW5nL1Byb2plY3RzL0Rldm9wcy9DbGllbnRfQW5ndWxhcl9HaXRIdWJfTnBtanMvdmlwL2NpL3B1YjJvcmcvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3NpbmdsZXRvbi9wcm9qZWN0cy9hbmd1bGFyLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFVO0lBQ2hDLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFlLEVBQUUsSUFBVztJQUMvQyxNQUFNLGVBQWUsR0FBVyxrQkFBa0IsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQWlCLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDeEUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUN0QyxDQUFDLEdBQUcsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakMsQ0FBQyxHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRWpDLDJDQUEyQztJQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDbEIsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNKLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsRUFBRTtnQkFDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakM7U0FDSjtJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxFQUFPLEVBQUUsRUFBTztJQUNuQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztLQUFFO0lBQy9CLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7S0FBRTtJQUNqRCxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0tBQUUsQ0FBQyxjQUFjO0lBQzNELE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxJQUFJLE1BQWMsRUFBRSxHQUFRLEVBQUUsTUFBVyxDQUFDO0lBQzFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFBRSxPQUFPLEtBQUssQ0FBQzthQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BDLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFBRSxPQUFPLEtBQUssQ0FBQztxQkFBRTtpQkFDbkQ7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO2FBQU07WUFDSCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ25CLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsbUZBQW1GO1lBQ25GLElBQUssRUFBRSxZQUFZLElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxFQUFHO2dCQUM1QyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDeEM7WUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixLQUFLLEdBQUcsSUFBSSxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzNCLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtxQkFBTTtvQkFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUN0QjthQUNKO1lBQ0QsS0FBSyxHQUFHLElBQUksRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxXQUFXLEVBQUU7b0JBQ3BELE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDZjtLQUNKO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxTQUFxQixFQUFFLElBQVU7SUFDbkQsT0FBTyxVQUFVLFdBQXFCO1FBQ2xDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFN0UsSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO29CQUN4QixPQUFPO2lCQUNWO2dCQUVELElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7dUJBQzVELENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDaEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDbEU7cUJBQU07b0JBQ0gsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxRDtZQUVMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7QUFDTixDQUFDO0FBS0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQjtJQUNqQyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7UUFDeEQsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFFRCxJQUFJLGtCQUFrQixHQUFRLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2hHLGtCQUFrQixHQUFHLGtCQUFrQjtRQUNuQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVE7UUFDekIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlO1FBQ2hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ2xDLE9BQU8sa0JBQWtCLENBQUM7QUFDOUIsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxVQUFrQjtJQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxzQ0FBc0MsT0FBTyxnQkFBZ0IsVUFBVSxXQUFXLENBQUMsQ0FBQztBQUM1RyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUE2QixFQUFFLE1BQStCO0lBQ2pGLElBQUksQ0FBUyxDQUFDO0lBQ2QsSUFBSSxDQUFTLENBQUM7SUFDZCxJQUFJLEtBQWUsQ0FBQztJQUNwQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFO1FBQzFCLE9BQU8sR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQztJQUMxQyxDQUFDLENBQUM7SUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztLQUNuRDtJQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoQyxJQUFJLEdBQTBCLENBQUM7UUFDL0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUNuRDtRQUNELEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMvQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO0tBQ0o7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFRO0lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztLQUFFO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVksRUFBRSxLQUFlLEVBQUUsQ0FBTTtJQUM3RCxNQUFNLEdBQUcsR0FBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDWixNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQztLQUMxQztJQUVELElBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sS0FBSyxDQUFFLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO0tBQ2pEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE5LTIwMjEgVk13YXJlLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogdmVyaWZ5IHZhbHVlIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJztcbn1cblxuLyoqXG4gKiBGb3JtYXQgdHJhbnNsYXRpb24gc3RyaW5nLCBlLmcuICdObyBjdXN0b20gYnVja2V0cyBzcGVjaWZpZWQgZm9yIHswfSdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChtZXNzYWdlOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgdGVtcGxhdGVNYXRjaGVyOiBSZWdFeHAgPSAve1xccz8oW1xcZF0qKVxccz99L2c7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UodGVtcGxhdGVNYXRjaGVyLCAoc3Vic3RyaW5nOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChiLnRyaW0oKSA9PT0gaS50b1N0cmluZygpICYmIGlzRGVmaW5lZChhcmdzW2ldKSkgPyBhcmdzW2ldIDogc3Vic3RyaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdChhOiBhbnksIGI6IGFueSk6IE9iamVjdCB7XG4gICAgYSA9IGEgaW5zdGFuY2VvZiBPYmplY3QgPyBhIDoge307XG4gICAgYiA9IGIgaW5zdGFuY2VvZiBPYmplY3QgPyBiIDoge307XG5cbiAgICAvLyBNZXJnZSB0aGUgc3ViIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBrZXkuXG4gICAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChcbiAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGJba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICgoYltrZXldIGluc3RhbmNlb2YgT2JqZWN0KSAmJiAoYVtrZXldIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGJba2V5XSwgYVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGEsIGIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobzEgPT09IG8yKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSB7IHJldHVybiB0cnVlOyB9IC8vIE5hTiA9PT0gTmFOXG4gICAgY29uc3QgdDEgPSB0eXBlb2YgbzEsIHQyID0gdHlwZW9mIG8yO1xuICAgIGxldCBsZW5ndGg6IG51bWJlciwga2V5OiBhbnksIGtleVNldDogYW55O1xuICAgIGlmICh0MSA9PT0gdDIgJiYgdDEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG8yKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PT0gbzIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG8yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERlYWxpbmcgd2l0aCB0aGUgRGF0ZSBvYmplY3Qgd2l0aG91dCBhbnkga2V5LCBidXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyBkaWZmZXJlbnQuXG4gICAgICAgICAgICBpZiAoIG8xIGluc3RhbmNlb2YgRGF0ZSAmJiBvMiBpbnN0YW5jZW9mIERhdGUgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldFRpbWUoKSA9PT0gbzIuZ2V0VGltZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5U2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIG8xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVNldFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBrZXlTZXQpICYmIHR5cGVvZiBvMltrZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLypcbiAqIE1peGluIGNsYXNzIGRlY29yYXRvclxuICpcbiAqIEJhc2VkIG9uXG4gKiBodHRwczovL21lZGl1bS5jb20vQGRteWwvbWl4aW5zLWFzLWNsYXNzLWRlY29yYXRvcnMtaW4tdHlwZXNjcmlwdC1hbmd1bGFyMi04ZTA5ZjFiYzFmMDJcbiAqXG4gKiB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8gc3VwcG9ydCBhbiBvcGFxdWUgZGF0YSBvYmplY3RcbiAqIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHByb3RvdHlwZSBhcyBgbWl4aW5EYXRhYFxuICovXG5leHBvcnQgZnVuY3Rpb24gTWl4aW4oYmFzZUN0b3JzOiBGdW5jdGlvbltdLCBkYXRhPzogYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkZXJpdmVkQ3RvcjogRnVuY3Rpb24pIHtcbiAgICAgICAgZGVyaXZlZEN0b3IucHJvdG90eXBlLm1peGluRGF0YSA9IGRhdGE7XG4gICAgICAgIGJhc2VDdG9ycy5mb3JFYWNoKGJhc2VDdG9yID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJhc2VDdG9yLnByb3RvdHlwZSkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlQ3Rvci5wcm90b3R5cGUsIG5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmICghZGVzY3JpcHRvci53cml0YWJsZSB8fCAhZGVzY3JpcHRvci5jb25maWd1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBkZXNjcmlwdG9yLmdldCB8fCBkZXNjcmlwdG9yLnNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlcml2ZWRDdG9yLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZlZEN0b3IucHJvdG90eXBlW25hbWVdID0gYmFzZUN0b3IucHJvdG90eXBlW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5kZWNsYXJlIGludGVyZmFjZSBXaW5kb3cge1xuICAgIG5hdmlnYXRvcjogYW55O1xufVxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFdpbmRvdztcbi8qKlxuICogUmV0dXJucyB0aGUgY3VsdHVyZSBsYW5ndWFnZSBjb2RlIG5hbWUgZnJvbSB0aGUgYnJvd3NlciwgZS5nLiBcImRlLURFXCJcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckN1bHR1cmVMYW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHdpbmRvdyA9PT0gdW5kZWZpbmVkIHx8IHdpbmRvdy5uYXZpZ2F0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBicm93c2VyQ3VsdHVyZUxhbmc6IGFueSA9IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID8gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBudWxsO1xuICAgIGJyb3dzZXJDdWx0dXJlTGFuZyA9IGJyb3dzZXJDdWx0dXJlTGFuZyB8fFxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlIHx8XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuYnJvd3Nlckxhbmd1YWdlIHx8XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlO1xuICAgIHJldHVybiBicm93c2VyQ3VsdHVyZUxhbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGVkV2FybihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgc3Vic3RpdHV0ZTogc3RyaW5nKSB7XG4gICAgY29uc29sZS53YXJuKGAke25hbWV9IGlzIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiAke3ZlcnNpb259LCBQbGVhc2UgdXNlICR7c3Vic3RpdHV0ZX0gaW5zdGVhZC5gKTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUga2V5LXZhbHVlIHBhaXIgd2hpY2ggZGVmaW5lZCBpbiBlYWNoIG9iamVjdCBhbmRcbiAqIGNoZWNrIHdoZXRoZXIgdGhlIGtleSBpcyBnbG9iYWxseSB1bmlxdWVcbiAqIFRPRE86IFN1cHBvcnQgb2JqZWN0IGRpcmVjdGx5XG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QgY29udGFpbnMgYWxsIHN0cmluZ3NcbiAqIEBwYXJhbSBzb3VyY2UgQSBzZXQgb2Ygc291cmNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQ6IHsgW3g6IHN0cmluZ106IGFueTsgfSwgc291cmNlOiB7IFt4OiBzdHJpbmddOiBhbnk7IH1bXSkge1xuICAgIGxldCBzOiBudW1iZXI7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBsZXQgcHJvcHM6IHN0cmluZ1tdO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gKG9iajogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7XG4gICAgfTtcbiAgICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGZvciAocyA9IDA7IHMgPCBzb3VyY2UubGVuZ3RoOyArK3MpIHtcbiAgICAgICAgbGV0IHN1YjogeyBbeDogc3RyaW5nXTogYW55OyB9O1xuICAgICAgICBzdWIgPSBzb3VyY2Vbc107XG4gICAgICAgIGlmICghaXNPYmplY3Qoc3ViKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU291cmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcHMgPSBPYmplY3Qua2V5cyhPYmplY3Qoc3ViKSk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0R1cGxpY2F0ZSBtZXNzYWdlIGtleTonLCBwcm9wc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXRbcHJvcHNbaV1dID0gc3ViW3Byb3BzW2ldXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvYmo6IGFueSkge1xuICAgIGlmKCAhaXNEZWZpbmVkKG9iaikgKSB7IHJldHVybiB0cnVlOyB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcHRpb24obmFtZTogc3RyaW5nLCByYW5nZTogbnVtYmVyW10sIGE6IGFueSkge1xuICAgIGNvbnN0IHJlcyAgPSBwYXJzZUludChhKTtcbiAgICBpZiAoaXNOYU4ocmVzKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgJHtuYW1lfSBpcyBub3QgYSBudW1iZXJgKTtcbiAgICB9XG5cbiAgICBpZiAoIHJlcyA8IHJhbmdlWzBdIHx8IHJlcyA+IHJhbmdlWzFdKSB7XG4gICAgICAgIHRocm93IEVycm9yKCBgJHtuYW1lfSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuYClcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn0iXX0=