@singleton-i18n/angular-client
Version:
Singleton client code for Angular 10.
185 lines • 21.8 kB
JavaScript
/*
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ybGlnZW5nL1Byb2plY3RzL0Rldm9wcy9DbGllbnRfQW5ndWxhcl9HaXRIdWJfTnBtanMvdmlwL2NpL3B1YjJvcmcvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3NpbmdsZXRvbi9wcm9qZWN0cy9hbmd1bGFyLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFVO0lBQ2hDLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFlLEVBQUUsSUFBVztJQUMvQyxNQUFNLGVBQWUsR0FBVyxrQkFBa0IsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQWlCLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDeEUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtJQUN0QyxDQUFDLEdBQUcsQ0FBQyxZQUFZ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QUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDWixNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQztLQUMxQztJQUVELElBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sS0FBSyxDQUFFLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO0tBQ2pEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE5LTIwMjEgVk13YXJlLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogdmVyaWZ5IHZhbHVlIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJztcbn1cblxuLyoqXG4gKiBGb3JtYXQgdHJhbnNsYXRpb24gc3RyaW5nLCBlLmcuICdObyBjdXN0b20gYnVja2V0cyBzcGVjaWZpZWQgZm9yIHswfSdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChtZXNzYWdlOiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgdGVtcGxhdGVNYXRjaGVyOiBSZWdFeHAgPSAve1xccz8oW1xcZF0qKVxccz99L2c7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UodGVtcGxhdGVNYXRjaGVyLCAoc3Vic3RyaW5nOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChiLnRyaW0oKSA9PT0gaS50b1N0cmluZygpICYmIGlzRGVmaW5lZChhcmdzW2ldKSkgPyBhcmdzW2ldIDogc3Vic3RyaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdChhOiBhbnksIGI6IGFueSk6IE9iamVjdCB7XG4gICAgYSA9IGEgaW5zdGFuY2VvZiBPYmplY3QgPyBhIDoge307XG4gICAgYiA9IGIgaW5zdGFuY2VvZiBPYmplY3QgPyBiIDoge307XG5cbiAgICAvLyBNZXJnZSB0aGUgc3ViIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBrZXkuXG4gICAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChcbiAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGJba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmICgoYltrZXldIGluc3RhbmNlb2YgT2JqZWN0KSAmJiAoYVtrZXldIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGJba2V5XSwgYVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGEsIGIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobzEgPT09IG8yKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSB7IHJldHVybiB0cnVlOyB9IC8vIE5hTiA9PT0gTmFOXG4gICAgY29uc3QgdDEgPSB0eXBlb2YgbzEsIHQyID0gdHlwZW9mIG8yO1xuICAgIGxldCBsZW5ndGg6IG51bWJlciwga2V5OiBhbnksIGtleVNldDogYW55O1xuICAgIGlmICh0MSA9PT0gdDIgJiYgdDEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG8yKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PT0gbzIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG8yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERlYWxpbmcgd2l0aCB0aGUgRGF0ZSBvYmplY3Qgd2l0aG91dCBhbnkga2V5LCBidXQgdGhlIGFjdHVhbCB2YWx1ZSBpcyBkaWZmZXJlbnQuXG4gICAgICAgICAgICBpZiAoIG8xIGluc3RhbmNlb2YgRGF0ZSAmJiBvMiBpbnN0YW5jZW9mIERhdGUgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldFRpbWUoKSA9PT0gbzIuZ2V0VGltZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5U2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIG8xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVNldFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBrZXlTZXQpICYmIHR5cGVvZiBvMltrZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLypcbiAqIE1peGluIGNsYXNzIGRlY29yYXRvclxuICpcbiAqIEJhc2VkIG9uXG4gKiBodHRwczovL21lZGl1bS5jb20vQGRteWwvbWl4aW5zLWFzLWNsYXNzLWRlY29yYXRvcnMtaW4tdHlwZXNjcmlwdC1hbmd1bGFyMi04ZTA5ZjFiYzFmMDJcbiAqXG4gKiB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8gc3VwcG9ydCBhbiBvcGFxdWUgZGF0YSBvYmplY3RcbiAqIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHByb3RvdHlwZSBhcyBgbWl4aW5EYXRhYFxuICovXG5leHBvcnQgZnVuY3Rpb24gTWl4aW4oYmFzZUN0b3JzOiBGdW5jdGlvbltdLCBkYXRhPzogYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkZXJpdmVkQ3RvcjogRnVuY3Rpb24pIHtcbiAgICAgICAgZGVyaXZlZEN0b3IucHJvdG90eXBlLm1peGluRGF0YSA9IGRhdGE7XG4gICAgICAgIGJhc2VDdG9ycy5mb3JFYWNoKGJhc2VDdG9yID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJhc2VDdG9yLnByb3RvdHlwZSkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlQ3Rvci5wcm90b3R5cGUsIG5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmICghZGVzY3JpcHRvci53cml0YWJsZSB8fCAhZGVzY3JpcHRvci5jb25maWd1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBkZXNjcmlwdG9yLmdldCB8fCBkZXNjcmlwdG9yLnNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlcml2ZWRDdG9yLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVyaXZlZEN0b3IucHJvdG90eXBlW25hbWVdID0gYmFzZUN0b3IucHJvdG90eXBlW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5kZWNsYXJlIGludGVyZmFjZSBXaW5kb3cge1xuICAgIG5hdmlnYXRvcjogYW55O1xufVxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFdpbmRvdztcbi8qKlxuICogUmV0dXJucyB0aGUgY3VsdHVyZSBsYW5ndWFnZSBjb2RlIG5hbWUgZnJvbSB0aGUgYnJvd3NlciwgZS5nLiBcImRlLURFXCJcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckN1bHR1cmVMYW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHdpbmRvdyA9PT0gdW5kZWZpbmVkIHx8IHdpbmRvdy5uYXZpZ2F0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBicm93c2VyQ3VsdHVyZUxhbmc6IGFueSA9IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID8gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBudWxsO1xuICAgIGJyb3dzZXJDdWx0dXJlTGFuZyA9IGJyb3dzZXJDdWx0dXJlTGFuZyB8fFxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlIHx8XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuYnJvd3Nlckxhbmd1YWdlIHx8XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlO1xuICAgIHJldHVybiBicm93c2VyQ3VsdHVyZUxhbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGVkV2FybihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgc3Vic3RpdHV0ZTogc3RyaW5nKSB7XG4gICAgY29uc29sZS53YXJuKGAke25hbWV9IGlzIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiAke3ZlcnNpb259LCBQbGVhc2UgdXNlICR7c3Vic3RpdHV0ZX0gaW5zdGVhZC5gKTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUga2V5LXZhbHVlIHBhaXIgd2hpY2ggZGVmaW5lZCBpbiBlYWNoIG9iamVjdCBhbmRcbiAqIGNoZWNrIHdoZXRoZXIgdGhlIGtleSBpcyBnbG9iYWxseSB1bmlxdWVcbiAqIFRPRE86IFN1cHBvcnQgb2JqZWN0IGRpcmVjdGx5XG4gKiBAcGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QgY29udGFpbnMgYWxsIHN0cmluZ3NcbiAqIEBwYXJhbSBzb3VyY2UgQSBzZXQgb2Ygc291cmNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQ6IHsgW3g6IHN0cmluZ106IGFueTsgfSwgc291cmNlOiB7IFt4OiBzdHJpbmddOiBhbnk7IH1bXSkge1xuICAgIGxldCBzOiBudW1iZXI7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBsZXQgcHJvcHM6IHN0cmluZ1tdO1xuICAgIGNvbnN0IGlzT2JqZWN0ID0gKG9iajogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7XG4gICAgfTtcbiAgICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGZvciAocyA9IDA7IHMgPCBzb3VyY2UubGVuZ3RoOyArK3MpIHtcbiAgICAgICAgbGV0IHN1YjogeyBbeDogc3RyaW5nXTogYW55OyB9O1xuICAgICAgICBzdWIgPSBzb3VyY2Vbc107XG4gICAgICAgIGlmICghaXNPYmplY3Qoc3ViKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU291cmNlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvcHMgPSBPYmplY3Qua2V5cyhPYmplY3Qoc3ViKSk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wc1tpXSkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0R1cGxpY2F0ZSBtZXNzYWdlIGtleTonLCBwcm9wc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXRbcHJvcHNbaV1dID0gc3ViW3Byb3BzW2ldXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iamVjdChvYmo6IGFueSkge1xuICAgIGlmKCAhaXNEZWZpbmVkKG9iaikgKSB7IHJldHVybiB0cnVlOyB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcHRpb24obmFtZTogc3RyaW5nLCByYW5nZTogbnVtYmVyW10sIGE6IGFueSkge1xuICAgIGNvbnN0IHJlcyAgPSBwYXJzZUludChhKTtcbiAgICBpZiAoaXNOYU4ocmVzKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgJHtuYW1lfSBpcyBub3QgYSBudW1iZXJgKTtcbiAgICB9XG5cbiAgICBpZiAoIHJlcyA8IHJhbmdlWzBdIHx8IHJlcyA+IHJhbmdlWzFdKSB7XG4gICAgICAgIHRocm93IEVycm9yKCBgJHtuYW1lfSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuYClcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn0iXX0=