UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

686 lines (576 loc) 78.5 kB
'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}(); var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch); var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType); var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire); var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} const defaultGroups = ['builtin', 'external', 'parent', 'sibling', 'index']; // REPORTING AND FIXING function reverse(array) { return array.map(function (v) { return Object.assign({}, v, { rank: -v.rank }); }).reverse(); } function getTokensOrCommentsAfter(sourceCode, node, count) { let currentNodeOrToken = node; const result = []; for (let i = 0; i < count; i++) { currentNodeOrToken = sourceCode.getTokenOrCommentAfter(currentNodeOrToken); if (currentNodeOrToken == null) { break; } result.push(currentNodeOrToken); } return result; } function getTokensOrCommentsBefore(sourceCode, node, count) { let currentNodeOrToken = node; const result = []; for (let i = 0; i < count; i++) { currentNodeOrToken = sourceCode.getTokenOrCommentBefore(currentNodeOrToken); if (currentNodeOrToken == null) { break; } result.push(currentNodeOrToken); } return result.reverse(); } function takeTokensAfterWhile(sourceCode, node, condition) { const tokens = getTokensOrCommentsAfter(sourceCode, node, 100); const result = []; for (let i = 0; i < tokens.length; i++) { if (condition(tokens[i])) { result.push(tokens[i]); } else { break; } } return result; } function takeTokensBeforeWhile(sourceCode, node, condition) { const tokens = getTokensOrCommentsBefore(sourceCode, node, 100); const result = []; for (let i = tokens.length - 1; i >= 0; i--) { if (condition(tokens[i])) { result.push(tokens[i]); } else { break; } } return result.reverse(); } function findOutOfOrder(imported) { if (imported.length === 0) { return []; } let maxSeenRankNode = imported[0]; return imported.filter(function (importedModule) { const res = importedModule.rank < maxSeenRankNode.rank; if (maxSeenRankNode.rank < importedModule.rank) { maxSeenRankNode = importedModule; } return res; }); } function findRootNode(node) { let parent = node; while (parent.parent != null && parent.parent.body == null) { parent = parent.parent; } return parent; } function findEndOfLineWithComments(sourceCode, node) { const tokensToEndOfLine = takeTokensAfterWhile(sourceCode, node, commentOnSameLineAs(node)); let endOfTokens = tokensToEndOfLine.length > 0 ? tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1] : node.range[1]; let result = endOfTokens; for (let i = endOfTokens; i < sourceCode.text.length; i++) { if (sourceCode.text[i] === '\n') { result = i + 1; break; } if (sourceCode.text[i] !== ' ' && sourceCode.text[i] !== '\t' && sourceCode.text[i] !== '\r') { break; } result = i + 1; } return result; } function commentOnSameLineAs(node) { return token => (token.type === 'Block' || token.type === 'Line') && token.loc.start.line === token.loc.end.line && token.loc.end.line === node.loc.end.line; } function findStartOfLineWithComments(sourceCode, node) { const tokensToEndOfLine = takeTokensBeforeWhile(sourceCode, node, commentOnSameLineAs(node)); let startOfTokens = tokensToEndOfLine.length > 0 ? tokensToEndOfLine[0].range[0] : node.range[0]; let result = startOfTokens; for (let i = startOfTokens - 1; i > 0; i--) { if (sourceCode.text[i] !== ' ' && sourceCode.text[i] !== '\t') { break; } result = i; } return result; } function isPlainRequireModule(node) { if (node.type !== 'VariableDeclaration') { return false; } if (node.declarations.length !== 1) { return false; } const decl = node.declarations[0]; const result = decl.id && ( decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') && decl.init != null && decl.init.type === 'CallExpression' && decl.init.callee != null && decl.init.callee.name === 'require' && decl.init.arguments != null && decl.init.arguments.length === 1 && decl.init.arguments[0].type === 'Literal'; return result; } function isPlainImportModule(node) { return node.type === 'ImportDeclaration' && node.specifiers != null && node.specifiers.length > 0; } function isPlainImportEquals(node) { return node.type === 'TSImportEqualsDeclaration' && node.moduleReference.expression; } function canCrossNodeWhileReorder(node) { return isPlainRequireModule(node) || isPlainImportModule(node) || isPlainImportEquals(node); } function canReorderItems(firstNode, secondNode) { const parent = firstNode.parent;var _sort = [ parent.body.indexOf(firstNode), parent.body.indexOf(secondNode)]. sort(),_sort2 = _slicedToArray(_sort, 2);const firstIndex = _sort2[0],secondIndex = _sort2[1]; const nodesBetween = parent.body.slice(firstIndex, secondIndex + 1); for (var nodeBetween of nodesBetween) { if (!canCrossNodeWhileReorder(nodeBetween)) { return false; } } return true; } function fixOutOfOrder(context, firstNode, secondNode, order) { const sourceCode = context.getSourceCode(); const firstRoot = findRootNode(firstNode.node); const firstRootStart = findStartOfLineWithComments(sourceCode, firstRoot); const firstRootEnd = findEndOfLineWithComments(sourceCode, firstRoot); const secondRoot = findRootNode(secondNode.node); const secondRootStart = findStartOfLineWithComments(sourceCode, secondRoot); const secondRootEnd = findEndOfLineWithComments(sourceCode, secondRoot); const canFix = canReorderItems(firstRoot, secondRoot); let newCode = sourceCode.text.substring(secondRootStart, secondRootEnd); if (newCode[newCode.length - 1] !== '\n') { newCode = newCode + '\n'; } const message = `\`${secondNode.displayName}\` import should occur ${order} import of \`${firstNode.displayName}\``; if (order === 'before') { context.report({ node: secondNode.node, message: message, fix: canFix && (fixer => fixer.replaceTextRange( [firstRootStart, secondRootEnd], newCode + sourceCode.text.substring(firstRootStart, secondRootStart))) }); } else if (order === 'after') { context.report({ node: secondNode.node, message: message, fix: canFix && (fixer => fixer.replaceTextRange( [secondRootStart, firstRootEnd], sourceCode.text.substring(secondRootEnd, firstRootEnd) + newCode)) }); } } function reportOutOfOrder(context, imported, outOfOrder, order) { outOfOrder.forEach(function (imp) { const found = imported.find(function hasHigherRank(importedItem) { return importedItem.rank > imp.rank; }); fixOutOfOrder(context, found, imp, order); }); } function makeOutOfOrderReport(context, imported) { const outOfOrder = findOutOfOrder(imported); if (!outOfOrder.length) { return; } // There are things to report. Try to minimize the number of reported errors. const reversedImported = reverse(imported); const reversedOrder = findOutOfOrder(reversedImported); if (reversedOrder.length < outOfOrder.length) { reportOutOfOrder(context, reversedImported, reversedOrder, 'after'); return; } reportOutOfOrder(context, imported, outOfOrder, 'before'); } function getSorter(ascending) { const multiplier = ascending ? 1 : -1; return function importsSorter(importA, importB) { let result; if (importA < importB) { result = -1; } else if (importA > importB) { result = 1; } else { result = 0; } return result * multiplier; }; } function mutateRanksToAlphabetize(imported, alphabetizeOptions) { const groupedByRanks = imported.reduce(function (acc, importedItem) { if (!Array.isArray(acc[importedItem.rank])) { acc[importedItem.rank] = []; } acc[importedItem.rank].push(importedItem.value); return acc; }, {}); const groupRanks = Object.keys(groupedByRanks); const sorterFn = getSorter(alphabetizeOptions.order === 'asc'); const comparator = alphabetizeOptions.caseInsensitive ? (a, b) => sorterFn(String(a).toLowerCase(), String(b).toLowerCase()) : (a, b) => sorterFn(a, b); // sort imports locally within their group groupRanks.forEach(function (groupRank) { groupedByRanks[groupRank].sort(comparator); }); // assign globally unique rank to each import let newRank = 0; const alphabetizedRanks = groupRanks.sort().reduce(function (acc, groupRank) { groupedByRanks[groupRank].forEach(function (importedItemName) { acc[importedItemName] = parseInt(groupRank, 10) + newRank; newRank += 1; }); return acc; }, {}); // mutate the original group-rank with alphabetized-rank imported.forEach(function (importedItem) { importedItem.rank = alphabetizedRanks[importedItem.value]; }); } // DETECTING function computePathRank(ranks, pathGroups, path, maxPosition) { for (let i = 0, l = pathGroups.length; i < l; i++) {var _pathGroups$i = pathGroups[i];const pattern = _pathGroups$i.pattern,patternOptions = _pathGroups$i.patternOptions,group = _pathGroups$i.group;var _pathGroups$i$positio = _pathGroups$i.position;const position = _pathGroups$i$positio === undefined ? 1 : _pathGroups$i$positio; if ((0, _minimatch2.default)(path, pattern, patternOptions || { nocomment: true })) { return ranks[group] + position / maxPosition; } } } function computeRank(context, ranks, importEntry, excludedImportTypes) { let impType; let rank; if (importEntry.type === 'import:object') { impType = 'object'; } else { impType = (0, _importType2.default)(importEntry.value, context); } if (!excludedImportTypes.has(impType)) { rank = computePathRank(ranks.groups, ranks.pathGroups, importEntry.value, ranks.maxPosition); } if (typeof rank === 'undefined') { rank = ranks.groups[impType]; } if (importEntry.type !== 'import' && !importEntry.type.startsWith('import:')) { rank += 100; } return rank; } function registerNode(context, importEntry, ranks, imported, excludedImportTypes) { const rank = computeRank(context, ranks, importEntry, excludedImportTypes); if (rank !== -1) { imported.push(Object.assign({}, importEntry, { rank })); } } function isInVariableDeclarator(node) { return node && ( node.type === 'VariableDeclarator' || isInVariableDeclarator(node.parent)); } const types = ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index', 'object']; // Creates an object with type-rank pairs. // Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 } // Will throw an error if it contains a type that does not exist, or has a duplicate function convertGroupsToRanks(groups) { const rankObject = groups.reduce(function (res, group, index) { if (typeof group === 'string') { group = [group]; } group.forEach(function (groupItem) { if (types.indexOf(groupItem) === -1) { throw new Error('Incorrect configuration of the rule: Unknown type `' + JSON.stringify(groupItem) + '`'); } if (res[groupItem] !== undefined) { throw new Error('Incorrect configuration of the rule: `' + groupItem + '` is duplicated'); } res[groupItem] = index; }); return res; }, {}); const omittedTypes = types.filter(function (type) { return rankObject[type] === undefined; }); return omittedTypes.reduce(function (res, type) { res[type] = groups.length; return res; }, rankObject); } function convertPathGroupsForRanks(pathGroups) { const after = {}; const before = {}; const transformed = pathGroups.map((pathGroup, index) => {const group = pathGroup.group,positionString = pathGroup.position; let position = 0; if (positionString === 'after') { if (!after[group]) { after[group] = 1; } position = after[group]++; } else if (positionString === 'before') { if (!before[group]) { before[group] = []; } before[group].push(index); } return Object.assign({}, pathGroup, { position }); }); let maxPosition = 1; Object.keys(before).forEach(group => { const groupLength = before[group].length; before[group].forEach((groupIndex, index) => { transformed[groupIndex].position = -1 * (groupLength - index); }); maxPosition = Math.max(maxPosition, groupLength); }); Object.keys(after).forEach(key => { const groupNextPosition = after[key]; maxPosition = Math.max(maxPosition, groupNextPosition - 1); }); return { pathGroups: transformed, maxPosition: maxPosition > 10 ? Math.pow(10, Math.ceil(Math.log10(maxPosition))) : 10 }; } function fixNewLineAfterImport(context, previousImport) { const prevRoot = findRootNode(previousImport.node); const tokensToEndOfLine = takeTokensAfterWhile( context.getSourceCode(), prevRoot, commentOnSameLineAs(prevRoot)); let endOfLine = prevRoot.range[1]; if (tokensToEndOfLine.length > 0) { endOfLine = tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1]; } return fixer => fixer.insertTextAfterRange([prevRoot.range[0], endOfLine], '\n'); } function removeNewLineAfterImport(context, currentImport, previousImport) { const sourceCode = context.getSourceCode(); const prevRoot = findRootNode(previousImport.node); const currRoot = findRootNode(currentImport.node); const rangeToRemove = [ findEndOfLineWithComments(sourceCode, prevRoot), findStartOfLineWithComments(sourceCode, currRoot)]; if (/^\s*$/.test(sourceCode.text.substring(rangeToRemove[0], rangeToRemove[1]))) { return fixer => fixer.removeRange(rangeToRemove); } return undefined; } function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports) { const getNumberOfEmptyLinesBetween = (currentImport, previousImport) => { const linesBetweenImports = context.getSourceCode().lines.slice( previousImport.node.loc.end.line, currentImport.node.loc.start.line - 1); return linesBetweenImports.filter(line => !line.trim().length).length; }; let previousImport = imported[0]; imported.slice(1).forEach(function (currentImport) { const emptyLinesBetween = getNumberOfEmptyLinesBetween(currentImport, previousImport); if (newlinesBetweenImports === 'always' || newlinesBetweenImports === 'always-and-inside-groups') { if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) { context.report({ node: previousImport.node, message: 'There should be at least one empty line between import groups', fix: fixNewLineAfterImport(context, previousImport) }); } else if (currentImport.rank === previousImport.rank && emptyLinesBetween > 0 && newlinesBetweenImports !== 'always-and-inside-groups') { context.report({ node: previousImport.node, message: 'There should be no empty line within import group', fix: removeNewLineAfterImport(context, currentImport, previousImport) }); } } else if (emptyLinesBetween > 0) { context.report({ node: previousImport.node, message: 'There should be no empty line between import groups', fix: removeNewLineAfterImport(context, currentImport, previousImport) }); } previousImport = currentImport; }); } function getAlphabetizeConfig(options) { const alphabetize = options.alphabetize || {}; const order = alphabetize.order || 'ignore'; const caseInsensitive = alphabetize.caseInsensitive || false; return { order, caseInsensitive }; } module.exports = { meta: { type: 'suggestion', docs: { url: (0, _docsUrl2.default)('order') }, fixable: 'code', schema: [ { type: 'object', properties: { groups: { type: 'array' }, pathGroupsExcludedImportTypes: { type: 'array' }, pathGroups: { type: 'array', items: { type: 'object', properties: { pattern: { type: 'string' }, patternOptions: { type: 'object' }, group: { type: 'string', enum: types }, position: { type: 'string', enum: ['after', 'before'] } }, required: ['pattern', 'group'] } }, 'newlines-between': { enum: [ 'ignore', 'always', 'always-and-inside-groups', 'never'] }, alphabetize: { type: 'object', properties: { caseInsensitive: { type: 'boolean', default: false }, order: { enum: ['ignore', 'asc', 'desc'], default: 'ignore' } }, additionalProperties: false } }, additionalProperties: false }] }, create: function importOrderRule(context) { const options = context.options[0] || {}; const newlinesBetweenImports = options['newlines-between'] || 'ignore'; const pathGroupsExcludedImportTypes = new Set(options['pathGroupsExcludedImportTypes'] || ['builtin', 'external', 'object']); const alphabetize = getAlphabetizeConfig(options); let ranks; try {var _convertPathGroupsFor = convertPathGroupsForRanks(options.pathGroups || []);const pathGroups = _convertPathGroupsFor.pathGroups,maxPosition = _convertPathGroupsFor.maxPosition; ranks = { groups: convertGroupsToRanks(options.groups || defaultGroups), pathGroups, maxPosition }; } catch (error) { // Malformed configuration return { Program: function (node) { context.report(node, error.message); } }; } let imported = []; let level = 0; function incrementLevel() { level++; } function decrementLevel() { level--; } return { ImportDeclaration: function handleImports(node) { if (node.specifiers.length) {// Ignoring unassigned imports const name = node.source.value; registerNode( context, { node, value: name, displayName: name, type: 'import' }, ranks, imported, pathGroupsExcludedImportTypes); } }, TSImportEqualsDeclaration: function handleImports(node) { let displayName; let value; let type; // skip "export import"s if (node.isExport) { return; } if (node.moduleReference.type === 'TSExternalModuleReference') { value = node.moduleReference.expression.value; displayName = value; type = 'import'; } else { value = ''; displayName = context.getSourceCode().getText(node.moduleReference); type = 'import:object'; } registerNode( context, { node, value, displayName, type }, ranks, imported, pathGroupsExcludedImportTypes); }, CallExpression: function handleRequires(node) { if (level !== 0 || !(0, _staticRequire2.default)(node) || !isInVariableDeclarator(node.parent)) { return; } const name = node.arguments[0].value; registerNode( context, { node, value: name, displayName: name, type: 'require' }, ranks, imported, pathGroupsExcludedImportTypes); }, 'Program:exit': function reportAndReset() { if (newlinesBetweenImports !== 'ignore') { makeNewlinesBetweenReport(context, imported, newlinesBetweenImports); } if (alphabetize.order !== 'ignore') { mutateRanksToAlphabetize(imported, alphabetize); } makeOutOfOrderReport(context, imported); imported = []; }, FunctionDeclaration: incrementLevel, FunctionExpression: incrementLevel, ArrowFunctionExpression: incrementLevel, BlockStatement: incrementLevel, ObjectExpression: incrementLevel, 'FunctionDeclaration:exit': decrementLevel, 'FunctionExpression:exit': decrementLevel, 'ArrowFunctionExpression:exit': decrementLevel, 'BlockStatement:exit': decrementLevel, 'ObjectExpression:exit': decrementLevel }; } }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9vcmRlci5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0R3JvdXBzIiwicmV2ZXJzZSIsImFycmF5IiwibWFwIiwidiIsIk9iamVjdCIsImFzc2lnbiIsInJhbmsiLCJnZXRUb2tlbnNPckNvbW1lbnRzQWZ0ZXIiLCJzb3VyY2VDb2RlIiwibm9kZSIsImNvdW50IiwiY3VycmVudE5vZGVPclRva2VuIiwicmVzdWx0IiwiaSIsImdldFRva2VuT3JDb21tZW50QWZ0ZXIiLCJwdXNoIiwiZ2V0VG9rZW5zT3JDb21tZW50c0JlZm9yZSIsImdldFRva2VuT3JDb21tZW50QmVmb3JlIiwidGFrZVRva2Vuc0FmdGVyV2hpbGUiLCJjb25kaXRpb24iLCJ0b2tlbnMiLCJsZW5ndGgiLCJ0YWtlVG9rZW5zQmVmb3JlV2hpbGUiLCJmaW5kT3V0T2ZPcmRlciIsImltcG9ydGVkIiwibWF4U2VlblJhbmtOb2RlIiwiZmlsdGVyIiwiaW1wb3J0ZWRNb2R1bGUiLCJyZXMiLCJmaW5kUm9vdE5vZGUiLCJwYXJlbnQiLCJib2R5IiwiZmluZEVuZE9mTGluZVdpdGhDb21tZW50cyIsInRva2Vuc1RvRW5kT2ZMaW5lIiwiY29tbWVudE9uU2FtZUxpbmVBcyIsImVuZE9mVG9rZW5zIiwicmFuZ2UiLCJ0ZXh0IiwidG9rZW4iLCJ0eXBlIiwibG9jIiwic3RhcnQiLCJsaW5lIiwiZW5kIiwiZmluZFN0YXJ0T2ZMaW5lV2l0aENvbW1lbnRzIiwic3RhcnRPZlRva2VucyIsImlzUGxhaW5SZXF1aXJlTW9kdWxlIiwiZGVjbGFyYXRpb25zIiwiZGVjbCIsImlkIiwiaW5pdCIsImNhbGxlZSIsIm5hbWUiLCJhcmd1bWVudHMiLCJpc1BsYWluSW1wb3J0TW9kdWxlIiwic3BlY2lmaWVycyIsImlzUGxhaW5JbXBvcnRFcXVhbHMiLCJtb2R1bGVSZWZlcmVuY2UiLCJleHByZXNzaW9uIiwiY2FuQ3Jvc3NOb2RlV2hpbGVSZW9yZGVyIiwiY2FuUmVvcmRlckl0ZW1zIiwiZmlyc3ROb2RlIiwic2Vjb25kTm9kZSIsImluZGV4T2YiLCJzb3J0IiwiZmlyc3RJbmRleCIsInNlY29uZEluZGV4Iiwibm9kZXNCZXR3ZWVuIiwic2xpY2UiLCJub2RlQmV0d2VlbiIsImZpeE91dE9mT3JkZXIiLCJjb250ZXh0Iiwib3JkZXIiLCJnZXRTb3VyY2VDb2RlIiwiZmlyc3RSb290IiwiZmlyc3RSb290U3RhcnQiLCJmaXJzdFJvb3RFbmQiLCJzZWNvbmRSb290Iiwic2Vjb25kUm9vdFN0YXJ0Iiwic2Vjb25kUm9vdEVuZCIsImNhbkZpeCIsIm5ld0NvZGUiLCJzdWJzdHJpbmciLCJtZXNzYWdlIiwiZGlzcGxheU5hbWUiLCJyZXBvcnQiLCJmaXgiLCJmaXhlciIsInJlcGxhY2VUZXh0UmFuZ2UiLCJyZXBvcnRPdXRPZk9yZGVyIiwib3V0T2ZPcmRlciIsImZvckVhY2giLCJpbXAiLCJmb3VuZCIsImZpbmQiLCJoYXNIaWdoZXJSYW5rIiwiaW1wb3J0ZWRJdGVtIiwibWFrZU91dE9mT3JkZXJSZXBvcnQiLCJyZXZlcnNlZEltcG9ydGVkIiwicmV2ZXJzZWRPcmRlciIsImdldFNvcnRlciIsImFzY2VuZGluZyIsIm11bHRpcGxpZXIiLCJpbXBvcnRzU29ydGVyIiwiaW1wb3J0QSIsImltcG9ydEIiLCJtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUiLCJhbHBoYWJldGl6ZU9wdGlvbnMiLCJncm91cGVkQnlSYW5rcyIsInJlZHVjZSIsImFjYyIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwiZ3JvdXBSYW5rcyIsImtleXMiLCJzb3J0ZXJGbiIsImNvbXBhcmF0b3IiLCJjYXNlSW5zZW5zaXRpdmUiLCJhIiwiYiIsIlN0cmluZyIsInRvTG93ZXJDYXNlIiwiZ3JvdXBSYW5rIiwibmV3UmFuayIsImFscGhhYmV0aXplZFJhbmtzIiwiaW1wb3J0ZWRJdGVtTmFtZSIsInBhcnNlSW50IiwiY29tcHV0ZVBhdGhSYW5rIiwicmFua3MiLCJwYXRoR3JvdXBzIiwicGF0aCIsIm1heFBvc2l0aW9uIiwibCIsInBhdHRlcm4iLCJwYXR0ZXJuT3B0aW9ucyIsImdyb3VwIiwicG9zaXRpb24iLCJub2NvbW1lbnQiLCJjb21wdXRlUmFuayIsImltcG9ydEVudHJ5IiwiZXhjbHVkZWRJbXBvcnRUeXBlcyIsImltcFR5cGUiLCJoYXMiLCJncm91cHMiLCJzdGFydHNXaXRoIiwicmVnaXN0ZXJOb2RlIiwiaXNJblZhcmlhYmxlRGVjbGFyYXRvciIsInR5cGVzIiwiY29udmVydEdyb3Vwc1RvUmFua3MiLCJyYW5rT2JqZWN0IiwiaW5kZXgiLCJncm91cEl0ZW0iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJvbWl0dGVkVHlwZXMiLCJjb252ZXJ0UGF0aEdyb3Vwc0ZvclJhbmtzIiwiYWZ0ZXIiLCJiZWZvcmUiLCJ0cmFuc2Zvcm1lZCIsInBhdGhHcm91cCIsInBvc2l0aW9uU3RyaW5nIiwiZ3JvdXBMZW5ndGgiLCJncm91cEluZGV4IiwiTWF0aCIsIm1heCIsImtleSIsImdyb3VwTmV4dFBvc2l0aW9uIiwicG93IiwiY2VpbCIsImxvZzEwIiwiZml4TmV3TGluZUFmdGVySW1wb3J0IiwicHJldmlvdXNJbXBvcnQiLCJwcmV2Um9vdCIsImVuZE9mTGluZSIsImluc2VydFRleHRBZnRlclJhbmdlIiwicmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0IiwiY3VycmVudEltcG9ydCIsImN1cnJSb290IiwicmFuZ2VUb1JlbW92ZSIsInRlc3QiLCJyZW1vdmVSYW5nZSIsIm1ha2VOZXdsaW5lc0JldHdlZW5SZXBvcnQiLCJuZXdsaW5lc0JldHdlZW5JbXBvcnRzIiwiZ2V0TnVtYmVyT2ZFbXB0eUxpbmVzQmV0d2VlbiIsImxpbmVzQmV0d2VlbkltcG9ydHMiLCJsaW5lcyIsInRyaW0iLCJlbXB0eUxpbmVzQmV0d2VlbiIsImdldEFscGhhYmV0aXplQ29uZmlnIiwib3B0aW9ucyIsImFscGhhYmV0aXplIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlcyIsIml0ZW1zIiwiZW51bSIsInJlcXVpcmVkIiwiZGVmYXVsdCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwiaW1wb3J0T3JkZXJSdWxlIiwiU2V0IiwiZXJyb3IiLCJQcm9ncmFtIiwibGV2ZWwiLCJpbmNyZW1lbnRMZXZlbCIsImRlY3JlbWVudExldmVsIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiIsImlzRXhwb3J0IiwiZ2V0VGV4dCIsIkNhbGxFeHByZXNzaW9uIiwiaGFuZGxlUmVxdWlyZXMiLCJyZXBvcnRBbmRSZXNldCIsIkZ1bmN0aW9uRGVjbGFyYXRpb24iLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIsIkJsb2NrU3RhdGVtZW50IiwiT2JqZWN0RXhwcmVzc2lvbiJdLCJtYXBwaW5ncyI6IkFBQUEsYTs7QUFFQSxzQztBQUNBLGdEO0FBQ0Esc0Q7QUFDQSxxQzs7QUFFQSxNQUFNQSxnQkFBZ0IsQ0FBQyxTQUFELEVBQVksVUFBWixFQUF3QixRQUF4QixFQUFrQyxTQUFsQyxFQUE2QyxPQUE3QyxDQUF0Qjs7QUFFQTs7QUFFQSxTQUFTQyxPQUFULENBQWlCQyxLQUFqQixFQUF3QjtBQUN0QixTQUFPQSxNQUFNQyxHQUFOLENBQVUsVUFBVUMsQ0FBVixFQUFhO0FBQzVCLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCRixDQUFsQixFQUFxQixFQUFFRyxNQUFNLENBQUNILEVBQUVHLElBQVgsRUFBckIsQ0FBUDtBQUNELEdBRk0sRUFFSk4sT0FGSSxFQUFQO0FBR0Q7O0FBRUQsU0FBU08sd0JBQVQsQ0FBa0NDLFVBQWxDLEVBQThDQyxJQUE5QyxFQUFvREMsS0FBcEQsRUFBMkQ7QUFDekQsTUFBSUMscUJBQXFCRixJQUF6QjtBQUNBLFFBQU1HLFNBQVMsRUFB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