typescript-class-helpers
Version:
Usefull helper to have in your typescript project
186 lines • 24.7 kB
JavaScript
import { _ } from 'tnp-core/websql';
import { CLASSNAME } from './classname';
import { describeFromClassStringify, describeByDefaultModelsAndMapping } from './describe-class';
import { setClassName } from './set-class-name';
export { Models } from './models';
export { SYMBOL } from './symbols';
export class TchHelpers {
static getBy(className) {
return CLASSNAME.getClassBy(className);
}
static getFromObject(o) {
if (_.isUndefined(o) || _.isNull(o)) {
return;
}
if (o.constructor) {
return o.constructor;
}
const p = Object.getPrototypeOf(o);
return p && p.constructor;
}
static getName(target, production = false) {
return CLASSNAME.getClassName(target, production);
}
static getNameFromObject(o) {
const fnCLass = this.getFromObject(o);
return this.getName(fnCLass);
}
static getConfigs(target) {
return CLASSNAME.getClassConfig(target);
}
static describeProperites(target) {
const d1 = describeFromClassStringify(target);
const d2 = describeByDefaultModelsAndMapping(target);
let uniq = {};
// @ts-ignore
d1.concat(d2).forEach(p => uniq[p] = p);
return Object.keys(uniq)
.filter(d => !!d)
.filter(d => typeof target.prototype[d] !== 'function');
}
}
const notAllowedAsMethodName = [
'length', 'name',
'arguments', 'caller',
'constructor', 'apply',
'bind', 'call',
'toString',
'__defineGetter__',
'__defineSetter__', 'hasOwnProperty',
'__lookupGetter__', '__lookupSetter__',
'isPrototypeOf', 'propertyIsEnumerable',
'valueOf', '__proto__', 'toLocaleString',
];
const getMethodsNames = (classOrClassInstance, allMethodsNames = []) => {
if (!classOrClassInstance) {
return allMethodsNames;
}
const isClassFunction = _.isFunction(classOrClassInstance);
const classFun = (isClassFunction ? classOrClassInstance : Object.getPrototypeOf(classOrClassInstance));
const objectToCheck = isClassFunction ? classOrClassInstance?.prototype : classOrClassInstance;
const prototypeObj = Object.getPrototypeOf(objectToCheck || {});
const properties = _.uniq([
...Object.getOwnPropertyNames(objectToCheck || {}),
...Object.getOwnPropertyNames(prototypeObj || {}),
...Object.keys(objectToCheck || {}),
...Object.keys(prototypeObj || {}),
])
.filter(f => !!f && !notAllowedAsMethodName.includes(f));
properties.filter((methodName) => typeof objectToCheck[methodName] === 'function').forEach(p => allMethodsNames.push(p));
if (!classFun || !classFun.constructor || classFun?.constructor?.name === 'Object') {
return allMethodsNames;
}
return getMethodsNames(Object.getPrototypeOf(classFun), allMethodsNames);
};
export const CLASS = {
NAME: CLASSNAME.CLASSNAME,
setName: setClassName,
getBy: TchHelpers.getBy,
/**
* @deprecated
*/
getSingleton(target) {
if (typeof target !== 'function') {
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
return;
}
const config = TchHelpers.getConfigs(target)[0];
return config.singleton;
},
/**
* @deprecated
*/
setSingletonObj(target, singletonObject) {
if (typeof target !== 'function') {
console.error(`[typescript-class-helpers][setSingletonObj] Type of target is not a function`);
return;
}
if (Array.isArray(singletonObject)) {
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant be an array`);
return;
}
if (typeof singletonObject !== 'object') {
console.error(`[typescript-class-helpers][setSingletonObj] Singleton instance cant must be a object`);
return;
}
const className = CLASS.getName(target);
const config = TchHelpers.getConfigs(target)[0];
if (config.singleton) {
console.warn(`[typescript-class-helpers] You are trying to set singleton of "${className}" second time with different object.`);
}
config.singleton = singletonObject;
},
/**
* @deprecated
*/
getConfigs: TchHelpers.getConfigs,
/**
* @deprecated
*/
getConfig: (target) => {
return _.first(TchHelpers.getConfigs(target));
},
getMethodsNames(classOrClassInstance) {
return getMethodsNames(classOrClassInstance);
},
getFromObject: TchHelpers.getFromObject,
getName: TchHelpers.getName,
getNameFromObject: TchHelpers.getNameFromObject,
describeProperites: TchHelpers.describeProperites,
/**
* @deprecated
*/
OBJECT: (obj) => {
return {
get indexValue() {
return CLASSNAME.getObjectIndexValue(obj);
},
get indexProperty() {
return CLASSNAME.getObjectIndexPropertyValue(obj);
},
get isClassObject() {
if (!_.isObject(obj) || _.isArray(obj) || _.isRegExp(obj) ||
_.isBuffer(obj) || _.isArrayBuffer(obj)) {
return false;
}
if (_.isDate(obj)) {
return true;
}
const className = CLASS.getNameFromObject(obj);
return _.isString(className) && className !== 'Object';
},
isEqual: (anotherObj, compareDeep = false) => {
if (!CLASS.OBJECT(obj).isClassObject || !CLASS.OBJECT(anotherObj).isClassObject) {
return false;
}
if (obj === anotherObj) {
return true;
}
const v1 = CLASSNAME.getObjectIndexValue(obj);
const v2 = CLASSNAME.getObjectIndexValue(anotherObj);
const f1 = CLASSNAME.getObjectClassFamily(obj);
const f2 = CLASSNAME.getObjectClassFamily(anotherObj);
const isFamilyDiff = (!_.isString(f1) || !_.isString(f2) || (f1 !== f2));
if (isFamilyDiff) {
return false;
}
if (!CLASS.OBJECT(obj).isClassObject || !CLASS.OBJECT(anotherObj).isClassObject) {
return false;
}
if ((_.isNumber(v1) && _.isNumber(v2)) || (_.isString(v1) && _.isString(v2))) {
const res = (v1 === v2);
// @ts-ignore
return res;
}
if (compareDeep) {
return _.isEqual(v1, v2);
}
return false;
}
};
}
};
export * from 'enum-values';
;
({}); // @--end-of-file-for-module=typescript-class-helpers lib/index.ts
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90bXAtbGlicy1mb3ItZGlzdC13ZWJzcWwvdHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzL3Byb2plY3RzL3R5cGVzY3JpcHQtY2xhc3MtaGVscGVycy9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkMsTUFBTSxPQUFPLFVBQVU7SUFFckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUE0QjtRQUN2QyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBUztRQUM1QixJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELE1B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eEIsYUFBYTtvQkFDYixPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDO2dCQUNELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7Z0JBQzFCLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1NBQ0YsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFBO0FBRUQsY0FBYyxhQUFhLENBQUM7QUFFM0IsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrRUFBa0UiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL3dlYnNxbCc7XG5pbXBvcnQgeyBDTEFTU05BTUUgfSBmcm9tICcuL2NsYXNzbmFtZSc7XG5pbXBvcnQgeyBkZXNjcmliZUZyb21DbGFzc1N0cmluZ2lmeSwgZGVzY3JpYmVCeURlZmF1bHRNb2RlbHNBbmRNYXBwaW5nIH0gZnJvbSAnLi9kZXNjcmliZS1jbGFzcyc7XG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBzZXRDbGFzc05hbWUgfSBmcm9tICcuL3NldC1jbGFzcy1uYW1lJztcblxuZXhwb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0IHsgU1lNQk9MIH0gZnJvbSAnLi9zeW1ib2xzJztcblxuZXhwb3J0IGNsYXNzIFRjaEhlbHBlcnMge1xuXG4gIHN0YXRpYyBnZXRCeShjbGFzc05hbWU6IHN0cmluZyB8IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIENMQVNTTkFNRS5nZXRDbGFzc0J5KGNsYXNzTmFtZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0RnJvbU9iamVjdChvOiBPYmplY3QpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChvKSB8fCBfLmlzTnVsbChvKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoby5jb25zdHJ1Y3Rvcikge1xuICAgICAgcmV0dXJuIG8uY29uc3RydWN0b3I7XG4gICAgfVxuICAgIGNvbnN0IHAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gICAgcmV0dXJuIHAgJiYgcC5jb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXROYW1lKHRhcmdldDogRnVuY3Rpb24sIHByb2R1Y3Rpb24gPSBmYWxzZSkge1xuICAgIHJldHVybiBDTEFTU05BTUUuZ2V0Q2xhc3NOYW1lKHRhcmdldCwgcHJvZHVjdGlvbikgYXMgc3RyaW5nO1xuICB9XG5cbiAgc3RhdGljIGdldE5hbWVGcm9tT2JqZWN0KG86IE9iamVjdCkge1xuICAgIGNvbnN0IGZuQ0xhc3MgPSB0aGlzLmdldEZyb21PYmplY3Qobyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmFtZShmbkNMYXNzKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb25maWdzKHRhcmdldDogRnVuY3Rpb24pOiBNb2RlbHMuQ2xhc3NDb25maWdbXSB7XG4gICAgcmV0dXJuIENMQVNTTkFNRS5nZXRDbGFzc0NvbmZpZyh0YXJnZXQpXG4gIH1cblxuICBzdGF0aWMgZGVzY3JpYmVQcm9wZXJpdGVzKHRhcmdldDogRnVuY3Rpb24pIHtcbiAgICBjb25zdCBkMSA9IGRlc2NyaWJlRnJvbUNsYXNzU3RyaW5naWZ5KHRhcmdldCk7XG4gICAgY29uc3QgZDIgPSBkZXNjcmliZUJ5RGVmYXVsdE1vZGVsc0FuZE1hcHBpbmcodGFyZ2V0KTtcbiAgICBsZXQgdW5pcSA9IHt9O1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBkMS5jb25jYXQoZDIpLmZvckVhY2gocCA9PiB1bmlxW3BdID0gcCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHVuaXEpXG4gICAgICAuZmlsdGVyKGQgPT4gISFkKVxuICAgICAgLmZpbHRlcihkID0+IHR5cGVvZiB0YXJnZXQucHJvdG90eXBlW2RdICE9PSAnZnVuY3Rpb24nKVxuICB9XG5cbn1cblxuY29uc3Qgbm90QWxsb3dlZEFzTWV0aG9kTmFtZSA9IFtcbiAgJ2xlbmd0aCcsICduYW1lJyxcbiAgJ2FyZ3VtZW50cycsICdjYWxsZXInLFxuICAnY29uc3RydWN0b3InLCAnYXBwbHknLFxuICAnYmluZCcsICdjYWxsJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ19fZGVmaW5lR2V0dGVyX18nLFxuICAnX19kZWZpbmVTZXR0ZXJfXycsICdoYXNPd25Qcm9wZXJ0eScsXG4gICdfX2xvb2t1cEdldHRlcl9fJywgJ19fbG9va3VwU2V0dGVyX18nLFxuICAnaXNQcm90b3R5cGVPZicsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd2YWx1ZU9mJywgJ19fcHJvdG9fXycsICd0b0xvY2FsZVN0cmluZycsXG5dO1xuXG5jb25zdCBnZXRNZXRob2RzTmFtZXMgPSAoY2xhc3NPckNsYXNzSW5zdGFuY2U6IGFueSwgYWxsTWV0aG9kc05hbWVzID0gW10pOiBzdHJpbmdbXSA9PiB7XG4gIGlmICghY2xhc3NPckNsYXNzSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gYWxsTWV0aG9kc05hbWVzO1xuICB9XG5cbiAgY29uc3QgaXNDbGFzc0Z1bmN0aW9uID0gXy5pc0Z1bmN0aW9uKGNsYXNzT3JDbGFzc0luc3RhbmNlKTtcbiAgY29uc3QgY2xhc3NGdW4gPSAoaXNDbGFzc0Z1bmN0aW9uID8gY2xhc3NPckNsYXNzSW5zdGFuY2UgOiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhc3NPckNsYXNzSW5zdGFuY2UpKTtcbiAgY29uc3Qgb2JqZWN0VG9DaGVjayA9IGlzQ2xhc3NGdW5jdGlvbiA/IChjbGFzc09yQ2xhc3NJbnN0YW5jZSBhcyBGdW5jdGlvbik/LnByb3RvdHlwZSA6IGNsYXNzT3JDbGFzc0luc3RhbmNlO1xuICBjb25zdCBwcm90b3R5cGVPYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0VG9DaGVjayB8fCB7fSk7XG5cbiAgY29uc3QgcHJvcGVydGllcyA9IF8udW5pcShbXG4gICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0VG9DaGVjayB8fCB7fSksXG4gICAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlT2JqIHx8IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RUb0NoZWNrIHx8IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwcm90b3R5cGVPYmogfHwge30pLFxuICBdKVxuICAgIC5maWx0ZXIoZiA9PiAhIWYgJiYgIW5vdEFsbG93ZWRBc01ldGhvZE5hbWUuaW5jbHVkZXMoZikpO1xuXG4gIHByb3BlcnRpZXMuZmlsdGVyKChtZXRob2ROYW1lKSA9PiB0eXBlb2Ygb2JqZWN0VG9DaGVja1ttZXRob2ROYW1lXSA9PT0gJ2Z1bmN0aW9uJykuZm9yRWFjaChwID0+IGFsbE1ldGhvZHNOYW1lcy5wdXNoKHApKTtcblxuICBpZiAoIWNsYXNzRnVuIHx8ICFjbGFzc0Z1bi5jb25zdHJ1Y3RvciB8fCBjbGFzc0Z1bj8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdPYmplY3QnKSB7XG4gICAgcmV0dXJuIGFsbE1ldGhvZHNOYW1lcztcbiAgfVxuICByZXR1cm4gZ2V0TWV0aG9kc05hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihjbGFzc0Z1biksIGFsbE1ldGhvZHNOYW1lcyk7XG59O1xuXG5leHBvcnQgY29uc3QgQ0xBU1MgPSB7XG4gIE5BTUU6IENMQVNTTkFNRS5DTEFTU05BTUUsXG4gIHNldE5hbWU6IHNldENsYXNzTmFtZSxcbiAgZ2V0Qnk6IFRjaEhlbHBlcnMuZ2V0QnksXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0U2luZ2xldG9uPFQgPSBhbnk+KHRhcmdldDogRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc29sZS5lcnJvcihgW3R5cGVzY3JpcHQtY2xhc3MtaGVscGVyc11bc2V0U2luZ2xldG9uT2JqXSBUeXBlIG9mIHRhcmdldCBpcyBub3QgYSBmdW5jdGlvbmApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gVGNoSGVscGVycy5nZXRDb25maWdzKHRhcmdldClbMF1cblxuXG4gICAgcmV0dXJuIGNvbmZpZy5zaW5nbGV0b24gYXMgVDtcbiAgfSxcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzZXRTaW5nbGV0b25PYmoodGFyZ2V0OiBGdW5jdGlvbiwgc2luZ2xldG9uT2JqZWN0OiBhbnkpIHtcblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzXVtzZXRTaW5nbGV0b25PYmpdIFR5cGUgb2YgdGFyZ2V0IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNpbmdsZXRvbk9iamVjdCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt0eXBlc2NyaXB0LWNsYXNzLWhlbHBlcnNdW3NldFNpbmdsZXRvbk9ial0gU2luZ2xldG9uIGluc3RhbmNlIGNhbnQgYmUgYW4gYXJyYXlgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzaW5nbGV0b25PYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbdHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzXVtzZXRTaW5nbGV0b25PYmpdIFNpbmdsZXRvbiBpbnN0YW5jZSBjYW50IG11c3QgYmUgYSBvYmplY3RgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gQ0xBU1MuZ2V0TmFtZSh0YXJnZXQpO1xuXG5cblxuICAgIGNvbnN0IGNvbmZpZyA9IFRjaEhlbHBlcnMuZ2V0Q29uZmlncyh0YXJnZXQpWzBdXG5cbiAgICBpZiAoY29uZmlnLnNpbmdsZXRvbikge1xuICAgICAgY29uc29sZS53YXJuKGBbdHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzXSBZb3UgYXJlIHRyeWluZyB0byBzZXQgc2luZ2xldG9uIG9mIFwiJHtjbGFzc05hbWV9XCIgc2Vjb25kIHRpbWUgd2l0aCBkaWZmZXJlbnQgb2JqZWN0LmApXG4gICAgfVxuXG4gICAgY29uZmlnLnNpbmdsZXRvbiA9IHNpbmdsZXRvbk9iamVjdDtcbiAgfSxcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXRDb25maWdzOiBUY2hIZWxwZXJzLmdldENvbmZpZ3MsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0Q29uZmlnOiAodGFyZ2V0OiBGdW5jdGlvbikgPT4ge1xuICAgIHJldHVybiBfLmZpcnN0KFRjaEhlbHBlcnMuZ2V0Q29uZmlncyh0YXJnZXQpKTtcbiAgfSxcblxuXG4gIGdldE1ldGhvZHNOYW1lcyhjbGFzc09yQ2xhc3NJbnN0YW5jZTogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBnZXRNZXRob2RzTmFtZXMoY2xhc3NPckNsYXNzSW5zdGFuY2UpO1xuICB9LFxuICBnZXRGcm9tT2JqZWN0OiBUY2hIZWxwZXJzLmdldEZyb21PYmplY3QsXG4gIGdldE5hbWU6IFRjaEhlbHBlcnMuZ2V0TmFtZSxcbiAgZ2V0TmFtZUZyb21PYmplY3Q6IFRjaEhlbHBlcnMuZ2V0TmFtZUZyb21PYmplY3QsXG4gIGRlc2NyaWJlUHJvcGVyaXRlczogVGNoSGVscGVycy5kZXNjcmliZVByb3Blcml0ZXMsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgT0JKRUNUOiAob2JqOiBhbnkpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGluZGV4VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBDTEFTU05BTUUuZ2V0T2JqZWN0SW5kZXhWYWx1ZShvYmopO1xuICAgICAgfSxcbiAgICAgIGdldCBpbmRleFByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gQ0xBU1NOQU1FLmdldE9iamVjdEluZGV4UHJvcGVydHlWYWx1ZShvYmopO1xuICAgICAgfSxcbiAgICAgIGdldCBpc0NsYXNzT2JqZWN0KCkge1xuXG4gICAgICAgIGlmICghXy5pc09iamVjdChvYmopIHx8IF8uaXNBcnJheShvYmopIHx8IF8uaXNSZWdFeHAob2JqKSB8fFxuICAgICAgICAgIF8uaXNCdWZmZXIob2JqKSB8fCBfLmlzQXJyYXlCdWZmZXIob2JqKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc0RhdGUob2JqKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IENMQVNTLmdldE5hbWVGcm9tT2JqZWN0KG9iailcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcoY2xhc3NOYW1lKSAmJiBjbGFzc05hbWUgIT09ICdPYmplY3QnO1xuICAgICAgfSxcbiAgICAgIGlzRXF1YWw6IChhbm90aGVyT2JqOiBhbnksIGNvbXBhcmVEZWVwID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKCFDTEFTUy5PQkpFQ1Qob2JqKS5pc0NsYXNzT2JqZWN0IHx8ICFDTEFTUy5PQkpFQ1QoYW5vdGhlck9iaikuaXNDbGFzc09iamVjdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqID09PSBhbm90aGVyT2JqKSB7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2MSA9IENMQVNTTkFNRS5nZXRPYmplY3RJbmRleFZhbHVlKG9iaik7XG4gICAgICAgIGNvbnN0IHYyID0gQ0xBU1NOQU1FLmdldE9iamVjdEluZGV4VmFsdWUoYW5vdGhlck9iaik7XG4gICAgICAgIGNvbnN0IGYxID0gQ0xBU1NOQU1FLmdldE9iamVjdENsYXNzRmFtaWx5KG9iailcbiAgICAgICAgY29uc3QgZjIgPSBDTEFTU05BTUUuZ2V0T2JqZWN0Q2xhc3NGYW1pbHkoYW5vdGhlck9iailcbiAgICAgICAgY29uc3QgaXNGYW1pbHlEaWZmID0gKCFfLmlzU3RyaW5nKGYxKSB8fCAhXy5pc1N0cmluZyhmMikgfHwgKGYxICE9PSBmMikpO1xuXG4gICAgICAgIGlmIChpc0ZhbWlseURpZmYpIHtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUNMQVNTLk9CSkVDVChvYmopLmlzQ2xhc3NPYmplY3QgfHwgIUNMQVNTLk9CSkVDVChhbm90aGVyT2JqKS5pc0NsYXNzT2JqZWN0KSB7XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG5cblxuXG5cbiAgICAgICAgaWYgKChfLmlzTnVtYmVyKHYxKSAmJiBfLmlzTnVtYmVyKHYyKSkgfHwgKF8uaXNTdHJpbmcodjEpICYmIF8uaXNTdHJpbmcodjIpKSkge1xuXG4gICAgICAgICAgY29uc3QgcmVzID0gKHYxID09PSB2Mik7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIF8uaXNFcXVhbCh2MSwgdjIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgKiBmcm9tICdlbnVtLXZhbHVlcyc7XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT10eXBlc2NyaXB0LWNsYXNzLWhlbHBlcnMgbGliL2luZGV4LnRzIl19