UNPKG

@lacussoft/cpf-fmt

Version:
269 lines (249 loc) 35.6 kB
/** * LacusSoft :: cpf-fmt v1.4.1 * * @author Julio L. Muller. * @license MIT - 2020-2025 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.cpfFmt = factory()); })(this, (function () { 'use strict'; /** * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ const { replace } = ''; const ca = /[&<>'"]/g; const esca = { '&': '&amp;', '<': '&lt;', '>': '&gt;', "'": '&#39;', '"': '&quot;' }; const pe = m => esca[m]; /** * Safely escape HTML entities such as `&`, `<`, `>`, `"`, and `'`. * @param {string} es the input to safely escape * @returns {string} the escaped input, and it **throws** an error if * the input type is unexpected, except for boolean and numbers, * converted as string. */ const escape = es => replace.call(es, ca, pe); function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var build; var hasRequiredBuild; function requireBuild () { if (hasRequiredBuild) return build; hasRequiredBuild = 1; function numOnly(target) { return String(target).replace(/\D/g, ""); } build = numOnly; return build; } var buildExports = requireBuild(); var numOnly = /*@__PURE__*/getDefaultExportFromCjs(buildExports); var cjs; var hasRequiredCjs; function requireCjs() { if (hasRequiredCjs) return cjs; hasRequiredCjs = 1; var isMergeableObject = function isMergeableObject(value) { return isNonNullObject(value) && !isSpecial(value); }; function isNonNullObject(value) { return !!value && typeof value === 'object'; } function isSpecial(value) { var stringValue = Object.prototype.toString.call(value); return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value); } // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 var canUseSymbol = typeof Symbol === 'function' && Symbol.for; var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; function isReactElement(value) { return value.$$typeof === REACT_ELEMENT_TYPE; } function emptyTarget(val) { return Array.isArray(val) ? [] : {}; } function cloneUnlessOtherwiseSpecified(value, options) { return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value; } function defaultArrayMerge(target, source, options) { return target.concat(source).map(function (element) { return cloneUnlessOtherwiseSpecified(element, options); }); } function getMergeFunction(key, options) { if (!options.customMerge) { return deepmerge; } var customMerge = options.customMerge(key); return typeof customMerge === 'function' ? customMerge : deepmerge; } function getEnumerableOwnPropertySymbols(target) { return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function (symbol) { return Object.propertyIsEnumerable.call(target, symbol); }) : []; } function getKeys(target) { return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)); } function propertyIsOnObject(object, property) { try { return property in object; } catch (_) { return false; } } // Protects from prototype poisoning and unexpected merging up the prototype chain. function propertyIsUnsafe(target, key) { return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, && Object.propertyIsEnumerable.call(target, key)); // and also unsafe if they're nonenumerable. } function mergeObject(target, source, options) { var destination = {}; if (options.isMergeableObject(target)) { getKeys(target).forEach(function (key) { destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); }); } getKeys(source).forEach(function (key) { if (propertyIsUnsafe(target, key)) { return; } if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { destination[key] = getMergeFunction(key, options)(target[key], source[key], options); } else { destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); } }); return destination; } function deepmerge(target, source, options) { options = options || {}; options.arrayMerge = options.arrayMerge || defaultArrayMerge; options.isMergeableObject = options.isMergeableObject || isMergeableObject; // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() // implementations can use it. The caller may not replace it. options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; var sourceIsArray = Array.isArray(source); var targetIsArray = Array.isArray(target); var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; if (!sourceAndTargetTypesMatch) { return cloneUnlessOtherwiseSpecified(source, options); } else if (sourceIsArray) { return options.arrayMerge(target, source, options); } else { return mergeObject(target, source, options); } } deepmerge.all = function deepmergeAll(array, options) { if (!Array.isArray(array)) { throw new Error('first argument should be an array'); } return array.reduce(function (prev, next) { return deepmerge(prev, next, options); }, {}); }; var deepmerge_1 = deepmerge; cjs = deepmerge_1; return cjs; } var cjsExports = requireCjs(); var mergeDeep = /*@__PURE__*/getDefaultExportFromCjs(cjsExports); var defaultOptions = { delimiters: { dot: '.', dash: '-' }, hiddenRange: { start: 3, end: 10 }, onFail: function (value) { return value; }, hiddenKey: '*', hidden: false, escape: false }; /** * Merge custom options to the default ones. */ function mergeOptions(customOptions) { if (customOptions === void 0) { customOptions = {}; } var options = mergeDeep(defaultOptions, customOptions); if (options.hidden) { if (isNaN(options.hiddenRange.start) || options.hiddenRange.start < 0 || options.hiddenRange.start > 10) { throw new TypeError('Option "hiddenRange.start" must be a number between 0 and 10.'); } if (isNaN(options.hiddenRange.end) || options.hiddenRange.end < 0 || options.hiddenRange.end > 10) { throw new TypeError('Option "hiddenRange.end" must be a number between 0 and 10.'); } if (options.hiddenRange.start > options.hiddenRange.end) { var aux = options.hiddenRange.start; options.hiddenRange.start = options.hiddenRange.end; options.hiddenRange.end = aux; } } if (typeof options.onFail !== 'function') { throw new TypeError('The option "onFail" must be a callback function.'); } return options; } /** * Format a given CPF char sequence. */ function cpfFmt(cpfString, options) { var CPF_LENGTH = 11; var cpfArray = numOnly(cpfString).split(''); var customOptions = mergeOptions(options); if (cpfArray.length !== CPF_LENGTH) { var error = new Error("Parameter \"".concat(cpfString, "\" does not contain ").concat(CPF_LENGTH, " digits.")); return customOptions.onFail(cpfString, error); } if (customOptions.hidden) { for (var i = customOptions.hiddenRange.start; i <= customOptions.hiddenRange.end; i++) { cpfArray[i] = customOptions.hiddenKey; } } cpfArray.splice(9, 0, customOptions.delimiters.dash); cpfArray.splice(6, 0, customOptions.delimiters.dot); cpfArray.splice(3, 0, customOptions.delimiters.dot); var cpfPretty = cpfArray.join(''); if (customOptions.escape) { return escape(cpfPretty); } return cpfPretty; } return cpfFmt; })); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLWZtdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2h0bWwtZXNjYXBlci9lc20vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvbnVtLW9ubHkvYnVpbGQvaW5kZXguY2pzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RlZXBtZXJnZS9kaXN0L2Nqcy5qcyIsIi4uL3NyYy9tZXJnZS1vcHRpb25zLnRzIiwiLi4vc3JjL2NwZi1mbXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTctcHJlc2VudCBieSBBbmRyZWEgR2lhbW1hcmNoaSAtIEBXZWJSZWZsZWN0aW9uXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuXG5jb25zdCB7cmVwbGFjZX0gPSAnJztcblxuLy8gZXNjYXBlXG5jb25zdCBlcyA9IC8mKD86YW1wfCMzOHxsdHwjNjB8Z3R8IzYyfGFwb3N8IzM5fHF1b3R8IzM0KTsvZztcbmNvbnN0IGNhID0gL1smPD4nXCJdL2c7XG5cbmNvbnN0IGVzY2EgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICBcIidcIjogJyYjMzk7JyxcbiAgJ1wiJzogJyZxdW90Oydcbn07XG5jb25zdCBwZSA9IG0gPT4gZXNjYVttXTtcblxuLyoqXG4gKiBTYWZlbHkgZXNjYXBlIEhUTUwgZW50aXRpZXMgc3VjaCBhcyBgJmAsIGA8YCwgYD5gLCBgXCJgLCBhbmQgYCdgLlxuICogQHBhcmFtIHtzdHJpbmd9IGVzIHRoZSBpbnB1dCB0byBzYWZlbHkgZXNjYXBlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZXNjYXBlZCBpbnB1dCwgYW5kIGl0ICoqdGhyb3dzKiogYW4gZXJyb3IgaWZcbiAqICB0aGUgaW5wdXQgdHlwZSBpcyB1bmV4cGVjdGVkLCBleGNlcHQgZm9yIGJvb2xlYW4gYW5kIG51bWJlcnMsXG4gKiAgY29udmVydGVkIGFzIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVzY2FwZSA9IGVzID0+IHJlcGxhY2UuY2FsbChlcywgY2EsIHBlKTtcblxuXG4vLyB1bmVzY2FwZVxuY29uc3QgdW5lcyA9IHtcbiAgJyZhbXA7JzogJyYnLFxuICAnJiMzODsnOiAnJicsXG4gICcmbHQ7JzogJzwnLFxuICAnJiM2MDsnOiAnPCcsXG4gICcmZ3Q7JzogJz4nLFxuICAnJiM2MjsnOiAnPicsXG4gICcmYXBvczsnOiBcIidcIixcbiAgJyYjMzk7JzogXCInXCIsXG4gICcmcXVvdDsnOiAnXCInLFxuICAnJiMzNDsnOiAnXCInXG59O1xuY29uc3QgY2FwZSA9IG0gPT4gdW5lc1ttXTtcblxuLyoqXG4gKiBTYWZlbHkgdW5lc2NhcGUgcHJldmlvdXNseSBlc2NhcGVkIGVudGl0aWVzIHN1Y2ggYXMgYCZgLCBgPGAsIGA+YCwgYFwiYCxcbiAqIGFuZCBgJ2AuXG4gKiBAcGFyYW0ge3N0cmluZ30gdW4gYSBwcmV2aW91c2x5IGVzY2FwZWQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdW5lc2NhcGVkIGlucHV0LCBhbmQgaXQgKip0aHJvd3MqKiBhbiBlcnJvciBpZlxuICogIHRoZSBpbnB1dCB0eXBlIGlzIHVuZXhwZWN0ZWQsIGV4Y2VwdCBmb3IgYm9vbGVhbiBhbmQgbnVtYmVycyxcbiAqICBjb252ZXJ0ZWQgYXMgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgdW5lc2NhcGUgPSB1biA9PiByZXBsYWNlLmNhbGwodW4sIGVzLCBjYXBlKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gbnVtT25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIFN0cmluZyh0YXJnZXQpLnJlcGxhY2UoL1xcRC9nLCBcIlwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBudW1Pbmx5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndVkycHpJaXdpYzI5MWNtTmxjeUk2V3lJdUxpOXpjbU12Ym5WdExXOXViSGt1ZEhNaVhTd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lablZ1WTNScGIyNGdiblZ0VDI1c2VTaDBZWEpuWlhRNklIVnVhMjV2ZDI0cE9pQnpkSEpwYm1jZ2UxeHVJQ0J5WlhSMWNtNGdVM1J5YVc1bktIUmhjbWRsZENrdWNtVndiR0ZqWlNndlhGeEVMMmNzSUNjbktUdGNibjFjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnYm5WdFQyNXNlVHRjYmlKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pT3p0QlFVRkJMRk5CUVZNc1VVRkJVU3hOUVVGNVFpeEZRVUZCTzBGQlEzaERMRVZCUVVFc1QwRkJUeXhOUVVGUExFTkJRVUVzVFVGQlRTeERRVUZGTEVOQlFVRXNUMEZCUVN4RFFVRlJMRTlCUVU4c1JVRkJSU3hEUVVGQk8wRkJRM3BET3pzN095SjlcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWVyZ2VhYmxlT2JqZWN0ID0gZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWUpIHtcblx0cmV0dXJuIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSlcblx0XHQmJiAhaXNTcGVjaWFsKHZhbHVlKVxufTtcblxuZnVuY3Rpb24gaXNOb25OdWxsT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNTcGVjaWFsKHZhbHVlKSB7XG5cdHZhciBzdHJpbmdWYWx1ZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cblx0cmV0dXJuIHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBSZWdFeHBdJ1xuXHRcdHx8IHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBEYXRlXSdcblx0XHR8fCBpc1JlYWN0RWxlbWVudCh2YWx1ZSlcbn1cblxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL2I1YWM5NjNmYjc5MWQxMjk4ZTdmMzk2MjM2MzgzYmM5NTVmOTE2YzEvc3JjL2lzb21vcnBoaWMvY2xhc3NpYy9lbGVtZW50L1JlYWN0RWxlbWVudC5qcyNMMjEtTDI1XG52YXIgY2FuVXNlU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGNhblVzZVN5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcblxuZnVuY3Rpb24gaXNSZWFjdEVsZW1lbnQodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSB7XG5cdHJldHVybiAob3B0aW9ucy5jbG9uZSAhPT0gZmFsc2UgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG5cdFx0PyBkZWVwbWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLCB2YWx1ZSwgb3B0aW9ucylcblx0XHQ6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHJldHVybiB0YXJnZXQuY29uY2F0KHNvdXJjZSkubWFwKGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRyZXR1cm4gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoZWxlbWVudCwgb3B0aW9ucylcblx0fSlcbn1cblxuZnVuY3Rpb24gZ2V0TWVyZ2VGdW5jdGlvbihrZXksIG9wdGlvbnMpIHtcblx0aWYgKCFvcHRpb25zLmN1c3RvbU1lcmdlKSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZVxuXHR9XG5cdHZhciBjdXN0b21NZXJnZSA9IG9wdGlvbnMuY3VzdG9tTWVyZ2Uoa2V5KTtcblx0cmV0dXJuIHR5cGVvZiBjdXN0b21NZXJnZSA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbU1lcmdlIDogZGVlcG1lcmdlXG59XG5cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzXG5cdFx0PyBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkuZmlsdGVyKGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldCwgc3ltYm9sKVxuXHRcdH0pXG5cdFx0OiBbXVxufVxuXG5mdW5jdGlvbiBnZXRLZXlzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModGFyZ2V0KS5jb25jYXQoZ2V0RW51bWVyYWJsZU93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUlzT25PYmplY3Qob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdHJldHVybiBwcm9wZXJ0eSBpbiBvYmplY3Rcblx0fSBjYXRjaChfKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuLy8gUHJvdGVjdHMgZnJvbSBwcm90b3R5cGUgcG9pc29uaW5nIGFuZCB1bmV4cGVjdGVkIG1lcmdpbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbi5cbmZ1bmN0aW9uIHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpIHtcblx0cmV0dXJuIHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgLy8gUHJvcGVydGllcyBhcmUgc2FmZSB0byBtZXJnZSBpZiB0aGV5IGRvbid0IGV4aXN0IGluIHRoZSB0YXJnZXQgeWV0LFxuXHRcdCYmICEoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpIC8vIHVuc2FmZSBpZiB0aGV5IGV4aXN0IHVwIHRoZSBwcm90b3R5cGUgY2hhaW4sXG5cdFx0XHQmJiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXQsIGtleSkpIC8vIGFuZCBhbHNvIHVuc2FmZSBpZiB0aGV5J3JlIG5vbmVudW1lcmFibGUuXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IHt9O1xuXHRpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh0YXJnZXQpKSB7XG5cdFx0Z2V0S2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodGFyZ2V0W2tleV0sIG9wdGlvbnMpO1xuXHRcdH0pO1xuXHR9XG5cdGdldEtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdGlmIChwcm9wZXJ0eUlzVW5zYWZlKHRhcmdldCwga2V5KSkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0aWYgKHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBnZXRNZXJnZUZ1bmN0aW9uKGtleSwgb3B0aW9ucykodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gZGVlcG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRvcHRpb25zLmFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2U7XG5cdG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgPSBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0IHx8IGlzTWVyZ2VhYmxlT2JqZWN0O1xuXHQvLyBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCBpcyBhZGRlZCB0byBgb3B0aW9uc2Agc28gdGhhdCBjdXN0b20gYXJyYXlNZXJnZSgpXG5cdC8vIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGl0LiBUaGUgY2FsbGVyIG1heSBub3QgcmVwbGFjZSBpdC5cblx0b3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkO1xuXG5cdHZhciBzb3VyY2VJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpO1xuXHR2YXIgdGFyZ2V0SXNBcnJheSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0KTtcblx0dmFyIHNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2ggPSBzb3VyY2VJc0FycmF5ID09PSB0YXJnZXRJc0FycmF5O1xuXG5cdGlmICghc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCkge1xuXHRcdHJldHVybiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSBpZiAoc291cmNlSXNBcnJheSkge1xuXHRcdHJldHVybiBvcHRpb25zLmFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHR9XG59XG5cbmRlZXBtZXJnZS5hbGwgPSBmdW5jdGlvbiBkZWVwbWVyZ2VBbGwoYXJyYXksIG9wdGlvbnMpIHtcblx0aWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGFycmF5Jylcblx0fVxuXG5cdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2UocHJldiwgbmV4dCwgb3B0aW9ucylcblx0fSwge30pXG59O1xuXG52YXIgZGVlcG1lcmdlXzEgPSBkZWVwbWVyZ2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcG1lcmdlXzE7XG4iLCJpbXBvcnQgbWVyZ2VEZWVwIGZyb20gJ2RlZXBtZXJnZSc7XG5cbnR5cGUgRGVlcFBhcnRpYWw8VD4gPSB7XG4gIFtQIGluIGtleW9mIFRdPzogRGVlcFBhcnRpYWw8VFtQXT47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdHVhbENwZkZvcm1hdHRpbmdPcHRpb25zPE9uRXJyRmFsbGJhY2s+IHtcbiAgZGVsaW1pdGVyczoge1xuICAgIGRhc2g6IHN0cmluZztcbiAgICBkb3Q6IHN0cmluZztcbiAgfTtcbiAgZXNjYXBlOiBib29sZWFuO1xuICBoaWRkZW46IGJvb2xlYW47XG4gIGhpZGRlbktleTogc3RyaW5nO1xuICBoaWRkZW5SYW5nZToge1xuICAgIGVuZDogbnVtYmVyO1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gIH07XG4gIG9uRmFpbDogKHZhbHVlOiBzdHJpbmcsIGVycm9yOiBFcnJvcikgPT4gT25FcnJGYWxsYmFjaztcbn1cblxuZXhwb3J0IHR5cGUgQ3BmRm9ybWF0dGluZ09wdGlvbnM8T25FcnJGYWxsYmFjaz4gPSBEZWVwUGFydGlhbDxcbiAgQWN0dWFsQ3BmRm9ybWF0dGluZ09wdGlvbnM8T25FcnJGYWxsYmFjaz5cbj47XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBBY3R1YWxDcGZGb3JtYXR0aW5nT3B0aW9uczxzdHJpbmc+ID0ge1xuICBkZWxpbWl0ZXJzOiB7XG4gICAgZG90OiAnLicsXG4gICAgZGFzaDogJy0nLFxuICB9LFxuICBoaWRkZW5SYW5nZToge1xuICAgIHN0YXJ0OiAzLFxuICAgIGVuZDogMTAsXG4gIH0sXG4gIG9uRmFpbDogKHZhbHVlKSA9PiB2YWx1ZSxcbiAgaGlkZGVuS2V5OiAnKicsXG4gIGhpZGRlbjogZmFsc2UsXG4gIGVzY2FwZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIE1lcmdlIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IG9uZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlT3B0aW9uczxPbkVyckZhbGxiYWNrPihcbiAgY3VzdG9tT3B0aW9uczogQ3BmRm9ybWF0dGluZ09wdGlvbnM8T25FcnJGYWxsYmFjaz4gPSB7fSxcbik6IEFjdHVhbENwZkZvcm1hdHRpbmdPcHRpb25zPE9uRXJyRmFsbGJhY2s+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IG1lcmdlRGVlcChcbiAgICBkZWZhdWx0T3B0aW9ucyxcbiAgICBjdXN0b21PcHRpb25zLFxuICApIGFzIEFjdHVhbENwZkZvcm1hdHRpbmdPcHRpb25zPE9uRXJyRmFsbGJhY2s+O1xuXG4gIGlmIChvcHRpb25zLmhpZGRlbikge1xuICAgIGlmIChcbiAgICAgIGlzTmFOKG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQpIHx8XG4gICAgICBvcHRpb25zLmhpZGRlblJhbmdlLnN0YXJ0IDwgMCB8fFxuICAgICAgb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydCA+IDEwXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPcHRpb24gXCJoaWRkZW5SYW5nZS5zdGFydFwiIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMC4nKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpc05hTihvcHRpb25zLmhpZGRlblJhbmdlLmVuZCkgfHxcbiAgICAgIG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kIDwgMCB8fFxuICAgICAgb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQgPiAxMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3B0aW9uIFwiaGlkZGVuUmFuZ2UuZW5kXCIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwLicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmhpZGRlblJhbmdlLnN0YXJ0ID4gb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQpIHtcbiAgICAgIGNvbnN0IGF1eCA9IG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQ7XG4gICAgICBvcHRpb25zLmhpZGRlblJhbmdlLnN0YXJ0ID0gb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQ7XG4gICAgICBvcHRpb25zLmhpZGRlblJhbmdlLmVuZCA9IGF1eDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMub25GYWlsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG9wdGlvbiBcIm9uRmFpbFwiIG11c3QgYmUgYSBjYWxsYmFjayBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZXJnZU9wdGlvbnM7XG4iLCJpbXBvcnQgeyBlc2NhcGUgYXMgZXNjYXBlSFRNTCB9IGZyb20gJ2h0bWwtZXNjYXBlcic7XG5pbXBvcnQgbnVtT25seSBmcm9tICdudW0tb25seSc7XG5cbmltcG9ydCBtZXJnZU9wdGlvbnMgZnJvbSAnLi9tZXJnZS1vcHRpb25zJztcbmltcG9ydCB0eXBlIHsgQ3BmRm9ybWF0dGluZ09wdGlvbnMgfSBmcm9tICcuL21lcmdlLW9wdGlvbnMnO1xuXG4vKipcbiAqIEZvcm1hdCBhIGdpdmVuIENQRiBjaGFyIHNlcXVlbmNlLlxuICovXG5mdW5jdGlvbiBjcGZGbXQ8T25FcnJGYWxsYmFjayA9IHN0cmluZz4oXG4gIGNwZlN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zPzogQ3BmRm9ybWF0dGluZ09wdGlvbnM8T25FcnJGYWxsYmFjaz4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBDUEZfTEVOR1RIID0gMTE7XG4gIGNvbnN0IGNwZkFycmF5ID0gbnVtT25seShjcGZTdHJpbmcpLnNwbGl0KCcnKTtcbiAgY29uc3QgY3VzdG9tT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhvcHRpb25zKTtcblxuICBpZiAoY3BmQXJyYXkubGVuZ3RoICE9PSBDUEZfTEVOR1RIKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFBhcmFtZXRlciBcIiR7Y3BmU3RyaW5nfVwiIGRvZXMgbm90IGNvbnRhaW4gJHtDUEZfTEVOR1RIfSBkaWdpdHMuYCk7XG5cbiAgICByZXR1cm4gY3VzdG9tT3B0aW9ucy5vbkZhaWwoY3BmU3RyaW5nLCBlcnJvcikgYXMgc3RyaW5nO1xuICB9XG5cbiAgaWYgKGN1c3RvbU9wdGlvbnMuaGlkZGVuKSB7XG4gICAgZm9yIChsZXQgaSA9IGN1c3RvbU9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQ7IGkgPD0gY3VzdG9tT3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQ7IGkrKykge1xuICAgICAgY3BmQXJyYXlbaV0gPSBjdXN0b21PcHRpb25zLmhpZGRlbktleTtcbiAgICB9XG4gIH1cblxuICBjcGZBcnJheS5zcGxpY2UoOSwgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLmRhc2gpO1xuICBjcGZBcnJheS5zcGxpY2UoNiwgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLmRvdCk7XG4gIGNwZkFycmF5LnNwbGljZSgzLCAwLCBjdXN0b21PcHRpb25zLmRlbGltaXRlcnMuZG90KTtcbiAgY29uc3QgY3BmUHJldHR5ID0gY3BmQXJyYXkuam9pbignJyk7XG5cbiAgaWYgKGN1c3RvbU9wdGlvbnMuZXNjYXBlKSB7XG4gICAgcmV0dXJuIGVzY2FwZUhUTUwoY3BmUHJldHR5KTtcbiAgfVxuXG4gIHJldHVybiBjcGZQcmV0dHk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNwZkZtdDtcbiJdLCJuYW1lcyI6WyJyZXBsYWNlIiwiY2EiLCJlc2NhIiwicGUiLCJtIiwiZXNjYXBlIiwiZXMiLCJjYWxsIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ2YWx1ZSIsImlzTm9uTnVsbE9iamVjdCIsImlzU3BlY2lhbCIsInN0cmluZ1ZhbHVlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJpc1JlYWN0RWxlbWVudCIsImNhblVzZVN5bWJvbCIsIlN5bWJvbCIsImZvciIsIlJFQUNUX0VMRU1FTlRfVFlQRSIsIiQkdHlwZW9mIiwiZW1wdHlUYXJnZXQiLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsIm9wdGlvbnMiLCJjbG9uZSIsImRlZXBtZXJnZSIsImRlZmF1bHRBcnJheU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiY29uY2F0IiwibWFwIiwiZWxlbWVudCIsImdldE1lcmdlRnVuY3Rpb24iLCJrZXkiLCJjdXN0b21NZXJnZSIsImdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJzeW1ib2wiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImdldEtleXMiLCJrZXlzIiwicHJvcGVydHlJc09uT2JqZWN0Iiwib2JqZWN0IiwicHJvcGVydHkiLCJfIiwicHJvcGVydHlJc1Vuc2FmZSIsImhhc093blByb3BlcnR5IiwibWVyZ2VPYmplY3QiLCJkZXN0aW5hdGlvbiIsImZvckVhY2giLCJhcnJheU1lcmdlIiwic291cmNlSXNBcnJheSIsInRhcmdldElzQXJyYXkiLCJzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoIiwiYWxsIiwiZGVlcG1lcmdlQWxsIiwiYXJyYXkiLCJFcnJvciIsInJlZHVjZSIsInByZXYiLCJuZXh0IiwiZGVlcG1lcmdlXzEiLCJjanMiLCJkZWZhdWx0T3B0aW9ucyIsImRlbGltaXRlcnMiLCJkb3QiLCJkYXNoIiwiaGlkZGVuUmFuZ2UiLCJzdGFydCIsImVuZCIsIm9uRmFpbCIsImhpZGRlbktleSIsImhpZGRlbiIsIm1lcmdlT3B0aW9ucyIsImN1c3RvbU9wdGlvbnMiLCJtZXJnZURlZXAiLCJpc05hTiIsIlR5cGVFcnJvciIsImF1eCIsImNwZkZtdCIsImNwZlN0cmluZyIsIkNQRl9MRU5HVEgiLCJjcGZBcnJheSIsIm51bU9ubHkiLCJzcGxpdCIsImxlbmd0aCIsImVycm9yIiwiaSIsInNwbGljZSIsImNwZlByZXR0eSIsImpvaW4iLCJlc2NhcGVIVE1MIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0VBQUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLE1BQU07RUFBQ0EsRUFBQUE7RUFBTyxDQUFDLEdBQUcsRUFBRTtFQUlwQixNQUFNQyxFQUFFLEdBQUcsVUFBVTtFQUVyQixNQUFNQyxJQUFJLEdBQUc7RUFDWCxFQUFBLEdBQUcsRUFBRSxPQUFPO0VBQ1osRUFBQSxHQUFHLEVBQUUsTUFBTTtFQUNYLEVBQUEsR0FBRyxFQUFFLE1BQU07RUFDWCxFQUFBLEdBQUcsRUFBRSxPQUFPO0VBQ1osRUFBQSxHQUFHLEVBQUU7RUFDUCxDQUFDO0VBQ0QsTUFBTUMsRUFBRSxHQUFHQyxDQUFDLElBQUlGLElBQUksQ0FBQ0UsQ0FBQyxDQUFDOztFQUV2QjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNPLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJTixPQUFPLENBQUNPLElBQUksQ0FBQ0QsRUFBRSxFQUFFTCxFQUFFLEVBQUVFLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7OztHQzFDcEQsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFO0tBQ3ZCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FB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